Dateiverwaltung für die WebBox
ulrich
2017-03-12 a7585943e71034e5e6cb95e42f94d756488b677d
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() {
a75859 310   if(tinymce.activeEditor.undoManager.hasUndo()) {
U 311     // hier Abfrage ob gespeichert werden soll    
312     $('#confirmOk').click(function() {
313       $('#confirmOk').attr('onclick','').unbind('click');
314       fm_menu_datei_speichern(function() {
315         fm_do_close();
316       });
317     });
318     $('#confirmCancel').click(function() {
319       $('#confirmCancel').attr('onclick','').unbind('click');
320     });
321     $('#confirmClose').show();
322     $('#confirmClose').click(function() {
323       $('#confirmClose').attr('onclick','').unbind('click');
324       fm_do_close();
325     });
326     $('#confirmOk').text("Speichern");
327     $('#confirmOk').addClass('btn-primary');
328     $('#confirmOk').removeClass('btn-danger');
329     $('#confirmModalTitle').text("Schliessen");
330     $('#confirmModalBody').text("Speichern vor dem Schliessen?");
331     $('#confirmModal').modal({
332       keyboard: false,
333       show: true
334     });
335   } else {
336     fm_do_close();
337   }
338 }
339
340 function fm_do_close() {
a4d3b5 341   $('.codeeditor-space').hide();
U 342   $('.code-editor-container').hide();
305573 343   $("#mce-editor").hide();
U 344   if(cm !== undefined) {
345     cm.toTextArea();
346   }
5ebb8e 347   openFileName = '';
7d8ef6 348   openEditor = '';
adf812 349   fm_get_list(pfad);
305573 350   fm_filectls_show();
e5ff42 351 }
U 352
17919c 353 function fm_dateiwahl(ev) {
5dfab6 354   var elem = this;
17919c 355   //console.log('dateiwahl nach click, event shift: ' + ev.shiftKey + ", event ctrl: " + ev.ctrlKey);
10d3d3 356   if(modus == 'kacheln') {
957b51 357     // Kacheln
10d3d3 358     if($(elem).children(0).hasClass('fa-folder')) {
957b51 359       if(/*ev.shiftKey || */ ev.ctrlKey) {
U 360         $(elem).find('.dateiname').addClass('datei-gewaehlt');
10d3d3 361       } else {
957b51 362         var ordner = $(elem).text().trim();
U 363         if(pfad.length > 0) {
364           pfad = pfad + '/' + ordner;
365         } else {
366           pfad = ordner;
367         }
368         fm_get_list(pfad);
10d3d3 369       }
7f2a41 370     } else if($(elem).children(0).hasClass('datei')) {
17919c 371       if(/*ev.shiftKey || */ ev.ctrlKey) {
U 372         // mehrere Dateien sollen gewaehlt werden
373       } else {
374         $('.datei-gewaehlt').removeClass('datei-gewaehlt');        
375       }
957b51 376       $(elem).find('.dateiname').addClass('datei-gewaehlt');
5dfab6 377     } else {
10d3d3 378       //console.log('kein folder oder file...');
5dfab6 379     }
U 380   } else {
957b51 381     // Liste
10d3d3 382     if($(elem).find('.datei-elem').children(0).hasClass('fa-file-o')) {
957b51 383       // Datei
17919c 384       if(/*ev.shiftKey || */ ev.ctrlKey) {
U 385         // mehrere Dateien sollen gewaehlt werden
386       } else {
387         $('.table-info').removeClass('table-info');
957b51 388         $('.datei-gewaehlt').removeClass('datei-gewaehlt');
17919c 389       }
10d3d3 390       $(elem).addClass('table-info');
U 391       $(elem).find('.dateiname').addClass('datei-gewaehlt');
392     } else {
957b51 393       // Ordner
U 394       if(/*ev.shiftKey || */ ev.ctrlKey) {
395         $(elem).children(0).addClass('datei-gewaehlt');
10d3d3 396       } else {
957b51 397         var ordner = $(elem).find('.dateiname').text();
U 398         if(pfad.length > 0) {
399           pfad = pfad + '/' + ordner;
400         } else {
401           pfad = ordner;
402         }
403         fm_get_list(pfad);
10d3d3 404       }
U 405     }   
5dfab6 406   }
c509a0 407 }
U 408
a94216 409 function fm_bc_click() {
U 410   var elem = this;
411   var bcPfad = $(elem).attr('rpath');
412   if(bcPfad !== undefined) {
c509a0 413     pfad = bcPfad;
a94216 414     fm_get_list(bcPfad);
U 415   } else {
416     pfad = '';
417     fm_get_list('');
418   }
419 }
420
42fece 421 function fm_text_edit(content, mode) {
305573 422   fm_filectls_hide();
3ad4db 423   $('.codeeditor-space').show();
U 424   $('.code-editor-container').show();
42fece 425   fm_code_edit(content, mode);  
7d8ef6 426   openEditor = 'text';
U 427 }
428
429 function fm_dok_edit(content) {
430   fm_filectls_hide();
0c1d5b 431   fm_dok_editor_init(userid);
7d8ef6 432   $("#mce-editor").show();
be9b6d 433   
U 434   window.clearTimeout(tmo2);
435   tmo2 = window.setTimeout(function () {
436     try {
437       ed.setContent(content);
438       openEditor = 'dok';  
439     } catch (err) {
440     }
441   }, 200);
3ad4db 442 }
U 443
305573 444 function fm_filectls_hide() {
U 445   $('#zentrum_bc').hide();
446   $('#dateien').hide();
547755 447   $('#editMenu').addClass('disabled');
305573 448 }
U 449
450 function fm_filectls_show() {
451   $('#zentrum_bc').show();
452   $('#dateien').show();  
547755 453   $('#editMenu').removeClass('disabled');
305573 454 }
b7475d 455 /* ----- API Calls ------------- */
U 456
0c1d5b 457 function fm_get_login() {
3ad4db 458   var m = '?c=de.uhilger.filecms.pub.SessionManager&m=getSessionUser';
U 459   var u = '../pub' + m;
460   fm_get(u, "text", function(resp) {
0c1d5b 461     userid = resp;
3ad4db 462     $('#userMenu').text(resp);
7342b1 463   });  
c509a0 464 }
U 465
466 function fm_get_new_folder() {
467   $('#modal_ok').click(function() {
468     // hier speichern
469     var m = '?c=de.uhilger.filecms.api.FileMgr&m=newFolder&p=' + pfad + '&p=' + $('#dateiname').val();
470     var u = '../svc' + m;
471     fm_get(u, "json", function(resp) {
adf812 472       fm_get_list(pfad);
c509a0 473     });
U 474   });
957b51 475   $('#saveModalTitle').text('Neuer Ordner');
c509a0 476   $('#dialogfrage').text("Name?");
U 477   $('#dateiname').val('');
478   $('#dateiname').attr('placeholder', 'Ordnername');
479   $('#saveModal').modal({
480     keyboard: false,
481     show: true
482   });
7342b1 483 }
U 484
7d8ef6 485 function fm_get_file_content(typ) {
fc1897 486   var gewaehlte = $('.datei-gewaehlt');
957b51 487   //var fname = $(gewaehlte).find('.dateiname').text();
U 488   
489   var fname = $(gewaehlte[0]).text();
5ebb8e 490   openFileName = fname;
3ad4db 491   var m = '?c=de.uhilger.filecms.api.FileMgr&m=getCode&p=' + pfad + '&p=' + fname;
2121cc 492   var u = '../svc' + m;
3ad4db 493   fm_get(u, "text", function(resp) {
7d8ef6 494     if(typ == 'text') {
42fece 495       var mode = "text/x-java";
U 496       if(fname.endsWith('js')) {
497         mode = 'javascript';
498       } else if(fname.endsWith('xml')) {
499         mode = 'xml';
500       } else if(fname.endsWith('properties')) {
501         mode = 'xml';
502       }
503       fm_text_edit(resp, mode);
7d8ef6 504     } else {
U 505       fm_dok_edit(resp);
506     }
2121cc 507   });
3ad4db 508   
2121cc 509 }
U 510
fc8db1 511 function fm_view_file() {
U 512   // http://localhost:8080/file-cms/ui/#  
513   // http://localhost:8080/file-cms/data/admin/usw.
514   
515   var userid = $('#userMenu').text();
516   var gewaehlte = $('.datei-gewaehlt');
517   var fname = $(gewaehlte[0]).text();
0c1d5b 518   
U 519   var path = fm_get_path(userid);
520   
521   window.open(path + '/' + fname, '_blank');
fc8db1 522 }
U 523
8446c2 524 function fm_menu_datei_umbenennen() {
U 525   var gewaehlte = $('.datei-gewaehlt');
526   var fname = $(gewaehlte[0]).text();
663ee9 527
U 528   $('#modal_ok').click(function() {
529     // hier umbenennen
530     fm_rename_file(fname, pfad, $('#dateiname').val())
531   });
532   $('#saveModalTitle').text('Datei umbenennen');
533   $('#dialogfrage').text("Neuer Dateiname?");  
534
535   if(fname !== undefined) {
536     $('#dateiname').val(fname);
537     $('#dateiname').attr('placeholder', 'Dateiname');
538     $('#saveModal').modal({
539       keyboard: false,
540       show: true
541     });
542   }
543 }
544
545 function fm_rename_file(fn, p, neuerName) {
546   var m = '?c=de.uhilger.filecms.api.FileMgr&m=renameFile';
547   m = m + '&p=' + p; 
548   m = m + '&p=' + fn; 
549   m = m + '&p=' + neuerName; 
550   var u = '../svc' + m;
551   fm_get(u, "text", function(resp) {
552     fm_get_list(pfad);
553   });  
8446c2 554 }
U 555
438b16 556 function fm_menu_shrink() {
U 557   var gewaehlte = $('.datei-gewaehlt');
558   var fname = $(gewaehlte[0]).text();
559   var m = '?c=de.uhilger.filecms.api.FileMgr&m=bildVerkleinern';
560   m = m + '&p=' + pfad; 
561   m = m + '&p=' + fname; 
562   var u = '../svc' + m;
563   fm_get(u, "text", function(resp) {
564     fm_get_list(pfad);
565   });  
566 }
567
7165a1 568 /*
U 569  * Hier merkt sich die Dateiverwalting die markierten Dateien fuer 
570  * eine Dateioperation. Bei cut wird in der 'paste' Operation auf dem Server 
571  * fuer die 'gemerkten' Dateien ein Move gemacht. Die Dateien werden 
572  * vom gewaehlten Ort zum Zielort verschoben.
573  * 
574  * @returns {undefined}
575  */
576 function fm_cut_files() {
577   cutCopySrcDir = pfad;
578   cutCopyFiles = fm_gewaehlte_dateien();
579   cutCopyOperation = 'cut';
580 }
581
582 /*
583  * Hier merkt sich die Dateiverwalting die markierten Dateien fuer 
584  * eine Dateioperation. Bei copy wird in der 'paste' Operation auf dem Server 
585  * fuer die 'gemerkten' Dateien eine Kopie gemacht. Die Dateien werden 
586  * am gewaehlten Ort behalten und am Zielort wird eine Kopier der 
587  * gewaehlten DAteien erstellt
588  * 
589  * @returns {undefined}
590  */
591 function fm_copy_files() {
592   cutCopySrcDir = pfad;
593   cutCopyFiles = fm_gewaehlte_dateien();
9e2964 594   cutCopyOperation = 'copy';
7165a1 595 }
U 596
597 /*
598  * Hier wird fuer eine zuvor markierte Liste von Dateien, fuer die 
599  * Cut oder Copy gewaehlt wurde, die Operations ausgefuehrt (move oder copy)
600  * @returns {undefined}
601  */
602 function fm_paste_files() {
603   var m;
9e2964 604   if(cutCopyOperation === 'cut') {
U 605     //m = '?c=de.uhilger.filecms.api.FileMgr&m=moveFiles'; //&p=' + cutCopySrcDir + '&p=' + pfad + '&p=' + encodeURIComponent(liste);
606     m = '?c=de.uhilger.filecms.api.FileMgr&m=moveFiles&p=' + cutCopySrcDir + '&p=' + pfad + '&p=' + encodeURIComponent(cutCopyFiles);
7165a1 607   } else {
9e2964 608     //m = '?c=de.uhilger.filecms.api.FileMgr&m=copyFiles'; //&p=' + cutCopySrcDir + '&p=' + pfad + '&p=' + encodeURIComponent(liste);
U 609     m = '?c=de.uhilger.filecms.api.FileMgr&m=copyFiles&p=' + cutCopySrcDir + '&p=' + pfad + '&p=' + encodeURIComponent(cutCopyFiles);
fc1897 610   }
7165a1 611   var u = '../svc' + m;  
9e2964 612   fm_get(u, "text", function(resp) {
U 613     // console.log('deleteFiles gab folgendes zurueck: ' + resp);
614     fm_get_list(pfad);
615   });
616   /*
617   fm_post(u, {p1: encodeURIComponent(cutCopySrcDir), p2: encodeURIComponent(pfad), p3: encodeURIComponent(cutCopyFiles)},'text', function(resp) {
7165a1 618     // resp evtl. zeigen..
U 619     fm_get_list(pfad);
620   });
9e2964 621   */
7165a1 622 }
U 623
624 function fm_del_files() {
625   var liste = fm_gewaehlte_dateien();
fc1897 626   var m = '?c=de.uhilger.filecms.api.FileMgr&m=deleteFiles&p=' + pfad + '&p=' + encodeURIComponent(liste);
U 627   var u = '../svc' + m;
628   fm_get(u, "text", function(resp) {
629     // console.log('deleteFiles gab folgendes zurueck: ' + resp);
630     fm_get_list(pfad);
631   });
632 }
633
10d3d3 634 function fm_render_list(fl) {
U 635   if(modus == 'kacheln') {
636     // Kachelansicht
7d8ef6 637     var template = $('#tpl-kacheln').html();
U 638     Mustache.parse(template);   // optional, speeds up future uses
639     $('.datei-zeile').attr('onclick','').unbind('click');
640     $('#dateien').empty();
641     $('#dateien').html(Mustache.render(template, fl));
642     $('.figure').click(fm_dateiwahl);
643   } else {
644     // Listenansicht
645     var template = $('#tpl-liste').html();
646     Mustache.parse(template);   // optional, speeds up future uses
647     $('.figure').attr('onclick','').unbind('click');
648     $('#dateien').empty();
649     $('#dateien').html(Mustache.render(template, fl));
650     $('.datei-zeile').click(fm_dateiwahl);
651   }
652   /*
653   if(modus == 'kacheln') {
654     // Kachelansicht
a3d410 655     $.get('tpl-kacheln.txt', function(template) {
U 656       $('#dateien').empty();
657       $('#dateien').html(Mustache.render(template, fl));
658       $('.figure').click(fm_dateiwahl);
659     });
10d3d3 660     $('.datei-zeile').attr('onclick','').unbind('click');
U 661   } else {
662     // Listenansicht
a3d410 663     $.get('tpl-liste.txt', function(template) {
U 664       $('#dateien').empty();
665       $('#dateien').html(Mustache.render(template, fl));
666       $('.datei-zeile').click(fm_dateiwahl);
667     });
10d3d3 668     $('.figure').attr('onclick','').unbind('click');
U 669   }
7d8ef6 670   */
10d3d3 671 }
U 672
7342b1 673 // http://localhost:8079/file-cms/svc?c=de.uhilger.filecms.api.FileMgr&f=JSONNICE&m=list&p=
a94216 674 function fm_get_list(relPfad) {
10d3d3 675   $('#ansicht').attr('onclick','').unbind('click');
a94216 676   var m = '?c=de.uhilger.filecms.api.FileMgr&m=list&p=' + relPfad;
7342b1 677   var u = '../svc' + m;
U 678   fm_get(u, "json", function(resp) {
10d3d3 679     
2121cc 680     if(resp.List[0].FileRef !== undefined) {
U 681       var files = new Array();
c509a0 682       if(resp.List[0].FileRef instanceof Array) {
U 683         for(var i = 0; i < resp.List[0].FileRef.length; i++) {
684           files.push(new FileRef(resp.List[0].FileRef[i]));
685         }
686       } else {
687         files.push(new FileRef(resp.List[0].FileRef));
2121cc 688       }
U 689       var fl = new FileList(files);
10d3d3 690       fm_render_list(fl);
2121cc 691     } else {
U 692       $('#dateien').empty();
7342b1 693     }
5dfab6 694     
10d3d3 695     // Breadcrumb-Ansicht
7d8ef6 696     var template;
a94216 697     $('.breadcrumb-item').attr('onclick','').unbind('click');
2315a0 698     $('#bcnav').empty();
5dfab6 699     var dirList = new Array();
U 700     var rp = '';
a94216 701     //console.log("'" + relPfad + "'");
U 702     var dirs = relPfad.split('/');
703     //console.log(dirs.length);
2121cc 704     dirList.push(new BcrFile(rp, 'Home'));
a94216 705     if(relPfad.length > 0) {
2315a0 706       for(var i = 0; i < dirs.length - 1; i++) {
5dfab6 707         if(rp.length > 0 ) {
U 708           dirList.push(new BcrFile(rp + '/' + dirs[i], dirs[i]));
2315a0 709           rp = rp + '/' + dirs[i];
5dfab6 710         } else {
U 711           dirList.push(new BcrFile(dirs[i], dirs[i]));
2315a0 712           rp = dirs[i];
5dfab6 713         }
U 714       }
715       var bl = new BcrFiles(dirList);
7d8ef6 716  
U 717       if(dirList.length > 0) {
718         template = $('#tpl-bcr').html();
719         Mustache.parse(template);   // optional, speeds up future uses
720         $('#bcnav').html(Mustache.render(template, bl));
2315a0 721       }
7d8ef6 722       
U 723       if(dirs.length > 0) {
724         dirList.push(new BcrFile(rp + '/' + dirs[dirs.length-1], dirs[dirs.length-1]));
725         template = $('#tpl-bcr2').html();
726         Mustache.parse(template);   // optional, speeds up future uses
727         $('#bcnav').append(Mustache.render(template, dirList[dirList.length-1]));        
728       } else {
729         template = $('#tpl-bcr2').html();
730         Mustache.parse(template);   // optional, speeds up future uses
731         $('#bcnav').append(Mustache.render(template, dirList[0]));        
732       }
733       
734       $('#bcnav').append($('#tpl-bcr3').html());
2315a0 735     } else {
a94216 736       pfad = '';
7d8ef6 737       template = $('#tpl-bcr2').html();
U 738       Mustache.parse(template);   // optional, speeds up future uses
739       $('#bcnav').append(Mustache.render(template, dirList[0]));   
740       $('#bcnav').append($('#tpl-bcr3').html());
5dfab6 741     }
7d8ef6 742     $('.breadcrumb-item').click(fm_bc_click);
U 743     $('#ansicht').click(fm_ansicht_umschalten);
744     fm_set_modus();
745   });
e5ff42 746 }
U 747
a75859 748 function fm_menu_datei_speichern(callback) {
5ebb8e 749   //var fname = $('.datei-gewaehlt').text();
U 750   var fname = openFileName;
751   if(fname !== undefined && fname !== '') {
a75859 752     fm_save_file(fname, 'saveTextFile', callback);
5ebb8e 753   } else {
a75859 754     fm_menu_datei_speichern_unter(callback);
5ebb8e 755   }
U 756 }
757
a75859 758 function fm_save_file(saveFileName, method, callback) {
7d8ef6 759   var content;
U 760   if(openEditor === 'text') {
761     content = cm.getValue();
762   } else {
763     content = ed.getContent();
764   }
47e9d4 765   var m = '?c=de.uhilger.filecms.api.FileMgr&m=' + method;
5ebb8e 766   var u = '../svc' + m;
7d8ef6 767   fm_post(u, {p1: pfad, p2: saveFileName, p3: content}, function(resp) {
a75859 768     // hier scheint nichts zurueckzukommen..
5ebb8e 769   });
a75859 770   tinymce.activeEditor.undoManager.clear();
U 771   openFileName = saveFileName;
772   if(callback !== undefined) {
773     callback();
774   }
5ebb8e 775 }
U 776
a75859 777 function fm_menu_datei_speichern_unter(callback) {  
915927 778   $('#modal_ok').click(function() {
a75859 779     $('#modal_ok').attr('onclick','').unbind('click');
915927 780     // hier speichern
a75859 781     fm_save_file($('#dateiname').val(), 'saveTextFileAs', callback);
915927 782   });
957b51 783   $('#saveModalTitle').text('Datei speichern');
c509a0 784   $('#dialogfrage').text("Dateiname?");
3ad4db 785   
U 786   var fname = $('.datei-gewaehlt').text();
787   if(fname !== undefined) {
788     $('#dateiname').val(fname);
789   } else {
790     $('#dateiname').val('');
791   }
c509a0 792   $('#dateiname').attr('placeholder', 'Dateiname');
915927 793   $('#saveModal').modal({
U 794     keyboard: false,
795     show: true
796   });
a4d3b5 797 }
U 798
b7475d 799 function fm_logout() {
U 800   var m = '?c=de.uhilger.filecms.pub.SessionManager&m=expireSession';
801   var u = '../pub' + m;
802   
803   fm_get(u, "text", function(resp) {
804     $('#userMenu').text('nicht angemeldet');
805     window.location.href = '../logout.html';
806   });
807 }
808
809
a4d3b5 810 /* ---- codemirror editor handling -------- */
U 811
942d63 812 function htmlDecode(value){ 
U 813   return $('<div/>').html(value).text(); 
814 }
815
42fece 816 function fm_code_edit(content, m) {
a4d3b5 817   cm = CodeMirror.fromTextArea(document.getElementById("editspace"), {
U 818     lineNumbers: true,
42fece 819     mode: m,
a4d3b5 820     viewportMargin : Infinity,
U 821     extraKeys: {
915927 822         "F9": function(cm) {
U 823         cm.setOption("fullScreen", !cm.getOption("fullScreen"));
824       },
825         "Esc": function(cm) {
826         if (cm.getOption("fullScreen")) cm.setOption("fullScreen", false);
827       }
a4d3b5 828     }
U 829   });
fab80c 830   //cm.setValue(htmlDecode(content));
U 831   //cm.setValue(content);
832   cm.setValue(unescapeHtml(content));
915927 833 }
a4d3b5 834
U 835
836
837 /* -------- helper functions ----------- */
838
b7475d 839 function fm_get(u, dtype, scallback) {
a4d3b5 840   $.ajax({
U 841     url: u,
842     type: "GET",
b7475d 843     dataType: dtype,
a4d3b5 844     success: scallback,
U 845     error: function (xhr, status, errorThrown) {
846       alert("Error: " + errorThrown + " Status: " + status + " URL: " + u);
847     },
848     complete: function (xhr, status) {
849       //console.log( "The request is complete!" );
850     }
851
852   });
915927 853 }
a4d3b5 854
9e2964 855 function fm_post(u, d, dtype, scallback) {
a4d3b5 856   $.ajax({
U 857     url: u,
858     data: d,
859     type: "POST",
9e2964 860     dataType: dtype,
a4d3b5 861     success: scallback,
U 862     error: function (xhr, status, errorThrown) {
863       $('#fehler').html("Error: " + errorThrown + " Status: " + status);
864     },
865     complete: function (xhr, status) {
866       //alert( "The request is complete!" );
867     }
868   });
915927 869 }
a4d3b5 870
e5ff42 871 function fm_serialise(obj) {
U 872   return '{"' + obj.constructor.name + '":' + JSON.stringify(obj) + '}';
915927 873 }
e5ff42 874
fab80c 875 function escapeHtml(text) {
U 876   text = text.replace(/\u228/g,'&auml;');
877   text = text.replace(/\u246/g,'&ouml;');
878   text = text.replace(/\u252/g,'&uuml;');
879   text = text.replace(/\u196/g,'&Auml;');
880   text = text.replace(/\u214/g,'&Ouml;');
881   text = text.replace(/\u220/g,'&Uuml;');
882   text = text.replace(/\u223/g,'&szlig;');
883   text = text.replace(/\u26/g,'&amp;');
884   return text;
885 }
886
887 function unescapeHtml(text) {
888   text = text.replace(/&auml;/g, String.fromCharCode(228));
889   text = text.replace(/&ouml;/g, String.fromCharCode(246));
890   text = text.replace(/&uuml;/g, String.fromCharCode(252));
891   text = text.replace(/&Auml;/g, String.fromCharCode(196));
892   text = text.replace(/&Ouml;/g, String.fromCharCode(214));
893   text = text.replace(/&Uuml;/g, String.fromCharCode(220));
894   text = text.replace(/&szlig;/g, String.fromCharCode(223));
895   text = text.replace(/&amp;/g, String.fromCharCode(26));
896   return text;
897 }
898
899
7342b1 900 /* ----- Objekte ----- */
U 901
902 function FileList(fl) {
903   this.files = fl;
904 }
905
906 function FileRef(obj) {
907   var self = this;
908   this.fr = obj;
7f2a41 909   this.fnx;
7342b1 910   
U 911   this.typeClass = function() {
10d3d3 912     if(modus == 'kacheln') {
U 913       if(self.fr.isDirectory) {
a3d410 914         return 'fa-folder ordner';
10d3d3 915       } else {
a3d410 916         return 'fa-file datei';
10d3d3 917       }
7342b1 918     } else {
10d3d3 919       if(self.fr.isDirectory) {
a3d410 920         return 'fa-folder ordner';
10d3d3 921       } else {
a3d410 922         return 'fa-file-o datei';
10d3d3 923       }
7342b1 924     }
2121cc 925   };
U 926   
7f2a41 927   this.mini = function() {
U 928     var miniatur = false;
929     var namen = self.fr.absolutePath.split('/');
930     if(namen.length > 0) {
931       self.fnx = decodeURIComponent(namen[namen.length - 1]);
932     } else {
933       self.fnx = decodeURIComponent(self.fr.absolutePath);
934     }
935     if(self.fnx.indexOf('.jpg') > -1 || self.fnx.indexOf('.png') > -1 || self.fnx.indexOf('.gif') > -1 || self.fnx.indexOf('.jpeg') > -1) {
936       miniatur = true;
937     }
938     return miniatur;
939   };
940   
941   this.miniurl = function() {
942       var userid = $('#userMenu').text();
943       var ext = '';
944       var dotpos = self.fnx.indexOf('.');
945       if(dotpos > -1) {
946         var fny = self.fnx;
947         self.fnx = self.fnx.substring(0, dotpos);
948         ext = fny.substr(dotpos);
949       }
950       var path = fm_get_path(userid);
fa012b 951       var imgurl = loc + path + '/' + self.fnx + '_tn' + ext;
7f2a41 952       return imgurl;
U 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