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