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