Dateiverwaltung für die WebBox
ulrich
2017-03-20 a450f233393a9e3297fea633373635d060a3c709
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) {
341     var lno;
342     var eMsg;
343     if(resp.List[0].CompilerIssue instanceof Array) {
344       var issueNo = 0;
345       while(issueNo < resp.List[0].CompilerIssue.length) {
346         // console.log(resp.List[0].CompilerIssue[issueNo].kind);
347         // console.log(resp.List[0].CompilerIssue[issueNo].lineNumber);
348         // console.log(resp.List[0].CompilerIssue[issueNo].sourceName);
349         // console.log(resp.List[0].CompilerIssue[issueNo].message);
350         lno = resp.List[0].CompilerIssue[issueNo].lineNumber;
351         eMsg = resp.List[0].CompilerIssue[issueNo].kind + ' ' + resp.List[0].CompilerIssue[issueNo].message;
352         cm.setGutterMarker(lno-1, "breakpoints", makeMarker(eMsg));
353         issueNo++;
354       }
355     } else {
356       lno = resp.List[0].CompilerIssue.lineNumber;
357       eMsg = resp.List[0].CompilerIssue.kind + ' ' + resp.List[0].CompilerIssue.message;
358       cm.setGutterMarker(lno-1, "breakpoints", makeMarker(eMsg));
359     }
360   }
361 }
362
72e43d 363 function fm_compile_all() {
U 364   var m = '?c=de.uhilger.filecms.api.CompileService&m=compileAll&p=' + pfad;
365   var u = '../svc' + m;
366   fm_get(u, "json", function(resp) {
367     if(resp.List[0].CompilerIssue !== undefined) {
368       var lno;
369       var eMsg;
a450f2 370       var issueList = new Array();
72e43d 371       if(resp.List[0].CompilerIssue instanceof Array) {
U 372         var issueNo = 0;
373         while(issueNo < resp.List[0].CompilerIssue.length) {
a450f2 374           /*
U 375           $('.system-out').append('   +++ ---- +++   ');
376           $('.system-out').append(resp.List[0].CompilerIssue[issueNo].kind);
377           $('.system-out').append(resp.List[0].CompilerIssue[issueNo].lineNumber);
378           $('.system-out').append(resp.List[0].CompilerIssue[issueNo].sourceName);
379           $('.system-out').append(resp.List[0].CompilerIssue[issueNo].message);
380           */
381           var issue = new CompilerIssue(
382             resp.List[0].CompilerIssue[issueNo].sourceName,
383             resp.List[0].CompilerIssue[issueNo].message,
384             resp.List[0].CompilerIssue[issueNo].kind,
385             resp.List[0].CompilerIssue[issueNo].lineNumber
386           );
387           issueList.push(issue);
388
389           /*
72e43d 390           console.log('   +++ ---- +++   ');
U 391           console.log(resp.List[0].CompilerIssue[issueNo].kind);
392           console.log(resp.List[0].CompilerIssue[issueNo].lineNumber);
393           console.log(resp.List[0].CompilerIssue[issueNo].sourceName);
394           console.log(resp.List[0].CompilerIssue[issueNo].message);
a450f2 395           */
72e43d 396           issueNo++;
U 397         }
398       } else {
a450f2 399         //lno = resp.List[0].CompilerIssue.lineNumber;
U 400         //eMsg = resp.List[0].CompilerIssue.kind + ' ' + resp.List[0].CompilerIssue.message;
401         //$('.system-out').append(lno + ' ' + eMsg);
402         //console.log(lno + ' ' + eMsg);
403         var issue = new CompilerIssue(
404           resp.List[0].CompilerIssue.sourceName,
405           resp.List[0].CompilerIssue.message,
406           resp.List[0].CompilerIssue.kind,
407           resp.List[0].CompilerIssue.lineNumber
408         );
409         issueList.push(issue);        
72e43d 410       }
a450f2 411       var theList = new IssueList(issueList);
U 412       var template = $('#tpl-ci').html();
413       Mustache.parse(template);   // optional, speeds up future uses
414       $('.system-out').empty();
415       $('.system-out').html(Mustache.render(template, theList));
416       $('.sued').show();
72e43d 417     }
U 418   });
419 }
420
fd0b4c 421 function fm_compile(modeStr, callback) {
0ac262 422   var liste = fm_gewaehlte_dateien();
fd0b4c 423   var m = '?c=de.uhilger.filecms.api.CompileService&m=compile&p=' + pfad + '&p=' + encodeURIComponent(liste) + 
U 424           '&p=' + modeStr;
0ac262 425   var u = '../svc' + m;
e3043f 426   fm_get(u, "json", function(resp) {
fd0b4c 427     callback(resp);
0ac262 428   });
U 429 }
430
10d3d3 431 function fm_ansicht_umschalten() {
U 432   if($('#ansicht').children(0).hasClass('fa-th-list')) {
433     $('#ansicht').children(0).addClass('fa-th-large');
434     $('#ansicht').children(0).removeClass('fa-th-list');
435     modus = 'liste';
436   } else {
437     $('#ansicht').children(0).addClass('fa-th-list');    
438     $('#ansicht').children(0).removeClass('fa-th-large');
439     modus = 'kacheln';
440   }
441   fm_get_list(pfad);
442 }
443
444 function fm_set_modus() {
445   if(modus == 'kacheln') {
446     $('#ansicht').children(0).addClass('fa-th-list');    
447     $('#ansicht').children(0).removeClass('fa-th-large');  
448   } else {
449     $('#ansicht').children(0).addClass('fa-th-large');
450     $('#ansicht').children(0).removeClass('fa-th-list');    
451   }
a4d3b5 452 }
U 453
454 function fm_menu_neue_textdatei() {
adf812 455   fm_text_edit('Neue Datei');
a4d3b5 456 }
U 457
305573 458 function fm_menu_neues_dokument() {
7d8ef6 459   fm_dok_edit('');
305573 460 }
U 461
a4d3b5 462 function fm_menu_datei_schliessen() {
3003b2 463   if(openEditor === 'text') {
U 464     if(!cm.getDoc().isClean()) {
465       fm_ask_for_save();
466     } else {
467       fm_do_close();
468     }
469   } else {
470     if(tinymce.activeEditor.undoManager.hasUndo()) {
471       fm_ask_for_save();
472     } else {
473       fm_do_close();
474     }
475   }
476 }
477
478 function fm_ask_for_save() {
479   // hier Abfrage ob gespeichert werden soll    
480   $('#confirmOk').click(function() {
481     $('#confirmOk').attr('onclick','').unbind('click');
482     fm_menu_datei_speichern(function() {
a75859 483       fm_do_close();
U 484     });
3003b2 485   });
U 486   $('#confirmCancel').click(function() {
487     $('#confirmCancel').attr('onclick','').unbind('click');
488   });
489   $('#confirmClose').show();
490   $('#confirmClose').click(function() {
491     $('#confirmClose').attr('onclick','').unbind('click');
a75859 492     fm_do_close();
3003b2 493   });
U 494   $('#confirmOk').text("Speichern");
495   $('#confirmOk').addClass('btn-primary');
496   $('#confirmOk').removeClass('btn-danger');
497   $('#confirmModalTitle').text("Schliessen");
498   $('#confirmModalBody').text("Speichern vor dem Schliessen?");
499   $('#confirmModal').modal({
500     keyboard: false,
501     show: true
502   });
a75859 503 }
U 504
505 function fm_do_close() {
a4d3b5 506   $('.codeeditor-space').hide();
U 507   $('.code-editor-container').hide();
305573 508   $("#mce-editor").hide();
U 509   if(cm !== undefined) {
510     cm.toTextArea();
511   }
5ebb8e 512   openFileName = '';
7d8ef6 513   openEditor = '';
adf812 514   fm_get_list(pfad);
305573 515   fm_filectls_show();
e5ff42 516 }
U 517
17919c 518 function fm_dateiwahl(ev) {
5dfab6 519   var elem = this;
17919c 520   //console.log('dateiwahl nach click, event shift: ' + ev.shiftKey + ", event ctrl: " + ev.ctrlKey);
10d3d3 521   if(modus == 'kacheln') {
957b51 522     // Kacheln
10d3d3 523     if($(elem).children(0).hasClass('fa-folder')) {
957b51 524       if(/*ev.shiftKey || */ ev.ctrlKey) {
U 525         $(elem).find('.dateiname').addClass('datei-gewaehlt');
10d3d3 526       } else {
957b51 527         var ordner = $(elem).text().trim();
U 528         if(pfad.length > 0) {
529           pfad = pfad + '/' + ordner;
530         } else {
531           pfad = ordner;
532         }
533         fm_get_list(pfad);
10d3d3 534       }
7f2a41 535     } else if($(elem).children(0).hasClass('datei')) {
17919c 536       if(/*ev.shiftKey || */ ev.ctrlKey) {
U 537         // mehrere Dateien sollen gewaehlt werden
538       } else {
539         $('.datei-gewaehlt').removeClass('datei-gewaehlt');        
540       }
957b51 541       $(elem).find('.dateiname').addClass('datei-gewaehlt');
5dfab6 542     } else {
10d3d3 543       //console.log('kein folder oder file...');
5dfab6 544     }
U 545   } else {
957b51 546     // Liste
10d3d3 547     if($(elem).find('.datei-elem').children(0).hasClass('fa-file-o')) {
957b51 548       // Datei
17919c 549       if(/*ev.shiftKey || */ ev.ctrlKey) {
U 550         // mehrere Dateien sollen gewaehlt werden
551       } else {
552         $('.table-info').removeClass('table-info');
957b51 553         $('.datei-gewaehlt').removeClass('datei-gewaehlt');
17919c 554       }
10d3d3 555       $(elem).addClass('table-info');
U 556       $(elem).find('.dateiname').addClass('datei-gewaehlt');
557     } else {
957b51 558       // Ordner
U 559       if(/*ev.shiftKey || */ ev.ctrlKey) {
560         $(elem).children(0).addClass('datei-gewaehlt');
10d3d3 561       } else {
957b51 562         var ordner = $(elem).find('.dateiname').text();
U 563         if(pfad.length > 0) {
564           pfad = pfad + '/' + ordner;
565         } else {
566           pfad = ordner;
567         }
568         fm_get_list(pfad);
10d3d3 569       }
U 570     }   
5dfab6 571   }
c509a0 572 }
U 573
a94216 574 function fm_bc_click() {
U 575   var elem = this;
576   var bcPfad = $(elem).attr('rpath');
577   if(bcPfad !== undefined) {
c509a0 578     pfad = bcPfad;
a94216 579     fm_get_list(bcPfad);
U 580   } else {
581     pfad = '';
582     fm_get_list('');
583   }
584 }
585
42fece 586 function fm_text_edit(content, mode) {
305573 587   fm_filectls_hide();
3ad4db 588   $('.codeeditor-space').show();
U 589   $('.code-editor-container').show();
42fece 590   fm_code_edit(content, mode);  
7d8ef6 591   openEditor = 'text';
U 592 }
593
594 function fm_dok_edit(content) {
595   fm_filectls_hide();
0c1d5b 596   fm_dok_editor_init(userid);
7d8ef6 597   $("#mce-editor").show();
be9b6d 598   
U 599   window.clearTimeout(tmo2);
600   tmo2 = window.setTimeout(function () {
601     try {
602       ed.setContent(content);
603       openEditor = 'dok';  
604     } catch (err) {
605     }
606   }, 200);
3ad4db 607 }
U 608
305573 609 function fm_filectls_hide() {
U 610   $('#zentrum_bc').hide();
611   $('#dateien').hide();
547755 612   $('#editMenu').addClass('disabled');
305573 613 }
U 614
615 function fm_filectls_show() {
616   $('#zentrum_bc').show();
617   $('#dateien').show();  
547755 618   $('#editMenu').removeClass('disabled');
305573 619 }
b7475d 620 /* ----- API Calls ------------- */
U 621
0c1d5b 622 function fm_get_login() {
3ad4db 623   var m = '?c=de.uhilger.filecms.pub.SessionManager&m=getSessionUser';
U 624   var u = '../pub' + m;
625   fm_get(u, "text", function(resp) {
0c1d5b 626     userid = resp;
3ad4db 627     $('#userMenu').text(resp);
7342b1 628   });  
c509a0 629 }
U 630
631 function fm_get_new_folder() {
632   $('#modal_ok').click(function() {
633     // hier speichern
634     var m = '?c=de.uhilger.filecms.api.FileMgr&m=newFolder&p=' + pfad + '&p=' + $('#dateiname').val();
635     var u = '../svc' + m;
636     fm_get(u, "json", function(resp) {
adf812 637       fm_get_list(pfad);
c509a0 638     });
U 639   });
957b51 640   $('#saveModalTitle').text('Neuer Ordner');
c509a0 641   $('#dialogfrage').text("Name?");
U 642   $('#dateiname').val('');
643   $('#dateiname').attr('placeholder', 'Ordnername');
644   $('#saveModal').modal({
645     keyboard: false,
646     show: true
647   });
7342b1 648 }
U 649
7d8ef6 650 function fm_get_file_content(typ) {
fc1897 651   var gewaehlte = $('.datei-gewaehlt');
957b51 652   //var fname = $(gewaehlte).find('.dateiname').text();
U 653   
654   var fname = $(gewaehlte[0]).text();
5ebb8e 655   openFileName = fname;
3ad4db 656   var m = '?c=de.uhilger.filecms.api.FileMgr&m=getCode&p=' + pfad + '&p=' + fname;
2121cc 657   var u = '../svc' + m;
3ad4db 658   fm_get(u, "text", function(resp) {
7d8ef6 659     if(typ == 'text') {
42fece 660       var mode = "text/x-java";
U 661       if(fname.endsWith('js')) {
662         mode = 'javascript';
663       } else if(fname.endsWith('xml')) {
664         mode = 'xml';
665       } else if(fname.endsWith('properties')) {
666         mode = 'xml';
667       }
668       fm_text_edit(resp, mode);
7d8ef6 669     } else {
U 670       fm_dok_edit(resp);
671     }
2121cc 672   });
3ad4db 673   
2121cc 674 }
U 675
fc8db1 676 function fm_view_file() {
U 677   // http://localhost:8080/file-cms/ui/#  
678   // http://localhost:8080/file-cms/data/admin/usw.
679   
680   var userid = $('#userMenu').text();
681   var gewaehlte = $('.datei-gewaehlt');
682   var fname = $(gewaehlte[0]).text();
0c1d5b 683   
U 684   var path = fm_get_path(userid);
685   
686   window.open(path + '/' + fname, '_blank');
fc8db1 687 }
U 688
8446c2 689 function fm_menu_datei_umbenennen() {
U 690   var gewaehlte = $('.datei-gewaehlt');
691   var fname = $(gewaehlte[0]).text();
663ee9 692
U 693   $('#modal_ok').click(function() {
694     // hier umbenennen
50bb41 695     fm_rename_file(fname, pfad, $('#dateiname').val());
663ee9 696   });
U 697   $('#saveModalTitle').text('Datei umbenennen');
698   $('#dialogfrage').text("Neuer Dateiname?");  
699
700   if(fname !== undefined) {
701     $('#dateiname').val(fname);
702     $('#dateiname').attr('placeholder', 'Dateiname');
703     $('#saveModal').modal({
704       keyboard: false,
705       show: true
706     });
707   }
708 }
709
710 function fm_rename_file(fn, p, neuerName) {
711   var m = '?c=de.uhilger.filecms.api.FileMgr&m=renameFile';
712   m = m + '&p=' + p; 
713   m = m + '&p=' + fn; 
714   m = m + '&p=' + neuerName; 
715   var u = '../svc' + m;
716   fm_get(u, "text", function(resp) {
717     fm_get_list(pfad);
718   });  
8446c2 719 }
U 720
438b16 721 function fm_menu_shrink() {
U 722   var gewaehlte = $('.datei-gewaehlt');
723   var fname = $(gewaehlte[0]).text();
724   var m = '?c=de.uhilger.filecms.api.FileMgr&m=bildVerkleinern';
725   m = m + '&p=' + pfad; 
726   m = m + '&p=' + fname; 
727   var u = '../svc' + m;
728   fm_get(u, "text", function(resp) {
729     fm_get_list(pfad);
730   });  
731 }
732
7165a1 733 /*
U 734  * Hier merkt sich die Dateiverwalting die markierten Dateien fuer 
735  * eine Dateioperation. Bei cut wird in der 'paste' Operation auf dem Server 
736  * fuer die 'gemerkten' Dateien ein Move gemacht. Die Dateien werden 
737  * vom gewaehlten Ort zum Zielort verschoben.
738  * 
739  * @returns {undefined}
740  */
741 function fm_cut_files() {
742   cutCopySrcDir = pfad;
743   cutCopyFiles = fm_gewaehlte_dateien();
744   cutCopyOperation = 'cut';
745 }
746
747 /*
748  * Hier merkt sich die Dateiverwalting die markierten Dateien fuer 
749  * eine Dateioperation. Bei copy wird in der 'paste' Operation auf dem Server 
750  * fuer die 'gemerkten' Dateien eine Kopie gemacht. Die Dateien werden 
751  * am gewaehlten Ort behalten und am Zielort wird eine Kopier der 
752  * gewaehlten DAteien erstellt
753  * 
754  * @returns {undefined}
755  */
756 function fm_copy_files() {
757   cutCopySrcDir = pfad;
758   cutCopyFiles = fm_gewaehlte_dateien();
9e2964 759   cutCopyOperation = 'copy';
7165a1 760 }
U 761
762 /*
763  * Hier wird fuer eine zuvor markierte Liste von Dateien, fuer die 
764  * Cut oder Copy gewaehlt wurde, die Operations ausgefuehrt (move oder copy)
765  * @returns {undefined}
766  */
767 function fm_paste_files() {
768   var m;
9e2964 769   if(cutCopyOperation === 'cut') {
U 770     //m = '?c=de.uhilger.filecms.api.FileMgr&m=moveFiles'; //&p=' + cutCopySrcDir + '&p=' + pfad + '&p=' + encodeURIComponent(liste);
771     m = '?c=de.uhilger.filecms.api.FileMgr&m=moveFiles&p=' + cutCopySrcDir + '&p=' + pfad + '&p=' + encodeURIComponent(cutCopyFiles);
7165a1 772   } else {
9e2964 773     //m = '?c=de.uhilger.filecms.api.FileMgr&m=copyFiles'; //&p=' + cutCopySrcDir + '&p=' + pfad + '&p=' + encodeURIComponent(liste);
U 774     m = '?c=de.uhilger.filecms.api.FileMgr&m=copyFiles&p=' + cutCopySrcDir + '&p=' + pfad + '&p=' + encodeURIComponent(cutCopyFiles);
fc1897 775   }
7165a1 776   var u = '../svc' + m;  
9e2964 777   fm_get(u, "text", function(resp) {
U 778     // console.log('deleteFiles gab folgendes zurueck: ' + resp);
779     fm_get_list(pfad);
780   });
781   /*
782   fm_post(u, {p1: encodeURIComponent(cutCopySrcDir), p2: encodeURIComponent(pfad), p3: encodeURIComponent(cutCopyFiles)},'text', function(resp) {
7165a1 783     // resp evtl. zeigen..
U 784     fm_get_list(pfad);
785   });
9e2964 786   */
7165a1 787 }
U 788
789 function fm_del_files() {
790   var liste = fm_gewaehlte_dateien();
fc1897 791   var m = '?c=de.uhilger.filecms.api.FileMgr&m=deleteFiles&p=' + pfad + '&p=' + encodeURIComponent(liste);
U 792   var u = '../svc' + m;
793   fm_get(u, "text", function(resp) {
794     // console.log('deleteFiles gab folgendes zurueck: ' + resp);
795     fm_get_list(pfad);
796   });
797 }
798
10d3d3 799 function fm_render_list(fl) {
U 800   if(modus == 'kacheln') {
801     // Kachelansicht
7d8ef6 802     var template = $('#tpl-kacheln').html();
U 803     Mustache.parse(template);   // optional, speeds up future uses
804     $('.datei-zeile').attr('onclick','').unbind('click');
805     $('#dateien').empty();
806     $('#dateien').html(Mustache.render(template, fl));
807     $('.figure').click(fm_dateiwahl);
808   } else {
809     // Listenansicht
810     var template = $('#tpl-liste').html();
811     Mustache.parse(template);   // optional, speeds up future uses
812     $('.figure').attr('onclick','').unbind('click');
813     $('#dateien').empty();
814     $('#dateien').html(Mustache.render(template, fl));
815     $('.datei-zeile').click(fm_dateiwahl);
816   }
817   /*
818   if(modus == 'kacheln') {
819     // Kachelansicht
a3d410 820     $.get('tpl-kacheln.txt', function(template) {
U 821       $('#dateien').empty();
822       $('#dateien').html(Mustache.render(template, fl));
823       $('.figure').click(fm_dateiwahl);
824     });
10d3d3 825     $('.datei-zeile').attr('onclick','').unbind('click');
U 826   } else {
827     // Listenansicht
a3d410 828     $.get('tpl-liste.txt', function(template) {
U 829       $('#dateien').empty();
830       $('#dateien').html(Mustache.render(template, fl));
831       $('.datei-zeile').click(fm_dateiwahl);
832     });
10d3d3 833     $('.figure').attr('onclick','').unbind('click');
U 834   }
7d8ef6 835   */
10d3d3 836 }
U 837
7342b1 838 // http://localhost:8079/file-cms/svc?c=de.uhilger.filecms.api.FileMgr&f=JSONNICE&m=list&p=
a94216 839 function fm_get_list(relPfad) {
10d3d3 840   $('#ansicht').attr('onclick','').unbind('click');
a94216 841   var m = '?c=de.uhilger.filecms.api.FileMgr&m=list&p=' + relPfad;
7342b1 842   var u = '../svc' + m;
U 843   fm_get(u, "json", function(resp) {
10d3d3 844     
2121cc 845     if(resp.List[0].FileRef !== undefined) {
U 846       var files = new Array();
c509a0 847       if(resp.List[0].FileRef instanceof Array) {
U 848         for(var i = 0; i < resp.List[0].FileRef.length; i++) {
849           files.push(new FileRef(resp.List[0].FileRef[i]));
850         }
851       } else {
852         files.push(new FileRef(resp.List[0].FileRef));
2121cc 853       }
U 854       var fl = new FileList(files);
10d3d3 855       fm_render_list(fl);
2121cc 856     } else {
U 857       $('#dateien').empty();
7342b1 858     }
5dfab6 859     
10d3d3 860     // Breadcrumb-Ansicht
7d8ef6 861     var template;
a94216 862     $('.breadcrumb-item').attr('onclick','').unbind('click');
2315a0 863     $('#bcnav').empty();
5dfab6 864     var dirList = new Array();
U 865     var rp = '';
a94216 866     //console.log("'" + relPfad + "'");
U 867     var dirs = relPfad.split('/');
868     //console.log(dirs.length);
2121cc 869     dirList.push(new BcrFile(rp, 'Home'));
a94216 870     if(relPfad.length > 0) {
2315a0 871       for(var i = 0; i < dirs.length - 1; i++) {
5dfab6 872         if(rp.length > 0 ) {
U 873           dirList.push(new BcrFile(rp + '/' + dirs[i], dirs[i]));
2315a0 874           rp = rp + '/' + dirs[i];
5dfab6 875         } else {
U 876           dirList.push(new BcrFile(dirs[i], dirs[i]));
2315a0 877           rp = dirs[i];
5dfab6 878         }
U 879       }
880       var bl = new BcrFiles(dirList);
7d8ef6 881  
U 882       if(dirList.length > 0) {
883         template = $('#tpl-bcr').html();
884         Mustache.parse(template);   // optional, speeds up future uses
885         $('#bcnav').html(Mustache.render(template, bl));
2315a0 886       }
7d8ef6 887       
U 888       if(dirs.length > 0) {
889         dirList.push(new BcrFile(rp + '/' + dirs[dirs.length-1], dirs[dirs.length-1]));
890         template = $('#tpl-bcr2').html();
891         Mustache.parse(template);   // optional, speeds up future uses
892         $('#bcnav').append(Mustache.render(template, dirList[dirList.length-1]));        
893       } else {
894         template = $('#tpl-bcr2').html();
895         Mustache.parse(template);   // optional, speeds up future uses
896         $('#bcnav').append(Mustache.render(template, dirList[0]));        
897       }
898       
899       $('#bcnav').append($('#tpl-bcr3').html());
2315a0 900     } else {
a94216 901       pfad = '';
7d8ef6 902       template = $('#tpl-bcr2').html();
U 903       Mustache.parse(template);   // optional, speeds up future uses
904       $('#bcnav').append(Mustache.render(template, dirList[0]));   
905       $('#bcnav').append($('#tpl-bcr3').html());
5dfab6 906     }
7d8ef6 907     $('.breadcrumb-item').click(fm_bc_click);
U 908     $('#ansicht').click(fm_ansicht_umschalten);
909     fm_set_modus();
910   });
e5ff42 911 }
U 912
a75859 913 function fm_menu_datei_speichern(callback) {
5ebb8e 914   //var fname = $('.datei-gewaehlt').text();
U 915   var fname = openFileName;
916   if(fname !== undefined && fname !== '') {
a75859 917     fm_save_file(fname, 'saveTextFile', callback);
5ebb8e 918   } else {
a75859 919     fm_menu_datei_speichern_unter(callback);
5ebb8e 920   }
U 921 }
922
a75859 923 function fm_save_file(saveFileName, method, callback) {
7d8ef6 924   var content;
U 925   if(openEditor === 'text') {
926     content = cm.getValue();
3003b2 927     cm.getDoc().markClean();
7d8ef6 928   } else {
U 929     content = ed.getContent();
3003b2 930     tinymce.activeEditor.undoManager.clear();
7d8ef6 931   }
47e9d4 932   var m = '?c=de.uhilger.filecms.api.FileMgr&m=' + method;
5ebb8e 933   var u = '../svc' + m;
7d8ef6 934   fm_post(u, {p1: pfad, p2: saveFileName, p3: content}, function(resp) {
a75859 935     // hier scheint nichts zurueckzukommen..
5ebb8e 936   });
a75859 937   openFileName = saveFileName;
3003b2 938   if(typeof (callback) !== 'function') {
U 939     
940   } else {
a75859 941     callback();
U 942   }
5ebb8e 943 }
U 944
a75859 945 function fm_menu_datei_speichern_unter(callback) {  
915927 946   $('#modal_ok').click(function() {
a75859 947     $('#modal_ok').attr('onclick','').unbind('click');
915927 948     // hier speichern
a75859 949     fm_save_file($('#dateiname').val(), 'saveTextFileAs', callback);
915927 950   });
957b51 951   $('#saveModalTitle').text('Datei speichern');
c509a0 952   $('#dialogfrage').text("Dateiname?");
3ad4db 953   
U 954   var fname = $('.datei-gewaehlt').text();
955   if(fname !== undefined) {
956     $('#dateiname').val(fname);
957   } else {
958     $('#dateiname').val('');
959   }
c509a0 960   $('#dateiname').attr('placeholder', 'Dateiname');
915927 961   $('#saveModal').modal({
U 962     keyboard: false,
963     show: true
964   });
a4d3b5 965 }
U 966
b7475d 967 function fm_logout() {
U 968   var m = '?c=de.uhilger.filecms.pub.SessionManager&m=expireSession';
969   var u = '../pub' + m;
970   
971   fm_get(u, "text", function(resp) {
972     $('#userMenu').text('nicht angemeldet');
973     window.location.href = '../logout.html';
974   });
975 }
976
977
a4d3b5 978 /* ---- codemirror editor handling -------- */
U 979
64d8b9 980 /*
942d63 981 function htmlDecode(value){ 
U 982   return $('<div/>').html(value).text(); 
983 }
64d8b9 984 */
942d63 985
42fece 986 function fm_code_edit(content, m) {
a4d3b5 987   cm = CodeMirror.fromTextArea(document.getElementById("editspace"), {
U 988     lineNumbers: true,
e3043f 989     gutters: ["CodeMirror-linenumbers", "breakpoints"],
42fece 990     mode: m,
a4d3b5 991     viewportMargin : Infinity,
d920b7 992     tabSize: 2,
a4d3b5 993     extraKeys: {
915927 994         "F9": function(cm) {
U 995         cm.setOption("fullScreen", !cm.getOption("fullScreen"));
996       },
997         "Esc": function(cm) {
998         if (cm.getOption("fullScreen")) cm.setOption("fullScreen", false);
7ad1b7 999       },
U 1000         ".": function(cm) {
1001         console.log('dot pressed: perhaps look up class or method name');
3b7c5b 1002         /*
U 1003          * Hier kann man eine Funktion ausloesen, die fuer das 
1004          * Wort vor dem Punkt (Name der Klasse) eine Liste mit 
1005          * Vorschlaegen fuer Methodennamen einblendet.
1006          */
1007         
1008         /*
1009          * CodeMirror.Pass laesst das Zeichen zum Editorinhalt durch, 
1010          * verhindert aber das Ausloesen von 'keyHandled'
1011          */
1012         return CodeMirror.Pass; 
915927 1013       }
a4d3b5 1014     }
U 1015   });
fab80c 1016   //cm.setValue(htmlDecode(content));
U 1017   //cm.setValue(content);
1018   cm.setValue(unescapeHtml(content));
3003b2 1019   cm.getDoc().markClean();
e3043f 1020   cm.on("gutterClick", function(theEditor, lineNumber) {
U 1021     var info = theEditor.lineInfo(lineNumber);
1022     //--lineNumber;
1023     //console.log(info.gutterMarkers.breakpoints.message);
1024     //var marker = info.gutterMarkers.breakpoints;
1025     //$(marker).tooltip('toggle');
1026   });
3b7c5b 1027   /*
7ad1b7 1028   cm.on("keyHandled", function(theEditor, keyName, event){
3b7c5b 1029     console.log('cm.keyHandled keyName: ' + keyName + ', event.type: ' + event.type);    
7ad1b7 1030   });
3b7c5b 1031   */
e3043f 1032 }
U 1033
1034 function makeMarker(msg) {
1035   var marker = document.createElement("div");
1036   marker.style.color = "#822";
1037   marker.innerHTML = "●";
1038   //marker.message = msg;
1039   $(marker).tooltip({
1040     placement: 'right',
1041     title: msg,
ed12de 1042     offset: '0 -30'
e3043f 1043   });
U 1044   return marker;
915927 1045 }
a4d3b5 1046
U 1047 /* -------- helper functions ----------- */
1048
b7475d 1049 function fm_get(u, dtype, scallback) {
a4d3b5 1050   $.ajax({
U 1051     url: u,
1052     type: "GET",
b7475d 1053     dataType: dtype,
a4d3b5 1054     success: scallback,
U 1055     error: function (xhr, status, errorThrown) {
1056       alert("Error: " + errorThrown + " Status: " + status + " URL: " + u);
1057     },
1058     complete: function (xhr, status) {
1059       //console.log( "The request is complete!" );
1060     }
1061
1062   });
915927 1063 }
a4d3b5 1064
9e2964 1065 function fm_post(u, d, dtype, scallback) {
a4d3b5 1066   $.ajax({
U 1067     url: u,
1068     data: d,
1069     type: "POST",
9e2964 1070     dataType: dtype,
a4d3b5 1071     success: scallback,
U 1072     error: function (xhr, status, errorThrown) {
1073       $('#fehler').html("Error: " + errorThrown + " Status: " + status);
1074     },
1075     complete: function (xhr, status) {
1076       //alert( "The request is complete!" );
1077     }
1078   });
915927 1079 }
a4d3b5 1080
e5ff42 1081 function fm_serialise(obj) {
U 1082   return '{"' + obj.constructor.name + '":' + JSON.stringify(obj) + '}';
915927 1083 }
e5ff42 1084
fab80c 1085 function escapeHtml(text) {
U 1086   text = text.replace(/\u228/g,'&auml;');
1087   text = text.replace(/\u246/g,'&ouml;');
1088   text = text.replace(/\u252/g,'&uuml;');
1089   text = text.replace(/\u196/g,'&Auml;');
1090   text = text.replace(/\u214/g,'&Ouml;');
1091   text = text.replace(/\u220/g,'&Uuml;');
1092   text = text.replace(/\u223/g,'&szlig;');
1093   text = text.replace(/\u26/g,'&amp;');
1094   return text;
1095 }
1096
1097 function unescapeHtml(text) {
1098   text = text.replace(/&auml;/g, String.fromCharCode(228));
1099   text = text.replace(/&ouml;/g, String.fromCharCode(246));
1100   text = text.replace(/&uuml;/g, String.fromCharCode(252));
1101   text = text.replace(/&Auml;/g, String.fromCharCode(196));
1102   text = text.replace(/&Ouml;/g, String.fromCharCode(214));
1103   text = text.replace(/&Uuml;/g, String.fromCharCode(220));
1104   text = text.replace(/&szlig;/g, String.fromCharCode(223));
1105   text = text.replace(/&amp;/g, String.fromCharCode(26));
1106   return text;
1107 }
1108
1109
7342b1 1110 /* ----- Objekte ----- */
U 1111
a450f2 1112 function IssueList(il) {
U 1113   this.issues = il;
1114 }
1115
1116 function CompilerIssue(sn, ms, ki, ln) {
1117   var self = this;
1118   this.sourceName = sn;
1119   this.message = ms;
1120   this.kind = ki;
1121   this.lineNumber = ln;
1122 }
1123
7342b1 1124 function FileList(fl) {
U 1125   this.files = fl;
1126 }
1127
1128 function FileRef(obj) {
1129   var self = this;
1130   this.fr = obj;
7f2a41 1131   this.fnx;
7342b1 1132   
U 1133   this.typeClass = function() {
10d3d3 1134     if(modus == 'kacheln') {
U 1135       if(self.fr.isDirectory) {
a3d410 1136         return 'fa-folder ordner';
10d3d3 1137       } else {
a3d410 1138         return 'fa-file datei';
10d3d3 1139       }
7342b1 1140     } else {
10d3d3 1141       if(self.fr.isDirectory) {
a3d410 1142         return 'fa-folder ordner';
10d3d3 1143       } else {
a3d410 1144         return 'fa-file-o datei';
10d3d3 1145       }
7342b1 1146     }
2121cc 1147   };
U 1148   
7f2a41 1149   this.mini = function() {
U 1150     var miniatur = false;
1151     var namen = self.fr.absolutePath.split('/');
1152     if(namen.length > 0) {
1153       self.fnx = decodeURIComponent(namen[namen.length - 1]);
1154     } else {
1155       self.fnx = decodeURIComponent(self.fr.absolutePath);
1156     }
1157     if(self.fnx.indexOf('.jpg') > -1 || self.fnx.indexOf('.png') > -1 || self.fnx.indexOf('.gif') > -1 || self.fnx.indexOf('.jpeg') > -1) {
1158       miniatur = true;
1159     }
1160     return miniatur;
1161   };
1162   
1163   this.miniurl = function() {
1164       var userid = $('#userMenu').text();
1165       var ext = '';
1166       var dotpos = self.fnx.indexOf('.');
1167       if(dotpos > -1) {
1168         var fny = self.fnx;
1169         self.fnx = self.fnx.substring(0, dotpos);
1170         ext = fny.substr(dotpos);
1171       }
1172       var path = fm_get_path(userid);
fa012b 1173       var imgurl = loc + path + '/' + self.fnx + '_tn' + ext;
7f2a41 1174       return imgurl;
U 1175     
1176   };
1177   
2121cc 1178   this.fileName = function() {
7f2a41 1179     
2121cc 1180     var namen = self.fr.absolutePath.split('/');
U 1181     if(namen.length > 0) {
f7d8bf 1182       return decodeURIComponent(namen[namen.length - 1]);
2121cc 1183     } else {
f7d8bf 1184       return decodeURIComponent(self.fr.absolutePath);
2121cc 1185     }
7f2a41 1186     
2121cc 1187   };
7342b1 1188 }
5dfab6 1189
U 1190 function BcrFiles(fl) {
1191   this.files = fl;
1192 }
1193
1194 function BcrFile(rp, n) {
1195   this.relPath = rp;
1196   this.fName = n;
7aa566 1197 }
U 1198