fuzzMenu = new Object();

fuzzMenu.currentMenuTrail = new Object;
fuzzMenu.currentHoverMenuId = new Object;
fuzzMenu.pendingSubmenuTimeout = new Object;

fuzzMenu.getMenuByMenuTrail = function getMenuByMenuTrail(menuElementName, menuTrail){
	// get the submenu and menu we want to display
	menu = document.getElementById("fuzzMenu_"+menuTrail+"_menu_container_div_id");
	
	// make sure we were supposed to get the submenu
	if(! menu) menu = document.getElementById("fuzzMenu_"+menuTrail+"_submenu_div_id");
	
	return menu;
	
	submenu = document.getElementById("fuzzMenu_"+menuTrail+"_submenu_container_div_id");
}

fuzzMenu.getSubmenuByMenuTrail = function getSubmenuByMenuTrail(menuElementName, menuTrail){
	// get the submenu and menu we want to display
	submenu = document.getElementById("fuzzMenu_"+menuTrail+"_submenu_container_div_id");
	return submenu;
}

fuzzMenu.handleMenuHover = function handleMenuHover(menuElementName, menuTrail,useAlignBottom){
	fuzzMenu.displaySubmenu(menuElementName,menuTrail,useAlignBottom);
}

fuzzMenu.handleMenuLoseFocus = function handleMenuLoseFocus(menuElementName, menuTrail){
	// set the delayed close variable
	//fuzzMenu.delayedCloseMenuTrail[menuElementName] = menuTrail;
	fuzzMenu.pendingSubmenuTimeout[menuElementName] = setTimeout("fuzzMenu.delayedCloseSubmenus('"+menuElementName+"');",400);
}

// url is if you are not using fuzzMVC
// submitData is name value pair
fuzzMenu.handleMenuClick = function handleMenuClick(menuElementName, menuTrail, control, action, url, submitData){
	// see if this is just a menu that handles submenus
	// if so close submenu container

	if(control == "" && url == ""){
		submenu = fuzzMenu.getSubmenuByMenuTrail(menuElementName, menuTrail);
		if(submenu){
			if(isHiddenElement(submenu)) showElement(submenu);
			else hideElement(submenu);
		}
		
	}
	else if(url != ""){
		window.location = url;
	}
	else if(control != ""){
		fuzzController.displayContainer(control, action, submitData);
	}
	
}


// deal with closing the menu when the mouse leaves it
fuzzMenu.delayedCloseSubmenus = function delayedCloseSubmenus(menuElementName){
	fuzzMenu.closeSubmenus(menuElementName, "");
	// clear the current hover
	fuzzMenu.clearCurrentHover(menuElementName);
	fuzzMenu.currentMenuTrail[menuElementName] = "";
}

fuzzMenu.closeSubmenus = function closeSubmenus(menuElementName, menuTrail){
	// make sure that there is a current open menu
	if(! fuzzMenu.currentMenuTrail[menuElementName] || fuzzMenu.currentMenuTrail[menuElementName] == "") return;
	
	currMenuTrail = fuzzMenu.currentMenuTrail[menuElementName];
	
	if(currMenuTrail == menuTrail) return;
	
	// split both the current menu trail and new trail
	// start from the begining of each
	// if they are the same, don't do anything, else close the current
	tArr = menuTrail.split("_");
	cTArr = currMenuTrail.split("_");
	
	tElementName = "";
	for(i = 0; i < cTArr.length; i++){
		tElementName += cTArr[i]+"_"; 

		if(! tArr[i] || (cTArr[i] != tArr[i])){
			submenu = document.getElementById("fuzzMenu_"+tElementName+"submenu_container_div_id");
			hideElement(submenu);
		}
	}
}

fuzzMenu.clearCurrentHover = function clearCurrentHover(menuElementName){
	
	// un hover last hover element
	if(fuzzMenu.currentHoverMenuId[menuElementName]){
		tMenu = document.getElementById(fuzzMenu.currentHoverMenuId[menuElementName]);
		if(tMenu){
			// clear hover
			tCssClass = tMenu.className;
			if(tCssClass.length > 6){
				if(tCssClass.substring((cssClass.length - 6), tCssClass.length) == "-hover"){
					tCssClass = tCssClass.substring(0,(cssClass.length - 6));
					tMenu.className = tCssClass;
					fuzzMenu.currentHoverMenuId[menuElementName] = "";
				}
			}
		}
		
	}
	
}

fuzzMenu.setHover = function setHover(menuElementName, menu){
	
	// first un hover last hover element
	fuzzMenu.clearCurrentHover(menuElementName);
	
	// now put hover on the current menu
	cssClass = menu.className;
	
	// see if the hover class is applied
	// if not apply it
	// search for -hover, len 6
	
	if(cssClass.length > 6){
		if(cssClass.substring((cssClass.length - 6), cssClass.length) != "-hover"){
			cssClass += "-hover";
		}
	}
	else cssClass += "-hover";
	
	// set the new css class
	menu.className = cssClass;
	fuzzMenu.currentHoverMenuId[menuElementName] = menu.id;
	
}

fuzzMenu.displaySubmenu = function displaySubmenu(menuElementName, menuTrail, useAlignBottom){

	// cancel any kind of delayed timeout
	if(fuzzMenu.pendingSubmenuTimeout[menuElementName]) clearTimeout(fuzzMenu.pendingSubmenuTimeout[menuElementName]);
	fuzzMenu.pendingSubmenuTimeout[menuElementName] = false;
	
	// see if this is the same as current, if so return
	if(fuzzMenu.currentMenuTrail[menuElementName] == menuTrail) return;
	
	// handle closing open menus
	fuzzMenu.closeSubmenus(menuElementName,menuTrail); 
	
	
	if(useAlignBottom) useAlignBottom = true;
	else useAlignBottom = false;
	
	// get the menu
	menu = fuzzMenu.getMenuByMenuTrail(menuElementName, menuTrail);
	
	fuzzMenu.setHover(menuElementName, menu);
	
	submenu = fuzzMenu.getSubmenuByMenuTrail(menuElementName, menuTrail);
		
	// figure out the position of the menu being selected
	xyPos = YAHOO.util.Dom.getXY(menu);
	
	// get location
	if(useAlignBottom) xyPos[1] += menu.offsetHeight;
	else xyPos[0] += menu.offsetWidth;
	
	
	// set the current menu and display it
	fuzzMenu.currentMenuTrail[menuElementName] = menuTrail;
	showElement(submenu);
	
	// set location
	YAHOO.util.Dom.setXY(submenu, xyPos);
}

