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