(function($) {


    var menuTimeout;
    var menuFadeoutTime = 200; // in miliseconds

    var primaryNavItem = $('#mainnav_sleeve>ul>li');
    var primaryNavAnchor = $('#mainnav_sleeve>ul>li>a');
    var secondaryNavItem = $('#mainnav_sleeve>ul>li>div>ul>li');
    var secondaryNavAnchor = $('#mainnav_sleeve>ul>li>div>ul>li>a');
    var secondaryNavDiv = $('#mainnav_sleeve>ul>li>div');
    var lastSecondaryNavAnchor = $('#mainnav_sleeve>ul ul .last a');
    var lastTertiaryNavAnchor = $('#mainnav_sleeve>ul ul ul .last a');

    // add class of DROPDOWN to 2nd level nav item if it contains dropdown nav
    $(secondaryNavItem).each(function(){
        if($(this).children('div').length > 0) {
            $(this).addClass('dropdown');
        }
    });

    $.fn.SetupMenu = function() {
        $(primaryNavAnchor).bind('mouseover', {focused:false}, showMenu).bind('focus', {focused:true}, showMenu).bind('blur', {focused:false}, hideMenu);
        $(primaryNavItem).bind('mouseleave', {focused:false}, hideMenu);
        $(secondaryNavAnchor).bind('mouseover', {focused:false}, showMenu).bind('focus', {focused:true}, showMenu);
        $(secondaryNavItem).bind('mouseleave', {focused:false}, hideMenu);
        $(secondaryNavDiv).bind('mouseover', {focused:false}, showMenu);	// so that we keep 'over' state on main tab
        $(lastSecondaryNavAnchor).bind('blur', {focused:false}, hideMenu);	// hide secondary menu when tabbing away from last anchor with keyboard
        $(lastTertiaryNavAnchor).bind('blur', {focused:false}, hideMenu);	// hide dropdown menu when tabbing away from last anchor with keyboard
    }

    function showMenu(event) {
        // add class of "over" to any LI except those with class of CURRENT (which are styled differently)
        $(this).parents('li[class!=current]').addClass('over');
        // stop dropdown menu going off screen and bring into focus
        if($(this.parentNode).hasClass('dropdown')) {	// class of DROPDOWN means we're just targeting secondary nav items
            if ($.browser.msie && $.browser.version < 7) $(this.parentNode).children('div').bgiframe();

            $(this.parentNode).children('div').css({left:'auto', zIndex:'100'});

            var wrapperWidth = $('#wrapper').get(0).offsetWidth;
            var wrapperOffset = $('#wrapper').offset();
            var dropdownWidth = $(this.parentNode).children('div').get(0).offsetWidth;
            var dropdownOffset = $(this.parentNode).children('div').offset();

            // move drop down menu if running off of screen
            if((dropdownWidth + dropdownOffset.left) > (wrapperOffset.left + wrapperWidth)) {
                $(this.parentNode).children('div').css({marginLeft:'-'+((dropdownWidth + dropdownOffset.left)-(wrapperOffset.left + (wrapperWidth-parseInt($('#wrapper').css('padding-left')))))+'px'});
            }
        }
    }

    function hideMenu(event) {
        if(!event.data.focused) {
            var menuItem = this;

            // menuItem has dropdown, so move off screen (mouseleave event)
            if($(menuItem).hasClass('dropdown')) {
                $(menuItem).children('div').css({left:'-9999px', zIndex:'99'});
            }

            // menuItem = lastSecondaryNavAnchor (keyboard blur event)
            else if($(menuItem).parent().parent().parent().parent().parent().parent().parent().attr('id') == 'mainnav') {
                $(menuItem).parent().parent().parent().parent().removeClass('over');
            }

            // menuItem = lastTertiaryNavAnchor, move dropdown off screen (keyboard blur event)
            else if($(menuItem).parent().parent().parent().parent().hasClass('.dropdown')) {
                $(menuItem).parents('.dropdown').children('div').css({left:'-9999px', zIndex:'99'});
            }

            // remove "over" class only if on top level menu item (otherwise get horrible flicker in IE on main tab as you move between secondary menu items)
            else if($(menuItem).parent().parent().parent().attr('id') == 'mainnav') {
                menuTimeout = setTimeout(function() {						// add timer delay so secondary hover nav stays visible if mouseleave event was accidental
                    $(menuItem).removeClass('over');						// menuItem = LI (mouseleave event)
                }, menuFadeoutTime);
            }
            else if($(menuItem).parent().parent().parent().parent().attr('id') == 'mainnav') {
                $(menuItem).parent().removeClass('over');					// menuItem = anchor (keyboard blur event)
            }
        }
    }
})(jQuery);
