﻿FOBMenu = {};

FOBMenu.openMenus = [];
FOBMenu.startZIndex = 60000;
FOBMenu.currentOpenMenu = "";
FOBMenu.fadeDuration = .4;

FOBMenu.init = function()
{
	if($null($("menu_main"))) return;
	
	var ulIndex = FOBMenu.searchForTag($("menu_main").childNodes, "ul");
	if(ulIndex == -1) return;
	var mainMenuItem = $("menu_main").childNodes[ulIndex];
	FOBMenu.buildSubMenu(mainMenuItem, 0, "root");
};

FOBMenu.buildSubMenu = function(mnuObj, lvl, treeName)
{
	var mainMenuItems = mnuObj.childNodes;
	for(var i=0; i<mainMenuItems.length; i++)
	{
		//mainMenuItems[i].innerHTML = mainMenuItems[i].innerHTML.replace(" ", "&nbsp;");
		FOBMenu.removeSpaces(mainMenuItems[i].childNodes);
		
		if(mainMenuItems[i].style && lvl>0)
			mainMenuItems[i].style.position = "static";
		
		if(lvl==0)
		{
			mainMenuItems[i].rootMenu = i;
			if(mainMenuItems[i].style)
				mainMenuItems[i].style.width= mainMenuItems[i].childNodes[0].offsetWidth + "px";
		}
		else
			mainMenuItems[i].rootMenu = mnuObj.parentNode.rootMenu;

		mainMenuItems[i].id = "MNU_" + mainMenuItems[i].rootMenu + "_" + lvl + "_" + i;
		mainMenuItems[i].lvl = lvl;
		mainMenuItems[i].treeName = treeName + " > " + mainMenuItems[i].id;
		
		var mnuItem = mainMenuItems[i];
		var ulIndex = FOBMenu.searchForTag(mnuItem.childNodes, "ul");
		
		var mouseOut = function(o){FOBMenu.itemOnMouseOut(o);};
		var mouseIn = function(o){FOBMenu.itemOnMouseOver(o);};
		Mouse.addHitTest(mnuItem, mouseIn, mouseOut);
		
		mnuItem.hasSubMenu = (ulIndex != -1);
		if(ulIndex == -1)
			continue;

		var innerMenuContainer = mnuItem.childNodes[ulIndex];
		var innerMenus = innerMenuContainer.childNodes;

		if(lvl!=0)
		{
			var aIndex = FOBMenu.searchForTag(mainMenuItems[i].childNodes, "a");
			mainMenuItems[i].childNodes[aIndex].style.backgroundImage = "url('/_images/subMnu_arrow.gif')";
			mainMenuItems[i].childNodes[aIndex].style.backgroundPosition = "right center";
			mainMenuItems[i].childNodes[aIndex].style.backgroundRepeat = "no-repeat";
		}

		mnuItem.subMenu = innerMenuContainer;
		
		innerMenuContainer.style.display = "block";
		innerMenuContainer.style.position = "absolute";
		innerMenuContainer.oldWidth = innerMenuContainer.parentNode.parentNode.style.width;
		if(!Ekina.Browser.ie || Ekina.Browser.ie > 6)
			innerMenuContainer.parentNode.parentNode.style.width = "10000px";
		innerMenuContainer.style.width = (innerMenuContainer.offsetWidth+10) + "px";
		if(innerMenuContainer.offsetWidth < 100) innerMenuContainer.style.width = "110px";
		if(!Ekina.Browser.ie || Ekina.Browser.ie > 6)
			innerMenuContainer.parentNode.parentNode.style.width = innerMenuContainer.oldWidth;
		innerMenuContainer.style.zIndex = 60000 + lvl;
		

		if(lvl!=0)
		{
			Mouse.getElementPos(mainMenuItems[i]);
			innerMenuContainer.style.left = (mainMenuItems[i].offsetWidth+3) + "px";
			innerMenuContainer.style.top = (innerMenuContainer.offsetTop-33-(Ekina.Browser.ie==8 ? 1 : 0)) + "px";
		}
		
		innerMenuContainer.x = innerMenuContainer.offsetLeft | 0;
		innerMenuContainer.y = parseInt(innerMenuContainer.style.top) | 0;
		innerMenuContainer.originalHeight = innerMenuContainer.offsetHeight-10;
		
		FOBMenu.buildSubMenu(innerMenuContainer, lvl+1, treeName + " > " + mainMenuItems[i].id);

		innerMenuContainer.style.display = "none";
	}
};

