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