var goldenrod
if (!goldenrod) goldenrod = {}


goldenrod.listMenu = {};

goldenrod.listMenu.NAME = "goldenrod.listMenu";

goldenrod.listMenu.ATTR = "menu";
goldenrod.listMenu.ACTIVE = "active";
goldenrod.listMenu.ACTIVE_YES = "yes";
goldenrod.listMenu.ACTIVE_NO = "no";
goldenrod.listMenu.MENU_ITEM = "menuItem";
goldenrod.listMenu.MENU_LIST = "menuList";
goldenrod.listMenu.CHILD = "Child";
goldenrod.listMenu.PARENT = "Parent";
goldenrod.listMenu.DEFAULT_HOVER = "menuHover";
goldenrod.listMenu.DEFAULT_MOUSE_OUT = "menuOut";
goldenrod.listMenu.HOVER = "hoverClass";
goldenrod.listMenu.MOUSE_OUT = "outClass";
goldenrod.listMenu.HOVER_FUNC = "hoverFunc";
goldenrod.listMenu.OUT_FUNC = "outFunc";
goldenrod.listMenu.DEFAULT_HOVER_FUNC = "hover";
goldenrod.listMenu.DEFAULT_OUT_FUNC = "out";

goldenrod.listMenu.hover = function() {};
goldenrod.listMenu.out = function() {};

goldenrod.listMenu.functions = {
	hover : goldenrod.listMenu.hover,
	out   : goldenrod.listMenu.out
	
};

//goldenrod.listMenu.ITEM_TAG = "LI"  I realize we can use any element not only list elements
//goldenrod.listMenu.LIST_TAG = "UL"
goldenrod.listMenu.MenuItemType = {
	Menu : 'menu',
	Link : 'link'
}
goldenrod.listMenu.MenuListType = {
	Root : 'root',
	Node : 'node'
}

goldenrod.listMenu.setHandlers = function() {
	
	function inner(elt) {
		var children = elt.childNodes;
		
		for(var i=0; i<children.length; i++) {
			var child = children[i];
			if( (child.nodeType == 1) && child.getAttribute(goldenrod.listMenu.ATTR) ) {
				//Do not put mouse handlers on root menu
				if(goldenrod.listMenu.isMENU_ITEM(child) ) {
					child.onmouseover = goldenrod.listMenu.mouseOver;
					child.onmouseout = goldenrod.listMenu.mouseOut;
				}
				else if(goldenrod.listMenu.isMENU_LIST_NODE(child) ) {
					child.onmouseout = goldenrod.listMenu.mouseOut;
				}
				
			}	//End of if
			inner(child);	
		}	//End of for
		
	}
	
	inner(document);
	
}

goldenrod.listMenu.isMENU_ITEM = function(elt) {
	return (elt.nodeType == 1) && ( goldenrod.Utility.hasAttr(elt, goldenrod.listMenu.MENU_ITEM, goldenrod.listMenu.ATTR)  );
}

goldenrod.listMenu.isMENU_ITEM_LINK = function(elt) {
	return (elt.nodeType == 1) && 
		( goldenrod.Utility.getAttrValue(elt, goldenrod.listMenu.MENU_ITEM, goldenrod.listMenu.ATTR) == goldenrod.listMenu.MenuItemType.Link  );	
}

goldenrod.listMenu.isMENU_ITEM_MENU = function(elt) {
	return (elt.nodeType == 1) && 
		( goldenrod.Utility.getAttrValue(elt, goldenrod.listMenu.MENU_ITEM, goldenrod.listMenu.ATTR) == goldenrod.listMenu.MenuItemType.Menu  );	
}

goldenrod.listMenu.isMENU_LIST = function(elt) {
	return (elt.nodeType == 1) && ( goldenrod.Utility.hasAttr(elt, goldenrod.listMenu.MENU_LIST, goldenrod.listMenu.ATTR)  );
}

goldenrod.listMenu.isMENU_LIST_NODE = function(elt) {
	return (elt.nodeType == 1) && 
		( goldenrod.Utility.getAttrValue(elt, goldenrod.listMenu.MENU_LIST, goldenrod.listMenu.ATTR) == goldenrod.listMenu.MenuListType.Node  );	
}