FOBMenu.removeSpaces = function(items)
{
	for(var i=0; i<items.length; i++)
		if(items[i].tagName && items[i].tagName.toLowerCase()=="a")
		{
			while(items[i].innerHTML.contains(" "))
				items[i].innerHTML = items[i].innerHTML.replace(" ", "&nbsp;");
		}
};

FOBMenu.searchForTag = function(obj, tag)
{
	tag = tag.toLowerCase();
	for(var i=0; i<obj.length; i++)
		if(obj[i].tagName && obj[i].tagName.toLowerCase()==tag)
			return i;
	
	return -1;
};

FOBMenu.itemOnMouseOver = function(subMenu)
{
	FOBMenu.lastOpenMenu = subMenu;
	if(subMenu.hasSubMenu)
		subMenu = subMenu.subMenu;
	else
		return;

	if(subMenu.style.display == "block") return;

	subMenu.style.height = "1px";
	subMenu.style.display = "block";
	
	var ulIndex = FOBMenu.searchForTag($("menu_main").childNodes, "ul");
	var mainMenuItem = $("menu_main").childNodes[ulIndex];
	if(!Ekina.Browser.ie || Ekina.Browser.ie > 6)
		Ekina.DOM.setupElement(mainMenuItem.childNodes[subMenu.parentNode.rootMenu]).addClass("selected");

	var mnuItems = subMenu.childNodes;
	if(Ekina.Browser.ie && Ekina.Browser.ie < 8)
	{
		if(subMenu.fadeTween)
			subMenu.fadeTween.stop();

		var currentAlpha = Ekina.UI.Effects.GetAlpha(subMenu);
		if(currentAlpha == -1) currentAlpha = 0;
		Ekina.UI.Effects.SetAlpha(subMenu, currentAlpha);
		subMenu.fadeTween = Ekina.UI.Effects.Tween.alpha(subMenu, 100, {duration:FOBMenu.fadeDuration, func:Ekina.UI.Effects.Tween.None});
		subMenu.fadeTween.baseObj = subMenu;
		subMenu.fadeTween.onTweenFinished = function(t)
		{
			var el = t.baseObj;
			if (el.style.filter && el.style.removeAttribute)
				el.style.removeAttribute('filter');
		};
		subMenu.fadeTween.start();
		subMenu.bounceTween = new Ekina.UI.Effects.Tween(
			subMenu.style, "height", 1, subMenu.originalHeight, FOBMenu.fadeDuration, Ekina.UI.Effects.Tween.Bounce.Out, "px"
		);
		subMenu.bounceTween.start();

	}
	else
	{
		for(var i=0;i<mnuItems.length; i++)
		{
			if(subMenu.childNodes[i].style)
			{
				var currentAlpha = Ekina.UI.Effects.GetAlpha(subMenu.childNodes[i]);
				if(currentAlpha == -1) currentAlpha = 0;
				if(subMenu.childNodes[i].tween)
					subMenu.childNodes[i].tween.stop();
				Ekina.UI.Effects.SetAlpha(subMenu.childNodes[i], currentAlpha);
				subMenu.childNodes[i].tween = Ekina.UI.Effects.Tween.alpha(subMenu.childNodes[i], 100, {duration:FOBMenu.fadeDuration, func:Ekina.UI.Effects.Tween.Regular.Out});
				subMenu.childNodes[i].tween.baseObj = subMenu.childNodes[i];
				subMenu.childNodes[i].tween.onTweenFinished = function(t)
				{
					var el = t.baseObj;
					if (el.style.filter && el.style.removeAttribute)
						el.style.removeAttribute('filter');
				};
				subMenu.childNodes[i].tween.start();
			}
		}
		subMenu.bounceTween = new Ekina.UI.Effects.Tween(
			subMenu.style, "height", 1, subMenu.originalHeight, FOBMenu.fadeDuration, Ekina.UI.Effects.Tween.Bounce.Out, "px"
		);

		subMenu.bounceTween.start();
	}

	FOBMenu.openMenus.push(FOBMenu.lastOpenMenu);
};

