/*
 Initialize a CMS Main menu.
 Defaults are listed below, any may be overridden through the parameters on the function call.

    menuSelector: '#mainNav'
        Menu selector, preferably an id.
    mouseOverContainerClass: 'headRollMenu'
        Menu mouse over container selector, preferably an id.
    mouseOverBaseClass: 'base'
        Mouse over base class (set when not hovered or active).
    mouseOverHoverClass: 'over'
        Mouse over hover class.
    mouseOverActiveClass: 'active'
        Mouse over active class (at or under this page in the heirarchy).
    mouseOverHoverActiveClass: 'overActive'
        Mouse over hover-active class.
    mouseOverHasDropClass: 'hasDrop'
        Mouse over has drop items class.
    mouseOverPrefix: 'tmo_'
        Mouse over id prefix.
    menuDropClass: 'dropMenu'
        Drop menu class.
    menuDropWidth: 175
        Drop menu width.
    menuDropTimeOut: 300
        Drop menu timeout.
    menuDropAdjust: 0
        Drop menu adjustment (added to distance from left).
    menuDropPrefix: 'dropMenu_'
        Drop menu id prefix.
*/

function initializeMainMenu(parameters)
{
    var defaults =
        {
            menuSelector: '#mainNav'
            , mouseOverContainerClass: 'headRollMenu'
            , mouseOverBaseClass: 'base'
            , mouseOverHoverClass: 'over'
            , mouseOverActiveClass: 'active'
            , mouseOverHoverActiveClass: 'overActive'
            , mouseOverHasDropClass: 'hasDrop'
            , mouseOverPrefix: 'tmo_'
            , menuDropClass: 'dropMenu'
            , menuDropWidth: 175
            , menuDropTimeOut: 300
            , menuDropAdjust: 0
            , menuDropPrefix: 'dropMenu_'
        };

    var options = jQuery.extend(
            defaults,
            parameters
        );

    var menuTimer  = null;

    var mouseOverSelector = options.menuSelector+' .'+options.mouseOverContainerClass+' a';

    if (jQuery(options.menuSelector).length == 0
        || jQuery(mouseOverSelector).length == 0
        || jQuery(options.menuSelector + ' .' + options.menuDropClass).length == 0)
    {
        return;
    }

	jQuery(mouseOverSelector).hover(
		function()
		{
			showDrop(getObjInt(jQuery(this).attr("id")));
		},
		function()
		{
			releaseDrop(getObjInt(jQuery(this).attr("id")));
		}
	);
	jQuery(options.menuSelector + ' .' + options.menuDropClass).hover(
		function()
		{
			lockDrop();
		},
		function()
		{
			releaseDrop(getObjInt(jQuery(this).attr("id")));
		}
	);

	// If there's at least one drop
	if(jQuery(options.menuSelector + ' .' + options.menuDropClass).length > 0)
	{
    	// Get width of drop and override dropWidth cal set in params/defaults
		options.menuDropWidth = jQuery(options.menuSelector + ' .' + options.menuDropClass+':first').width();
	}


    function showDrop(objInt)
    {
        resetDrops();
        resetTimer();

        var menuObj = jQuery('#'+options.mouseOverPrefix+objInt);
        var dropObj = jQuery('#'+options.menuDropPrefix+objInt);

        if(jQuery(menuObj).hasClass(options.mouseOverBaseClass))
        {
            jQuery(menuObj).removeClass(options.mouseOverBaseClass).addClass(options.mouseOverHoverClass); // Replace class of base with class of over
        }
        if(jQuery(menuObj).hasClass(options.mouseOverActiveClass))
        {
            jQuery(menuObj).removeClass(options.mouseOverActiveClass).addClass(options.mouseOverHoverActiveClass); // Replace class of active with class of overActive
        }

        if(jQuery(dropObj).length > 0)
        {
            if (jQuery('#'+options.menuDropPrefix+objInt+' a').length == 0)
            {
                return;
            }

            jQuery(menuObj).addClass(options.mouseOverHasDropClass);
            var leftPad = getLeftPad(jQuery(menuObj).attr('id'));
            jQuery(dropObj).show(); // Show drop
            jQuery(dropObj).css({'left' : leftPad});
        }
    }//end showDrop


    function releaseDrop(objInt)
    {
        // If menu item has drop associated with it
        if(jQuery('#'+options.menuDropPrefix+objInt).length > 0)
        {
            menuTimer = jQuery.timer(
                options.menuDropTimeOut,
                function()
                {
                    resetDrops();
                }
            );
        }
        else
        {
            resetDrops(); // Reset hover status immediately
        }
    }//end releaseDrop


    function resetDrops()
    {
        jQuery("."+options.mouseOverHasDropClass).removeClass(options.mouseOverHasDropClass);
        jQuery("."+options.mouseOverHoverClass).removeClass(options.mouseOverHoverClass).addClass(options.mouseOverBaseClass); // Replace any class of over with base
        jQuery("."+options.mouseOverActiveClass).removeClass(options.mouseOverHoverActiveClass).addClass(options.mouseOverActiveClass); // Replace any class of overActive with active
        jQuery("."+options.menuDropClass).hide();  // Hide all drops
    }//end resetDrops


    function resetTimer()
    {
        if(menuTimer != null)
        {
            jQuery.clearTimer(menuTimer);
        }
    }//end resetTimer


    function lockDrop()
    {
        resetTimer();
    }//end lockDrop


    function getObjInt(objID)
    {
        return objID.split("_")[1];
    }//end getObjInt


    function getLeftPad(objID)
    {
        thisButton = document.getElementById(objID);
        var button_x = thisButton.offsetLeft; // Can only get this relative to window (not parent) using jQuery
        var leftPad = eval(button_x);
        var calcPos = (jQuery(thisButton).parents('div').width() - leftPad > options.menuDropWidth) ? leftPad : jQuery(thisButton).parents('div').width() - options.menuDropWidth;
        return(calcPos + options.menuDropAdjust + "px");
    }//end getLeftPad

}//end initializeMainMenu





