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