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