goldenrod.listMenu.isMENU_LIST_ROOT = function(elt) {
	return (elt.nodeType == 1) && 
		( goldenrod.Utility.getAttrValue(elt, goldenrod.listMenu.MENU_LIST, goldenrod.listMenu.ATTR) == goldenrod.listMenu.MenuListType.Root  );	
}

goldenrod.listMenu.getTHE_MENU = function(elt) {
	var child, children;
	if( goldenrod.listMenu.isMENU_ITEM_MENU(elt) ) {
		
		if( (child= goldenrod.Utility.getAttrValue(elt, goldenrod.listMenu.CHILD, goldenrod.listMenu.ATTR)) ) {
			return document.getElementById(child);
		}
		else {  
			children = elt.childNodes;
			for(var i=0; i<children.length; i++) {
				child = children[i];
		
				if( goldenrod.listMenu.isMENU_LIST_NODE(child) ){
					//alert("The menu is = " + child.id);
					return child;
				}	
			}
		}
	}
	return false;
}

goldenrod.listMenu.getTHE_PARENT = function(elt) {	//Only menuLists can have parents that are specified in the menu attribute.
	var parent;
	if( (parent = goldenrod.Utility.getAttrValue(elt, goldenrod.listMenu.PARENT, goldenrod.listMenu.ATTR)) )
		parent = document.getElementById(parent);
	else 
		parent = elt.parentNode;
	return parent;
}

goldenrod.listMenu.menu_Active = function(elt) {
	//alert("menu_Active: " + elt.id )
	elt.style.display = 'block';
	var parentMenu = goldenrod.listMenu.getTHE_PARENT(elt).parentNode;
	goldenrod.Utility.setAttrValue(parentMenu, goldenrod.listMenu.ACTIVE, goldenrod.listMenu.ACTIVE_YES, goldenrod.listMenu.ATTR);
}



goldenrod.listMenu.menu_Inactive = function(elt) {
	//alert("Menu_Inactive " + elt.id);
	elt.style.display = 'none';		//Set display to none
	//goldenrod.Utility.setAttrValue(elt, goldenrod.listMenu.ACTIVE, goldenrod.listMenu.ACTIVE_NO, goldenrod.listMenu.ATTR);	
	
	//To do - Loop through all menu-item children and call menuItem Inactive
	
	var children = elt.childNodes, theMenu;
	for(var i=0; i<children.length; i++) {
		var child = children[i];
		if( goldenrod.listMenu.isMENU_ITEM(child) ) {
			goldenrod.listMenu.menu_ItemInactive(child);
			
			if( theMenu = goldenrod.listMenu.getTHE_MENU(child)) {
				//goldenrod.Utility.setAttrValue(child, goldenrod.listMenu.ACTIVE, goldenrod.listMenu.ACTIVE_NO, goldenrod.listMenu.ATTR);	
			}
		}	
	}	
	
	
	//If parent is a menu item remove class
	var parent = goldenrod.listMenu.getTHE_PARENT(elt);
	if( goldenrod.Utility.getAttrValue(parent, goldenrod.listMenu.MENU_ITEM, goldenrod.listMenu.ATTR) ) {
		var mouseData = goldenrod.listMenu._getMouseData(parent);
		goldenrod.Dom.CSSClass.removeClass(parent, mouseData[0]);
		goldenrod.Dom.CSSClass.addClass(parent, mouseData[1]);
		parent = parent.parentNode;
		//Set active to No
		goldenrod.Utility.setAttrValue(parent, goldenrod.listMenu.ACTIVE, goldenrod.listMenu.ACTIVE_NO, goldenrod.listMenu.ATTR);
	}
}

goldenrod.listMenu._getMouseData = function(elt) {
	var mouseData = []
	var parent = elt.parentNode;
	if( !(mouseData[0] = goldenrod.Utility.getAttrValue(parent, goldenrod.listMenu.HOVER, goldenrod.listMenu.ATTR)) ) {
		mouseData[0] = goldenrod.listMenu.DEFAULT_HOVER;
	}
	if( !(mouseData[1] = goldenrod.Utility.getAttrValue(parent, goldenrod.listMenu.MOUSE_OUT, goldenrod.listMenu.ATTR)) ) {
		mouseData[1] = goldenrod.listMenu.DEFAULT_MOUSE_OUT;
	}
	
	if( !(mouseData[2] = goldenrod.Utility.getAttrValue(parent, goldenrod.listMenu.HOVER_FUNC, goldenrod.listMenu.ATTR)) ) {
		mouseData[2] = goldenrod.listMenu.DEFAULT_HOVER_FUNC;
	}
	
	if( !(mouseData[3] = goldenrod.Utility.getAttrValue(parent, goldenrod.listMenu.OUT_FUNC, goldenrod.listMenu.ATTR)) ) {
		mouseData[3] = goldenrod.listMenu.DEFAULT_OUT_FUNC;
	}
	//alert("Mouse Data Array = " + mouseData);
	return mouseData;	
	
}

