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