//**************************************************************** // You are free to copy the "Folder-Tree" script as long as you // keep this copyright notice: // Script found in: http://www.geocities.com/Paris/LeftBank/2178/ // Author: Marcelino Alves Martins (martins@hks.com) December '97. //**************************************************************** //Log of changes: // 17 Feb 98 - Fix initialization flashing problem with Netscape // // 27 Jan 98 - Root folder starts open; support for USETEXTLINKS; // make the ftien4 a js file // // DvH: Dec 2000 - Made some minor changes to support external // references // Definition of class Folder // ***************************************************************** function Folder(folderDescription, tagName, hreference) //constructor { //constant data this.desc = folderDescription this.tagName = tagName this.hreference = hreference this.id = -1 this.navObj = 0 this.iconImg = 0 this.nodeImg = 0 this.isLastNode = 0 //dynamic data this.isOpen = true this.iconSrc = "ftv2folderopen.png" this.children = new Array this.nChildren = 0 //methods this.initialize = initializeFolder this.setState = setStateFolder this.addChild = addChild this.createIndex = createEntryIndex this.hide = hideFolder this.display = display this.renderOb = drawFolder this.totalHeight = totalHeight this.subEntries = folderSubEntries this.outputLink = outputFolderLink } function setStateFolder(isOpen) { var subEntries var totalHeight var fIt = 0 var i=0 if (isOpen == this.isOpen) return if (browserVersion == 2) { totalHeight = 0 for (i=0; i < this.nChildren; i++) totalHeight = totalHeight + this.children[i].navObj.clip.height subEntries = this.subEntries() if (this.isOpen) totalHeight = 0 - totalHeight for (fIt = this.id + subEntries + 1; fIt < nEntries; fIt++) indexOfEntries[fIt].navObj.moveBy(0, totalHeight) } this.isOpen = isOpen propagateChangesInState(this) } function propagateChangesInState(folder) { var i=0 if (folder.isOpen) { if (folder.nodeImg) if (folder.isLastNode) folder.nodeImg.src = "ftv2mlastnode.png" else folder.nodeImg.src = "ftv2mnode.png" folder.iconImg.src = "ftv2folderopen.png" for (i=0; i<folder.nChildren; i++) folder.children[i].display() } else { if (folder.nodeImg) if (folder.isLastNode) folder.nodeImg.src = "ftv2plastnode.png" else folder.nodeImg.src = "ftv2pnode.png" folder.iconImg.src = "ftv2folderclosed.png" for (i=0; i<folder.nChildren; i++) folder.children[i].hide() } } function hideFolder() { if (browserVersion == 1 || browserVersion == 3) { if (this.navObj.style.display == "none") return this.navObj.style.display = "none" } else { if (this.navObj.visibility == "hidden") return this.navObj.visibility = "hidden" } this.setState(0) } function initializeFolder(level, lastNode, leftSide) { var j=0 var i=0 var numberOfFolders var numberOfDocs var nc nc = this.nChildren this.createIndex() var auxEv = "" if (browserVersion > 0) auxEv = "<a href='javascript:clickOnNode("+this.id+")'>" else auxEv = "<a>" if (level>0) if (lastNode) //the last 'brother' in the children array { this.renderOb(leftSide + auxEv + "<img name='nodeIcon" + this.id + "' src='ftv2mlastnode.png' width=16 height=22 border=0></a>") leftSide = leftSide + "<img src='ftv2blank.png' width=16 height=22>" this.isLastNode = 1 } else { this.renderOb(leftSide + auxEv + "<img name='nodeIcon" + this.id + "' src='ftv2mnode.png' width=16 height=22 border=0></a>") leftSide = leftSide + "<img src='ftv2vertline.png' width=16 height=22>" this.isLastNode = 0 } else this.renderOb("") if (nc > 0) { level = level + 1 for (i=0 ; i < this.nChildren; i++) { if (i == this.nChildren-1) this.children[i].initialize(level, 1, leftSide) else this.children[i].initialize(level, 0, leftSide) } } } function drawFolder(leftSide) { if (browserVersion == 2) { if (!doc.yPos) doc.yPos=8 doc.write("<layer id='folder" + this.id + "' top=" + doc.yPos + " visibility=hidden>") } if (browserVersion == 3) { doc.write("<div id='folder" + this.id + "' style='visibility:hide;'>") } doc.write("\n<table ") if (browserVersion == 1) doc.write(" id='folder" + this.id + "' style='position:block;' ") doc.write(" border=0 cellspacing=0 cellpadding=0>") doc.write("\n<tr><td>") doc.write(leftSide) this.outputLink() doc.write("<img name='folderIcon" + this.id + "' ") doc.write("src='" + this.iconSrc+"' border=0></a>") doc.write("</td>\n<td valign=middle nowrap>") if (USETEXTLINKS) { this.outputLink() doc.write(this.desc + "</a>") } else doc.write(this.desc) if (this.tagName!="") { doc.write(" [external]") } doc.write("</td>") doc.write("\n</table>\n") if (browserVersion == 2) { doc.write("</layer>") } if (browserVersion == 3) { doc.write("</div>") } if (browserVersion == 1) { this.navObj = doc.all["folder"+this.id] this.iconImg = doc.all["folderIcon"+this.id] this.nodeImg = doc.all["nodeIcon"+this.id] } else if (browserVersion == 2) { this.navObj = doc.layers["folder"+this.id] this.iconImg = this.navObj.document.images["folderIcon"+this.id] this.nodeImg = this.navObj.document.images["nodeIcon"+this.id] doc.yPos=doc.yPos+this.navObj.clip.height } else if (browserVersion == 3) { this.navObj = doc.getElementById("folder"+this.id) this.iconImg = doc.images.namedItem("folderIcon"+this.id) this.nodeImg = doc.images.namedItem("nodeIcon"+this.id) } } function outputFolderLink() { if (this.hreference) { doc.write("<a ") if (this.tagName) { doc.write("doxygen='" + this.tagName + "' "); } doc.write("href='" + this.hreference + "' TARGET=\"basefrm\" ") if (browserVersion > 0) doc.write("onClick='javascript:clickOnFolder("+this.id+")'") doc.write(">") } else doc.write("<a>") } function addChild(childNode) { this.children[this.nChildren] = childNode this.nChildren++ return childNode } function folderSubEntries() { var i = 0 var se = this.nChildren for (i=0; i < this.nChildren; i++){ if (this.children[i].children) //is a folder se = se + this.children[i].subEntries() } return se } // Definition of class Item (a document or link inside a Folder) // ************************************************************* function Item(itemDescription, tagName, itemLink) // Constructor { // constant data this.desc = itemDescription this.tagName = tagName this.link = itemLink this.id = -1 //initialized in initalize() this.navObj = 0 //initialized in render() this.iconImg = 0 //initialized in render() this.iconSrc = "ftv2doc.png" // methods this.initialize = initializeItem this.createIndex = createEntryIndex this.hide = hideItem this.display = display this.renderOb = drawItem this.totalHeight = totalHeight } function hideItem() { if (browserVersion == 1 || browserVersion == 3) { if (this.navObj.style.display == "none") return this.navObj.style.display = "none" } else { if (this.navObj.visibility == "hidden") return this.navObj.visibility = "hidden" } } function initializeItem(level, lastNode, leftSide) { this.createIndex() if (level>0) if (lastNode) //the last 'brother' in the children array { this.renderOb(leftSide + "<img src='ftv2lastnode.png' width=16 height=22>") leftSide = leftSide + "<img src='ftv2blank.png' width=16 height=22>" } else { this.renderOb(leftSide + "<img src='ftv2node.png' width=16 height=22>") leftSide = leftSide + "<img src='ftv2vertline.png' width=16 height=22>" } else this.renderOb("") } function drawItem(leftSide) { if (browserVersion == 2) doc.write("<layer id='item" + this.id + "' top=" + doc.yPos + " visibility=hidden>") if (browserVersion == 3) doc.write("<div id='item" + this.id + "' style='display:block;'>") doc.write("\n<table ") if (browserVersion == 1) doc.write(" id='item" + this.id + "' style='position:block;' ") doc.write(" border=0 cellspacing=0 cellpadding=0>\n") doc.write("<tr><td>") doc.write(leftSide) if (this.link!="") { doc.write("<a href=" + this.link + ">") } doc.write("<img id='itemIcon"+this.id+"' ") doc.write("src='"+this.iconSrc+"' border=0>") if (this.link!="") { doc.write("</a>") } doc.write("</td>\n<td valign=middle nowrap>") if (USETEXTLINKS && this.link!="") doc.write("<a href=" + this.link + ">" + this.desc + "</a>") else doc.write(this.desc) if (this.tagName!="") { doc.write(" [external]"); } doc.write("\n</table>\n") if (browserVersion == 2) doc.write("</layer>") if (browserVersion == 3) doc.write("</div>") if (browserVersion == 1) { this.navObj = doc.all["item"+this.id] this.iconImg = doc.all["itemIcon"+this.id] } else if (browserVersion == 2) { this.navObj = doc.layers["item"+this.id] this.iconImg = this.navObj.document.images["itemIcon"+this.id] doc.yPos=doc.yPos+this.navObj.clip.height } else if (browserVersion == 3) { this.navObj = doc.getElementById("item"+this.id) this.iconImg = doc.images.namedItem("itemIcon"+this.id) } } // Methods common to both objects (pseudo-inheritance) // ******************************************************** function display() { if (browserVersion == 1 || browserVersion == 3) this.navObj.style.display = "block" else this.navObj.visibility = "show" } function createEntryIndex() { this.id = nEntries indexOfEntries[nEntries] = this nEntries++ } // total height of subEntries open function totalHeight() //used with browserVersion == 2 { var h = this.navObj.clip.height var i = 0 if (this.isOpen) //is a folder and _is_ open for (i=0 ; i < this.nChildren; i++) h = h + this.children[i].totalHeight() return h } // Events // ********************************************************* function clickOnFolder(folderId) { var clicked = indexOfEntries[folderId] if (!clicked.isOpen) clickOnNode(folderId) return if (clicked.isSelected) return } function clickOnNode(folderId) { var clickedFolder = 0 var state = 0 clickedFolder = indexOfEntries[folderId] state = clickedFolder.isOpen clickedFolder.setState(!state) //open<->close } function initializeDocument() { doc = document; if (doc.all) browserVersion = 1 //IE4 else if (doc.layers) browserVersion = 2 //NS4 else if(navigator.userAgent.toLowerCase().indexOf('gecko') != -1) browserVersion = 3 //mozilla else browserVersion = 0 //other foldersTree.initialize(0, 1, "") foldersTree.display() if (browserVersion > 0) { if(browserVersion != 3) doc.write("<layer top="+indexOfEntries[nEntries-1].navObj.top+"> </layer>") // close the whole tree clickOnNode(0) // open the root folder clickOnNode(0) } } // Auxiliary Functions for Folder-Treee backward compatibility // ********************************************************* function gFld(description, tagName, hreference) { folder = new Folder(description, tagName, hreference) return folder } function gLnk(description, tagName, linkData) { fullLink = "" if (linkData!="") { fullLink = "'"+linkData+"' target=\"basefrm\"" } linkItem = new Item(description, tagName, fullLink) return linkItem } function insFld(parentFolder, childFolder) { return parentFolder.addChild(childFolder) } function insDoc(parentFolder, document) { parentFolder.addChild(document) } // Global variables // **************** USETEXTLINKS = 1 indexOfEntries = new Array nEntries = 0 doc = document browserVersion = 0 selectedFolder=0