function DropDownMenu(mainMenu, mediator) {
	DropDownMenu.baseConstructor.call(this, mainMenu, null, mediator);
	this.getMediator().registerDropDownMenu(this);
}
System.extend(DropDownMenu, Menu);

DropDownMenu.ITEM_CONTAINER_CSS_CLASS 	= "ItemMenuContainer";
DropDownMenu.MENU_DIPLAY_TIME 			= 500;
DropDownMenu.lastTimeMouseOver 			= -1;
DropDownMenu.lastTimeMouseOut 			= -1;
DropDownMenu.existsActiveItem 			= false;

DropDownMenu.updateLastTimeMouseOver = function() {
	var date = new Date();
	DropDownMenu.lastTimeMouseOver = date.getTime();
}

DropDownMenu.getLastTimeMouseOver = function() {
	return DropDownMenu.lastTimeMouseOver;
}

DropDownMenu.updateLastTimeMouseOut = function() {
	var date = new Date();
	DropDownMenu.lastTimeMouseOut = date.getTime();
}

DropDownMenu.getLastTimeMouseOut = function() {
	return DropDownMenu.lastTimeMouseOut;
}

DropDownMenu.prototype.getChildsContainer = function() { 
	return document.getElementById(this.getMainMenu().id + "_Childs");
}

DropDownMenu.prototype.createChildsContainer = function() { 
	var div 			= document.createElement("div");
	div.id 				= this.getMainMenu().id + "_Childs";
	div.className 		= "clearfix";
	div.style.position 	= "relative";
	div.style.zIndex 	= "100";
	div.style.marginLeft= "15px";
	div.style.top		= "11px";
	this.getMainMenu().appendChild(div);
}

DropDownMenu.prototype.build = function() {
	this.createChildsContainer();
	var it = new ArrayIterator(this.items);
	var item = null;
	while(it.hasNext()) {
		item = it.next();
		this.buildItem(item, 0);
	}
	this.fixLastItem(item);
}

DropDownMenu.prototype.fixLastItem = function(item) {
	var li = document.getElementById(item.getId());
	li.style.backgroundImage 	= "none";
	li.style.paddingRight 		= "0px";
}

DropDownMenu.prototype.getItemContainer = function(item) { 
	var itemsContainer = null;
	if (document.getElementById(item.getContainerName()) == null) {
		switch(item.getLevel()) {
			case 0:
				var div = document.createElement("div");
				div.id = "cont_botonera";
				
				itemsContainer = document.createElement("ul");
				itemsContainer.id = item.getContainerName();
				
				div.appendChild(itemsContainer);
				this.getMainMenu().appendChild(div);
				break;
			case 1:
				var div1 = document.createElement("div");
				div1.className = "cont_sub_menu";
				// TODO: cambiar width
				div1.style.width = "160px";
				div1.id = "cont_"+item.getContainerName();
				div1.style.display = "none";
				div1.style.visibility = "hidden";
				div1.style.position = "absolute";
				
				var div2 = document.createElement("div");
				div2.className = "sub_menu_top";
				
				var div3 = document.createElement("div");
				div3.className = "c";
				
				div2.appendChild(div3);
				div1.appendChild(div2);
				
				var div4 = document.createElement("div");
				div4.className = "sub_menu_medio";
				
				var div5 = document.createElement("div");
				div5.className = "c";
				
				itemsContainer = document.createElement("ul");
				itemsContainer.id = item.getContainerName();
				
				div5.appendChild(itemsContainer);
				div4.appendChild(div5);
				div1.appendChild(div4);
				
				var div6 = document.createElement("div");
				div6.className = "sub_menu_bottom";
				
				var div7 = document.createElement("div");
				div7.className = "c";
				
				div6.appendChild(div7);
				div1.appendChild(div6);
				this.getChildsContainer().appendChild(div1);
				break;
			case 2:
			default:
				var div1 = document.createElement("div");
				div1.className = "cont_sub_sub_menu";
				// TODO: cambiar width
				div1.style.width = "160px";
				div1.id = "cont_"+item.getContainerName();
				div1.style.display = "none";
				div1.style.visibility = "hidden";
				div1.style.position = "absolute";
				
				var div2 = document.createElement("div");
				div2.className = "sub_sub_menu_top";
				
				var div3 = document.createElement("div");
				div3.className = "c";
				
				div2.appendChild(div3);
				div1.appendChild(div2);

				var div4 = document.createElement("div");
				div4.className = "sub_sub_menu_medio";
				
				var div5 = document.createElement("div");
				div5.className = "c";
				
				itemsContainer = document.createElement("ul");
				itemsContainer.id = item.getContainerName();
				
				div5.appendChild(itemsContainer);
				div4.appendChild(div5);
				div1.appendChild(div4);
				
				var div6 = document.createElement("div");
				div6.className = "sub_sub_menu_bottom";
				
				var div7 = document.createElement("div");
				div7.className = "c";
				
				div6.appendChild(div7);
				div1.appendChild(div6);
				this.getChildsContainer().appendChild(div1);
				break;
		}
	} else {
		itemsContainer = document.getElementById(item.getContainerName());
	}
	GuiHelper.hide(itemsContainer);
	return itemsContainer;
}