goldenrod.listMenu.menu_ItemActive = function(elt) {
	
	var mouseData = goldenrod.listMenu._getMouseData(elt);
	
	goldenrod.Dom.CSSClass.removeClass(elt, mouseData[1]);
	goldenrod.Dom.CSSClass.addClass(elt, mouseData[0]);
	goldenrod.listMenu.functions[mouseData[2]](elt);
	//If MenuItem is a link - just change appearance
	
	
	//If MenuItem is a menu - also chang appearance and...
	//we expect one and only one of its children to be a menuList
	if( goldenrod.listMenu.isMENU_ITEM_MENU(elt) ) {
		var theMenu = goldenrod.listMenu.getTHE_MENU(elt);
		goldenrod.listMenu.menu_Active(theMenu);	
	}
}

goldenrod.listMenu.menu_ItemInactive = function(elt) {
	var mouseData = goldenrod.listMenu._getMouseData(elt);
	
	goldenrod.Dom.CSSClass.removeClass(elt, mouseData[0]);
	goldenrod.Dom.CSSClass.addClass(elt, mouseData[1]);
	goldenrod.listMenu.functions[mouseData[3]](elt);
	
	if(goldenrod.listMenu.isMENU_ITEM_MENU(elt) ) {
		var theMenu = goldenrod.listMenu.getTHE_MENU(elt);
		goldenrod.listMenu.menu_Inactive(theMenu);
	}
}

goldenrod.listMenu.mouseOver = function(e) {
	e = e || window.event;
	var elt = this;		//This is always a menu item
	goldenrod.listMenu.mousereport(e, 'Over', elt);
	
	goldenrod.Dom.propagationHandler(e)	//From mouse over do not bubble and no default
	
	
	var siblings = elt.parentNode.childNodes;
	for(var i=0; i<siblings.length; i++) {
		var sibling = siblings[i];
		if( (sibling != elt) && goldenrod.listMenu.isMENU_ITEM(sibling) ) {
			goldenrod.listMenu.menu_ItemInactive(sibling);
		}
	}
		
	goldenrod.listMenu.menu_ItemActive(elt);
	
	return false;
}
goldenrod.listMenu.mousereport = function(){
	
}
goldenrod.listMenu.mouseOut = function(e) {
	e = e || window.event;		
	
	goldenrod.Dom.propagationHandler(e)	//I decided not to bubble on mouse out.
	
	var elt = this;
	var entered = (e.fromElement ? e.fromElement : e.relatedTarget);
	
	goldenrod.listMenu.mousereport(e, 'Out', elt);
	//if(entered == elt) {alert("entered = elt"); return false;} //If for some crazy reason this is the case - as in Opera	
	
		
	if( goldenrod.listMenu.isMENU_ITEM_LINK(elt) ) {
		goldenrod.listMenu.menu_ItemInactive(elt);
		//If pointer is also not in the parent menu element
		var parent = elt.parentNode;
		
		//if related Target is not parent and not a sibling 
		if(!goldenrod.Dom.isIn([e.clientX,e.clientY], parent) && 
				goldenrod.listMenu.isMENU_LIST_NODE(parent) ) {
				goldenrod.listMenu.menu_Inactive(parent);
		}
		
		//If menuItem in a menu - leave it be
		else if( goldenrod.listMenu.isMENU_ITEM_MENU(elt) ) {
		}
	}
	
	else if( goldenrod.Utility.hasAttr(elt, goldenrod.listMenu.MENU_LIST, goldenrod.listMenu.ATTR) &&
			!goldenrod.Dom.isIn([e.clientX,e.clientY], elt) ) {
		if( goldenrod.Utility.getAttrValue(elt, goldenrod.listMenu.ACTIVE, goldenrod.listMenu.ATTR) == goldenrod.listMenu.ACTIVE_NO ) {
			goldenrod.listMenu.menu_Inactive(elt);
		}
		
	}
	
	return false;
}