Dateiverwaltung für die WebBox
Ulrich
2017-02-28 98f0886e72553f7364bbdd70ae77dfb7544a2fa8
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;
7165a1 27 var cutCopySrcDir;
U 28 var cutCopyFiles;
29 var cutCopyOperation;
c7c502 30
U 31 function fm_init() {
305573 32   $("#mce-editor").hide();
a4d3b5 33   $('.codeeditor-space').hide();
U 34   $('.code-editor-container').hide();
bef5c6 35   //$('.ost').attr('flex-basis', 0);
a4d3b5 36   $('#newTextFile').on('click', fm_menu_neue_textdatei);
305573 37   $('#newDoc').on('click', fm_menu_neues_dokument);
adf812 38   $('#newFolder').on('click', fm_get_new_folder);
fc8db1 39   $('#viewFile').on('click', fm_view_file);
7d8ef6 40   $('#editTextFile').on('click', function() {
U 41     fm_get_file_content('text');
42   });
43   $('#editDocFile').on('click', function() {
44     fm_get_file_content('dok');
45   });
e5ff42 46   $('#saveFile').on('click', fm_menu_datei_speichern);
5ebb8e 47   $('#saveFileAs').on('click', fm_menu_datei_speichern_unter);
a4d3b5 48   $('#closeFile').on('click', fm_menu_datei_schliessen);
fc1897 49   $('#m-del').on('click', fm_menu_delete);
7165a1 50   $('#m-cut').on('click', fm_menu_cut);
U 51   $('#m-copy').on('click', fm_menu_copy);
52   $('#m-paste').on('click', fm_menu_paste);
bef5c6 53   $('#m-test').on('click', fm_menu_test);
c509a0 54   $('#saveModal').on('hidden.bs.modal', function (e) {
915927 55     $('#modal_ok').attr('onclick','').unbind('click');
b7475d 56   });
U 57   $('#logout').click(fm_logout);  
05cfa7 58   fm_get_login();
7342b1 59   fm_get_list('');
7aa566 60   fm_init_uploader();
fc8db1 61 }
U 62
0c1d5b 63 function fm_resize_editor() {
U 64   window.clearTimeout(tmo);
65   tmo = window.setTimeout(function () {
66     try {
67       var myHeight = $('.zentrum').height() - $('.nord').height() - 4;
68       ed.theme.resizeTo('100%', myHeight);  // sets the dimensions of the editable area
69     } catch (err) {
70     }
71   }, 200);
fc8db1 72 }
U 73
0c1d5b 74 function fm_get_path(uid) {
U 75   //console.log('pfad: ' + pfad);
76   var restdir;
77   if(pfad.indexOf('Oeffentlich') > -1) {
78     restdir = pfad.substr('Oeffentlich'.length);
79   } else if(pfad.indexOf('Persoenlicher Ordner') > -1) {
80     restdir = pfad.substr('Persoenlicher Ordner'.length);
81   }
82   if(restdir !== undefined && restdir.startsWith('/')) {
83     restdir = restdir.substr(1);
84   }
85   var pdir = fm_get_base(uid);
86   //console.log('path: ' + pdir + "/" + restdir);
87   if(restdir.length > 1) {
88     return pdir + "/" + restdir;
89   } else {
90     return pdir;
91   }
92 }
93
94 function fm_get_base(uid) {
95   //console.log('pfad: ' + pfad);
96   var pdir;
97   if(pfad.indexOf('Oeffentlich') > -1) {
98     pdir = '/data/';
99   } else if(pfad.indexOf('Persoenlicher Ordner') > -1) {
100     pdir = '/home/';
101   }
102   //console.log('base: ' + pdir + uid);
103   return pdir + uid;
104 }
05cfa7 105
0c1d5b 106 function fm_dok_editor_init(uid) {
U 107   var base = fm_get_path(uid);
108   //console.log("calling tinymce.init with base: " + base + "/");
fc8db1 109   
0c1d5b 110   /*
U 111    * vgl.
112    * http://stackoverflow.com/questions/4651676/how-do-i-remove-tinymce-and-then-re-add-it
113    */
114   //tinymce.EditorManager.execCommand('mceRemoveControl',true, 'textarea.text-editor');
115   //tinymce.EditorManager.execCommand('mceAddControl',true, editor_id);
116   if(ed !== undefined) {
117     ed.destroy();
118   }
119   tinymce.remove('textarea.text-editor');
120   tinymce.EditorManager.editors = []; 
305573 121   
U 122   /*
123    * Konfiguration TinyMCE
124    */
125   tinymce.init({
126     content_css : "mce.css",
7d8ef6 127     selector: "textarea.text-editor",
305573 128     statusbar: false,
U 129     menubar: false,
7d8ef6 130     plugins: 'advlist charmap code image link lists media print preview save table textcolor',
U 131     toolbar: 'undo redo | styleselect | image | link unlink | bullist numlist | outdent indent | code',
305573 132     /*
U 133     menu: {
134       file: {title: 'File', items: 'savevers | exit'},
135       edit: {title: 'Edit', items: 'undo redo | cut copy paste pastetext | selectall'},
136       view: {title: 'View', items: 'visualaid | code | link image media | template hr'},
137     },
138     */
0c1d5b 139     resize: 'both',
305573 140     width: "100%",
U 141     height: '100%',
0c1d5b 142     document_base_url : base + "/",
305573 143     setup: function (editor) {
U 144       ed = editor;
145     }
146   });
0c1d5b 147   
U 148   $(window).on('resize', fm_resize_editor);
149   fm_resize_editor();
10d3d3 150 }
7aa566 151
U 152 /* ----- Uploader Anfang ----------*/
153
154 var dateien = new Array();
155
156 function fm_init_uploader() {
157   var dropzone = document.getElementById("dateien");  
158   dropzone.ondragover = dropzone.ondragenter = function(event) {  
159     event.stopPropagation();  
160     event.preventDefault();  
161   };
162
163   dropzone.ondrop = function(event) {  
164     event.stopPropagation();  
165     event.preventDefault();  
7ebde1 166     var fileList = event.dataTransfer.files;  
U 167     for (var i=0; i<fileList.length; i++) {  
168       dateien.push(fileList[i]);
169     }
170     sendFile(dateien.pop());
7aa566 171   };
U 172 }
173
174 function sendFile(datei) {
7ebde1 175   var uri = "../api/upload";
7aa566 176   var xhr = new XMLHttpRequest();  
U 177   var fd = new FormData();  
178   xhr.open("POST", uri, true);  
179   xhr.onreadystatechange = function() {  
180     if (xhr.readyState == 4 && xhr.status == 200) {  
181       fm_get_list(pfad);
7ebde1 182       if(dateien.length > 0) {
U 183         sendFile(dateien.pop());
184       }
7aa566 185     }  
U 186   };  
7ebde1 187   fd.append('dateiauswahlfeld', datei);  
42fece 188   fd.append('pfad', pfad);
7aa566 189   xhr.send(fd);          
U 190 }
191
192 /* ----- Uploader Ende --------------- */
10d3d3 193
7165a1 194 /* ------- Dateifunktionen Start ----------- */
U 195
196 function fm_menu_cut() {
98f088 197   //alert('fm_menu_cut');
U 198   fm_cut_files();
7165a1 199 }
U 200 function fm_menu_copy() {
98f088 201   //alert('fm_menu_copy');
U 202   fm_copy_files();
7165a1 203 }
U 204 function fm_menu_paste() {
98f088 205   //alert('fm_menu_paste');
U 206   fm_paste_files();
7165a1 207 }
fc1897 208 function fm_menu_delete() {
U 209   $('#confirmOk').click(function() {
210     fm_del_files();
211   });
957b51 212   $('#confirmModalTitle').text("Löschen");
U 213   $('#confirmModalBody').text("Wirklich löschen?");
fc1897 214   $('#confirmModal').modal({
U 215     keyboard: false,
216     show: true
217   });
218 }
7165a1 219
U 220 /*
221  * Gewaehlte Dateien feststellen
222  * 
223  * @returns {String} eine per JSON.stringify schon vorbereitete List zum 
224  * Absenden als Parameter an den Server
225  */
226 function fm_gewaehlte_dateien() {
227   var gewaehlte = $('.datei-gewaehlt');
228   //console.log('anzahl: ' + gewaehlte.length);
229   var fnames = new Array();
230   var i = 0;
231   while(i < gewaehlte.length) {
232     var str = { "java.lang.String": $(gewaehlte[i]).text()};
233     fnames.push(str);
234     //console.log('loeschen ' + pfad + ' ' + $(gewaehlte[i]).text());
235     //i += 2;
236     i++;
237   }
238   var liste = '{"List":' + JSON.stringify(fnames) + '}';
239   // 'liste' enthaelt:
240   // {"List":[{"java.lang.String":"test3.txt"},{"java.lang.String":"Test1.txt"},{"java.lang.String":"Test2.txt"}]}
241   // und wird auf dem Server zu einer List[ArrayList<String>] bei der jede ArrayList<String> nur ein Element hat 
242   return liste;
243 }
244 /* --------- Dateifunktionen Ende ---------- */
fc1897 245
bef5c6 246 function fm_menu_test() {
U 247   var w = $('.ost').width();
248   if(w == 0) {
249     $('.ost').width('20%');
250     $('.ost').text('Hallo Welt!');
251   } else {
252     $('.ost').empty();
253     $('.ost').width(0);
254   }
255 }
256
10d3d3 257 function fm_ansicht_umschalten() {
U 258   if($('#ansicht').children(0).hasClass('fa-th-list')) {
259     $('#ansicht').children(0).addClass('fa-th-large');
260     $('#ansicht').children(0).removeClass('fa-th-list');
261     modus = 'liste';
262   } else {
263     $('#ansicht').children(0).addClass('fa-th-list');    
264     $('#ansicht').children(0).removeClass('fa-th-large');
265     modus = 'kacheln';
266   }
267   fm_get_list(pfad);
268 }
269
270 function fm_set_modus() {
271   if(modus == 'kacheln') {
272     $('#ansicht').children(0).addClass('fa-th-list');    
273     $('#ansicht').children(0).removeClass('fa-th-large');  
274   } else {
275     $('#ansicht').children(0).addClass('fa-th-large');
276     $('#ansicht').children(0).removeClass('fa-th-list');    
277   }
a4d3b5 278 }
U 279
280 function fm_menu_neue_textdatei() {
adf812 281   fm_text_edit('Neue Datei');
a4d3b5 282 }
U 283
305573 284 function fm_menu_neues_dokument() {
7d8ef6 285   fm_dok_edit('');
305573 286 }
U 287
a4d3b5 288 function fm_menu_datei_schliessen() {
U 289   $('.codeeditor-space').hide();
290   $('.code-editor-container').hide();
305573 291   $("#mce-editor").hide();
U 292   if(cm !== undefined) {
293     cm.toTextArea();
294   }
5ebb8e 295   openFileName = '';
7d8ef6 296   openEditor = '';
adf812 297   fm_get_list(pfad);
305573 298   fm_filectls_show();
e5ff42 299 }
U 300
17919c 301 function fm_dateiwahl(ev) {
5dfab6 302   var elem = this;
17919c 303   //console.log('dateiwahl nach click, event shift: ' + ev.shiftKey + ", event ctrl: " + ev.ctrlKey);
10d3d3 304   if(modus == 'kacheln') {
957b51 305     // Kacheln
10d3d3 306     if($(elem).children(0).hasClass('fa-folder')) {
957b51 307       if(/*ev.shiftKey || */ ev.ctrlKey) {
U 308         $(elem).find('.dateiname').addClass('datei-gewaehlt');
10d3d3 309       } else {
957b51 310         var ordner = $(elem).text().trim();
U 311         if(pfad.length > 0) {
312           pfad = pfad + '/' + ordner;
313         } else {
314           pfad = ordner;
315         }
316         fm_get_list(pfad);
10d3d3 317       }
U 318     } else if($(elem).children(0).hasClass('fa-file')) {
17919c 319       if(/*ev.shiftKey || */ ev.ctrlKey) {
U 320         // mehrere Dateien sollen gewaehlt werden
321       } else {
322         $('.datei-gewaehlt').removeClass('datei-gewaehlt');        
323       }
957b51 324       $(elem).find('.dateiname').addClass('datei-gewaehlt');
5dfab6 325     } else {
10d3d3 326       //console.log('kein folder oder file...');
5dfab6 327     }
U 328   } else {
957b51 329     // Liste
10d3d3 330     if($(elem).find('.datei-elem').children(0).hasClass('fa-file-o')) {
957b51 331       // Datei
17919c 332       if(/*ev.shiftKey || */ ev.ctrlKey) {
U 333         // mehrere Dateien sollen gewaehlt werden
334       } else {
335         $('.table-info').removeClass('table-info');
957b51 336         $('.datei-gewaehlt').removeClass('datei-gewaehlt');
17919c 337       }
10d3d3 338       $(elem).addClass('table-info');
U 339       $(elem).find('.dateiname').addClass('datei-gewaehlt');
340     } else {
957b51 341       // Ordner
U 342       if(/*ev.shiftKey || */ ev.ctrlKey) {
343         $(elem).children(0).addClass('datei-gewaehlt');
10d3d3 344       } else {
957b51 345         var ordner = $(elem).find('.dateiname').text();
U 346         if(pfad.length > 0) {
347           pfad = pfad + '/' + ordner;
348         } else {
349           pfad = ordner;
350         }
351         fm_get_list(pfad);
10d3d3 352       }
U 353     }   
5dfab6 354   }
c509a0 355 }
U 356
a94216 357 function fm_bc_click() {
U 358   var elem = this;
359   var bcPfad = $(elem).attr('rpath');
360   if(bcPfad !== undefined) {
c509a0 361     pfad = bcPfad;
a94216 362     fm_get_list(bcPfad);
U 363   } else {
364     pfad = '';
365     fm_get_list('');
366   }
367 }
368
42fece 369 function fm_text_edit(content, mode) {
305573 370   fm_filectls_hide();
3ad4db 371   $('.codeeditor-space').show();
U 372   $('.code-editor-container').show();
42fece 373   fm_code_edit(content, mode);  
7d8ef6 374   openEditor = 'text';
U 375 }
376
377 function fm_dok_edit(content) {
378   fm_filectls_hide();
0c1d5b 379   fm_dok_editor_init(userid);
7d8ef6 380   $("#mce-editor").show();
U 381   ed.setContent(content);
382   openEditor = 'dok';  
3ad4db 383 }
U 384
305573 385 function fm_filectls_hide() {
U 386   $('#zentrum_bc').hide();
387   $('#dateien').hide();
388 }
389
390 function fm_filectls_show() {
391   $('#zentrum_bc').show();
392   $('#dateien').show();  
393 }
b7475d 394 /* ----- API Calls ------------- */
U 395
0c1d5b 396 function fm_get_login() {
3ad4db 397   var m = '?c=de.uhilger.filecms.pub.SessionManager&m=getSessionUser';
U 398   var u = '../pub' + m;
399   fm_get(u, "text", function(resp) {
0c1d5b 400     userid = resp;
3ad4db 401     $('#userMenu').text(resp);
0c1d5b 402     //fm_dok_editor_init(resp);
7342b1 403   });  
c509a0 404 }
U 405
406 function fm_get_new_folder() {
407   $('#modal_ok').click(function() {
408     // hier speichern
409     var m = '?c=de.uhilger.filecms.api.FileMgr&m=newFolder&p=' + pfad + '&p=' + $('#dateiname').val();
410     var u = '../svc' + m;
411     fm_get(u, "json", function(resp) {
adf812 412       fm_get_list(pfad);
c509a0 413     });
U 414   });
957b51 415   $('#saveModalTitle').text('Neuer Ordner');
c509a0 416   $('#dialogfrage').text("Name?");
U 417   $('#dateiname').val('');
418   $('#dateiname').attr('placeholder', 'Ordnername');
419   $('#saveModal').modal({
420     keyboard: false,
421     show: true
422   });
7342b1 423 }
U 424
7d8ef6 425 function fm_get_file_content(typ) {
fc1897 426   var gewaehlte = $('.datei-gewaehlt');
957b51 427   //var fname = $(gewaehlte).find('.dateiname').text();
U 428   
429   var fname = $(gewaehlte[0]).text();
5ebb8e 430   openFileName = fname;
3ad4db 431   var m = '?c=de.uhilger.filecms.api.FileMgr&m=getCode&p=' + pfad + '&p=' + fname;
2121cc 432   var u = '../svc' + m;
3ad4db 433   fm_get(u, "text", function(resp) {
7d8ef6 434     if(typ == 'text') {
42fece 435       var mode = "text/x-java";
U 436       if(fname.endsWith('js')) {
437         mode = 'javascript';
438       } else if(fname.endsWith('xml')) {
439         mode = 'xml';
440       } else if(fname.endsWith('properties')) {
441         mode = 'xml';
442       }
443       fm_text_edit(resp, mode);
7d8ef6 444     } else {
U 445       fm_dok_edit(resp);
446     }
2121cc 447   });
3ad4db 448   
2121cc 449 }
U 450
fc8db1 451 function fm_view_file() {
U 452   // http://localhost:8080/file-cms/ui/#  
453   // http://localhost:8080/file-cms/data/admin/usw.
454   
455   var userid = $('#userMenu').text();
456   var gewaehlte = $('.datei-gewaehlt');
457   var fname = $(gewaehlte[0]).text();
0c1d5b 458   
U 459   var path = fm_get_path(userid);
460   
461   window.open(path + '/' + fname, '_blank');
fc8db1 462 }
U 463
7165a1 464 /*
U 465  * Hier merkt sich die Dateiverwalting die markierten Dateien fuer 
466  * eine Dateioperation. Bei cut wird in der 'paste' Operation auf dem Server 
467  * fuer die 'gemerkten' Dateien ein Move gemacht. Die Dateien werden 
468  * vom gewaehlten Ort zum Zielort verschoben.
469  * 
470  * @returns {undefined}
471  */
472 function fm_cut_files() {
473   cutCopySrcDir = pfad;
474   cutCopyFiles = fm_gewaehlte_dateien();
475   cutCopyOperation = 'cut';
476 }
477
478 /*
479  * Hier merkt sich die Dateiverwalting die markierten Dateien fuer 
480  * eine Dateioperation. Bei copy wird in der 'paste' Operation auf dem Server 
481  * fuer die 'gemerkten' Dateien eine Kopie gemacht. Die Dateien werden 
482  * am gewaehlten Ort behalten und am Zielort wird eine Kopier der 
483  * gewaehlten DAteien erstellt
484  * 
485  * @returns {undefined}
486  */
487 function fm_copy_files() {
488   cutCopySrcDir = pfad;
489   cutCopyFiles = fm_gewaehlte_dateien();
490   cutCopyOperation = 'cut';
491 }
492
493 /*
494  * Hier wird fuer eine zuvor markierte Liste von Dateien, fuer die 
495  * Cut oder Copy gewaehlt wurde, die Operations ausgefuehrt (move oder copy)
496  * @returns {undefined}
497  */
498 function fm_paste_files() {
499   var m;
500   if(cutCopyOperation = 'cut') {
501     m = '?c=de.uhilger.filecms.api.FileMgr&m=moveFiles'; //&p=' + cutCopySrcDir + '&p=' + pfad + '&p=' + encodeURIComponent(liste);
502   } else {
503     m = '?c=de.uhilger.filecms.api.FileMgr&m=copyFiles'; //&p=' + cutCopySrcDir + '&p=' + pfad + '&p=' + encodeURIComponent(liste);
fc1897 504   }
7165a1 505   var u = '../svc' + m;  
U 506   fm_post(u, {p1: cutCopySrcDir, p2: pfad, p3: encodeURIComponent(cutCopyFiles)}, function(resp) {
507     // resp evtl. zeigen..
508     fm_get_list(pfad);
509   });
510 }
511
512 function fm_del_files() {
513   var liste = fm_gewaehlte_dateien();
fc1897 514   var m = '?c=de.uhilger.filecms.api.FileMgr&m=deleteFiles&p=' + pfad + '&p=' + encodeURIComponent(liste);
U 515   var u = '../svc' + m;
516   fm_get(u, "text", function(resp) {
517     // console.log('deleteFiles gab folgendes zurueck: ' + resp);
518     fm_get_list(pfad);
519   });
520 }
521
10d3d3 522 function fm_render_list(fl) {
U 523   if(modus == 'kacheln') {
524     // Kachelansicht
7d8ef6 525     var template = $('#tpl-kacheln').html();
U 526     Mustache.parse(template);   // optional, speeds up future uses
527     $('.datei-zeile').attr('onclick','').unbind('click');
528     $('#dateien').empty();
529     $('#dateien').html(Mustache.render(template, fl));
530     $('.figure').click(fm_dateiwahl);
531   } else {
532     // Listenansicht
533     var template = $('#tpl-liste').html();
534     Mustache.parse(template);   // optional, speeds up future uses
535     $('.figure').attr('onclick','').unbind('click');
536     $('#dateien').empty();
537     $('#dateien').html(Mustache.render(template, fl));
538     $('.datei-zeile').click(fm_dateiwahl);
539   }
540   /*
541   if(modus == 'kacheln') {
542     // Kachelansicht
a3d410 543     $.get('tpl-kacheln.txt', function(template) {
U 544       $('#dateien').empty();
545       $('#dateien').html(Mustache.render(template, fl));
546       $('.figure').click(fm_dateiwahl);
547     });
10d3d3 548     $('.datei-zeile').attr('onclick','').unbind('click');
U 549   } else {
550     // Listenansicht
a3d410 551     $.get('tpl-liste.txt', function(template) {
U 552       $('#dateien').empty();
553       $('#dateien').html(Mustache.render(template, fl));
554       $('.datei-zeile').click(fm_dateiwahl);
555     });
10d3d3 556     $('.figure').attr('onclick','').unbind('click');
U 557   }
7d8ef6 558   */
10d3d3 559 }
U 560
7342b1 561 // http://localhost:8079/file-cms/svc?c=de.uhilger.filecms.api.FileMgr&f=JSONNICE&m=list&p=
a94216 562 function fm_get_list(relPfad) {
10d3d3 563   $('#ansicht').attr('onclick','').unbind('click');
a94216 564   var m = '?c=de.uhilger.filecms.api.FileMgr&m=list&p=' + relPfad;
7342b1 565   var u = '../svc' + m;
U 566   fm_get(u, "json", function(resp) {
10d3d3 567     
2121cc 568     if(resp.List[0].FileRef !== undefined) {
U 569       var files = new Array();
c509a0 570       if(resp.List[0].FileRef instanceof Array) {
U 571         for(var i = 0; i < resp.List[0].FileRef.length; i++) {
572           files.push(new FileRef(resp.List[0].FileRef[i]));
573         }
574       } else {
575         files.push(new FileRef(resp.List[0].FileRef));
2121cc 576       }
U 577       var fl = new FileList(files);
10d3d3 578       fm_render_list(fl);
2121cc 579     } else {
U 580       $('#dateien').empty();
7342b1 581     }
5dfab6 582     
10d3d3 583     // Breadcrumb-Ansicht
7d8ef6 584     var template;
a94216 585     $('.breadcrumb-item').attr('onclick','').unbind('click');
2315a0 586     $('#bcnav').empty();
5dfab6 587     var dirList = new Array();
U 588     var rp = '';
a94216 589     //console.log("'" + relPfad + "'");
U 590     var dirs = relPfad.split('/');
591     //console.log(dirs.length);
2121cc 592     dirList.push(new BcrFile(rp, 'Home'));
a94216 593     if(relPfad.length > 0) {
2315a0 594       for(var i = 0; i < dirs.length - 1; i++) {
5dfab6 595         if(rp.length > 0 ) {
U 596           dirList.push(new BcrFile(rp + '/' + dirs[i], dirs[i]));
2315a0 597           rp = rp + '/' + dirs[i];
5dfab6 598         } else {
U 599           dirList.push(new BcrFile(dirs[i], dirs[i]));
2315a0 600           rp = dirs[i];
5dfab6 601         }
U 602       }
603       var bl = new BcrFiles(dirList);
7d8ef6 604  
U 605       if(dirList.length > 0) {
606         template = $('#tpl-bcr').html();
607         Mustache.parse(template);   // optional, speeds up future uses
608         $('#bcnav').html(Mustache.render(template, bl));
2315a0 609       }
7d8ef6 610       
U 611       if(dirs.length > 0) {
612         dirList.push(new BcrFile(rp + '/' + dirs[dirs.length-1], dirs[dirs.length-1]));
613         template = $('#tpl-bcr2').html();
614         Mustache.parse(template);   // optional, speeds up future uses
615         $('#bcnav').append(Mustache.render(template, dirList[dirList.length-1]));        
616       } else {
617         template = $('#tpl-bcr2').html();
618         Mustache.parse(template);   // optional, speeds up future uses
619         $('#bcnav').append(Mustache.render(template, dirList[0]));        
620       }
621       
622       $('#bcnav').append($('#tpl-bcr3').html());
2315a0 623     } else {
a94216 624       pfad = '';
7d8ef6 625       template = $('#tpl-bcr2').html();
U 626       Mustache.parse(template);   // optional, speeds up future uses
627       $('#bcnav').append(Mustache.render(template, dirList[0]));   
628       $('#bcnav').append($('#tpl-bcr3').html());
5dfab6 629     }
7d8ef6 630     $('.breadcrumb-item').click(fm_bc_click);
U 631     $('#ansicht').click(fm_ansicht_umschalten);
632     fm_set_modus();
633   });
e5ff42 634 }
U 635
636 function fm_menu_datei_speichern() {
5ebb8e 637   //var fname = $('.datei-gewaehlt').text();
U 638   var fname = openFileName;
639   if(fname !== undefined && fname !== '') {
640     fm_save_file(fname);
641   } else {
642     fm_menu_datei_speichern_unter();
643   }
644 }
645
646 function fm_save_file(saveFileName) {
7d8ef6 647   var content;
U 648   if(openEditor === 'text') {
649     content = cm.getValue();
650   } else {
651     content = ed.getContent();
652   }
5ebb8e 653   var m = '?c=de.uhilger.filecms.api.FileMgr&m=saveTextFile';
U 654   var u = '../svc' + m;
7d8ef6 655   fm_post(u, {p1: pfad, p2: saveFileName, p3: content}, function(resp) {
5ebb8e 656     openFileName = saveFileName;
U 657   });
658 }
659
660 function fm_menu_datei_speichern_unter() {
e5ff42 661   
915927 662   $('#modal_ok').click(function() {
U 663     // hier speichern
5ebb8e 664     fm_save_file($('#dateiname').val());
U 665     /*
915927 666     var m = '?c=de.uhilger.filecms.api.FileMgr&m=saveTextFile';
U 667     var u = '../svc' + m;
2121cc 668     fm_post(u, {p1: pfad, p2: $('#dateiname').val(), p3: cm.getValue()}, function(resp) {
915927 669
U 670     });
5ebb8e 671     */
915927 672   });
957b51 673   $('#saveModalTitle').text('Datei speichern');
c509a0 674   $('#dialogfrage').text("Dateiname?");
3ad4db 675   
U 676   var fname = $('.datei-gewaehlt').text();
677   if(fname !== undefined) {
678     $('#dateiname').val(fname);
679   } else {
680     $('#dateiname').val('');
681   }
c509a0 682   $('#dateiname').attr('placeholder', 'Dateiname');
915927 683   $('#saveModal').modal({
U 684     keyboard: false,
685     show: true
686   });
a4d3b5 687 }
U 688
b7475d 689 function fm_logout() {
U 690   var m = '?c=de.uhilger.filecms.pub.SessionManager&m=expireSession';
691   var u = '../pub' + m;
692   
693   fm_get(u, "text", function(resp) {
694     $('#userMenu').text('nicht angemeldet');
695     window.location.href = '../logout.html';
696   });
697 }
698
699
a4d3b5 700 /* ---- codemirror editor handling -------- */
U 701
42fece 702 function fm_code_edit(content, m) {
a4d3b5 703   cm = CodeMirror.fromTextArea(document.getElementById("editspace"), {
U 704     lineNumbers: true,
42fece 705     mode: m,
a4d3b5 706     viewportMargin : Infinity,
U 707     extraKeys: {
915927 708         "F9": function(cm) {
U 709         cm.setOption("fullScreen", !cm.getOption("fullScreen"));
710       },
711         "Esc": function(cm) {
712         if (cm.getOption("fullScreen")) cm.setOption("fullScreen", false);
713       }
a4d3b5 714     }
U 715   });
716   cm.setValue(content);
915927 717 }
a4d3b5 718
U 719
720
721 /* -------- helper functions ----------- */
722
b7475d 723 function fm_get(u, dtype, scallback) {
a4d3b5 724   $.ajax({
U 725     url: u,
726     type: "GET",
b7475d 727     dataType: dtype,
a4d3b5 728     success: scallback,
U 729     error: function (xhr, status, errorThrown) {
730       alert("Error: " + errorThrown + " Status: " + status + " URL: " + u);
731     },
732     complete: function (xhr, status) {
733       //console.log( "The request is complete!" );
734     }
735
736   });
915927 737 }
a4d3b5 738
U 739 function fm_post(u, d, scallback) {
740   $.ajax({
741     url: u,
742     data: d,
743     type: "POST",
744     dataType: "json",
745     success: scallback,
746     error: function (xhr, status, errorThrown) {
747       $('#fehler').html("Error: " + errorThrown + " Status: " + status);
748     },
749     complete: function (xhr, status) {
750       //alert( "The request is complete!" );
751     }
752   });
915927 753 }
a4d3b5 754
e5ff42 755 function fm_serialise(obj) {
U 756   return '{"' + obj.constructor.name + '":' + JSON.stringify(obj) + '}';
915927 757 }
e5ff42 758
7342b1 759 /* ----- Objekte ----- */
U 760
761 function FileList(fl) {
762   this.files = fl;
763 }
764
765 function FileRef(obj) {
766   var self = this;
767   this.fr = obj;
768   
769   this.typeClass = function() {
10d3d3 770     if(modus == 'kacheln') {
U 771       if(self.fr.isDirectory) {
a3d410 772         return 'fa-folder ordner';
10d3d3 773       } else {
a3d410 774         return 'fa-file datei';
10d3d3 775       }
7342b1 776     } else {
10d3d3 777       if(self.fr.isDirectory) {
a3d410 778         return 'fa-folder ordner';
10d3d3 779       } else {
a3d410 780         return 'fa-file-o datei';
10d3d3 781       }
7342b1 782     }
2121cc 783   };
U 784   
785   this.fileName = function() {
786     var namen = self.fr.absolutePath.split('/');
787     if(namen.length > 0) {
788       return namen[namen.length - 1];
789     } else {
790       return self.fr.absolutePath;
791     }
792   };
7342b1 793 }
5dfab6 794
U 795 function BcrFiles(fl) {
796   this.files = fl;
797 }
798
799 function BcrFile(rp, n) {
800   this.relPath = rp;
801   this.fName = n;
7aa566 802 }
U 803