/** 
* HTML Navbar 
* for use with UL/LI-based markup
* @date: February 9, 2006
* @author: Brian Willy (a348146), Fidelity Investments
* 
* @depends: x_event.js, x_core.js(?), ofClassFunctions.js, ofNavOop.js
*/

// Note: to use x-browser, event names do not have the prefix "on"
// caller lives in ofNavOop.js


function attachClickEventHandlersItem(e) {
	if(e.tagName=="LI")	{
//			alert("SingleLevelOnly: "+e.tagName+",  "+e.className);
		if(IS_DEBUG)debug("Adding click call to onNavItemOver for: " + e.id);
		xAddEventListener(e, EVENT_CLICK, onNavItemOver, false);
		xAddEventListener(e, EVENT_CLICK, onNavItemOut, false);
	}	else {
//			alert("LI Only: "+e.tagName+",  "+e.className);
		if(IS_DEBUG)debug("Adding click call to onFireParent for: " + e.id);
		xAddEventListener(e, EVENT_CLICK, onFireParent, false);
		xAddEventListener(e, EVENT_CLICK, onFireParent, false);
	}
}

function attachMouseOverEventHandlersItem(e) {	
	if(e.tagName=="LI")	{
//			alert("SingleLevelOnly: "+e.tagName+",  "+e.className);
		if(IS_DEBUG)debug("Adding mouseover call to onNavItemOver for: " + e.id);
		xAddEventListener(e, EVENT_MOUSEOVER, onNavItemOver, false);
		xAddEventListener(e, EVENT_MOUSEOUT, onNavItemOut, false);
	}	else {
//			alert("LI Only: "+e.tagName+",  "+e.className);
		if(IS_DEBUG)debug("Adding mouseover call to onFireParent for: " + e.id);
		xAddEventListener(e, EVENT_MOUSEOVER, onFireParent, false);
		xAddEventListener(e, EVENT_MOUSEOUT, onFireParent, false);
	}
}

function attachHybridClickOutEventHandlersItem(e) {
	if(e.tagName=="LI")	{
//			alert("SingleLevelOnly: "+e.tagName+",  "+e.className);
		if(IS_DEBUG)debug("Adding mouseover call to onNavItemOver for: " + e.id);
		xAddEventListener(e, EVENT_CLICK, onNavItemOver, false);
        xAddEventListener(e, EVENT_MOUSEOVER, onNavItemOver, false); // adding this in addition to click because when one menu is visible, all other roots become active with a mouseover per spec. Will check to see if another is active within onNavItemOver method (11/28/06)
        xAddEventListener(e, EVENT_MOUSEOUT, onNavItemOut, false);
	}	else {
//			alert("LI Only: "+e.tagName+",  "+e.className);
		if(IS_DEBUG)debug("Adding mouseover call to onFireParent for: " + e.id);
		xAddEventListener(e, EVENT_CLICK, onFireParent, false);
		xAddEventListener(e, EVENT_MOUSEOVER, onFireParent, false); // adding this in addition to click because when one menu is visible, all other roots become active with a mouseover per spec. Will check to see if another is active within onNavItemOver method (11/28/06)
        xAddEventListener(e, EVENT_MOUSEOUT, onFireParent, false);
	}
}

// ------------------------------------------------------------------


/** Called either by browser event, or directly by supporting code.
    In the latter instance, it is because Firefox will not/cannot fire
    a native LI event from within the supporting code when the A has 
    the same event.
*/
function onNavItemOver(myEvent, altDirectCallTarget){

    var ev = new xEvent(myEvent);
    var eventTarget;

    if(altDirectCallTarget!=null) {
        eventTarget = altDirectCallTarget;
        if(IS_DEBUG)debug("over LI via child A: " + eventTarget.id);
    } else {
        if(ev.target.tagName!="LI")	{
            // debug("over event is not an LI");
            // nested tags such as A and P fire this event
            // todo: as of 4/25/06, only A's are registered to fire parent Item
             return true;
       }

	    if(IS_DEBUG)debug('native over LI: ' + ev.target.id);
        
        eventTarget = ev.target;
    }
    
    if(IS_DEBUG) debugSetColor('green');
       

    try {
        var navItem = NAVMASTERS.getNavMaster(eventTarget).getItem(eventTarget);

        if(navItem.isToplevel) addClass(navItem.li, STYLECLASS_TOPLEVELHOVER);
        
        // if toplevel nav AND hybrid mode AND menus not yet active (from click), then ignore toplevel mouse-over event per spec (but not click event)

        if(navItem.getMasterNav().attachEventHandlersMode==EVENTMODE_CLICK2ON_MOUSEOUT) {

            if(navItem.isToplevel
                    && ((navItem.getMasterNav().stack.getTop()==null) || (navItem.getMasterNav().stack.stack.length==0))
                    && (getEventType(ev)=='mouseover')) {
                if(IS_DEBUG) debug("Cancelling mouseover handler because: "
                    + "isToplevel?" + navItem.isToplevel + ";<br/>"
                    + "stack 0?" + (navItem.getMasterNav().stack.stack.length==0) + ";<br/>"
                    + "is mouseover?" + (getEventType(ev)=='mouseover') + ";<br/>"
                    + "mouseover val:" + getEventType(ev));

                return false;
            } else {
                if(IS_DEBUG) {
                    var stackVal = "";
                    try {
                        stackVal = navItem.getMasterNav().stack.getTop().li.id;
                    } catch(e) {
                        stackVal = "failed to eval";
                    }

                    debug("NOT cancelling mouseover handler because: "
                    + "isToplevel?" + navItem.isToplevel + ";<br/>"
                    + "stack 0?" + (navItem.getMasterNav().stack.stack.length==0) + ", val: " + stackVal + ";<br/>"
                    + "is mouseover?" + (getEventType(ev)=='mouseover') + ";<br/>"
                    + "mouseover val:" + getEventType(ev));
                }
            }
        }

        //workingHere: works first time if don't mouseOver A, but only LI. Have to find event type when called directly, also the first condition only works once. After that, toplevel continues to appear even when stack "appears" to be 0.

        navItem.setMousingOver(ev);
		navItem.getMasterNav().setMousingOver(ev);
		// todo: create onNavItemOverExtension method for developers to extend behavior
	} catch(e) {
        alert("onNavItemOver error: " + e.message);
    }
}



function onNavItemOut(myEvent, altDirectCallTarget){    
    var eventTarget;
    
    if(altDirectCallTarget!=null)
		{
        eventTarget = altDirectCallTarget;
        if(IS_DEBUG)debug("native out LI via child A: " + eventTarget.id);
    } 
	else
	{	
    	var ev = new xEvent(myEvent);
	    if(ev.target.tagName!="LI") return false; // nested tags such as A and P fire this event

	    if(IS_DEBUG)debug('native out LI: ' + ev.target.id);
	    
	    eventTarget = ev.target;
    }
    
    if(IS_DEBUG) debugSetColor('red');

    try {
        var navItem = NAVMASTERS.getNavMaster(eventTarget).getItem(eventTarget);

        if(navItem.isToplevel) removeClass(navItem.li, STYLECLASS_TOPLEVELHOVER);

        navItem.setMousingOut();
        navItem.getMasterNav().setMousingOut();
	} catch(e) {
        alert("onNavItemOut error: " + e.message);
    }
}