Dateiverwaltung für die WebBox
ulrich
2017-03-20 d948baa82de185de8f380395a319231aaa38c973
commit | author | age
723bf7 1 /*
U 2     Dateiverwaltung - File management in your browser
3     Copyright (C) 2017 Ulrich Hilger, http://uhilger.de
4
5     This program is free software: you can redistribute it and/or modify
6     it under the terms of the GNU Affero General Public License as
7     published by the Free Software Foundation, either version 3 of the
8     License, or (at your option) any later version.
9
10     This program is distributed in the hope that it will be useful,
11     but WITHOUT ANY WARRANTY; without even the implied warranty of
12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13     GNU Affero General Public License for more details.
14
15     You should have received a copy of the GNU Affero General Public License
16     along with this program.  If not, see <http://www.gnu.org/licenses/>.
17 */
18
a4d3b5 19 var cm;
5dfab6 20 var pfad = '';
10d3d3 21 var modus = 'kacheln';
5ebb8e 22 var openFileName = '';
305573 23 var ed;
7d8ef6 24 var openEditor;
0c1d5b 25 var userid;
U 26 var tmo;
be9b6d 27 var tmo2;
7165a1 28 var cutCopySrcDir;
U 29 var cutCopyFiles;
30 var cutCopyOperation;
fa012b 31 var loc;
cccd2b 32 var PERS_DIR = "Persoenlich";
U 33 var PUB_DIR = "Oeffentlich";
1f550a 34 var BASE_DIR = "$basis";
U 35 var DATA_DIR = "$daten";
11536c 36 var WWW_DIR = "www";
e3043f 37 var compilerIssues;
c7c502 38
U 39 function fm_init() {
305573 40   $("#mce-editor").hide();
a4d3b5 41   $('.codeeditor-space').hide();
U 42   $('.code-editor-container').hide();
a450f2 43   $('.sued').hide();
bef5c6 44   //$('.ost').attr('flex-basis', 0);
a4d3b5 45   $('#newTextFile').on('click', fm_menu_neue_textdatei);
305573 46   $('#newDoc').on('click', fm_menu_neues_dokument);
adf812 47   $('#newFolder').on('click', fm_get_new_folder);
fc8db1 48   $('#viewFile').on('click', fm_view_file);
7d8ef6 49   $('#editTextFile').on('click', function() {
U 50     fm_get_file_content('text');
51   });
52   $('#editDocFile').on('click', function() {
53     fm_get_file_content('dok');
54   });
e5ff42 55   $('#saveFile').on('click', fm_menu_datei_speichern);
5ebb8e 56   $('#saveFileAs').on('click', fm_menu_datei_speichern_unter);
a4d3b5 57   $('#closeFile').on('click', fm_menu_datei_schliessen);
8446c2 58   $('#renameFile').on('click', fm_menu_datei_umbenennen);
fc1897 59   $('#m-del').on('click', fm_menu_delete);
7165a1 60   $('#m-cut').on('click', fm_menu_cut);
U 61   $('#m-copy').on('click', fm_menu_copy);
62   $('#m-paste').on('click', fm_menu_paste);
438b16 63   $('#m-shrink').on('click', fm_menu_shrink);
bef5c6 64   $('#m-test').on('click', fm_menu_test);
72e43d 65   $('#m-test-2').on('click', fm_menu_compile);
U 66   $('#m-test-3').on('click', fm_menu_compile_all);
a450f2 67   $('#m-compile-results').on('click', fm_fusszeile_zeigen);
c509a0 68   $('#saveModal').on('hidden.bs.modal', function (e) {
915927 69     $('#modal_ok').attr('onclick','').unbind('click');
b7475d 70   });
U 71   $('#logout').click(fm_logout);  
a450f2 72   $('#fusszeile-schliessen').on('click', fm_fusszeile_schliessen);
05cfa7 73   fm_get_login();
7342b1 74   fm_get_list('');
7aa566 75   fm_init_uploader();
fa012b 76   /*
U 77   console.log('href: ' + window.location.href);
78   console.log('host: ' + window.location.host);
79   console.log('hostname: ' + window.location.hostname);
80   console.log('port: ' + window.location.port);
81   console.log('protocol: ' + window.location.protocol);
82   */
83   loc = window.location.protocol + '//' + window.location.host;
fc8db1 84 }
U 85
0c1d5b 86 function fm_resize_editor() {
U 87   window.clearTimeout(tmo);
88   tmo = window.setTimeout(function () {
89     try {
90       var myHeight = $('.zentrum').height() - $('.nord').height() - 4;
91       ed.theme.resizeTo('100%', myHeight);  // sets the dimensions of the editable area
92     } catch (err) {
93     }
94   }, 200);
a450f2 95 }
U 96
97 function fm_fusszeile_schliessen() {
98   $('.sued').hide();
99 }
100
101 function fm_fusszeile_zeigen() {
102   $('.sued').show();
fc8db1 103 }
U 104
0c1d5b 105 function fm_get_path(uid) {
U 106   //console.log('pfad: ' + pfad);
107   var restdir;
cccd2b 108   if(pfad.indexOf(PUB_DIR) > -1) {
U 109     restdir = pfad.substr(PUB_DIR.length);
110   } else if(pfad.indexOf(PERS_DIR) > -1) {
111     restdir = pfad.substr(PERS_DIR.length);
1f550a 112   } else if(pfad.indexOf(BASE_DIR) > -1) {
U 113     restdir = pfad.substr(BASE_DIR.length);
114   } else if(pfad.indexOf(DATA_DIR) > -1) {
115     restdir = pfad.substr(DATA_DIR.length);
0c1d5b 116   }
U 117   if(restdir !== undefined && restdir.startsWith('/')) {
118     restdir = restdir.substr(1);
11536c 119     if(restdir.indexOf(WWW_DIR) > -1) {
U 120       restdir = restdir.replace(WWW_DIR, 'data');
121     }
0c1d5b 122   }
U 123   var pdir = fm_get_base(uid);
11536c 124   // console.log('fm_get_path path: ' + pdir + "/" + restdir);
0c1d5b 125   if(restdir.length > 1) {
U 126     return pdir + "/" + restdir;
127   } else {
128     return pdir;
129   }
130 }
131
132 function fm_get_base(uid) {
133   //console.log('pfad: ' + pfad);
134   var pdir;
cccd2b 135   if(pfad.indexOf(PUB_DIR) > -1) {
11536c 136     pdir = '/data/' + uid;
cccd2b 137   } else if(pfad.indexOf(PERS_DIR) > -1) {
11536c 138     pdir = '/home/' + uid;
U 139   } else if(pfad.indexOf(BASE_DIR) > -1) {
140     pdir = '';
141   } else if(pfad.indexOf(DATA_DIR) > -1) {
142     pdir = '';
0c1d5b 143   }
11536c 144   //console.log('fm_get_base base: ' + pdir + uid);
U 145   return pdir;
0c1d5b 146 }
05cfa7 147
0c1d5b 148 function fm_dok_editor_init(uid) {
U 149   var base = fm_get_path(uid);
a75859 150   edCount = 0;
11536c 151   //console.log("fm_dok_editor_init calling tinymce.init with base: " + base + "/");
fc8db1 152   
0c1d5b 153   /*
U 154    * vgl.
155    * http://stackoverflow.com/questions/4651676/how-do-i-remove-tinymce-and-then-re-add-it
156    */
157   //tinymce.EditorManager.execCommand('mceRemoveControl',true, 'textarea.text-editor');
158   //tinymce.EditorManager.execCommand('mceAddControl',true, editor_id);
159   if(ed !== undefined) {
160     ed.destroy();
161   }
162   tinymce.remove('textarea.text-editor');
163   tinymce.EditorManager.editors = []; 
305573 164   
U 165   /*
166    * Konfiguration TinyMCE
167    */
168   tinymce.init({
547755 169     content_css : "/file-cms/ui/mce.css",
7b7627 170     //content_css: "/jslib/bootstrap/css/bootstrap.min.css",
7d8ef6 171     selector: "textarea.text-editor",
305573 172     statusbar: false,
U 173     menubar: false,
ea1ae0 174     plugins: 'advlist charmap code image link lists media print preview save table textcolor importcss',
7d8ef6 175     toolbar: 'undo redo | styleselect | image | link unlink | bullist numlist | outdent indent | code',
305573 176     /*
U 177     menu: {
178       file: {title: 'File', items: 'savevers | exit'},
179       edit: {title: 'Edit', items: 'undo redo | cut copy paste pastetext | selectall'},
180       view: {title: 'View', items: 'visualaid | code | link image media | template hr'},
181     },
182     */
0c1d5b 183     resize: 'both',
ea1ae0 184     importcss_append: true,
305573 185     width: "100%",
U 186     height: '100%',
11536c 187     relative_urls : true, 
U 188     convert_urls : false, 
0c1d5b 189     document_base_url : base + "/",
305573 190     setup: function (editor) {
U 191       ed = editor;
192     }
193   });
0c1d5b 194   
U 195   $(window).on('resize', fm_resize_editor);
196   fm_resize_editor();
10d3d3 197 }
7aa566 198
U 199 /* ----- Uploader Anfang ----------*/
200
201 var dateien = new Array();
202
203 function fm_init_uploader() {
204   var dropzone = document.getElementById("dateien");  
205   dropzone.ondragover = dropzone.ondragenter = function(event) {  
206     event.stopPropagation();  
207     event.preventDefault();  
208   };
209
210   dropzone.ondrop = function(event) {  
211     event.stopPropagation();  
212     event.preventDefault();  
7ebde1 213     var fileList = event.dataTransfer.files;  
U 214     for (var i=0; i<fileList.length; i++) {  
215       dateien.push(fileList[i]);
216     }
217     sendFile(dateien.pop());
7aa566 218   };
U 219 }
220
221 function sendFile(datei) {
7ebde1 222   var uri = "../api/upload";
7aa566 223   var xhr = new XMLHttpRequest();  
U 224   var fd = new FormData();  
225   xhr.open("POST", uri, true);  
226   xhr.onreadystatechange = function() {  
227     if (xhr.readyState == 4 && xhr.status == 200) {  
228       fm_get_list(pfad);
7ebde1 229       if(dateien.length > 0) {
U 230         sendFile(dateien.pop());
231       }
7aa566 232     }  
U 233   };  
7ebde1 234   fd.append('dateiauswahlfeld', datei);  
42fece 235   fd.append('pfad', pfad);
7aa566 236   xhr.send(fd);          
U 237 }
238
239 /* ----- Uploader Ende --------------- */
10d3d3 240
7165a1 241 /* ------- Dateifunktionen Start ----------- */
U 242
243 function fm_menu_cut() {
98f088 244   //alert('fm_menu_cut');
U 245   fm_cut_files();
7165a1 246 }
U 247 function fm_menu_copy() {
98f088 248   //alert('fm_menu_copy');
U 249   fm_copy_files();
7165a1 250 }
U 251 function fm_menu_paste() {
98f088 252   //alert('fm_menu_paste');
U 253   fm_paste_files();
7165a1 254 }
fc1897 255 function fm_menu_delete() {
U 256   $('#confirmOk').click(function() {
a75859 257     $('#confirmOk').attr('onclick','').unbind('click');
fc1897 258     fm_del_files();
U 259   });
a75859 260   $('#confirmOk').text("Loeschen");
U 261   $('#confirmOk').removeClass('btn-primary');
262   $('#confirmOk').addClass('btn-danger');
263   $('#confirmClose').hide();
957b51 264   $('#confirmModalTitle').text("Löschen");
U 265   $('#confirmModalBody').text("Wirklich löschen?");
fc1897 266   $('#confirmModal').modal({
U 267     keyboard: false,
268     show: true
269   });
270 }
7165a1 271
U 272 /*
273  * Gewaehlte Dateien feststellen
274  * 
275  * @returns {String} eine per JSON.stringify schon vorbereitete List zum 
276  * Absenden als Parameter an den Server
277  */
278 function fm_gewaehlte_dateien() {
279   var gewaehlte = $('.datei-gewaehlt');
a450f2 280   /*
7165a1 281   //console.log('anzahl: ' + gewaehlte.length);
U 282   var fnames = new Array();
283   var i = 0;
284   while(i < gewaehlte.length) {
285     var str = { "java.lang.String": $(gewaehlte[i]).text()};
286     fnames.push(str);
287     //console.log('loeschen ' + pfad + ' ' + $(gewaehlte[i]).text());
288     //i += 2;
289     i++;
290   }
291   var liste = '{"List":' + JSON.stringify(fnames) + '}';
292   // 'liste' enthaelt:
293   // {"List":[{"java.lang.String":"test3.txt"},{"java.lang.String":"Test1.txt"},{"java.lang.String":"Test2.txt"}]}
294   // und wird auf dem Server zu einer List[ArrayList<String>] bei der jede ArrayList<String> nur ein Element hat 
295   return liste;
a450f2 296   */
U 297   return fm_dateiliste_bilden(gewaehlte);
7165a1 298 }
a450f2 299
U 300 function fm_dateiliste_bilden(gewaehlte) {
301   var fnames = new Array();
302   var i = 0;
303   while(i < gewaehlte.length) {
304     var str = { "java.lang.String": $(gewaehlte[i]).text()};
305     fnames.push(str);
306     //console.log('loeschen ' + pfad + ' ' + $(gewaehlte[i]).text());
307     //i += 2;
308     i++;
309   }
310   var liste = '{"List":' + JSON.stringify(fnames) + '}';
311   // 'liste' enthaelt:
312   // {"List":[{"java.lang.String":"test3.txt"},{"java.lang.String":"Test1.txt"},{"java.lang.String":"Test2.txt"}]}
313   // und wird auf dem Server zu einer List[ArrayList<String>] bei der jede ArrayList<String> nur ein Element hat 
314   return liste;
315 }
316
7165a1 317 /* --------- Dateifunktionen Ende ---------- */
fc1897 318
bef5c6 319 function fm_menu_test() {
U 320   var w = $('.ost').width();
321   if(w == 0) {
322     $('.ost').width('20%');
323     $('.ost').text('Hallo Welt!');
324   } else {
325     $('.ost').empty();
326     $('.ost').width(0);
327   }
328 }
329
72e43d 330 function fm_menu_compile() {
fd0b4c 331   fm_compile('0', fm_mark_compile_results_in_editor);
72e43d 332 }
U 333 function fm_menu_compile_all() {
334   fm_compile_all();
fd0b4c 335 }
U 336
337 function fm_mark_compile_results_in_editor(resp) {
338   cm.clearGutter("breakpoints");
339
340   if(resp.List[0].CompilerIssue !== undefined) {
d9d37b 341     cm.setGutterMarker(0, "breakpoints", makeMarker("Code hat Fehler"));
fd0b4c 342     var lno;
U 343     var eMsg;
344     if(resp.List[0].CompilerIssue instanceof Array) {
345       var issueNo = 0;
346       while(issueNo < resp.List[0].CompilerIssue.length) {
347         // console.log(resp.List[0].CompilerIssue[issueNo].kind);
348         // console.log(resp.List[0].CompilerIssue[issueNo].lineNumber);
349         // console.log(resp.List[0].CompilerIssue[issueNo].sourceName);
350         // console.log(resp.List[0].CompilerIssue[issueNo].message);
351         lno = resp.List[0].CompilerIssue[issueNo].lineNumber;
352         eMsg = resp.List[0].CompilerIssue[issueNo].kind + ' ' + resp.List[0].CompilerIssue[issueNo].message;
353         cm.setGutterMarker(lno-1, "breakpoints", makeMarker(eMsg));
354         issueNo++;
355       }
356     } else {
357       lno = resp.List[0].CompilerIssue.lineNumber;
358       eMsg = resp.List[0].CompilerIssue.kind + ' ' + resp.List[0].CompilerIssue.message;
359       cm.setGutterMarker(lno-1, "breakpoints", makeMarker(eMsg));
360     }
361   }
362 }
363
72e43d 364 function fm_compile_all() {
U 365   var m = '?c=de.uhilger.filecms.api.CompileService&m=compileAll&p=' + pfad;
366   var u = '../svc' + m;
367   fm_get(u, "json", function(resp) {
368     if(resp.List[0].CompilerIssue !== undefined) {
369       var lno;
370       var eMsg;
a450f2 371       var issueList = new Array();
72e43d 372       if(resp.List[0].CompilerIssue instanceof Array) {
U 373         var issueNo = 0;
374         while(issueNo < resp.List[0].CompilerIssue.length) {
a450f2 375           /*
U 376           $('.system-out').append('   +++ ---- +++   ');
377           $('.system-out').append(resp.List[0].CompilerIssue[issueNo].kind);
378           $('.system-out').append(resp.List[0].CompilerIssue[issueNo].lineNumber);
379           $('.system-out').append(resp.List[0].CompilerIssue[issueNo].sourceName);
380           $('.system-out').append(resp.List[0].CompilerIssue[issueNo].message);
381           */
382           var issue = new CompilerIssue(
383             resp.List[0].CompilerIssue[issueNo].sourceName,
384             resp.List[0].CompilerIssue[issueNo].message,
385             resp.List[0].CompilerIssue[issueNo].kind,
386             resp.List[0].CompilerIssue[issueNo].lineNumber
387           );
388           issueList.push(issue);
389
390           /*
72e43d 391           console.log('   +++ ---- +++   ');
U 392           console.log(resp.List[0].CompilerIssue[issueNo].kind);
393           console.log(resp.List[0].CompilerIssue[issueNo].lineNumber);
394           console.log(resp.List[0].CompilerIssue[issueNo].sourceName);
395           console.log(resp.List[0].CompilerIssue[issueNo].message);
a450f2 396           */
72e43d 397           issueNo++;
U 398         }
399       } else {
a450f2 400         //lno = resp.List[0].CompilerIssue.lineNumber;
U 401         //eMsg = resp.List[0].CompilerIssue.kind + ' ' + resp.List[0].CompilerIssue.message;
402         //$('.system-out').append(lno + ' ' + eMsg);
403         //console.log(lno + ' ' + eMsg);
404         var issue = new CompilerIssue(
405           resp.List[0].CompilerIssue.sourceName,
406           resp.List[0].CompilerIssue.message,
407           resp.List[0].CompilerIssue.kind,
408           resp.List[0].CompilerIssue.lineNumber
409         );
410         issueList.push(issue);        
72e43d 411       }
a450f2 412       var theList = new IssueList(issueList);
U 413       var template = $('#tpl-ci').html();
414       Mustache.parse(template);   // optional, speeds up future uses
415       $('.system-out').empty();
416       $('.system-out').html(Mustache.render(template, theList));
417       $('.sued').show();
72e43d 418     }
U 419   });
420 }
421
fd0b4c 422 function fm_compile(modeStr, callback) {
0ac262 423   var liste = fm_gewaehlte_dateien();
fd0b4c 424   var m = '?c=de.uhilger.filecms.api.CompileService&m=compile&p=' + pfad + '&p=' + encodeURIComponent(liste) + 
U 425           '&p=' + modeStr;
0ac262 426   var u = '../svc' + m;
e3043f 427   fm_get(u, "json", function(resp) {
fd0b4c 428     callback(resp);
0ac262 429   });
U 430 }
431
10d3d3 432 function fm_ansicht_umschalten() {
U 433   if($('#ansicht').children(0).hasClass('fa-th-list')) {
434     $('#ansicht').children(0).addClass('fa-th-large');
435     $('#ansicht').children(0).removeClass('fa-th-list');
436     modus = 'liste';
437   } else {
438     $('#ansicht').children(0).addClass('fa-th-list');    
439     $('#ansicht').children(0).removeClass('fa-th-large');
440     modus = 'kacheln';
441   }
442   fm_get_list(pfad);
443 }
444
445 function fm_set_modus() {
446   if(modus == 'kacheln') {
447     $('#ansicht').children(0).addClass('fa-th-list');    
448     $('#ansicht').children(0).removeClass('fa-th-large');  
449   } else {
450     $('#ansicht').children(0).addClass('fa-th-large');
451     $('#ansicht').children(0).removeClass('fa-th-list');    
452   }
a4d3b5 453 }
U 454
455 function fm_menu_neue_textdatei() {
adf812 456   fm_text_edit('Neue Datei');
a4d3b5 457 }
U 458
305573 459 function fm_menu_neues_dokument() {
7d8ef6 460   fm_dok_edit('');
305573 461 }
U 462
a4d3b5 463 function fm_menu_datei_schliessen() {
3003b2 464   if(openEditor === 'text') {
U 465     if(!cm.getDoc().isClean()) {
466       fm_ask_for_save();
467     } else {
468       fm_do_close();
469     }
470   } else {
471     if(tinymce.activeEditor.undoManager.hasUndo()) {
472       fm_ask_for_save();
473     } else {
474       fm_do_close();
475     }
476   }
477 }
478
479 function fm_ask_for_save() {
480   // hier Abfrage ob gespeichert werden soll    
481   $('#confirmOk').click(function() {
482     $('#confirmOk').attr('onclick','').unbind('click');
483     fm_menu_datei_speichern(function() {
a75859 484       fm_do_close();
U 485     });
3003b2 486   });
U 487   $('#confirmCancel').click(function() {
488     $('#confirmCancel').attr('onclick','').unbind('click');
489   });
490   $('#confirmClose').show();
491   $('#confirmClose').click(function() {
492     $('#confirmClose').attr('onclick','').unbind('click');
a75859 493     fm_do_close();
3003b2 494   });
U 495   $('#confirmOk').text("Speichern");
496   $('#confirmOk').addClass('btn-primary');
497   $('#confirmOk').removeClass('btn-danger');
498   $('#confirmModalTitle').text("Schliessen");
499   $('#confirmModalBody').text("Speichern vor dem Schliessen?");
500   $('#confirmModal').modal({
501     keyboard: false,
502     show: true
503   });
a75859 504 }
U 505
506 function fm_do_close() {
a4d3b5 507   $('.codeeditor-space').hide();
U 508   $('.code-editor-container').hide();
305573 509   $("#mce-editor").hide();
U 510   if(cm !== undefined) {
511     cm.toTextArea();
512   }
5ebb8e 513   openFileName = '';
7d8ef6 514   openEditor = '';
adf812 515   fm_get_list(pfad);
305573 516   fm_filectls_show();
e5ff42 517 }
U 518
17919c 519 function fm_dateiwahl(ev) {
5dfab6 520   var elem = this;
17919c 521   //console.log('dateiwahl nach click, event shift: ' + ev.shiftKey + ", event ctrl: " + ev.ctrlKey);
10d3d3 522   if(modus == 'kacheln') {
957b51 523     // Kacheln
10d3d3 524     if($(elem).children(0).hasClass('fa-folder')) {
957b51 525       if(/*ev.shiftKey || */ ev.ctrlKey) {
U 526         $(elem).find('.dateiname').addClass('datei-gewaehlt');
10d3d3 527       } else {
957b51 528         var ordner = $(elem).text().trim();
U 529         if(pfad.length > 0) {
530           pfad = pfad + '/' + ordner;
531         } else {
532           pfad = ordner;
533         }
534         fm_get_list(pfad);
10d3d3 535       }
7f2a41 536     } else if($(elem).children(0).hasClass('datei')) {
17919c 537       if(/*ev.shiftKey || */ ev.ctrlKey) {
U 538         // mehrere Dateien sollen gewaehlt werden
539       } else {
540         $('.datei-gewaehlt').removeClass('datei-gewaehlt');        
541       }
957b51 542       $(elem).find('.dateiname').addClass('datei-gewaehlt');
5dfab6 543     } else {
10d3d3 544       //console.log('kein folder oder file...');
5dfab6 545     }
U 546   } else {
957b51 547     // Liste
10d3d3 548     if($(elem).find('.datei-elem').children(0).hasClass('fa-file-o')) {
957b51 549       // Datei
17919c 550       if(/*ev.shiftKey || */ ev.ctrlKey) {
U 551         // mehrere Dateien sollen gewaehlt werden
552       } else {
553         $('.table-info').removeClass('table-info');
957b51 554         $('.datei-gewaehlt').removeClass('datei-gewaehlt');
17919c 555       }
10d3d3 556       $(elem).addClass('table-info');
U 557       $(elem).find('.dateiname').addClass('datei-gewaehlt');
558     } else {
957b51 559       // Ordner
U 560       if(/*ev.shiftKey || */ ev.ctrlKey) {
561         $(elem).children(0).addClass('datei-gewaehlt');
10d3d3 562       } else {
957b51 563         var ordner = $(elem).find('.dateiname').text();
U 564         if(pfad.length > 0) {
565           pfad = pfad + '/' + ordner;
566         } else {
567           pfad = ordner;
568         }
569         fm_get_list(pfad);
10d3d3 570       }
U 571     }   
5dfab6 572   }
c509a0 573 }
U 574
a94216 575 function fm_bc_click() {
U 576   var elem = this;
577   var bcPfad = $(elem).attr('rpath');
578   if(bcPfad !== undefined) {
c509a0 579     pfad = bcPfad;
a94216 580     fm_get_list(bcPfad);
U 581   } else {
582     pfad = '';
583     fm_get_list('');
584   }
585 }
586
42fece 587 function fm_text_edit(content, mode) {
305573 588   fm_filectls_hide();
3ad4db 589   $('.codeeditor-space').show();
U 590   $('.code-editor-container').show();
42fece 591   fm_code_edit(content, mode);  
7d8ef6 592   openEditor = 'text';
U 593 }
594
595 function fm_dok_edit(content) {
596   fm_filectls_hide();
0c1d5b 597   fm_dok_editor_init(userid);
7d8ef6 598   $("#mce-editor").show();
be9b6d 599   
U 600   window.clearTimeout(tmo2);
601   tmo2 = window.setTimeout(function () {
602     try {
603       ed.setContent(content);
604       openEditor = 'dok';  
605     } catch (err) {
606     }
607   }, 200);
3ad4db 608 }
U 609
305573 610 function fm_filectls_hide() {
U 611   $('#zentrum_bc').hide();
612   $('#dateien').hide();
547755 613   $('#editMenu').addClass('disabled');
305573 614 }
U 615
616 function fm_filectls_show() {
617   $('#zentrum_bc').show();
618   $('#dateien').show();  
547755 619   $('#editMenu').removeClass('disabled');
305573 620 }
b7475d 621 /* ----- API Calls ------------- */
U 622
0c1d5b 623 function fm_get_login() {
3ad4db 624   var m = '?c=de.uhilger.filecms.pub.SessionManager&m=getSessionUser';
U 625   var u = '../pub' + m;
626   fm_get(u, "text", function(resp) {
0c1d5b 627     userid = resp;
3ad4db 628     $('#userMenu').text(resp);
7342b1 629   });  
c509a0 630 }
U 631
632 function fm_get_new_folder() {
633   $('#modal_ok').click(function() {
634     // hier speichern
635     var m = '?c=de.uhilger.filecms.api.FileMgr&m=newFolder&p=' + pfad + '&p=' + $('#dateiname').val();
636     var u = '../svc' + m;
637     fm_get(u, "json", function(resp) {
adf812 638       fm_get_list(pfad);
c509a0 639     });
U 640   });
957b51 641   $('#saveModalTitle').text('Neuer Ordner');
c509a0 642   $('#dialogfrage').text("Name?");
U 643   $('#dateiname').val('');
644   $('#dateiname').attr('placeholder', 'Ordnername');
645   $('#saveModal').modal({
646     keyboard: false,
647     show: true
648   });
7342b1 649 }
U 650
7d8ef6 651 function fm_get_file_content(typ) {
fc1897 652   var gewaehlte = $('.datei-gewaehlt');
957b51 653   //var fname = $(gewaehlte).find('.dateiname').text();
U 654   
655   var fname = $(gewaehlte[0]).text();
5ebb8e 656   openFileName = fname;
3ad4db 657   var m = '?c=de.uhilger.filecms.api.FileMgr&m=getCode&p=' + pfad + '&p=' + fname;
2121cc 658   var u = '../svc' + m;
3ad4db 659   fm_get(u, "text", function(resp) {
7d8ef6 660     if(typ == 'text') {
42fece 661       var mode = "text/x-java";
U 662       if(fname.endsWith('js')) {
663         mode = 'javascript';
664       } else if(fname.endsWith('xml')) {
665         mode = 'xml';
666       } else if(fname.endsWith('properties')) {
667         mode = 'xml';
668       }
669       fm_text_edit(resp, mode);
7d8ef6 670     } else {
U 671       fm_dok_edit(resp);
672     }
2121cc 673   });
3ad4db 674   
2121cc 675 }
U 676
fc8db1 677 function fm_view_file() {
U 678   // http://localhost:8080/file-cms/ui/#  
679   // http://localhost:8080/file-cms/data/admin/usw.
680   
681   var userid = $('#userMenu').text();
682   var gewaehlte = $('.datei-gewaehlt');
683   var fname = $(gewaehlte[0]).text();
0c1d5b 684   
U 685   var path = fm_get_path(userid);
686   
687   window.open(path + '/' + fname, '_blank');
fc8db1 688 }
U 689
8446c2 690 function fm_menu_datei_umbenennen() {
U 691   var gewaehlte = $('.datei-gewaehlt');
692   var fname = $(gewaehlte[0]).text();
663ee9 693
U 694   $('#modal_ok').click(function() {
695     // hier umbenennen
50bb41 696     fm_rename_file(fname, pfad, $('#dateiname').val());
663ee9 697   });
U 698   $('#saveModalTitle').text('Datei umbenennen');
699   $('#dialogfrage').text("Neuer Dateiname?");  
700
701   if(fname !== undefined) {
702     $('#dateiname').val(fname);
703     $('#dateiname').attr('placeholder', 'Dateiname');
704     $('#saveModal').modal({
705       keyboard: false,
706       show: true
707     });
708   }
709 }
710
711 function fm_rename_file(fn, p, neuerName) {
712   var m = '?c=de.uhilger.filecms.api.FileMgr&m=renameFile';
713   m = m + '&p=' + p; 
714   m = m + '&p=' + fn; 
715   m = m + '&p=' + neuerName; 
716   var u = '../svc' + m;
717   fm_get(u, "text", function(resp) {
718     fm_get_list(pfad);
719   });  
8446c2 720 }
U 721
438b16 722 function fm_menu_shrink() {
U 723   var gewaehlte = $('.datei-gewaehlt');
724   var fname = $(gewaehlte[0]).text();
725   var m = '?c=de.uhilger.filecms.api.FileMgr&m=bildVerkleinern';
726   m = m + '&p=' + pfad; 
727   m = m + '&p=' + fname; 
728   var u = '../svc' + m;
729   fm_get(u, "text", function(resp) {
730     fm_get_list(pfad);
731   });  
732 }
733
7165a1 734 /*
U 735  * Hier merkt sich die Dateiverwalting die markierten Dateien fuer 
736  * eine Dateioperation. Bei cut wird in der 'paste' Operation auf dem Server 
737  * fuer die 'gemerkten' Dateien ein Move gemacht. Die Dateien werden 
738  * vom gewaehlten Ort zum Zielort verschoben.
739  * 
740  * @returns {undefined}
741  */
742 function fm_cut_files() {
743   cutCopySrcDir = pfad;
744   cutCopyFiles = fm_gewaehlte_dateien();
745   cutCopyOperation = 'cut';
746 }
747
748 /*
749  * Hier merkt sich die Dateiverwalting die markierten Dateien fuer 
750  * eine Dateioperation. Bei copy wird in der 'paste' Operation auf dem Server 
751  * fuer die 'gemerkten' Dateien eine Kopie gemacht. Die Dateien werden 
752  * am gewaehlten Ort behalten und am Zielort wird eine Kopier der 
753  * gewaehlten DAteien erstellt
754  * 
755  * @returns {undefined}
756  */
757 function fm_copy_files() {
758   cutCopySrcDir = pfad;
759   cutCopyFiles = fm_gewaehlte_dateien();
9e2964 760   cutCopyOperation = 'copy';
7165a1 761 }
U 762
763 /*
764  * Hier wird fuer eine zuvor markierte Liste von Dateien, fuer die 
765  * Cut oder Copy gewaehlt wurde, die Operations ausgefuehrt (move oder copy)
766  * @returns {undefined}
767  */
768 function fm_paste_files() {
769   var m;
9e2964 770   if(cutCopyOperation === 'cut') {
U 771     //m = '?c=de.uhilger.filecms.api.FileMgr&m=moveFiles'; //&p=' + cutCopySrcDir + '&p=' + pfad + '&p=' + encodeURIComponent(liste);
772     m = '?c=de.uhilger.filecms.api.FileMgr&m=moveFiles&p=' + cutCopySrcDir + '&p=' + pfad + '&p=' + encodeURIComponent(cutCopyFiles);
7165a1 773   } else {
9e2964 774     //m = '?c=de.uhilger.filecms.api.FileMgr&m=copyFiles'; //&p=' + cutCopySrcDir + '&p=' + pfad + '&p=' + encodeURIComponent(liste);
U 775     m = '?c=de.uhilger.filecms.api.FileMgr&m=copyFiles&p=' + cutCopySrcDir + '&p=' + pfad + '&p=' + encodeURIComponent(cutCopyFiles);
fc1897 776   }
7165a1 777   var u = '../svc' + m;  
9e2964 778   fm_get(u, "text", function(resp) {
U 779     // console.log('deleteFiles gab folgendes zurueck: ' + resp);
780     fm_get_list(pfad);
781   });
782   /*
783   fm_post(u, {p1: encodeURIComponent(cutCopySrcDir), p2: encodeURIComponent(pfad), p3: encodeURIComponent(cutCopyFiles)},'text', function(resp) {
7165a1 784     // resp evtl. zeigen..
U 785     fm_get_list(pfad);
786   });
9e2964 787   */
7165a1 788 }
U 789
790 function fm_del_files() {
791   var liste = fm_gewaehlte_dateien();
fc1897 792   var m = '?c=de.uhilger.filecms.api.FileMgr&m=deleteFiles&p=' + pfad + '&p=' + encodeURIComponent(liste);
U 793   var u = '../svc' + m;
794   fm_get(u, "text", function(resp) {
795     // console.log('deleteFiles gab folgendes zurueck: ' + resp);
796     fm_get_list(pfad);
797   });
798 }
799
10d3d3 800 function fm_render_list(fl) {
U 801   if(modus == 'kacheln') {
802     // Kachelansicht
7d8ef6 803     var template = $('#tpl-kacheln').html();
U 804     Mustache.parse(template);   // optional, speeds up future uses
805     $('.datei-zeile').attr('onclick','').unbind('click');
806     $('#dateien').empty();
807     $('#dateien').html(Mustache.render(template, fl));
808     $('.figure').click(fm_dateiwahl);
809   } else {
810     // Listenansicht
811     var template = $('#tpl-liste').html();
812     Mustache.parse(template);   // optional, speeds up future uses
813     $('.figure').attr('onclick','').unbind('click');
814     $('#dateien').empty();
815     $('#dateien').html(Mustache.render(template, fl));
816     $('.datei-zeile').click(fm_dateiwahl);
817   }
818   /*
819   if(modus == 'kacheln') {
820     // Kachelansicht
a3d410 821     $.get('tpl-kacheln.txt', function(template) {
U 822       $('#dateien').empty();
823       $('#dateien').html(Mustache.render(template, fl));
824       $('.figure').click(fm_dateiwahl);
825     });
10d3d3 826     $('.datei-zeile').attr('onclick','').unbind('click');
U 827   } else {
828     // Listenansicht
a3d410 829     $.get('tpl-liste.txt', function(template) {
U 830       $('#dateien').empty();
831       $('#dateien').html(Mustache.render(template, fl));
832       $('.datei-zeile').click(fm_dateiwahl);
833     });
10d3d3 834     $('.figure').attr('onclick','').unbind('click');
U 835   }
7d8ef6 836   */
10d3d3 837 }
U 838
7342b1 839 // http://localhost:8079/file-cms/svc?c=de.uhilger.filecms.api.FileMgr&f=JSONNICE&m=list&p=
a94216 840 function fm_get_list(relPfad) {
10d3d3 841   $('#ansicht').attr('onclick','').unbind('click');
a94216 842   var m = '?c=de.uhilger.filecms.api.FileMgr&m=list&p=' + relPfad;
7342b1 843   var u = '../svc' + m;
U 844   fm_get(u, "json", function(resp) {
10d3d3 845     
2121cc 846     if(resp.List[0].FileRef !== undefined) {
U 847       var files = new Array();
c509a0 848       if(resp.List[0].FileRef instanceof Array) {
U 849         for(var i = 0; i < resp.List[0].FileRef.length; i++) {
850           files.push(new FileRef(resp.List[0].FileRef[i]));
851         }
852       } else {
853         files.push(new FileRef(resp.List[0].FileRef));
2121cc 854       }
U 855       var fl = new FileList(files);
10d3d3 856       fm_render_list(fl);
2121cc 857     } else {
U 858       $('#dateien').empty();
7342b1 859     }
5dfab6 860     
10d3d3 861     // Breadcrumb-Ansicht
7d8ef6 862     var template;
a94216 863     $('.breadcrumb-item').attr('onclick','').unbind('click');
2315a0 864     $('#bcnav').empty();
5dfab6 865     var dirList = new Array();
U 866     var rp = '';
a94216 867     //console.log("'" + relPfad + "'");
U 868     var dirs = relPfad.split('/');
869     //console.log(dirs.length);
2121cc 870     dirList.push(new BcrFile(rp, 'Home'));
a94216 871     if(relPfad.length > 0) {
2315a0 872       for(var i = 0; i < dirs.length - 1; i++) {
5dfab6 873         if(rp.length > 0 ) {
U 874           dirList.push(new BcrFile(rp + '/' + dirs[i], dirs[i]));
2315a0 875           rp = rp + '/' + dirs[i];
5dfab6 876         } else {
U 877           dirList.push(new BcrFile(dirs[i], dirs[i]));
2315a0 878           rp = dirs[i];
5dfab6 879         }
U 880       }
881       var bl = new BcrFiles(dirList);
7d8ef6 882  
U 883       if(dirList.length > 0) {
884         template = $('#tpl-bcr').html();
885         Mustache.parse(template);   // optional, speeds up future uses
886         $('#bcnav').html(Mustache.render(template, bl));
2315a0 887       }
7d8ef6 888       
U 889       if(dirs.length > 0) {
890         dirList.push(new BcrFile(rp + '/' + dirs[dirs.length-1], dirs[dirs.length-1]));
891         template = $('#tpl-bcr2').html();
892         Mustache.parse(template);   // optional, speeds up future uses
893         $('#bcnav').append(Mustache.render(template, dirList[dirList.length-1]));        
894       } else {
895         template = $('#tpl-bcr2').html();
896         Mustache.parse(template);   // optional, speeds up future uses
897         $('#bcnav').append(Mustache.render(template, dirList[0]));        
898       }
899       
900       $('#bcnav').append($('#tpl-bcr3').html());
2315a0 901     } else {
a94216 902       pfad = '';
7d8ef6 903       template = $('#tpl-bcr2').html();
U 904       Mustache.parse(template);   // optional, speeds up future uses
905       $('#bcnav').append(Mustache.render(template, dirList[0]));   
906       $('#bcnav').append($('#tpl-bcr3').html());
5dfab6 907     }
7d8ef6 908     $('.breadcrumb-item').click(fm_bc_click);
U 909     $('#ansicht').click(fm_ansicht_umschalten);
910     fm_set_modus();
911   });
e5ff42 912 }
U 913
a75859 914 function fm_menu_datei_speichern(callback) {
5ebb8e 915   //var fname = $('.datei-gewaehlt').text();
U 916   var fname = openFileName;
917   if(fname !== undefined && fname !== '') {
a75859 918     fm_save_file(fname, 'saveTextFile', callback);
5ebb8e 919   } else {
a75859 920     fm_menu_datei_speichern_unter(callback);
5ebb8e 921   }
U 922 }
923
a75859 924 function fm_save_file(saveFileName, method, callback) {
7d8ef6 925   var content;
U 926   if(openEditor === 'text') {
927     content = cm.getValue();
3003b2 928     cm.getDoc().markClean();
7d8ef6 929   } else {
U 930     content = ed.getContent();
3003b2 931     tinymce.activeEditor.undoManager.clear();
7d8ef6 932   }
47e9d4 933   var m = '?c=de.uhilger.filecms.api.FileMgr&m=' + method;
5ebb8e 934   var u = '../svc' + m;
7d8ef6 935   fm_post(u, {p1: pfad, p2: saveFileName, p3: content}, function(resp) {
a75859 936     // hier scheint nichts zurueckzukommen..
5ebb8e 937   });
a75859 938   openFileName = saveFileName;
3003b2 939   if(typeof (callback) !== 'function') {
U 940     
941   } else {
a75859 942     callback();
U 943   }
5ebb8e 944 }
U 945
a75859 946 function fm_menu_datei_speichern_unter(callback) {  
915927 947   $('#modal_ok').click(function() {
a75859 948     $('#modal_ok').attr('onclick','').unbind('click');
915927 949     // hier speichern
a75859 950     fm_save_file($('#dateiname').val(), 'saveTextFileAs', callback);
915927 951   });
957b51 952   $('#saveModalTitle').text('Datei speichern');
c509a0 953   $('#dialogfrage').text("Dateiname?");
3ad4db 954   
U 955   var fname = $('.datei-gewaehlt').text();
956   if(fname !== undefined) {
957     $('#dateiname').val(fname);
958   } else {
959     $('#dateiname').val('');
960   }
c509a0 961   $('#dateiname').attr('placeholder', 'Dateiname');
915927 962   $('#saveModal').modal({
U 963     keyboard: false,
964     show: true
965   });
a4d3b5 966 }
U 967
b7475d 968 function fm_logout() {
U 969   var m = '?c=de.uhilger.filecms.pub.SessionManager&m=expireSession';
970   var u = '../pub' + m;
971   
972   fm_get(u, "text", function(resp) {
973     $('#userMenu').text('nicht angemeldet');
974     window.location.href = '../logout.html';
975   });
976 }
977
978
a4d3b5 979 /* ---- codemirror editor handling -------- */
U 980
64d8b9 981 /*
942d63 982 function htmlDecode(value){ 
U 983   return $('<div/>').html(value).text(); 
984 }
64d8b9 985 */
942d63 986
42fece 987 function fm_code_edit(content, m) {
a4d3b5 988   cm = CodeMirror.fromTextArea(document.getElementById("editspace"), {
U 989     lineNumbers: true,
e3043f 990     gutters: ["CodeMirror-linenumbers", "breakpoints"],
42fece 991     mode: m,
a4d3b5 992     viewportMargin : Infinity,
d920b7 993     tabSize: 2,
a4d3b5 994     extraKeys: {
915927 995         "F9": function(cm) {
U 996         cm.setOption("fullScreen", !cm.getOption("fullScreen"));
997       },
998         "Esc": function(cm) {
999         if (cm.getOption("fullScreen")) cm.setOption("fullScreen", false);
7ad1b7 1000       },
U 1001         ".": function(cm) {
1002         console.log('dot pressed: perhaps look up class or method name');
3b7c5b 1003         /*
U 1004          * Hier kann man eine Funktion ausloesen, die fuer das 
1005          * Wort vor dem Punkt (Name der Klasse) eine Liste mit 
1006          * Vorschlaegen fuer Methodennamen einblendet.
1007          */
1008         
1009         /*
1010          * CodeMirror.Pass laesst das Zeichen zum Editorinhalt durch, 
1011          * verhindert aber das Ausloesen von 'keyHandled'
1012          */
1013         return CodeMirror.Pass; 
915927 1014       }
a4d3b5 1015     }
U 1016   });
fab80c 1017   //cm.setValue(htmlDecode(content));
U 1018   //cm.setValue(content);
1019   cm.setValue(unescapeHtml(content));
3003b2 1020   cm.getDoc().markClean();
e3043f 1021   cm.on("gutterClick", function(theEditor, lineNumber) {
U 1022     var info = theEditor.lineInfo(lineNumber);
1023     //--lineNumber;
1024     //console.log(info.gutterMarkers.breakpoints.message);
1025     //var marker = info.gutterMarkers.breakpoints;
1026     //$(marker).tooltip('toggle');
1027   });
3b7c5b 1028   /*
7ad1b7 1029   cm.on("keyHandled", function(theEditor, keyName, event){
3b7c5b 1030     console.log('cm.keyHandled keyName: ' + keyName + ', event.type: ' + event.type);    
7ad1b7 1031   });
3b7c5b 1032   */
e3043f 1033 }
U 1034
1035 function makeMarker(msg) {
1036   var marker = document.createElement("div");
1037   marker.style.color = "#822";
1038   marker.innerHTML = "●";
1039   //marker.message = msg;
1040   $(marker).tooltip({
1041     placement: 'right',
1042     title: msg,
ed12de 1043     offset: '0 -30'
e3043f 1044   });
U 1045   return marker;
915927 1046 }
a4d3b5 1047
U 1048 /* -------- helper functions ----------- */
1049
b7475d 1050 function fm_get(u, dtype, scallback) {
a4d3b5 1051   $.ajax({
U 1052     url: u,
1053     type: "GET",
b7475d 1054     dataType: dtype,
a4d3b5 1055     success: scallback,
U 1056     error: function (xhr, status, errorThrown) {
1057       alert("Error: " + errorThrown + " Status: " + status + " URL: " + u);
1058     },
1059     complete: function (xhr, status) {
1060       //console.log( "The request is complete!" );
1061     }
1062
1063   });
915927 1064 }
a4d3b5 1065
9e2964 1066 function fm_post(u, d, dtype, scallback) {
a4d3b5 1067   $.ajax({
U 1068     url: u,
1069     data: d,
1070     type: "POST",
9e2964 1071     dataType: dtype,
a4d3b5 1072     success: scallback,
U 1073     error: function (xhr, status, errorThrown) {
1074       $('#fehler').html("Error: " + errorThrown + " Status: " + status);
1075     },
1076     complete: function (xhr, status) {
1077       //alert( "The request is complete!" );
1078     }
1079   });
915927 1080 }
a4d3b5 1081
e5ff42 1082 function fm_serialise(obj) {
U 1083   return '{"' + obj.constructor.name + '":' + JSON.stringify(obj) + '}';
915927 1084 }
e5ff42 1085
fab80c 1086 function escapeHtml(text) {
U 1087   text = text.replace(/\u228/g,'&auml;');
1088   text = text.replace(/\u246/g,'&ouml;');
1089   text = text.replace(/\u252/g,'&uuml;');
1090   text = text.replace(/\u196/g,'&Auml;');
1091   text = text.replace(/\u214/g,'&Ouml;');
1092   text = text.replace(/\u220/g,'&Uuml;');
1093   text = text.replace(/\u223/g,'&szlig;');
1094   text = text.replace(/\u26/g,'&amp;');
1095   return text;
1096 }
1097
1098 function unescapeHtml(text) {
1099   text = text.replace(/&auml;/g, String.fromCharCode(228));
1100   text = text.replace(/&ouml;/g, String.fromCharCode(246));
1101   text = text.replace(/&uuml;/g, String.fromCharCode(252));
1102   text = text.replace(/&Auml;/g, String.fromCharCode(196));
1103   text = text.replace(/&Ouml;/g, String.fromCharCode(214));
1104   text = text.replace(/&Uuml;/g, String.fromCharCode(220));
1105   text = text.replace(/&szlig;/g, String.fromCharCode(223));
1106   text = text.replace(/&amp;/g, String.fromCharCode(26));
1107   return text;
1108 }
1109
1110
7342b1 1111 /* ----- Objekte ----- */
U 1112
a450f2 1113 function IssueList(il) {
U 1114   this.issues = il;
1115 }
1116
1117 function CompilerIssue(sn, ms, ki, ln) {
1118   var self = this;
1119   this.sourceName = sn;
1120   this.message = ms;
1121   this.kind = ki;
1122   this.lineNumber = ln;
1123 }
1124
7342b1 1125 function FileList(fl) {
U 1126   this.files = fl;
1127 }
1128
1129 function FileRef(obj) {
1130   var self = this;
1131   this.fr = obj;
7f2a41 1132   this.fnx;
7342b1 1133   
U 1134   this.typeClass = function() {
10d3d3 1135     if(modus == 'kacheln') {
U 1136       if(self.fr.isDirectory) {
a3d410 1137         return 'fa-folder ordner';
10d3d3 1138       } else {
a3d410 1139         return 'fa-file datei';
10d3d3 1140       }
7342b1 1141     } else {
10d3d3 1142       if(self.fr.isDirectory) {
a3d410 1143         return 'fa-folder ordner';
10d3d3 1144       } else {
a3d410 1145         return 'fa-file-o datei';
10d3d3 1146       }
7342b1 1147     }
2121cc 1148   };
U 1149   
7f2a41 1150   this.mini = function() {
U 1151     var miniatur = false;
1152     var namen = self.fr.absolutePath.split('/');
1153     if(namen.length > 0) {
1154       self.fnx = decodeURIComponent(namen[namen.length - 1]);
1155     } else {
1156       self.fnx = decodeURIComponent(self.fr.absolutePath);
1157     }
1158     if(self.fnx.indexOf('.jpg') > -1 || self.fnx.indexOf('.png') > -1 || self.fnx.indexOf('.gif') > -1 || self.fnx.indexOf('.jpeg') > -1) {
1159       miniatur = true;
1160     }
1161     return miniatur;
1162   };
1163   
1164   this.miniurl = function() {
1165       var userid = $('#userMenu').text();
1166       var ext = '';
1167       var dotpos = self.fnx.indexOf('.');
1168       if(dotpos > -1) {
1169         var fny = self.fnx;
1170         self.fnx = self.fnx.substring(0, dotpos);
1171         ext = fny.substr(dotpos);
1172       }
1173       var path = fm_get_path(userid);
fa012b 1174       var imgurl = loc + path + '/' + self.fnx + '_tn' + ext;
7f2a41 1175       return imgurl;
U 1176     
1177   };
1178   
2121cc 1179   this.fileName = function() {
7f2a41 1180     
2121cc 1181     var namen = self.fr.absolutePath.split('/');
U 1182     if(namen.length > 0) {
f7d8bf 1183       return decodeURIComponent(namen[namen.length - 1]);
2121cc 1184     } else {
f7d8bf 1185       return decodeURIComponent(self.fr.absolutePath);
2121cc 1186     }
7f2a41 1187     
2121cc 1188   };
7342b1 1189 }
5dfab6 1190
U 1191 function BcrFiles(fl) {
1192   this.files = fl;
1193 }
1194
1195 function BcrFile(rp, n) {
1196   this.relPath = rp;
1197   this.fName = n;
7aa566 1198 }
U 1199