/*
	Tim Jones
	v
*/
jQuery.fn.dropmenu = function(Options) {
	if(Options == undefined) Options = {};

	this.each(function() {
		var $Obj = $(this);

		$(this).data("DropMenuObj", new jQuery.dropmenu($Obj, Options));
	});

	return this;
}

jQuery.dropmenu = function($Obj, Options) {
	if($Obj == null)	throw new Exception("jQuery.autocomplete : Bad jQuery Object Given");

	Options.Classes						= Options.Classes					|| {};

	Options.HideMenuDelay				= Options.HideMenuDelay				|| 1000;
	Options.StartZIndex					= Options.StartZIndex				|| 1000;

	var self		= this;

	var HideTimer	= null;

	//Private
	function Constructor() {
		$Obj.bind("mouseover", function(e) {
			$LI = $(e.target);

			OnMouseOver($LI);
		});

		$Obj.bind("mouseout", function(e) {
			$LI = $(e.target);

			OnMouseOut($LI);
		});

		$Obj.find("ul").bind("mouseover", function(e) {
			$LI = $(e.target).parent();

			OnMouseOver($LI);
		});

		$Obj.find("ul").bind("mouseout", function(e) {
			$LI = $(e.target).parent();

			OnMouseOut($LI);
		});

		$Obj.find("li").bind("mouseover", function(e) {
			$LI = $(e.target);

			OnMouseOver($LI);
		});

		$Obj.find("li").bind("mouseout", function(e) {
			$LI = $(e.target);

			OnMouseOut($LI);
		});

		$Obj.find("a").bind("mouseover", function(e) {
			$LI = $(e.target).parent();

			OnMouseOver($LI);
		});

		$Obj.find("a").bind("mouseout", function(e) {
			$LI = $(e.target).parent();

			OnMouseOut($LI);
		});

		FixZIndex($Obj.find("> ul"), Options.StartZIndex);
	}

	function FixZIndex($UL, Level) {
		$UL.css("z-index", Level);

		$UL.find("> li > ul").each(function() {
			FixZIndex($(this), Level + 1);
		});
	}

	function OnMenu($LI) {
		if($LI.data("OnMenu") == true) return true;

		var AnyChildrenOnMenu = false;

		$LI.find("li").each(function() {
			if($(this).data("OnMenu")) AnyChildrenOnMenu = true;
		});

		return AnyChildrenOnMenu;
	}

	function OnMouseOver($LI) {
		$LI.data("OnMenu", true);

		$LI.find("> ul").slideDown(200);
	}

	function OnMouseOut($LI) {
		$LI.data("OnMenu", false);

		setTimeout(function() {
			if(OnMenu($LI)) return;

			$LI.find("ul").slideUp(150);

			if(OnMenu($Obj) == false) {
				$Obj.find("ul").slideUp(150);
			}
		}, Options.HideMenuDelay);
	}

	Constructor();
};

