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