Dateiverwaltung für die WebBox
ulrich
2017-03-14 e3043fddcaf5e3ea4beb022c04d411661a3499bd
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";
e3043f 34 var compilerIssues;
c7c502 35
U 36 function fm_init() {
305573 37   $("#mce-editor").hide();
a4d3b5 38   $('.codeeditor-space').hide();
U 39   $('.code-editor-container').hide();
bef5c6 40   //$('.ost').attr('flex-basis', 0);
a4d3b5 41   $('#newTextFile').on('click', fm_menu_neue_textdatei);
305573 42   $('#newDoc').on('click', fm_menu_neues_dokument);
adf812 43   $('#newFolder').on('click', fm_get_new_folder);
fc8db1 44   $('#viewFile').on('click', fm_view_file);
7d8ef6 45   $('#editTextFile').on('click', function() {
U 46     fm_get_file_content('text');
47   });
48   $('#editDocFile').on('click', function() {
49     fm_get_file_content('dok');
50   });
e5ff42 51   $('#saveFile').on('click', fm_menu_datei_speichern);
5ebb8e 52   $('#saveFileAs').on('click', fm_menu_datei_speichern_unter);
a4d3b5 53   $('#closeFile').on('click', fm_menu_datei_schliessen);
8446c2 54   $('#renameFile').on('click', fm_menu_datei_umbenennen);
fc1897 55   $('#m-del').on('click', fm_menu_delete);
7165a1 56   $('#m-cut').on('click', fm_menu_cut);
U 57   $('#m-copy').on('click', fm_menu_copy);
58   $('#m-paste').on('click', fm_menu_paste);
438b16 59   $('#m-shrink').on('click', fm_menu_shrink);
bef5c6 60   $('#m-test').on('click', fm_menu_test);
0ac262 61   $('#m-test-2').on('click', fm_menu_test_2);
c509a0 62   $('#saveModal').on('hidden.bs.modal', function (e) {
915927 63     $('#modal_ok').attr('onclick','').unbind('click');
b7475d 64   });
U 65   $('#logout').click(fm_logout);  
05cfa7 66   fm_get_login();
7342b1 67   fm_get_list('');
7aa566 68   fm_init_uploader();
fa012b 69   /*
U 70   console.log('href: ' + window.location.href);
71   console.log('host: ' + window.location.host);
72   console.log('hostname: ' + window.location.hostname);
73   console.log('port: ' + window.location.port);
74   console.log('protocol: ' + window.location.protocol);
75   */
76   loc = window.location.protocol + '//' + window.location.host;
fc8db1 77 }
U 78
0c1d5b 79 function fm_resize_editor() {
U 80   window.clearTimeout(tmo);
81   tmo = window.setTimeout(function () {
82     try {
83       var myHeight = $('.zentrum').height() - $('.nord').height() - 4;
84       ed.theme.resizeTo('100%', myHeight);  // sets the dimensions of the editable area
85     } catch (err) {
86     }
87   }, 200);
fc8db1 88 }
U 89
0c1d5b 90 function fm_get_path(uid) {
U 91   //console.log('pfad: ' + pfad);
92   var restdir;
cccd2b 93   if(pfad.indexOf(PUB_DIR) > -1) {
U 94     restdir = pfad.substr(PUB_DIR.length);
95   } else if(pfad.indexOf(PERS_DIR) > -1) {
96     restdir = pfad.substr(PERS_DIR.length);
0c1d5b 97   }
U 98   if(restdir !== undefined && restdir.startsWith('/')) {
99     restdir = restdir.substr(1);
100   }
101   var pdir = fm_get_base(uid);
102   //console.log('path: ' + pdir + "/" + restdir);
103   if(restdir.length > 1) {
104     return pdir + "/" + restdir;
105   } else {
106     return pdir;
107   }
108 }
109
110 function fm_get_base(uid) {
111   //console.log('pfad: ' + pfad);
112   var pdir;
cccd2b 113   if(pfad.indexOf(PUB_DIR) > -1) {
0c1d5b 114     pdir = '/data/';
cccd2b 115   } else if(pfad.indexOf(PERS_DIR) > -1) {
0c1d5b 116     pdir = '/home/';
U 117   }
118   //console.log('base: ' + pdir + uid);
119   return pdir + uid;
120 }
05cfa7 121
0c1d5b 122 function fm_dok_editor_init(uid) {
U 123   var base = fm_get_path(uid);
a75859 124   edCount = 0;
0c1d5b 125   //console.log("calling tinymce.init with base: " + base + "/");
fc8db1 126   
0c1d5b 127   /*
U 128    * vgl.
129    * http://stackoverflow.com/questions/4651676/how-do-i-remove-tinymce-and-then-re-add-it
130    */
131   //tinymce.EditorManager.execCommand('mceRemoveControl',true, 'textarea.text-editor');
132   //tinymce.EditorManager.execCommand('mceAddControl',true, editor_id);
133   if(ed !== undefined) {
134     ed.destroy();
135   }
136   tinymce.remove('textarea.text-editor');
137   tinymce.EditorManager.editors = []; 
305573 138   
U 139   /*
140    * Konfiguration TinyMCE
141    */
142   tinymce.init({
547755 143     content_css : "/file-cms/ui/mce.css",
7b7627 144     //content_css: "/jslib/bootstrap/css/bootstrap.min.css",
7d8ef6 145     selector: "textarea.text-editor",
305573 146     statusbar: false,
U 147     menubar: false,
ea1ae0 148     plugins: 'advlist charmap code image link lists media print preview save table textcolor importcss',
7d8ef6 149     toolbar: 'undo redo | styleselect | image | link unlink | bullist numlist | outdent indent | code',
305573 150     /*
U 151     menu: {
152       file: {title: 'File', items: 'savevers | exit'},
153       edit: {title: 'Edit', items: 'undo redo | cut copy paste pastetext | selectall'},
154       view: {title: 'View', items: 'visualaid | code | link image media | template hr'},
155     },
156     */
0c1d5b 157     resize: 'both',
ea1ae0 158     importcss_append: true,
305573 159     width: "100%",
U 160     height: '100%',
0c1d5b 161     document_base_url : base + "/",
305573 162     setup: function (editor) {
U 163       ed = editor;
164     }
165   });
0c1d5b 166   
U 167   $(window).on('resize', fm_resize_editor);
168   fm_resize_editor();
10d3d3 169 }
7aa566 170
U 171 /* ----- Uploader Anfang ----------*/
172
173 var dateien = new Array();
174
175 function fm_init_uploader() {
176   var dropzone = document.getElementById("dateien");  
177   dropzone.ondragover = dropzone.ondragenter = function(event) {  
178     event.stopPropagation();  
179     event.preventDefault();  
180   };
181
182   dropzone.ondrop = function(event) {  
183     event.stopPropagation();  
184     event.preventDefault();  
7ebde1 185     var fileList = event.dataTransfer.files;  
U 186     for (var i=0; i<fileList.length; i++) {  
187       dateien.push(fileList[i]);
188     }
189     sendFile(dateien.pop());
7aa566 190   };
U 191 }
192
193 function sendFile(datei) {
7ebde1 194   var uri = "../api/upload";
7aa566 195   var xhr = new XMLHttpRequest();  
U 196   var fd = new FormData();  
197   xhr.open("POST", uri, true);  
198   xhr.onreadystatechange = function() {  
199     if (xhr.readyState == 4 && xhr.status == 200) {  
200       fm_get_list(pfad);
7ebde1 201       if(dateien.length > 0) {
U 202         sendFile(dateien.pop());
203       }
7aa566 204     }  
U 205   };  
7ebde1 206   fd.append('dateiauswahlfeld', datei);  
42fece 207   fd.append('pfad', pfad);
7aa566 208   xhr.send(fd);          
U 209 }
210
211 /* ----- Uploader Ende --------------- */
10d3d3 212
7165a1 213 /* ------- Dateifunktionen Start ----------- */
U 214
215 function fm_menu_cut() {
98f088 216   //alert('fm_menu_cut');
U 217   fm_cut_files();
7165a1 218 }
U 219 function fm_menu_copy() {
98f088 220   //alert('fm_menu_copy');
U 221   fm_copy_files();
7165a1 222 }
U 223 function fm_menu_paste() {
98f088 224   //alert('fm_menu_paste');
U 225   fm_paste_files();
7165a1 226 }
fc1897 227 function fm_menu_delete() {
U 228   $('#confirmOk').click(function() {
a75859 229     $('#confirmOk').attr('onclick','').unbind('click');
fc1897 230     fm_del_files();
U 231   });
a75859 232   $('#confirmOk').text("Loeschen");
U 233   $('#confirmOk').removeClass('btn-primary');
234   $('#confirmOk').addClass('btn-danger');
235   $('#confirmClose').hide();
957b51 236   $('#confirmModalTitle').text("Löschen");
U 237   $('#confirmModalBody').text("Wirklich löschen?");
fc1897 238   $('#confirmModal').modal({
U 239     keyboard: false,
240     show: true
241   });
242 }
7165a1 243
U 244 /*
245  * Gewaehlte Dateien feststellen
246  * 
247  * @returns {String} eine per JSON.stringify schon vorbereitete List zum 
248  * Absenden als Parameter an den Server
249  */
250 function fm_gewaehlte_dateien() {
251   var gewaehlte = $('.datei-gewaehlt');
252   //console.log('anzahl: ' + gewaehlte.length);
253   var fnames = new Array();
254   var i = 0;
255   while(i < gewaehlte.length) {
256     var str = { "java.lang.String": $(gewaehlte[i]).text()};
257     fnames.push(str);
258     //console.log('loeschen ' + pfad + ' ' + $(gewaehlte[i]).text());
259     //i += 2;
260     i++;
261   }
262   var liste = '{"List":' + JSON.stringify(fnames) + '}';
263   // 'liste' enthaelt:
264   // {"List":[{"java.lang.String":"test3.txt"},{"java.lang.String":"Test1.txt"},{"java.lang.String":"Test2.txt"}]}
265   // und wird auf dem Server zu einer List[ArrayList<String>] bei der jede ArrayList<String> nur ein Element hat 
266   return liste;
267 }
268 /* --------- Dateifunktionen Ende ---------- */
fc1897 269
bef5c6 270 function fm_menu_test() {
U 271   var w = $('.ost').width();
272   if(w == 0) {
273     $('.ost').width('20%');
274     $('.ost').text('Hallo Welt!');
275   } else {
276     $('.ost').empty();
277     $('.ost').width(0);
278   }
279 }
280
0ac262 281 function fm_menu_test_2() {
U 282   var liste = fm_gewaehlte_dateien();
283   var m = '?c=de.uhilger.filecms.api.CompileService&m=compile&p=' + pfad + '&p=' + encodeURIComponent(liste);
284   var u = '../svc' + m;
e3043f 285   fm_get(u, "json", function(resp) {
U 286     cm.clearGutter("breakpoints");
287     
288     if(resp.List[0].CompilerIssue !== undefined) {
289       if(resp.List[0].CompilerIssue instanceof Array) {
290         var issueNo = 0;
291         while(issueNo < resp.List[0].CompilerIssue.length) {
292           // console.log(resp.List[0].CompilerIssue[issueNo].kind);
293           // console.log(resp.List[0].CompilerIssue[issueNo].lineNumber);
294           // console.log(resp.List[0].CompilerIssue[issueNo].sourceName);
295           // console.log(resp.List[0].CompilerIssue[issueNo].message);
296           fm_set_code_marker(resp.List[0].CompilerIssue[issueNo].lineNumber, resp.List[0].CompilerIssue[issueNo].kind + ' ' + resp.List[0].CompilerIssue[issueNo].message);
297           issueNo++;
298         }
299       } else {
300         fm_set_code_marker(resp.List[0].CompilerIssue.lineNumber, resp.List[0].CompilerIssue.kind + ' ' + resp.List[0].CompilerIssue.message);
301       }
302     }
0ac262 303   });
U 304 }
305
10d3d3 306 function fm_ansicht_umschalten() {
U 307   if($('#ansicht').children(0).hasClass('fa-th-list')) {
308     $('#ansicht').children(0).addClass('fa-th-large');
309     $('#ansicht').children(0).removeClass('fa-th-list');
310     modus = 'liste';
311   } else {
312     $('#ansicht').children(0).addClass('fa-th-list');    
313     $('#ansicht').children(0).removeClass('fa-th-large');
314     modus = 'kacheln';
315   }
316   fm_get_list(pfad);
317 }
318
319 function fm_set_modus() {
320   if(modus == 'kacheln') {
321     $('#ansicht').children(0).addClass('fa-th-list');    
322     $('#ansicht').children(0).removeClass('fa-th-large');  
323   } else {
324     $('#ansicht').children(0).addClass('fa-th-large');
325     $('#ansicht').children(0).removeClass('fa-th-list');    
326   }
a4d3b5 327 }
U 328
329 function fm_menu_neue_textdatei() {
adf812 330   fm_text_edit('Neue Datei');
a4d3b5 331 }
U 332
305573 333 function fm_menu_neues_dokument() {
7d8ef6 334   fm_dok_edit('');
305573 335 }
U 336
a4d3b5 337 function fm_menu_datei_schliessen() {
3003b2 338   if(openEditor === 'text') {
U 339     if(!cm.getDoc().isClean()) {
340       fm_ask_for_save();
341     } else {
342       fm_do_close();
343     }
344   } else {
345     if(tinymce.activeEditor.undoManager.hasUndo()) {
346       fm_ask_for_save();
347     } else {
348       fm_do_close();
349     }
350   }
351 }
352
353 function fm_ask_for_save() {
354   // hier Abfrage ob gespeichert werden soll    
355   $('#confirmOk').click(function() {
356     $('#confirmOk').attr('onclick','').unbind('click');
357     fm_menu_datei_speichern(function() {
a75859 358       fm_do_close();
U 359     });
3003b2 360   });
U 361   $('#confirmCancel').click(function() {
362     $('#confirmCancel').attr('onclick','').unbind('click');
363   });
364   $('#confirmClose').show();
365   $('#confirmClose').click(function() {
366     $('#confirmClose').attr('onclick','').unbind('click');
a75859 367     fm_do_close();
3003b2 368   });
U 369   $('#confirmOk').text("Speichern");
370   $('#confirmOk').addClass('btn-primary');
371   $('#confirmOk').removeClass('btn-danger');
372   $('#confirmModalTitle').text("Schliessen");
373   $('#confirmModalBody').text("Speichern vor dem Schliessen?");
374   $('#confirmModal').modal({
375     keyboard: false,
376     show: true
377   });
a75859 378 }
U 379
380 function fm_do_close() {
a4d3b5 381   $('.codeeditor-space').hide();
U 382   $('.code-editor-container').hide();
305573 383   $("#mce-editor").hide();
U 384   if(cm !== undefined) {
385     cm.toTextArea();
386   }
5ebb8e 387   openFileName = '';
7d8ef6 388   openEditor = '';
adf812 389   fm_get_list(pfad);
305573 390   fm_filectls_show();
e5ff42 391 }
U 392
17919c 393 function fm_dateiwahl(ev) {
5dfab6 394   var elem = this;
17919c 395   //console.log('dateiwahl nach click, event shift: ' + ev.shiftKey + ", event ctrl: " + ev.ctrlKey);
10d3d3 396   if(modus == 'kacheln') {
957b51 397     // Kacheln
10d3d3 398     if($(elem).children(0).hasClass('fa-folder')) {
957b51 399       if(/*ev.shiftKey || */ ev.ctrlKey) {
U 400         $(elem).find('.dateiname').addClass('datei-gewaehlt');
10d3d3 401       } else {
957b51 402         var ordner = $(elem).text().trim();
U 403         if(pfad.length > 0) {
404           pfad = pfad + '/' + ordner;
405         } else {
406           pfad = ordner;
407         }
408         fm_get_list(pfad);
10d3d3 409       }
7f2a41 410     } else if($(elem).children(0).hasClass('datei')) {
17919c 411       if(/*ev.shiftKey || */ ev.ctrlKey) {
U 412         // mehrere Dateien sollen gewaehlt werden
413       } else {
414         $('.datei-gewaehlt').removeClass('datei-gewaehlt');        
415       }
957b51 416       $(elem).find('.dateiname').addClass('datei-gewaehlt');
5dfab6 417     } else {
10d3d3 418       //console.log('kein folder oder file...');
5dfab6 419     }
U 420   } else {
957b51 421     // Liste
10d3d3 422     if($(elem).find('.datei-elem').children(0).hasClass('fa-file-o')) {
957b51 423       // Datei
17919c 424       if(/*ev.shiftKey || */ ev.ctrlKey) {
U 425         // mehrere Dateien sollen gewaehlt werden
426       } else {
427         $('.table-info').removeClass('table-info');
957b51 428         $('.datei-gewaehlt').removeClass('datei-gewaehlt');
17919c 429       }
10d3d3 430       $(elem).addClass('table-info');
U 431       $(elem).find('.dateiname').addClass('datei-gewaehlt');
432     } else {
957b51 433       // Ordner
U 434       if(/*ev.shiftKey || */ ev.ctrlKey) {
435         $(elem).children(0).addClass('datei-gewaehlt');
10d3d3 436       } else {
957b51 437         var ordner = $(elem).find('.dateiname').text();
U 438         if(pfad.length > 0) {
439           pfad = pfad + '/' + ordner;
440         } else {
441           pfad = ordner;
442         }
443         fm_get_list(pfad);
10d3d3 444       }
U 445     }   
5dfab6 446   }
c509a0 447 }
U 448
a94216 449 function fm_bc_click() {
U 450   var elem = this;
451   var bcPfad = $(elem).attr('rpath');
452   if(bcPfad !== undefined) {
c509a0 453     pfad = bcPfad;
a94216 454     fm_get_list(bcPfad);
U 455   } else {
456     pfad = '';
457     fm_get_list('');
458   }
459 }
460
42fece 461 function fm_text_edit(content, mode) {
305573 462   fm_filectls_hide();
3ad4db 463   $('.codeeditor-space').show();
U 464   $('.code-editor-container').show();
42fece 465   fm_code_edit(content, mode);  
7d8ef6 466   openEditor = 'text';
U 467 }
468
469 function fm_dok_edit(content) {
470   fm_filectls_hide();
0c1d5b 471   fm_dok_editor_init(userid);
7d8ef6 472   $("#mce-editor").show();
be9b6d 473   
U 474   window.clearTimeout(tmo2);
475   tmo2 = window.setTimeout(function () {
476     try {
477       ed.setContent(content);
478       openEditor = 'dok';  
479     } catch (err) {
480     }
481   }, 200);
3ad4db 482 }
U 483
305573 484 function fm_filectls_hide() {
U 485   $('#zentrum_bc').hide();
486   $('#dateien').hide();
547755 487   $('#editMenu').addClass('disabled');
305573 488 }
U 489
490 function fm_filectls_show() {
491   $('#zentrum_bc').show();
492   $('#dateien').show();  
547755 493   $('#editMenu').removeClass('disabled');
305573 494 }
b7475d 495 /* ----- API Calls ------------- */
U 496
0c1d5b 497 function fm_get_login() {
3ad4db 498   var m = '?c=de.uhilger.filecms.pub.SessionManager&m=getSessionUser';
U 499   var u = '../pub' + m;
500   fm_get(u, "text", function(resp) {
0c1d5b 501     userid = resp;
3ad4db 502     $('#userMenu').text(resp);
7342b1 503   });  
c509a0 504 }
U 505
506 function fm_get_new_folder() {
507   $('#modal_ok').click(function() {
508     // hier speichern
509     var m = '?c=de.uhilger.filecms.api.FileMgr&m=newFolder&p=' + pfad + '&p=' + $('#dateiname').val();
510     var u = '../svc' + m;
511     fm_get(u, "json", function(resp) {
adf812 512       fm_get_list(pfad);
c509a0 513     });
U 514   });
957b51 515   $('#saveModalTitle').text('Neuer Ordner');
c509a0 516   $('#dialogfrage').text("Name?");
U 517   $('#dateiname').val('');
518   $('#dateiname').attr('placeholder', 'Ordnername');
519   $('#saveModal').modal({
520     keyboard: false,
521     show: true
522   });
7342b1 523 }
U 524
7d8ef6 525 function fm_get_file_content(typ) {
fc1897 526   var gewaehlte = $('.datei-gewaehlt');
957b51 527   //var fname = $(gewaehlte).find('.dateiname').text();
U 528   
529   var fname = $(gewaehlte[0]).text();
5ebb8e 530   openFileName = fname;
3ad4db 531   var m = '?c=de.uhilger.filecms.api.FileMgr&m=getCode&p=' + pfad + '&p=' + fname;
2121cc 532   var u = '../svc' + m;
3ad4db 533   fm_get(u, "text", function(resp) {
7d8ef6 534     if(typ == 'text') {
42fece 535       var mode = "text/x-java";
U 536       if(fname.endsWith('js')) {
537         mode = 'javascript';
538       } else if(fname.endsWith('xml')) {
539         mode = 'xml';
540       } else if(fname.endsWith('properties')) {
541         mode = 'xml';
542       }
543       fm_text_edit(resp, mode);
7d8ef6 544     } else {
U 545       fm_dok_edit(resp);
546     }
2121cc 547   });
3ad4db 548   
2121cc 549 }
U 550
fc8db1 551 function fm_view_file() {
U 552   // http://localhost:8080/file-cms/ui/#  
553   // http://localhost:8080/file-cms/data/admin/usw.
554   
555   var userid = $('#userMenu').text();
556   var gewaehlte = $('.datei-gewaehlt');
557   var fname = $(gewaehlte[0]).text();
0c1d5b 558   
U 559   var path = fm_get_path(userid);
560   
561   window.open(path + '/' + fname, '_blank');
fc8db1 562 }
U 563
8446c2 564 function fm_menu_datei_umbenennen() {
U 565   var gewaehlte = $('.datei-gewaehlt');
566   var fname = $(gewaehlte[0]).text();
663ee9 567
U 568   $('#modal_ok').click(function() {
569     // hier umbenennen
570     fm_rename_file(fname, pfad, $('#dateiname').val())
571   });
572   $('#saveModalTitle').text('Datei umbenennen');
573   $('#dialogfrage').text("Neuer Dateiname?");  
574
575   if(fname !== undefined) {
576     $('#dateiname').val(fname);
577     $('#dateiname').attr('placeholder', 'Dateiname');
578     $('#saveModal').modal({
579       keyboard: false,
580       show: true
581     });
582   }
583 }
584
585 function fm_rename_file(fn, p, neuerName) {
586   var m = '?c=de.uhilger.filecms.api.FileMgr&m=renameFile';
587   m = m + '&p=' + p; 
588   m = m + '&p=' + fn; 
589   m = m + '&p=' + neuerName; 
590   var u = '../svc' + m;
591   fm_get(u, "text", function(resp) {
592     fm_get_list(pfad);
593   });  
8446c2 594 }
U 595
438b16 596 function fm_menu_shrink() {
U 597   var gewaehlte = $('.datei-gewaehlt');
598   var fname = $(gewaehlte[0]).text();
599   var m = '?c=de.uhilger.filecms.api.FileMgr&m=bildVerkleinern';
600   m = m + '&p=' + pfad; 
601   m = m + '&p=' + fname; 
602   var u = '../svc' + m;
603   fm_get(u, "text", function(resp) {
604     fm_get_list(pfad);
605   });  
606 }
607
7165a1 608 /*
U 609  * Hier merkt sich die Dateiverwalting die markierten Dateien fuer 
610  * eine Dateioperation. Bei cut wird in der 'paste' Operation auf dem Server 
611  * fuer die 'gemerkten' Dateien ein Move gemacht. Die Dateien werden 
612  * vom gewaehlten Ort zum Zielort verschoben.
613  * 
614  * @returns {undefined}
615  */
616 function fm_cut_files() {
617   cutCopySrcDir = pfad;
618   cutCopyFiles = fm_gewaehlte_dateien();
619   cutCopyOperation = 'cut';
620 }
621
622 /*
623  * Hier merkt sich die Dateiverwalting die markierten Dateien fuer 
624  * eine Dateioperation. Bei copy wird in der 'paste' Operation auf dem Server 
625  * fuer die 'gemerkten' Dateien eine Kopie gemacht. Die Dateien werden 
626  * am gewaehlten Ort behalten und am Zielort wird eine Kopier der 
627  * gewaehlten DAteien erstellt
628  * 
629  * @returns {undefined}
630  */
631 function fm_copy_files() {
632   cutCopySrcDir = pfad;
633   cutCopyFiles = fm_gewaehlte_dateien();
9e2964 634   cutCopyOperation = 'copy';
7165a1 635 }
U 636
637 /*
638  * Hier wird fuer eine zuvor markierte Liste von Dateien, fuer die 
639  * Cut oder Copy gewaehlt wurde, die Operations ausgefuehrt (move oder copy)
640  * @returns {undefined}
641  */
642 function fm_paste_files() {
643   var m;
9e2964 644   if(cutCopyOperation === 'cut') {
U 645     //m = '?c=de.uhilger.filecms.api.FileMgr&m=moveFiles'; //&p=' + cutCopySrcDir + '&p=' + pfad + '&p=' + encodeURIComponent(liste);
646     m = '?c=de.uhilger.filecms.api.FileMgr&m=moveFiles&p=' + cutCopySrcDir + '&p=' + pfad + '&p=' + encodeURIComponent(cutCopyFiles);
7165a1 647   } else {
9e2964 648     //m = '?c=de.uhilger.filecms.api.FileMgr&m=copyFiles'; //&p=' + cutCopySrcDir + '&p=' + pfad + '&p=' + encodeURIComponent(liste);
U 649     m = '?c=de.uhilger.filecms.api.FileMgr&m=copyFiles&p=' + cutCopySrcDir + '&p=' + pfad + '&p=' + encodeURIComponent(cutCopyFiles);
fc1897 650   }
7165a1 651   var u = '../svc' + m;  
9e2964 652   fm_get(u, "text", function(resp) {
U 653     // console.log('deleteFiles gab folgendes zurueck: ' + resp);
654     fm_get_list(pfad);
655   });
656   /*
657   fm_post(u, {p1: encodeURIComponent(cutCopySrcDir), p2: encodeURIComponent(pfad), p3: encodeURIComponent(cutCopyFiles)},'text', function(resp) {
7165a1 658     // resp evtl. zeigen..
U 659     fm_get_list(pfad);
660   });
9e2964 661   */
7165a1 662 }
U 663
664 function fm_del_files() {
665   var liste = fm_gewaehlte_dateien();
fc1897 666   var m = '?c=de.uhilger.filecms.api.FileMgr&m=deleteFiles&p=' + pfad + '&p=' + encodeURIComponent(liste);
U 667   var u = '../svc' + m;
668   fm_get(u, "text", function(resp) {
669     // console.log('deleteFiles gab folgendes zurueck: ' + resp);
670     fm_get_list(pfad);
671   });
672 }
673
10d3d3 674 function fm_render_list(fl) {
U 675   if(modus == 'kacheln') {
676     // Kachelansicht
7d8ef6 677     var template = $('#tpl-kacheln').html();
U 678     Mustache.parse(template);   // optional, speeds up future uses
679     $('.datei-zeile').attr('onclick','').unbind('click');
680     $('#dateien').empty();
681     $('#dateien').html(Mustache.render(template, fl));
682     $('.figure').click(fm_dateiwahl);
683   } else {
684     // Listenansicht
685     var template = $('#tpl-liste').html();
686     Mustache.parse(template);   // optional, speeds up future uses
687     $('.figure').attr('onclick','').unbind('click');
688     $('#dateien').empty();
689     $('#dateien').html(Mustache.render(template, fl));
690     $('.datei-zeile').click(fm_dateiwahl);
691   }
692   /*
693   if(modus == 'kacheln') {
694     // Kachelansicht
a3d410 695     $.get('tpl-kacheln.txt', function(template) {
U 696       $('#dateien').empty();
697       $('#dateien').html(Mustache.render(template, fl));
698       $('.figure').click(fm_dateiwahl);
699     });
10d3d3 700     $('.datei-zeile').attr('onclick','').unbind('click');
U 701   } else {
702     // Listenansicht
a3d410 703     $.get('tpl-liste.txt', function(template) {
U 704       $('#dateien').empty();
705       $('#dateien').html(Mustache.render(template, fl));
706       $('.datei-zeile').click(fm_dateiwahl);
707     });
10d3d3 708     $('.figure').attr('onclick','').unbind('click');
U 709   }
7d8ef6 710   */
10d3d3 711 }
U 712
7342b1 713 // http://localhost:8079/file-cms/svc?c=de.uhilger.filecms.api.FileMgr&f=JSONNICE&m=list&p=
a94216 714 function fm_get_list(relPfad) {
10d3d3 715   $('#ansicht').attr('onclick','').unbind('click');
a94216 716   var m = '?c=de.uhilger.filecms.api.FileMgr&m=list&p=' + relPfad;
7342b1 717   var u = '../svc' + m;
U 718   fm_get(u, "json", function(resp) {
10d3d3 719     
2121cc 720     if(resp.List[0].FileRef !== undefined) {
U 721       var files = new Array();
c509a0 722       if(resp.List[0].FileRef instanceof Array) {
U 723         for(var i = 0; i < resp.List[0].FileRef.length; i++) {
724           files.push(new FileRef(resp.List[0].FileRef[i]));
725         }
726       } else {
727         files.push(new FileRef(resp.List[0].FileRef));
2121cc 728       }
U 729       var fl = new FileList(files);
10d3d3 730       fm_render_list(fl);
2121cc 731     } else {
U 732       $('#dateien').empty();
7342b1 733     }
5dfab6 734     
10d3d3 735     // Breadcrumb-Ansicht
7d8ef6 736     var template;
a94216 737     $('.breadcrumb-item').attr('onclick','').unbind('click');
2315a0 738     $('#bcnav').empty();
5dfab6 739     var dirList = new Array();
U 740     var rp = '';
a94216 741     //console.log("'" + relPfad + "'");
U 742     var dirs = relPfad.split('/');
743     //console.log(dirs.length);
2121cc 744     dirList.push(new BcrFile(rp, 'Home'));
a94216 745     if(relPfad.length > 0) {
2315a0 746       for(var i = 0; i < dirs.length - 1; i++) {
5dfab6 747         if(rp.length > 0 ) {
U 748           dirList.push(new BcrFile(rp + '/' + dirs[i], dirs[i]));
2315a0 749           rp = rp + '/' + dirs[i];
5dfab6 750         } else {
U 751           dirList.push(new BcrFile(dirs[i], dirs[i]));
2315a0 752           rp = dirs[i];
5dfab6 753         }
U 754       }
755       var bl = new BcrFiles(dirList);
7d8ef6 756  
U 757       if(dirList.length > 0) {
758         template = $('#tpl-bcr').html();
759         Mustache.parse(template);   // optional, speeds up future uses
760         $('#bcnav').html(Mustache.render(template, bl));
2315a0 761       }
7d8ef6 762       
U 763       if(dirs.length > 0) {
764         dirList.push(new BcrFile(rp + '/' + dirs[dirs.length-1], dirs[dirs.length-1]));
765         template = $('#tpl-bcr2').html();
766         Mustache.parse(template);   // optional, speeds up future uses
767         $('#bcnav').append(Mustache.render(template, dirList[dirList.length-1]));        
768       } else {
769         template = $('#tpl-bcr2').html();
770         Mustache.parse(template);   // optional, speeds up future uses
771         $('#bcnav').append(Mustache.render(template, dirList[0]));        
772       }
773       
774       $('#bcnav').append($('#tpl-bcr3').html());
2315a0 775     } else {
a94216 776       pfad = '';
7d8ef6 777       template = $('#tpl-bcr2').html();
U 778       Mustache.parse(template);   // optional, speeds up future uses
779       $('#bcnav').append(Mustache.render(template, dirList[0]));   
780       $('#bcnav').append($('#tpl-bcr3').html());
5dfab6 781     }
7d8ef6 782     $('.breadcrumb-item').click(fm_bc_click);
U 783     $('#ansicht').click(fm_ansicht_umschalten);
784     fm_set_modus();
785   });
e5ff42 786 }
U 787
a75859 788 function fm_menu_datei_speichern(callback) {
5ebb8e 789   //var fname = $('.datei-gewaehlt').text();
U 790   var fname = openFileName;
791   if(fname !== undefined && fname !== '') {
a75859 792     fm_save_file(fname, 'saveTextFile', callback);
5ebb8e 793   } else {
a75859 794     fm_menu_datei_speichern_unter(callback);
5ebb8e 795   }
U 796 }
797
a75859 798 function fm_save_file(saveFileName, method, callback) {
7d8ef6 799   var content;
U 800   if(openEditor === 'text') {
801     content = cm.getValue();
3003b2 802     cm.getDoc().markClean();
7d8ef6 803   } else {
U 804     content = ed.getContent();
3003b2 805     tinymce.activeEditor.undoManager.clear();
7d8ef6 806   }
47e9d4 807   var m = '?c=de.uhilger.filecms.api.FileMgr&m=' + method;
5ebb8e 808   var u = '../svc' + m;
7d8ef6 809   fm_post(u, {p1: pfad, p2: saveFileName, p3: content}, function(resp) {
a75859 810     // hier scheint nichts zurueckzukommen..
5ebb8e 811   });
a75859 812   openFileName = saveFileName;
3003b2 813   if(typeof (callback) !== 'function') {
U 814     
815   } else {
a75859 816     callback();
U 817   }
5ebb8e 818 }
U 819
a75859 820 function fm_menu_datei_speichern_unter(callback) {  
915927 821   $('#modal_ok').click(function() {
a75859 822     $('#modal_ok').attr('onclick','').unbind('click');
915927 823     // hier speichern
a75859 824     fm_save_file($('#dateiname').val(), 'saveTextFileAs', callback);
915927 825   });
957b51 826   $('#saveModalTitle').text('Datei speichern');
c509a0 827   $('#dialogfrage').text("Dateiname?");
3ad4db 828   
U 829   var fname = $('.datei-gewaehlt').text();
830   if(fname !== undefined) {
831     $('#dateiname').val(fname);
832   } else {
833     $('#dateiname').val('');
834   }
c509a0 835   $('#dateiname').attr('placeholder', 'Dateiname');
915927 836   $('#saveModal').modal({
U 837     keyboard: false,
838     show: true
839   });
a4d3b5 840 }
U 841
b7475d 842 function fm_logout() {
U 843   var m = '?c=de.uhilger.filecms.pub.SessionManager&m=expireSession';
844   var u = '../pub' + m;
845   
846   fm_get(u, "text", function(resp) {
847     $('#userMenu').text('nicht angemeldet');
848     window.location.href = '../logout.html';
849   });
850 }
851
852
a4d3b5 853 /* ---- codemirror editor handling -------- */
U 854
942d63 855 function htmlDecode(value){ 
U 856   return $('<div/>').html(value).text(); 
857 }
858
42fece 859 function fm_code_edit(content, m) {
a4d3b5 860   cm = CodeMirror.fromTextArea(document.getElementById("editspace"), {
U 861     lineNumbers: true,
e3043f 862     gutters: ["CodeMirror-linenumbers", "breakpoints"],
42fece 863     mode: m,
a4d3b5 864     viewportMargin : Infinity,
d920b7 865     tabSize: 2,
a4d3b5 866     extraKeys: {
915927 867         "F9": function(cm) {
U 868         cm.setOption("fullScreen", !cm.getOption("fullScreen"));
869       },
870         "Esc": function(cm) {
871         if (cm.getOption("fullScreen")) cm.setOption("fullScreen", false);
872       }
a4d3b5 873     }
U 874   });
fab80c 875   //cm.setValue(htmlDecode(content));
U 876   //cm.setValue(content);
877   cm.setValue(unescapeHtml(content));
3003b2 878   cm.getDoc().markClean();
e3043f 879   cm.on("gutterClick", function(theEditor, lineNumber) {
U 880     var info = theEditor.lineInfo(lineNumber);
881     //--lineNumber;
882     //console.log(info.gutterMarkers.breakpoints.message);
883     //var marker = info.gutterMarkers.breakpoints;
884     //$(marker).tooltip('toggle');
885   });
886 }
887
888 function fm_set_code_marker(lineNumber, message) {
889  cm.setGutterMarker(lineNumber-1, "breakpoints", makeMarker(message));
890 }
891
892 function makeMarker(msg) {
893   var marker = document.createElement("div");
894   marker.style.color = "#822";
895   marker.innerHTML = "●";
896   //marker.message = msg;
897   $(marker).tooltip({
898     placement: 'right',
899     title: msg,
900     offset: '10 -10'
901   });
902   return marker;
915927 903 }
a4d3b5 904
U 905
906
907 /* -------- helper functions ----------- */
908
b7475d 909 function fm_get(u, dtype, scallback) {
a4d3b5 910   $.ajax({
U 911     url: u,
912     type: "GET",
b7475d 913     dataType: dtype,
a4d3b5 914     success: scallback,
U 915     error: function (xhr, status, errorThrown) {
916       alert("Error: " + errorThrown + " Status: " + status + " URL: " + u);
917     },
918     complete: function (xhr, status) {
919       //console.log( "The request is complete!" );
920     }
921
922   });
915927 923 }
a4d3b5 924
9e2964 925 function fm_post(u, d, dtype, scallback) {
a4d3b5 926   $.ajax({
U 927     url: u,
928     data: d,
929     type: "POST",
9e2964 930     dataType: dtype,
a4d3b5 931     success: scallback,
U 932     error: function (xhr, status, errorThrown) {
933       $('#fehler').html("Error: " + errorThrown + " Status: " + status);
934     },
935     complete: function (xhr, status) {
936       //alert( "The request is complete!" );
937     }
938   });
915927 939 }
a4d3b5 940
e5ff42 941 function fm_serialise(obj) {
U 942   return '{"' + obj.constructor.name + '":' + JSON.stringify(obj) + '}';
915927 943 }
e5ff42 944
fab80c 945 function escapeHtml(text) {
U 946   text = text.replace(/\u228/g,'&auml;');
947   text = text.replace(/\u246/g,'&ouml;');
948   text = text.replace(/\u252/g,'&uuml;');
949   text = text.replace(/\u196/g,'&Auml;');
950   text = text.replace(/\u214/g,'&Ouml;');
951   text = text.replace(/\u220/g,'&Uuml;');
952   text = text.replace(/\u223/g,'&szlig;');
953   text = text.replace(/\u26/g,'&amp;');
954   return text;
955 }
956
957 function unescapeHtml(text) {
958   text = text.replace(/&auml;/g, String.fromCharCode(228));
959   text = text.replace(/&ouml;/g, String.fromCharCode(246));
960   text = text.replace(/&uuml;/g, String.fromCharCode(252));
961   text = text.replace(/&Auml;/g, String.fromCharCode(196));
962   text = text.replace(/&Ouml;/g, String.fromCharCode(214));
963   text = text.replace(/&Uuml;/g, String.fromCharCode(220));
964   text = text.replace(/&szlig;/g, String.fromCharCode(223));
965   text = text.replace(/&amp;/g, String.fromCharCode(26));
966   return text;
967 }
968
969
7342b1 970 /* ----- Objekte ----- */
U 971
972 function FileList(fl) {
973   this.files = fl;
974 }
975
976 function FileRef(obj) {
977   var self = this;
978   this.fr = obj;
7f2a41 979   this.fnx;
7342b1 980   
U 981   this.typeClass = function() {
10d3d3 982     if(modus == 'kacheln') {
U 983       if(self.fr.isDirectory) {
a3d410 984         return 'fa-folder ordner';
10d3d3 985       } else {
a3d410 986         return 'fa-file datei';
10d3d3 987       }
7342b1 988     } else {
10d3d3 989       if(self.fr.isDirectory) {
a3d410 990         return 'fa-folder ordner';
10d3d3 991       } else {
a3d410 992         return 'fa-file-o datei';
10d3d3 993       }
7342b1 994     }
2121cc 995   };
U 996   
7f2a41 997   this.mini = function() {
U 998     var miniatur = false;
999     var namen = self.fr.absolutePath.split('/');
1000     if(namen.length > 0) {
1001       self.fnx = decodeURIComponent(namen[namen.length - 1]);
1002     } else {
1003       self.fnx = decodeURIComponent(self.fr.absolutePath);
1004     }
1005     if(self.fnx.indexOf('.jpg') > -1 || self.fnx.indexOf('.png') > -1 || self.fnx.indexOf('.gif') > -1 || self.fnx.indexOf('.jpeg') > -1) {
1006       miniatur = true;
1007     }
1008     return miniatur;
1009   };
1010   
1011   this.miniurl = function() {
1012       var userid = $('#userMenu').text();
1013       var ext = '';
1014       var dotpos = self.fnx.indexOf('.');
1015       if(dotpos > -1) {
1016         var fny = self.fnx;
1017         self.fnx = self.fnx.substring(0, dotpos);
1018         ext = fny.substr(dotpos);
1019       }
1020       var path = fm_get_path(userid);
fa012b 1021       var imgurl = loc + path + '/' + self.fnx + '_tn' + ext;
7f2a41 1022       return imgurl;
U 1023     
1024   };
1025   
2121cc 1026   this.fileName = function() {
7f2a41 1027     
2121cc 1028     var namen = self.fr.absolutePath.split('/');
U 1029     if(namen.length > 0) {
f7d8bf 1030       return decodeURIComponent(namen[namen.length - 1]);
2121cc 1031     } else {
f7d8bf 1032       return decodeURIComponent(self.fr.absolutePath);
2121cc 1033     }
7f2a41 1034     
2121cc 1035   };
7342b1 1036 }
5dfab6 1037
U 1038 function BcrFiles(fl) {
1039   this.files = fl;
1040 }
1041
1042 function BcrFile(rp, n) {
1043   this.relPath = rp;
1044   this.fName = n;
7aa566 1045 }
U 1046