FOBMenu.itemOnMouseOut = function(subMenuId, ignoreTest)
{
	var subMenu = $(subMenuId);

	if(FOBMenu.openMenus.length <= 0)
	{
		var ulIndex = FOBMenu.searchForTag($("menu_main").childNodes, "ul");
		var mainMenuItem = $("menu_main").childNodes[ulIndex];
		if(!Ekina.Browser.ie || Ekina.Browser.ie > 6)
			Ekina.DOM.setupElement(mainMenuItem.childNodes[subMenu.rootMenu]).removeClass("selected");
	}
	else
	{
		if(FOBMenu.openMenus[0].rootMenu!=FOBMenu.lastOpenMenu.rootMenu)
		{
			var ulIndex = FOBMenu.searchForTag($("menu_main").childNodes, "ul");
			var mainMenuItem = $("menu_main").childNodes[ulIndex];
			if(!Ekina.Browser.ie || Ekina.Browser.ie > 6)
				Ekina.DOM.setupElement(mainMenuItem.childNodes[FOBMenu.openMenus[0].rootMenu]).removeClass("selected");
		}
	}
	for(var i=0; i<FOBMenu.openMenus.length;i++)
		if(!FOBMenu.lastOpenMenu.treeName.contains(FOBMenu.openMenus[i].treeName))
		{
			FOBMenu.fadeOutMenu(FOBMenu.openMenus[i]);
			FOBMenu.openMenus[i].subMenu.bounceTween.stop();
			FOBMenu.openMenus[i].subMenu.bounceTween = new Ekina.UI.Effects.Tween(
				FOBMenu.openMenus[i].subMenu.style, "height", parseInt(FOBMenu.openMenus[i].subMenu.style.height), 1, FOBMenu.fadeDuration, Ekina.UI.Effects.Tween.none, "px"
			);
			FOBMenu.openMenus[i].subMenu.bounceTween.start();
			FOBMenu.openMenus.removeAt(i--);
		}

	for(var i=0; i<Mouse.hitTests.length; i++)
		if(Mouse.hitTests[i].obj.MOUSE_OVER)
			return;//if the mouse is over any menuitems get out now

	var ulIndex = FOBMenu.searchForTag($("menu_main").childNodes, "ul");
	var mainMenuItem = $("menu_main").childNodes[ulIndex];
	Ekina.DOM.setupElement(mainMenuItem.childNodes[subMenu.rootMenu]).removeClass("selected");
	
	for(var i=0; i<FOBMenu.openMenus.length; i++)//otherwise close all menuitems
	{
		FOBMenu.fadeOutMenu(FOBMenu.openMenus[i]);
		FOBMenu.openMenus[i].subMenu.bounceTween.stop();
		FOBMenu.openMenus[i].subMenu.bounceTween = new Ekina.UI.Effects.Tween(
			FOBMenu.openMenus[i].subMenu.style, "height", parseInt(FOBMenu.openMenus[i].subMenu.style.height), 1, FOBMenu.fadeDuration, Ekina.UI.Effects.Tween.none, "px"
		);
		FOBMenu.openMenus[i].subMenu.bounceTween.start();
	}
	FOBMenu.openMenus.clear();
};

FOBMenu.fadeOutMenu = function(mnu)
{

	if(Ekina.Browser.ie && Ekina.Browser.ie < 8)
	{
		var currentAlpha = Ekina.UI.Effects.GetAlpha(mnu.subMenu);
		//if(currentAlpha != -1 && currentAlpha != 100)
		//	if(mnu.MOUSE_OVER) return;
		if(currentAlpha == -1) Ekina.UI.Effects.SetAlpha(mnu.subMenu, 100);

		if(mnu.subMenu.fadeTween)
		{
			mnu.subMenu.fadeTween.stop();
			mnu.subMenu.fadeTween = null;
		}
		mnu.subMenu.fadeTween = Ekina.UI.Effects.Tween.alpha(mnu.subMenu, 0, {duration:FOBMenu.fadeDuration, func:Ekina.UI.Effects.Tween.Regular.In});
		mnu.subMenu.fadeTween.baseObj = mnu.subMenu;
		mnu.subMenu.fadeTween.onTweenFinished = function(t)
		{
			var el = t.baseObj
			if (el.style.filter && el.style.removeAttribute)
				el.style.removeAttribute('filter');
			el.style.display = "none";
		};
		mnu.subMenu.fadeTween.start();
	}
	else
		for(var i=0;i<mnu.subMenu.childNodes.length; i++)
			FOBMenu.fadeOutMenuItem(mnu.subMenu.childNodes[i]);
}

