/************************************************************************************************************ Static folder tree Copyright (C) October 2005 DTHMLGoodies.com, Alf Magne Kalleland This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Dhtmlgoodies.com., hereby disclaims all copyright interest in this script written by Alf Magne Kalleland. Alf Magne Kalleland, 2006 Owner of DHTMLgoodies.com ************************************************************************************************************/ /* Update log: December, 19th, 2005 - Version 1.1: Added support for several trees on a page(Alf Magne Kalleland) January, 25th, 2006 - Version 1.2: Added onclick event to text nodes.(Alf Magne Kalleland) February, 3rd 2006 - Dynamic load nodes by use of Ajax(Alf Magne Kalleland) */ var idOfFolderTrees = ['dhtmlgoodies_tree']; var imageFolder = 'https://www.electricrhythmdj.com/wp-content/plugins/tune-library/'; // Path to images var plusImage = 'plusbl.gif' var minusImage = 'minusbl.gif' var initExpandedNodes = ''; // Cookie - initially expanded nodes; var useAjaxToLoadNodesDynamically = true; var ajaxRequestFile = 'https://www.electricrhythmdj.com/wp-content/plugins/tune-library/writeNodes.php'; var contextMenuActive = false; // Set to false if you don't want to be able to delete and add new nodes dynamically var ajaxObjectArray = new Array(); var treeUlCounter = 0; var nodeId = 1; /* These cookie functions are downloaded from http://www.mach5.com/support/analyzer/manual/html/General/CookiesJavaScript.htm */ function Get_Cookie(name) { var start = document.cookie.indexOf(name+"="); var len = start+name.length+1; if ((!start) && (name != document.cookie.substring(0,name.length))) return null; if (start == -1) return null; var end = document.cookie.indexOf(";",len); if (end == -1) end = document.cookie.length; return unescape(document.cookie.substring(len,end)); } // This function has been slightly modified function Set_Cookie(name,value,expires,path,domain,secure) { expires = expires * 60*60*24*1000; var today = new Date(); var expires_date = new Date( today.getTime() + (expires) ); var cookieString = name + "=" +escape(value) + ( (expires) ? ";expires=" + expires_date.toGMTString() : "") + ( (path) ? ";path=" + path : "") + ( (domain) ? ";domain=" + domain : "") + ( (secure) ? ";secure" : ""); document.cookie = cookieString; } function expandAll(treeId) { var menuItems = document.getElementById(treeId).getElementsByTagName('LI'); for(var no=0;no0 && subItems[0].style.display!='block'){ showHideNode(false,menuItems[no].id.replace(/[^0-9]/g,'')); } } } function collapseAll(treeId) { var menuItems = document.getElementById(treeId).getElementsByTagName('LI'); for(var no=0;no0 && subItems[0].style.display=='block'){ showHideNode(false,menuItems[no].id.replace(/[^0-9]/g,'')); } } } function getNodeDataFromServer(ajaxIndex,ulId,parentId) { document.getElementById(ulId).innerHTML = ajaxObjectArray[ajaxIndex].response; ajaxObjectArray[ajaxIndex] = false; parseSubItems(ulId,parentId); } function parseSubItems(ulId,parentId) { if(initExpandedNodes){ var nodes = initExpandedNodes.split(','); } var branchObj = document.getElementById(ulId); var menuItems = branchObj.getElementsByTagName('LI'); // Get an array of all menu items for(var no=0;no0)continue; nodeId++; var subItems = menuItems[no].getElementsByTagName('UL'); var img = document.createElement('IMG'); img.src = imageFolder + plusImage; img.onclick = showHideNode; if(subItems.length==0)img.style.visibility='hidden';else{ subItems[0].id = 'tree_ul_' + treeUlCounter; treeUlCounter++; } var aTag = menuItems[no].getElementsByTagName('A')[0]; aTag.onclick = showHideNode; if(contextMenuActive)aTag.oncontextmenu = showContextMenu; menuItems[no].insertBefore(img,aTag); menuItems[no].id = 'dhtmlgoodies_treeNode' + nodeId; var folderImg = document.createElement('IMG'); if(menuItems[no].className){ folderImg.src = imageFolder + menuItems[no].className; }else{ folderImg.src = imageFolder; } /* menuItems[no].insertBefore(folderImg,aTag); */ var tmpParentId = menuItems[no].getAttribute('parentId'); if(!tmpParentId)tmpParentId = menuItems[no].tmpParentId; if(tmpParentId && nodes[tmpParentId])showHideNode(false,nodes[no]); } } function showHideNode(e,inputId) { if(inputId){ if(!document.getElementById('dhtmlgoodies_treeNode'+inputId))return; thisNode = document.getElementById('dhtmlgoodies_treeNode'+inputId).getElementsByTagName('IMG')[0]; }else { thisNode = this; if(this.tagName=='A')thisNode = this.parentNode.getElementsByTagName('IMG')[0]; } if(thisNode.style.visibility=='hidden')return; var parentNode = thisNode.parentNode; inputId = parentNode.id.replace(/[^0-9]/g,''); if(thisNode.src.indexOf(plusImage)>=0){ thisNode.src = thisNode.src.replace(plusImage,minusImage); var ul = parentNode.getElementsByTagName('UL')[0]; ul.style.display='block'; if(!initExpandedNodes)initExpandedNodes = ','; if(initExpandedNodes.indexOf(',' + inputId + ',')<0) initExpandedNodes = initExpandedNodes + inputId + ','; if(useAjaxToLoadNodesDynamically){ // Using AJAX/XMLHTTP to get data from the server var firstLi = ul.getElementsByTagName('LI')[0]; var parentId = firstLi.getAttribute('parentId'); if(!parentId)parentId = firstLi.parentId; if(parentId){ ajaxObjectArray[ajaxObjectArray.length] = new sack(); var ajaxIndex = ajaxObjectArray.length-1; ajaxObjectArray[ajaxIndex].requestFile = ajaxRequestFile + '?parentId=' + parentId; ajaxObjectArray[ajaxIndex].onCompletion = function() { getNodeDataFromServer(ajaxIndex,ul.id,parentId); }; // Specify function that will be executed after file has been found ajaxObjectArray[ajaxIndex].runAJAX(); // Execute AJAX function } } }else{ thisNode.src = thisNode.src.replace(minusImage,plusImage); parentNode.getElementsByTagName('UL')[0].style.display='none'; initExpandedNodes = initExpandedNodes.replace(',' + inputId,''); } Set_Cookie('dhtmlgoodies_expandedNodes',initExpandedNodes,500); return false; } var okToCreateSubNode = true; function addNewNode(e) { if(!okToCreateSubNode)return; setTimeout('okToCreateSubNode=true',200); contextMenuObj.style.display='none'; okToCreateSubNode = false; source = contextMenuSource; while(source.tagName.toLowerCase()!='li')source = source.parentNode; /* if (e.target) source = e.target; else if (e.srcElement) source = e.srcElement; if (source.nodeType == 3) // defeat Safari bug source = source.parentNode; */ //while(source.tagName.toLowerCase()!='li')source = source.parentNode; var nameOfNewNode = prompt('Name of new node'); if(!nameOfNewNode)return; uls = source.getElementsByTagName('UL'); if(uls.length==0){ var ul = document.createElement('UL'); source.appendChild(ul); }else{ ul = uls[0]; ul.style.display='block'; } var img = source.getElementsByTagName('IMG'); img[0].style.visibility='visible'; var li = document.createElement('LI'); li.className='dhtmlgoodies_sheet.gif'; var a = document.createElement('A'); a.href = '#'; a.innerHTML = nameOfNewNode; li.appendChild(a); ul.id = 'newNode' + Math.round(Math.random()*1000000); ul.appendChild(li); parseSubItems(ul.id); saveNewNode(nameOfNewNode,source.getElementsByTagName('A')[0].id); } /* Save a new node */ function saveNewNode(nodeText,parentId) { self.status = 'Ready to save node ' + nodeText + ' which is a sub item of ' + parentId; // Use an ajax method here to save this new node. example below: /* ajaxObjectArray[ajaxObjectArray.length] = new sack(); var ajaxIndex = ajaxObjectArray.length-1; ajaxObjectArray[ajaxIndex].requestFile = ajaxRequestFile + '?newNode=' + nodeText + '&parendId=' + parentId ajaxObjectArray[ajaxIndex].onCompletion = function() { self.status = 'New node has been saved'; }; // Specify function that will be executed after file has been found ajaxObjectArray[ajaxIndex].runAJAX(); // Execute AJAX function */ } function deleteNode() { if(!okToCreateSubNode)return; setTimeout('okToCreateSubNode=true',200); contextMenuObj.style.display='none'; source = contextMenuSource; if(!confirm('Click OK to delete the node ' + source.innerHTML))return; okToCreateSubNode = false; var parentLi = source.parentNode.parentNode.parentNode; while(source.tagName.toLowerCase()!='li')source = source.parentNode; var lis = source.parentNode.getElementsByTagName('LI'); source.parentNode.removeChild(source); if(lis.length==0)parentLi.getElementsByTagName('IMG')[0].style.visibility='hidden'; deleteNodeOnServer(source.id); } function deleteNodeOnServer(nodeId) { self.status = 'Ready to delete node' + nodeId; // Use an ajax method here to save this new node. example below: /* ajaxObjectArray[ajaxObjectArray.length] = new sack(); var ajaxIndex = ajaxObjectArray.length-1; ajaxObjectArray[ajaxIndex].requestFile = ajaxRequestFile + '?deleteNodeId=' + nodeId ajaxObjectArray[ajaxIndex].onCompletion = function() { self.status = 'Node has been deleted successfully'; }; // Specify function that will be executed after file has been found ajaxObjectArray[ajaxIndex].runAJAX(); // Execute AJAX function */ } function initTree() { for(var treeCounter=0;treeCounter