/*
jQuery Plugin for:
Horizontal navigation with animated sub nav Ver 1
Author: William Paoli
wpaoli@gmail.com
building58.com
*/

(function($){
    $.fn.animatedHorizontalNav = function(callerSettings) {

        var settings = $.extend({
            speed: 250,
            useHoverIntent: true
        }, callerSettings||{});

        var obj = this;

        settings.subNavHeight = '-' + obj.find('li ul li').outerHeight() +'px';

        //the total width of the menu..is this needed?
        var topListWidth = obj.outerWidth();

        obj.find('ul').css({'width':topListWidth,'z-index':'0'});

        //hide all the subnav li's
		if(obj.find('li').hasClass('selected')){
			obj.find('li ul li').not(obj.find('li.selected ul li')).css({
				'margin-top': settings.subNavHeight,
				'display': 'none'
			});
			obj.find('li.selected ul li').css({
				'margin-top': '0',
				'display': 'block'
			});
		}else{
			obj.find('li ul li').css({
				'margin-top': settings.subNavHeight,
				'display': 'none'
			});
		}

        var hoverStates = function(item){
            item.toggleClass('hover');
        };

        var rollOver = function () {
			
            var sub_items = $(this).parents('li').children('ul').find('li');
            var items = $(this).parents('li').not($(this).parents('li'));

                if ($(this).parents('li').children('ul').find('li:animated').length <= 0) {
                    slideDown(sub_items);
                } else {
                    setTimeout(
                    function(){
                        slideDown(sub_items);
                    },100);
                }
                $(this).parents('li').addClass('hover');
				$(this).parents('li').children('ul').css({'z-index':'1'});
        };
		
		var rollActive = function () {
			
			if(obj.find('li').hasClass('selected')){
				var sub_items = obj.find('li.selected ul li');
				sub_items.css({'display':'block'}).animate({
                    'marginTop': '0'
                }, settings.speed);
			}
                
        };
		
        var rollOut = function () {
            var items = $(this).parents('li');
            if ($(this).parents('li').children('ul').length === 0) {
                hoverStates(items);   
				
				 
            }
			
			rollActive();
        };

        //hoverItent and regular hover
        if (settings.useHoverIntent) {
            //hoverIntent configuration
            var hoverIntentConfig = {
                sensitivity: 1, // number = sensitivity threshold (must be 1 or higher)    
                interval: 28, // number = milliseconds for onMouseOver polling interval    
                timeout: 30, // number = milliseconds delay before onMouseOut    
                over: rollOver, // function = onMouseOver callback (REQUIRED)    
                out: rollOut // function = onMouseOut callback (REQUIRED)    
            };

            obj.find('li a').not(obj.find('li ul li a')).hoverIntent(hoverIntentConfig);        
        } else {
            obj.find('li a').not(obj.find('li ul li a')).hover(rollOver, rollOut);        
        }

        var slideUp = function (sub_items, removeHoverOnCallback) {
            sub_items.animate({
                'marginTop': settings.subNavHeight
            }, settings.speed, 
            function () {
                $(this).css({'display':'none'});
                if (removeHoverOnCallback) {
                    $(this).parents('li').removeClass('hover');
                }
            });

            if (!removeHoverOnCallback) {
                sub_items.parents('li').removeClass('hover');
            }
			obj.find('li ul').css({'z-index':'0'});
        };

        var slideDown = function (sub_items) {
			    
                sub_items.css({'display':'block'}).animate({
                    'marginTop': '0'
                }, settings.speed).dequeue(slideUp(obj.find('li ul li').not(sub_items)));
        };

        obj.bind('mouseleave', function () {
			if(obj.find('li').hasClass('selected'))
              slideUp(obj.find('li ul li').not(obj.find('li.selected ul li')), true);
			  
			else
			  slideUp(obj.find('li ul li'), true);
        });
        
    };
})(jQuery);