FOBMenu.fadeOutMenuItem = function(mnuItem)
{
	if(!mnuItem.style) return;

	var currentAlpha = Ekina.UI.Effects.GetAlpha(mnuItem);
	if(currentAlpha != -1 && currentAlpha != 100)
		if(mnuItem.MOUSE_OVER)
			return;
	if(currentAlpha == -1)
		Ekina.UI.Effects.SetAlpha(mnuItem, 100);

	if(mnuItem.tween)
		mnuItem.tween.stop();
	mnuItem.tween = Ekina.UI.Effects.Tween.alpha(mnuItem, 0, {duration:FOBMenu.fadeDuration, func:Ekina.UI.Effects.Tween.Regular.In});
	mnuItem.tween.baseObj = mnuItem;
	mnuItem.tween.onTweenFinished = function(t)
	{
		var el = t.baseObj
		if (el.style.filter && el.style.removeAttribute)
			el.style.removeAttribute('filter');
		if(el.parentNode.style.display=="block")
		{
			el.parentNode.style.display = "none";
		}
	};
	mnuItem.tween.start();
};


var Mouse = {};

Mouse.x = 1;
Mouse.y = 1;
Mouse.hitTests = [];

Mouse.elementMargin = 5;

Mouse.getCoords = function(e)
{
	var posx = 0;var posy = 0;
	if (!e) var e = window.event;

	if (e.pageX || e.pageY) 	
	{
		posx = e.pageX;
		posy = e.pageY;
	}
	else if (e.offsetX || e.offsetY)
	{
		posx = event.clientX + document.documentElement.scrollLeft;
		posy = event.clientY + document.documentElement.scrollTop;
	}
	Mouse.x = posx;
	Mouse.y = posy;
		
	//Mouse.checkHitTests();
};

Mouse.checkHitTests = function()
{
	for(var i=0; i<Mouse.hitTests.length; i++)
	{
		var obj = Mouse.hitTests[i].obj;
		Mouse.getElementPos(obj);

		var oL = obj.absoluteX-Mouse.elementMargin;
		var oR = obj.absoluteX + obj.offsetWidth+Mouse.elementMargin;
		var oT = obj.absoluteY-Mouse.elementMargin;
		var oB = obj.absoluteY + obj.offsetHeight+Mouse.elementMargin;
		var mx = Mouse.x;
		var my = Mouse.y;

		if(mx>oL && mx<oR && my>oT && my<oB)
		{
			obj.MOUSE_OVER = true;
			if(Mouse.hitTests[i].onOver)
				Mouse.hitTests[i].onOver(obj);
		}
		else
		{
			if(obj.MOUSE_OVER)
			{
				obj.MOUSE_OVER = false;
				if(Mouse.hitTests[i].onOut)
					window.setTimeout("Mouse.hitTests["+i+"].onOut('"+obj.id+"');", 10);
			}
		}
	}
};

Mouse.addHitTest = function(obj, onOver, onOut)
{
	Mouse.hitTests.push(new HitTestItem(obj, onOver, onOut));
};

//NOTE: elements with display none will come out as 0,0
Mouse.getElementPos = function(obj)
{
	var originalObj = obj;
	var curleft = 0;
	var curtop = 0;
	
	if(obj.offsetParent)
	while(true) 
	{
		curleft += obj.offsetLeft;
		curtop += obj.offsetTop;
		if(!obj.offsetParent) break;
		obj = obj.offsetParent;
	}
	else if(obj.x)
	{
		curleft += obj.x;
		curtop += obj.y;
	}
	originalObj.absoluteX = curleft;
	originalObj.absoluteY = curtop;
}


var HitTestItem = function(obj, onOver, onOut)
{
	this.obj = obj;
	this.onOver = onOver;
	this.onOut = onOut;
}

Ekina.Events.register(window, "ondomready", FOBMenu.init);
Ekina.Events.register(document, "onmousemove", Mouse.getCoords);
window.setInterval(Mouse.checkHitTests, 100);

