objDesplegable.registro = []
objDesplegable.pasosAnimacion = 300
objDesplegable.retardo = 500
objDesplegable.minCPU = 10

objDesplegable.ie = document.all ? 1 : 0
objDesplegable.ns4 = document.layers ? 1 : 0
objDesplegable.dom = document.getElementById ? 1 : 0

function objDesplegable(id, intDirPadreX, intDirPadreY, intDirX, intDirY, intPosX, intPosY, strPadre, strEfecto, blnDependiente, blnAutoCierre)
{
	if (objDesplegable.ie || objDesplegable.ns4 || objDesplegable.dom)
	{
		objDesplegable.registro[id] = this

		this.id = id
		this.dirPadreX = intDirPadreX
		this.dirPadreY = intDirPadreY
		this.dirX = intDirX
		this.dirY = intDirY
		this.posX=intPosX
		this.posY=intPosY
		this.efecto=strEfecto
		this.dependiente=blnDependiente;
		this.autoCierre=blnAutoCierre;
		
		this.orientacion = (strEfecto == "des_der" || strEfecto == "des_izq") ? "h" : "v"
		this.direccion = (strEfecto == "des_der" || strEfecto == "des_inf") ? "-" : "+"
		this.reloj = false
		this.padre = objDesplegable.dom ? document.getElementById(strPadre) : objDesplegable.ie ? documentall[strPadre] : document.layers[strPadre]
		this.tabla = objDesplegable.dom ? document.getElementById(id + '_tab') : objDesplegable.ie ? document.all[id + '_tab'] : document.layers[id + '_tab']
		this.aniTimer = false
		this.open = false
		this.over = false
		this.startTime = 0
		this.gRef = "objDesplegable_"+id
		eval(this.gRef+"=this")
	
		this.contenedor = objDesplegable.dom ? document.getElementById(id + '_con') : objDesplegable.ie ? document.all[id + '_con'] : document.layers[id + '_con']
		this.contenido = objDesplegable.dom ? document.getElementById(id + '_cnt') : objDesplegable.ie ? document.all[id + '_cnt'] : document.layers[id + '_cnt']
		this.iframe = objDesplegable.dom ? document.getElementById(id + '_ifr') : document.all[id + '_ifr']
		this.styleCon = objDesplegable.ns4 ? this.contenedor : this.contenedor.style
		this.styleCnt = objDesplegable.ns4 ? this.contenido : this.contenido.style
		if (this.iframe) this.styleIfr = objDesplegable.ns4 ? this.iframe : this.iframe.style

		this.dim=300
		this.homePos = eval("0" + this.direccion + this.dim)

		if (objDesplegable.ns4) this.contenido.captureEvents(Event.MOUSEOVER | Event.MOUSEOUT);
		if (this.autoCierre) {this.contenido.onmouseover = new Function("var obj=objDesplegable.registro['" + this.id + "']; if (obj.open) { objDesplegable.abre('" + this.id + "');} if (obj.dependiente && obj.padre) {obj.padre.onmouseover();}; return false;")}
		if (this.autoCierre) {this.contenido.onmouseout = new Function("var obj=objDesplegable.registro['" + this.id + "']; objDesplegable.cierra('" + this.id + "'); if (obj.dependiente && obj.padre) { obj.padre.onmouseout(); }; return false;")}

		this.terminaDeslizamiento()
	}
}

