	//create the node array that will contain every node
	var 	nodeArr=new Array()						,
			//define classnames
			hiddenMenuItem		="rowHiddenMenuItem",
			visibleMenuItem		="rowMenuItem"		,
			clickedNode								,
			//create the level array that will contain a list of nodes on each level
			levelArray			=new Array()		,
			//set to true if u want the structure to be 'remembered' when the tree is collapsed
			keepStructure		=true				,
			ancestorStr="";
	
	function node(level, text, value,expanded){
		var childArr									,
				cmdStr									,
				nextNodeIdx	=nodeArr.length				,
				prevNodeIdx	=nextNodeIdx-1				,
				prevNode		=nodeArr[prevNodeIdx]	,
				nextChildIdx							,
				dadNode									,
				nextLevelIdx;

		//assign new array per level		
		if (levelArray[level]==null){
			levelArray[level]= new Array();
		}
		//next level index
		nextLevelIdx=levelArray[level].length;
		//assign the index to the next node on level=level
		levelArray[level][nextLevelIdx]=nextNodeIdx;
		
		//assign unique id to objects that will point to html object
		//can't start id with no hence the _
		if (nextNodeIdx==0)
			this.id="_0";
		else
			this.id="_"+(prevNode.id.substr(1)*1+1);
			
		this.level		=level;
		this.text			=text;
		this.value		=value;
		this.children	=new Array();
		this.expanded	=expanded;

		//assign the dad node a few possiblities
		//if top level dad = null;
		if (level==0){
			this.dad=null;
		}
		//prevnode must be parent if prevnode's level<current level
		else if (prevNode.level<level)
			this.dad=prevNodeIdx;
		//same parent if prevnode's level is same as curr level
		else if (prevNode.level==level)
			this.dad=prevNode.dad;
		// parent=parent of prevnode if prevnode is 1 level higher than 
		//current level
		else if (prevNode.level==level+1)
			this.dad=nodeArr[prevNode.dad].dad;
		//need to backtrack to find first level=level tofind parent if level diff
		//>1
		else{
			for (var i=prevNodeIdx;i>0;i--){
				if (nodeArr[i].level==level){
					this.dad=nodeArr[i].dad;
					//got daddy lets het out of here!
					break;
				}
			}
		}
		//assign kids to lucky dad!! Here dad have some kids like it or not!
		if (this.dad!=null){
			dadNode=nodeArr[this.dad];
			nextChildIdx=dadNode.children.length;
			dadNode.children[nextChildIdx]=nextNodeIdx;
		}
		//now assign current node a fresh new object ie node
		nodeArr[nextNodeIdx]=new Object(this);
	}
	
	function noKids(node){
		if (node.children==null)
			return true;
		else if (node.children.length==0)
			return true;
		else
			return false;
	}

	//in next func we climb up thru all dads to check if all are expanded
	// as soon as 1 dad in chain is not expanded we return false
	//  a node can only be displayed if all ancestors are expanded
	function ancestorsExpanded(node){
		var ancestorNode=nodeArr[node.dad];
		for (var i=0 ;i<node.level-1;i++){
			if (ancestorNode.expanded!=1)
				return false;
			ancestorNode=nodeArr[ancestorNode.dad];
		}
		return true;
	}
	
	function inflateDeflateKids(node){
		var nodeId,
				theClass,
				dadNode,
				nodeHTML,
				marg;
		
		for (var i=0;i<node.children.length;i++){
			if (clickedNode.expanded==1){
				if(node.expanded==1){
					inflateDeflateKids(nodeArr[node.children[i]]);
				}
			}
			else{
				inflateDeflateKids(nodeArr[node.children[i]]);
			}
		}
		//don't process the clicked node just the kids;
		if (node.id==clickedNode.id)
			return;
		//define parent node
		dadNode=nodeArr[node.dad];
		//if parent node and clicked node are different and we are collapsing
		//then don't bother
		if (dadNode.expanded!=1 && clickedNode.expanded!=1 && 
				dadNode.id!=clickedNode.id)
			return;
		//change the global var keepStructure at top of page if u want to keep structure
		if (clickedNode.expanded==0 && !keepStructure)
			node.expanded=0;
		//get html id to point to html obj	
		nodeId=eval(node.id);	
	
		if (clickedNode.expanded!=1){
			nodeId.className=hiddenMenuItem;
		}
		else if (ancestorsExpanded(node)){
 			nodeId.className=visibleMenuItem;
 		}
	}
	
	//bubble up thru tree to get ancestors/hierarchy
	function getAncestors(node){
	
		if (node.dad==null){
			ancestorStr="";
			ancestorStr+=node.text;
			return;
		}
		getAncestors(nodeArr[node.dad]);
		ancestorStr+=" => <span style=cursor:hand onClick=parent.menu.cl("+node.id.substr(1)+",false)>"+node.text+"</span>";
	}
	
	function cl(nodeIdx,expandDeflate){
		
	  var obj,
	      node;
		if (nodeIdx==null)	{
			obj=event.srcElement;
			node=nodeArr[obj.id.substr(1)];
		}
		else
			node=nodeArr[nodeIdx];
			
		if (node!=null){
			clickedNode=node;
			menu.style.visibility="hidden";
			if (expandDeflate!=false){
				node.expanded=!node.expanded;
				inflateDeflateKids(node);
			}
			
			if (node.value!=null){
				//if not function but link
				if (node.value.indexOf("(")==-1)
					parent.main.location=node.value;
				else
					eval(node.value);
				getAncestors(clickedNode);
			}
			menu.style.visibility="visible";
		}
	}
	
	function buildVerMenu(){
		var HTMLStr="";
		for (var i=0;i<nodeArr.length;i++){
			if (nodeArr[i].level==0)
				className="rowMenuItem";
			else
				className="rowHiddenMenuItem";
				
			HTMLStr+="<div id=_"+
						i+
						" class="+
						className +
						" style=margin-left:"+10*nodeArr[i].level+
						" onClick=cl()"+
						" onMouseOver=mo()"+
						" onMouseOut=mo()"+
						">"+
						nodeArr[i].text+
						"</div>";
		}
		menu.innerHTML=HTMLStr;
	}
	
	function buildVerMenuOLD(){
		var HTMLStr="";
		for (var i=0;i<nodeArr.length;i++){
			if (nodeArr[i].level==0)
				className="rowMenuItem";
			else
				className="rowHiddenMenuItem";
				
			HTMLStr+="<div id=_"+
						i+
						" class="+
						className +
						" style=margin-left:"+10*nodeArr[i].level+
						" onClick=cl()"+
						" onMouseOver=mo()"+
						" onMouseOut=mo()"+
						">"+
						nodeArr[i].text+
						"</div>";
		}
		menu.innerHTML=HTMLStr;
	}