// This initializes the menu
$(function() {
	$('ul.menu').ddHMenu();
});

(function($){
  function addEvents(ul) {
    var options = $.data($(ul).parents().andSelf().filter('ul.menu')[0], 'menuSettings');

    $('> li', ul).bind('mouseenter.menu mouseleave.menu', function(evt) {
			var ul = $('> ul', this);
			if (ul.length == 1) {
				clearTimeout(this.$menuTimer);
				var enter = (evt.type == 'mouseenter');
				var fn = (enter?showMenu:hideMenu);

				this.$menuTimer = setTimeout(function() {
					fn(ul[0], options);

				}, enter? options.showDelay : options.hideDelay);
			}
    });
  }

	function showMenu(ul, options) {
		var ul = $(ul);
		if ( ul.is(':visible') ) {
			return;
		}

		var li = ul.parent();

		if (!ul.hasClass('menu_events') ) {
			ul.addClass('menu_events');
			addEvents(ul);
		}

		li.addClass('menu_active')
			// Hide any adjacent menus
			.siblings('li').find('> ul:eq(0):visible')
				.each(function() {
					hideMenu(this);
				});

    if (options && options.fade) {
      ul.fadeIn("normal");
    } else {
      ul.show();
    }
	}

	function hideMenu(ul, options) {
		var ul = $(ul);

		if (options && options.fade) {
		  ul.fadeOut("normal");
		} else {
		  ul.hide();
		}
	}

  $.fn.ddHMenu = function(options) {
    var defaults = {
  		fade: true,
  		fadeSpeed: 'slow',
  		slide: true,
  		slideSpeed: 'slow',
  		showDelay: 200,
      hideDelay: 500
  	};

  	options = jQuery.extend(defaults, options);

    return this.filter('ul.menu').each(function() {
      $.data(this, 'menuSettings', options);
      addEvents(this);
    });
  };

	$.fn.menuHide = function() {
		return this.filter('ul').each(function() {
			hideMenu(this);
		});
	};

	$(window).bind('click', function() {
		$('ul.menu ul:visible').menuHide();
  });

})(jQuery);
