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