/**
 * 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: 800,
					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();
					$obj2.addClass( $obj2.data('classname') ).siblings('ul').show();
				}).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();

				// Clear timer var
				if (timeout) 
					clearTimeout(timeout);
			}
		});
	};
})(jQuery);
