Mega Code Archive

 
Categories / JavaScript DHTML / GUI Components
 

Building Collapsible Trees

/* Mastering JavaScript, Premium Edition by James Jaworski  ISBN:078212819X Publisher Sybex CopyRight 2001 */ <html> <head> <title>Tree Test</title> <style type="text/css"> BLOCKQUOTE { margin-top: -5; margin-bottom: -5; } TABLE { margin-top: 0; margin-bottom: 0; } A:link, A:visited {   color: black;   text-decoration: none; } </style> <script language="JavaScript"> var tree if(isNav4() && navigator.tree8487 != undefined)   // Use a unique value to differentiate with other concurrent tree objects  tree = navigator.tree8487 else tree = createTree()     function isDOM1Capable() {  if(document.getElementById) return true  return false }     function isIE4() {  if(!isDOM1Capable() && document.all) return true  return false }     function isNav4() {  if(navigator.appName == "Netscape" &&    parseInt(navigator.appVersion) >= 4 &&    parseInt(navigator.appVersion) < 5) return true  return false }     function createTree() {  var nodes = new Array(   "Tree Component",   "Tackles problems of persistence and redisplay",   "How can a complex object persist between page loadings?",   "How can I redisplay a portion of a page?",   "Exploits browser-unique features",   "Navigator 4",   "Uses <code>navigator</code> property for persistence.",   "Internet Explorer 4 and DOM1-capable browsers",   "Uses <code>innerHTML</code> property for redisplay",   "Just a touch of DHTML",   "Style sheets are used to shrink margins and hide links",   "Easily tailored")  var branches = new Array(new Array(0,1), new Array(0,4),   new Array(0,10), new Array(0,11), new Array(1,2), new Array(1,3),   new Array(4,5), new Array(4,7), new Array(5,6), new Array(7,8),   new Array(7,9)  )  branchID = 0  var subtrees = new Array()  for(var i=0; i<nodes.length; ++i)   subtrees[i] = new Tree(nodes[i])  for(var i=0; i<branches.length; ++i)   subtrees[branches[i][0]].addBranch(subtrees[branches[i][1]])  return subtrees[0] }     function Tree(root) {  this.text = root  this.id = branchID  ++branchID  this.expanded = true  this.branches = new Array()  this.addBranch = Tree_addBranch  this.changeState = Tree_changeState  this.handleClick = Tree_handleClick  this.processClick = Tree_processClick  this.display = Tree_display  this.getTreeString = Tree_getTreeString } function Tree_addBranch(tree) {  this.branches[this.branches.length] = tree } function Tree_changeState() {  this.expanded = !this.expanded } function Tree_handleClick(branch) {  this.processClick(branch)  if(isNav4()) {   navigator.tree8487 = tree   window.location.reload()  }else if(isDOM1Capable()) {   var d = document.getElementById("tree")   if(d != null) d.innerHTML = this.getTreeString()  }else if(isIE4()) {   var d = document.all("tree")   if(d != null) d.innerHTML = this.getTreeString()  } } function Tree_processClick(branch) {  if(this.id == branch) this.changeState()  else {   for(var i=0; i<this.branches.length; ++i)    this.branches[i].processClick(branch)  } } function Tree_getTreeString() {  var s = "<blockquote>"  s += '<table border="0">'  s += "<tr>"  s += "<td>"  if(this.branches.length > 0)   s += '<a href="javascript:tree.handleClick('+this.id+')">+</a>'  else s += "-"  s += "</td>"  s += "<td>"  s += this.text  s += "</td>"  s += "</tr>"  s += "</table>"  if((this.branches.length > 0) && (this.expanded == true)) {   for(var i=0; i<this.branches.length; ++i)    s += this.branches[i].getTreeString()  }  s += "</blockquote>"  return s } function Tree_display() {  document.writeln(this.getTreeString()) } </script> </head> <body> <hr> <div id="tree"> <script language="JavaScript"> tree.display() </script> </div> <hr> </body> </html>