// +-----------------------------------------------------------------------+ // | Copyright (c) 2002, Richard Heyes, Harald Radi | // | All rights reserved. | // | | // | Redistribution and use in source and binary forms, with or without | // | modification, are permitted provided that the following conditions | // | are met: | // | | // | o Redistributions of source code must retain the above copyright | // | notice, this list of conditions and the following disclaimer. | // | o Redistributions in binary form must reproduce the above copyright | // | notice, this list of conditions and the following disclaimer in the | // | documentation and/or other materials provided with the distribution.| // | o The names of the authors may not be used to endorse or promote | // | products derived from this software without specific prior written | // | permission. | // | | // | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | // | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | // | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | // | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | // | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | // | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | // | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | // | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | // | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | // | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | // | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | // | | // +-----------------------------------------------------------------------+ // | Author: Richard Heyes | // | Harald Radi | // +-----------------------------------------------------------------------+ // // $Id: TreeMenu.js,v 1.6 2002/07/27 12:43:15 richard Exp $ // cc 2002-10-29, default style classes for use in tree text. var autostyles = new Array('tmenu0text', 'tmenu1text', 'tmenu2text', 'tmenu3text'); function TreeMenu(layer, iconpath, myname, linkTarget) { // Properties this.layer = layer; this.iconpath = iconpath; this.myname = myname; this.linkTarget = linkTarget; this.n = new Array(); this.branches = new Array(); this.branchStatus = new Array(); this.layerRelations = new Array(); this.childParents = new Array(); // Methods this.preloadImages = preloadImages; this.drawMenu = drawMenu; this.toggleBranch = toggleBranch; this.swapImage = swapImage; this.doesMenu = doesMenu; this.doesPersistence = doesPersistence; this.getLayer = getLayer; this.saveExpandedStatus = saveExpandedStatus; this.loadExpandedStatus = loadExpandedStatus; this.resetBranches = resetBranches; this.checkParentVisibility = checkParentVisibility; this.preloadImages(); } function TreeNode(title, icon, link, expanded, isDynamic) { this.title = title; this.icon = icon; this.link = link; this.expanded = expanded; this.isDynamic = isDynamic; this.n = new Array(); this.style = false; // cc 2002-10-29 } /** * Preload images hack for CrapZilla */ function preloadImages() { var plustop = new Image; plustop.src = this.iconpath + '/plustop.gif'; var plusbottom = new Image; plusbottom.src = this.iconpath + '/plusbottom.gif'; var plus = new Image; plus.src = this.iconpath + '/plus.gif'; var minustop = new Image; minustop.src = this.iconpath + '/minustop.gif'; var minusbottom = new Image; minusbottom.src = this.iconpath + '/minusbottom.gif'; var minus = new Image; minus.src = this.iconpath + '/minus.gif'; var branchtop = new Image; branchtop.src = this.iconpath + '/branchtop.gif'; var branchbottom = new Image; branchbottom.src = this.iconpath + '/branchbottom.gif'; var branch = new Image; branch.src = this.iconpath + '/branch.gif'; var linebottom = new Image; linebottom.src = this.iconpath + '/linebottom.gif'; var line = new Image; line.src = this.iconpath + '/line.gif'; } /** * Main function that draws the menu and assigns it * to the layer (or document.write()s it) */ function drawMenu()// OPTIONAL ARGS: nodes = [], level = [], prepend = '', expanded = false, visbility = 'inline', parentLayerID = null { /** * Necessary variables */ var output = ''; var modifier = ''; var layerID = 'mydmstreebox'; var parentLayerID = ''; /** * Parse any optional arguments */ var nodes = arguments[0] ? arguments[0] : this.n var level = arguments[1] ? arguments[1] : []; var prepend = arguments[2] ? arguments[2] : ''; var expanded = arguments[3] ? arguments[3] : false; var visibility = arguments[4] ? arguments[4] : 'inline'; var parentLayerID = arguments[5] ? arguments[5] : null; var currentlevel = level.length; for (var i=0; i 1 ? "top" : 'single'; } else if(i == (nodes.length-1)) { modifier = "bottom"; } else { modifier = ""; } /** * Single root branch is always expanded */ if (!doesMenu() || (parentLayerID == null && nodes.length == 1)) { expanded = true; } else if (nodes[i].expanded) { expanded = true; } else { expanded = false; } /** * Setup branch status and build an indexed array * of branch layer ids */ if (nodes[i].n.length > 0) { this.branchStatus[layerID] = expanded; this.branches[this.branches.length] = layerID; } /** * Setup toggle relationship */ if (!this.layerRelations[parentLayerID]) { this.layerRelations[parentLayerID] = new Array(); } this.layerRelations[parentLayerID][this.layerRelations[parentLayerID].length] = layerID; /** * Branch images */ var gifname = nodes[i].n.length && this.doesMenu() && nodes[i].isDynamic ? (expanded ? 'minus' : 'plus') : 'branch'; var iconimg = nodes[i].icon ? sprintf('', this.iconpath, nodes[i].icon) : ''; /** * Build the html to write to the document */ var divTag = sprintf('
', layerID, visibility); var onMDown = doesMenu() && nodes[i].n.length && nodes[i].isDynamic ? sprintf('onmousedown="%s.toggleBranch(\'%s\', true)" style="cursor: pointer; cursor: hand"', this.myname, layerID) : ''; var imgTag = sprintf('', this.iconpath, gifname, modifier, layerID, onMDown); var linkStart = nodes[i].link ? sprintf('', nodes[i].link, this.linkTarget) : ''; var linkEnd = nodes[i].link ? '' : ''; // cc 2002-10-29 var titleString = nodes[i].title; var styleStart = ''; var styleEnd = ''; if (nodes[i].style == 'auto') { styleInx = Math.min(currentlevel, autostyles.length-1); styleStart = "" styleEnd = ''; } output = sprintf('%s%s%s%s%s%s%s%s%s
', divTag, styleStart, prepend, parentLayerID == null && nodes.length == 1 ? '' : imgTag, iconimg, linkStart, titleString, // cc 2002-10-29 linkEnd, styleEnd); /** * Write out the HTML. Uses document.write for speed over layers and * innerHTML. This however means no dynamic adding/removing nodes on * the client side. This could be conditional I guess if dynamic * adding/removing is required. */ if (this.doesMenu()) { //this.getLayer(this.layer).innerHTML += output document.write(output); } else { document.write(output); } /** * Traverse sub nodes ? */ if (nodes[i].n.length) { /** * Determine what to prepend. If there is only one root * node then the prepend to pass to children is nothing. * Otherwise it depends on where we are in the tree. */ if (parentLayerID == null && nodes.length == 1) { var newPrepend = ''; } else if (i < (nodes.length - 1)) { var newPrepend = prepend + sprintf('', this.iconpath); } else { var newPrepend = prepend + sprintf('', this.iconpath); } this.drawMenu(nodes[i].n, explode('_', implode('_', level)), // Seemingly necessary to enforce passing by value newPrepend, nodes[i].expanded, expanded ? 'inline' : 'none', layerID); } } } function toggleBranch(layerID, updateStatus) // OPTIONAL ARGS: noSave = false { var currentDisplay = this.getLayer(layerID).style.display; var newDisplay = (this.branchStatus[layerID] && currentDisplay == 'inline') ? 'none' : 'inline' for (var i=0; i