TreeObj.prototype.createHeading = TreeObjCreateHeading;
TreeObj.prototype.createLevelStart = TreeObjCreateLevelStart;
TreeObj.prototype.createNode = TreeObjCreateNode;
TreeObj.prototype.attachNodeEvent = TreeObjAttachNodeEvent;
TreeObj.prototype.attachNodeContentEvent = TreeObjAttachNodeContentEvent;
TreeObj.prototype.createLevelEnd = TreeObjCreateLevelEnd;
TreeObj.prototype.changeNodeImage = TreeObjChangeNodeImage;
TreeObj.prototype.markNode = TreeObjMarkNode;
TreeObj.prototype.selectNode = TreeObjSelectNode;
var arrAllTreeObj = new Array();
// ----------
function TreeObj(strObjName, intLevelsToShow, oAppendElm, strLinkTarget, bUseExpandImage){	
	this.strObjName = (typeof this.strObjName != "undefined")? this.strObjName : strObjName;
	this.intLevelsToShow = (typeof this.intLevelsToShow != "undefined")? this.intLevelsToShow : intLevelsToShow;
	this.oAppendElm = (this.oAppendElm)? this.oAppendElm : (oAppendElm)? oAppendElm : document.body;
	this.strHeadingID = "";
	this.oCurrLevelElm = null;
	this.strNodeGUID = "";
	this.oSelectedNode = null;	
	this.oSelectedNodeContainer = null;
	this.strLinkTarget = (typeof this.strLinkTarget != "undefined")? this.strLinkTarget : (strLinkTarget)? strLinkTarget : "_top";
	this.strSelectedNode = null;
	this.bUseExpandImage = (typeof bUseExpandImage != "undefined")? bUseExpandImage : true;
	this.arrAllLevelItems = new Array();
	arrAllTreeObj.push(this);
}
// ----------
function TreeObjCreateHeading(strText, strImage, strLink, strGUID){
	var oHeading = document.createElement("div");
	this.strHeadingID = this.strObjName + "_oHeading_";
	oHeading.setAttribute("id", this.strHeadingID);
	oHeading.setAttribute("objRef", this.strObjName);
	oHeading.setAttribute("GUID", strGUID);
	oHeading.className = "nodeItem";
	if(this.bUseExpandImage){
		var oExpandImg = document.createElement("img");			
		oExpandImg.className = "icon";
		oExpandImg.setAttribute("src", ((this.intLevelsToShow < 1)? strImgCollapsed : strImgExpanded));
		oHeading.appendChild(oExpandImg);
		oExpandImg.onclick = function (){
			var oChild = this.parentNode.getElementsByTagName("div")[0];
			if(oChild){
				this.setAttribute("src", ((oChild.style.display == "block")? strImgCollapsed : strImgExpanded));
				oChild.style.display = (oChild.style.display == "block")? "none" : "block";
			}
			eval(this.parentNode.getAttribute("objRef") + ".changeNodeImage(this.parentNode)");
		};
	}	
	if(strImage){	
		var oImg = document.createElement("img");
		oImg.className = "icon";
		oImg.setAttribute("src", strImage);
		oHeading.appendChild(oImg);
	}
	if(strLink){
		oTextElm = document.createElement("a");
		oTextElm.setAttribute("href", strLink);
		oTextElm.setAttribute("target", this.strLinkTarget);
	}
	else{
		oTextElm = document.createElement("span");		
	}
	oTextElm.setAttribute("objRef", this.strObjName);
	oTextElm.innerHTML = strText;
	oTextElm.className = "nodeLink";
	oTextElm.onmouseover = function (){
		if(!strLink){
			this.className = "nodeItemHover";
		}	
	};
	oTextElm.onmouseout = function (){
		if(!strLink){
			this.className = (this.getAttribute("selectedNode"))? "selectedNode" : "";
		}	
	};
	oTextElm.onclick = function (oNSEvent){
		(is.ns || is.gecko)? oNSEvent.stopPropagation() : event.cancelBubble = true;
		this.setAttribute("selectedNode", "true");
		var strObjRef = this.getAttribute("objRef");
		eval(strObjRef + ".markNode(this)");
		eval(strObjRef + ".strSelectedNode = this.parentNode.getAttribute(\"GUID\")");
	};
	oHeading.appendChild(oTextElm);
	this.oAppendElm.appendChild(oHeading);
	this.oCurrLevelElm = oHeading;
}
// ----------
function TreeObjCreateLevelStart(intLevel, strClassName){	
	var oLevelStart = document.createElement("div");
	oLevelStart.setAttribute("intLevel", intLevel);
	oLevelStart.style.display = (intLevel <=this.intLevelsToShow)? "block" : "none";
	oLevelStart.className = (strClassName)? strClassName : "levelTreeContainer";	
	if(this.strHeadingID.length == 0){
		this.strHeadingID = this.strObjName + "_oHeading_";
	}
	if(!this.oCurrLevelElm){
		this.oCurrLevelElm = this.oAppendElm;
	}
	this.oCurrLevelElm.appendChild(oLevelStart);
	this.oCurrLevelElm = oLevelStart;
}
// ----------
function TreeObjCreateNode(bNodeToOpen, strText, strImage, strGUID, strLink, strClassName, strLinkTarget){
	var oLevelContainer = this.oCurrLevelElm;
	var intLevel = this.oCurrLevelElm.getAttribute("intLevel");
	var strText = strText;
	var oLevelItem = document.createElement("div");
	oLevelItem.setAttribute("GUID", strGUID);
	oLevelItem.setAttribute("intLevel", intLevel);
	oLevelItem.setAttribute("objRef", this.strObjName);
	oLevelItem.setAttribute("hasChildren", bNodeToOpen);
	oLevelItem.className = "nodeItem";	
	oLevelItem.className = (strClassName)? strClassName : "nodeItem";	
	if(this.bUseExpandImage){
		var oExpandImg = document.createElement("img");
		var strImgExpandedSrc = (intLevel > 1)? strSubImgExpanded : strImgExpanded;
		var strImgCollapsedSrc = (intLevel > 1)? strSubImgCollapsed : strImgCollapsed;
		var strImgSrc = ((intLevel + 1) <= this.intLevelsToShow)? strImgExpandedSrc : strImgCollapsedSrc;
		if(!bNodeToOpen) strImgSrc = (intLevel > 1)? strSubImgNoChildren : strImgNoChildren;;
		oExpandImg.className = "icon";		
		oExpandImg.setAttribute("src", strImgSrc);
		oLevelItem.appendChild(oExpandImg);
	}
	if(strImage){
		var oImg = document.createElement("img");
		oImg.className = "icon";
		oImg.setAttribute("src", strImage);		
		oLevelItem.appendChild(oImg);
	}
	var oTextElm;
	if(strLink){
		strLinkTarget = (strLinkTarget)? strLinkTarget : this.strLinkTarget;
		oTextElm = document.createElement("a");
		oTextElm.setAttribute("href", strLink);
		oTextElm.setAttribute("target", strLinkTarget);		
	}
	else{
		oTextElm = document.createElement("span");		
	}
	oTextElm.className = "nodeLink";
	oTextElm.innerHTML = strText;
	this.attachNodeContentEvent(oTextElm, strLink);	
	if(bNodeToOpen){
		var oExpandElm = (this.bUseExpandImage)? oExpandImg : oTextElm;
		this.attachNodeEvent(oExpandElm, intLevel);
	}	
	oLevelItem.appendChild(oTextElm);	
	oLevelContainer.appendChild(oLevelItem);
	this.arrAllLevelItems.push([oTextElm, oLevelItem, oLevelContainer]);
}
// ----------
function TreeObjAttachNodeEvent(oExpandElm, intLevel){
	oExpandElm.onclick = function (oNSEvent){
		var oParentNode = this.parentNode;
		var oNextSib = oParentNode.nextSibling;
		if(oNextSib && (oNextSib.getAttribute("intLevel") > oParentNode.getAttribute("intLevel"))){
			oParentNode.bVisibleChild = (oParentNode.nextSibling.style.display == "block")? true : false;
			if(oParentNode.bVisibleChild){				
				var strImgCollapsedSrc = (intLevel > 1)? strSubImgCollapsed : strImgCollapsed;
				this.setAttribute("src", strImgCollapsedSrc);
				oNextSib.style.display = "none";
				if(!this.bUseExpandImage){
					this.removeAttribute("selectedNode");					
					this.className = this.className.replace(/\s*selectedNode/, "");
				}
			}
			else{
				var strImgExpandedSrc = (intLevel > 1)? strSubImgExpanded : strImgExpanded;
				this.setAttribute("src", strImgExpandedSrc);
				oNextSib.style.display = "block";
				if(!this.bUseExpandImage){
					this.setAttribute("selectedNode", "true");
					this.className += " selectedNode";
				}
			}
			var strObjRef = oParentNode.getAttribute("objRef");
			var bChildrenCreated = new String(oNextSib.getAttribute("childrenCreated")).search(/false/) == -1;
			if(!oParentNode.bVisibleChild && !bChildrenCreated){
				var strGUID = oParentNode.getAttribute("GUID");
				eval(strObjRef + ".oSelectedNodeContainer = oParentNode");
				eval(strObjRef + ".strNodeGUID = strGUID");
			}
		}
		(is.ns || is.gecko)? oNSEvent.stopPropagation() : event.cancelBubble = true;
	};
}
// ----------
function TreeObjAttachNodeContentEvent(oTextElm, strLink){
	oTextElm.onmouseover = function (){
		if(this.className.search(/selectedNode/) != -1){
			this.setAttribute("selectedNode", "true");
		}
		else{
			this.className = "nodeItemHover";
		}
	};
	oTextElm.onmouseout = function (){
		this.className = (this.getAttribute("selectedNode"))? "nodeLink selectedNode" : "nodeLink";			
	};
	oTextElm.onselectstart = function (){		
		event.returnValue = false;
	};
	oTextElm.onclick = function (oNSEvent){
		var oParentNode = this.parentNode;
		while(oParentNode.className.search(/nodeItem/) == -1){
			if(oParentNode.parentNode){
				oParentNode = oParentNode.parentNode;	
			}
			else{
				break;
			}
		}
		var strObjRef = oParentNode.getAttribute("objRef");
		this.setAttribute("selectedNode", "true");
		eval(strObjRef + ".markNode(this)");
		eval(strObjRef + ".strSelectedNode = oParentNode.getAttribute(\"GUID\")");
		if(this.bUseExpandImage){
			(is.ns || is.gecko)? oNSEvent.stopPropagation() : event.cancelBubble = true;
		}
	};
	oTextElm.ondblclick = function (oNSEvent){
		var oParentNode = this.parentNode;
		while(oParentNode.className.search(/nodeItem/) == -1){
			if(oParentNode.parentNode){
				oParentNode = oParentNode.parentNode;	
			}
			else{
				break;
			}
		}
		oParentNode.firstChild.click();																				
		(is.ns || is.gecko)? oNSEvent.stopPropagation() : event.cancelBubble = true;
	};	
}
// ----------
function TreeObjChangeNodeImage(oParentNode){
	var oNodeImage = oParentNode.getElementsByTagName("img")[1];
	if(oNodeImage){		
		var strCurrentSrc = new String(oNodeImage.getAttribute("src"));
		var oRegExp = new RegExp(/(\w+|\d+)([.]\w{3,4})$/);			
		if(oRegExp.test(strCurrentSrc)){
			oRegExp.exec(new String(oNodeImage.getAttribute("src")))[1];				
			var strImgName = RegExp.$1;
			var strImgExtension = RegExp.$2;
			var strCurrentFileName = strImgName + strImgExtension;
			var strNewFileName = ((strImgName.search(/_expanded/) == -1)? (strImgName + "_expanded") : strImgName.replace(/_expanded/, "")) + strImgExtension;
			var strNewSrc = strCurrentSrc.replace(strCurrentFileName, strNewFileName);
			oNodeImage.setAttribute("src", strNewSrc);
		}			
	}

}
// ----------
function TreeObjCreateLevelEnd(){
	this.oCurrLevelElm = this.oCurrLevelElm.parentNode;
}
// ----------
function TreeObjMarkNode(oElm){
	var oSelectedElm = this.oSelectedNode;
	if(oSelectedElm){
		if(this.oSelectedNode == oElm){
			return false;
		}
		oSelectedElm.className = oSelectedElm.className.replace(/\s?selectedNode/, "");
		oSelectedElm.removeAttribute("selectedNode");
	}
	oElm.className += ((oElm.className.length > 0)? " " : "") + "selectedNode";
	this.oSelectedNode = oElm;
	this.oSelectedNodeContainer = this.oSelectedNode.parentNode;
	this.strNodeGUID = this.oSelectedNodeContainer.getAttribute("GUID");
}
// ----------
function TreeObjSelectNode(strGUID, bExpandChildren, bMarkAllParents){
	var oElmText;
	var oElm;
	var oSelectedElmContainer;
	for(var i=0; i<this.arrAllLevelItems.length; i++){
		oElm = this.arrAllLevelItems[i][1];
    	if(strGUID == oElm.getAttribute("GUID")){
			oElmText = this.arrAllLevelItems[i][0];
			this.markNode(oElmText);
			oSelectedElmContainer = this.arrAllLevelItems[i][2];
			oSelectedElmContainer.style.display = "block";
			var oNextSib = oElm.nextSibling;
			if(oNextSib && bExpandChildren){
				if(oNextSib.className.search(/levelTreeContainer/) != -1){
					oElm.firstChild.setAttribute("src", strImgExpanded);
					if(!this.bUseExpandImage){
						oElm.firstChild.className += " selectedNode";
					}
					oNextSib.style.display = "block";
				}
			}
			
			var oParent;
			var oPrevSib = oSelectedElmContainer.previousSibling;
			var oExpandElm;
			while(oSelectedElmContainer.parentNode){
				if(oSelectedElmContainer.getAttribute("id") == this.strHeadingID) break;
				if(oSelectedElmContainer.getAttribute("intLevel") > 1){
					oPrevSib = oSelectedElmContainer.previousSibling;
					oExpandElm = oPrevSib.firstChild;
					if(this.bUseExpandImage){
						oExpandElm.setAttribute("src", strImgExpanded);
					}
					else if(bMarkAllParents){	
						oExpandElm.setAttribute("selectedNode", "true");
						oExpandElm.className += " selectedNode";
					}
				}
				else{
					var oRoot = getElm(this.strHeadingID);
					if(oRoot){
						oRoot.firstChild.setAttribute("src", strImgExpanded);
					}	
				} 
				oSelectedElmContainer.style.display = "block";
				oSelectedElmContainer = oSelectedElmContainer.parentNode;
			}
			break;
		}
	}
}
// ----------