/* ************************ JQUERY MENU **************************** */

(function($){
	
	$.fn.menu = function(options){
		
		var opts = $.extend({}, $.fn.menu.defaults, options);
		
		return this.each(function(){
			
			// Cache the UL //
			var $this = $(this);
			
			// Cache the children //
			var $parentLinks = $this.children( opts.menuTagNames );
			
			// Hover for link items //
			$parentLinks.each(function(){
				
				var $parentLink = $(this);
				
				var $childLinks = $parentLink.children( opts.menuChildrenTagNames );
				
				$parentLink.data('doAnimate', true);
				
				// On mouse over of each main link //
				$parentLink.mouseover(function(){
					
					$parentLink.data('doHide', false)
						.addClass(opts.hoverClass);
					
					if( siblingsShowing( $parentLink ) ){
						// Show the child links of this element //
						$childLinks.show();
						
					} else {
						// Show the child links of this element //
						if(opts.animateIn){
							if($parentLink.data('doAnimate')){
								$childLinks.fadeIn( opts.fadeTime );
							} else{
								$childLinks.show().fadeIn( opts.fadeTime );
							}
						} else {
							$childLinks.show();
						}
					}
					
					// Hide any siblings of this parent link //
					$parentLink.siblings().children( opts.menuChildrenTagNames ).hide();
				});
				
				// Mouse out on NAV item //
				$parentLink.mouseout(function(e){
									
					$parentLink.data('doHide', true)
						.data('doAnimate', false)
						
					
					$.doTimeout('hideThis', 200, function(){
						hideList($parentLink);
					});
					if( $.support.opacity ){
						$.doTimeout('removeClass', 350, function(){
							$parentLink.removeClass(opts.hoverClass);
						});
					}else{
						$.doTimeout('removeClass', 200, function(){
							$parentLink.removeClass(opts.hoverClass);
						});
					}
					
					
				});
				
				$parentLink.children(opts.menuChildrenTagNames).mouseover(function(){
					$parentLink.data('doHide', false);
				});
				
				$parentLink.children(opts.menuChildrenTagNames).mouseout(function(){
					$parentLink.data('doHide', true);
				});
				
			});
		});
		
		function siblingsShowing($parentLink){
			var displayed = false;
			$parentLink.siblings().each(function(){
				var $this = $(this);
				$this.removeClass(opts.hoverClass)
				$this.children(opts.menuChildrenTagNames).each(function(){
					var $childLinks = $(this);
					if( $childLinks.css('display') == 'block' ){
						displayed = true;
						return false;
					}
				});
				
				if( displayed ){
					return false;
				}
				
			});
			
			
			return displayed;
		}
		
		function hideList($parentLink){
			var $childLinks = $parentLink.children(opts.menuChildrenTagNames);
			if($parentLink.data('doHide')){
				if(opts.animateOut && $.support.opacity ){
					$childLinks.fadeOut( opts.fadeTime, function(){	
						$parentLink.data('doAnimate', true);
					});
				} else {
					$childLinks.hide();
				}
			}
		}
	}
	
	// Menu default options //
	$.fn.menu.defaults = {
		menuTagNames:'li',
		menuChildrenTagNames:'dl',
		fadeTime:300,
		hoverClass:'hover',
		animateIn:true,
		animateOut:true
	};
	
	
})(jQuery);
