| 
     
  
 
/* 
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> 
 
            
          
   
    
    |