DropDownMenu.prototype.getRootItemLeft = function(actualOrder) { 
	var left = 0;
	var it = new ArrayIterator(this.getItems());
	
	while(it.hasNext()) {
		var item = it.next();
		if (item.getOrden() < actualOrder) {
			left += item.getWidth();
		}
	}
	return left;
}

DropDownMenu.prototype.setItemStyles = function(tmpItem, item, level) { 
	tmpItem.id 				= item.getId();
	tmpItem.appendChild(item.getContents());
	
	tmpItem.onmouseover = function() {
		DropDownMenu.existsActiveItem = true;
		
		var activeItem 			= mediator.getActiveMenuItem();
		var item 				= mediator.getObjectReference(this.id);
		var thisContainerName 	= item.getContainerName();
		var childContainerName 	= item.getContainerName() + "_" + item.getId();
		var newContainer 		= document.getElementById(childContainerName);
		var divContainer 		= document.getElementById("cont_"+childContainerName);
		
		mediator.cleanContainer(thisContainerName);
		if (divContainer != null) {
			divContainer.style.top 	= item.getTopFromRoot() + "px";
			divContainer.style.left = item.getLeftFromRoot() + "px";

			GuiHelper.show(divContainer);
			if (newContainer != null) GuiHelper.show(newContainer);
			mediator.addOpenContainer(childContainerName);
		}
		DropDownMenu.updateLastTimeMouseOver();
	};
	tmpItem.onmouseout = function() {
		DropDownMenu.existsActiveItem = false;
		DropDownMenu.updateLastTimeMouseOut();
		setTimeout ('mediator.hideMenu()', 500); 
	}
}

DropDownMenu.prototype.buildItem = function(item, level) {
	var itemsContainer 	= this.getItemContainer(item);
	var tmpItem 		= document.createElement("li");
	
	this.setItemStyles(tmpItem, item, level);
	itemsContainer.appendChild(tmpItem);

	if (item.hasChilds()) {
		var it = new ArrayIterator(item.getChildItems());
		
		level++;
		while (it.hasNext()) {
			this.buildItem(it.next(), level);
		}
	}
}

DropDownMenu.prototype.setItemCssClass = function(cssClass, tmpItem) {
	tmpItem.className 	= cssClass;
	tmpItem.onmouseover = function() { 
		var thisItem 	= mediator.getObjectReference(this.id);
		this.className 	= thisItem.getCssClassHover();
	};
	tmpItem.onmouseout 	= function() { 
		var thisItem 	= mediator.getObjectReference(this.id);
		this.className 	= thisItem.getCssClass();
	};
}

DropDownMenu.prototype.show = function() { 
	var items = this.getItems();
//	GuiHelper.show(document.getElementById(items[0].getContainerName()));
//	GuiHelper.show(this.getMainMenu());
	
	
	var it = new ArrayIterator(this.getItems());
	while(it.hasNext()) {
		var item = it.next();
//		alert(item.getContainerName());
		GuiHelper.show(document.getElementById(item.getContainerName()));
	}
	GuiHelper.show(this.getMainMenu());
	
}

DropDownMenu.prototype.hide = function() { 
	GuiHelper.hide(this.getMainMenu());
}

DropDownMenu.prototype.isMenuTimeElapsed = function() { 
	var dif = DropDownMenu.getLastTimeMouseOut() - DropDownMenu.getLastTimeMouseOver();
	if (dif > DropDownMenu.MENU_DIPLAY_TIME) {
		return true;
	} else {
		DropDownMenu.updateLastTimeMouseOut();
		setTimeout ('mediator.hideMenu()', 500); 
		return false;
	}
}