/* $Id: webfm.js,v 1.31 2009/08/19 15:30:45 robmilne Exp $ */ /* namespace */ function Webfm() {} /* ** Global variables */ //Translation possible by changing the array values (DO NOT ALTER KEYS!) Webfm.js_msg = []; Webfm.js_msg["mkdir"] = Drupal.t("Create New Dir"); Webfm.js_msg["file"] = Drupal.t("file"); Webfm.js_msg["dir"] = Drupal.t("directory"); Webfm.js_msg["u_file"] = Drupal.t("File"); Webfm.js_msg["u_dir"] = Drupal.t("Directory"); Webfm.js_msg["tree"] = Drupal.t(""); Webfm.js_msg["work"] = Drupal.t("Working... please wait"); Webfm.js_msg["refresh"] = Drupal.t("refresh"); Webfm.js_msg["sort"] = Drupal.t("sort by this column"); Webfm.js_msg["new-dir"] = Drupal.t("Create New Folder"); Webfm.js_msg["add-2-db"] = Drupal.t("Add files in this folder to database"); Webfm.js_msg["r-add-2-db"] = Drupal.t("Recursive add files to database"); Webfm.js_msg["column1"] = Drupal.t("Name"); Webfm.js_msg["column2"] = Drupal.t("Modified"); Webfm.js_msg["column3"] = Drupal.t("Size"); Webfm.js_msg["column4"] = Drupal.t("Owner"); //2009 ae860300 add URL_column ----------------------------------------- Webfm.js_msg["column5"] = Drupal.t("Url"); //--------------------------------------------------------------- Webfm.js_msg["attach-title"] = Drupal.t("Attached Files"); Webfm.js_msg["meta-title"] = Drupal.t("File Meta Data"); Webfm.js_msg["search-title"] = Drupal.t("File Search"); Webfm.js_msg["debug-title"] = Drupal.t("WebFM Debug"); Webfm.js_msg["cache-title"] = Drupal.t("Directory Cache"); Webfm.js_msg["search-cur"] = Drupal.t("Search current directory (see listing breadcrumb trail)"); Webfm.js_msg["no-match"] = Drupal.t("No match found"); Webfm.js_msg["search"] = Drupal.t("Search"); Webfm.js_msg["submit"] = Drupal.t("Submit"); Webfm.js_msg["reset"] = Drupal.t("Reset"); Webfm.js_msg["clear"] = Drupal.t("Clear"); Webfm.js_msg["cancel"] = Drupal.t("Cancel"); Webfm.js_msg["close"] = Drupal.t("Close"); Webfm.js_msg["resize"] = Drupal.t("Resize"); Webfm.js_msg["replace"] = Drupal.t("Replace and Version original copy of "); Webfm.js_msg["replace-del"] = Drupal.t("Replace and Delete original copy of "); Webfm.js_msg["no-replace"] = Drupal.t("Version new copy of "); Webfm.js_msg["cache"] = Drupal.t("Cache Content"); Webfm.js_msg["curdir-undef"] = Drupal.t("current directory undefined"); Webfm.js_msg["ajax-err"] = Drupal.t("server is unreachable"); Webfm.js_msg["move-err"] = Drupal.t("move operation fail"); Webfm.js_msg["len-err"] = Drupal.t("Too long"); Webfm.js_msg["confirm-del0"] = Drupal.t("Do you want to delete the "); Webfm.js_msg["confirm-del1"] = Drupal.t(" and all its contents"); Webfm.js_msg["confirm-det"] = Drupal.t("Do you want to detach "); Webfm.js_msg["confirm-dbrem0"] = Drupal.t("Do you want to remove "); Webfm.js_msg["confirm-dbrem1"] = Drupal.t(" from the database?\n All metadata and attachments for this file will be lost"); Webfm.js_msg["enum_local"] = Drupal.t("Do you want to add all files of this directory into the database?"); Webfm.js_msg["enum_recur"] = Drupal.t("Do you want to add all files of this directory and sub-directories into the database?"); Webfm.js_msg["file-dwld"] = Drupal.t("download file"); Webfm.js_msg["no-file-dwld"] = Drupal.t("file not in database"); Webfm.js_msg["inserted"] = Drupal.t(" files inserted into db"); Webfm.js_msg["not-inserted"] = Drupal.t(" files failed to insert into db"); Webfm.js_msg["metadata"] = Drupal.t("Metadata"); Webfm.js_msg["fix_input"] = Drupal.t("correct input"); Webfm.js_msg["perm"] = Drupal.t("File Permissions"); Webfm.meta_msg = []; Webfm.meta_msg["fid"] = Drupal.t("fid"); Webfm.meta_msg["uid"] = Drupal.t("uid"); Webfm.meta_msg["uname"] = Drupal.t("file owner"); Webfm.meta_msg["name"] = Drupal.t("name"); Webfm.meta_msg["title"] = Drupal.t("title"); Webfm.meta_msg["desc"] = Drupal.t("description"); Webfm.meta_msg["lang"] = Drupal.t("language"); Webfm.meta_msg["pub"] = Drupal.t("publisher"); Webfm.meta_msg["format"] = Drupal.t("format"); Webfm.meta_msg["ver"] = Drupal.t("version"); Webfm.meta_msg["type"] = Drupal.t("image type"); Webfm.meta_msg["width"] = Drupal.t("width"); Webfm.meta_msg["height"] = Drupal.t("height"); Webfm.meta_msg["dl_cnt"] = Drupal.t("downloads"); Webfm.meta_msg["link"] = Drupal.t("link"); Webfm.perm_msg = []; Webfm.perm_msg["pub_view"] = Drupal.t("Public download"); Webfm.perm_msg["rol_view"] = Drupal.t("Role View/Download"); Webfm.perm_msg["rol_att"] = Drupal.t("Role Attach"); Webfm.perm_msg["rol_full"] = Drupal.t("Role Full Access"); Webfm.menu_msg = []; Webfm.menu_msg["mkdir"] = Drupal.t("Create Subdirectory"); Webfm.menu_msg["rmdir"] = Drupal.t("Delete Directory"); Webfm.menu_msg["rm"] = Drupal.t("Delete File"); Webfm.menu_msg["rendir"] = Drupal.t("Rename Directory"); Webfm.menu_msg["search"] = Drupal.t("Search Directory"); Webfm.menu_msg["ren"] = Drupal.t("Rename File"); Webfm.menu_msg["meta"] = Drupal.t("File meta data"); Webfm.menu_msg["att"] = Drupal.t("Attach to Node"); Webfm.menu_msg["det"] = Drupal.t("Detach from Node"); Webfm.menu_msg["dwnld"] = Drupal.t("Download as file"); Webfm.menu_msg["view"] = Drupal.t("View file"); Webfm.menu_msg["enum"] = Drupal.t("Add file to database"); Webfm.menu_msg["denum"] = Drupal.t("Remove file from database"); Webfm.menu_msg["perm"] = Drupal.t("File permissions"); Webfm.menu_msg["clip"] = Drupal.t("Copy link to clipboard"); Webfm.menu_msg["paste"] = Drupal.t("Paste link in editor window"); //Do not translate any code below this line Webfm.current = null; Webfm.dragCont = null; Webfm.metaCont = null; Webfm.contextCont = null; Webfm.searchCont = null; Webfm.debugCont = null Webfm.viewCont = null; Webfm.dragStart = null; Webfm.dragging = false; Webfm.oldOnContextMenu = null; Webfm.activeDropCont = null; Webfm.dropContainers = []; Webfm.attachContainer = null; Webfm.browser = null; Webfm.menuHT = null; Webfm.metadataHT = null; Webfm.dirTreeObj = null; Webfm.dirListObj = null; Webfm.attachObj = null; Webfm.alrtObj = null; Webfm.contextMenuObj = null; Webfm.progressObj = null; Webfm.dbgObj = null; Webfm.metaObj = null; Webfm.searchObj = null; Webfm.permObj = null; Webfm.permKey = null; Webfm.permHT = null; Webfm.permInfoHT = null; Webfm.renameActive = null; Webfm.admin = false; Webfm.zindex = 1000; Webfm.scrollVal = null; // freeze scroll Webfm.eventListeners = []; //Name of node edit form hidden field where attached node list is populated by js Webfm.attachFormInput = "edit-attachlist"; Webfm.icons = { epdf:"pdf", ephp:"php", ephps:"php", ephp4:"php", ephp5:"php", eswf:"swf", esfa:"swf", exls:"xls", edoc:"doc", ertf:"doc", ezip:"zip", erar:"zip", egz:"zip", e7z:"zip", etxt:"doc", echm:"hlp", ehlp:"hlp", enfo:"nfo", expi:"xpi", ec:"c", eh:"h", emp3:"mp3", ewav:"mp3", esnd:"mp3", einc:"cod", esql:"sql", edbf:"sql", ediz:"nfo", eion:"nfo", emod:"mp3", es3m:"mp3", eavi:"avi", empg:"avi", empeg:"avi", ewma:"mp3", ewmv:"avi", edwg:"dwg", ejpg:"i", ejpeg:"i", egif:"i", epng:"i", etiff:"i", ebmp:"i", eico:"i", eai:"ai", eskp:"skp", emov:"qt", epps:"pps", eppt:"pps" }; Webfm.lastarea = null; /* ** Functions */ if (Drupal.jsEnabled) { $(window).load(webfmLayout); } /** * Remember last used textarea for inserting file hrefs. */ function webfmSetlast(){ Webfm.lastarea = this; } /** * Determine browser */ Webfm.browserDetect = function() { this.isIE = false; this.isOP = false; var b = navigator.userAgent.toLowerCase(); if (b.indexOf("msie") >= 0) { this.isIE = true; } if (b.indexOf("opera") >= 0) { this.isOP = true; } } /** * Hashtable (used by directory listing cache and metadata) */ Webfm.ht = function() { this.flush(); } Webfm.ht.prototype.put = function(key, value) { if((key == null) || (value == null)) throw "NullPointerException {" + key + "},{" + value + "}"; this.hash[key] = value; } Webfm.ht.prototype.get = function(key) { return this.hash[key]; } Webfm.ht.prototype.containsKey = function(key) { for(var i in this.hash) { if (i == key && this.hash[i] != null) { return true; } } return false; } Webfm.ht.prototype.remove = function(key) { if(this.hash[key]) { this.hash[key] = null; return true; } return false; } Webfm.ht.prototype.dump = function() { var values = new Array(); for (var i in this.hash) { if (this.hash[i] != null) values.push(this.hash[i]); } return values; } Webfm.ht.prototype.flush = function() { this.hash = new Array(); } /** * Hashable Hashtable (used by menus) */ Webfm.hht = function() { this.flush(); } Webfm.hht.prototype.put = function(key, obj) { if((key == null) || (obj == null)) throw "NullPointerException {" + key + "},{" + obj + "}"; if(this.hash[key] == null) { this.keys[this.keys.length] = key; this.hash[key] = new Array(); } // append new object to array this.hash[key].push(obj); } Webfm.hht.prototype.get = function(key) { return this.hash[key]; } Webfm.hht.prototype.remove = function(key) { if(this.hash[key]) { this.hash[key] = null; return true; } return false; } Webfm.hht.prototype.removeSub = function(key, subkey) { if(this.hash[key][subkey]) { this.hash[key][subkey] = null; return true; } return false; } Webfm.hht.prototype.flush = function() { this.hash = new Array(); this.keys = new Array(); } //Webfm.metaElement objects have description/edit/max_size params Webfm.metaElement = function(desc, edit, size) { this.desc = desc; this.edit = edit; this.size = size; } /** * Create Web File Manager at 'webfm' id anchor * ..or at node-edit 'webfm-inline' id anchor */ function webfmLayout() { // Initialize textarea for pasting file hrefs with the most often used // in case we try to paste before a textarea or -field was focussed. Webfm.lastarea = document.getElementById('edit-body'); if (!Webfm.lastarea) { Webfm.lastarea = document.getElementById('edit-comment'); } // Tell textareas and text fields to remember which one was last focussed. textareas = document.getElementsByTagName('textarea'); i = textareas.length; while( i-- ) { textareas[i].onfocus = webfmSetlast; } textfields = document.getElementsByTagName('input'); i = textfields.length; while( i-- ) { if (textfields[i].type=='text') { textfields[i].onfocus = webfmSetlast; } } var layoutDiv = ''; layoutDiv = Webfm.$('webfm'); if(layoutDiv) { Webfm.commonInterface(layoutDiv); //first param forces trees refresh //second param forces list refresh Webfm.dirTreeObj.fetch(true, true); } else { layoutDiv = Webfm.$('webfm-inline'); if(layoutDiv) { Webfm.commonInterface(layoutDiv); //Add attach-list menu and attach option to listing menu try { Webfm.menuHT.put('file', new Webfm.menuElement(Webfm.menu_msg["att"], Webfm.menuAttach, Webfm.menuFidVal)); Webfm.menuHT.put('det', new Webfm.menuElement(Webfm.menu_msg["meta"], Webfm.menuGetMeta, '')); Webfm.menuHT.put('det', new Webfm.menuElement(Webfm.menu_msg["det"], Webfm.menuDetach, '')); Webfm.menuHT.put('det', new Webfm.menuElement(Webfm.menu_msg["paste"], Webfm.menuPasteHref, '')); } catch(err) { alert("Menu Create err\n" + err); } // attach-list anchored to 'webfm-attach' div in webfm_form_alter() Webfm.attachObj = new Webfm.attach('webfm-attach'); Webfm.attachObj.fetch(); Webfm.dirTreeObj.fetch(true, true); } } } Webfm.commonInterface = function(parent) { Webfm.browser = new Webfm.browserDetect(); //create the popup container for file/dir object draggables Webfm.dragCont = new Webfm.popup("webfm-dragCont"); //create the popup container for image view Webfm.viewCont = new Webfm.popup("webfm-viewCont"); //create context menu popup Webfm.oldOnContextMenu = document.body.oncontextmenu; Webfm.contextCont = new Webfm.popup("webfm-cxtCont"); Webfm.contextMenuObj = new Webfm.context(Webfm.contextCont); //create metadata popup Webfm.metaCont = new Webfm.popup("webfm-paneCont"); Webfm.metaObj = new Webfm.metadata(Webfm.metaCont, 440, 420); //create file permissions popup Webfm.permCont = new Webfm.popup("webfm-permCont"); Webfm.permObj = new Webfm.perm(Webfm.permCont, 300, 200); //create search popup Webfm.searchCont = new Webfm.popup("webfm-searchCont"); Webfm.searchObj = new Webfm.search(Webfm.searchCont, 280, 200); //create debug popup Webfm.debugCont = new Webfm.popup("webfm-debugCont"); Webfm.dbgObj = new Webfm.debug(Webfm.debugCont, 800, 400); //build menu hashtable //global to allow external functions to push new menu elements into the menu array Webfm.menuHT = new Webfm.hht(); try { Webfm.menuHT.put('root', new Webfm.menuElement(Webfm.menu_msg["mkdir"], Webfm.menuMkdir, Webfm.menuAdmin)); Webfm.menuHT.put('root', new Webfm.menuElement(Webfm.menu_msg["search"], Webfm.menuSearch, '')); Webfm.menuHT.put('dir', new Webfm.menuElement(Webfm.menu_msg["mkdir"], Webfm.menuMkdir, Webfm.menuAdmin)); Webfm.menuHT.put('dir', new Webfm.menuElement(Webfm.menu_msg["rmdir"], Webfm.menuRemove, Webfm.menuAdmin)); Webfm.menuHT.put('dir', new Webfm.menuElement(Webfm.menu_msg["rendir"], Webfm.menuRename, Webfm.menuAdmin)); Webfm.menuHT.put('dir', new Webfm.menuElement(Webfm.menu_msg["search"], Webfm.menuSearch, '')); Webfm.menuHT.put('file', new Webfm.menuElement(Webfm.menu_msg["rm"], Webfm.menuRemove, Webfm.menuFileUid)); Webfm.menuHT.put('file', new Webfm.menuElement(Webfm.menu_msg["ren"], Webfm.menuRename, Webfm.menuRenFileUid)); Webfm.menuHT.put('file', new Webfm.menuElement(Webfm.menu_msg["meta"], Webfm.menuGetMeta, Webfm.menuFidVal)); Webfm.menuHT.put('file', new Webfm.menuElement(Webfm.menu_msg["view"], Webfm.menuView, '')); Webfm.menuHT.put('file', new Webfm.menuElement(Webfm.menu_msg["dwnld"], Webfm.menuDownload, Webfm.menuFidVal)); Webfm.menuHT.put('file', new Webfm.menuElement(Webfm.menu_msg["enum"], Webfm.menuInsert, Webfm.menuAdminNoFidVal)); Webfm.menuHT.put('file', new Webfm.menuElement(Webfm.menu_msg["denum"], Webfm.menuDbRem, Webfm.menuAdminFidVal)); Webfm.menuHT.put('file', new Webfm.menuElement(Webfm.menu_msg["perm"], Webfm.menuGetPerm, Webfm.menuFilePerm)); Webfm.menuHT.put('file', new Webfm.menuElement(Webfm.menu_msg["paste"], Webfm.menuPasteHref, '')); Webfm.menuHT.put('file', new Webfm.menuElement(Webfm.menu_msg["clip"], Webfm.menuPutLinkInClipboard, '')) } catch(err) { alert("Menu Create err\n" + err); } //build metadata hashtable //Webfm.metaElement objects have description/edit/max_size properties Webfm.metadataHT = new Webfm.ht(); Webfm.metadataHT.put('id',new Webfm.metaElement(Webfm.meta_msg["fid"], false,0 )); Webfm.metadataHT.put('u', new Webfm.metaElement(Webfm.meta_msg["uid"], true, 10 )); Webfm.metadataHT.put('un',new Webfm.metaElement(Webfm.meta_msg["uname"], false,0 )); Webfm.metadataHT.put('n', new Webfm.metaElement(Webfm.meta_msg["name"], false,0 )); Webfm.metadataHT.put('t', new Webfm.metaElement(Webfm.meta_msg["title"], true, 255)); Webfm.metadataHT.put('d', new Webfm.metaElement(Webfm.meta_msg["desc"], true, 256)); Webfm.metadataHT.put('l', new Webfm.metaElement(Webfm.meta_msg["lang"], true, 16 )); Webfm.metadataHT.put('p', new Webfm.metaElement(Webfm.meta_msg["pub"], true, 255)); Webfm.metadataHT.put('f', new Webfm.metaElement(Webfm.meta_msg["format"],true, 255)); Webfm.metadataHT.put('v', new Webfm.metaElement(Webfm.meta_msg["ver"], false,0 )); Webfm.metadataHT.put('i', new Webfm.metaElement(Webfm.meta_msg["type"], false,0 )); Webfm.metadataHT.put('w', new Webfm.metaElement(Webfm.meta_msg["width"], false,0 )); Webfm.metadataHT.put('h', new Webfm.metaElement(Webfm.meta_msg["height"],false,0 )); Webfm.metadataHT.put('c', new Webfm.metaElement(Webfm.meta_msg["dl_cnt"],false,0 )); Webfm.metadataHT.put('lk', new Webfm.metaElement(Webfm.meta_msg["link"], false,0 )); //build permissions hashtable //key is permission bit, value is string Webfm.permInfoHT = new Webfm.ht(); Webfm.permInfoHT.put("id", Webfm.meta_msg["fid"]); Webfm.permInfoHT.put("u", Webfm.meta_msg["uid"]); Webfm.permInfoHT.put("n", Webfm.meta_msg["name"]); Webfm.permKey = new Array('1', '2', '4', '8'); Webfm.permHT = new Webfm.ht(); Webfm.permHT.put('1', Webfm.perm_msg["pub_view"]); Webfm.permHT.put('2', Webfm.perm_msg["rol_view"]); Webfm.permHT.put('4', Webfm.perm_msg["rol_att"] ); Webfm.permHT.put('8', Webfm.perm_msg["rol_full"]); var layout_cont = Webfm.ce('div'); Webfm.alrtObj = new Webfm.alert(layout_cont, 'webfm-alert'); //Container for tree(s) var elTreeDiv = Webfm.ce('div'); elTreeDiv.setAttribute('id', 'webfm-tree'); //css id layout_cont.appendChild(elTreeDiv); Webfm.dirTreeObj = new Webfm.treeBuilder(elTreeDiv, Webfm.menuHT.get('root'), Webfm.menuHT.get('dir')); //progress indicator Webfm.progressObj = new Webfm.progress(layout_cont, 'webfm-progress'); //Directory Listing Webfm.dirListObj = new Webfm.list(layout_cont, 'webfm-dirlist', 'file', 'narrow', true, Webfm.menuHT.get('dir'), Webfm.menuHT.get('file')); //insert trees, listing, search, metadata, progress and alert divs before upload fset built in php parent.insertBefore(layout_cont, parent.firstChild); // parent.appendChild(layout_cont); //If upload desired to be placed above browser webfmUploadAutoAttach(); } //Attaches the upload behaviour to the upload form (borrowed jquery). function webfmUploadAutoAttach(){ $('input.webfmupload').each(function () { var uri = this.value; var button = 'wfmatt-button'; var wrapper = 'wfmatt-wrapper'; var hide = 'wfmatt-hide'; var upload = new Webfm.jsUpload(uri, button, wrapper, hide); }); } /** * Webfm.jsUpload constructor * 1st param is upload iframe url * 2nd param is id of redirected button object) * 3rd param is id of container of html repainted by ajax * 4th param is id of upload input field * TODO: fix progress throbber */ Webfm.jsUpload = function(uri, button, wrapper, hide) { // Note: these elements are replaced after an upload, so we re-select them // everytime they are needed. this.button = '#'+ button; this.wrapper = '#'+ wrapper; this.hide = '#'+ hide; Drupal.redirectFormButton(uri, $(this.button).get(0), this); } //Handler for the form redirection submission. Webfm.jsUpload.prototype.onsubmit = function () { Webfm.progressObj.show(Webfm.js_msg["work"], "blue"); var hide = this.hide; $(hide).fadeOut('slow'); } //Handler for the form redirection completion. Webfm.jsUpload.prototype.oncomplete = function (data) { // Remove old form Drupal.freezeHeight(); // Avoid unnecessary scrolling $(this.wrapper).html(''); // Place HTML into temporary div var div = document.createElement('div'); $(div).html(data['html']); $(this.wrapper).append(div); //div with id='replace-options' present only in case of file overwrite this.confirm = Webfm.$('replace-options'); if(this.confirm) { var hide = this.hide; $(hide).fadeOut('slow'); var cp = this; this.confirm.id = 'replace-options'; var replaceButton = Webfm.ce('input'); replaceButton.setAttribute('type', 'button'); replaceButton.setAttribute('value', Webfm.js_msg["submit"]); var listener = Webfm.eventListenerAdd(Webfm.eventListeners, replaceButton, "click", function(e) { cp.submit(); Webfm.stopEvent(e); }); this.confirm.appendChild(replaceButton); this.confirm.file = data['file']; } else { $(this.hide, div).fadeIn('slow'); webfmUploadAutoAttach(); } Drupal.unfreezeHeight(); Webfm.progressObj.hide(); Webfm.dirListObj.refresh(); if(typeof Webfm.$('webfm-inline') != 'undefined') { // attach file to node if inside node-edit if(typeof data['fid'] != 'undefined') { Webfm.menuAttach(null, data['fid']); } } } //Handler for the form redirection error. Webfm.jsUpload.prototype.onerror = function (error) { alert('An error occurred:\n\n'+ error); Webfm.progressObj.hide(); if(this.confirm) Webfm.clearNodeById('replace-options'); // Undo hide $(this.hide).css({ position: 'static', left: '0px' }); } Webfm.jsUpload.prototype.submit = function () { var inputs = []; inputs = this.confirm.getElementsByTagName('input'); var selection = ''; for(var i = 0; i < inputs.length; i++) { if(inputs[i].checked == true) { selection = i; break; } } if(typeof selection != 'undefined') { var url = Webfm.ajaxUrl(); Webfm.progressObj.show(Webfm.js_msg["work"], "blue"); var postObj = { action:encodeURIComponent("version"), param0:encodeURIComponent(selection), param1:encodeURIComponent(this.confirm.file)}; Webfm.HTTPPost(url, this.callback, this, postObj); } } Webfm.jsUpload.prototype.callback = function(string, xmlhttp, cp) { Webfm.progressObj.hide(); // Remove overwrite radios var parent = cp.confirm.parentNode; parent.removeChild(parent.firstChild); var hide = cp.hide; if (xmlhttp.status == 200) { var result = Drupal.parseJson(string); if(result.status) { Webfm.dirListObj.refresh(); } cp.confirm.style.display = 'none'; // Insert ajax feedback before upload form var elDiv = Webfm.ce('div'); if(result.status) { elDiv.className = 'upload-msg'; } else { elDiv.className = 'upload-msg-err'; } elDiv.appendChild(Webfm.ctn(result.data['msg'])); $(hide).before($(elDiv)); // Undo hide Webfm.dbgObj.dbg("hide:", Webfm.dump(hide)); $(hide).css({ display: 'block' }); webfmUploadAutoAttach(); if(typeof Webfm.$('webfm-inline') != 'undefined') { // attach file to node if inside node-edit if(typeof result.data['fid'] != 'undefined') { Webfm.menuAttach(null, result.data['fid']); } } } else { Webfm.alrtObj.msg(Webfm.js_msg["ajax-err"]); } } /** * Webfm.list constructor * 1st param is object to append this list object to * 2nd param is base id of listing (multiple listing objects must have unique ids) * 3rd param is base id of file rows of table * 4th param sets styling for listing * 5th param enables drag and drop * 6th param is directory menu array * 7th param is file menu array */ Webfm.list = function(parent, id, type, class_name, dd_enable, dir_menu, file_menu) { var wl = this; this.id = id; this.type = type; this.dd_enable = dd_enable; this.url = Webfm.ajaxUrl(); this.sc_n = 0; this.sc_m = 0; this.sc_s = 0; this.content = ''; this.iconDir = getWebfmIconDir(); this.dir_menu = dir_menu; this.file_menu = file_menu; //directory cache hashtable (key= directory path, val= directory contents) this.cache = new Webfm.ht(); this.eventListeners = [] var node = Webfm.ce("div"); node.setAttribute('id', this.id); node.className = class_name; this.obj = node; var elTable = Webfm.ce('table'); var elTableBody = Webfm.ce('tbody'); // elTableBody.setAttribute('id', this.id + 'body'); this.body = elTableBody; // First Row var elTr = Webfm.ce('tr'); elTr.setAttribute('id','webfm-top-tr'); // Refresh Icon var elTd = Webfm.ce('td'); elTd.className = 'navi'; var elA = Webfm.ce('a'); elA.setAttribute('href', '#'); elA.setAttribute('title', Webfm.js_msg["refresh"]); var elImg = Webfm.ce('img'); elImg.setAttribute('src', this.iconDir+ '/r.gif'); elImg.setAttribute('alt', Webfm.js_msg["refresh"]); elA.appendChild(elImg); elTd.appendChild(elA); elTr.appendChild(elTd); var listener = Webfm.eventListenerAdd(Webfm.eventListeners, elA, "click", function(e) { wl.refresh(Webfm.current);Webfm.stopEvent(e); }); // Breadcrumb trail var elTd = Webfm.ce('td'); elTd.colSpan = getWebfmOwnerColumn() ? 4 : 3 elTd.setAttribute('id','webfm-bcrumb-td'); elTd.setAttribute('class','navi'); // Build breadcrumb trail inside span var elSpan = Webfm.ce('span'); elSpan.setAttribute('id', this.id + 'bcrumb'); elTd.appendChild(elSpan); elTr.appendChild(elTd); elTableBody.appendChild(elTr); // Second Row var elTr = Webfm.ce('tr'); this.secondRow = elTr; // icon column var elTd = Webfm.ce('td'); elTd.className = 'head'; elTr.appendChild(elTd); // Sort dir/files column var elTd = Webfm.ce('td'); elTd.className = 'head'; var elA = Webfm.ce('a'); elA.setAttribute('href', '#'); elA.setAttribute('title', Webfm.js_msg["sort"]); var listener = Webfm.eventListenerAdd(Webfm.eventListeners, elA, "click", function(e) { wl.sc_n^=1;wl.loadList("n");wl.sortIcon(e,wl.sc_n);Webfm.stopEvent(e); }); var elImg = Webfm.ce('img'); elImg.setAttribute('alt', Webfm.js_msg["sort"]); elImg.setAttribute('src', this.iconDir + '/down.gif'); elA.appendChild(elImg); elA.appendChild(Webfm.ctn(Webfm.js_msg["column1"])); elTd.appendChild(elA); elTr.appendChild(elTd); // date/time column var elTd = Webfm.ce('td'); elTd.className = 'head'; var elA = Webfm.ce('a'); elA.setAttribute('href', '#'); var listener = Webfm.eventListenerAdd(Webfm.eventListeners, elA, "click", function(e) { wl.sc_m^=1;wl.loadList("m");wl.sortIcon(e,wl.sc_m);Webfm.stopEvent(e); }); var elImg = Webfm.ce('img'); elImg.setAttribute('alt', Webfm.js_msg["sort"]); elImg.setAttribute('src', this.iconDir + '/down.gif'); elA.appendChild(elImg); elA.appendChild(Webfm.ctn(Webfm.js_msg["column2"])); elTd.appendChild(elA); elTr.appendChild(elTd); // size column var elTd = Webfm.ce('td'); elTd.className = 'head'; var elA = Webfm.ce('a'); elA.setAttribute('href', '#'); var listener = Webfm.eventListenerAdd(Webfm.eventListeners, elA, "click", function(e) { wl.sc_s^=1;wl.loadList("s");wl.sortIcon(e,wl.sc_s);Webfm.stopEvent(e); }); var elImg = Webfm.ce('img'); elImg.setAttribute('alt', Webfm.js_msg["sort"]); elImg.setAttribute('src', this.iconDir + '/down.gif'); elA.appendChild(elImg); elA.appendChild(Webfm.ctn(Webfm.js_msg["column3"])); elTd.appendChild(elA); elTr.appendChild(elTd); // owner column if(getWebfmOwnerColumn()) { var elTd = Webfm.ce('td'); elTd.className = 'head'; var elA = Webfm.ce('a'); elA.setAttribute('href', '#'); var listener = Webfm.eventListenerAdd(Webfm.eventListeners, elA, "click", function(e) { wl.sc_o^=1;wl.loadList("o");wl.sortIcon(e,wl.sc_o);Webfm.stopEvent(e); }); var elImg = Webfm.ce('img'); elImg.setAttribute('alt', Webfm.js_msg["sort"]); elImg.setAttribute('src', this.iconDir + '/down.gif'); elA.appendChild(elImg); elA.appendChild(Webfm.ctn(Webfm.js_msg["column4"])); elTd.appendChild(elA); elTr.appendChild(elTd); } //add ae860300 code_url column Web File Manager column------------------------------------------------------------ var elTd = Webfm.ce('td'); elTd.className = 'head'; var elA = Webfm.ce('a'); elA.setAttribute('href', '#'); // 2009 ae860300 add key_sc_u(url) var listener = Webfm.eventListenerAdd(Webfm.eventListeners, elA, "click", function(e) { wl.sc_u^=1;wl.loadList("u");wl.sortIcon(e,wl.sc_u);Webfm.stopEvent(e); }); var elImg = Webfm.ce('img'); elImg.setAttribute('alt', Webfm.js_msg["sort"]); elImg.setAttribute('src', this.iconDir + '/down.gif'); elA.appendChild(elImg); elA.appendChild(Webfm.ctn(Webfm.js_msg["column5"])); elTd.appendChild(elA); elTr.appendChild(elTd); //---------------------------------------------------------------------------------------------------------------- elTableBody.appendChild(elTr); elTable.appendChild(elTableBody); node.appendChild(elTable); parent.appendChild(node); } Webfm.list.prototype.bcrumb = function() { var cp = this; Webfm.clearNodeById(this.id + 'bcrumb'); elSpan = Webfm.$(this.id + 'bcrumb'); var pth = []; for(var i = 0; i < this.content.bcrumb.length - 1; i++) { pth.push(this.content.bcrumb[i]); elSpan.appendChild(Webfm.ctn(" / ")); // No breadcrumb link necessary for current directory var elA = Webfm.ce('a'); elA.setAttribute('href', '#'); // join previous loop iterations to create path for title elA.setAttribute('title', "/" + pth.join("/")); elA.appendChild(Webfm.ctn(this.content.bcrumb[i])); //IE fix var listener = Webfm.eventListenerAdd(Webfm.eventListeners, elA, "click", function(e) { cp.selectBC(e);Webfm.stopEvent(e); }); elSpan.appendChild(elA); } elSpan.appendChild(Webfm.ctn(" / ")); elSpan.appendChild(Webfm.ctn(this.content.bcrumb[i])); } Webfm.list.prototype.selectBC = function(event) { var el = event.target||window.event.srcElement; Webfm.selectDir(el.title); } Webfm.list.prototype.sortIcon = function(event, up_down) { var el = event.target||window.event.srcElement; if(el.firstChild) { el.firstChild.src = this.iconDir + '/' + (up_down?"up":"down") + '.gif'; } } Webfm.list.prototype.refresh = function(path, rename_dir) { if(path == null) path = Webfm.current; this.cache.remove(path); if(typeof rename_dir != 'undefined') { this.rename_dir = rename_dir; } this.fetch(path); } Webfm.list.prototype.fetch = function(curr_dir) { Webfm.alrtObj.msg(); if(curr_dir || (curr_dir = Webfm.current)) { Webfm.progressObj.show(Webfm.js_msg["work"], "blue"); //update current dir if specific dir selected Webfm.current = curr_dir; Webfm.dbgObj.dbg('fetch: ', curr_dir); if(this.cache.containsKey(Webfm.current)) { Webfm.dbgObj.dbg('cache hit: ', Webfm.current); this.content = this.cache.get(Webfm.current); this.bcrumb(); this.loadList(); var uploadpath = Webfm.$('edit-webfmuploadpath'); if(uploadpath) { uploadpath.value = Webfm.current; } Webfm.progressObj.hide(); } else { Webfm.admin = false; var postObj = { action:encodeURIComponent("read"), param0:encodeURIComponent(curr_dir) }; Webfm.HTTPPost(this.url, this.callback, this, postObj); } } else { Webfm.dbgObj.dbg(Webfm.js_msg["curdir-undef"]); } } Webfm.list.prototype.callback = function(string, xmlhttp, cp) { Webfm.progressObj.hide(); if (xmlhttp.status == 200) { cp.content = Drupal.parseJson(string); if(cp.content.status) { cp.cache.put(cp.content.current, cp.content); //Sets client permissions - server will always validate any action Webfm.admin = cp.content.admin; cp.bcrumb(); cp.loadList("n"); // Insert current directory path into upload form var uploadpath = Webfm.$('edit-webfmuploadpath'); if(uploadpath) { uploadpath.value = cp.content.current; Webfm.dbgObj.dbg('uploadpath: ', uploadpath.value); } Webfm.current = cp.content.current; cp.adminCtl(Webfm.admin); if(cp.rename_dir) { var found = false; for(var i = 0; i < Webfm.dirListObj.dirrows.length; i++) { if(cp.dirrows[i].clickObj.title == "/" + cp.rename_dir) { found = true; break; } } if(found) Webfm.menuRename(cp.dirrows[i]); } } else { Webfm.alrtObj.str_arr(cp.content.data); } } else { Webfm.alrtObj.msg(Webfm.js_msg["ajax-err"]); } } //build admin icons for create dir and file db insertion //maintain 4 column table Webfm.list.prototype.adminCtl = function(admin) { col_span = getWebfmOwnerColumn() ? 4 : 3 if(admin) { if(Webfm.$('webfm-bcrumb-td').colSpan == col_span) { var wl = this; Webfm.$('webfm-bcrumb-td').colSpan = col_span - 1; // Create New Directory and allow db insertions var elTd = Webfm.ce('td'); var elSpan = Webfm.ce('span'); elSpan.id = this.id + "-ctls"; var elA = Webfm.ce('a'); elA.title = Webfm.js_msg["new-dir"]; var elImg = Webfm.ce('img'); elImg.setAttribute('alt', Webfm.js_msg["new-dir"]); elImg.setAttribute('src', this.iconDir + '/dn.gif'); elA.appendChild(elImg); var listener = Webfm.eventListenerAdd(Webfm.eventListeners, elA, "click", function(e) { Webfm.stopEvent(e);wl.mkdir(); }); var listener = Webfm.eventListenerAdd(Webfm.eventListeners, elA, "mouseover", function(e) { wl.hover(e, true, 0); }); var listener = Webfm.eventListenerAdd(Webfm.eventListeners, elA, "mouseout", function(e) { wl.hover(e, false, 0); }); elSpan.appendChild(elA); var elA = Webfm.ce('a'); elA.title = Webfm.js_msg["add-2-db"]; var elImg = Webfm.ce('img'); elImg.setAttribute('alt', Webfm.js_msg["add-2-db"]); elImg.setAttribute('src', this.iconDir + '/add_loc.gif'); elA.appendChild(elImg); var listener = Webfm.eventListenerAdd(Webfm.eventListeners, elA, "click", function(e) { Webfm.stopEvent(e);wl.enumLocal(); }); var listener = Webfm.eventListenerAdd(Webfm.eventListeners, elA, "mouseover", function(e) { wl.hover(e, true); }); var listener = Webfm.eventListenerAdd(Webfm.eventListeners, elA, "mouseout", function(e) { wl.hover(e, false); }); elSpan.appendChild(elA); var elA = Webfm.ce('a'); elA.title = Webfm.js_msg["r-add-2-db"]; var elImg = Webfm.ce('img'); elImg.setAttribute('alt', Webfm.js_msg["r-add-2-db"]); elImg.setAttribute('src', this.iconDir + '/add_recur.gif'); elA.appendChild(elImg); var listener = Webfm.eventListenerAdd(Webfm.eventListeners, elA, "click", function(e) { Webfm.stopEvent(e);wl.enumRecur(); }); var listener = Webfm.eventListenerAdd(Webfm.eventListeners, elA, "mouseover", function(e) { wl.hover(e, true); }); var listener = Webfm.eventListenerAdd(Webfm.eventListeners, elA, "mouseout", function(e) { wl.hover(e, false); }); elSpan.appendChild(elA); elTd.appendChild(elSpan); Webfm.$('webfm-top-tr').appendChild(elTd); } else { Webfm.$('webfm-bcrumb-td').colSpan = col_span - 1; } } else { Webfm.$('webfm-bcrumb-td').colSpan = col_span; } } // IE does not understand 'this' inside event listener func Webfm.list.prototype.hover = function(event, state) { var el = event.target||window.event.srcElement; el.className = state ? 'selected' : ''; } // Function to create a new directory Webfm.list.prototype.mkdir = function() { Webfm.alrtObj.msg(); Webfm.progressObj.show(Webfm.js_msg["work"], "blue"); var postObj = { action:encodeURIComponent("mkdir"), param0:encodeURIComponent(this.content.current) }; Webfm.HTTPPost(this.url, this.mkdir_callback, this, postObj); } Webfm.list.prototype.enumLocal = function() { if(Webfm.confirm(Webfm.js_msg["enum_local"])) { Webfm.insert(this.content.current, "dir"); } } Webfm.list.prototype.enumRecur = function() { if(Webfm.confirm(Webfm.js_msg["enum_recur"])) { Webfm.insert(this.content.current, "recur"); } } Webfm.list.prototype.mkdir_callback = function(string, xmlhttp, cp) { Webfm.progressObj.hide(); if (xmlhttp.status == 200) { var result = Drupal.parseJson(string); Webfm.dbgObj.dbg("mkdir data:", result.data); if(result.status) { cp.refresh(cp.content.current, result.data); if(Webfm.dirTreeObj) { //we just updated the listing - 2nd var must be false Webfm.dirTreeObj.fetch(true, false); } } else { Webfm.alrtObj.str_arr(result.data); } } else { Webfm.alrtObj.msg(Webfm.js_msg["ajax-err"]); } } Webfm.list.prototype.loadList = function(sortcol) { this.c_dir = 0; this.c_fil = 0; //remove all rows beneath second row of listing table body while(this.secondRow.nextSibling) this.body.removeChild(this.secondRow.nextSibling); //clear event listeners for old listing Webfm.eventUnregister(this.eventListeners); // Build directory rows and append to table if(this.content.dirs.length) { this.dirrows = []; //IE hack since dirs have no size and no owner if(!(Webfm.browser.isIE && (sortcol == "s")) && !(sortcol == "o")) this.sortTable(this.content.dirs, sortcol); for(var i = 0; i < this.content.dirs.length; i++) { this.dirrows[i] = new Webfm.dirrow(this.body, this.content.dirs[i], i, this.dd_enable, this.dir_menu, this.eventListeners); } } // Build file rows and append to table // type determines file context menu if(this.content.files.length) { this.sortTable(this.content.files, sortcol); for(var i = 0; i < this.content.files.length; i++) { var filerow = new Webfm.filerow(this.body, this.content.files[i], this.type, i, this.dd_enable, this.file_menu, this.eventListeners); } } } // 2009 ae860300 add_key(url) Webfm.list.prototype.sortTable = function(arr, key) { switch (key) { case "o": arr.sort(Webfm.sortByOwner); if(this.sc_o) arr.reverse(); break; case "s": arr.sort(Webfm.sortBySize); if(this.sc_s) arr.reverse(); break; case "m": arr.sort(Webfm.sortByModified); if(this.sc_m) arr.reverse(); break; case "n": arr.sort(Webfm.sortByName); if(this.sc_n) arr.reverse(); break; //2009 ae860300 ----------------------------------------------------------------------------- case "u": arr.sort(Webfm.sortByUrl); if(this.sc_u) arr.reverse(); break; //-------------------------------------------------------------------------- } } /** * Webfm.dirrow constructor * 1st param is parent obj * 2nd param is dir object * 3rd param is unique number to append to id * 4th param enables drag and drop * 5th param is directory menu array * 6th param is event listener array for closure cleanup */ Webfm.dirrow = function(parent, dir, index, dd_enable, menu, eventListenerArr) { var dr = this; this.draggable = dd_enable; this.iconDir = getWebfmIconDir(); //id used for drop container var _id = 'webfm-dirlist' + index; var elTr = Webfm.ce('tr'); this.element = elTr; this.element.className = 'dirrow'; elTr.setAttribute('id', _id); elTr.setAttribute('title', dir.p); if(dd_enable && Webfm.admin) { //Webfm.draggable must be created after title assigned to set current path this.dd = new Webfm.draggable(Webfm.dragCont, elTr, this.element.className); } else { this.draggable = false; } var elTd = Webfm.ce('td'); var elImg = Webfm.ce('img'); elImg.setAttribute('src', this.iconDir + '/d.gif'); elImg.setAttribute('id', _id + 'dd'); elImg.setAttribute('alt', Webfm.js_msg["u_dir"]); this.menu = menu; elTd.appendChild(elImg); elTr.appendChild(elTd); var elTd = Webfm.ce('td'); // Title of link = path this.clickObj = Webfm.ce('a'); this.clickObj.setAttribute('href', '#'); //title is path this.clickObj.setAttribute('title', dir.p); this.clickObj.appendChild(Webfm.ctn(dir.n)); elTd.appendChild(this.clickObj); elTr.appendChild(elTd); var elTd = Webfm.ce('td'); elTd.className = 'txt'; elTd.appendChild(Webfm.ctn(Webfm.convertunixtime(parseInt(dir.m)))); elTr.appendChild(elTd); var elTd = Webfm.ce('td'); elTd.className = 'txt'; if(dir.s) { var size = Webfm.size(dir.s); elTd.appendChild(Webfm.ctn(size)); } elTr.appendChild(elTd); //2009 ae860300 add url ----------------------------------------------------------------- //webfm.url(dir.u) var elTd = Webfm.ce('td'); elTd.classNAME = 'txt'; if(dir.u){ var url = Webfm.url(dir.u); elTd.appendChild(Webfm.ctn(url)); } elTr.appendChild(elTd); //--------------------------------------------------------------------------------- //Add td if owner column enabled //位於網站設定/Web File Manager/Display file owner column in browser 若有啟用 if(getWebfmOwnerColumn()) { var elTd = Webfm.ce('td'); elTd.className = 'txt'; if(dir.o) { var owner = Webfm.ce(dir.o); elTd.appendChild(Webfm.ctn(owner)); } elTr.appendChild(elTd); } //mouse event listeners if(dd_enable) { var listener = Webfm.eventListenerAdd(eventListenerArr, this.element, "mousedown", function(e) { Webfm.contextMenuObj.hideContextMenu(e); dr.select(e); }); } else { var listener = Webfm.eventListenerAdd(eventListenerArr, this.element, "click", function(e) { Webfm.contextMenuObj.hideContextMenu(e); if(Webfm.renameActive == false)Webfm.selectDir(dr.element.title); }); } if(this.draggable) { var listener = Webfm.eventListenerAdd(eventListenerArr, this.element, "mouseover", function() { dr.hover(dr.element, true); }); var listener = Webfm.eventListenerAdd(eventListenerArr, this.element, "mouseout", function() { dr.hover(dr.element, false); }); } if(Webfm.browser.isOP) { var listener = Webfm.eventListenerAdd(eventListenerArr, this.element, "mouseup", function(e) { if( e && e.button == 0 && e.altKey == true ) { if(Webfm.renameActive == false)Webfm.contextMenuObj.showContextMenu(e, dr);Webfm.stopEvent(e); }; }); } else { var listener = Webfm.eventListenerAdd(eventListenerArr, this.element, "contextmenu", function(e) { if(Webfm.renameActive == false)Webfm.contextMenuObj.showContextMenu(e, dr);Webfm.stopEvent(e); }); } parent.appendChild(elTr); this.c_dir ++; } Webfm.dirrow.prototype.hover = function(el, state) { if(state) el.className += ' selected'; else el.className = el.className.split(' ', 1); } Webfm.dirrow.prototype.select = function(event) { var cp = this; if(Webfm.renameActive == true) return false; event = event || window.event; switch(event.target||event.srcElement) { case this.clickObj: // Determine mouse button var rightclick = Webfm.rclick(event); if(rightclick) break; setTimeout(function(){ //if click then no dragging... if(Webfm.dragging==false) { Webfm.selectDir(cp.element.title); } },200); //passthrough default: if(typeof this.dd != "undefined") this.dd.mouseButton(event); break; } return false; } /** * Webfm.filerow constructor * 1st param is parent obj * 2nd param is fileobject (see desc below) * 3rd param is base id name of file row * 4th param is unique number to append to id * 5th param enables drag and drop * 6th param is file menu array * 7th param is event listener array for closure cleanup * * fileobject elements: * id -> fid * n -> file name * p -> path (includes name) * s -> file size * m -> modified date * e -> mimetype extension * i -> image file. * w -> image width * h -> image height * un -> file owner user name * add url ->file url */ Webfm.filerow = function(parent, fileObj, idtype, index, dd_enable, file_menu, eventListenerArr) { var fr = this; this.draggable = dd_enable; this.iconDir = getWebfmIconDir(); this.ext = fileObj.e; this.filepath = fileObj.p + '/' + fileObj.n; this.uid = fileObj.u; this.ftitle = null; this.funame = fileObj.un; //2009 ae860300 add fileobject url-------------------------------------- this.fpath = fileObj.u; //----------------------------------------------------------------- if(typeof fileObj.ftitle != "undefined") this.ftitle = fileObj.ftitle; var elTr = Webfm.ce('tr'); this.element = elTr; elTr.className = idtype + 'row'; //drag object id used for download type if(typeof fileObj.id == "undefined") { this.row_id = 'nodb' + index; } else { if(fileObj.id == 0) this.row_id = idtype + index; else //TODO: fix - this causes repeat ids for attach rows! this.row_id = 'fid' + fileObj.id; } elTr.setAttribute('id', this.row_id); //title of drag object is path for move elTr.setAttribute('title', this.filepath); if(dd_enable) { //Only admins or owner of file can move it if(Webfm.admin || fileObj.u == getWebfmUid()) { this.dd = new Webfm.draggable(Webfm.dragCont, elTr, elTr.className); } else { this.draggable = false; } } var elTd = Webfm.ce('td'); var elImg = Webfm.ce('img'); if(fileObj.i) elImg.setAttribute('src', this.iconDir + '/i.gif'); else elImg.setAttribute('src', fr.getIconByExt()); if((typeof fileObj.id == "undefined") || fileObj.id == 0) { // Make icon transparent if file not in db - TODO: fix for IE elImg.style.opacity = 0.25; elImg.style.filter = "alpha(opacity=25)"; } elImg.setAttribute('alt', Webfm.js_msg["u_file"]); this.menu = file_menu; elTd.appendChild(elImg); elTr.appendChild(elTd); var elTd = Webfm.ce('td'); this.clickObj = Webfm.ce('a'); this.clickObj.setAttribute('href', '#'); if((typeof fileObj.id == "undefined") || fileObj.id == 0) { this.clickObj.setAttribute('title', this.filepath); } else { if(Webfm.browser.isOP) this.clickObj.setAttribute('href', getBaseUrl() + "\/webfm_send\/" + fileObj.id); this.clickObj.setAttribute('title', fileObj.id); } if(this.ftitle) this.clickObj.appendChild(Webfm.ctn(fileObj.ftitle)); else this.clickObj.appendChild(Webfm.ctn(fileObj.n)); elTd.appendChild(this.clickObj); elTr.appendChild(elTd); var elTd = Webfm.ce('td'); elTd.className = 'txt'; elTd.appendChild(Webfm.ctn(Webfm.convertunixtime(parseInt(fileObj.m)))); elTr.appendChild(elTd); var elTd = Webfm.ce('td'); elTd.className = 'txt'; var size = Webfm.size(fileObj.s); elTd.appendChild(Webfm.ctn(size)); elTr.appendChild(elTd); //owner field to row if(getWebfmOwnerColumn()) { var elTd = Webfm.ce('td'); elTd.className = 'txt'; elTd.appendChild(Webfm.ctn(fileObj.un)); elTr.appendChild(elTd); } //2009 ae860300 add column url filepath------------------------------------------------ if(getWebfmCleanUrl()) { var elTd = Webfm.ce('td'); elTd.className = 'txt'; // var url = Webfm.url(fileObj.u);this.filepath elTd.appendChild(Webfm.ctn(Webfm.ctn(parseInt(fileObj.fpath)))); elTr.appendChild(elTd); } //bug run error object //----------------------------------------------------------------------------------- //mouse event listeners if(dd_enable) var listener = Webfm.eventListenerAdd(eventListenerArr, this.element, "mousedown", function(e) { Webfm.contextMenuObj.hideContextMenu(e); fr.select(e); }); else var listener = Webfm.eventListenerAdd(eventListenerArr, this.element, "click", function(e) { Webfm.contextMenuObj.hideContextMenu(e); if(Webfm.renameActive == false)Webfm.selectFile(fr.clickObj.title, fr.element); }); if(this.draggable) { var listener = Webfm.eventListenerAdd(eventListenerArr, this.element, "mouseover", function() { fr.hover(fr.element, true); }); var listener = Webfm.eventListenerAdd(eventListenerArr, this.element, "mouseout", function() { fr.hover(fr.element, false); }); } if(Webfm.browser.isOP) { var listener = Webfm.eventListenerAdd(eventListenerArr, this.element, "mouseup", function(e) { if( e && e.button == 0 && e.altKey == true ) { if(Webfm.renameActive == false)Webfm.contextMenuObj.showContextMenu(e, fr);Webfm.stopEvent(e); }; }); } else { var listener = Webfm.eventListenerAdd(eventListenerArr, this.element, "contextmenu", function(e) { if(Webfm.renameActive == false)Webfm.contextMenuObj.showContextMenu(e, fr);Webfm.stopEvent(e); }); } parent.appendChild(elTr); this.c_fil++; } Webfm.filerow.prototype.hover = function(el, state) { if(state) el.className += ' selected'; else el.className = el.className.split(' ', 1); } Webfm.filerow.prototype.select = function(event) { var cp = this; if(Webfm.renameActive == true) return false; event = event || window.event; switch(event.target||event.srcElement) { case this.clickObj: // Determine mouse button var rightclick = Webfm.rclick(event); if(rightclick) break; setTimeout(function(){ //if click then no dragging... if(Webfm.dragging == false) { //element id used for download method (webfm_send||direct http access) Webfm.selectFile(cp.clickObj.title, cp.element); } },200); //passthrough default: if(typeof this.dd != "undefined") this.dd.mouseButton(event); break; } return false; } Webfm.filerow.prototype.getIconByExt = function() { // extension stored in file record of db fails - use pathname var ext = new String(this.ext); if(ext) { ext = ext.replace(/\//g, "_"); } else { ext = new String(this.filepath); var last = ext.lastIndexOf("."); if(last != -1) // "." found ext = ext.slice(last + 1); else ext = ""; } var icon = this.iconDir + '/' + ((Webfm.icons["e" + ext]) ? Webfm.icons["e" + ext] : "f") + '.gif'; return icon; } /* * Webfm.treeBuilder constructor */ Webfm.treeBuilder = function(parent, root_menu, dir_menu) { this.parent = parent; this.root_menu = root_menu; this.dir_menu = dir_menu; this.trees = []; } Webfm.treeBuilder.prototype.fetch = function(tree_refresh, list_refresh) { this.tree_refresh = tree_refresh; this.list_refresh = list_refresh var url = Webfm.ajaxUrl(); Webfm.alrtObj.msg(); Webfm.progressObj.show(Webfm.js_msg["work"], "blue"); var postObj = { action:encodeURIComponent("readtrees") }; if(tree_refresh) postObj.param0 = encodeURIComponent(true); Webfm.admin = false; Webfm.HTTPPost(url, this.callback, this, postObj); } Webfm.treeBuilder.prototype.callback = function(string, xmlhttp, cp) { Webfm.progressObj.hide(); if (xmlhttp.status == 200) { result = Drupal.parseJson(string); // Webfm.dbgObj.dbg("trees fetch:", Webfm.dump(result)); if(result.status) { if(result.err) { Webfm.alrtObj.msg(result.err); } Webfm.admin = result.admin; // build directory trees from php associative array // first var used to fetch listing of first tree var first = true; for(var i in result.tree) { // Webfm.dbgObj.dbg("tree" + i, Webfm.dump(result.tree[i])); if(!cp.trees[i]) { cp.trees[i] = new Webfm.tree(cp.parent, i, cp.root_menu, cp.dir_menu); } if(first) { cp.trees[i].fetch(cp.tree_refresh, cp.list_refresh); } else { cp.trees[i].fetch(cp.tree_refresh, false); } first = false; } } else { Webfm.alrtObj.msg(result.err); } } else { Webfm.alrtObj.msg(Webfm.js_msg["ajax-err"]); } } /** * Webfm.tree constructor * 1st param is parent node to append this Webfm.tree object * 2nd param is index to append to base id of Webfm.tree object * 3rd param is root directory menu array * 4th param is non-root directory menu array */ Webfm.tree = function(parent, treeIdx, root_menu, dir_menu) { var wt = this; this.id = 'dirtree' + treeIdx; this.treeIdx = treeIdx; this.icondir = getWebfmIconDir(); this.content = ''; this.expAllData = [['collapse', 'minus', 'block'], ['expand', 'plus', 'none']]; // Set tree exp/collapse behaviour on load (0 = expanded, 1 = collapsed) this.expAllIndex = 1; this.root_menu = root_menu; this.dir_menu = dir_menu; this.eventListeners = [] var node = Webfm.ce("div"); node.setAttribute('id', this.id); node.className = 'dirtree'; //build tree and display var elA = Webfm.ce('a'); elA.setAttribute('href', '#'); elA.setAttribute('title', Webfm.js_msg["refresh"]); var listener = Webfm.eventListenerAdd(Webfm.eventListeners, elA, "click", function(e) { wt.fetch(true, '');Webfm.stopEvent(e); }); var elImg = Webfm.ce('img'); elImg.setAttribute('src', this.icondir + '/r.gif'); elImg.setAttribute('alt', Webfm.js_msg["refresh"]); elA.appendChild(elImg); node.appendChild(elA); var elSpan = Webfm.ce("span"); elSpan.appendChild(Webfm.ctn(' ')); elSpan.setAttribute('id', this.id + 'Name'); node.appendChild(elSpan); // Expand/Collapse all folders buttons var elSpan = Webfm.ce("span"); elSpan.setAttribute('id', this.id + 'exp'); for(var i = 0; i < 2; i++) { var elA = Webfm.ce('a'); elA.setAttribute('href', '#'); if (i) { elA.setAttribute('title', 'expand tree'); var listener = Webfm.eventListenerAdd(Webfm.eventListeners, elA, "click", function(e) { wt.exp(0);Webfm.stopEvent(e); }); } else { elA.setAttribute('title', 'collapse tree'); var listener = Webfm.eventListenerAdd(Webfm.eventListeners, elA, "click", function(e) { wt.exp(1);Webfm.stopEvent(e); }); } var elImg = Webfm.ce('img'); elImg.setAttribute('alt', this.expAllData[i][0]); elImg.setAttribute('src', this.icondir + '/' + this.expAllData[i][1] + '.gif'); elA.appendChild(elImg); elSpan.appendChild(elA); } node.appendChild(elSpan); //container div for tree var elDiv = Webfm.ce("div"); this.treeCont = elDiv; node.appendChild(elDiv); parent.appendChild(node); } Webfm.tree.prototype.fetch = function(tree_refresh, list_refresh) { // Reset ul count (0=root) this.treeUlCounter = 0; this.treeNodeCounter = 0; this.list_refresh = list_refresh; var url = Webfm.ajaxUrl(); Webfm.alrtObj.msg(); Webfm.progressObj.show(Webfm.js_msg["work"], "blue"); Webfm.dbgObj.dbg("tree fetch path:", this.treeIdx); var postObj = { action:encodeURIComponent("readtree"), param0:encodeURIComponent(this.treeIdx) }; if(tree_refresh) postObj.param1 = encodeURIComponent(true); Webfm.HTTPPost(url, this.callback, this, postObj); } Webfm.tree.prototype.callback = function(string, xmlhttp, cp) { Webfm.progressObj.hide(); if (xmlhttp.status == 200) { cp.content = Drupal.parseJson(string); // Webfm.dbgObj.dbg("tree fetch:", Webfm.dump(cp.content)); //clear tree content while (cp.treeCont.hasChildNodes()) cp.treeCont.removeChild(cp.treeCont.firstChild); //clear event listeners for old tree content Webfm.eventUnregister(cp.eventListeners); //clear drop container array; Webfm.dropContainers = []; //update tree name var treeName = Webfm.$(cp.id + 'Name'); treeName.removeChild(treeName.firstChild); for(var j in cp.content.tree) { //textnode = last directory of root path treeName.appendChild(Webfm.ctn(' ' + j.substring(j.lastIndexOf("/") + 1) + ' ' + Webfm.js_msg["tree"])); break; } // Recursively build directory tree from php associative array cp.buildTreeRecur(cp.content.tree, cp.treeCont, ''); cp.init(); if(cp.list_refresh) { Webfm.dirListObj.refresh(cp.content.current); } } else { Webfm.alrtObj.msg(Webfm.js_msg["ajax-err"]); } } Webfm.tree.prototype.getpath = function() { return this.content.current; } Webfm.tree.prototype.showHideNode = function (event) { event = event || window.event; var collapseIcon = event.target||event.srcElement; if(collapseIcon.style.visibility == 'hidden') return; var ul = collapseIcon.parentNode.parentNode.getElementsByTagName('ul')[0]; if(collapseIcon.title == this.expAllData[0][0]) { collapseIcon.src = this.icondir + '/' + this.expAllData[1][1] + '.gif'; collapseIcon.alt = this.expAllData[1][0]; collapseIcon.title = this.expAllData[1][0]; ul.style.display = this.expAllData[1][2]; }else{ collapseIcon.src = this.icondir + '/' + this.expAllData[0][1] + '.gif'; collapseIcon.alt = this.expAllData[0][0]; collapseIcon.title = this.expAllData[0][0]; ul.style.display = this.expAllData[0][2]; //url.display = this.exALLDatea[3][3]; //collapseIcon.filename = this.exAllData[1][2]; } } Webfm.tree.prototype.buildTreeRecur = function(content, parent, input_path) { var cp = this; //php associative array is always a single member array with nested objects if(Webfm.isArray(content)) { this.buildTreeRecur(content[0], parent, ''); } else if (Webfm.isObject(content)) { if(input_path) input_path += "/"; var elUl = Webfm.ce('ul'); if(!(this.treeUlCounter++)) elUl.className = 'root-list'; // sort object here since php does not have a case-sensitive ksort var sortDir = []; for(var i in content) { sortDir.push(i); } if(sortDir.length) { sortDir.sort(Webfm.sortByKey); for(var j = 0; j < sortDir.length; j++) { var newpath = input_path + sortDir[j]; var elLi = Webfm.ce('li'); var _id = this.id + 'node' + this.treeNodeCounter; elLi.setAttribute('id', _id); elLi.setAttribute('title', newpath); elLi.className = "treenode"; var elDiv = Webfm.ce('div'); var elImg = Webfm.ce('img'); elImg.setAttribute('src', this.icondir + '/' + this.expAllData[this.expAllIndex][1] + '.gif'); elImg.setAttribute('alt', this.expAllData[this.expAllIndex][0]); elImg.setAttribute('title', this.expAllData[this.expAllIndex][0]); elDiv.appendChild(elImg); elLi.appendChild(elDiv); var listener = Webfm.eventListenerAdd(this.eventListeners, elImg, "click", function(e) { cp.showHideNode(e);Webfm.stopEvent(e); }); var treeNode = new Webfm.treeNode(elDiv, newpath, _id, elImg, this.treeNodeCounter ? this.dir_menu : this.root_menu, this.eventListeners); var listener = Webfm.eventListenerAdd(this.eventListeners, elDiv, "mouseover", function(e) { cp.hover(e, true); }); var listener = Webfm.eventListenerAdd(this.eventListeners, elDiv, "mouseout", function(e) { cp.hover(e, false); }); this.treeNodeCounter++; this.buildTreeRecur(content[sortDir[j]], elLi, newpath); elUl.appendChild(elLi); } } // Always show root if(elUl.className == 'root-list') elUl.style.display = 'block'; else elUl.style.display = this.expAllData[this.expAllIndex][2]; parent.appendChild(elUl); } } // IE does not understand 'this' inside event listener func Webfm.tree.prototype.hover = function(event, state) { var el = event.target||window.event.srcElement; if(state) { el.className = 'selected'; el.parentNode.className = 'selected'; // el.parentNode.className += ' selected'; } else { // var class_names = []; // class_names = el.parentNode.className.split(' '); // el.parentNode.className = class_names[0]; el.className = ''; el.parentNode.className = ''; } } Webfm.tree.prototype.init = function() { // Determine if expand/collapse icon is present // Create event objects for each element var dirItems = this.treeCont.getElementsByTagName('li'); if (dirItems.length) { for(var i = 0; i < dirItems.length; i++) { var subItems = dirItems[i].getElementsByTagName('ul'); if(!subItems.length) // Hide collapse icon if no sub-directories dirItems[i].getElementsByTagName('img')[0].style.visibility='hidden'; } } } Webfm.tree.prototype.exp = function(expcol) { //clear tree while(this.treeCont.hasChildNodes()) this.treeCont.removeChild(this.treeCont.firstChild); // Rebuild dirtree ul/li objects from dirtree object this.expAllIndex = expcol; this.treeUlCounter = 0; this.treeNodeCounter = 0; this.buildTreeRecur(this.content.tree, this.treeCont, ''); this.init(); } Webfm.treeNode = function(parent, path, id, expImg, menu, eventListenerArr) { var tn = this; this.parent = parent; this.element = parent.parentNode; var icondir = getWebfmIconDir(); this.expClickObj = expImg; var elImg = Webfm.ce('img'); elImg.setAttribute('id', id + 'dd'); elImg.setAttribute('src', icondir + '/d.gif'); parent.appendChild(elImg); this.clickObj = Webfm.ce('a'); this.clickObj.href = '#'; //anchor title is path this.clickObj.setAttribute('title', path); var nodeNumPos = this.element.id.indexOf("node") + 4; if((this.element.id.substring(nodeNumPos) != "0") && (Webfm.admin)) // root treenode isn't draggable this.dd = new Webfm.draggable(Webfm.dragCont, this.element, this.element.className); var root = []; root = path.split('/'); //textNode is last directory name of path string (used for root path) this.clickObj.appendChild(Webfm.ctn(root[root.length - 1])); parent.appendChild(this.clickObj); //mouse event listeners this.menu = menu; if(typeof this.dd != "undefined") { var listener = Webfm.eventListenerAdd(eventListenerArr, parent, "mousedown", function(e) { Webfm.contextMenuObj.hideContextMenu(e); tn.select(e); }); } else { var listener = Webfm.eventListenerAdd(eventListenerArr, parent, "click", function(e) { Webfm.selectDir(tn.clickObj.title); Webfm.stopEvent(e); }); } if(Webfm.browser.isOP) { var listener = Webfm.eventListenerAdd(eventListenerArr, parent, "mouseup", function(e) { if( e && e.button == 0 && e.altKey == true ) { if(Webfm.renameActive == false)Webfm.contextMenuObj.showContextMenu(e, tn);Webfm.stopEvent(e); }; }); } else { var listener = Webfm.eventListenerAdd(eventListenerArr, parent, "contextmenu", function(e) { if(Webfm.renameActive == false)Webfm.contextMenuObj.showContextMenu(e, tn);Webfm.stopEvent(e); }); } } Webfm.treeNode.prototype.select = function(event) { var cp = this; // disable during rename if(Webfm.renameActive == true) return false; event = event|| window.event; switch(event.target||event.srcElement) { case this.expClickObj: break; case this.clickObj: // Determine mouse button var rightclick = Webfm.rclick(event); if(rightclick) // oncontextmenu will handle this break; setTimeout(function(){ //if click then no dragging... if(Webfm.dragging==false) { Webfm.selectDir(cp.clickObj.title); } },200); //passthrough default: if(typeof this.dd != "undefined") this.dd.mouseButton(event); break; } return false; } Webfm.selectDir = function(path) { Webfm.dirListObj.fetch(path); } // File download Webfm.selectFile = function(path, el, as_file) { //files not in db use file path in tr title for download //files inside webfm have 'fidxxx' as title var fid = null; var sent = false; var pths = []; pths = el.title.split('/'); if(el.id.substring(0,3) == 'fid' || el.id.substring(0,3) == 'sid') { fid = el.id.substring(3); var fullpath = 'webfm_send/' + path; if(as_file) fullpath += '/1'; } else { //replace / with ~ since server uses / as param delimiter var pluspath = pths.join('~'); var fullpath = 'webfm_send/' + encodeURIComponent(pluspath); } //2009 ae860300 getfile_url-------------------------------------------------------- if(getWebfmCleanUrl()) { var url = getBaseUrl() + '/' + fullpath; } else { var url = '?q=' + fullpath; } if(as_file) { // Send download/open dialog window.location = url; } else { var cache = Webfm.dirListObj.cache.get(Webfm.current); for(var i in cache.files) { // Display downloaded image in iframe // check cache files[] array for path match and image type if (((cache.files[i].id == fid) || ((cache.files[i].p + '/' + cache.files[i].n) == path)) && cache.files[i].i) { // FF needs unique name per iframe - Webfm.zindex guaranteed unique // since incremented with each new pane var iframeName = "dwnld" + Webfm.zindex; var pane = new Webfm.pane(Webfm.viewCont, pths[pths.length - 1], "webfm-viewFile", null, 200, 200); // I hate using innerHTML but IE iframe requires this method: pane.content.innerHTML=''; if(fid) pane.headerMsg("fid:" + path); pane.show(); window.frames[iframeName].location.replace(url); sent = true; break; } } // Not an image - launch file in new browser instance if(!sent) { // window.open(url); window.location = url; } } } /** * Webfm.context constructor */ Webfm.context = function(container) { Webfm.renameActive = false; this.container = container; this.eventListeners = this.container.eventListenerArr; } Webfm.context.prototype.hideContextMenu = function(event) { // Hide context menu and restore document oncontextmenu handler this.container.obj.style.visibility = "hidden"; document.body.oncontextmenu = Webfm.oldOnContextMenu; } //obj is treenode|filerow|dirrow Webfm.context.prototype.showContextMenu = function(event, obj) { var cp = this; this.element = obj.element; this.clickObj = obj.clickObj; //Webfm.dbgObj.dbg('this.element.title:', this.element.title); document.body.oncontextmenu = new Function ("return false"); event = event || window.event; var pos = Drupal.mousePosition(event); // Remove any existing list in our contextMenu. this.container.destroy(); // Build menu ul and append to this.container if(obj.menu != null) { var elUl = Webfm.ce('ul'); for(var j = 0; j < obj.menu.length; j++) { var elLi = Webfm.ce('li'); //Run prepare function and return true if menuElement to appear in menu if(typeof obj.menu[j].prepFunc == 'function' && !obj.menu[j].prepFunc(obj)) { continue; } elLi.appendChild(Webfm.ctn(obj.menu[j].desc)); //menu selection is title of event elLi.id = 'webfm-cxtMenu' + j; var listener = Webfm.eventListenerAdd(Webfm.eventListeners, elLi, "mousedown", function(e) { cp.selectMenu(e, obj); cp.hideContextMenu(e); Webfm.stopEvent(e); }); var listener = Webfm.eventListenerAdd(Webfm.eventListeners, elLi, "mouseover", function(e) { cp.hover(e, true); }); var listener = Webfm.eventListenerAdd(Webfm.eventListeners, elLi, "mouseout", function(e) { cp.hover(e, false); }); elUl.appendChild(elLi); } this.container.obj.appendChild(elUl); this.container.obj.style.visibility = "visible"; if(pos.x + this.container.obj.offsetWidth > (document.documentElement.offsetWidth-20)){ pos.x = pos.x + (document.documentElement.offsetWidth - (pos.x + this.container.obj.offsetWidth)) - 20; } this.container.obj.style.left = pos.x + 'px'; this.container.obj.style.top = pos.y + 'px'; this.container.obj.style.display ='block'; this.container.obj.style.zIndex = ++Webfm.zindex; } var listener = Webfm.eventListenerAdd(Webfm.eventListeners, document, "mousedown", function(e) { cp.hideContextMenu(e); }); return false; } // IE does not understand 'this' inside event listener func Webfm.context.prototype.hover = function(event, state) { var el = event.target||window.event.srcElement; el.className = state ? 'selected' : ''; } // Call Webfm.menuElement execute function Webfm.context.prototype.selectMenu = function(event, obj) { event = event || window.event; obj.menu[(event.target||event.srcElement).id.substring(13)].execFunc(obj); return false; } Webfm.menuElement = function(desc, execFunc, prepFunc) { this.desc = desc; this.execFunc = execFunc; this.prepFunc = prepFunc; } //obj is treenode|filerow|dirrow Webfm.menuElement.prototype.exec = function(obj) { this.execFunc(obj); } Webfm.menuRemove = function(obj) { var url = Webfm.ajaxUrl(); if(typeof obj.ext != "undefined") //directories don't have extension properties obj.is_file = true; var path = obj.element.title; obj.parentPath = path.substring(0, path.lastIndexOf("/")); if(Webfm.confirm(Webfm.js_msg["confirm-del0"] + (obj.is_file ? Webfm.js_msg["file"] : Webfm.js_msg["dir"]) + " " + path + (obj.is_file ? "" : Webfm.js_msg["confirm-del1"]) + "?")) { Webfm.progressObj.show(Webfm.js_msg["work"], "blue"); var postObj = { action:encodeURIComponent("delete"), param0:encodeURIComponent(path) }; Webfm.HTTPPost(url, Webfm.ctxMenuCallback, obj, postObj); return false; } } Webfm.menuMkdir = function(obj) { var url = Webfm.ajaxUrl(); obj.is_file = false; var path = obj.element.title; obj.parentPath = path; Webfm.progressObj.show(Webfm.js_msg["work"], "blue"); var postObj = { action:encodeURIComponent("mkdir"), param0:encodeURIComponent(path) }; Webfm.HTTPPost(url, Webfm.ctxMenuMkdirCallback, obj, postObj); } Webfm.menuRename = function(obj) { if(typeof obj.ext != "undefined") //directories don't have extension properties obj.is_file = true; obj.renInput = Webfm.ce('input'); obj.renInput.setAttribute('type', 'textfield'); obj.renInput.value = obj.clickObj.firstChild.nodeValue; //clone input element since Webfm.contextMenuObj isn't destroyed on DOM obj.tempInput = obj.renInput.cloneNode(true); obj.tempInput.setAttribute('autocomplete','off'); //FF focus bug obj.clickparent = obj.clickObj.parentNode; obj.clickparent.replaceChild(obj.tempInput, obj.clickObj); //no change (blur) - restore original textNode var listener = Webfm.eventListenerAdd(Webfm.eventListeners, obj.tempInput, "blur", function (e) { Webfm.renameActive = false; obj.clickparent.replaceChild(obj.clickObj, obj.tempInput);Webfm.stopEvent(e); }); //listen for enter key up - swap names (illegal names are ignored on server and next list //refresh will restore the proper filename) var listener = Webfm.eventListenerAdd(Webfm.eventListeners, obj.tempInput, "keydown", function(e) { if(Webfm.enter(e) && Webfm.renameActive == true){ Webfm.renameActive = false; Webfm.menuSwapname(obj); this.blur(); Webfm.stopEvent(e);} }); setTimeout(function(){ obj.tempInput.focus();Webfm.renameActive = true; },10); } Webfm.menuSearch = function(obj) { Webfm.searchObj.createForm(obj.element.title); } Webfm.menuSwapname = function(obj) { var url = Webfm.ajaxUrl(); var oldpath = obj.element.title; obj.parentPath = oldpath.substring(0, oldpath.lastIndexOf("/")); var newpath = obj.parentPath + '/' + obj.tempInput.value; var postObj = { action:encodeURIComponent("rename"), param0:encodeURIComponent(oldpath), param1:encodeURIComponent(newpath) }; Webfm.HTTPPost(url, Webfm.ctxMenuCallback, obj, postObj); return true; } Webfm.menuGetMeta = function(obj) { var url = Webfm.ajaxUrl(); // Webfm.dbgObj.dbg("obj.clickObj.title:", obj.clickObj.title); Webfm.progressObj.show(Webfm.js_msg["work"], "blue"); var postObj = { action:encodeURIComponent("getmeta"), param0:encodeURIComponent(obj.clickObj.title) }; Webfm.HTTPPost(url, Webfm.ctxMenuMetaCallback, '', postObj); } Webfm.menuAttach = function(obj, _fid) { var url = Webfm.ajaxUrl(); if(obj == null) var fid = _fid; else fid = obj.clickObj.title; //check that this file is not already attached var attach_arr = []; attach_arr = Webfm.$(Webfm.attachFormInput).value.split(','); for(var i = 0; i < attach_arr.length; i++) { if(fid == attach_arr[i]) break; } if(i == attach_arr.length) { Webfm.progressObj.show(Webfm.js_msg["work"], "blue"); var postObj = { action:encodeURIComponent("attachfile"), param0:encodeURIComponent(fid) }; Webfm.HTTPPost(url, Webfm.ctxMenuAttachCallback, '', postObj); } } Webfm.menuDetach = function(obj) { Webfm.alrtObj.msg(); var path = obj.element.title; if(Webfm.confirm(Webfm.js_msg["confirm-det"] + path + "?")) { // update table obj.element.parentNode.removeChild(obj.element); // update form input var attach_arr = []; attach_arr = Webfm.$(Webfm.attachFormInput).value.split(','); var new_attach_arr = []; var j = 0; // tr elements use 'fid#' in 'title' field var fid = obj.element.id.substring(3); for(var i = 0; i < attach_arr.length; i++) { if(attach_arr[i] != fid) { new_attach_arr[j++] = attach_arr[i]; } } Webfm.$(Webfm.attachFormInput).value = new_attach_arr.join(','); } } Webfm.menuView = function(obj) { Webfm.selectFile(obj.clickObj.title, obj.element, false); } Webfm.menuDownload = function(obj) { Webfm.selectFile(obj.clickObj.title, obj.element, true); } Webfm.menuDbRem = function(obj) { var path = obj.element.title; //strip 'fid' from front of id var fid = obj.element.id.substring(3); if(Webfm.confirm(Webfm.js_msg["confirm-dbrem0"] + path + Webfm.js_msg["confirm-dbrem1"])) { var url = Webfm.ajaxUrl(); Webfm.progressObj.show(Webfm.js_msg["work"], "blue"); var postObj = { action:encodeURIComponent("dbrem"), param0:encodeURIComponent(fid) }; // path for callback must be a directory - not a file path = path.substring(0, path.lastIndexOf("/")); Webfm.HTTPPost(url, Webfm.dbrem_callback, path, postObj); } return false; } Webfm.menuGetPerm = function(obj) { var url = Webfm.ajaxUrl(); Webfm.progressObj.show(Webfm.js_msg["work"], "blue"); var postObj = { action:encodeURIComponent("getperm"), param0:encodeURIComponent(obj.clickObj.title) }; Webfm.HTTPPost(url, Webfm.ctxMenuPermCallback, '', postObj); } Webfm.dbrem_callback = function(string, xmlhttp, path) { Webfm.alrtObj.msg(); Webfm.progressObj.hide(); if (xmlhttp.status == 200) { var result = Drupal.parseJson(string); Webfm.dbgObj.dbg("dbrem:", Webfm.dump(result)); if (result.status) { Webfm.dirListObj.refresh(path); } else { if(result.data) { Webfm.alrtObj.str_arr(result.data); } else { Webfm.alrtObj.msg("operation fail"); } } } else { Webfm.alrtObj.msg(Webfm.js_msg["ajax-err"]); } } Webfm.menuInsert = function(obj) { Webfm.insert(obj.element.title, "file"); } Webfm.insert = function(path, type) { var url = Webfm.ajaxUrl(); Webfm.progressObj.show(Webfm.js_msg["work"], "blue"); var postObj = { action:encodeURIComponent("insert"), param0:encodeURIComponent(path), param1:encodeURIComponent(type) }; if(type == "file") { // path for callback must be a directory - not a file path = path.substring(0, path.lastIndexOf("/")); } Webfm.HTTPPost(url, Webfm.insert_callback, path, postObj); return false; } Webfm.insert_callback = function(string, xmlhttp, path) { Webfm.alrtObj.msg(); Webfm.progressObj.hide(); if (xmlhttp.status == 200) { var result = Drupal.parseJson(string); Webfm.dbgObj.dbg("insert:", Webfm.dump(result)); if (result.status) { //if success, update fetch if(result.data.cnt) { Webfm.dirListObj.refresh(path); Webfm.alrtObj.msg(result.data.cnt + Webfm.js_msg["inserted"]); } if(result.data.errcnt) { Webfm.alrtObj.msg(result.data.errcnt + Webfm.js_msg["not-inserted"]); Webfm.alrtObj.str_arr(result.data.err); } } else if(result.data.err) { Webfm.alrtObj.str_arr(result.data.err); } else { Webfm.alrtObj.msg(result.data); } } else { Webfm.alrtObj.msg(Webfm.js_msg["ajax-err"]); } } Webfm.generateFileHref = function(obj, url) { if(typeof url == 'undefined') { url = getBaseUrl(); } var title = ''; if(typeof obj.ftitle != "undefined" && obj.ftitle != null && obj.ftitle.length) title = obj.ftitle; else title = obj.element.title.substring(obj.element.title.lastIndexOf("/") + 1); // 2009 ae860300 file url test---------------------------------------------------------------------------------- //obj.element.id.substring is [ node ] _OK if(getWebfmCleanUrl()) { // string = "" + title + ""; string = "" + title + ""; ///dfm/sites/default/files/files/ } else { //string = "" + title + ""; string = "" + title + ""; } //-------------------------------------------------------------------------------------------------------------- return string; } Webfm.menuPutLinkInClipboard = function(obj) { Webfm.copyToClipboard(Webfm.generateFileHref(obj)); } Webfm.menuPasteHref = function(obj) { var fileHref = Webfm.generateFileHref(obj, getBasePath().replace(/\/$/,'')); var myField = Webfm.lastarea; //IE support if(document.selection) { myField.focus(); sel = document.selection.createRange(); sel.text = fileHref; } //other browsers else if(myField.selectionStart || myField.selectionStart == '0') { var startPos = myField.selectionStart; var endPos = myField.selectionEnd; myField.value = myField.value.substring(0, startPos)+ fileHref + myField.value.substring(endPos, myField.value.length); } else { myField.value += fileHref; } } Webfm.menuAdmin = function() { return(Webfm.admin); } Webfm.menuFileUid = function(obj) { //determine if we are the owner of this file return((Webfm.admin || obj.uid == getWebfmUid()) ? true : false); } Webfm.menuRenFileUid =function(obj) { if(Webfm.menuFileUid(obj)) // Determine if name is a metadata title return(obj.ftitle == null); return false; } Webfm.menuFilePerm = function(obj) { // object must be file in db with user access if(Webfm.menuFidVal(obj)) { return(Webfm.menuFileUid(obj)); } return false; } Webfm.menuAdminFidVal = function(obj) { if(Webfm.admin) return(Webfm.menuFidVal(obj)); return false; } Webfm.menuAdminNoFidVal = function(obj) { if(Webfm.admin) return(Webfm.menuNoFidVal(obj)); return false; } //menu prepFunc to determine if filerow has 'fid' as first 3 letters of id Webfm.menuFidVal = function(obj) { if(obj.element.id.substring(0,3) == 'fid') return true; return false; } Webfm.menuNoFidVal = function(obj) { if(obj.element.id.substring(0,3) != 'fid') return true; return false; } Webfm.confirm = function(text) { var agree = confirm(text); return agree ? true : false; } /** * Context menu callbacks */ Webfm.ctxMenuAttachCallback = function(string, xmlhttp, cp) { Webfm.progressObj.hide(); if (xmlhttp.status == 200) { var result = Drupal.parseJson(string); // Webfm.dbgObj.dbg("attach:", Webfm.dump(result)); if (result.status) { Webfm.admin = result.admin; var filerow = new Webfm.filerow(Webfm.attachObj.body, result.data, 'attach', '', true, Webfm.menuHT.get('det'), Webfm.attachObj.eventListeners); var elInput = Webfm.$(Webfm.attachFormInput); elInput.setAttribute('value', (elInput.getAttribute('value')?elInput.getAttribute('value')+',':'') + result.data.id); } else Webfm.alrtObj.msg(result.data); } else { Webfm.alrtObj.msg(Webfm.js_msg["ajax-err"]); } } Webfm.ctxMenuCallback = function(string, xmlhttp, obj, mkdir_flag) { Webfm.progressObj.hide(); Webfm.alrtObj.msg(); if (xmlhttp.status == 200) { var result = Drupal.parseJson(string); // Webfm.dbgObj.dbg("context:", Webfm.dump(result)); // Webfm.dbgObj.dbg("obj:", obj.droppath); if (result.status) { if(!obj.is_file && Webfm.dirTreeObj) { Webfm.dirTreeObj.fetch(true, false); } //if success, flush cache for updated fetch if(typeof mkdir_flag != "undefined") { Webfm.dirListObj.refresh(obj.parentPath, result.data); } else { Webfm.dirListObj.refresh(obj.parentPath); } } else if(result.data) { Webfm.alrtObj.str_arr(result.data); } else { Webfm.alrtObj.msg("operation fail"); } } else { Webfm.alrtObj.msg(Webfm.js_msg["ajax-err"]); } } Webfm.ctxMenuMkdirCallback = function(string, xmlhttp, obj) { var mkdir_flag = true; // fourth var to signal the listing to rename the new directory Webfm.ctxMenuCallback(string, xmlhttp, obj, mkdir_flag) } Webfm.ctxMenuMetaCallback = function(string, xmlhttp, obj) { Webfm.progressObj.hide(); if(xmlhttp.status == 200) { var result = Drupal.parseJson(string); // Webfm.dbgObj.dbg("meta result:", Webfm.dump(result)); if(result.status) { Webfm.metaObj.createForm(result.data); } else Webfm.alrtObj.msg(result.data); } else { Webfm.alrtObj.msg(Webfm.js_msg["ajax-err"]); } } Webfm.ctxMenuPermCallback = function(string, xmlhttp, obj) { Webfm.progressObj.hide(); if(xmlhttp.status == 200) { var result = Drupal.parseJson(string); // Webfm.dbgObj.dbg("perm result:", Webfm.dump(result)); if(result.status) { Webfm.permObj.createForm(result.data); } else Webfm.alrtObj.msg(result.data); } else { Webfm.alrtObj.msg(Webfm.js_msg["ajax-err"]); } } /** * Webfm.perm constructor * 1st param is popup container obj * 2nd param is default startup width * 2nd param is default startup height */ Webfm.perm = function(container, width, height) { var elDiv = Webfm.ce('div'); elDiv.setAttribute('id', 'webfm-perm-form'); var elForm = Webfm.ce('form'); elDiv.appendChild(elForm); var elTable = Webfm.ce('table'); elForm.appendChild(elTable); var elTBody = Webfm.ce('tbody'); elTable.appendChild(elTBody); var elControls = Webfm.ce('div'); elForm.appendChild(elControls); this.obj = elDiv; this.container = container; this.form = elForm; this.tbody = elTBody; this.controls = elControls; this.width = width; this.height = height; this.eventListeners = this.container.eventListenerArr; } Webfm.perm.prototype.createForm = function(data) { cp = this; this.data = data; this.permit = (Webfm.admin || this.data["u"] == getWebfmUid()) ? true : false; //clear any permissions info this.resetForm(); //create new pane to house this perm object this.pane = new Webfm.pane(this.container, Webfm.js_msg["perm"], "webfm-permPane", this.obj, this.width, this.height); //create permissions checkboxes this.fillFormData(); //create controls if owner has rights to file if(this.permit) { this.buildFormControls(); } else { //put read-only indicator in pane header pane.headerMsg("read-only"); } } Webfm.perm.prototype.resetForm = function() { var tbody = this.tbody; while(tbody.hasChildNodes()) { tbody.removeChild(tbody.firstChild); } var controls = this.controls; while(controls.hasChildNodes()) { controls.removeChild(controls.firstChild); } } Webfm.perm.prototype.fillFormData = function() { for(var j in this.data) { if (j != "p") { var elTr = Webfm.ce('tr'); // label td var elTd = Webfm.ce('td'); elTd.appendChild(Webfm.ctn(Webfm.permInfoHT.get(j) + ': ')); elTr.appendChild(elTd); // info td var elTd = Webfm.ce('td'); elTd.appendChild(Webfm.ctn(this.data[j])); elTr.appendChild(elTd); this.tbody.appendChild(elTr); } } // Webfm.permKey keys correspond to permission bitfields for(var i in Webfm.permKey) { var elTr = Webfm.ce('tr'); // label td var elTd = Webfm.ce('td'); elTd.appendChild(Webfm.ctn(Webfm.permHT.get(Webfm.permKey[i]) + ': ')); elTr.appendChild(elTd); // checkbox td var elTd = Webfm.ce('td'); // use bitwise operator to determine permission bits var check = (parseInt(Webfm.permKey[i]) & parseInt(this.data["p"])) > 0; if(this.permit) { var elInput = Webfm.ce('input'); elInput.setAttribute('type', 'checkbox'); // checkbox name is used to build the new permission value elInput.setAttribute('name', Webfm.permKey[i]); if(check) elInput.setAttribute('checked', check); elTd.appendChild(elInput); } else { elTd.appendChild(Webfm.ctn(check ? "True" : "False")); } elTr.appendChild(elTd); this.tbody.appendChild(elTr); } } //build perm control buttons Webfm.perm.prototype.buildFormControls = function() { var cp = this; var submitButton = Webfm.ce('input'); submitButton.setAttribute('type', 'button'); submitButton.setAttribute('value', Webfm.js_msg["submit"]); submitButton.className = "perm-button"; var listener = Webfm.eventListenerAdd(cp.eventListeners, submitButton, "click", function(e) { if(cp.submitPerm()){cp.container.destroy();}Webfm.stopEvent(e); }); this.controls.appendChild(submitButton); var resetButton = Webfm.ce('input'); resetButton.setAttribute('type', 'button'); resetButton.setAttribute('value', Webfm.js_msg["reset"]); resetButton.className = "perm-button"; var listener = Webfm.eventListenerAdd(cp.eventListeners, resetButton, "click", function(e) { cp.createForm(cp.data); Webfm.stopEvent(e); }); this.controls.appendChild(resetButton); } Webfm.perm.prototype.submitPerm = function() { var url = Webfm.ajaxUrl(); var inputs = []; inputs = this.tbody.getElementsByTagName('input'); var output = 0; for(var i in inputs) { // Build permission val from checkbox name if(inputs[i].checked) output += parseInt(inputs[i].name); } Webfm.progressObj.show(Webfm.js_msg["work"], "blue"); var postObj = { action:encodeURIComponent("putperm"), param0:encodeURIComponent(this.data["id"]), param1:encodeURIComponent(output)}; Webfm.HTTPPost(url, this.submitPermcallback, this, postObj); } Webfm.perm.prototype.submitPermcallback = function(string, xmlhttp, obj) { Webfm.progressObj.hide(); if (xmlhttp.status == 200) { var result = Drupal.parseJson(string); if (result.status) { //put confirmed result back into this.data for proper 'reset' obj.data["p"] = result.data["perm"]; // Webfm.dbgObj.dbg('new perm :', obj.data["p"]); } obj.pane.headerMsg(result.msg); } else { Webfm.alrtObj.msg(Webfm.js_msg["ajax-err"]); } } /** * Webfm.metadata constructor * 1st param is popup container obj * 2nd param is default startup width * 2nd param is default startup height */ Webfm.metadata = function(container, width, height) { var elDiv = Webfm.ce('div'); elDiv.setAttribute('id', 'webfm-meta-form'); var elForm = Webfm.ce('form'); elDiv.appendChild(elForm); var elTable = Webfm.ce('table'); elForm.appendChild(elTable); var elTBody = Webfm.ce('tbody'); elTable.appendChild(elTBody); var elControls = Webfm.ce('div'); elForm.appendChild(elControls); this.obj = elDiv; this.container = container; this.form = elForm; this.tbody = elTBody; this.controls = elControls; this.fid = null; this.width = width; this.height = height; this.eventListeners = this.container.eventListenerArr; } Webfm.metadata.prototype.createForm = function(data) { cp = this; this.data = data; //clear any metadata info this.resetForm(); //create new pane to house this metadata object this.pane = new Webfm.pane(this.container, Webfm.js_msg["metadata"], "webfm-metaPane", this.obj, this.width, this.height); //create metadata fields this.fillFormData(); //create controls if owner has rights to file if(this.fid) { this.buildFormControls(); } else { //put read-only indicator in pane header this.pane.headerMsg("read-only"); } } Webfm.metadata.prototype.resetForm = function() { var tbody = this.tbody; while(tbody.hasChildNodes()) { tbody.removeChild(tbody.firstChild); } var controls = this.controls; while(controls.hasChildNodes()) { controls.removeChild(controls.firstChild); } this.fid = null; } Webfm.metadata.prototype.fillFormData = function() { if(typeof this.data["id"] != "undefined") { this.fid = this.data["id"]; } for(var i in this.data) { var meta = Webfm.metadataHT.get(i); var elTr = Webfm.ce('tr'); // label td var elTd = Webfm.ce('td'); elTd.appendChild(Webfm.ctn(meta.desc + ': ')); elTr.appendChild(elTd); // info td var elTd = Webfm.ce('td'); if(this.fid && meta.edit) { switch(meta.size) { case 256: // textarea var elTextArea = Webfm.ce('textarea'); elTextArea.setAttribute('name', i); elTextArea.cols = "40"; elTextArea.rows = "4"; elTextArea.value = decodeURI(this.data[i]); elTd.appendChild(elTextArea); break; default: // textfield var elInput = Webfm.ce('input'); elInput.setAttribute('type', 'textfield'); elInput.setAttribute('name', i); elInput.setAttribute('size', '40'); elInput.setAttribute('value', decodeURI(this.data[i])); elTd.appendChild(elInput); break; } } else { elTd.appendChild(Webfm.ctn(decodeURI(this.data[i]))); } elTr.appendChild(elTd); // validation td var elTd = Webfm.ce('td'); elTd.appendChild(Webfm.ctn(String.fromCharCode(160))); //  elTr.appendChild(elTd); this.tbody.appendChild(elTr); } } //build metadata control buttons Webfm.metadata.prototype.buildFormControls = function() { var cp = this; var submitButton = Webfm.ce('input'); submitButton.setAttribute('type', 'button'); submitButton.setAttribute('value', Webfm.js_msg["submit"]); submitButton.className = "meta-button"; var listener = Webfm.eventListenerAdd(cp.eventListeners, submitButton, "click", function(e) { if(cp.submitMeta()){cp.container.destroy();}Webfm.stopEvent(e); }); this.controls.appendChild(submitButton); var resetButton = Webfm.ce('input'); resetButton.setAttribute('type', 'button'); resetButton.setAttribute('value', Webfm.js_msg["reset"]); resetButton.className = "meta-button"; var listener = Webfm.eventListenerAdd(cp.eventListeners, resetButton, "click", function(e) { cp.createForm(cp.data); Webfm.stopEvent(e); }); this.controls.appendChild(resetButton); } // Validate the length of input Webfm.metadata.prototype.validateMetaInput = function(elInput) { var len = Webfm.metadataHT.get(elInput.name).size; // Webfm.dbgObj.dbg("validateMetaInput", elInput.name); if(len < 256) { var data = Webfm.trim(elInput.value); if(data.length > len) { // Append error msg to validation td var err_msg = Webfm.ctn(Webfm.js_msg["len-err"]); elInput.parentNode.nextSibling.style.color = 'red'; elInput.parentNode.nextSibling.appendChild(err_msg); setTimeout(function(){elInput.focus();},10); return false; } else { // Remove any contents of validation td while (elInput.parentNode.nextSibling.hasChildNodes()) elInput.parentNode.nextSibling.removeChild(elInput.parentNode.nextSibling.firstChild); } } return true; } Webfm.metadata.prototype.submitMeta = function() { var url = Webfm.ajaxUrl(); var inputs = []; var arr = []; var textareas = []; inputs = this.tbody.getElementsByTagName('input'); textareas = this.tbody.getElementsByTagName('textarea'); var input_num = inputs.length; for(var i = 0; i < input_num; i++) { if(!(this.validateMetaInput(inputs[i]))) break; } // All fields validated // TODO: Data format needs to be reworked (json?) if(i == input_num) { this.output = ""; for(var i = 0; i < input_num; i++) { this.output += encodeURIComponent(inputs[i].name) + ":" + encodeURIComponent(Webfm.trim(inputs[i].value)) + ","; } for(i = 0; i < textareas.length; i++) { this.output += encodeURIComponent(textareas[i].name) + ":" + encodeURIComponent(Webfm.trim(textareas[i].value)) + ","; } if(this.output.length) { Webfm.progressObj.show(Webfm.js_msg["work"], "blue"); //strip off final comma this.output = this.output.substring(0, this.output.length - 1); var postObj = { action:encodeURIComponent("putmeta"), param0:encodeURIComponent(this.fid), param1:encodeURIComponent(this.output)}; Webfm.HTTPPost(url, this.submitMetacallback, this, postObj); } } else { alert(Webfm.js_msg["fix_input"]); } return false; } Webfm.metadata.prototype.submitMetacallback = function(string, xmlhttp, obj) { Webfm.progressObj.hide(); if (xmlhttp.status == 200) { var result = Drupal.parseJson(string); // Webfm.dbgObj.dbg('submitMetacallback: ', Webfm.dump(result)); if (result.status) { //update data for reset button var params = []; params = obj.output.split(','); for(var i = 0; i < params.length; i++) { var key = params[i].substring(0, params[i].indexOf(":")); var val = params[i].substring(params[i].indexOf(":") + 1); obj.data[key] = val; } } obj.pane.headerMsg(result.data); } else { Webfm.alrtObj.msg(Webfm.js_msg["ajax-err"]); } } // Trim leading/trailing whitespace off string Webfm.trim = function(str) { return str.replace(/^\s+|\s+$/g, ''); } /* * Webfm.attach constructor * param is parentId from hook_form_alter * node add url column OK -Drag attachments to set order. -Changes made to the attachments are not permanent until you save this post. */ Webfm.attach = function(parentId) { var wa = this; this.id = parentId this.attached = ''; this.eventListeners = []; var elTable = Webfm.ce('table'); var elTableBody = Webfm.ce('tbody'); //attached file rows are appended to this div this.body = elTableBody; //Header var elTr = Webfm.ce('tr'); // icon column var elTd = Webfm.ce('td'); elTd.className = 'head'; elTr.appendChild(elTd); // Sort dir/files column var elTd = Webfm.ce('td'); elTd.className = 'head'; elTd.appendChild(Webfm.ctn(Webfm.js_msg["attach-title"])); elTr.appendChild(elTd); // date/time column var elTd = Webfm.ce('td'); elTd.className = 'head'; elTd.appendChild(Webfm.ctn(Webfm.js_msg["column2"])); elTr.appendChild(elTd); // file size column var elTd = Webfm.ce('td'); elTd.className = 'head'; elTd.appendChild(Webfm.ctn(Webfm.js_msg["column3"])); elTr.appendChild(elTd); // owner column var elTd = Webfm.ce('td'); elTd.className = 'head'; elTd.appendChild(Webfm.ctn(Webfm.js_msg["column4"])); elTr.appendChild(elTd); //2009 ae860300 file url column--------------------- var elTd = Webfm.ce('td'); elTd.className = 'head'; elTd.appendChild(Webfm.ctn(Webfm.js_msg["column5"])); elTr.appendChild(elTd); //---------------------------------------------------- elTableBody.appendChild(elTr); elTable.appendChild(elTableBody); Webfm.$(parentId).appendChild(elTable); } Webfm.attach.prototype.fetch = function() { var url = Webfm.ajaxUrl(); // action attribute of node-edit form contains the node number var node_url; if(Webfm.$('node-form')) { node_url = Webfm.$('node-form').action; } if(Webfm.$('comment-form')) { node_url = Webfm.$('comment-form').action; } Webfm.progressObj.show(Webfm.js_msg["work"], "blue"); var postObj = { action:encodeURIComponent("attach"), param0:encodeURIComponent(node_url) }; // If we are in a preview/validate, the fids are still stored in the form. // Pass them to webfm_ajax to reload them. var fids = Webfm.$(Webfm.attachFormInput).value; if (fids.length != 0) { postObj.param1 = encodeURIComponent(fids); } Webfm.HTTPPost(url, this.callback, this, postObj); } Webfm.attach.prototype.callback = function(string, xmlhttp, obj) { Webfm.progressObj.hide(); if (xmlhttp.status == 200) { result = Drupal.parseJson(string); // Webfm.dbgObj.dbg("attach.fetch:", Webfm.dump(result)); if(result.status) { if(result.data.length) { Webfm.admin = result.admin; var elInput = Webfm.$(Webfm.attachFormInput); var attach_arr = []; attach_arr = Webfm.$(Webfm.attachFormInput).value.split(','); for(var i = 0; i < result.data.length; i++) { var filerow = new Webfm.filerow(obj.body, result.data[i], 'attach', '', true, Webfm.menuHT.get('det'), obj.eventListeners); // Don't add if it already exists. // Note that values are kept in the form for preview/failed validate. for (var j = 0; j < attach_arr.length; j++) { if (result.data[i].id == attach_arr[j]) break; } if (j == attach_arr.length) { elInput.setAttribute('value', (elInput.getAttribute('value')?elInput.getAttribute('value')+',':'') + result.data[i].id); } } } } else Webfm.alrtObj.msg(result.data); } else { Webfm.alrtObj.msg(Webfm.js_msg["ajax-err"]); } } /** * Webfm.search constructor * 1st param is popup container obj * 2nd param is default startup width * 2nd param is default startup height */ Webfm.search = function(container, width, height) { var elDiv = Webfm.ce('div'); elDiv.setAttribute('id', 'webfm-search'); var elForm = Webfm.ce('form'); elDiv.appendChild(elForm); var elResults = Webfm.ce('div'); elDiv.appendChild(elResults); this.obj = elDiv; this.container = container; this.form = elForm; this.results = elResults; this.width = width; this.height = height; this.iconDir = getWebfmIconDir(); this.eventListeners = this.container.eventListenerArr; } Webfm.search.prototype.resetForm = function() { var form = this.form; while(form.hasChildNodes()) { form.removeChild(form.firstChild); } } Webfm.search.prototype.resetResults = function() { var results = this.results; while(results.hasChildNodes()) { results.removeChild(results.firstChild); } } Webfm.search.prototype.createForm = function(source) { cp = this; this.source = source; //clear any metadata info this.resetForm(); cp.resetResults(); //create new pane to house this metadata object var pane = new Webfm.pane(this.container, Webfm.js_msg["search-title"], "webfm-searchPane", this.obj, this.width, this.height); //put search path in header pane.headerMsg(source); //create search fields var elInput = Webfm.ce('input'); elInput.setAttribute('type', 'textfield'); elInput.setAttribute('size', '30'); setTimeout(function(){elInput.focus();},10); var listener = Webfm.eventListenerAdd(this.eventListeners, elInput, "keydown", function(e) { if(Webfm.enter(e)){ cp.submit(elInput.value); elInput.blur(); Webfm.stopEvent(e);} }); this.form.appendChild(elInput); var searchButton = Webfm.ce('input'); searchButton.setAttribute('type', 'button'); searchButton.setAttribute('value', Webfm.js_msg["search"]); var listener = Webfm.eventListenerAdd(this.eventListeners, searchButton, "click", function(e) { cp.submit(elInput.value);Webfm.stopEvent(e); }); this.form.appendChild(searchButton); pane.show(); } Webfm.search.prototype.submit = function(value) { var url = Webfm.ajaxUrl(); Webfm.progressObj.show(Webfm.js_msg["work"], "blue"); var postObj = { action:encodeURIComponent("search"), param0:encodeURIComponent(this.source), param1:encodeURIComponent(value) }; Webfm.HTTPPost(url, this.callback, this, postObj); } Webfm.search.prototype.callback = function(string, xmlhttp, cp) { Webfm.progressObj.hide(); if (xmlhttp.status == 200) { cp.resetResults(); //build ul of search results var result = Drupal.parseJson(string); if(result.files.length) { var searchList = Webfm.ce('ul'); for(var i = (result.files.length - 1); i >= 0; i--) { var elLi = Webfm.ce('li'); var elImg = Webfm.ce('img'); elImg.setAttribute('src', cp.iconDir + '/d.gif'); elImg.setAttribute('alt', Webfm.js_msg["u_dir"]); //title is path to directory elImg.setAttribute('title', result.files[i].p); var listener = Webfm.eventListenerAdd(cp.eventListeners, elImg, "click", function(e) { cp.selectDir(e); Webfm.stopEvent(e); }); var listener = Webfm.eventListenerAdd(cp.eventListeners, elImg, "mouseover", function(e) { cp.hoverDir(e, true); }); var listener = Webfm.eventListenerAdd(cp.eventListeners, elImg, "mouseout", function(e) { cp.hoverDir(e, false); }); elLi.appendChild(elImg); elLi.appendChild(Webfm.ctn(' ')); var elA = Webfm.ce('a'); elA.setAttribute('href', '#'); if(result.files[i].id) { //first three letters of id must be 'sid' for selectFile //tooltip indicates if file is downloadable elA.setAttribute('id', 'sid' + result.files[i].id); elA.setAttribute('title', Webfm.js_msg["file-dwld"]); var listener = Webfm.eventListenerAdd(cp.eventListeners, elA, "click", function(e) { cp.selectFile(e); Webfm.stopEvent(e); }); } else { elA.setAttribute('title', Webfm.js_msg["no-file-dwld"]); } elA.appendChild(Webfm.ctn(result.files[i].n)); elLi.appendChild(elA); searchList.appendChild(elLi); } cp.results.appendChild(searchList); } else { var no_match = Webfm.ctn(Webfm.js_msg["no-match"]); cp.results.style.color = 'red'; cp.results.appendChild(no_match); } } else { Webfm.alrtObj.msg(Webfm.js_msg["ajax-err"]); } } // IE does not understand 'this' inside event listener func Webfm.search.prototype.hoverDir = function(event, state) { var el = event.target||window.event.srcElement; el.src = this.iconDir + (state ? '/open.gif' : '/d.gif'); } Webfm.search.prototype.selectDir = function(event) { var el = event.target||window.event.srcElement; Webfm.selectDir(el.title); } Webfm.search.prototype.selectFile = function(event) { var el = event.target||window.event.srcElement; Webfm.selectFile(el.id.substring(3), el, true); } /* * debug constructor * 1st param is popup container obj * 2nd param is default startup width * 2nd param is default startup height */ Webfm.debug = function(container, width, height) { var dbgButton = ''; //id from webfm_main() dbgButton = Webfm.$("webfm-debug-link"); this.enable = dbgButton; if(dbgButton) { this.container = container; this.eventListeners = this.container.eventListenerArr; this.width = width; this.height = height; var cp = this; //create cache popup var cacheCont = new Webfm.popup("webfm-cacheCont"); this.cacheCont = cacheCont; var report = Webfm.ce('div'); this.report = report; //attach popup creation to [debug] link var listener = Webfm.eventListenerAdd(Webfm.eventListeners, dbgButton, "click", function() { cp.show(); }); } } Webfm.debug.prototype.dbg = function(title, msg) { if(this.enable) { //put latest msg at top (less scrolling) elBr = Webfm.ce('br'); this.report.insertBefore(elBr, this.report.firstChild); if(msg) { this.report.insertBefore(Webfm.ctn(msg), this.report.firstChild); } if(title) { var elSpan = Webfm.ce('span'); elSpan.className = 'g'; elSpan.appendChild(Webfm.ctn(title)); this.report.insertBefore(elSpan, this.report.firstChild); } } } Webfm.debug.prototype.clear = function() { if(this.enable) { Webfm.alrtObj.msg(); while(this.report.hasChildNodes()) { this.report.removeChild(this.report.firstChild); } this.cacheCont.destroy(); } } Webfm.debug.prototype.show = function() { if(this.enable) { var elDiv = Webfm.ce('div'); elDiv.setAttribute('id', 'webfm-debug'); this.obj = elDiv; //create new pane to house this metadata object var pane = new Webfm.pane(this.container, Webfm.js_msg["debug-title"], "webfm-debugPane", this.obj, this.width, this.height); var cp = this; var elControls = Webfm.ce('div'); this.controls = elControls; var elClear = Webfm.ce('input'); elClear.setAttribute('type', 'button'); elClear.setAttribute('value', Webfm.js_msg["clear"]); elClear.className = "dbg-button"; var listener = Webfm.eventListenerAdd(this.eventListeners, elClear, "click", function() { cp.clear(); }); this.controls.appendChild(elClear); var elCache = Webfm.ce('input'); elCache.setAttribute('type', 'button'); elCache.setAttribute('value', Webfm.js_msg["cache"]); elCache.className = "dbg-button"; var listener = Webfm.eventListenerAdd(this.eventListeners, elCache, "click", function(e) { cp.showCache();Webfm.stopEvent(e); }); this.controls.appendChild(elCache); this.obj.appendChild(elControls); var report = this.report; this.obj.appendChild(report); } } Webfm.debug.prototype.showCache = function() { if(this.enable) { //create new pane to house this metadata object var dump = Webfm.ctn(Webfm.dump(Webfm.dirListObj.cache.dump())); var pane = new Webfm.pane(this.cacheCont, Webfm.js_msg["cache-title"], "webfm-cachePane", dump, this.width, this.height); pane.show(); } } /** * Progress indicator */ Webfm.progress = function(parent, id) { this.id = id; this.flag = false; var elSpan = Webfm.ce('span'); elSpan.setAttribute('id', this.id); parent.appendChild(elSpan); } Webfm.progress.prototype.hide = function() { if(this.flag) { this.flag = false; Webfm.clearNodeById(this.id); } } Webfm.progress.prototype.show = function(x, y) { if(!this.flag) { this.flag = true; var prog = Webfm.$(this.id); var elSpan = Webfm.ce('span'); elSpan.style.backgroundColor = y; elSpan.appendChild(Webfm.ctn(x)); prog.appendChild(elSpan); prog.style.visibility = 'visible'; } } /** * Alert indicator */ Webfm.alert = function(parent, id) { this.id = id; var elDiv = Webfm.ce('div'); this.node = elDiv; elDiv.setAttribute('id', id); parent.appendChild(elDiv); } Webfm.alert.prototype.msg = function(msg) { if(!msg) { Webfm.clearNodeById(this.id); } else { var elSpan = Webfm.ce('span'); elSpan.className = 'alertspan'; elSpan.appendChild(Webfm.ctn(msg)); this.node.appendChild(elSpan); this.lf(); } } Webfm.alert.prototype.lf = function() { var elBr = Webfm.ce('br'); this.node.appendChild(elBr); } /* * Display an array of strings alert */ Webfm.alert.prototype.str_arr = function(arr) { if(typeof arr == 'function') return; else if(Webfm.isArray(arr)) { for(var i = 0; i < arr.length; i++) { this.str_arr(arr[i]); } } if(typeof arr == 'string') { this.msg(arr); } } /** * Webfm.popup constructor */ Webfm.popup = function(Id) { this.id = Id; var elDiv = Webfm.ce('div'); elDiv.id = Id; //id for css elDiv.style.cssText = 'position:absolute;display:none;'; document.body.appendChild(elDiv); this.obj = elDiv; //vars used for storing position info for contained object (pane) this.width = null; this.content_height = null; this.top = null; this.left = null; this.eventListenerArr = []; } Webfm.popup.prototype.getScrollY = function () { var scrY = 0; if(typeof window.pageYOffset == 'number') { scrY = window.pageYOffset; } else if(document.body && document.body.scrollTop) { scrY = document.body.scrollTop; } else if(document.documentElement && document.documentElement.scrollTop) { scrY = document.documentElement.scrollTop; } return scrY; } Webfm.popup.prototype.getObjectOffset = function(event, element, comp) { var objPos = this.objPosition(element, comp); var mousePos = Drupal.mousePosition(event); return {x:mousePos.x - objPos.x, y:mousePos.y - objPos.y}; } Webfm.popup.prototype.objPosition = function(element, comp) { var curleft = curtop = 0; if(element.offsetParent) { curleft = element.offsetLeft; curtop = element.offsetTop; while(element = element.offsetParent) { curleft += element.offsetLeft; curtop += element.offsetTop; } } // IE must compensate for relative positioning in css if(Webfm.browser.isIE && comp) { curleft += parseInt(getWebfmIEListOffset()); if(comp == 'tree') { curleft += parseInt(getWebfmIETreeOffset()); } } return { x:curleft, y:curtop }; } Webfm.popup.prototype.destroy = function () { //cleanup event closures for this popup Webfm.eventUnregister(this.eventListenerArr); while(this.obj.hasChildNodes()) this.obj.removeChild(this.obj.firstChild); document.onmousemove = null; document.onmouseup = null; this.obj.style.display = 'none'; } Webfm.popup.prototype.isEmpty = function () { return (!this.obj.hasChildNodes()); } /** * Webfm.pane constructor * 1st param is popup container obj * 2nd param is title displayed in pane header * 3rd param is this obj id * 4th param is content appended to this obj content div * 5th param is default startup width * 6th param is default startup height */ Webfm.pane = function(popupCont, title, paneId, content, paneWidth, contentHeight) { this.popupCont = popupCont; var cp = this; var body_scroll_top = this.popupCont.getScrollY(); var body_height = (Webfm.browser.isIE)? document.documentElement.clientHeight : window.innerHeight; // locate pane in centre of screen only if drag container not already in use if((!popupCont.width) || (!popupCont.content_height) || (!popupCont.top) || (!popupCont.left)) { var body_scroll_left = (Webfm.browser.isIE)? document.documentElement.scrollLeft : window.pageXOffset; var body_width = (Webfm.browser.isIE)? document.documentElement.clientWidth : window.innerWidth; this.popupCont.width = paneWidth; this.popupCont.content_height = contentHeight; this.popupCont.top = body_scroll_top + (body_height - contentHeight)/2; this.popupCont.left = body_scroll_left + (body_width - paneWidth)/2; } //Compensate pane position for vertical scroll that places it out of view if((body_scroll_top + body_height) < this.popupCont.top) { this.popupCont.top = body_scroll_top + (body_height - contentHeight)/2; } if((body_scroll_top) > this.popupCont.top + this.popupCont.content_height) { this.popupCont.top = body_scroll_top + (body_height - contentHeight)/2; } // Set top of drag popup and empty any contents this.popupCont.obj.style.top = this.popupCont.top + "px"; this.popupCont.obj.style.left = this.popupCont.left + "px"; this.popupCont.destroy(); // Pane container div var iconDir = getWebfmIconDir(); var pane = Webfm.ce('div'); this.pane = pane; pane.id = paneId; pane.className = "webfm-pane"; pane.style.width = this.popupCont.width + "px"; this.popupCont.obj.appendChild(this.pane); // pane header var header = Webfm.ce('div'); this.header = header; header.id = pane.id + '-header'; header.className = "webfm-pane-header"; var elTitle = Webfm.ce('div'); elTitle.appendChild(Webfm.ctn(title)); elTitle.className = "webfm-pane-title"; header.appendChild(elTitle); var elMsg = Webfm.ce('div'); this.msg = elMsg; elMsg.className = "webfm-pane-msg"; header.appendChild(elMsg); var cp = this; var listener = Webfm.eventListenerAdd(Webfm.eventListeners, header, "mousedown", function(e) { cp.dragStart(e, 1); }); var elA = Webfm.ce('a'); elA.setAttribute('href', '#'); elA.setAttribute('title', Webfm.js_msg["close"]); elA.className = "webfm-pane-close"; var elImg = Webfm.ce('img'); elImg.setAttribute('src', iconDir+ '/x.gif'); elImg.setAttribute('alt', Webfm.js_msg["close"]); elA.appendChild(elImg); header.appendChild(elA); var listener = Webfm.eventListenerAdd(Webfm.eventListeners, elA, "click", function(e) { cp.popupCont.destroy();Webfm.stopEvent(e); }); pane.appendChild(header); // pane content var contentContainer = Webfm.ce('div'); this.content = contentContainer; contentContainer.id = pane.id + '-content'; contentContainer.className = "webfm-pane-content"; contentContainer.style.height = this.popupCont.content_height + "px"; pane.appendChild(contentContainer); // pane footer var footer = Webfm.ce('div'); this.footer = footer; footer.className = "webfm-pane-footer"; var elResize = Webfm.ce('a'); elResize.setAttribute('href', '#'); elResize.setAttribute('title', Webfm.js_msg["resize"]); elResize.className = "webfm-pane-resize"; var elImg = Webfm.ce('img'); elImg.setAttribute('src', iconDir+ '/resize.gif'); elImg.setAttribute('alt', Webfm.js_msg["resize"]); elResize.appendChild(elImg); footer.appendChild(elResize); var listener = Webfm.eventListenerAdd(Webfm.eventListeners, elResize, "mousedown", function(e) { cp.dragStart(e, 0); }); pane.appendChild(footer); if(content) this.fill(content); } Webfm.pane.prototype.dragStart = function(event, move) { Webfm.dragging = true; var cp = this; event = event || window.event; // Hide content - mousing over visible iframe can cause problems this.content.style.visibility = "hidden"; this.popupCont.obj.style.zIndex = ++Webfm.zindex; if(move == 1) { //Offset of cursor position form top/left corner of drag object on mousedown this.offset = this.popupCont.getObjectOffset(event, this.header); document.onmousemove = function(e) { cp.drag(e); }; document.onmouseup = function(e) { cp.dragEnd(e); }; this.drag(event); } else { //Start position of cursor on mousedown this.initPos = Drupal.mousePosition(event); //Start width and height of pane content on mousedown this.width = parseInt(this.pane.offsetWidth); this.height = parseInt(this.content.offsetHeight); document.onmousemove = function(e) { cp.resize(e); }; document.onmouseup = function(e) { cp.resizeEnd(e); }; Webfm.scrollVal = this.popupCont.getScrollY(); this.resize(event); } } Webfm.pane.prototype.drag = function(event) { event = event || window.event; var pos = Drupal.mousePosition(event); var x = pos.x - this.offset.x; var y = pos.y - this.offset.y; //Scroll page if near top or bottom edge. Hardcoded values var scroll = this.popupCont.getScrollY(); if(typeof window.innerHeight == 'number') { if(pos.y > (window.innerHeight + scroll - 35)) { window.scrollBy(0,20); } else if(pos.y - scroll < (25)) { window.scrollBy(0,-20); } } else if(document.documentElement && document.documentElement.clientHeight) { if(pos.y > (document.documentElement.clientHeight + scroll - 35)) { window.scrollBy(0,20); } else if(pos.y - scroll < (25)) { window.scrollBy(0,-20); } } // Move our drag container to wherever the mouse is (adjusted by mouseOffset) this.popupCont.obj.style.top = y + 'px'; this.popupCont.obj.style.left = x + 'px'; // Prevent selection of textnodes Webfm.stopEvent(event); } Webfm.pane.prototype.resize = function(event) { event = event || window.event; // Calculate distance from start position var pos = Drupal.mousePosition(event); var x = this.width + (pos.x - this.initPos.x); var y = this.height + (pos.y - this.initPos.y); // Adjust pane width and height css with min size constraint this.pane.style.width = Math.max(x, 100) + "px"; this.content.style.height = Math.max(y, 100) + "px"; // Prevent selection of textnodes Webfm.stopEvent(event); } Webfm.pane.prototype.dragEnd = function (event) { // Store popup container top/left position global vars this.popupCont.top = parseInt(this.popupCont.obj.style.top); this.popupCont.left = parseInt(this.popupCont.obj.style.left); this.end(event); } Webfm.pane.prototype.resizeEnd = function (event) { // Store popup container width/height size global vars this.popupCont.width = parseInt(this.pane.style.width); this.popupCont.content_height = parseInt(this.content.style.height); this.end(event); // counter browser scrolling setTimeout(function(){window.scrollTo(0, Webfm.scrollVal);}, 1); } Webfm.pane.prototype.end = function (event) { this.content.style.visibility = "visible"; Webfm.dragging = false; document.onmousemove = null; document.onmouseup = null; Webfm.stopEvent(event); } Webfm.pane.prototype.headerMsg = function (string) { while(this.msg.hasChildNodes()) this.msg.removeChild(this.msg.firstChild); this.msg.appendChild(Webfm.ctn(string)); } Webfm.pane.prototype.fill = function (content) { if(content) this.content.appendChild(content); this.show(); } Webfm.pane.prototype.clear = function () { while(this.content.hasChildNodes()) this.content.removeChild(this.content.firstChild); while(this.msg.hasChildNodes()) this.msg.removeChild(this.content.firstChild); } Webfm.pane.prototype.hide = function () { this.popupCont.obj.style.display = 'none' } Webfm.pane.prototype.show = function () { this.popupCont.obj.style.zIndex = ++Webfm.zindex; this.popupCont.obj.style.display = 'block' } /** * Webfm.draggable constructor */ Webfm.draggable = function(popupCont, element, _class) { this.dragCont = popupCont; this.element = element; this.curpath = element.title; this.isTree = _class.substring(0,4) == 'tree'; this.isDir = (_class == 'dirrow') || this.isTree; this.isAttach = _class == 'attachrow'; this.icondir = getWebfmIconDir(); this.comp = this.isTree ? 'tree' : 'list'; } Webfm.draggable.prototype.mouseButton = function(event) { event = event || window.event; // Determine mouse button var rightclick = Webfm.rclick(event); if(!rightclick && event.altKey == false) this.dragStart(event); } Webfm.draggable.prototype.dragStart = function (event) { Webfm.dragging = true; // Destroy all contents in popup container. this.dragCont.destroy(); var cp = this; document.onmousemove = function(e) { cp.drag(e); }; document.onmouseup = function(e) { cp.dragEnd(e); }; // Make transparent this.element.style.opacity = 0.5; // Process this.drag(event); } Webfm.draggable.prototype.drag = function (event) { var cp = this; event = event || window.event; //Build Webfm.dropContainers array //The dragStart flag ensures that the following executes once only at the //beginning of a drag-drop if (!(Webfm.dragStart)) { Webfm.dragStart = true; //copy dragged element into drag container and make visible this.offset = this.dragCont.getObjectOffset(event, this.element, this.comp); if(Webfm.browser.isIE && !this.isTree) { /* IE cannot clone table rows */ var elDiv = Webfm.ce('div'); elDiv.setAttribute('id', 'webfm-ieDD'); elDiv.appendChild(this.element.getElementsByTagName('img')[0].cloneNode(false)); elDiv.appendChild(this.element.getElementsByTagName('a')[0].firstChild.cloneNode(false)); this.dragCont.obj.appendChild(elDiv); } else { this.dragCont.obj.appendChild(this.element.cloneNode(true)); } this.dragCont.obj.style.display = 'block' this.dragCont.obj.style.zIndex = ++Webfm.zindex; Webfm.dropContainers = []; // Build list drop container array if(!this.isAttach) { var dirListRows = Webfm.dirListObj.obj.getElementsByTagName('tr'); var dirListCont = []; for(var k = 0; k < dirListRows.length; k++) { if (dirListRows[k].className == 'dirrow') { dirListCont.push(dirListRows[k]); } } if (dirListCont.length) { for(var i = 0; i < dirListCont.length; i++) { // DragDrop element is folder icon var droptarget = dirListCont[i]; var cont_pos = this.dragCont.objPosition(droptarget, this.comp); var skip = false; var droppath = dirListCont[i].title; if(this.curpath == droppath) continue; if(this.isTree) { var curtemp = []; curtemp = this.curpath.split('/'); var droptemp = []; droptemp = droppath.split('/'); // Test if drop path is beneath the drag path for(var j = 0; j < curtemp.length; j++) { if(curtemp[j] != droptemp[j]) break; } if(j == curtemp.length) { skip = true; } else { // Test if drop path is directly above drag path (already a subdir) for(var j = 0; j < droptemp.length; j++) { if(curtemp[j] != droptemp[j]) break; } if((j == droptemp.length) && (curtemp.length == j + 1)) skip = true; } } if(skip == false) { // Valid drop container var container = { id: dirListCont[i].id, x: cont_pos.x, y: cont_pos.y, w: droptarget.offsetWidth, h: droptarget.offsetHeight }; Webfm.dropContainers.push(container); } } } var dirTreeCont = ''; dirTreeCont = Webfm.$("webfm-tree") if(dirTreeCont) { //reuse var for container list dirTreeCont = Webfm.$("webfm-tree").getElementsByTagName('li'); if (dirTreeCont.length) { // Build tree drop container array for(var i = 0; i < dirTreeCont.length; i++) { // DragDrop element is folder icon var droptarget = dirTreeCont[i].getElementsByTagName('div')[0]; var cont_pos = this.dragCont.objPosition(droptarget, this.comp); var skip = false; if(this.isTree) { // Prevent a directory drop onto itself or its direct parent li (already a sub-directory) if((dirTreeCont[i] != this.element) && (dirTreeCont[i] != this.element.parentNode.parentNode)) { var children = this.element.getElementsByTagName('li'); // Prevent a directory drop into a sub-directory for(var j = 0; j < children.length; j++) { if(children[j] == dirTreeCont[i]) skip = true; } } else { skip = true; } } else { var droppath = dirTreeCont[i].title; // A regex would be preferable here if(this.curpath != droppath){ var curtemp = []; curtemp = this.curpath.split('/'); var droptemp = []; droptemp = droppath.split('/'); // Test if drop path is beneath the drag path for(var j = 0; j < curtemp.length; j++) { if(curtemp[j] != droptemp[j]) break; } if(j == curtemp.length) { skip = true; } else { // Test if drop path is directly above drag path (already a subdir) for(var j = 0; j < droptemp.length; j++) { if(curtemp[j] != droptemp[j]) break; } if((j == droptemp.length) && (curtemp.length == j + 1)) skip = true; } } else { skip = true; } } if(skip == false) { // Valid drop container - add to array of drop containers var container = { id: dirTreeCont[i].id, x: cont_pos.x, y: cont_pos.y, w: droptarget.offsetWidth, h: droptarget.offsetHeight }; Webfm.dropContainers.push(container); } } } } } else { // attachment container is attach table body var droptarget = Webfm.attachObj.body; var cont_pos = this.dragCont.objPosition(droptarget, this.comp); Webfm.attachContainer = { x: cont_pos.x, y: cont_pos.y, w: droptarget.offsetWidth, h: droptarget.offsetHeight }; } } var pos = Drupal.mousePosition(event); var x = pos.x - this.offset.x; var y = pos.y - this.offset.y; //Scroll page if near top or bottom edge. Hardcoded values var scroll = this.dragCont.getScrollY(); if(typeof window.innerHeight == 'number') { if(pos.y > (window.innerHeight + scroll - 35)) { window.scrollBy(0,20); } else if(pos.y - scroll < (25)) { window.scrollBy(0,-20); } } else if(document.documentElement && document.documentElement.clientHeight) { if(pos.y > (document.documentElement.clientHeight + scroll - 35)) { window.scrollBy(0,20); } else if(pos.y - scroll < (25)) { window.scrollBy(0,-20); } } // move our drag container to wherever the mouse is (adjusted by mouseOffset) this.dragCont.obj.style.top = y + 'px'; this.dragCont.obj.style.left = x + 'px'; if(!this.isAttach) { Webfm.activeDropCont = null; if(Webfm.dropContainers.length) { // Compare mouse position to every drop container for(var i = 0; i < Webfm.dropContainers.length; i++) { if((Webfm.dropContainers[i].x < pos.x) && (Webfm.dropContainers[i].y < pos.y) && ((Webfm.dropContainers[i].w + Webfm.dropContainers[i].x) > pos.x) && ((Webfm.dropContainers[i].h + Webfm.dropContainers[i].y) > pos.y)) { // Found a valid drop container - Highlight selection Webfm.activeDropCont = Webfm.$(Webfm.dropContainers[i].id); Webfm.$(Webfm.dropContainers[i].id + 'dd').src = this.icondir + '/open.gif'; Webfm.$(Webfm.dropContainers[i].id).className += ' selected'; } else { // De-highlight container Webfm.$(Webfm.dropContainers[i].id + 'dd').src = this.icondir + '/d.gif'; var class_names = []; class_names = Webfm.$(Webfm.dropContainers[i].id).className.split(' '); Webfm.$(Webfm.dropContainers[i].id).className = class_names[0]; } } } } else { // Ignore all movement outside of the attach table if((Webfm.attachContainer.x < pos.x) && (Webfm.attachContainer.y < pos.y) && ((Webfm.attachContainer.w + Webfm.attachContainer.x) > pos.x) && ((Webfm.attachContainer.h + Webfm.attachContainer.y) > pos.y)) { // In attach container var att_table_body = Webfm.attachObj.body; var attachRows = att_table_body.getElementsByTagName('TR'); var prevNode = ''; var nextNode = ''; var curr = false; // Start at 1 since first row is header for(var i = 1; i < attachRows.length; i++) { if(this.element.id != attachRows[i].id) { var att_pos = this.dragCont.objPosition(attachRows[i], this.comp); if((att_pos.y + (attachRows[i].offsetHeight / 2)) < pos.y) { if(curr == true) prevNode = attachRows[i]; } else if((att_pos.y + (attachRows[i].offsetHeight / 2)) > pos.y) { if(curr == false) nextNode = attachRows[i]; } } else curr = true; } if(prevNode) att_table_body.insertBefore(prevNode, this.element); else if (nextNode) att_table_body.insertBefore(this.element, nextNode); } } //prevent selection of textnodes Webfm.stopEvent(event); } Webfm.draggable.prototype.dragEnd = function (event) { event = event || window.event; // Restore opacity this.element.style.opacity = 1.0; Webfm.dragging = false; Webfm.dragStart = false; this.dragCont.obj.style.display = 'none'; Webfm.stopEvent(event); if(!this.isAttach) { // Move dragged object if a valid drop container if(Webfm.activeDropCont) { this.droppath = Webfm.activeDropCont.title; // De-highlight container Webfm.$(Webfm.activeDropCont.id + 'dd').src = this.icondir + '/d.gif'; var class_names = []; class_names = Webfm.activeDropCont.className.split(' '); Webfm.activeDropCont.className = class_names[0]; var url = Webfm.ajaxUrl(); Webfm.progressObj.show(Webfm.js_msg["work"], "blue"); var postObj = { action:encodeURIComponent("move"), param0:encodeURIComponent(this.curpath), param1:encodeURIComponent(this.droppath) }; Webfm.HTTPPost(url, this.callback, this, postObj); Webfm.activeDropCont = null; } } else { // Put the current order of attachments into the form in preparation for submit var elInput = Webfm.$('edit-attachlist'); var attachRows = Webfm.attachObj.body.getElementsByTagName('tr'); elInput.setAttribute('value', ''); // Ignore 1st row (header) for(var i = 1; i < attachRows.length; i++) { var fid = attachRows[i].id.substring(3); elInput.setAttribute('value', (elInput.getAttribute('value')?elInput.getAttribute('value')+',':'') + fid); } } // Empty drag container + uncapture mouse. document.onmousemove = null; document.onmouseup = null; this.dragCont.destroy(); } Webfm.draggable.prototype.callback = function(string, xmlhttp, cp) { Webfm.progressObj.hide(); Webfm.alrtObj.msg(); if(xmlhttp.status == 200) { var result = Drupal.parseJson(string); Webfm.dbgObj.dbg("move result:", Webfm.dump(result)); if(result.status) { //flush cache for target dir and source dir of object Webfm.dirListObj.cache.remove(cp.droppath); Webfm.dirListObj.cache.remove(cp.curpath.substring(0, cp.curpath.lastIndexOf("/"))); //update tree if directory is moved if(cp.isDir) Webfm.dirTreeObj.fetch(true); if(!cp.isTree) //listing draggable - update current listing by removing dropped item cp.element.parentNode.removeChild(cp.element); else //tree draggable - update target directory Webfm.dirListObj.fetch(cp.droppath); } if(result.data) Webfm.alrtObj.str_arr(result.data); else Webfm.alrtObj.msg(Webfm.js_msg["move-err"]); } else { Webfm.alrtObj.msg(Webfm.js_msg["ajax-err"]); } } /** * Event Handler adapted from http://ajaxcookbook.org (Creative Commons Attribution 2.5) */ Webfm.eventListenerAdd = function(listener_arr, instance, eventName, listener) { var listenerFn = listener; if (instance.addEventListener) { instance.addEventListener(eventName, listenerFn, false); } else if (instance.attachEvent) { listenerFn = function() { listener(window.event); } instance.attachEvent("on" + eventName, listenerFn); } else { throw new Error("Event registration not supported"); } var event = { instance: instance, name: eventName, listener: listenerFn }; listener_arr.push(event); return event; } Webfm.eventListenerRemove = function(event, listener_arr) { var instance = event.instance; if (instance.removeEventListener) { instance.removeEventListener(event.name, event.listener, false); } else if (instance.detachEvent) { instance.detachEvent("on" + event.name, event.listener); } for (var i = 0; i < listener_arr.length; i++) { if (listener_arr[i] == event) { listener_arr.splice(i, 1); break; } } } //remove local event listeners Webfm.eventUnregister = function(listener_arr) { while (listener_arr.length > 0) { Webfm.eventListenerRemove(listener_arr[0], listener_arr); } listener_arr = []; } //remove global events at window.onunload Webfm.eventUnregisterWebfm = function() { while (Webfm.eventListeners.length > 0) { Webfm.eventListenerRemove(Webfm.eventListeners[0], Webfm.eventListeners); } Webfm.eventListeners = []; } /** * Helper Functions */ Webfm.$ = function(id) { return document.getElementById(id); } Webfm.ctn = function(textNodeContents) { var textNode = document.createTextNode(textNodeContents); return textNode; } Webfm.ce = function(elementName) { elementName = elementName.toLowerCase(); var element = document.createElement(elementName); return element; } /** * Creates an HTTP POST request and sends the response to the callback function * * Note: passing null or undefined for 'object' makes the request fail in Opera 8. * Pass an empty string instead. */ Webfm.HTTPPost = function(uri, callbackFunction, callbackParameter, object) { if(window.XMLHttpRequest){ // If IE7, Mozilla, Safari, etc: Use native object var xmlHttp = new XMLHttpRequest() } else { if(window.ActiveXObject){ // ...otherwise, use the ActiveX control for IE5.x and IE6 var xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); } } var bAsync = true; if (!callbackFunction) { bAsync = false; } xmlHttp.open('POST', uri, bAsync); var toSend = ''; if (typeof object == 'object') { xmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); xmlHttp.setRequestHeader("X-Requested-With", "XMLHttpRequest"); for (var i in object) { toSend += (toSend ? '&' : '') + i + '=' + encodeURIComponent(object[i]); } } else { toSend = object; } xmlHttp.send(toSend); if (bAsync) { xmlHttp.onreadystatechange = function() { if (xmlHttp.readyState == 4) { callbackFunction(xmlHttp.responseText, xmlHttp, callbackParameter); } } return xmlHttp; } else { return xmlHttp.responseText; } } /** * Prevents an event from propagating. */ Webfm.stopEvent = function(event) { event = event || window.event; if (event.preventDefault) { event.preventDefault(); event.stopPropagation(); } else { event.returnValue = false; event.cancelBubble = true; } } //the getModUrl() is used by contrib modules for custom ajax Webfm.ajaxUrl = function() { // var path = getBaseUrl() + "/index.php?q="; var path = getBaseUrl() + "/?q="; return path += (typeof getModUrl == "undefined") ? "webfm_js" : getModUrl(); } // Empty all child nodes Webfm.clearNodeById = function(elementId) { var node = Webfm.$(elementId); while (node.hasChildNodes()) node.removeChild(node.firstChild); } // Sort methods Webfm.sortByName = function(a, b) { if(typeof a.ftitle != "undefined") { var x = a.ftitle.toLowerCase(); } else { var x = a.n.toLowerCase(); } if(typeof b.ftitle != "undefined") { var y = b.ftitle.toLowerCase(); } else { var y = b.n.toLowerCase(); } return ((x < y) ? -1 : ((x > y) ? 1 : 0)); } Webfm.sortBySize = function(a, b) { var x = parseInt(parseFloat(a.s)); var y = parseInt(parseFloat(b.s)); return x - y; } Webfm.sortByModified = function(a, b) { var x = a.m; var y = b.m; return ((x < y) ? -1 : ((x > y) ? 1 : 0)); } Webfm.sortByOwner = function(a, b) { if(typeof a.funame != "undefined") { var x = a.funame.toLowerCase(); } else { var x = a.un.toLowerCase(); } if(typeof b.funame != "undefined") { var y = b.funame.toLowerCase(); } else { var y = b.un.toLowerCase(); } return ((x < y) ? -1 : ((x > y) ? 1 : 0)); } // sortkey() Webfm.sortByKey = function(a, b) { var x = a.toLowerCase(); var y = b.toLowerCase(); return ((x < y) ? -1 : ((x > y) ? 1 : 0)); } // Build date stamp Webfm.convertunixtime = function(unixtime) { // unix date format doesn't have millisec component var _date = new Date(unixtime * 1000); var _min = _date.getMinutes(); var _hours = _date.getHours(); var _day = _date.getDate(); var _mon = _date.getMonth() + 1; var _year = _date.getFullYear(); _min = Webfm.doubleDigit(_min); _hours = Webfm.doubleDigit(_hours); _day = Webfm.doubleDigit(_day); _mon = Webfm.doubleDigit(_mon); if(_year > 1999) _year -= 2000; else _year -= 1900; _year = Webfm.doubleDigit(_year); // Get day/month order from db variable var format = getWebfmDateFormat(); if(format == 1) return _day + "/" + _mon + "/" + _year + " " + _hours + ":" + _min; else return _mon + "/" + _day + "/" + _year + " " + _hours + ":" + _min; } Webfm.doubleDigit = function(num) { return(num < 10) ? "0" + num : num; } Webfm.size = function(sz) { var size = sz; var units; if(size < 1024) units = " B"; else { size = parseInt(size >> 10); if(size < 1024) units = " KB"; else { size = parseInt(size >> 10); if(size < 1024) units = " MB"; else { size = parseInt(size >> 10); if(size < 1024) units = " GB"; else { size = parseInt(size >> 10); suffix = " TB"; } } } } return size + units; } Webfm.enter = function(event) { event = event || window.event; var code; if (event.keyCode) code = event.keyCode; else if (e.which) code = e.which; return(code == 13) ? true : false; } Webfm.rclick= function(event) { if (event.which) { var rightclick = (event.which == 3); } else { if (event.button) var rightclick = (event.button == 2); } return rightclick; } Webfm.copyToClipboard = function(s) { if(window.clipboardData && clipboardData.setData) { clipboardData.setData("Text", s); } else if(Webfm.browser.isOP) { alert("Clipboard function not supported in Opera. Copy link address from context menu."); } else if(window.netscape) { // You have to sign the code to enable this or allow the action in about:config by changing // user_pref("signed.applets.codebase_principal_support", true); try { netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect'); } catch(e) { alert("This feature requires 'signed.applets.codebase_principal_support=true' at about:config"); return false; } var clip = Components.classes['@mozilla.org/widget/clipboard;1'].createInstance(Components.interfaces.nsIClipboard); if(!clip) return; // create a transferable var trans = Components.classes['@mozilla.org/widget/transferable;1'].createInstance(Components.interfaces.nsITransferable); if(!trans) return; // specify the data we wish to handle. Plaintext in this case. trans.addDataFlavor('text/unicode'); // To get the data from the transferable we need two new objects var str = new Object(); var len = new Object(); var str = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString); var copytext = s; str.data = copytext; trans.setTransferData("text/unicode", str, copytext.length * 2); var clipid = Components.interfaces.nsIClipboard; if(!clip) return false; clip.setData(trans, null, clipid.kGlobalClipboard); } } // Dump debug function // return a string version of a thing, without name. // calls recursive function to actually traverse content. Webfm.dump = function(content, txt_arr) { if(txt_arr == 'undefined') txt_arr = false; return Webfm.dumpRecur(content, 0, true, txt_arr) + "\n"; } // recursive function traverses content, returns string version of thing // content: what to dump. // indent: how far to indent. // neednl: true if need newline, false if not Webfm.dumpRecur = function(content,indent,neednl,txt_arr) { var out = ""; if (typeof content == 'function') return 'function'; else if (Webfm.isArray(content)) { // handle real arrays in brackets if (neednl) out += "\n"+Webfm.dumpSpaces(indent); if(!txt_arr) out+="[ "; var inside = false; for (var i=0; i