objDesplegable.abre = function(id)
{
	var reg = objDesplegable.registro
	var obj = objDesplegable.registro[id]
	var p, p2

	// Dimension
	p=obj.tabla.offsetWidth
	p2=obj.tabla.offsetHeight

	obj.dim = obj.orientacion == "h" ? p : p2
	obj.homePos = eval("0" + obj.direccion + obj.dim)
	obj.outPos = 0
	if (obj.efecto=="ninguno") obj.aceleracion = 0.001
	else obj.aceleracion = (obj.outPos - obj.homePos) / objDesplegable.pasosAnimacion / objDesplegable.pasosAnimacion 
	obj.styleCon.zIndex = 100
	obj.styleCon.overflow = 'visible'
	obj.styleCon.clip = 'rect(0 ' + p + ' ' + p2 + ' 0)'
	
	obj.styleCnt.width = objDesplegable.ns4 ? p : p + "px"
	obj.styleCnt.height = objDesplegable.ns4 ? p2 : p2 + "px"
	obj.styleCnt.clip = 'rect(0 ' + p + ' ' + p2 + ' 0)'

	// Posicion
	if (obj.padre)
	{
		p=objDesplegable.leeOffset(obj.padre, 0)+obj.posX
		switch (obj.dirPadreX)
		{
			case "ali_der":
				p+=obj.padre.offsetWidth;
				break ;
			case "ali_cen":
				p+=Math.round(obj.padre.offsetWidth/2);
				break;
		}
		p2=objDesplegable.leeOffset(obj.padre, 1)+obj.posY
		switch (obj.dirPadreY)
		{
			case "ali_inf":
				p2+=obj.padre.offsetHeight;
				break ;
			case "ali_cen":
				p2+=Math.round(obj.padre.offsetHeight/2);
				break;
		}
	}
	else
	{
		p=obj.posX
		switch (obj.dirPadreX)
		{
			case "ali_der":
				p+=screen.width;
				break ;
			case "ali_cen":
				p+=Math.round(document.body.clientWidth/2);
				break;
		}
		p2=obj.posY
		switch (obj.dirPadreY)
		{
			case "ali_inf":
				p2+=screen.height;
				break ;
			case "ali_cen":
				p2+=Math.round(document.body.clientHeight/2);
				break;
		}
		if (self.pageYOffset)
		{
			p+=self.pageXOffset
			p2+=self.pageYOffset
		}
		else
		{
			p+=parseInt(document.body.scrollLeft)
			p2+=parseInt(document.body.scrollTop)
		}
	}

	switch (obj.dirX)
	{
		case "ali_der":
			p-=obj.tabla.offsetWidth;
			break ;
		case "ali_cen":
			p-=Math.round(obj.tabla.offsetWidth/2);
			break;
	}
	obj.styleCon.left = objDesplegable.ns4 ? p : p + "px"
	switch (obj.dirY)
	{
		case "ali_inf":
			p2-=obj.tabla.offsetHeight;
			break ;
		case "ali_cen":
			p2-=Math.round(obj.tabla.offsetHeight/2);
			break;
	}
	obj.styleCon.top = objDesplegable.ns4 ? p2 : p2 + "px"
	
	obj.over = true
	for (menu in reg) if (id != menu && objDesplegable.registro[menu].autoCierre) objDesplegable.esconde(menu)
	if (obj.reloj) { reg[id].reloj = window.clearTimeout(reg[id].reloj) }
	if (!obj.open && !obj.aniTimer) reg[id].iniciaDeslizamiento(true)

	if (obj.iframe && objDesplegable.ie) 
	{
		obj.styleIfr.top=obj.styleCon.top
		obj.styleIfr.left=obj.styleCon.left
		obj.styleIfr.width=obj.tabla.offsetWidth
		obj.styleIfr.height=obj.tabla.offsetHeight
	}
}

objDesplegable.cierra = function(id)
{
	var obj = objDesplegable.registro[id]
	if (obj.contenedor)
	{
		if (obj.reloj) window.clearTimeout(obj.reloj)
		obj.reloj = window.setTimeout("objDesplegable.esconde('" + id + "')", objDesplegable.retardo);
	}
}

objDesplegable.cierraTodo = function()
{
	var reg = objDesplegable.registro
	for (menu in reg)
	{
		objDesplegable.esconde(menu);
		if (menu.reloj) window.clearTimeout(menu.reloj);
	}
}

objDesplegable.esconde = function(id)
{
	var obj = objDesplegable.registro[id]
	
	obj.over = false
	if (obj.reloj) window.clearTimeout(obj.reloj)
	obj.reloj = 0
	if (obj.open && !obj.aniTimer) obj.iniciaDeslizamiento(false)
}

objDesplegable.prototype.iniciaDeslizamiento = function(open)
{
	this[open ? "onactivate" : "ondeactivate"]()
	this.open = open
	if (open) this.visibilidad(true)
	this.startTime = (new Date()).getTime() 
	this.aniTimer = window.setInterval(this.gRef + ".deslizamiento()", objDesplegable.minCPU)
}

objDesplegable.prototype.deslizamiento = function()
{
	var elapsed = (new Date()).getTime() - this.startTime
	if (elapsed > objDesplegable.pasosAnimacion) this.terminaDeslizamiento()
	else
	{
		var d = Math.round(Math.pow(objDesplegable.pasosAnimacion-elapsed, 2) * this.aceleracion)
		if (this.open && this.direccion == "-") d = -d
		else if (this.open && this.direccion == "+") d = -d
		else if (!this.open && this.direccion == "-") d = -this.dim + d
		else d = this.dim + d
		this.mueve(d)
	}
}

objDesplegable.prototype.terminaDeslizamiento = function()
{
	this.aniTimer = window.clearTimeout(this.aniTimer)
	this.mueve(this.open ? this.outPos : this.homePos)
	if (!this.open) this.visibilidad(false)
	if ((this.open && !this.over) || (!this.open && this.over)) this.iniciaDeslizamiento(this.over)
}

objDesplegable.prototype.visibilidad = function(blnVer)
{ 
	this.styleCon.visibility = blnVer ? "visible" : "hidden"
	if (this.styleIfr)
	{
		this.styleIfr.visibility = blnVer ? "visible" : "hidden"
		this.styleIfr.filter="gray() alpha(opacity=0)"
	}
}
objDesplegable.prototype.mueve = function(p)
{ 
	this.styleCnt[this.orientacion == "h" ? "left" : "top"] = objDesplegable.ns4 ? p : p + "px"
}

objDesplegable.prototype.onactivate = function() { }
objDesplegable.prototype.ondeactivate = function() { }

objDesplegable.leeOffset = function(obj, intDir)
{
	if (!obj) return(0)
	return((intDir?obj.offsetTop:obj.offsetLeft)+objDesplegable.leeOffset(obj.offsetParent, intDir))
}