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