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