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