Dateiverwaltung für die WebBox
Ulrich
2017-02-28 9e296453bf0b7ee35e2ed3c992198584bf2f2c0a
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();
9e2964 490   cutCopyOperation = 'copy';
7165a1 491 }
U 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;
9e2964 500   if(cutCopyOperation === 'cut') {
U 501     //m = '?c=de.uhilger.filecms.api.FileMgr&m=moveFiles'; //&p=' + cutCopySrcDir + '&p=' + pfad + '&p=' + encodeURIComponent(liste);
502     m = '?c=de.uhilger.filecms.api.FileMgr&m=moveFiles&p=' + cutCopySrcDir + '&p=' + pfad + '&p=' + encodeURIComponent(cutCopyFiles);
7165a1 503   } else {
9e2964 504     //m = '?c=de.uhilger.filecms.api.FileMgr&m=copyFiles'; //&p=' + cutCopySrcDir + '&p=' + pfad + '&p=' + encodeURIComponent(liste);
U 505     m = '?c=de.uhilger.filecms.api.FileMgr&m=copyFiles&p=' + cutCopySrcDir + '&p=' + pfad + '&p=' + encodeURIComponent(cutCopyFiles);
fc1897 506   }
7165a1 507   var u = '../svc' + m;  
9e2964 508   fm_get(u, "text", function(resp) {
U 509     // console.log('deleteFiles gab folgendes zurueck: ' + resp);
510     fm_get_list(pfad);
511   });
512   /*
513   fm_post(u, {p1: encodeURIComponent(cutCopySrcDir), p2: encodeURIComponent(pfad), p3: encodeURIComponent(cutCopyFiles)},'text', function(resp) {
7165a1 514     // resp evtl. zeigen..
U 515     fm_get_list(pfad);
516   });
9e2964 517   */
7165a1 518 }
U 519
520 function fm_del_files() {
521   var liste = fm_gewaehlte_dateien();
fc1897 522   var m = '?c=de.uhilger.filecms.api.FileMgr&m=deleteFiles&p=' + pfad + '&p=' + encodeURIComponent(liste);
U 523   var u = '../svc' + m;
524   fm_get(u, "text", function(resp) {
525     // console.log('deleteFiles gab folgendes zurueck: ' + resp);
526     fm_get_list(pfad);
527   });
528 }
529
10d3d3 530 function fm_render_list(fl) {
U 531   if(modus == 'kacheln') {
532     // Kachelansicht
7d8ef6 533     var template = $('#tpl-kacheln').html();
U 534     Mustache.parse(template);   // optional, speeds up future uses
535     $('.datei-zeile').attr('onclick','').unbind('click');
536     $('#dateien').empty();
537     $('#dateien').html(Mustache.render(template, fl));
538     $('.figure').click(fm_dateiwahl);
539   } else {
540     // Listenansicht
541     var template = $('#tpl-liste').html();
542     Mustache.parse(template);   // optional, speeds up future uses
543     $('.figure').attr('onclick','').unbind('click');
544     $('#dateien').empty();
545     $('#dateien').html(Mustache.render(template, fl));
546     $('.datei-zeile').click(fm_dateiwahl);
547   }
548   /*
549   if(modus == 'kacheln') {
550     // Kachelansicht
a3d410 551     $.get('tpl-kacheln.txt', function(template) {
U 552       $('#dateien').empty();
553       $('#dateien').html(Mustache.render(template, fl));
554       $('.figure').click(fm_dateiwahl);
555     });
10d3d3 556     $('.datei-zeile').attr('onclick','').unbind('click');
U 557   } else {
558     // Listenansicht
a3d410 559     $.get('tpl-liste.txt', function(template) {
U 560       $('#dateien').empty();
561       $('#dateien').html(Mustache.render(template, fl));
562       $('.datei-zeile').click(fm_dateiwahl);
563     });
10d3d3 564     $('.figure').attr('onclick','').unbind('click');
U 565   }
7d8ef6 566   */
10d3d3 567 }
U 568
7342b1 569 // http://localhost:8079/file-cms/svc?c=de.uhilger.filecms.api.FileMgr&f=JSONNICE&m=list&p=
a94216 570 function fm_get_list(relPfad) {
10d3d3 571   $('#ansicht').attr('onclick','').unbind('click');
a94216 572   var m = '?c=de.uhilger.filecms.api.FileMgr&m=list&p=' + relPfad;
7342b1 573   var u = '../svc' + m;
U 574   fm_get(u, "json", function(resp) {
10d3d3 575     
2121cc 576     if(resp.List[0].FileRef !== undefined) {
U 577       var files = new Array();
c509a0 578       if(resp.List[0].FileRef instanceof Array) {
U 579         for(var i = 0; i < resp.List[0].FileRef.length; i++) {
580           files.push(new FileRef(resp.List[0].FileRef[i]));
581         }
582       } else {
583         files.push(new FileRef(resp.List[0].FileRef));
2121cc 584       }
U 585       var fl = new FileList(files);
10d3d3 586       fm_render_list(fl);
2121cc 587     } else {
U 588       $('#dateien').empty();
7342b1 589     }
5dfab6 590     
10d3d3 591     // Breadcrumb-Ansicht
7d8ef6 592     var template;
a94216 593     $('.breadcrumb-item').attr('onclick','').unbind('click');
2315a0 594     $('#bcnav').empty();
5dfab6 595     var dirList = new Array();
U 596     var rp = '';
a94216 597     //console.log("'" + relPfad + "'");
U 598     var dirs = relPfad.split('/');
599     //console.log(dirs.length);
2121cc 600     dirList.push(new BcrFile(rp, 'Home'));
a94216 601     if(relPfad.length > 0) {
2315a0 602       for(var i = 0; i < dirs.length - 1; i++) {
5dfab6 603         if(rp.length > 0 ) {
U 604           dirList.push(new BcrFile(rp + '/' + dirs[i], dirs[i]));
2315a0 605           rp = rp + '/' + dirs[i];
5dfab6 606         } else {
U 607           dirList.push(new BcrFile(dirs[i], dirs[i]));
2315a0 608           rp = dirs[i];
5dfab6 609         }
U 610       }
611       var bl = new BcrFiles(dirList);
7d8ef6 612  
U 613       if(dirList.length > 0) {
614         template = $('#tpl-bcr').html();
615         Mustache.parse(template);   // optional, speeds up future uses
616         $('#bcnav').html(Mustache.render(template, bl));
2315a0 617       }
7d8ef6 618       
U 619       if(dirs.length > 0) {
620         dirList.push(new BcrFile(rp + '/' + dirs[dirs.length-1], dirs[dirs.length-1]));
621         template = $('#tpl-bcr2').html();
622         Mustache.parse(template);   // optional, speeds up future uses
623         $('#bcnav').append(Mustache.render(template, dirList[dirList.length-1]));        
624       } else {
625         template = $('#tpl-bcr2').html();
626         Mustache.parse(template);   // optional, speeds up future uses
627         $('#bcnav').append(Mustache.render(template, dirList[0]));        
628       }
629       
630       $('#bcnav').append($('#tpl-bcr3').html());
2315a0 631     } else {
a94216 632       pfad = '';
7d8ef6 633       template = $('#tpl-bcr2').html();
U 634       Mustache.parse(template);   // optional, speeds up future uses
635       $('#bcnav').append(Mustache.render(template, dirList[0]));   
636       $('#bcnav').append($('#tpl-bcr3').html());
5dfab6 637     }
7d8ef6 638     $('.breadcrumb-item').click(fm_bc_click);
U 639     $('#ansicht').click(fm_ansicht_umschalten);
640     fm_set_modus();
641   });
e5ff42 642 }
U 643
644 function fm_menu_datei_speichern() {
5ebb8e 645   //var fname = $('.datei-gewaehlt').text();
U 646   var fname = openFileName;
647   if(fname !== undefined && fname !== '') {
648     fm_save_file(fname);
649   } else {
650     fm_menu_datei_speichern_unter();
651   }
652 }
653
654 function fm_save_file(saveFileName) {
7d8ef6 655   var content;
U 656   if(openEditor === 'text') {
657     content = cm.getValue();
658   } else {
659     content = ed.getContent();
660   }
5ebb8e 661   var m = '?c=de.uhilger.filecms.api.FileMgr&m=saveTextFile';
U 662   var u = '../svc' + m;
7d8ef6 663   fm_post(u, {p1: pfad, p2: saveFileName, p3: content}, function(resp) {
5ebb8e 664     openFileName = saveFileName;
U 665   });
666 }
667
668 function fm_menu_datei_speichern_unter() {
e5ff42 669   
915927 670   $('#modal_ok').click(function() {
U 671     // hier speichern
5ebb8e 672     fm_save_file($('#dateiname').val());
U 673     /*
915927 674     var m = '?c=de.uhilger.filecms.api.FileMgr&m=saveTextFile';
U 675     var u = '../svc' + m;
2121cc 676     fm_post(u, {p1: pfad, p2: $('#dateiname').val(), p3: cm.getValue()}, function(resp) {
915927 677
U 678     });
5ebb8e 679     */
915927 680   });
957b51 681   $('#saveModalTitle').text('Datei speichern');
c509a0 682   $('#dialogfrage').text("Dateiname?");
3ad4db 683   
U 684   var fname = $('.datei-gewaehlt').text();
685   if(fname !== undefined) {
686     $('#dateiname').val(fname);
687   } else {
688     $('#dateiname').val('');
689   }
c509a0 690   $('#dateiname').attr('placeholder', 'Dateiname');
915927 691   $('#saveModal').modal({
U 692     keyboard: false,
693     show: true
694   });
a4d3b5 695 }
U 696
b7475d 697 function fm_logout() {
U 698   var m = '?c=de.uhilger.filecms.pub.SessionManager&m=expireSession';
699   var u = '../pub' + m;
700   
701   fm_get(u, "text", function(resp) {
702     $('#userMenu').text('nicht angemeldet');
703     window.location.href = '../logout.html';
704   });
705 }
706
707
a4d3b5 708 /* ---- codemirror editor handling -------- */
U 709
42fece 710 function fm_code_edit(content, m) {
a4d3b5 711   cm = CodeMirror.fromTextArea(document.getElementById("editspace"), {
U 712     lineNumbers: true,
42fece 713     mode: m,
a4d3b5 714     viewportMargin : Infinity,
U 715     extraKeys: {
915927 716         "F9": function(cm) {
U 717         cm.setOption("fullScreen", !cm.getOption("fullScreen"));
718       },
719         "Esc": function(cm) {
720         if (cm.getOption("fullScreen")) cm.setOption("fullScreen", false);
721       }
a4d3b5 722     }
U 723   });
724   cm.setValue(content);
915927 725 }
a4d3b5 726
U 727
728
729 /* -------- helper functions ----------- */
730
b7475d 731 function fm_get(u, dtype, scallback) {
a4d3b5 732   $.ajax({
U 733     url: u,
734     type: "GET",
b7475d 735     dataType: dtype,
a4d3b5 736     success: scallback,
U 737     error: function (xhr, status, errorThrown) {
738       alert("Error: " + errorThrown + " Status: " + status + " URL: " + u);
739     },
740     complete: function (xhr, status) {
741       //console.log( "The request is complete!" );
742     }
743
744   });
915927 745 }
a4d3b5 746
9e2964 747 function fm_post(u, d, dtype, scallback) {
a4d3b5 748   $.ajax({
U 749     url: u,
750     data: d,
751     type: "POST",
9e2964 752     dataType: dtype,
a4d3b5 753     success: scallback,
U 754     error: function (xhr, status, errorThrown) {
755       $('#fehler').html("Error: " + errorThrown + " Status: " + status);
756     },
757     complete: function (xhr, status) {
758       //alert( "The request is complete!" );
759     }
760   });
915927 761 }
a4d3b5 762
e5ff42 763 function fm_serialise(obj) {
U 764   return '{"' + obj.constructor.name + '":' + JSON.stringify(obj) + '}';
915927 765 }
e5ff42 766
7342b1 767 /* ----- Objekte ----- */
U 768
769 function FileList(fl) {
770   this.files = fl;
771 }
772
773 function FileRef(obj) {
774   var self = this;
775   this.fr = obj;
776   
777   this.typeClass = function() {
10d3d3 778     if(modus == 'kacheln') {
U 779       if(self.fr.isDirectory) {
a3d410 780         return 'fa-folder ordner';
10d3d3 781       } else {
a3d410 782         return 'fa-file datei';
10d3d3 783       }
7342b1 784     } else {
10d3d3 785       if(self.fr.isDirectory) {
a3d410 786         return 'fa-folder ordner';
10d3d3 787       } else {
a3d410 788         return 'fa-file-o datei';
10d3d3 789       }
7342b1 790     }
2121cc 791   };
U 792   
793   this.fileName = function() {
794     var namen = self.fr.absolutePath.split('/');
795     if(namen.length > 0) {
796       return namen[namen.length - 1];
797     } else {
798       return self.fr.absolutePath;
799     }
800   };
7342b1 801 }
5dfab6 802
U 803 function BcrFiles(fl) {
804   this.files = fl;
805 }
806
807 function BcrFile(rp, n) {
808   this.relPath = rp;
809   this.fName = n;
7aa566 810 }
U 811