Dateiverwaltung für die WebBox
ulrich
2017-03-17 e383f14455a77ad51d21c8ebcca482d968c74c00
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() {
fd0b4c 282   fm_compile('0', fm_mark_compile_results_in_editor);
U 283 }
284
285 function fm_mark_compile_results_in_editor(resp) {
286   cm.clearGutter("breakpoints");
287
288   if(resp.List[0].CompilerIssue !== undefined) {
289     var lno;
290     var eMsg;
291     if(resp.List[0].CompilerIssue instanceof Array) {
292       var issueNo = 0;
293       while(issueNo < resp.List[0].CompilerIssue.length) {
294         // console.log(resp.List[0].CompilerIssue[issueNo].kind);
295         // console.log(resp.List[0].CompilerIssue[issueNo].lineNumber);
296         // console.log(resp.List[0].CompilerIssue[issueNo].sourceName);
297         // console.log(resp.List[0].CompilerIssue[issueNo].message);
298         lno = resp.List[0].CompilerIssue[issueNo].lineNumber;
299         eMsg = resp.List[0].CompilerIssue[issueNo].kind + ' ' + resp.List[0].CompilerIssue[issueNo].message;
300         cm.setGutterMarker(lno-1, "breakpoints", makeMarker(eMsg));
301         issueNo++;
302       }
303     } else {
304       lno = resp.List[0].CompilerIssue.lineNumber;
305       eMsg = resp.List[0].CompilerIssue.kind + ' ' + resp.List[0].CompilerIssue.message;
306       cm.setGutterMarker(lno-1, "breakpoints", makeMarker(eMsg));
307     }
308   }
309 }
310
311 function fm_compile(modeStr, callback) {
0ac262 312   var liste = fm_gewaehlte_dateien();
fd0b4c 313   var m = '?c=de.uhilger.filecms.api.CompileService&m=compile&p=' + pfad + '&p=' + encodeURIComponent(liste) + 
U 314           '&p=' + modeStr;
0ac262 315   var u = '../svc' + m;
e3043f 316   fm_get(u, "json", function(resp) {
fd0b4c 317     callback(resp);
0ac262 318   });
U 319 }
320
10d3d3 321 function fm_ansicht_umschalten() {
U 322   if($('#ansicht').children(0).hasClass('fa-th-list')) {
323     $('#ansicht').children(0).addClass('fa-th-large');
324     $('#ansicht').children(0).removeClass('fa-th-list');
325     modus = 'liste';
326   } else {
327     $('#ansicht').children(0).addClass('fa-th-list');    
328     $('#ansicht').children(0).removeClass('fa-th-large');
329     modus = 'kacheln';
330   }
331   fm_get_list(pfad);
332 }
333
334 function fm_set_modus() {
335   if(modus == 'kacheln') {
336     $('#ansicht').children(0).addClass('fa-th-list');    
337     $('#ansicht').children(0).removeClass('fa-th-large');  
338   } else {
339     $('#ansicht').children(0).addClass('fa-th-large');
340     $('#ansicht').children(0).removeClass('fa-th-list');    
341   }
a4d3b5 342 }
U 343
344 function fm_menu_neue_textdatei() {
adf812 345   fm_text_edit('Neue Datei');
a4d3b5 346 }
U 347
305573 348 function fm_menu_neues_dokument() {
7d8ef6 349   fm_dok_edit('');
305573 350 }
U 351
a4d3b5 352 function fm_menu_datei_schliessen() {
3003b2 353   if(openEditor === 'text') {
U 354     if(!cm.getDoc().isClean()) {
355       fm_ask_for_save();
356     } else {
357       fm_do_close();
358     }
359   } else {
360     if(tinymce.activeEditor.undoManager.hasUndo()) {
361       fm_ask_for_save();
362     } else {
363       fm_do_close();
364     }
365   }
366 }
367
368 function fm_ask_for_save() {
369   // hier Abfrage ob gespeichert werden soll    
370   $('#confirmOk').click(function() {
371     $('#confirmOk').attr('onclick','').unbind('click');
372     fm_menu_datei_speichern(function() {
a75859 373       fm_do_close();
U 374     });
3003b2 375   });
U 376   $('#confirmCancel').click(function() {
377     $('#confirmCancel').attr('onclick','').unbind('click');
378   });
379   $('#confirmClose').show();
380   $('#confirmClose').click(function() {
381     $('#confirmClose').attr('onclick','').unbind('click');
a75859 382     fm_do_close();
3003b2 383   });
U 384   $('#confirmOk').text("Speichern");
385   $('#confirmOk').addClass('btn-primary');
386   $('#confirmOk').removeClass('btn-danger');
387   $('#confirmModalTitle').text("Schliessen");
388   $('#confirmModalBody').text("Speichern vor dem Schliessen?");
389   $('#confirmModal').modal({
390     keyboard: false,
391     show: true
392   });
a75859 393 }
U 394
395 function fm_do_close() {
a4d3b5 396   $('.codeeditor-space').hide();
U 397   $('.code-editor-container').hide();
305573 398   $("#mce-editor").hide();
U 399   if(cm !== undefined) {
400     cm.toTextArea();
401   }
5ebb8e 402   openFileName = '';
7d8ef6 403   openEditor = '';
adf812 404   fm_get_list(pfad);
305573 405   fm_filectls_show();
e5ff42 406 }
U 407
17919c 408 function fm_dateiwahl(ev) {
5dfab6 409   var elem = this;
17919c 410   //console.log('dateiwahl nach click, event shift: ' + ev.shiftKey + ", event ctrl: " + ev.ctrlKey);
10d3d3 411   if(modus == 'kacheln') {
957b51 412     // Kacheln
10d3d3 413     if($(elem).children(0).hasClass('fa-folder')) {
957b51 414       if(/*ev.shiftKey || */ ev.ctrlKey) {
U 415         $(elem).find('.dateiname').addClass('datei-gewaehlt');
10d3d3 416       } else {
957b51 417         var ordner = $(elem).text().trim();
U 418         if(pfad.length > 0) {
419           pfad = pfad + '/' + ordner;
420         } else {
421           pfad = ordner;
422         }
423         fm_get_list(pfad);
10d3d3 424       }
7f2a41 425     } else if($(elem).children(0).hasClass('datei')) {
17919c 426       if(/*ev.shiftKey || */ ev.ctrlKey) {
U 427         // mehrere Dateien sollen gewaehlt werden
428       } else {
429         $('.datei-gewaehlt').removeClass('datei-gewaehlt');        
430       }
957b51 431       $(elem).find('.dateiname').addClass('datei-gewaehlt');
5dfab6 432     } else {
10d3d3 433       //console.log('kein folder oder file...');
5dfab6 434     }
U 435   } else {
957b51 436     // Liste
10d3d3 437     if($(elem).find('.datei-elem').children(0).hasClass('fa-file-o')) {
957b51 438       // Datei
17919c 439       if(/*ev.shiftKey || */ ev.ctrlKey) {
U 440         // mehrere Dateien sollen gewaehlt werden
441       } else {
442         $('.table-info').removeClass('table-info');
957b51 443         $('.datei-gewaehlt').removeClass('datei-gewaehlt');
17919c 444       }
10d3d3 445       $(elem).addClass('table-info');
U 446       $(elem).find('.dateiname').addClass('datei-gewaehlt');
447     } else {
957b51 448       // Ordner
U 449       if(/*ev.shiftKey || */ ev.ctrlKey) {
450         $(elem).children(0).addClass('datei-gewaehlt');
10d3d3 451       } else {
957b51 452         var ordner = $(elem).find('.dateiname').text();
U 453         if(pfad.length > 0) {
454           pfad = pfad + '/' + ordner;
455         } else {
456           pfad = ordner;
457         }
458         fm_get_list(pfad);
10d3d3 459       }
U 460     }   
5dfab6 461   }
c509a0 462 }
U 463
a94216 464 function fm_bc_click() {
U 465   var elem = this;
466   var bcPfad = $(elem).attr('rpath');
467   if(bcPfad !== undefined) {
c509a0 468     pfad = bcPfad;
a94216 469     fm_get_list(bcPfad);
U 470   } else {
471     pfad = '';
472     fm_get_list('');
473   }
474 }
475
42fece 476 function fm_text_edit(content, mode) {
305573 477   fm_filectls_hide();
3ad4db 478   $('.codeeditor-space').show();
U 479   $('.code-editor-container').show();
42fece 480   fm_code_edit(content, mode);  
7d8ef6 481   openEditor = 'text';
U 482 }
483
484 function fm_dok_edit(content) {
485   fm_filectls_hide();
0c1d5b 486   fm_dok_editor_init(userid);
7d8ef6 487   $("#mce-editor").show();
be9b6d 488   
U 489   window.clearTimeout(tmo2);
490   tmo2 = window.setTimeout(function () {
491     try {
492       ed.setContent(content);
493       openEditor = 'dok';  
494     } catch (err) {
495     }
496   }, 200);
3ad4db 497 }
U 498
305573 499 function fm_filectls_hide() {
U 500   $('#zentrum_bc').hide();
501   $('#dateien').hide();
547755 502   $('#editMenu').addClass('disabled');
305573 503 }
U 504
505 function fm_filectls_show() {
506   $('#zentrum_bc').show();
507   $('#dateien').show();  
547755 508   $('#editMenu').removeClass('disabled');
305573 509 }
b7475d 510 /* ----- API Calls ------------- */
U 511
0c1d5b 512 function fm_get_login() {
3ad4db 513   var m = '?c=de.uhilger.filecms.pub.SessionManager&m=getSessionUser';
U 514   var u = '../pub' + m;
515   fm_get(u, "text", function(resp) {
0c1d5b 516     userid = resp;
3ad4db 517     $('#userMenu').text(resp);
7342b1 518   });  
c509a0 519 }
U 520
521 function fm_get_new_folder() {
522   $('#modal_ok').click(function() {
523     // hier speichern
524     var m = '?c=de.uhilger.filecms.api.FileMgr&m=newFolder&p=' + pfad + '&p=' + $('#dateiname').val();
525     var u = '../svc' + m;
526     fm_get(u, "json", function(resp) {
adf812 527       fm_get_list(pfad);
c509a0 528     });
U 529   });
957b51 530   $('#saveModalTitle').text('Neuer Ordner');
c509a0 531   $('#dialogfrage').text("Name?");
U 532   $('#dateiname').val('');
533   $('#dateiname').attr('placeholder', 'Ordnername');
534   $('#saveModal').modal({
535     keyboard: false,
536     show: true
537   });
7342b1 538 }
U 539
7d8ef6 540 function fm_get_file_content(typ) {
fc1897 541   var gewaehlte = $('.datei-gewaehlt');
957b51 542   //var fname = $(gewaehlte).find('.dateiname').text();
U 543   
544   var fname = $(gewaehlte[0]).text();
5ebb8e 545   openFileName = fname;
3ad4db 546   var m = '?c=de.uhilger.filecms.api.FileMgr&m=getCode&p=' + pfad + '&p=' + fname;
2121cc 547   var u = '../svc' + m;
3ad4db 548   fm_get(u, "text", function(resp) {
7d8ef6 549     if(typ == 'text') {
42fece 550       var mode = "text/x-java";
U 551       if(fname.endsWith('js')) {
552         mode = 'javascript';
553       } else if(fname.endsWith('xml')) {
554         mode = 'xml';
555       } else if(fname.endsWith('properties')) {
556         mode = 'xml';
557       }
558       fm_text_edit(resp, mode);
7d8ef6 559     } else {
U 560       fm_dok_edit(resp);
561     }
2121cc 562   });
3ad4db 563   
2121cc 564 }
U 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
8446c2 579 function fm_menu_datei_umbenennen() {
U 580   var gewaehlte = $('.datei-gewaehlt');
581   var fname = $(gewaehlte[0]).text();
663ee9 582
U 583   $('#modal_ok').click(function() {
584     // hier umbenennen
50bb41 585     fm_rename_file(fname, pfad, $('#dateiname').val());
663ee9 586   });
U 587   $('#saveModalTitle').text('Datei umbenennen');
588   $('#dialogfrage').text("Neuer Dateiname?");  
589
590   if(fname !== undefined) {
591     $('#dateiname').val(fname);
592     $('#dateiname').attr('placeholder', 'Dateiname');
593     $('#saveModal').modal({
594       keyboard: false,
595       show: true
596     });
597   }
598 }
599
600 function fm_rename_file(fn, p, neuerName) {
601   var m = '?c=de.uhilger.filecms.api.FileMgr&m=renameFile';
602   m = m + '&p=' + p; 
603   m = m + '&p=' + fn; 
604   m = m + '&p=' + neuerName; 
605   var u = '../svc' + m;
606   fm_get(u, "text", function(resp) {
607     fm_get_list(pfad);
608   });  
8446c2 609 }
U 610
438b16 611 function fm_menu_shrink() {
U 612   var gewaehlte = $('.datei-gewaehlt');
613   var fname = $(gewaehlte[0]).text();
614   var m = '?c=de.uhilger.filecms.api.FileMgr&m=bildVerkleinern';
615   m = m + '&p=' + pfad; 
616   m = m + '&p=' + fname; 
617   var u = '../svc' + m;
618   fm_get(u, "text", function(resp) {
619     fm_get_list(pfad);
620   });  
621 }
622
7165a1 623 /*
U 624  * Hier merkt sich die Dateiverwalting die markierten Dateien fuer 
625  * eine Dateioperation. Bei cut wird in der 'paste' Operation auf dem Server 
626  * fuer die 'gemerkten' Dateien ein Move gemacht. Die Dateien werden 
627  * vom gewaehlten Ort zum Zielort verschoben.
628  * 
629  * @returns {undefined}
630  */
631 function fm_cut_files() {
632   cutCopySrcDir = pfad;
633   cutCopyFiles = fm_gewaehlte_dateien();
634   cutCopyOperation = 'cut';
635 }
636
637 /*
638  * Hier merkt sich die Dateiverwalting die markierten Dateien fuer 
639  * eine Dateioperation. Bei copy wird in der 'paste' Operation auf dem Server 
640  * fuer die 'gemerkten' Dateien eine Kopie gemacht. Die Dateien werden 
641  * am gewaehlten Ort behalten und am Zielort wird eine Kopier der 
642  * gewaehlten DAteien erstellt
643  * 
644  * @returns {undefined}
645  */
646 function fm_copy_files() {
647   cutCopySrcDir = pfad;
648   cutCopyFiles = fm_gewaehlte_dateien();
9e2964 649   cutCopyOperation = 'copy';
7165a1 650 }
U 651
652 /*
653  * Hier wird fuer eine zuvor markierte Liste von Dateien, fuer die 
654  * Cut oder Copy gewaehlt wurde, die Operations ausgefuehrt (move oder copy)
655  * @returns {undefined}
656  */
657 function fm_paste_files() {
658   var m;
9e2964 659   if(cutCopyOperation === 'cut') {
U 660     //m = '?c=de.uhilger.filecms.api.FileMgr&m=moveFiles'; //&p=' + cutCopySrcDir + '&p=' + pfad + '&p=' + encodeURIComponent(liste);
661     m = '?c=de.uhilger.filecms.api.FileMgr&m=moveFiles&p=' + cutCopySrcDir + '&p=' + pfad + '&p=' + encodeURIComponent(cutCopyFiles);
7165a1 662   } else {
9e2964 663     //m = '?c=de.uhilger.filecms.api.FileMgr&m=copyFiles'; //&p=' + cutCopySrcDir + '&p=' + pfad + '&p=' + encodeURIComponent(liste);
U 664     m = '?c=de.uhilger.filecms.api.FileMgr&m=copyFiles&p=' + cutCopySrcDir + '&p=' + pfad + '&p=' + encodeURIComponent(cutCopyFiles);
fc1897 665   }
7165a1 666   var u = '../svc' + m;  
9e2964 667   fm_get(u, "text", function(resp) {
U 668     // console.log('deleteFiles gab folgendes zurueck: ' + resp);
669     fm_get_list(pfad);
670   });
671   /*
672   fm_post(u, {p1: encodeURIComponent(cutCopySrcDir), p2: encodeURIComponent(pfad), p3: encodeURIComponent(cutCopyFiles)},'text', function(resp) {
7165a1 673     // resp evtl. zeigen..
U 674     fm_get_list(pfad);
675   });
9e2964 676   */
7165a1 677 }
U 678
679 function fm_del_files() {
680   var liste = fm_gewaehlte_dateien();
fc1897 681   var m = '?c=de.uhilger.filecms.api.FileMgr&m=deleteFiles&p=' + pfad + '&p=' + encodeURIComponent(liste);
U 682   var u = '../svc' + m;
683   fm_get(u, "text", function(resp) {
684     // console.log('deleteFiles gab folgendes zurueck: ' + resp);
685     fm_get_list(pfad);
686   });
687 }
688
10d3d3 689 function fm_render_list(fl) {
U 690   if(modus == 'kacheln') {
691     // Kachelansicht
7d8ef6 692     var template = $('#tpl-kacheln').html();
U 693     Mustache.parse(template);   // optional, speeds up future uses
694     $('.datei-zeile').attr('onclick','').unbind('click');
695     $('#dateien').empty();
696     $('#dateien').html(Mustache.render(template, fl));
697     $('.figure').click(fm_dateiwahl);
698   } else {
699     // Listenansicht
700     var template = $('#tpl-liste').html();
701     Mustache.parse(template);   // optional, speeds up future uses
702     $('.figure').attr('onclick','').unbind('click');
703     $('#dateien').empty();
704     $('#dateien').html(Mustache.render(template, fl));
705     $('.datei-zeile').click(fm_dateiwahl);
706   }
707   /*
708   if(modus == 'kacheln') {
709     // Kachelansicht
a3d410 710     $.get('tpl-kacheln.txt', function(template) {
U 711       $('#dateien').empty();
712       $('#dateien').html(Mustache.render(template, fl));
713       $('.figure').click(fm_dateiwahl);
714     });
10d3d3 715     $('.datei-zeile').attr('onclick','').unbind('click');
U 716   } else {
717     // Listenansicht
a3d410 718     $.get('tpl-liste.txt', function(template) {
U 719       $('#dateien').empty();
720       $('#dateien').html(Mustache.render(template, fl));
721       $('.datei-zeile').click(fm_dateiwahl);
722     });
10d3d3 723     $('.figure').attr('onclick','').unbind('click');
U 724   }
7d8ef6 725   */
10d3d3 726 }
U 727
7342b1 728 // http://localhost:8079/file-cms/svc?c=de.uhilger.filecms.api.FileMgr&f=JSONNICE&m=list&p=
a94216 729 function fm_get_list(relPfad) {
10d3d3 730   $('#ansicht').attr('onclick','').unbind('click');
a94216 731   var m = '?c=de.uhilger.filecms.api.FileMgr&m=list&p=' + relPfad;
7342b1 732   var u = '../svc' + m;
U 733   fm_get(u, "json", function(resp) {
10d3d3 734     
2121cc 735     if(resp.List[0].FileRef !== undefined) {
U 736       var files = new Array();
c509a0 737       if(resp.List[0].FileRef instanceof Array) {
U 738         for(var i = 0; i < resp.List[0].FileRef.length; i++) {
739           files.push(new FileRef(resp.List[0].FileRef[i]));
740         }
741       } else {
742         files.push(new FileRef(resp.List[0].FileRef));
2121cc 743       }
U 744       var fl = new FileList(files);
10d3d3 745       fm_render_list(fl);
2121cc 746     } else {
U 747       $('#dateien').empty();
7342b1 748     }
5dfab6 749     
10d3d3 750     // Breadcrumb-Ansicht
7d8ef6 751     var template;
a94216 752     $('.breadcrumb-item').attr('onclick','').unbind('click');
2315a0 753     $('#bcnav').empty();
5dfab6 754     var dirList = new Array();
U 755     var rp = '';
a94216 756     //console.log("'" + relPfad + "'");
U 757     var dirs = relPfad.split('/');
758     //console.log(dirs.length);
2121cc 759     dirList.push(new BcrFile(rp, 'Home'));
a94216 760     if(relPfad.length > 0) {
2315a0 761       for(var i = 0; i < dirs.length - 1; i++) {
5dfab6 762         if(rp.length > 0 ) {
U 763           dirList.push(new BcrFile(rp + '/' + dirs[i], dirs[i]));
2315a0 764           rp = rp + '/' + dirs[i];
5dfab6 765         } else {
U 766           dirList.push(new BcrFile(dirs[i], dirs[i]));
2315a0 767           rp = dirs[i];
5dfab6 768         }
U 769       }
770       var bl = new BcrFiles(dirList);
7d8ef6 771  
U 772       if(dirList.length > 0) {
773         template = $('#tpl-bcr').html();
774         Mustache.parse(template);   // optional, speeds up future uses
775         $('#bcnav').html(Mustache.render(template, bl));
2315a0 776       }
7d8ef6 777       
U 778       if(dirs.length > 0) {
779         dirList.push(new BcrFile(rp + '/' + dirs[dirs.length-1], dirs[dirs.length-1]));
780         template = $('#tpl-bcr2').html();
781         Mustache.parse(template);   // optional, speeds up future uses
782         $('#bcnav').append(Mustache.render(template, dirList[dirList.length-1]));        
783       } else {
784         template = $('#tpl-bcr2').html();
785         Mustache.parse(template);   // optional, speeds up future uses
786         $('#bcnav').append(Mustache.render(template, dirList[0]));        
787       }
788       
789       $('#bcnav').append($('#tpl-bcr3').html());
2315a0 790     } else {
a94216 791       pfad = '';
7d8ef6 792       template = $('#tpl-bcr2').html();
U 793       Mustache.parse(template);   // optional, speeds up future uses
794       $('#bcnav').append(Mustache.render(template, dirList[0]));   
795       $('#bcnav').append($('#tpl-bcr3').html());
5dfab6 796     }
7d8ef6 797     $('.breadcrumb-item').click(fm_bc_click);
U 798     $('#ansicht').click(fm_ansicht_umschalten);
799     fm_set_modus();
800   });
e5ff42 801 }
U 802
a75859 803 function fm_menu_datei_speichern(callback) {
5ebb8e 804   //var fname = $('.datei-gewaehlt').text();
U 805   var fname = openFileName;
806   if(fname !== undefined && fname !== '') {
a75859 807     fm_save_file(fname, 'saveTextFile', callback);
5ebb8e 808   } else {
a75859 809     fm_menu_datei_speichern_unter(callback);
5ebb8e 810   }
U 811 }
812
a75859 813 function fm_save_file(saveFileName, method, callback) {
7d8ef6 814   var content;
U 815   if(openEditor === 'text') {
816     content = cm.getValue();
3003b2 817     cm.getDoc().markClean();
7d8ef6 818   } else {
U 819     content = ed.getContent();
3003b2 820     tinymce.activeEditor.undoManager.clear();
7d8ef6 821   }
47e9d4 822   var m = '?c=de.uhilger.filecms.api.FileMgr&m=' + method;
5ebb8e 823   var u = '../svc' + m;
7d8ef6 824   fm_post(u, {p1: pfad, p2: saveFileName, p3: content}, function(resp) {
a75859 825     // hier scheint nichts zurueckzukommen..
5ebb8e 826   });
a75859 827   openFileName = saveFileName;
3003b2 828   if(typeof (callback) !== 'function') {
U 829     
830   } else {
a75859 831     callback();
U 832   }
5ebb8e 833 }
U 834
a75859 835 function fm_menu_datei_speichern_unter(callback) {  
915927 836   $('#modal_ok').click(function() {
a75859 837     $('#modal_ok').attr('onclick','').unbind('click');
915927 838     // hier speichern
a75859 839     fm_save_file($('#dateiname').val(), 'saveTextFileAs', callback);
915927 840   });
957b51 841   $('#saveModalTitle').text('Datei speichern');
c509a0 842   $('#dialogfrage').text("Dateiname?");
3ad4db 843   
U 844   var fname = $('.datei-gewaehlt').text();
845   if(fname !== undefined) {
846     $('#dateiname').val(fname);
847   } else {
848     $('#dateiname').val('');
849   }
c509a0 850   $('#dateiname').attr('placeholder', 'Dateiname');
915927 851   $('#saveModal').modal({
U 852     keyboard: false,
853     show: true
854   });
a4d3b5 855 }
U 856
b7475d 857 function fm_logout() {
U 858   var m = '?c=de.uhilger.filecms.pub.SessionManager&m=expireSession';
859   var u = '../pub' + m;
860   
861   fm_get(u, "text", function(resp) {
862     $('#userMenu').text('nicht angemeldet');
863     window.location.href = '../logout.html';
864   });
865 }
866
867
a4d3b5 868 /* ---- codemirror editor handling -------- */
U 869
64d8b9 870 /*
942d63 871 function htmlDecode(value){ 
U 872   return $('<div/>').html(value).text(); 
873 }
64d8b9 874 */
942d63 875
42fece 876 function fm_code_edit(content, m) {
a4d3b5 877   cm = CodeMirror.fromTextArea(document.getElementById("editspace"), {
U 878     lineNumbers: true,
e3043f 879     gutters: ["CodeMirror-linenumbers", "breakpoints"],
42fece 880     mode: m,
a4d3b5 881     viewportMargin : Infinity,
d920b7 882     tabSize: 2,
a4d3b5 883     extraKeys: {
915927 884         "F9": function(cm) {
U 885         cm.setOption("fullScreen", !cm.getOption("fullScreen"));
886       },
887         "Esc": function(cm) {
888         if (cm.getOption("fullScreen")) cm.setOption("fullScreen", false);
7ad1b7 889       },
U 890         ".": function(cm) {
891         console.log('dot pressed: perhaps look up class or method name');
3b7c5b 892         /*
U 893          * Hier kann man eine Funktion ausloesen, die fuer das 
894          * Wort vor dem Punkt (Name der Klasse) eine Liste mit 
895          * Vorschlaegen fuer Methodennamen einblendet.
896          */
897         
898         /*
899          * CodeMirror.Pass laesst das Zeichen zum Editorinhalt durch, 
900          * verhindert aber das Ausloesen von 'keyHandled'
901          */
902         return CodeMirror.Pass; 
915927 903       }
a4d3b5 904     }
U 905   });
fab80c 906   //cm.setValue(htmlDecode(content));
U 907   //cm.setValue(content);
908   cm.setValue(unescapeHtml(content));
3003b2 909   cm.getDoc().markClean();
e3043f 910   cm.on("gutterClick", function(theEditor, lineNumber) {
U 911     var info = theEditor.lineInfo(lineNumber);
912     //--lineNumber;
913     //console.log(info.gutterMarkers.breakpoints.message);
914     //var marker = info.gutterMarkers.breakpoints;
915     //$(marker).tooltip('toggle');
916   });
3b7c5b 917   /*
7ad1b7 918   cm.on("keyHandled", function(theEditor, keyName, event){
3b7c5b 919     console.log('cm.keyHandled keyName: ' + keyName + ', event.type: ' + event.type);    
7ad1b7 920   });
3b7c5b 921   */
e3043f 922 }
U 923
924 function makeMarker(msg) {
925   var marker = document.createElement("div");
926   marker.style.color = "#822";
927   marker.innerHTML = "●";
928   //marker.message = msg;
929   $(marker).tooltip({
930     placement: 'right',
931     title: msg,
ed12de 932     offset: '0 -30'
e3043f 933   });
U 934   return marker;
915927 935 }
a4d3b5 936
U 937 /* -------- helper functions ----------- */
938
b7475d 939 function fm_get(u, dtype, scallback) {
a4d3b5 940   $.ajax({
U 941     url: u,
942     type: "GET",
b7475d 943     dataType: dtype,
a4d3b5 944     success: scallback,
U 945     error: function (xhr, status, errorThrown) {
946       alert("Error: " + errorThrown + " Status: " + status + " URL: " + u);
947     },
948     complete: function (xhr, status) {
949       //console.log( "The request is complete!" );
950     }
951
952   });
915927 953 }
a4d3b5 954
9e2964 955 function fm_post(u, d, dtype, scallback) {
a4d3b5 956   $.ajax({
U 957     url: u,
958     data: d,
959     type: "POST",
9e2964 960     dataType: dtype,
a4d3b5 961     success: scallback,
U 962     error: function (xhr, status, errorThrown) {
963       $('#fehler').html("Error: " + errorThrown + " Status: " + status);
964     },
965     complete: function (xhr, status) {
966       //alert( "The request is complete!" );
967     }
968   });
915927 969 }
a4d3b5 970
e5ff42 971 function fm_serialise(obj) {
U 972   return '{"' + obj.constructor.name + '":' + JSON.stringify(obj) + '}';
915927 973 }
e5ff42 974
fab80c 975 function escapeHtml(text) {
U 976   text = text.replace(/\u228/g,'&auml;');
977   text = text.replace(/\u246/g,'&ouml;');
978   text = text.replace(/\u252/g,'&uuml;');
979   text = text.replace(/\u196/g,'&Auml;');
980   text = text.replace(/\u214/g,'&Ouml;');
981   text = text.replace(/\u220/g,'&Uuml;');
982   text = text.replace(/\u223/g,'&szlig;');
983   text = text.replace(/\u26/g,'&amp;');
984   return text;
985 }
986
987 function unescapeHtml(text) {
988   text = text.replace(/&auml;/g, String.fromCharCode(228));
989   text = text.replace(/&ouml;/g, String.fromCharCode(246));
990   text = text.replace(/&uuml;/g, String.fromCharCode(252));
991   text = text.replace(/&Auml;/g, String.fromCharCode(196));
992   text = text.replace(/&Ouml;/g, String.fromCharCode(214));
993   text = text.replace(/&Uuml;/g, String.fromCharCode(220));
994   text = text.replace(/&szlig;/g, String.fromCharCode(223));
995   text = text.replace(/&amp;/g, String.fromCharCode(26));
996   return text;
997 }
998
999
7342b1 1000 /* ----- Objekte ----- */
U 1001
1002 function FileList(fl) {
1003   this.files = fl;
1004 }
1005
1006 function FileRef(obj) {
1007   var self = this;
1008   this.fr = obj;
7f2a41 1009   this.fnx;
7342b1 1010   
U 1011   this.typeClass = function() {
10d3d3 1012     if(modus == 'kacheln') {
U 1013       if(self.fr.isDirectory) {
a3d410 1014         return 'fa-folder ordner';
10d3d3 1015       } else {
a3d410 1016         return 'fa-file datei';
10d3d3 1017       }
7342b1 1018     } else {
10d3d3 1019       if(self.fr.isDirectory) {
a3d410 1020         return 'fa-folder ordner';
10d3d3 1021       } else {
a3d410 1022         return 'fa-file-o datei';
10d3d3 1023       }
7342b1 1024     }
2121cc 1025   };
U 1026   
7f2a41 1027   this.mini = function() {
U 1028     var miniatur = false;
1029     var namen = self.fr.absolutePath.split('/');
1030     if(namen.length > 0) {
1031       self.fnx = decodeURIComponent(namen[namen.length - 1]);
1032     } else {
1033       self.fnx = decodeURIComponent(self.fr.absolutePath);
1034     }
1035     if(self.fnx.indexOf('.jpg') > -1 || self.fnx.indexOf('.png') > -1 || self.fnx.indexOf('.gif') > -1 || self.fnx.indexOf('.jpeg') > -1) {
1036       miniatur = true;
1037     }
1038     return miniatur;
1039   };
1040   
1041   this.miniurl = function() {
1042       var userid = $('#userMenu').text();
1043       var ext = '';
1044       var dotpos = self.fnx.indexOf('.');
1045       if(dotpos > -1) {
1046         var fny = self.fnx;
1047         self.fnx = self.fnx.substring(0, dotpos);
1048         ext = fny.substr(dotpos);
1049       }
1050       var path = fm_get_path(userid);
fa012b 1051       var imgurl = loc + path + '/' + self.fnx + '_tn' + ext;
7f2a41 1052       return imgurl;
U 1053     
1054   };
1055   
2121cc 1056   this.fileName = function() {
7f2a41 1057     
2121cc 1058     var namen = self.fr.absolutePath.split('/');
U 1059     if(namen.length > 0) {
f7d8bf 1060       return decodeURIComponent(namen[namen.length - 1]);
2121cc 1061     } else {
f7d8bf 1062       return decodeURIComponent(self.fr.absolutePath);
2121cc 1063     }
7f2a41 1064     
2121cc 1065   };
7342b1 1066 }
5dfab6 1067
U 1068 function BcrFiles(fl) {
1069   this.files = fl;
1070 }
1071
1072 function BcrFile(rp, n) {
1073   this.relPath = rp;
1074   this.fName = n;
7aa566 1075 }
U 1076