function TreeNodeRefList()
{
	//Needed a way to reference nodes after their creation.
	var me = this;
	this.NodeList = null;
	
	this.AddNode = function(node) {
		if (me.NodeList==null) {
			me.NodeList = new Array();
		}
		me.NodeList[me.NodeList.length] = new Array(2);
		me.NodeList[me.NodeList.length-1][0] = node.ID;
		me.NodeList[me.NodeList.length-1][1] = node;
	}
	this.GetNode = function(nodeID) {
		var i = 0;
		for(i=0; i<me.NodeList.length; i++) {
			if (me.NodeList[i][0] == nodeID) {
				return me.NodeList[i][1];
			}
		}
	}
	this.CreateNode = function(nodeID, objParentNode) {
		var newNode;
		newNode = new TreeNode();
		newNode.SetID(nodeID);
		if (objParentNode) {
			objParentNode.AddChildNode(newNode);
		}
		me.AddNode(newNode);
		return newNode;
	}
}

function TreeNode()
{
	var me = this;
	this.ID = null;
	this.ToggleImages = null;
	this.ActiveClasses = null;
	this.InActiveClasses = null;
	this.ChildNodes = null;
	this.status = 0;
	this.hasChildNodes = false;
	this.hasToggleImages = false;
	this.hasInActiveClasses = false;
	this.hasActiveClasses = false;
	this.exclusiveNodes = 0;
	this.CanCloseSelf = 0;
	
	this.AddToggleImage = function(imageID, srcOn, srcOff) {
		if (me.ToggleImages==null) {
			me.ToggleImages = new Array();
		}
		me.ToggleImages[me.ToggleImages.length] = new Array(3);
		me.ToggleImages[me.ToggleImages.length - 1][0] = imageID;
		me.ToggleImages[me.ToggleImages.length - 1][1] = srcOn;
		me.ToggleImages[me.ToggleImages.length - 1][2] = srcOff;
		me.hasToggleImages = true;
	}
	
	this.SetID = function(ID) {
		me.ID = ID;
	}
	this.SetExclusiveNodes = function(myInt) {
		if (myInt == 1) {
			me.exclusiveNodes = 1;
		}
		else {
			me.exclusiveNodes = 0;
		}
	}
	this.SetCanCloseSelf = function(myInt) {
		if (myInt == 1) {
			me.CanCloseSelf = 1;
		}
		else {
			me.CanCloseSelf = 0;
		}
	}
	this.AddActiveClass = function(myClass) {
		if (myClass != '') {
		    if (me.ActiveClasses==null) {
			    me.ActiveClasses = new Array();
		    }
		    me.ActiveClasses[me.ActiveClasses.length] = myClass;
		    me.hasActiveClasses = true;
		}
	}
	this.AddInActiveClass = function(myClass) {
		if (myClass != '') {
		    if (me.InActiveClasses==null) {
			    me.InActiveClasses = new Array();
		    }
		    me.InActiveClasses[me.InActiveClasses.length] = myClass;
		    me.hasInActiveClasses = true;
		}
	}
	this.AddChildNode = function(node) {
		if (me.ChildNodes==null) {
			me.ChildNodes = new Array();
		}
		me.ChildNodes[me.ChildNodes.length] = node;
		me.hasChildNodes = true;
	}
	this.Toggle = function(recursiveOn, recursiveOff) {
		if (me.status == 0) {
			me.status = 1;
		}
		else {
			me.status = 0;
			if (me.CanCloseSelf==0) {
				me.status = 1;
			}
		}
		if (me.status == 1) {
			me.ToggleChildrenOn(recursiveOn);
		}
		else {
			me.ToggleChildrenOff(recursiveOff);
		}
	}
	this.ToggleChildren = function(objID, OverrideValue) {
		var i = 0;
		if(me.hasChildNodes) {
			for(i=0;i<me.ChildNodes.length; i++) {
				if (me.ChildNodes[i].ID == objID) {
					if(OverrideValue!=null) {
						if(OverrideValue==1) {
							me.ChildNodes[i].ToggleChildrenOn(true);
						}
						else {
							me.ChildNodes[i].ToggleChildrenOff(true);
						}
					}
					else {
						me.ChildNodes[i].Toggle(false, true);
					}
				}
				else {
					if (me.exclusiveNodes==1) {
						me.ChildNodes[i].ToggleChildrenOff(true);
					}
				}
			}
		}
	}
	this.ToggleOn = function(recursive) {
		if (recursive == true) {
			me.ToggleChildrenOn(recursive);
		}
		me.status = 1;
		var objMe;
		objMe = document.getElementById(me.ID);
		if(objMe!=null) {
			objMe.style.display = '';				
		}			
	}
	this.ToggleChildrenOn = function(recursive) {
		me.status = 1;
		var i = 0;
		//alert(me.ID + ' :ChildrenOn: ' + me.hasChildNodes);
		if(me.hasChildNodes) {
			for(i=0;i<me.ChildNodes.length; i++) {
				me.ChildNodes[i].ToggleOn(recursive);
			}
		}
		me.ToggleImage(true);
		me.SetActiveClasses();
	}	
	this.ToggleOff = function(recursive) {
		if (recursive == true) {
			me.ToggleChildrenOff(recursive);
		}
		me.status = 0;
		var objMe;
		objMe = document.getElementById(me.ID);
		if(objMe!=null) {
			objMe.style.display = 'none';
		}
	}
	this.ToggleChildrenOff = function(recursive) {
		me.status = 0;
		var i = 0;
		//alert(me.ID + ' :ChildrenOn: ' + me.hasChildNodes);
		if(me.hasChildNodes) {
			for(i=0;i<me.ChildNodes.length; i++) {
				me.ChildNodes[i].ToggleOff(recursive);
			}
		}
		me.ToggleImage(false);
		me.SetInActiveClasses();
	}
	this.ToggleImage = function(onoff) {
		var i = 0;
		var img;
		if (me.hasToggleImages) {
			for(i=0; i< me.ToggleImages.length; i++) {
				img = document.getElementById(me.ToggleImages[i][0]);
				if(img!=null) {
					if (onoff) {
						img.src = me.ToggleImages[i][1];
					}
					else {
						img.src = me.ToggleImages[i][2];
					}
				}
				img = null;
			}
		}		
	}
	this.SetActiveClasses = function() {
		if (me.hasInActiveClasses) {
		    objMe = document.getElementById(me.ID);
		    if(objMe!=null) {
			    for(i=0; i< me.InActiveClasses.length; i++) {
    				TreeLibRemoveClass(objMe,me.InActiveClasses[i]);
			    }
		    }
		}
		if (me.hasActiveClasses) {
		    objMe = document.getElementById(me.ID);
		    if(objMe!=null) {
			    for(i=0; i< me.ActiveClasses.length; i++) {
    				TreeLibAddClass(objMe,me.ActiveClasses[i]);
			    }
		    }
		}
	}
	this.SetInActiveClasses = function() {
		if (me.hasActiveClasses) {
		    objMe = document.getElementById(me.ID);
		    if(objMe!=null) {
			    for(i=0; i< me.ActiveClasses.length; i++) {
    				TreeLibRemoveClass(objMe,me.ActiveClasses[i]);
			    }
		    }
		}
		if (me.hasInActiveClasses) {
		    objMe = document.getElementById(me.ID);
		    if(objMe!=null) {
			    for(i=0; i< me.InActiveClasses.length; i++) {
    				TreeLibAddClass(objMe,me.InActiveClasses[i]);
			    }
		    }
		}
	}
}

function TreeLibAddClass(obj, classname) {
    if(!(obj==null)) {
	    obj.className += ' ' + classname;
    }
}
function TreeLibRemoveClass(obj, classname) {
    /*October 3, 2005 Note_RC:
      I came across a bug when using this function that if you called the function to remove a class
      that wasn't there, and the object using the said class had a transparent background, IE would
      not "repaint" the screen.*/
    if(!(obj==null)) {
	    if (obj.className.match(new RegExp(classname, "g"))) {
		    obj.className = obj.className.replace(new RegExp(classname, "g"), "");
	    }
    }
}
