// DropDown Menu
//Sreeju K G
//Al Nadeem Info. Bahrain

//Global variables 

//keep track of the opened Menu
var OpenedMenu = 0;
var MenuToOpen = 0;
var GT;

//object defenitions
function Menu(Name)
{
		this.Name = Name;
		this.MenuItems = [];
		this.Config = {
			delay: 50,
			theme: "grey",
			leftSpacer : {enabled : true, className: "leftSpacer"},
			rightSpacer : {enabled : true, className: "rightSpacer"}
		};
};

function MenuItem(id, displayName, url, target, parent, defaultSelected, hasSubMenu)
{
	this.id = id;
	this.displayName = displayName;
	this.url = url;
	this.target = target;
	this.parent = parent;
	this.defaultSelected = defaultSelected;
	this.hasSubMenu = hasSubMenu;
};

Menu.prototype.AddMenuItem = function(id, displayName, url, target, parent, defaultSelected, hasSubMenu)
{
	this.MenuItems[this.MenuItems.length] = new MenuItem(id, displayName, url, target, parent, defaultSelected, hasSubMenu);
}


//Menu render functions
Menu.prototype.toString = function(){
	this.setActiveStyleSheet(this.Config.theme);
	var str = "";
	str += "<div class=\"MenuBar\">";
	if(this.Config.leftSpacer.enabled == true)
	{
		str += "<div  class=\"" + this.Config.leftSpacer.className + "\"></div>"
	}
	str += this.CreateMenuItems();
	if(this.Config.rightSpacer.enabled == true)
	{
		str += "<div id=\"" + this.Name + "QLinksContainer\"  class=\"" + this.Config.rightSpacer.className + "\">";
		//bring the hidden panel here and set its visibility true
		if(typeof(menu_hddlPanelId) != 'undefined' && menu_hddlPanelId != "")
		{
			// there is a panel
			//alert(menu_hddlPanelId);
			str += document.getElementById(menu_hddlPanelId).innerHTML;			
		}
		str += "</div>";
	}
	str += "</div>";
	return str;
}

Menu.prototype.CreateMenuItems = function(parent)
{
	if(parent == "" || typeof(parent) == 'undefined')
	{
		parent = -1;
	}
	var str = "";
	for(var i=0; i< this.MenuItems.length; i++)
	{
		if(this.MenuItems[i].parent == parent)
		{
			//add this item to the current menu
			str += "<div id=\"" + this.Name + "Item" + this.MenuItems[i].id + "\" class=\"MenuItem" + this.findLevel(this.MenuItems[i].id) + "\">";
			str += "<a href=\"";
			if(this.MenuItems[i].url != "")
			{
				str += 	this.MenuItems[i].url;
			}
			else
			{
				str += "javascript:;";
			}
			str += "\"";
			str += "onmouseover=\"" + this.Name + ".OpenMenu(" + this.MenuItems[i].id + ")\" ";
			str += "onmouseout=\"" + this.Name + ".ExitMenu(" + this.MenuItems[i].id + ")\" ";
			str += "class=\"MenuItemA" + this.findLevel(this.MenuItems[i].id) + "\">";
			str += this.MenuItems[i].displayName;
			str += "</a>";
			str += "</div>";
			if(this.hasSubMenu(this.MenuItems[i].id))
			{
				str += "<div class=\"Container" + parseInt(this.findLevel(this.MenuItems[i].id)+1) + "\" id=\"" + this.Name + "Container" + this.MenuItems[i].id + "\" style=\"position: absolute;visibility: hidden;\">";
				str += this.CreateMenuItems(this.MenuItems[i].id);
				str += "</div>";
			}
			
		}
		
	}
	return str;
}

Menu.prototype.OpenMenu = function(menuid)
{
	if(OpenedMenu == 0)
	{
		// no menu opened already, so open a new menu level
		MenuToOpen = menuid;
		this.doIt();
	}
	else
	{
		//some menu opened already, so a mouse out happend there, just set the MenuToOpen
		MenuToOpen = menuid;
	}
}
Menu.prototype.ExitMenu = function(menuid)
{
	if(OpenedMenu != 0)
	{
		this.doIt();
	}
}

Menu.prototype.doIt = function()
{
	GT = setTimeout(this.Name + ".doAction()" , this.Config.delay);	
}
Menu.prototype.doAction = function()
{
	if(OpenedMenu == 0)
	{
		this.OpenIt(MenuToOpen);
		OpenedMenu = MenuToOpen;
		MenuToOpen = 0;
		customAlert("step 1");
		return;
	}
	if(MenuToOpen == 0)
	{
		this.CloseAll(OpenedMenu);
		OpenedMenu = 0;
		customAlert("step 2");
		return;
	}
	if(this.findParent(MenuToOpen) == OpenedMenu)
	{
		this.OpenIt(MenuToOpen);
		OpenedMenu = MenuToOpen;
		MenuToOpen = 0;
		customAlert("step 3");
		return;
		
	}
	if(this.findParent(OpenedMenu) == MenuToOpen)
	{
		this.CloseIt(OpenedMenu);
		OpenedMenu = MenuToOpen;
		MenuToOpen = 0;
		customAlert("step 4");
		return;
	}
	if(this.isSiblings(OpenedMenu,MenuToOpen) == true)
	{
		this.CloseIt(OpenedMenu);
		this.OpenIt(MenuToOpen);
		OpenedMenu = MenuToOpen;
		MenuToOpen = 0;
		
		return;
	}
	customAlert("\n Opened Menu - " + OpenedMenu + "; Menu To Open -" + MenuToOpen);
	
	this.CloseAll(OpenedMenu);
	this.OpenIt(MenuToOpen);
	OpenedMenu = MenuToOpen;
	MenuToOpen = 0 ;
	return;
}

