CreateDynamicTree("CategorySelector");

function CreateDynamicTree(id)
{
	var top = document.getElementById(id);
	if (top)
	{
		var topList = FindChildNode("UL", top);
		if (topList)
		{
			AugmentControls(topList);
		}
	}
	
	function AugmentControls(list)
	{
		if (list)
		{
			var item = list.firstChild;
			while(item)
			{
				if (item.nodeType == 1)
				{
					item.containsSelectedItems = Item__ContainsSelectedItems;
					InitializeParentItem();
					InitializeCheckbox(item);
					var innerList = FindChildNode("UL", item);
					if (innerList)
					{
						item.list = innerList;
						AddExpandCollapseControl(item);
						AugmentControls(innerList);
					}
				}
				item = item.nextSibling;
			}
		}
		
		function Item__ContainsSelectedItems()
		{
			var checkboxes = this.list.getElementsByTagName("input");
			for(var i = 0; i < checkboxes.length; i++)
			{
				var checkbox = checkboxes[i];
				if (checkbox.checked)
				{
					return true;
				}
			}
			return false;
		}
		
		function InitializeParentItem()
		{
			var parentItem = item.parentNode.parentNode;
			if (parentItem.tagName == "LI")
			{
				item.parentItem = parentItem;
			}
		}
		
		function InitializeCheckbox(item)
		{
			var checkbox = FindChildNode("INPUT", item);
			item.checkbox = checkbox;
			if (checkbox.checked)
			{
				SetAssumedNodes(item, true);
			}
			if (checkbox.disabled)
			{
				var label = FindChildNode("LABEL", item);			
				if (label)
				{
					AddOnClickEvent(label, Label_OnClick);
				}
			}
			else
			{
				AddOnClickEvent(checkbox, Checkbox_OnClick);
			}
			
			function Label_OnClick()
			{
				item.className = item.className == "Expanded" ? "Collapsed" : "Expanded";
			}
			
			function Checkbox_OnClick()
			{
				ClearDescendantNodes(item);
				if (item.checkbox.checked)
				{
					item.assumed = false;
					SetAssumedNodes(item, true);
					item.className = "Expanded"
				}
				else
				{
					SetAssumedNodes(item, false);
					item.className = "Collapsed";
				}
			}
			
			function ClearDescendantNodes(item)
			{
				var checkboxes = item.getElementsByTagName("input");
				for(var i = 0; i < checkboxes.length; i++)
				{
					var checkbox = checkboxes[i];
					if (checkbox.parentNode != item)
					{
						checkbox.checked = false;
					}
				}
			}
			
			function SetAssumedNodes(item, checked)
			{
				var ancestorItem = item.parentItem;
				while(ancestorItem)
				{
					if (!checked)
					{
						if (!ancestorItem.assumed || ancestorItem.containsSelectedItems()) return;
					}
					else
					{
						if (ancestorItem.checkbox.checked) return;
					}
					ancestorItem.checkbox.checked = checked;
					ancestorItem.assumed = checked;
					ancestorItem = ancestorItem.parentItem;
				}
			}
		}
		
		function AddExpandCollapseControl(item)
		{
//			item.className = item.containsSelectedItems() ? "Expanded" : "Collapsed";
			item.className = "Expanded";
			var control = document.createElement("DIV");
			control.className = "Control";
			AddOnClickEvent(control, Control_OnClick);
			item.insertBefore(control, item.firstChild);
			
			function Control_OnClick()
			{
				item.className = item.className == "Expanded" ? "Collapsed" : "Expanded";
			}
		}
	}
	
	function FindChildNode(tagName, obj)
	{
		var child = obj.firstChild;
		while(child)
		{
			if (child.tagName == tagName)
			{
				return child;
			}
			child = child.nextSibling;
		}
		return null;
	}
	
	function AddOnClickEvent(obj, handler)
	{
		if (obj.addEventListener)
		{
			obj.addEventListener("click", handler, false);
		}
		else
		{
			obj.attachEvent("onclick", handler);
		}
	}
}
