/* Tree - Simple Expandable Nested List */

function Tree(root, evtCallbacks)
{
	var i;

	/* Properties */
	this._listElems = root.getElementsByTagName("li");
	this._selectedNode = null;
	
	/* Methods */
	this._selectNode = function(node)
	{
		if(this._selectedNode)
			this._selectedNode._spanElem.className = "";
		
		node._spanElem.className = "selected";
		this._selectedNode = node;
	};
	this._closeParents = function()
	{
		var i;
		
		for(i = 0; i < this._listElems.length; i++)
		{
			if(this._listElems[i]._isParent)
			{
				this._listElems[i]._expand(false);
			}
		}
	};
	
	/* TreeNode Initialization */
	for(i = 0; i < this._listElems.length; i++)
	{
		/* Properties */
		this._listElems[i]._tree = this;
		this._listElems[i]._isParent = (GetChildElementsByTagName("ul", this._listElems[i]).length != 0);
		if(this._listElems[i]._isParent)
		{
			this._listElems[i]._expandElem = GetChildElementsByTagName("img", this._listElems[i])[0];
			this._listElems[i]._isOpen = false;
		} else {
			this._listElems[i]._isSelected = false;
		}
		this._listElems[i]._spanElem = GetChildElementsByTagName("span", this._listElems[i])[0];
		this._listElems[i]._inputElem = GetChildElementsByTagName("input", this._listElems[i])[0];
		this._listElems[i]._eventCallbacks = evtCallbacks;
		
		/* Methods */
		if(this._listElems[i]._isParent)
		{
			this._listElems[i]._expand = function(expandit)
			{
				var childElem;
				
				if(expandit)
				{
					childElem = GetChildElementsByTagName("ul", this)[0];
					childElem.style.display = "block";
					this._expandElem.className = "open";
					this._isOpen = true;
				} else {
					childElem = GetChildElementsByTagName("ul", this)[0];
					childElem.style.display = "none";
					this._expandElem.className = "closed";
					this._isOpen = false;
				}
			};
		}
		
		/* Event Initialization */
		if(this._listElems[i]._isParent)
		{
			this._listElems[i]._expandElem.onclick = function()
			{
				this.parentNode._expand(!this.parentNode._isOpen);
			};
		}
		this._listElems[i]._spanElem.onclick = function()
		{
			this.parentNode._tree._selectNode(this.parentNode);
			if(this.parentNode._eventCallbacks["onclick"])
				this.parentNode._eventCallbacks["onclick"](this.parentNode);
		};
		
		this._listElems[i]._spanElem.onmouseover = function()
		{
			AddClass(this, "highlight");
		};
		
		this._listElems[i]._spanElem.onmouseout = function()
		{
			RemoveClass(this, "highlight");
		};
	}
}