Menu.prototype.OpenIt = function(menuid)
{
	var curItem = this.Name + "Item" + menuid;
	var objcurItem = document.getElementById(curItem);
	objcurItem.className = AppendToStrEnd(objcurItem.className, "On");
	if(this.hasSubMenu(menuid))
	{
		var curContainer = this.Name + "Container" + menuid;
		var objcurContainer = document.getElementById(curContainer);
		// set up left and top of the container
		var x = parseInt(findPosX(objcurItem));
		var y = parseInt(findPosY(objcurItem)) + 20;
		objcurContainer.style.left = x + "px";
		objcurContainer.style.top  = y + "px";
		objcurContainer.style.visibility = "visible";
	}	
}

Menu.prototype.CloseIt = function(menuid)
{
	var curItem = this.Name + "Item" + menuid;
	var objcurItem = document.getElementById(curItem);
	if(objcurItem != null)
	{
		objcurItem.className = RemoveFromStrEnd(objcurItem.className, "On");
	}
	if(this.hasSubMenu(menuid))
	{
		var curContainer = this.Name + "Container" + menuid;
		var objcurContainer = document.getElementById(curContainer);
		if(objcurContainer != null)
		{
			objcurContainer.style.visibility = "hidden";
		}
	}
}

Menu.prototype.CloseAll = function(menuid)
{
	do
	{
		this.CloseIt(menuid);	
		menuid= this.findParent(menuid);
	}while(menuid > 0);
}
Menu.prototype.CloseMenu = function(menuid)
{
	customAlert("\ninside Close Menu menu id - " + menuid + " - ");
	customAlert("Opened Item - " + OpenedItem + " - ");
	var curItem = this.Name + "Item" + menuid;
	var objcurItem = document.getElementById(curItem);
	objcurItem.className = RemoveFromStrEnd(objcurItem.className, "On");
	if(canClose == true)
	{
		customAlert("......");
		if(this.hasSubMenu(menuid))
		{
			var curContainer = this.Name + "Container" + menuid;
			var objcurContainer = document.getElementById(curContainer);
			objcurContainer.style.visibility = "hidden";
		}
	}
}

//Menu utility functions

Menu.prototype.isSiblings = function(m1, m2)
{
	var p1 = 0, p2=-999;	
	for(var i=0;i < this.MenuItems.length; i++)
	{
		if(this.MenuItems[i].id == m1)
		{
			p1 = this.MenuItems[i].parent;
		}
		if(this.MenuItems[i].id == m2)
		{
			p2 = this.MenuItems[i].parent;
		}
		if(p1 != 0 && p2 != -999)
		{
			break;
		}
	}
	return p1==p2;
}
Menu.prototype.findLevel = function(menuid, level)
{
	if(level == "" || typeof(level) == 'undefined')
	{
		level = 0;
	}
	if(menuid <= 0)
	{
		return level;
	}
	for(var i=0; i < this.MenuItems.length; i++)
	{
		if(this.MenuItems[i].id == menuid)
		{
			if(this.MenuItems[i].parent == -1)
			{
				return level;
			}
			else
			{
				return this.findLevel(this.MenuItems[i].parent,level+1);
			}
		}
	}
	return level;
}

Menu.prototype.findParent = function(menuid)
{
	for(var i=0; i < this.MenuItems.length; i++)
	{
		if(this.MenuItems[i].id == menuid)
		{
			return this.MenuItems[i].parent;
		}
	}
	return -1;
}

Menu.prototype.hasSubMenu = function(menuid)
{
		// check wheather the current menuid have submenu if so return true, else return false;
		var rvalue = false;
		for(var i=0 ; i< this.MenuItems.length; i++)
		{
			if(this.MenuItems[i].parent == menuid)
			{
				rvalue = true;
			}
		}
		return rvalue;
}

//General Functions
function customAlert(str)
{
  if(document.getElementById("tempalert") != null)
  {
	document.getElementById("tempalert").value = str;  
  }
}


function RemoveFromStrEnd(str, remstr)
{
  //alert(str);
  if(str.substr(str.length-2).toLowerCase() == remstr.toLowerCase())
  {
	str = str.substring(0, str.length-2); 
  }
 // alert(str);
  return str;
}
  
function AppendToStrEnd(str, remstr)
{
  if(str.substr(str.length-2).toLowerCase() != remstr.toLowerCase())
  {
	str += remstr;
  }
  return str;
}

//Reference: http://blog.firetree.net/2005/07/04/javascript-find-position/
function findPosX(obj)
{
	var curleft = 0;
	if(obj.offsetParent)
		while(1) 
		{
	  		curleft += obj.offsetLeft;
	  		if(!obj.offsetParent)
				break;
	  		obj = obj.offsetParent;
		}
	else if(obj.x)
		curleft += obj.x;
	return curleft;
}

function findPosY(obj)
{
	var curtop = 0;
	if(obj.offsetParent)
		while(1)
		{
	 	 	curtop += obj.offsetTop;
	  		if(!obj.offsetParent)
				break;
	  		obj = obj.offsetParent;
		}
	else if(obj.y)
		curtop += obj.y;
	return curtop;
}

/* style sheet selecting*/
Menu.prototype.setActiveStyleSheet = function(title) 
{
	title = this.Name + title;
	var i, a, main;
	for(i=0; (a = document.getElementsByTagName("link")[i]); i++) 
	{
		if(a.getAttribute("rel").indexOf("style") != -1 && a.getAttribute("title")) 
		{
			if(a.getAttribute("title").indexOf(this.Name) ==0)
			{
				a.disabled = true;
				if(a.getAttribute("title") == title) a.disabled = false;
			}
		}
	}
}
