var Menu = new Class({
	
	Implements: Options,
	
	options: {
		offsetLeft: 0,
		offsetTop: 0,
		delay: 500,
		speed: 500,
		opacity: 1,
		minWidth: 150
	},
	
	initialize: function(ulContainer, options) {
		this.ulContainer = $(ulContainer);
		this.setOptions(options);
		this.ulContainer.getChildren().each(function(item) {
			if(item.getElement("ul") != null) {
				item.timer = null;
				item.addEvent("mouseenter", function(item) {
					this.show(item);
				}.bind(this, item));
				item.addEvent("mouseleave", function(item) {
					$clear(item.timer);
					item.timer = this.hide.delay(this.options.delay, this, item);
				}.bind(this, item));
				item.itemLabel = item.getElement("a");
				var panel = item.getLast();
				item.panel = panel;
				panel.setStyles({
					"position": "absolute",
					"top": item.offsetHeight + this.options.offsetTop,
					"left": this.options.offsetLeft,
					"overflow": "hidden",
					"opacity": 0
				});
				panel.set("morph", {
					duration: this.options.speed,
					link: "cancel",
					onComplete: function() {
						if(this.getOpacity() == 0) {
							this.setStyles({
								"display": "none"
							});
						}
					}.bind(panel)
				});
			}
		}.bind(this));
	},
	
	show: function(item) {
		if(item.timer) {
			$clear(item.timer);
			item.timer = null;
		} else {
			item.itemLabel.addClass("selectedItem");
			var panel = item.panel;
			var opacity = panel.getOpacity();
			if(opacity == 0) {
				panel.setStyles({
					"height": "",
					"display": "block"
				});
				panel.getChildren().each(function(child) {
					var w = Math.max(child.offsetWidth , this.options.minWidth);
					panel.setStyle("width", Math.max(panel.offsetWidth , w));
				}.bind(this));			
				panel.totalHeight = panel.offsetHeight;
			}
			panel.morph({
				"opacity": this.options.opacity,
				"height": (opacity == 0 ? [0, panel.offsetHeight] : panel.totalHeight)
			});
		}
	},
	
	hide: function(item) {
		item.timer = null;
		item.itemLabel.removeClass("selectedItem");
		var panel = item.panel;
		panel.morph({
			"opacity": 0,
			"height": 0
		});
	}
	
});