
function getMenuAnimation(menu)
{
	if (!menu || typeof menu.animation === 'undefined' || menu.animation === null)
	{
		return null;
	}
	else
	{
		return menu.animation;
	}
}

function showDropdownMenu(menu)
{
	var effect = getMenuAnimation(menu);
	if (effect !== null)
	{
		effect.cancel();
		menu.setStyle(
			{
				visibility: "hidden",
				height: ""
			}
		);
		menu.animation = null;
	}

	menu.animation = new Effect.BlindDown(
		menu,
		{
			duration: 0.2,
			afterUpdate: function()
			{
				menu.setStyle(
				{
					visibility: "visible"
				});
			},
			afterFinish: function()
			{
				this.addClassName("expanded");
				this.animation = null;
			}.bind(menu)
		}
	);
}

function hideDropdownMenu(menu)
{
	var effect = getMenuAnimation(menu);
	if (effect !== null)
	{
		effect.cancel();
		menu.setStyle(
			{
				visibility: "visible"
			}
		);
		menu.animation = null;
	}

	menu.animation = Effect.BlindUp(
		menu,
		{
			duration: 0.2,
			afterFinish: function()
			{
				this.removeClassName("expanded");
				this.setStyle(
				{
					visibility: "hidden",
					display: "",
					height: ""
				});
				this.animation = null;
			}.bind(menu)
		}
	);
}

function getRelatedMouseTarget(mouseEvent, isMouseOver)
{
	if (mouseEvent.relatedTarget)
	{
		return mouseEvent.relatedTarget;
	}
	else
	{
		if (isMouseOver)
		{
			return mouseEvent.fromElement;
		}
		else
		{
			return mouseEvent.toElement;
		}
	}
}

document.observe(
	"dom:loaded",
	function()
	{
		var elems = $$("ul#nav > li");
		elems.each(
			function(elem)
			{
				var ul = elem.down("ul");
				if (ul)
				{
					ul.setStyle(
						{
							display: "none"
						}
					);

					elem.observe(
						"mouseover",
						function(event)
						{
							var eventElem = event.element();
							var oldTarget = getRelatedMouseTarget(event);

							if (oldTarget && oldTarget !== elem && !oldTarget.descendantOf(elem))
							{
								showDropdownMenu(elem.down("ul"));
							}
						}
					);

					elem.observe(
						"mouseout",
						function(event)
						{
							var eventElem = event.element();
							var newTarget = getRelatedMouseTarget(event);

							if (newTarget && newTarget !== elem && !newTarget.descendantOf(elem))
							{
								hideDropdownMenu(elem.down("ul"));
							}
						}
					);
				}
			}
		);
	}
);

