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