/* ======================================================================== Make Jvascript Tree ======================================================================= */
/*****************************************************************_-== Implemented by Mladen Nochev ==-_****************************************************************/

	// Automatically attach a listener to the window onload, to convert the trees
	
	AddEvent(window, "load", CheckSelectedCategory);
	AddEvent(window, "load", ConvertTrees);
	
	function GetURLParameter(SearchedStringParameter)
	{
		var ReturnString = "";
		var HrefString = window.location.href; 
		
		if(HrefString.indexOf("?") > -1)
		{
			var ModuleActionQueryString = HrefString.substr(HrefString.indexOf("?")+1).toLowerCase();
					
			var ActionQueryString = ModuleActionQueryString.split("&");
					
			for(var iParameters = 0;iParameters < ActionQueryString.length;iParameters++)
			{
				var Index = ActionQueryString[iParameters].indexOf(SearchedStringParameter.toLowerCase()+"=");
				if (Index == 0)
				{
					var ActionParameter = ActionQueryString[iParameters].split("=");
					ReturnString = ActionParameter[1];
					break;
				}
			}
		}
		return unescape(ReturnString);
	}

	// Utility function to add an event listener
	function AddEvent(Object, Event, EventFunction)
	{
		if(Object.addEventListener)
		{
			Object.addEventListener(Event, EventFunction, true);
			return true;
		}
		else if(Object.attachEvent)
		{
			return Object.attachEvent("on"+Event, EventFunction);
		}
		else
		{
			return false;
		}
	}

	// utility function to set a global variable if it is not already set
	function SetDefault(Name, Value)
	{
		if(typeof(window[Name]) == "undefined" || window[Name] == null)
		{
			window[Name] = Value;
		}
	}
	
	function CheckTree(TreeName, TreeId)
	{
		var Tree = document.getElementById(TreeName+TreeId);
		
		if(Tree)
		{
			
			if(Tree.className == 'LIOpen')
			{
				Tree.className = 'LIClosed';
			}
			else
			{
				Tree.className = 'LIOpen';
			}
			return false;
		}
	}
	
	function CheckSelectedCategory()
	{
		if(GetURLParameter('category_id'))
		{
			var Category = document.getElementById(GetURLParameter('category_id'));
		}
		
		if(Category)
		{
			Category.className = 'LIBulletSelected';
			
			if(Category.parentNode)
			{
				while(Category.parentNode)
				{
					var Parent = Category.parentNode;
					
					if(Parent.nodeName == 'UL')
					{
						if(Parent.parentNode.nodeName == 'LI')
						{
							Parent.parentNode.className = 'LIOpen';
						}
					}
					Category = Category.parentNode;
				}
			}
		}
		
		
	}
	
	// Full expands a tree with a given ID
	function ExpandTree(TreeId)
	{
		var UL = document.getElementById(TreeId);
		
		if(UL == null)
		{
			return false;
		}
		ExpandCollapseList(UL, NodeOpenClass);
	}

	// Fully collapses a tree with a given ID
	function CollapseTree(TreeId)
	{
		var UL = document.getElementById(TreeId);
		
		if(UL == null)
		{
			return false;
		}
		ExpandCollapseList(UL, NodeClosedClass);
	}

	// Expands enough nodes to expose an LI with a given ID
	function ExpandToItem(TreeId, ItemId)
	{
		var UL = document.getElementById(TreeId);
		
		if(UL == null)
		{
			return false;
		}
		var Return = ExpandCollapseList(UL, NodeOpenClass, ItemId);
		
		if(Return)
		{
			var Object = document.getElementById(ItemId);
			
			if(Object.scrollIntoView)
			{
				Object.scrollIntoView(false);
			}
		}
	}

	// Performs 3 functions:
	// a) Expand all nodes
	// b) Collapse all nodes
	// c) Expand all nodes to reach a certain ID
	
	function ExpandCollapseList(UL, ClassName, ItemId)
	{
		if(!UL.childNodes || UL.childNodes.length == 0)
		{
			return false;
		}

		for(var NumberItem = 0; NumberItem < UL.childNodes.length; NumberItem++)
		{
			var Item = UL.childNodes[NumberItem];
			
			if(ItemId != null && Item.id == ItemId)
			{
				return true;
			}
			
			if (Item.nodeName == "LI")
			{
				var SubLists = false;
				
				for(var NumberSubItem = 0; NumberSubItem < Item.childNodes.length; NumberSubItem++)
				{
					var SubItem = Item.childNodes[NumberSubItem];
					
					if(SubItem.nodeName == "UL")
					{
						SubLists = true;
						
						var Return = ExpandCollapseList(SubItem, ClassName, ItemId);
						
						if (ItemId != null && Return)
						{
							Item.className = ClassName;
							return true;
						}
					}
				}
				if(SubLists && ItemId == null)
				{
					Item.className = ClassName;
				}
			}
		}
	}

	// Search the document for UL elements with the correct CLASS name, then process them
	function ConvertTrees()
	{
		SetDefault("TreeClass", "MakeTree");
		SetDefault("NodeClosedClass", "LIClosed");
		SetDefault("NodeOpenClass", "LIOpen");
		SetDefault("NodeBulletClass", "LIBullet");
		SetDefault("NodeBulletClassSelected", "LIBulletSelected");
		SetDefault("NodeLinkClass", "Bullet");
		SetDefault("PreProcessTrees", true);
		
		if(PreProcessTrees)
		{
			if (!document.createElement)		// Without createElement, we can't do anything
			{
				return;
			} 
			var ULElement = document.getElementsByTagName("ul");
			
			for(var NumberULElement = 0; NumberULElement < ULElement.length; NumberULElement++)
			{
				var UL = ULElement[NumberULElement];
				
				if (UL.nodeName == "UL" && UL.className == TreeClass)
				{
					ProcessList(UL);
				}
			}
		}
	}

	// Process a UL tag and all its children, to convert to a tree
	function ProcessList(UL)
	{
		if (!UL.childNodes || UL.childNodes.length == 0)
		{
			return;
		}
		
		for(var NumberItem = 0; NumberItem < UL.childNodes.length; NumberItem++)
		{
			var Item = UL.childNodes[NumberItem];
			
			if (Item.nodeName == "LI")
			{
				var SubLists = false;
				
				for(var NumberSubItem = 0; NumberSubItem < Item.childNodes.length; NumberSubItem++)
				{
					var SubItem = Item.childNodes[NumberSubItem];
					
					if(SubItem.nodeName == "UL")
					{
						SubLists = true;
						ProcessList(SubItem);
					}
				}
				var Span = document.createElement("SPAN");
				var Space = '\u00A0'; // &nbsp;
				
				Span.className = NodeLinkClass;
				
				if(SubLists)
				{
					// This LI has UL's in it, so it's a +/- node
					if(Item.className == null || Item.className == "")
					{
						Item.className = NodeClosedClass;
					}
					
					// If it's just text, make the text work as the link also
					if(Item.firstChild.nodeName == "#text")
					{
						Space = Space+Item.firstChild.nodeValue;
						Item.removeChild(Item.firstChild);
					}
					Span.onclick = function ()
					{
						this.parentNode.className = (this.parentNode.className == NodeOpenClass) ? NodeClosedClass : NodeOpenClass;
						return false;
					}
				}
				else
				{
					// No sublists, so it's just a bullet node
					
					Item.className = NodeBulletClass;
					
					Span.onclick = function ()
					{
						return false;
					}
				}
				
				Span.appendChild(document.createTextNode(Space));
				Item.insertBefore(Span, Item.firstChild);
			}
		}
	}
	