// wrapper function to limit scope and provide $ even when noConflct is used
(function($){

	var adjustTopBy = -7;
	var adjustWidthBy = -2;
	var alignEdge = 'left';
	var matchWidth = true;
	var subMenuSelector = 'ul';

	$.fn.extend({
		menu: function(options){
			var $parentMenuItems = this.children().filter(function(){
				return !this.$menu && (this.$menu = $(subMenuSelector, this)).length;
			});
			
			$parentMenuItems.bind('mouseenter.menu', function(){
				if(this.menuTimeout){
					clearTimeout(this.menuTimeout);
					this.menuTimeout = null;
				}
				var $this = $(this);
				var $menu = this.$menu;
				
				$parentMenuItems.not(this).find(subMenuSelector + ':visible').slideUp();

				if($menu.is(':visible'))
					return;

				if(matchWidth){
					var width = $(this).outerWidth();
					$menu.width(width + adjustWidthBy);
				}

				var offset = $(this).offset();
				if(alignEdge == 'right'){
					offset.left = offset.left + $this.outerWidth() - $menu.outerWidth();
				}
				offset.top = offset.top + $(this).outerHeight() + adjustTopBy;
				$menu.show().offset(offset).hide();
				if(this.$menu && this.$menu.length > 0)
					this.$menu.not(':visible').slideDown();
			});

			$parentMenuItems.bind('mouseleave.menu', function(){
				if(this.$menu && this.$menu.length > 0){
					var $menu = this.$menu;
					this.menuTimeout = setTimeout(function(){
						if($menu.is(':visible'))
							$menu.slideUp();
					}, 800);
				}
			});
		}
	});

})(jQuery);
