// Author: Joseba Alonso
// Reference : http://www.sidedev.net/jsoop/dropdowns
// Version: 1.0 beta
// LastChange: 1-2-2005


// Variable global
var g_docInit = false;

function DropDownMenu(){
	// Parametros de ajuste
	this.DDoffsetTop = -3; // ajuste superior con la altura del menu
	this.DDoffsetBottom = 5; // ajuste inferior con la altura del menu
	this.tiempo = 30; // fotogramas que tarda en abrirse
	this.menuId = "MainMenu"; // Id del menu contenedor
	this.menuClosedHeight = "40px"; // altura del menu contenedor cuando no hay nada desplegado
	this.menuOpenedHeight = "520px"; // altura del menu contenedor cuando hay alguno desplegado
	// Inicializacion
	this.desplegado = false;
	this.subMenu = this.__findChild("ol");
	this.boton = this.__findChild("a");
	if(!g_docInit){
		this.createDocumentWrapper();
		g_docInit = true;
	}
	this.timeout;
	if(this.subMenu){
		this.boton.onmouseover = function(){
			this.parentNode.show();
		}
		this.subMenu.onmouseover = function(){
			clearTimeout(this.timeout);
		}
			
		this.subMenu.onmouseout = function(){
			var scope = this;
			clearTimeout(this.timeout);
			this.timeout = setTimeout(function(){scope.parentNode.hide()},200);
		}
		this.actual = -this.subMenu.clientHeight-5;
		this.subMenu.style.marginTop = this.actual+"px";
	}
}
DropDownMenu.prototype.easeInOutSine = function (t, b, c, d) {
    return c/2 * (1 - Math.cos(t/d * Math.PI)) + b;
};
DropDownMenu.prototype.__findChild = function(tagname){
	var hijos = this.childNodes;
	if(hijos){
		for(var i=0;i<hijos.length;i++){
			if(hijos[i].nodeName && hijos[i].nodeName.toLowerCase() == tagname){
				return hijos[i];
			}
		}
	}
	return null;
}
DropDownMenu.prototype.createDocumentWrapper = function(){
	document.activeMenu = null;
	document.activos = new Array();
	document.__dropdown = this;
	document.getElementById(this.menuId).style.height = this.menuClosedHeight;
	document.setActive = function(menu){
		this.activeMenu = menu;
		this.activos.push(menu);
	}
	document.setInactive = function(menu){
		for(var i=0;i<this.activos.length;i++){
			if(this.activos[i]==menu){
				this.activos.splice(i,1);
				break;
			}
		}
		this.checkActive();
	}
	document.deactivate = function(rapido){
		if(this.activeMenu){
			this.activeMenu.hide(rapido);
			this.activeMenu = null;
		}
	}
	document.onclick = function(){
		this.deactivate(true);
	}
	document.checkActive = function(){
		if(this.activos == 0){
			document.getElementById(this.__dropdown.menuId).style.height = this.__dropdown.menuClosedHeight;
		}
	}
}
DropDownMenu.prototype.show = function(){
	if(this.desplegado)return;
	document.getElementById(this.menuId).style.height = this.menuOpenedHeight;
	if(document.activeMenu != this)document.deactivate();
	document.setActive(this);
	this.subMenu.style.visibility = "visible";
	this.desplegado = true;
	this._init = this.actual
	this._finaly=-this._init+this.DDoffsetTop;
	this._t = 0;
	this._ec = this.easeInOutSine;
	FrameServer.getInstance().addListener(this,"time");
}
DropDownMenu.prototype.hide = function(rapido){
	if(rapido){
		this.subMenu.style.marginTop = (-this.subMenu.clientHeight-this.DDoffsetBottom)+"px";
		this.subMenu.style.visibility = "hidden";
		document.setInactive(this);
		this.desplegado = false;
	}
	else{
		if(!this.desplegado)return;
		this.desplegado = false;
		this._init = this.actual;
		this._finaly=-this.subMenu.clientHeight-this.DDoffsetBottom-this._init;
		this._t = 0;
		this._ec = this.easeInOutSine;
		FrameServer.getInstance().addListener(this,"time");
	}
}
DropDownMenu.prototype.time = function(){
	this.actual = this._ec(this._t++,this._init,this._finaly,this.tiempo);
	if(this._t>this.tiempo){
		FrameServer.getInstance().removeListener(this,"time");
		if(!this.desplegado){
			this.subMenu.style.visibility = "hidden";
			document.setInactive(this);
		}
		else{
			this.subMenu.style.marginTop = this.actual+"px";
		}
	}
	else{
		this.subMenu.style.marginTop = this.actual+"px";
	}
}	