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