// DropMenu() Class Version 1.0

var DropMenu = function()
{	
	// Private Properties
	
	var container = null;
	var animSpeed = 3;
	var groups = new Array();
	var activeMenu = false;
	var errorPrefix = "DropMenu() Class Error!\n";
	
	var menuObj = document.createElement("div");
	menuObj.className = "DropMenuClass";
	
	// Public Methods
	
	// Global Preferences
	
	DropMenu.prototype.setContainer = function(id)
	{
		if(isString(id) && typeof(document.getElementById(id)) != "undefined")
		{
			container = document.getElementById(id);
			container.appendChild(menuObj);
		}
		else
		{
			alert(errorPrefix+"Menu container element id '" + id + "' not found.");
		}
	}
	
	DropMenu.prototype.setAnimationSpeed = function(integer_1_to_5)
	{
		if(isNumber(integer_1_to_5))
		{
			var sp = Math.round(integer_1_to_5) * 2;
			if(sp > 10){ sp = 10;}
			if(sp < 1){ sp = 1;}
			animSpeed = 11 - sp;
		}
		else
		{
			alert(errorPrefix+"The 'setAnimationSpeed()' method was not given an integer");
		}
	}
	
	// Drop Menu Constructors
	
	DropMenu.prototype.addGroup = function(groupName,displayText,hyperlink)
	{
		if(container == null)
		{
			alert(errorPrefix+"No container for the menu has been defined.");
		}
		if(!isString(groupName)){alert(errorPrefix+"One of the 'addGroup()' items does not contain a valid 'groupName' String value.");}
		if(!isString(displayText)){ displayText = "Menu";}
		if(!isString(hyperlink)){ hyperlink = false;}
		if(addGroupToIndex(groupName))
		{
			var group = document.createElement("div");
			group.className = "Group";
			group.subMenuId = groupName;
			group.onmouseover = showSubMenu;
			group.onmouseout = hideSubMenu;
			group.closeTimer = false;
			
			menuObj.appendChild(group);
			
			if(hyperlink)
			{
				group.innerHTML = "<a href=\"" + hyperlink + "\"><div class=\"Label\">" + displayText + "</div></a>";
			}
			else
			{
				group.innerHTML = "<div class=\"Label\">" + displayText + "</div>";
			}
			
			var subContainer = document.createElement("div");
			subContainer.className = "SubmenuContainer";
			subContainer.id = groupName;
			subContainer.style.display = "none";
			subContainer.anim = false;
			subContainer.status = "closed";
			subContainer.animHeight = 0;
			subContainer.firstRun = true;
			subContainer.targetHeight = 0;
			subContainer.closeTimer = false;
			
			var subMenuItems = document.createElement("div");
			subMenuItems.id = groupName + "_items";
			subContainer.appendChild(subMenuItems);
			
			group.appendChild(subContainer);
		}
	}
	
	DropMenu.prototype.addGroupItem = function(parentGroupName,displayText,hyperlink)
	{
		if(!isString(parentGroupName)){alert(errorPrefix+"One of the 'addGroup()' items does not contain a valid 'groupName' String value.");}
		if(!isString(displayText)){ displayText = "Item";}
		if(!isString(hyperlink)){ hyperlink = false;}
		
		var groupExists = false;
		
		for(i=0; i<groups.length; i++)
		{
			if(groups[i] == parentGroupName)
			{
				groupExists = true;
				break;
			}
		}
		if(groupExists)
		{
			var menuItem = document.createElement("div");
			
			if(hyperlink)
			{
				menuItem.innerHTML = "<a href=\"" + hyperlink + "\"><div class=\"MenuItem\">" + displayText + "</div></a>";
			}
			else
			{
				menuItem.innerHTML = "<div class=\"MenuItem\">" + displayText + "</div>";
			}
			var group = document.getElementById(parentGroupName + "_items");
			group.appendChild(menuItem);
		}
	}
	
	// Validators
	
	var isString = function(value)
	{
		return (typeof(value) != "string" || value.length < 1) ? false : true;
	}
	
	var isNumber = function(value)
	{
		return (typeof(value) != "number" || value.length < 1) ? false : true;
	}
	
	var addGroupToIndex = function(groupName)
	{
		var matchFound = false;
		for(i=0; i<groups.length; i++)
		{
			if(groups[i] == groupName)
			{
				matchFound = true;
				break;
			}
		}
		if(matchFound)
		{
			alert(errorPrefix+"Group Name '" + groupName + "' has already been registered.");
			return false;
		}
		else
		{
			groups.push(groupName);
			return true;
		}
	}
	
	// Animation Methods
	
	var showSubMenu = function()
	{
		var subMenu = document.getElementById(this.subMenuId);
		var subMenuItems = document.getElementById(this.subMenuId + "_items");
		
		if(subMenu.firstRun)
		{
			subMenu.style.display = "block";
			subMenu.targetHeight = subMenu.clientHeight;
			subMenu.firstRun = false;
		}
		
		if(subMenu.closeTimer != false)
		{
			window.clearTimeout(subMenu.closeTimer);
			subMenu.closeTimer = false;
		}
		
		if(subMenu.status == "closing" || subMenu.status == "closed")
		{
			if(subMenu.anim)
			{
				window.clearInterval(subMenu.anim);
				subMenu.anim = false;
			}
			activeMenu = this.subMenuId;
			subMenu.status = "open";
			subMenu.style.display = "block";
			subMenuItems.style.marginTop = "-" + subMenu.targetHeight + "px";
			subMenu.style.zIndex = "2000";
			var speed = subMenu.targetHeight - subMenu.clientHeight;
			var increment = 0;
			subMenu.anim = window.setInterval(function()
			{
				increment = Math.round(speed / animSpeed);
				if(increment < 1){ increment = 1;}
				subMenu.animHeight += increment;
				speed -= increment;
				if(speed < 1){ speed = 1;}
				
				if(subMenu.animHeight <= subMenu.targetHeight)
				{
					subMenu.style.height = subMenu.animHeight + "px";
					var itemsHeight = subMenu.targetHeight - subMenu.animHeight;
					subMenuItems.style.marginTop = "-" + itemsHeight + "px";
				}
				else
				{
					subMenu.style.height = subMenu.targetHeight + "px";
					subMenuItems.style.marginTop = "0px";
					window.clearInterval(subMenu.anim);
					subMenu.anim = false;
				}
			},30);
		}
	}
	
	var hideSubMenu = function()
	{
		var subMenu = document.getElementById(this.subMenuId);
		subMenu.closeTimer = window.setTimeout(function()
		{
			closeSubMenu(subMenu.id);
			window.clearTimeout(subMenu.closeTimer);
			subMenu.closeTimer = false;
		},100);
	}
	
	var closeSubMenu = function(id)
	{
		var subMenu = document.getElementById(id);
		subMenu.status = "closing";
		subMenu.style.zIndex = "1000";
		var subMenuItems = document.getElementById(id + "_items");
		if(subMenu.anim)
		{
			window.clearInterval(subMenu.anim);
			subMenu.anim = false;
		}
		var speed = subMenu.clientHeight;
		var increment = 0;
		subMenu.anim = window.setInterval(function()
		{
			increment = Math.round(speed / animSpeed);
			if(increment < 1){ increment = 1;}
			speed -= increment;
			if(speed < 1){ speed = 1;}
			
			subMenu.animHeight -= increment;
			
			if(subMenu.animHeight > 0)
			{
				subMenu.style.height = subMenu.animHeight + "px";
				var itemsHeight = subMenu.targetHeight - subMenu.animHeight;
				subMenuItems.style.marginTop = "-" + itemsHeight + "px";
			}
			else
			{
				subMenu.style.height = "0px";
				subMenu.animHeight = 0;
				subMenu.style.display = "none";
				subMenu.style.height = "";
				window.clearInterval(subMenu.anim);
				subMenu.anim = false;
				subMenu.status = "closed";
			}
		},30);
	}
	
}
