/** 
 * Multi-level Drop Down Menu 2.0 
 * August 22, 2009 
 * Corey Hart @ http://www.codenothing.com 
 */  
;(function($){ 
	// Needed for IE Compatibility 
	$.fn.reverse = [].reverse; 
 
	$.fn.dropDownMenu = function(options){ 
		return this.each(function(){ 
			// Defaults with metadata support 
			var $mainObj = $(this), menus = [], classname, timeout, $obj, $obj2,  
				settings = $.extend({ 
					timer: 500, 
					parentMO: null, 
					childMO: null, 
					levels: [], 
					numberOfLevels: 5 
				}, options||{}, $.metadata ? $mainObj.metadata() : {}); 
	 
			// Set number of levels 
			if (settings.levels.length){ 
				settings.numberOfLevels = settings.levels.length; 
			}else{ 
				settings.levels[0] = settings.parentMO ? settings.parentMO : settings.childMO; 
				for (var i=1; i<settings.numberOfLevels+1; i++) 
					settings.levels[i] = settings.childMO; 
			} 
	 
			// Run through each level 
			menus[0] = $mainObj.children('li'); 
			for (var i=1; i<settings.numberOfLevels+1; i++){ 
				// Set Vars 
				classname = settings.levels[i-1]; 
				menus[i] = menus[i-1].children('ul').children('li'); 
	 
				// Action 
				menus[i-1].mouseover(function(){ 
					// Defaults 
					$obj = $(this); $obj2 = $obj.children('a'); 
	 
					// Clear closing timer if open 
					if (timeout)  
						clearTimeout(timeout); 
	 
					// Remove all mouseover classes 
					$('a', $obj.siblings('li')).each(function(){ 
						var $a = $(this), classname = $a.data('classname'); 
						if ($a.hasClass(classname)) 
							$a.removeClass(classname); 
					}); 
	 
					// Hide open menus and open current menu 
					//$obj.siblings('li').find('ul:visible').reverse().hide(); 
					$obj.siblings('li').find('ul:visible').reverse().slideUp(); 
					//$obj2.addClass( $obj2.data('classname') ).siblings('ul').show(); 
					$obj2.addClass( $obj2.data('classname') ).siblings('ul').slideDown(); 
				}).mouseout(function(){ 
					if ($(this).children('a').data('classname') == settings.levels[0]) 
						timeout = setTimeout(closemenu, settings.timer); 
				}).children('a').data('classname', classname); 
			} 
	 
			// Allows user option to close menus by clicking outside the menu on the body 
			$(document).click(closemenu); 
	 
			// Closes all open menus 
			function closemenu(){ 
				// Clear mouseovers 
				$('a', $mainObj).each(function(){ 
					var $a = $(this), classname = $a.data('classname'); 
					if ($a.hasClass(classname)) 
						$a.removeClass(classname); 
				}); 
 
				// Close Menus backwards for IE Compatibility 
				//$('ul:visible', $mainObj).reverse().hide(); 
				$('ul:visible', $mainObj).reverse().slideUp(); 
 
				// Clear timer var 
				if (timeout)  
					clearTimeout(timeout); 
			} 
		}); 
	}; 
})(jQuery); 