Dateiverwaltung für die WebBox
Ulrich
2017-02-28 7165a1b26382ed73d4f29a227b6a93217d714b49
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() {
197   alert('fm_menu_cut');
198 }
199 function fm_menu_copy() {
200   alert('fm_menu_copy');
201 }
202 function fm_menu_paste() {
203   alert('fm_menu_paste');
204 }
fc1897 205 function fm_menu_delete() {
U 206   $('#confirmOk').click(function() {
207     fm_del_files();
208   });
957b51 209   $('#confirmModalTitle').text("Löschen");
U 210   $('#confirmModalBody').text("Wirklich löschen?");
fc1897 211   $('#confirmModal').modal({
U 212     keyboard: false,
213     show: true
214   });
215 }
7165a1 216
U 217 /*
218  * Gewaehlte Dateien feststellen
219  * 
220  * @returns {String} eine per JSON.stringify schon vorbereitete List zum 
221  * Absenden als Parameter an den Server
222  */
223 function fm_gewaehlte_dateien() {
224   var gewaehlte = $('.datei-gewaehlt');
225   //console.log('anzahl: ' + gewaehlte.length);
226   var fnames = new Array();
227   var i = 0;
228   while(i < gewaehlte.length) {
229     var str = { "java.lang.String": $(gewaehlte[i]).text()};
230     fnames.push(str);
231     //console.log('loeschen ' + pfad + ' ' + $(gewaehlte[i]).text());
232     //i += 2;
233     i++;
234   }
235   var liste = '{"List":' + JSON.stringify(fnames) + '}';
236   // 'liste' enthaelt:
237   // {"List":[{"java.lang.String":"test3.txt"},{"java.lang.String":"Test1.txt"},{"java.lang.String":"Test2.txt"}]}
238   // und wird auf dem Server zu einer List[ArrayList<String>] bei der jede ArrayList<String> nur ein Element hat 
239   return liste;
240 }
241 /* --------- Dateifunktionen Ende ---------- */
fc1897 242
bef5c6 243 function fm_menu_test() {
U 244   var w = $('.ost').width();
245   if(w == 0) {
246     $('.ost').width('20%');
247     $('.ost').text('Hallo Welt!');
248   } else {
249     $('.ost').empty();
250     $('.ost').width(0);
251   }
252 }
253
10d3d3 254 function fm_ansicht_umschalten() {
U 255   if($('#ansicht').children(0).hasClass('fa-th-list')) {
256     $('#ansicht').children(0).addClass('fa-th-large');
257     $('#ansicht').children(0).removeClass('fa-th-list');
258     modus = 'liste';
259   } else {
260     $('#ansicht').children(0).addClass('fa-th-list');    
261     $('#ansicht').children(0).removeClass('fa-th-large');
262     modus = 'kacheln';
263   }
264   fm_get_list(pfad);
265 }
266
267 function fm_set_modus() {
268   if(modus == 'kacheln') {
269     $('#ansicht').children(0).addClass('fa-th-list');    
270     $('#ansicht').children(0).removeClass('fa-th-large');  
271   } else {
272     $('#ansicht').children(0).addClass('fa-th-large');
273     $('#ansicht').children(0).removeClass('fa-th-list');    
274   }
a4d3b5 275 }
U 276
277 function fm_menu_neue_textdatei() {
adf812 278   fm_text_edit('Neue Datei');
a4d3b5 279 }
U 280
305573 281 function fm_menu_neues_dokument() {
7d8ef6 282   fm_dok_edit('');
305573 283 }
U 284
a4d3b5 285 function fm_menu_datei_schliessen() {
U 286   $('.codeeditor-space').hide();
287   $('.code-editor-container').hide();
305573 288   $("#mce-editor").hide();
U 289   if(cm !== undefined) {
290     cm.toTextArea();
291   }
5ebb8e 292   openFileName = '';
7d8ef6 293   openEditor = '';
adf812 294   fm_get_list(pfad);
305573 295   fm_filectls_show();
e5ff42 296 }
U 297
17919c 298 function fm_dateiwahl(ev) {
5dfab6 299   var elem = this;
17919c 300   //console.log('dateiwahl nach click, event shift: ' + ev.shiftKey + ", event ctrl: " + ev.ctrlKey);
10d3d3 301   if(modus == 'kacheln') {
957b51 302     // Kacheln
10d3d3 303     if($(elem).children(0).hasClass('fa-folder')) {
957b51 304       if(/*ev.shiftKey || */ ev.ctrlKey) {
U 305         $(elem).find('.dateiname').addClass('datei-gewaehlt');
10d3d3 306       } else {
957b51 307         var ordner = $(elem).text().trim();
U 308         if(pfad.length > 0) {
309           pfad = pfad + '/' + ordner;
310         } else {
311           pfad = ordner;
312         }
313         fm_get_list(pfad);
10d3d3 314       }
U 315     } else if($(elem).children(0).hasClass('fa-file')) {
17919c 316       if(/*ev.shiftKey || */ ev.ctrlKey) {
U 317         // mehrere Dateien sollen gewaehlt werden
318       } else {
319         $('.datei-gewaehlt').removeClass('datei-gewaehlt');        
320       }
957b51 321       $(elem).find('.dateiname').addClass('datei-gewaehlt');
5dfab6 322     } else {
10d3d3 323       //console.log('kein folder oder file...');
5dfab6 324     }
U 325   } else {
957b51 326     // Liste
10d3d3 327     if($(elem).find('.datei-elem').children(0).hasClass('fa-file-o')) {
957b51 328       // Datei
17919c 329       if(/*ev.shiftKey || */ ev.ctrlKey) {
U 330         // mehrere Dateien sollen gewaehlt werden
331       } else {
332         $('.table-info').removeClass('table-info');
957b51 333         $('.datei-gewaehlt').removeClass('datei-gewaehlt');
17919c 334       }
10d3d3 335       $(elem).addClass('table-info');
U 336       $(elem).find('.dateiname').addClass('datei-gewaehlt');
337     } else {
957b51 338       // Ordner
U 339       if(/*ev.shiftKey || */ ev.ctrlKey) {
340         $(elem).children(0).addClass('datei-gewaehlt');
10d3d3 341       } else {
957b51 342         var ordner = $(elem).find('.dateiname').text();
U 343         if(pfad.length > 0) {
344           pfad = pfad + '/' + ordner;
345         } else {
346           pfad = ordner;
347         }
348         fm_get_list(pfad);
10d3d3 349       }
U 350     }   
5dfab6 351   }
c509a0 352 }
U 353
a94216 354 function fm_bc_click() {
U 355   var elem = this;
356   var bcPfad = $(elem).attr('rpath');
357   if(bcPfad !== undefined) {
c509a0 358     pfad = bcPfad;
a94216 359     fm_get_list(bcPfad);
U 360   } else {
361     pfad = '';
362     fm_get_list('');
363   }
364 }
365
42fece 366 function fm_text_edit(content, mode) {
305573 367   fm_filectls_hide();
3ad4db 368   $('.codeeditor-space').show();
U 369   $('.code-editor-container').show();
42fece 370   fm_code_edit(content, mode);  
7d8ef6 371   openEditor = 'text';
U 372 }
373
374 function fm_dok_edit(content) {
375   fm_filectls_hide();
0c1d5b 376   fm_dok_editor_init(userid);
7d8ef6 377   $("#mce-editor").show();
U 378   ed.setContent(content);
379   openEditor = 'dok';  
3ad4db 380 }
U 381
305573 382 function fm_filectls_hide() {
U 383   $('#zentrum_bc').hide();
384   $('#dateien').hide();
385 }
386
387 function fm_filectls_show() {
388   $('#zentrum_bc').show();
389   $('#dateien').show();  
390 }
b7475d 391 /* ----- API Calls ------------- */
U 392
0c1d5b 393 function fm_get_login() {
3ad4db 394   var m = '?c=de.uhilger.filecms.pub.SessionManager&m=getSessionUser';
U 395   var u = '../pub' + m;
396   fm_get(u, "text", function(resp) {
0c1d5b 397     userid = resp;
3ad4db 398     $('#userMenu').text(resp);
0c1d5b 399     //fm_dok_editor_init(resp);
7342b1 400   });  
c509a0 401 }
U 402
403 function fm_get_new_folder() {
404   $('#modal_ok').click(function() {
405     // hier speichern
406     var m = '?c=de.uhilger.filecms.api.FileMgr&m=newFolder&p=' + pfad + '&p=' + $('#dateiname').val();
407     var u = '../svc' + m;
408     fm_get(u, "json", function(resp) {
adf812 409       fm_get_list(pfad);
c509a0 410     });
U 411   });
957b51 412   $('#saveModalTitle').text('Neuer Ordner');
c509a0 413   $('#dialogfrage').text("Name?");
U 414   $('#dateiname').val('');
415   $('#dateiname').attr('placeholder', 'Ordnername');
416   $('#saveModal').modal({
417     keyboard: false,
418     show: true
419   });
7342b1 420 }
U 421
7d8ef6 422 function fm_get_file_content(typ) {
fc1897 423   var gewaehlte = $('.datei-gewaehlt');
957b51 424   //var fname = $(gewaehlte).find('.dateiname').text();
U 425   
426   var fname = $(gewaehlte[0]).text();
5ebb8e 427   openFileName = fname;
3ad4db 428   var m = '?c=de.uhilger.filecms.api.FileMgr&m=getCode&p=' + pfad + '&p=' + fname;
2121cc 429   var u = '../svc' + m;
3ad4db 430   fm_get(u, "text", function(resp) {
7d8ef6 431     if(typ == 'text') {
42fece 432       var mode = "text/x-java";
U 433       if(fname.endsWith('js')) {
434         mode = 'javascript';
435       } else if(fname.endsWith('xml')) {
436         mode = 'xml';
437       } else if(fname.endsWith('properties')) {
438         mode = 'xml';
439       }
440       fm_text_edit(resp, mode);
7d8ef6 441     } else {
U 442       fm_dok_edit(resp);
443     }
2121cc 444   });
3ad4db 445   
2121cc 446 }
U 447
fc8db1 448 function fm_view_file() {
U 449   // http://localhost:8080/file-cms/ui/#  
450   // http://localhost:8080/file-cms/data/admin/usw.
451   
452   var userid = $('#userMenu').text();
453   var gewaehlte = $('.datei-gewaehlt');
454   var fname = $(gewaehlte[0]).text();
0c1d5b 455   
U 456   var path = fm_get_path(userid);
457   
458   window.open(path + '/' + fname, '_blank');
fc8db1 459 }
U 460
7165a1 461 /*
U 462  * Hier merkt sich die Dateiverwalting die markierten Dateien fuer 
463  * eine Dateioperation. Bei cut wird in der 'paste' Operation auf dem Server 
464  * fuer die 'gemerkten' Dateien ein Move gemacht. Die Dateien werden 
465  * vom gewaehlten Ort zum Zielort verschoben.
466  * 
467  * @returns {undefined}
468  */
469 function fm_cut_files() {
470   cutCopySrcDir = pfad;
471   cutCopyFiles = fm_gewaehlte_dateien();
472   cutCopyOperation = 'cut';
473 }
474
475 /*
476  * Hier merkt sich die Dateiverwalting die markierten Dateien fuer 
477  * eine Dateioperation. Bei copy wird in der 'paste' Operation auf dem Server 
478  * fuer die 'gemerkten' Dateien eine Kopie gemacht. Die Dateien werden 
479  * am gewaehlten Ort behalten und am Zielort wird eine Kopier der 
480  * gewaehlten DAteien erstellt
481  * 
482  * @returns {undefined}
483  */
484 function fm_copy_files() {
485   cutCopySrcDir = pfad;
486   cutCopyFiles = fm_gewaehlte_dateien();
487   cutCopyOperation = 'cut';
488 }
489
490 /*
491  * Hier wird fuer eine zuvor markierte Liste von Dateien, fuer die 
492  * Cut oder Copy gewaehlt wurde, die Operations ausgefuehrt (move oder copy)
493  * @returns {undefined}
494  */
495 function fm_paste_files() {
496   var m;
497   if(cutCopyOperation = 'cut') {
498     m = '?c=de.uhilger.filecms.api.FileMgr&m=moveFiles'; //&p=' + cutCopySrcDir + '&p=' + pfad + '&p=' + encodeURIComponent(liste);
499   } else {
500     m = '?c=de.uhilger.filecms.api.FileMgr&m=copyFiles'; //&p=' + cutCopySrcDir + '&p=' + pfad + '&p=' + encodeURIComponent(liste);
fc1897 501   }
7165a1 502   var u = '../svc' + m;  
U 503   fm_post(u, {p1: cutCopySrcDir, p2: pfad, p3: encodeURIComponent(cutCopyFiles)}, function(resp) {
504     // resp evtl. zeigen..
505     fm_get_list(pfad);
506   });
507 }
508
509 function fm_del_files() {
510   var liste = fm_gewaehlte_dateien();
fc1897 511   var m = '?c=de.uhilger.filecms.api.FileMgr&m=deleteFiles&p=' + pfad + '&p=' + encodeURIComponent(liste);
U 512   var u = '../svc' + m;
513   fm_get(u, "text", function(resp) {
514     // console.log('deleteFiles gab folgendes zurueck: ' + resp);
515     fm_get_list(pfad);
516   });
517 }
518
10d3d3 519 function fm_render_list(fl) {
U 520   if(modus == 'kacheln') {
521     // Kachelansicht
7d8ef6 522     var template = $('#tpl-kacheln').html();
U 523     Mustache.parse(template);   // optional, speeds up future uses
524     $('.datei-zeile').attr('onclick','').unbind('click');
525     $('#dateien').empty();
526     $('#dateien').html(Mustache.render(template, fl));
527     $('.figure').click(fm_dateiwahl);
528   } else {
529     // Listenansicht
530     var template = $('#tpl-liste').html();
531     Mustache.parse(template);   // optional, speeds up future uses
532     $('.figure').attr('onclick','').unbind('click');
533     $('#dateien').empty();
534     $('#dateien').html(Mustache.render(template, fl));
535     $('.datei-zeile').click(fm_dateiwahl);
536   }
537   /*
538   if(modus == 'kacheln') {
539     // Kachelansicht
a3d410 540     $.get('tpl-kacheln.txt', function(template) {
U 541       $('#dateien').empty();
542       $('#dateien').html(Mustache.render(template, fl));
543       $('.figure').click(fm_dateiwahl);
544     });
10d3d3 545     $('.datei-zeile').attr('onclick','').unbind('click');
U 546   } else {
547     // Listenansicht
a3d410 548     $.get('tpl-liste.txt', function(template) {
U 549       $('#dateien').empty();
550       $('#dateien').html(Mustache.render(template, fl));
551       $('.datei-zeile').click(fm_dateiwahl);
552     });
10d3d3 553     $('.figure').attr('onclick','').unbind('click');
U 554   }
7d8ef6 555   */
10d3d3 556 }
U 557
7342b1 558 // http://localhost:8079/file-cms/svc?c=de.uhilger.filecms.api.FileMgr&f=JSONNICE&m=list&p=
a94216 559 function fm_get_list(relPfad) {
10d3d3 560   $('#ansicht').attr('onclick','').unbind('click');
a94216 561   var m = '?c=de.uhilger.filecms.api.FileMgr&m=list&p=' + relPfad;
7342b1 562   var u = '../svc' + m;
U 563   fm_get(u, "json", function(resp) {
10d3d3 564     
2121cc 565     if(resp.List[0].FileRef !== undefined) {
U 566       var files = new Array();
c509a0 567       if(resp.List[0].FileRef instanceof Array) {
U 568         for(var i = 0; i < resp.List[0].FileRef.length; i++) {
569           files.push(new FileRef(resp.List[0].FileRef[i]));
570         }
571       } else {
572         files.push(new FileRef(resp.List[0].FileRef));
2121cc 573       }
U 574       var fl = new FileList(files);
10d3d3 575       fm_render_list(fl);
2121cc 576     } else {
U 577       $('#dateien').empty();
7342b1 578     }
5dfab6 579     
10d3d3 580     // Breadcrumb-Ansicht
7d8ef6 581     var template;
a94216 582     $('.breadcrumb-item').attr('onclick','').unbind('click');
2315a0 583     $('#bcnav').empty();
5dfab6 584     var dirList = new Array();
U 585     var rp = '';
a94216 586     //console.log("'" + relPfad + "'");
U 587     var dirs = relPfad.split('/');
588     //console.log(dirs.length);
2121cc 589     dirList.push(new BcrFile(rp, 'Home'));
a94216 590     if(relPfad.length > 0) {
2315a0 591       for(var i = 0; i < dirs.length - 1; i++) {
5dfab6 592         if(rp.length > 0 ) {
U 593           dirList.push(new BcrFile(rp + '/' + dirs[i], dirs[i]));
2315a0 594           rp = rp + '/' + dirs[i];
5dfab6 595         } else {
U 596           dirList.push(new BcrFile(dirs[i], dirs[i]));
2315a0 597           rp = dirs[i];
5dfab6 598         }
U 599       }
600       var bl = new BcrFiles(dirList);
7d8ef6 601  
U 602       if(dirList.length > 0) {
603         template = $('#tpl-bcr').html();
604         Mustache.parse(template);   // optional, speeds up future uses
605         $('#bcnav').html(Mustache.render(template, bl));
2315a0 606       }
7d8ef6 607       
U 608       if(dirs.length > 0) {
609         dirList.push(new BcrFile(rp + '/' + dirs[dirs.length-1], dirs[dirs.length-1]));
610         template = $('#tpl-bcr2').html();
611         Mustache.parse(template);   // optional, speeds up future uses
612         $('#bcnav').append(Mustache.render(template, dirList[dirList.length-1]));        
613       } else {
614         template = $('#tpl-bcr2').html();
615         Mustache.parse(template);   // optional, speeds up future uses
616         $('#bcnav').append(Mustache.render(template, dirList[0]));        
617       }
618       
619       $('#bcnav').append($('#tpl-bcr3').html());
2315a0 620     } else {
a94216 621       pfad = '';
7d8ef6 622       template = $('#tpl-bcr2').html();
U 623       Mustache.parse(template);   // optional, speeds up future uses
624       $('#bcnav').append(Mustache.render(template, dirList[0]));   
625       $('#bcnav').append($('#tpl-bcr3').html());
5dfab6 626     }
7d8ef6 627     $('.breadcrumb-item').click(fm_bc_click);
U 628     $('#ansicht').click(fm_ansicht_umschalten);
629     fm_set_modus();
630   });
e5ff42 631 }
U 632
633 function fm_menu_datei_speichern() {
5ebb8e 634   //var fname = $('.datei-gewaehlt').text();
U 635   var fname = openFileName;
636   if(fname !== undefined && fname !== '') {
637     fm_save_file(fname);
638   } else {
639     fm_menu_datei_speichern_unter();
640   }
641 }
642
643 function fm_save_file(saveFileName) {
7d8ef6 644   var content;
U 645   if(openEditor === 'text') {
646     content = cm.getValue();
647   } else {
648     content = ed.getContent();
649   }
5ebb8e 650   var m = '?c=de.uhilger.filecms.api.FileMgr&m=saveTextFile';
U 651   var u = '../svc' + m;
7d8ef6 652   fm_post(u, {p1: pfad, p2: saveFileName, p3: content}, function(resp) {
5ebb8e 653     openFileName = saveFileName;
U 654   });
655 }
656
657 function fm_menu_datei_speichern_unter() {
e5ff42 658   
915927 659   $('#modal_ok').click(function() {
U 660     // hier speichern
5ebb8e 661     fm_save_file($('#dateiname').val());
U 662     /*
915927 663     var m = '?c=de.uhilger.filecms.api.FileMgr&m=saveTextFile';
U 664     var u = '../svc' + m;
2121cc 665     fm_post(u, {p1: pfad, p2: $('#dateiname').val(), p3: cm.getValue()}, function(resp) {
915927 666
U 667     });
5ebb8e 668     */
915927 669   });
957b51 670   $('#saveModalTitle').text('Datei speichern');
c509a0 671   $('#dialogfrage').text("Dateiname?");
3ad4db 672   
U 673   var fname = $('.datei-gewaehlt').text();
674   if(fname !== undefined) {
675     $('#dateiname').val(fname);
676   } else {
677     $('#dateiname').val('');
678   }
c509a0 679   $('#dateiname').attr('placeholder', 'Dateiname');
915927 680   $('#saveModal').modal({
U 681     keyboard: false,
682     show: true
683   });
a4d3b5 684 }
U 685
b7475d 686 function fm_logout() {
U 687   var m = '?c=de.uhilger.filecms.pub.SessionManager&m=expireSession';
688   var u = '../pub' + m;
689   
690   fm_get(u, "text", function(resp) {
691     $('#userMenu').text('nicht angemeldet');
692     window.location.href = '../logout.html';
693   });
694 }
695
696
a4d3b5 697 /* ---- codemirror editor handling -------- */
U 698
42fece 699 function fm_code_edit(content, m) {
a4d3b5 700   cm = CodeMirror.fromTextArea(document.getElementById("editspace"), {
U 701     lineNumbers: true,
42fece 702     mode: m,
a4d3b5 703     viewportMargin : Infinity,
U 704     extraKeys: {
915927 705         "F9": function(cm) {
U 706         cm.setOption("fullScreen", !cm.getOption("fullScreen"));
707       },
708         "Esc": function(cm) {
709         if (cm.getOption("fullScreen")) cm.setOption("fullScreen", false);
710       }
a4d3b5 711     }
U 712   });
713   cm.setValue(content);
915927 714 }
a4d3b5 715
U 716
717
718 /* -------- helper functions ----------- */
719
b7475d 720 function fm_get(u, dtype, scallback) {
a4d3b5 721   $.ajax({
U 722     url: u,
723     type: "GET",
b7475d 724     dataType: dtype,
a4d3b5 725     success: scallback,
U 726     error: function (xhr, status, errorThrown) {
727       alert("Error: " + errorThrown + " Status: " + status + " URL: " + u);
728     },
729     complete: function (xhr, status) {
730       //console.log( "The request is complete!" );
731     }
732
733   });
915927 734 }
a4d3b5 735
U 736 function fm_post(u, d, scallback) {
737   $.ajax({
738     url: u,
739     data: d,
740     type: "POST",
741     dataType: "json",
742     success: scallback,
743     error: function (xhr, status, errorThrown) {
744       $('#fehler').html("Error: " + errorThrown + " Status: " + status);
745     },
746     complete: function (xhr, status) {
747       //alert( "The request is complete!" );
748     }
749   });
915927 750 }
a4d3b5 751
e5ff42 752 function fm_serialise(obj) {
U 753   return '{"' + obj.constructor.name + '":' + JSON.stringify(obj) + '}';
915927 754 }
e5ff42 755
7342b1 756 /* ----- Objekte ----- */
U 757
758 function FileList(fl) {
759   this.files = fl;
760 }
761
762 function FileRef(obj) {
763   var self = this;
764   this.fr = obj;
765   
766   this.typeClass = function() {
10d3d3 767     if(modus == 'kacheln') {
U 768       if(self.fr.isDirectory) {
a3d410 769         return 'fa-folder ordner';
10d3d3 770       } else {
a3d410 771         return 'fa-file datei';
10d3d3 772       }
7342b1 773     } else {
10d3d3 774       if(self.fr.isDirectory) {
a3d410 775         return 'fa-folder ordner';
10d3d3 776       } else {
a3d410 777         return 'fa-file-o datei';
10d3d3 778       }
7342b1 779     }
2121cc 780   };
U 781   
782   this.fileName = function() {
783     var namen = self.fr.absolutePath.split('/');
784     if(namen.length > 0) {
785       return namen[namen.length - 1];
786     } else {
787       return self.fr.absolutePath;
788     }
789   };
7342b1 790 }
5dfab6 791
U 792 function BcrFiles(fl) {
793   this.files = fl;
794 }
795
796 function BcrFile(rp, n) {
797   this.relPath = rp;
798   this.fName = n;
7aa566 799 }
U 800