﻿/* TreeSelect - Tree Style Item Selection for a Form */

function TreeSelect(root, evtCallbacks)
{
	var i;

	/* Properties */
	this._listElems = root.getElementsByTagName("li");

	/* Methods */
	this._getRootNodes = function()
	{
		var values;
		var i;

		values = new Array();
		
		var s="";
		for(i = 0; i < this._listElems.length; i++)
		{
			if(this._listElems[i]._isParent && this._listElems[i]._checkElem.id.substr(0,4) == "root")
			{
			    //s += "\nid=" + this._listElems[i]._checkElem.id + ", value=" + this._listElems[i]._spanElem.firstChild.nodeValue;
				values.push(this._listElems[i]);
			}
		}
		//alert("Root Nodes="+s);

		return values;
	};
	
	this._getValues = function()
	{
		var values;
		var i;

		values = new Array();
		
		for(i = 0; i < this._listElems.length; i++)
		{
			if(!this._listElems[i]._isParent && this._listElems[i]._inputElem.checked)
			{
				values.push(this._listElems[i]._spanElem.firstChild.nodeValue);
			}
		}

		return values;
	};
	
	this._closeNodes = function()
	{
		var i;
		
		for(i = 0; i < this._listElems.length; i++)
		{
			if(this._listElems[i]._isParent && this._listElems[i]._isOpen)
			{
				this._listElems[i]._expand(false);
			}
		}
	};
	
	this._openNodes = function()
	{
		var i;
		
		for(i = 0; i < this._listElems.length; i++)
		{
			if(this._listElems[i]._isParent && !this._listElems[i]._isOpen)
			{
				this._listElems[i]._expand(true);
			}
		}
	};
	
	this._clearCheckboxes = function()
	{
		var i;
		
		for(i = 0; i < this._listElems.length; i++)
		{
		    if(this._listElems[i]._isChecked)
		    {
			    if(this._listElems[i]._isParent)
			    {
			        this._listElems[i]._checkElem.className = "folder"
			    }else{
		            this._listElems[i]._inputElem.checked = false;
	                this._listElems[i]._checkElem.className = "unchecked";
			    }
	            this._listElems[i]._isChecked = false;
			}
		}
	};
	
	/* TreeNode Initialization */
	for(i = 0; i < this._listElems.length; i++)
	{
		/* Properties */
		if(this._listElems[i].parentNode != root)
			this._listElems[i]._parent = this._listElems[i].parentNode.parentNode;
		else
			this._listElems[i]._parent = null;
		this._listElems[i]._isParent = (GetChildElementsByTagName("input", this._listElems[i]).length == 0);
		if(this._listElems[i]._isParent)
		{
			this._listElems[i]._expandElem = GetChildElementsByTagName("img", this._listElems[i])[0];
			this._listElems[i]._checkElem = GetChildElementsByTagName("img", this._listElems[i])[1];
			this._listElems[i]._spanElem = GetChildElementsByTagName("span", this._listElems[i])[0];
			this._listElems[i]._isOpen = false;
			this._listElems[i]._isQuery = (this._listElems[i]._checkElem.id.substr(0, 5) == "query");
		} else {
			this._listElems[i]._inputElem = GetChildElementsByTagName("input", this._listElems[i])[0];
			this._listElems[i]._checkElem = GetChildElementsByTagName("img", this._listElems[i])[0];
			this._listElems[i]._spanElem = GetChildElementsByTagName("span", this._listElems[i])[0];
		}
		this._listElems[i]._isChecked = false;
		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;
				}
			};

			this._listElems[i]._check = function(checkit)
			{
			    var childElem;
			    var myListElems;
			    var i;
			    if (this._isChecked == checkit)
			        return;

			    childElem = GetChildElementsByTagName("ul", this)[0];
			    myListElems = GetChildElementsByTagName("li", childElem);

			    //alert("Parent _check=" + checkit + ", id=" + this._checkElem.id + ", ListElems = " + myListElems.length);

			    for (i = 0; i < myListElems.length; i++)
			        myListElems[i]._check(checkit);

			    if (checkit)
			        this._checkElem.className = "folderchecked";
			    else
			        this._checkElem.className = "folder";

			    this._isChecked = checkit;

			    if (this._parent == null) {
			        if (this._checkElem.id.substr(0, 4) == "root") {
			            //alert("Calling callback for root = " + this._checkElem.id);
			            this._eventCallbacks(this);
			        }
			    }
			};

			this._listElems[i]._evalChecks = function()
			{
			    var childElem;
			    var myListElems;
			    var isComplete;
			    var i;

			    childElem = GetChildElementsByTagName("ul", this)[0];
			    myListElems = GetChildElementsByTagName("li", childElem);

			    // If everything in the folder is checked, check the folder
			    isComplete = true;
			    for (i = 0; i < myListElems.length; i++) {
			        if (!myListElems[i]._isChecked) {
			            isComplete = false;
			            break;
			        }
			    }

			    //alert("_evalChecks=" + isComplete+", items="+myListElems.length);
			    if (isComplete) {
			        this._checkElem.className = "folderchecked";
			        this._isChecked = true;
			    } else {
			        this._checkElem.className = "folder";
			        this._isChecked = false;
			    }

			    if (this._parent != null)
			        this._parent._evalChecks();
			    else
			        this._eventCallbacks(this);
			};
		} else {
			this._listElems[i]._check = function(checkit)
			{
				if(this._isChecked == checkit)
					return;
					
				//alert("Elem _check="+checkit+", _inputElem.id="+this._inputElem.id+", nodeValue="+this._spanElem.firstChild.nodeValue);
				if(checkit)
				{
				    this._isChecked = true;
				    this._inputElem.checked = true;
				    this._checkElem.className = "checked";
				} else {
				    this._isChecked = false;
				    this._inputElem.checked = false;
				    this._checkElem.className = "unchecked";
				}
				
				/* This should NOT be in the parent, only here! */
				//if(this._eventCallbacks)
					this._eventCallbacks(this);
			};
		}
		
		/* Event Initialization */
		if(this._listElems[i]._isParent)
		{
			this._listElems[i]._expandElem.onclick = function()
			{
				this.parentNode._expand(!this.parentNode._isOpen);
			};
		} else {
		    /* Span click is the same as a box click (defined below) for non parent elements */
		    //alert("this._listElems[i]._inputElem.id="+this._listElems[i]._inputElem.id);
		    this._listElems[i]._spanElem.onclick = function()
		    {
			    //alert("checkbox_spanElem.onclick isParent="+this.parentNode._isParent+", id="+this.parentNode._inputElem.id);
			    this.parentNode._check(!this.parentNode._isChecked);
			    if(this.parentNode._parent != null)
				    this.parentNode._parent._evalChecks();
		    };
			
			this._listElems[i]._spanElem.onmouseover = function()
			{
				AddClass(this, "highlight");
			};
			
			this._listElems[i]._spanElem.onmouseout = function()
			{
				RemoveClass(this, "highlight");
			};
		}
		
		//alert("isparent="+this._listElems[i]._isParent+", "+this._listElems[i]._checkElem.id);
        this._listElems[i]._checkElem.onclick = function()
        {
            //alert("check_checkElem.onclick isParent="+this.parentNode._isParent);
	        this.parentNode._check(!this.parentNode._isChecked);
	        if(this.parentNode._parent != null)
		        this.parentNode._parent._evalChecks();
        };
	}
}
