// DropDownMenu class
//
// Use the attach() method to add a menu to an object. TODO
//
// requires dom.js, runtime.js, TODO
//
function DropDownMenu(o, cssClass, menuDiv)
{
	if (isSet(menuDiv))
	{
		menuDiv = $(menuDiv);
		DOM.hide(menuDiv);
	}
	else
	{
		menuDiv = document.createElement("div");
		menuDiv.innerHTML = "Example menu<br />Line 2";
		DOM.hide(menuDiv);
		document.body.appendChild(menuDiv);
	}

	menuDiv.style.position = "absolute";
	if (isSet(cssClass))
		DOM.addClass(menuDiv, cssClass);

	var openMenuTimer = null;
	var closeMenuTimer = null;
	var closeMenuAnim = null;
	var self = this;

	this.offsetX = 0;
	this.offsetY = 0;
	this.opacity = 1;

	var realOpenMenu = function ()
	{
		openMenuTimer = null;
		DOM.show(menuDiv);
	};
	
	var openMenu = function (evenIfClosing)
	{
		if (isSet(closeMenuAnim) && !evenIfClosing) return;

		clearTimeout(closeMenuTimer);
		if (isSet(closeMenuAnim)) closeMenuAnim.halt();

		// TODO: this modified left function should be ported back to DOM.left()
/*		var left = function(o){
			o=$(o);if(!isSet(o))return 0;var left=o.offsetLeft;while(o=o.offsetParent)left+=o.offsetLeft;
			left -= parseInt(DOM.getEffectiveStyle(document.documentElement, "border-left-width"));
			return left;}*/

		menuDiv.style.left = (DOM.left(o) + self.offsetX) + "px";
/*		menuDiv.style.left = (left(o) + self.offsetX) + "px";*/
		menuDiv.style.top = (DOM.bottom(o) + self.offsetY) + "px";
		DOM.setOpacity(menuDiv, self.opacity);
		openMenuTimer = setTimeout(realOpenMenu, 300);   // Time to delay opening the menu, in milliseconds
	};

	var realCloseMenu = function ()
	{
		if (isSet(Animation))
		{
			closeMenuAnim = new Animation([
				{o: menuDiv, type: "opacity", start: self.opacity, end: 0, method: "exp", duration: 150},
//				{type: "top", start: DOM.top(menuDiv), end: DOM.top(menuDiv) + 20}
			]);
			closeMenuAnim.onfinished = function () {
				// Clean up
				DOM.hide(menuDiv);
				DOM.setOpacity(menuDiv, 1);
				closeMenuAnim = null;
			};
			closeMenuAnim.play();
		}
		else
		{
			DOM.hide(menuDiv);
		}
	};

	var closeMenu = function ()
	{
		if (isSet(openMenuTimer))
		{
			clearTimeout(openMenuTimer);
			openMenuTimer = null;
		}
		closeMenuTimer = setTimeout(realCloseMenu, 200);
	};


	DOMEvents.add(o, "mouseover", function (e) {
		openMenu(true);
	});

	DOMEvents.add(menuDiv, "mouseover", function (e) {
		openMenu(false);
	});

	DOMEvents.add(o, "mouseout", function (e) {
		closeMenu();
	});

	DOMEvents.add(menuDiv, "mouseout", function (e) {
		closeMenu();
	});
}
