Dateiverwaltung für die WebBox
ulrich
2021-01-06 53119fbeeaf9dbbf6c3a2ae492b9940cb5550054
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";
45ad00 34 var DAV_DIR = "Austausch";
1f550a 35 var BASE_DIR = "$basis";
U 36 var DATA_DIR = "$daten";
11536c 37 var WWW_DIR = "www";
e3043f 38 var compilerIssues;
76660f 39 var fm_slideshow = false;
c7c502 40
U 41 function fm_init() {
305573 42   $("#mce-editor").hide();
a4d3b5 43   $('.codeeditor-space').hide();
U 44   $('.code-editor-container').hide();
a450f2 45   $('.sued').hide();
bef5c6 46   //$('.ost').attr('flex-basis', 0);
53119f 47   $('#newTab').on('click', fm_newTab);
a4d3b5 48   $('#newTextFile').on('click', fm_menu_neue_textdatei);
305573 49   $('#newDoc').on('click', fm_menu_neues_dokument);
adf812 50   $('#newFolder').on('click', fm_get_new_folder);
fc8db1 51   $('#viewFile').on('click', fm_view_file);
977e5d 52   $('#viewSlideshow').on('click', fm_view_slideshow);
7d8ef6 53   $('#editTextFile').on('click', function() {
U 54     fm_get_file_content('text');
55   });
56   $('#editDocFile').on('click', function() {
57     fm_get_file_content('dok');
58   });
e5ff42 59   $('#saveFile').on('click', fm_menu_datei_speichern);
5ebb8e 60   $('#saveFileAs').on('click', fm_menu_datei_speichern_unter);
a4d3b5 61   $('#closeFile').on('click', fm_menu_datei_schliessen);
8446c2 62   $('#renameFile').on('click', fm_menu_datei_umbenennen);
af9930 63   $('#m-zip').on('click', fm_menu_ordner_packen);
6bd2c1 64   $('#m-unzip').on('click', fm_menu_datei_entpacken);
fad719 65   $('#m-html-export').on('click', fm_menu_html_export);
fc1897 66   $('#m-del').on('click', fm_menu_delete);
7165a1 67   $('#m-cut').on('click', fm_menu_cut);
U 68   $('#m-copy').on('click', fm_menu_copy);
69   $('#m-paste').on('click', fm_menu_paste);
438b16 70   $('#m-shrink').on('click', fm_menu_shrink);
bb9f8c 71   $('#m-rotate').on('click', fm_menu_rotate);
76660f 72   $('#m-toggle-slideshow').on('click', fm_toggle_show_slideshow);
bef5c6 73   $('#m-test').on('click', fm_menu_test);
72e43d 74   $('#m-test-2').on('click', fm_menu_compile);
U 75   $('#m-test-3').on('click', fm_menu_compile_all);
a450f2 76   $('#m-compile-results').on('click', fm_fusszeile_zeigen);
7b3372 77   $('#m-build-app').on('click', fm_menu_build_app);
f59dce 78   $('#m-ant-build').on('click', fm_menu_ant_build);
c509a0 79   $('#saveModal').on('hidden.bs.modal', function (e) {
915927 80     $('#modal_ok').attr('onclick','').unbind('click');
b7475d 81   });
U 82   $('#logout').click(fm_logout);  
a450f2 83   $('#fusszeile-schliessen').on('click', fm_fusszeile_schliessen);
05cfa7 84   fm_get_login();
53119f 85   
U 86   //console.log(window.location);
87   //console.log(window.location.search);
88   var parsedUrl = new URL(window.location.href);
89   //console.log(parsedUrl.searchParams.get("pfad"));
90   var wunschPfad = parsedUrl.searchParams.get("pfad");
91   
92   if(wunschPfad.length > 0) {
93     pfad = wunschPfad;
94     fm_get_list(wunschPfad);
95     fm_init_uploader();
96   } else {
97     fm_get_list('');
98     fm_init_uploader();
99   }
fa012b 100   /*
U 101   console.log('href: ' + window.location.href);
102   console.log('host: ' + window.location.host);
103   console.log('hostname: ' + window.location.hostname);
104   console.log('port: ' + window.location.port);
105   console.log('protocol: ' + window.location.protocol);
106   */
107   loc = window.location.protocol + '//' + window.location.host;
fc8db1 108 }
U 109
53119f 110 function fm_newTab() {
U 111   window.open('/file-cms/ui/?pfad=' + pfad, '_blank');
112 }
113
76660f 114 function fm_toggle_show_slideshow() {
U 115   if(fm_slideshow) {
968b07 116     $('#m-toggle-slideshow').text('Diashow einschalten');
76660f 117     fm_slideshow = false;
U 118   } else {
968b07 119     $('#m-toggle-slideshow').text('Diashow ausschalten');
76660f 120     fm_slideshow = true;
U 121   }
122 }
123
0c1d5b 124 function fm_resize_editor() {
U 125   window.clearTimeout(tmo);
126   tmo = window.setTimeout(function () {
127     try {
128       var myHeight = $('.zentrum').height() - $('.nord').height() - 4;
129       ed.theme.resizeTo('100%', myHeight);  // sets the dimensions of the editable area
130     } catch (err) {
131     }
132   }, 200);
a450f2 133 }
U 134
135 function fm_fusszeile_schliessen() {
136   $('.sued').hide();
137 }
138
139 function fm_fusszeile_zeigen() {
140   $('.sued').show();
fc8db1 141 }
U 142
0c1d5b 143 function fm_get_path(uid) {
U 144   //console.log('pfad: ' + pfad);
145   var restdir;
cccd2b 146   if(pfad.indexOf(PUB_DIR) > -1) {
U 147     restdir = pfad.substr(PUB_DIR.length);
148   } else if(pfad.indexOf(PERS_DIR) > -1) {
149     restdir = pfad.substr(PERS_DIR.length);
1f550a 150   } else if(pfad.indexOf(BASE_DIR) > -1) {
U 151     restdir = pfad.substr(BASE_DIR.length);
152   } else if(pfad.indexOf(DATA_DIR) > -1) {
153     restdir = pfad.substr(DATA_DIR.length);
45ad00 154   } else if(pfad.indexOf(DAV_DIR) > -1) {
U 155     restdir = pfad.substr(DAV_DIR.length);
0c1d5b 156   }
U 157   if(restdir !== undefined && restdir.startsWith('/')) {
158     restdir = restdir.substr(1);
11536c 159     if(restdir.indexOf(WWW_DIR) > -1) {
U 160       restdir = restdir.replace(WWW_DIR, 'data');
161     }
0c1d5b 162   }
U 163   var pdir = fm_get_base(uid);
11536c 164   // console.log('fm_get_path path: ' + pdir + "/" + restdir);
0c1d5b 165   if(restdir.length > 1) {
U 166     return pdir + "/" + restdir;
167   } else {
168     return pdir;
169   }
170 }
171
172 function fm_get_base(uid) {
173   //console.log('pfad: ' + pfad);
174   var pdir;
cccd2b 175   if(pfad.indexOf(PUB_DIR) > -1) {
11536c 176     pdir = '/data/' + uid;
cccd2b 177   } else if(pfad.indexOf(PERS_DIR) > -1) {
11536c 178     pdir = '/home/' + uid;
U 179   } else if(pfad.indexOf(BASE_DIR) > -1) {
180     pdir = '';
181   } else if(pfad.indexOf(DATA_DIR) > -1) {
182     pdir = '';
0c1d5b 183   }
11536c 184   //console.log('fm_get_base base: ' + pdir + uid);
U 185   return pdir;
0c1d5b 186 }
05cfa7 187
0c1d5b 188 function fm_dok_editor_init(uid) {
U 189   var base = fm_get_path(uid);
a75859 190   edCount = 0;
11536c 191   //console.log("fm_dok_editor_init calling tinymce.init with base: " + base + "/");
fc8db1 192   
0c1d5b 193   /*
U 194    * vgl.
195    * http://stackoverflow.com/questions/4651676/how-do-i-remove-tinymce-and-then-re-add-it
196    */
197   //tinymce.EditorManager.execCommand('mceRemoveControl',true, 'textarea.text-editor');
198   //tinymce.EditorManager.execCommand('mceAddControl',true, editor_id);
199   if(ed !== undefined) {
200     ed.destroy();
201   }
202   tinymce.remove('textarea.text-editor');
203   tinymce.EditorManager.editors = []; 
305573 204   
U 205   /*
206    * Konfiguration TinyMCE
207    */
208   tinymce.init({
547755 209     content_css : "/file-cms/ui/mce.css",
7b7627 210     //content_css: "/jslib/bootstrap/css/bootstrap.min.css",
7d8ef6 211     selector: "textarea.text-editor",
305573 212     statusbar: false,
U 213     menubar: false,
bbb632 214     plugins: 'advlist charmap code image link lists media table print preview save table textcolor importcss',
U 215     toolbar: 'undo redo | styleselect | image table | link unlink | bullist numlist | outdent indent | code',
305573 216     /*
U 217     menu: {
218       file: {title: 'File', items: 'savevers | exit'},
219       edit: {title: 'Edit', items: 'undo redo | cut copy paste pastetext | selectall'},
220       view: {title: 'View', items: 'visualaid | code | link image media | template hr'},
221     },
222     */
0c1d5b 223     resize: 'both',
ea1ae0 224     importcss_append: true,
305573 225     width: "100%",
U 226     height: '100%',
11536c 227     relative_urls : true, 
U 228     convert_urls : false, 
0c1d5b 229     document_base_url : base + "/",
305573 230     setup: function (editor) {
U 231       ed = editor;
232     }
233   });
0c1d5b 234   
U 235   $(window).on('resize', fm_resize_editor);
236   fm_resize_editor();
10d3d3 237 }
7aa566 238
U 239 /* ----- Uploader Anfang ----------*/
240
241 var dateien = new Array();
242
243 function fm_init_uploader() {
244   var dropzone = document.getElementById("dateien");  
245   dropzone.ondragover = dropzone.ondragenter = function(event) {  
246     event.stopPropagation();  
247     event.preventDefault();  
248   };
249
250   dropzone.ondrop = function(event) {  
251     event.stopPropagation();  
252     event.preventDefault();  
7ebde1 253     var fileList = event.dataTransfer.files;  
U 254     for (var i=0; i<fileList.length; i++) {  
255       dateien.push(fileList[i]);
256     }
257     sendFile(dateien.pop());
7aa566 258   };
U 259 }
260
261 /* ----- Uploader Ende --------------- */
10d3d3 262
7165a1 263 /* ------- Dateifunktionen Start ----------- */
U 264
265 function fm_menu_cut() {
98f088 266   //alert('fm_menu_cut');
U 267   fm_cut_files();
7165a1 268 }
U 269 function fm_menu_copy() {
98f088 270   //alert('fm_menu_copy');
U 271   fm_copy_files();
7165a1 272 }
U 273 function fm_menu_paste() {
98f088 274   //alert('fm_menu_paste');
U 275   fm_paste_files();
7165a1 276 }
fc1897 277 function fm_menu_delete() {
U 278   $('#confirmOk').click(function() {
a75859 279     $('#confirmOk').attr('onclick','').unbind('click');
fc1897 280     fm_del_files();
U 281   });
a75859 282   $('#confirmOk').text("Loeschen");
U 283   $('#confirmOk').removeClass('btn-primary');
284   $('#confirmOk').addClass('btn-danger');
285   $('#confirmClose').hide();
957b51 286   $('#confirmModalTitle').text("Löschen");
U 287   $('#confirmModalBody').text("Wirklich löschen?");
fc1897 288   $('#confirmModal').modal({
U 289     keyboard: false,
290     show: true
291   });
292 }
7165a1 293
U 294 /*
295  * Gewaehlte Dateien feststellen
296  * 
297  * @returns {String} eine per JSON.stringify schon vorbereitete List zum 
298  * Absenden als Parameter an den Server
299  */
300 function fm_gewaehlte_dateien() {
301   var gewaehlte = $('.datei-gewaehlt');
a450f2 302   /*
7165a1 303   //console.log('anzahl: ' + gewaehlte.length);
U 304   var fnames = new Array();
305   var i = 0;
306   while(i < gewaehlte.length) {
307     var str = { "java.lang.String": $(gewaehlte[i]).text()};
308     fnames.push(str);
309     //console.log('loeschen ' + pfad + ' ' + $(gewaehlte[i]).text());
310     //i += 2;
311     i++;
312   }
313   var liste = '{"List":' + JSON.stringify(fnames) + '}';
314   // 'liste' enthaelt:
315   // {"List":[{"java.lang.String":"test3.txt"},{"java.lang.String":"Test1.txt"},{"java.lang.String":"Test2.txt"}]}
316   // und wird auf dem Server zu einer List[ArrayList<String>] bei der jede ArrayList<String> nur ein Element hat 
317   return liste;
a450f2 318   */
U 319   return fm_dateiliste_bilden(gewaehlte);
7165a1 320 }
a450f2 321
U 322 function fm_dateiliste_bilden(gewaehlte) {
323   var fnames = new Array();
324   var i = 0;
325   while(i < gewaehlte.length) {
326     var str = { "java.lang.String": $(gewaehlte[i]).text()};
327     fnames.push(str);
328     //console.log('loeschen ' + pfad + ' ' + $(gewaehlte[i]).text());
329     //i += 2;
330     i++;
331   }
332   var liste = '{"List":' + JSON.stringify(fnames) + '}';
333   // 'liste' enthaelt:
334   // {"List":[{"java.lang.String":"test3.txt"},{"java.lang.String":"Test1.txt"},{"java.lang.String":"Test2.txt"}]}
335   // und wird auf dem Server zu einer List[ArrayList<String>] bei der jede ArrayList<String> nur ein Element hat 
336   return liste;
337 }
338
fad719 339 function fm_menu_html_export() {
U 340   fm_export_html();
341 }
342
7165a1 343 /* --------- Dateifunktionen Ende ---------- */
fc1897 344
bef5c6 345 function fm_menu_test() {
U 346   var w = $('.ost').width();
347   if(w == 0) {
348     $('.ost').width('20%');
349     $('.ost').text('Hallo Welt!');
350   } else {
351     $('.ost').empty();
352     $('.ost').width(0);
353   }
354 }
355
72e43d 356 function fm_menu_compile() {
fd0b4c 357   fm_compile('0', fm_mark_compile_results_in_editor);
72e43d 358 }
U 359 function fm_menu_compile_all() {
360   fm_compile_all();
fd0b4c 361 }
U 362
7b3372 363 function fm_menu_build_app() {
U 364   fm_build_app();
365 }
366
f59dce 367 function fm_menu_ant_build() {
U 368   fm_ant_build();
369 }
370
fd0b4c 371 function fm_mark_compile_results_in_editor(resp) {
U 372   cm.clearGutter("breakpoints");
373
374   if(resp.List[0].CompilerIssue !== undefined) {
d9d37b 375     cm.setGutterMarker(0, "breakpoints", makeMarker("Code hat Fehler"));
fd0b4c 376     var lno;
U 377     var eMsg;
378     if(resp.List[0].CompilerIssue instanceof Array) {
379       var issueNo = 0;
380       while(issueNo < resp.List[0].CompilerIssue.length) {
381         // console.log(resp.List[0].CompilerIssue[issueNo].kind);
382         // console.log(resp.List[0].CompilerIssue[issueNo].lineNumber);
383         // console.log(resp.List[0].CompilerIssue[issueNo].sourceName);
384         // console.log(resp.List[0].CompilerIssue[issueNo].message);
385         lno = resp.List[0].CompilerIssue[issueNo].lineNumber;
386         eMsg = resp.List[0].CompilerIssue[issueNo].kind + ' ' + resp.List[0].CompilerIssue[issueNo].message;
387         cm.setGutterMarker(lno-1, "breakpoints", makeMarker(eMsg));
388         issueNo++;
389       }
390     } else {
391       lno = resp.List[0].CompilerIssue.lineNumber;
392       eMsg = resp.List[0].CompilerIssue.kind + ' ' + resp.List[0].CompilerIssue.message;
393       cm.setGutterMarker(lno-1, "breakpoints", makeMarker(eMsg));
394     }
395   }
0ac262 396 }
U 397
10d3d3 398 function fm_ansicht_umschalten() {
U 399   if($('#ansicht').children(0).hasClass('fa-th-list')) {
400     $('#ansicht').children(0).addClass('fa-th-large');
401     $('#ansicht').children(0).removeClass('fa-th-list');
402     modus = 'liste';
403   } else {
404     $('#ansicht').children(0).addClass('fa-th-list');    
405     $('#ansicht').children(0).removeClass('fa-th-large');
406     modus = 'kacheln';
407   }
408   fm_get_list(pfad);
409 }
410
411 function fm_set_modus() {
412   if(modus == 'kacheln') {
413     $('#ansicht').children(0).addClass('fa-th-list');    
414     $('#ansicht').children(0).removeClass('fa-th-large');  
415   } else {
416     $('#ansicht').children(0).addClass('fa-th-large');
417     $('#ansicht').children(0).removeClass('fa-th-list');    
418   }
a4d3b5 419 }
U 420
421 function fm_menu_neue_textdatei() {
adf812 422   fm_text_edit('Neue Datei');
a4d3b5 423 }
U 424
305573 425 function fm_menu_neues_dokument() {
7d8ef6 426   fm_dok_edit('');
305573 427 }
U 428
a4d3b5 429 function fm_menu_datei_schliessen() {
3003b2 430   if(openEditor === 'text') {
U 431     if(!cm.getDoc().isClean()) {
432       fm_ask_for_save();
433     } else {
434       fm_do_close();
435     }
436   } else {
437     if(tinymce.activeEditor.undoManager.hasUndo()) {
438       fm_ask_for_save();
439     } else {
440       fm_do_close();
441     }
442   }
443 }
444
445 function fm_ask_for_save() {
446   // hier Abfrage ob gespeichert werden soll    
447   $('#confirmOk').click(function() {
448     $('#confirmOk').attr('onclick','').unbind('click');
449     fm_menu_datei_speichern(function() {
a75859 450       fm_do_close();
U 451     });
3003b2 452   });
U 453   $('#confirmCancel').click(function() {
454     $('#confirmCancel').attr('onclick','').unbind('click');
455   });
456   $('#confirmClose').show();
457   $('#confirmClose').click(function() {
458     $('#confirmClose').attr('onclick','').unbind('click');
a75859 459     fm_do_close();
3003b2 460   });
U 461   $('#confirmOk').text("Speichern");
462   $('#confirmOk').addClass('btn-primary');
463   $('#confirmOk').removeClass('btn-danger');
464   $('#confirmModalTitle').text("Schliessen");
465   $('#confirmModalBody').text("Speichern vor dem Schliessen?");
466   $('#confirmModal').modal({
467     keyboard: false,
468     show: true
469   });
a75859 470 }
U 471
472 function fm_do_close() {
a4d3b5 473   $('.codeeditor-space').hide();
U 474   $('.code-editor-container').hide();
305573 475   $("#mce-editor").hide();
U 476   if(cm !== undefined) {
477     cm.toTextArea();
478   }
5ebb8e 479   openFileName = '';
7d8ef6 480   openEditor = '';
adf812 481   fm_get_list(pfad);
305573 482   fm_filectls_show();
e5ff42 483 }
U 484
17919c 485 function fm_dateiwahl(ev) {
5dfab6 486   var elem = this;
17919c 487   //console.log('dateiwahl nach click, event shift: ' + ev.shiftKey + ", event ctrl: " + ev.ctrlKey);
10d3d3 488   if(modus == 'kacheln') {
957b51 489     // Kacheln
10d3d3 490     if($(elem).children(0).hasClass('fa-folder')) {
957b51 491       if(/*ev.shiftKey || */ ev.ctrlKey) {
U 492         $(elem).find('.dateiname').addClass('datei-gewaehlt');
10d3d3 493       } else {
957b51 494         var ordner = $(elem).text().trim();
U 495         if(pfad.length > 0) {
496           pfad = pfad + '/' + ordner;
497         } else {
498           pfad = ordner;
499         }
500         fm_get_list(pfad);
10d3d3 501       }
7f2a41 502     } else if($(elem).children(0).hasClass('datei')) {
17919c 503       if(/*ev.shiftKey || */ ev.ctrlKey) {
U 504         // mehrere Dateien sollen gewaehlt werden
505       } else {
506         $('.datei-gewaehlt').removeClass('datei-gewaehlt');        
507       }
957b51 508       $(elem).find('.dateiname').addClass('datei-gewaehlt');
5dfab6 509     } else {
10d3d3 510       //console.log('kein folder oder file...');
5dfab6 511     }
U 512   } else {
957b51 513     // Liste
10d3d3 514     if($(elem).find('.datei-elem').children(0).hasClass('fa-file-o')) {
957b51 515       // Datei
17919c 516       if(/*ev.shiftKey || */ ev.ctrlKey) {
U 517         // mehrere Dateien sollen gewaehlt werden
518       } else {
519         $('.table-info').removeClass('table-info');
957b51 520         $('.datei-gewaehlt').removeClass('datei-gewaehlt');
17919c 521       }
10d3d3 522       $(elem).addClass('table-info');
U 523       $(elem).find('.dateiname').addClass('datei-gewaehlt');
524     } else {
957b51 525       // Ordner
U 526       if(/*ev.shiftKey || */ ev.ctrlKey) {
527         $(elem).children(0).addClass('datei-gewaehlt');
10d3d3 528       } else {
957b51 529         var ordner = $(elem).find('.dateiname').text();
U 530         if(pfad.length > 0) {
531           pfad = pfad + '/' + ordner;
532         } else {
533           pfad = ordner;
534         }
535         fm_get_list(pfad);
10d3d3 536       }
U 537     }   
5dfab6 538   }
c509a0 539 }
U 540
a94216 541 function fm_bc_click() {
U 542   var elem = this;
543   var bcPfad = $(elem).attr('rpath');
544   if(bcPfad !== undefined) {
c509a0 545     pfad = bcPfad;
a94216 546     fm_get_list(bcPfad);
U 547   } else {
548     pfad = '';
549     fm_get_list('');
550   }
551 }
552
42fece 553 function fm_text_edit(content, mode) {
305573 554   fm_filectls_hide();
3ad4db 555   $('.codeeditor-space').show();
U 556   $('.code-editor-container').show();
42fece 557   fm_code_edit(content, mode);  
7d8ef6 558   openEditor = 'text';
U 559 }
560
561 function fm_dok_edit(content) {
562   fm_filectls_hide();
0c1d5b 563   fm_dok_editor_init(userid);
7d8ef6 564   $("#mce-editor").show();
be9b6d 565   
U 566   window.clearTimeout(tmo2);
567   tmo2 = window.setTimeout(function () {
568     try {
569       ed.setContent(content);
570       openEditor = 'dok';  
571     } catch (err) {
572     }
573   }, 200);
3ad4db 574 }
U 575
305573 576 function fm_filectls_hide() {
U 577   $('#zentrum_bc').hide();
578   $('#dateien').hide();
547755 579   $('#editMenu').addClass('disabled');
305573 580 }
U 581
582 function fm_filectls_show() {
583   $('#zentrum_bc').show();
584   $('#dateien').show();  
547755 585   $('#editMenu').removeClass('disabled');
305573 586 }
b7475d 587 /* ----- API Calls ------------- */
U 588
c509a0 589
2121cc 590
fc8db1 591 function fm_view_file() {
U 592   // http://localhost:8080/file-cms/ui/#  
593   // http://localhost:8080/file-cms/data/admin/usw.
594   
595   var userid = $('#userMenu').text();
596   var gewaehlte = $('.datei-gewaehlt');
597   var fname = $(gewaehlte[0]).text();
0c1d5b 598   
U 599   var path = fm_get_path(userid);
600   
601   window.open(path + '/' + fname, '_blank');
fc8db1 602 }
U 603
977e5d 604 function fm_view_slideshow() {
U 605   
606   // https://localhost:8443/file-cms/fotos/?o=ulrich/bilder/diashow/ordnername
607
608   
609   var userid = $('#userMenu').text();
610   var gewaehlte = $('.datei-gewaehlt');
611   var fname = $(gewaehlte[0]).text();
612   
613   var path = fm_get_path(userid);
614   var restdir = path;
615   if(path.indexOf('/data/') > -1) {
616     restdir = path.substr('/data/'.length);
617   }
618   
619   //window.open('/file-cms/fotos/?o=' + userid + '/' + path + '/' + fname, '_blank');
620   window.open('/file-cms/fotos/?o=' + restdir + '/' + fname, '_blank');
621 }
622
8446c2 623 function fm_menu_datei_umbenennen() {
U 624   var gewaehlte = $('.datei-gewaehlt');
625   var fname = $(gewaehlte[0]).text();
663ee9 626
U 627   $('#modal_ok').click(function() {
628     // hier umbenennen
50bb41 629     fm_rename_file(fname, pfad, $('#dateiname').val());
663ee9 630   });
U 631   $('#saveModalTitle').text('Datei umbenennen');
632   $('#dialogfrage').text("Neuer Dateiname?");  
633
634   if(fname !== undefined) {
635     $('#dateiname').val(fname);
636     $('#dateiname').attr('placeholder', 'Dateiname');
637     $('#saveModal').modal({
638       keyboard: false,
639       show: true
640     });
641   }
642 }
643
6bd2c1 644 function fm_menu_datei_entpacken() {
U 645   var gewaehlte = $('.datei-gewaehlt');
646   var fname = $(gewaehlte[0]).text();
647   fm_unzip_file(fname);
648 }
649
af9930 650 /**
U 651  * Anname: Man ist in dem Ordner, der gepackt werden soll.
652  * Dann ist das Archiv anschliessend im Eltern-Ordner.
653  */
654 function fm_menu_ordner_packen() {
655   //var gewaehlte = $('.datei-gewaehlt');
656   //var fname = $(gewaehlte[0]).text();
657   //console.log("Pfad: " + pfad + ", Datei: " + fname);
658   fm_pack_folder();
659 }
660
7165a1 661 /*
U 662  * Hier merkt sich die Dateiverwalting die markierten Dateien fuer 
663  * eine Dateioperation. Bei cut wird in der 'paste' Operation auf dem Server 
664  * fuer die 'gemerkten' Dateien ein Move gemacht. Die Dateien werden 
665  * vom gewaehlten Ort zum Zielort verschoben.
666  * 
667  * @returns {undefined}
668  */
669 function fm_cut_files() {
670   cutCopySrcDir = pfad;
671   cutCopyFiles = fm_gewaehlte_dateien();
672   cutCopyOperation = 'cut';
673 }
674
675 /*
676  * Hier merkt sich die Dateiverwalting die markierten Dateien fuer 
677  * eine Dateioperation. Bei copy wird in der 'paste' Operation auf dem Server 
678  * fuer die 'gemerkten' Dateien eine Kopie gemacht. Die Dateien werden 
679  * am gewaehlten Ort behalten und am Zielort wird eine Kopier der 
680  * gewaehlten DAteien erstellt
681  * 
682  * @returns {undefined}
683  */
684 function fm_copy_files() {
685   cutCopySrcDir = pfad;
686   cutCopyFiles = fm_gewaehlte_dateien();
9e2964 687   cutCopyOperation = 'copy';
7165a1 688 }
U 689
fc1897 690
10d3d3 691 function fm_render_list(fl) {
U 692   if(modus == 'kacheln') {
693     // Kachelansicht
7d8ef6 694     var template = $('#tpl-kacheln').html();
U 695     Mustache.parse(template);   // optional, speeds up future uses
696     $('.datei-zeile').attr('onclick','').unbind('click');
697     $('#dateien').empty();
698     $('#dateien').html(Mustache.render(template, fl));
699     $('.figure').click(fm_dateiwahl);
700   } else {
701     // Listenansicht
702     var template = $('#tpl-liste').html();
703     Mustache.parse(template);   // optional, speeds up future uses
704     $('.figure').attr('onclick','').unbind('click');
705     $('#dateien').empty();
706     $('#dateien').html(Mustache.render(template, fl));
707     $('.datei-zeile').click(fm_dateiwahl);
708   }
709   /*
710   if(modus == 'kacheln') {
711     // Kachelansicht
a3d410 712     $.get('tpl-kacheln.txt', function(template) {
U 713       $('#dateien').empty();
714       $('#dateien').html(Mustache.render(template, fl));
715       $('.figure').click(fm_dateiwahl);
716     });
10d3d3 717     $('.datei-zeile').attr('onclick','').unbind('click');
U 718   } else {
719     // Listenansicht
a3d410 720     $.get('tpl-liste.txt', function(template) {
U 721       $('#dateien').empty();
722       $('#dateien').html(Mustache.render(template, fl));
723       $('.datei-zeile').click(fm_dateiwahl);
724     });
10d3d3 725     $('.figure').attr('onclick','').unbind('click');
U 726   }
7d8ef6 727   */
10d3d3 728 }
U 729
a75859 730 function fm_menu_datei_speichern(callback) {
5ebb8e 731   //var fname = $('.datei-gewaehlt').text();
U 732   var fname = openFileName;
733   if(fname !== undefined && fname !== '') {
a75859 734     fm_save_file(fname, 'saveTextFile', callback);
5ebb8e 735   } else {
a75859 736     fm_menu_datei_speichern_unter(callback);
5ebb8e 737   }
U 738 }
739
740
a75859 741 function fm_menu_datei_speichern_unter(callback) {  
915927 742   $('#modal_ok').click(function() {
a75859 743     $('#modal_ok').attr('onclick','').unbind('click');
915927 744     // hier speichern
a75859 745     fm_save_file($('#dateiname').val(), 'saveTextFileAs', callback);
915927 746   });
957b51 747   $('#saveModalTitle').text('Datei speichern');
c509a0 748   $('#dialogfrage').text("Dateiname?");
3ad4db 749   
U 750   var fname = $('.datei-gewaehlt').text();
751   if(fname !== undefined) {
752     $('#dateiname').val(fname);
753   } else {
754     $('#dateiname').val('');
755   }
c509a0 756   $('#dateiname').attr('placeholder', 'Dateiname');
915927 757   $('#saveModal').modal({
U 758     keyboard: false,
759     show: true
760   });
a4d3b5 761 }
U 762
b7475d 763
U 764
a4d3b5 765 /* ---- codemirror editor handling -------- */
U 766
64d8b9 767 /*
942d63 768 function htmlDecode(value){ 
U 769   return $('<div/>').html(value).text(); 
770 }
64d8b9 771 */
942d63 772
42fece 773 function fm_code_edit(content, m) {
a4d3b5 774   cm = CodeMirror.fromTextArea(document.getElementById("editspace"), {
U 775     lineNumbers: true,
6413b4 776     lineWrapping: true,
e3043f 777     gutters: ["CodeMirror-linenumbers", "breakpoints"],
42fece 778     mode: m,
a4d3b5 779     viewportMargin : Infinity,
d920b7 780     tabSize: 2,
a4d3b5 781     extraKeys: {
915927 782         "F9": function(cm) {
U 783         cm.setOption("fullScreen", !cm.getOption("fullScreen"));
784       },
785         "Esc": function(cm) {
786         if (cm.getOption("fullScreen")) cm.setOption("fullScreen", false);
7ad1b7 787       },
U 788         ".": function(cm) {
789         console.log('dot pressed: perhaps look up class or method name');
3b7c5b 790         /*
U 791          * Hier kann man eine Funktion ausloesen, die fuer das 
792          * Wort vor dem Punkt (Name der Klasse) eine Liste mit 
793          * Vorschlaegen fuer Methodennamen einblendet.
794          */
795         
796         /*
797          * CodeMirror.Pass laesst das Zeichen zum Editorinhalt durch, 
798          * verhindert aber das Ausloesen von 'keyHandled'
799          */
800         return CodeMirror.Pass; 
915927 801       }
a4d3b5 802     }
U 803   });
fab80c 804   //cm.setValue(htmlDecode(content));
U 805   //cm.setValue(content);
806   cm.setValue(unescapeHtml(content));
3003b2 807   cm.getDoc().markClean();
e3043f 808   cm.on("gutterClick", function(theEditor, lineNumber) {
U 809     var info = theEditor.lineInfo(lineNumber);
810     //--lineNumber;
811     //console.log(info.gutterMarkers.breakpoints.message);
812     //var marker = info.gutterMarkers.breakpoints;
813     //$(marker).tooltip('toggle');
814   });
3b7c5b 815   /*
7ad1b7 816   cm.on("keyHandled", function(theEditor, keyName, event){
3b7c5b 817     console.log('cm.keyHandled keyName: ' + keyName + ', event.type: ' + event.type);    
7ad1b7 818   });
3b7c5b 819   */
e3043f 820 }
U 821
822 function makeMarker(msg) {
823   var marker = document.createElement("div");
824   marker.style.color = "#822";
825   marker.innerHTML = "●";
826   //marker.message = msg;
827   $(marker).tooltip({
828     placement: 'right',
829     title: msg,
ed12de 830     offset: '0 -30'
e3043f 831   });
U 832   return marker;
915927 833 }
a4d3b5 834
U 835 /* -------- helper functions ----------- */
836
e5ff42 837 function fm_serialise(obj) {
U 838   return '{"' + obj.constructor.name + '":' + JSON.stringify(obj) + '}';
915927 839 }
e5ff42 840
fab80c 841 function escapeHtml(text) {
U 842   text = text.replace(/\u228/g,'&auml;');
843   text = text.replace(/\u246/g,'&ouml;');
844   text = text.replace(/\u252/g,'&uuml;');
845   text = text.replace(/\u196/g,'&Auml;');
846   text = text.replace(/\u214/g,'&Ouml;');
847   text = text.replace(/\u220/g,'&Uuml;');
848   text = text.replace(/\u223/g,'&szlig;');
849   text = text.replace(/\u26/g,'&amp;');
850   return text;
851 }
852
853 function unescapeHtml(text) {
854   text = text.replace(/&auml;/g, String.fromCharCode(228));
855   text = text.replace(/&ouml;/g, String.fromCharCode(246));
856   text = text.replace(/&uuml;/g, String.fromCharCode(252));
857   text = text.replace(/&Auml;/g, String.fromCharCode(196));
858   text = text.replace(/&Ouml;/g, String.fromCharCode(214));
859   text = text.replace(/&Uuml;/g, String.fromCharCode(220));
860   text = text.replace(/&szlig;/g, String.fromCharCode(223));
861   text = text.replace(/&amp;/g, String.fromCharCode(26));
862   return text;
863 }
864
7aa566 865