// VER EXPLICACION Y TROUBLESHOOT EN menutopEXPLICADO.txt
var zInd = 300;
var encima=0;
var menutoptimeout = 2000;
var	resizetime = 400
var	cerrarTime = 200
var delayInicial = 400
var arrMenus = new Array()
var menutopsub = 0;
var cur_lyr;	// holds id of currently visible layer
var creadoArrMenus = false
var ultimaAccionAbriendo = 0;
var cssDefaultRule = "menu_top";
var derecha=1
var abajo=1
var forzarSentidoH=-1
var deInmediato=0
var forzarH = 0
var forzarW = 0

function crearMenu(id){
	this.id = id
	this.imgName = false
	this.papa = false
	this.botonW = false
	this.botonH = false
	this.visible = false
	this.efecto = true
	this.initFunction = false
	this.returnFunction = false
	this.currentSize = 0
}
function menutopsubmenu(id, imgName, botonW, botonH, papa, tmpForzar) {
	if (!creadoArrMenus){
	// Crear array de menus desde el principio
		cbs=document.getElementsByTagName('div');
		for(c=0;c<cbs.length;c++) {
			f_id = (cbs[c].id);
			if (f_id.indexOf('menu_')>-1){
				arrMenus[f_id] = new crearMenu(f_id)
			}
		}
		creadoArrMenus = true
	}
	if (papa){ 
		if (!arrMenus[papa].visible){// Esto tiene que ver con error de firefox que deja menu padre abierto per semper
			arrMenus[papa].visible = true
			return false;
		}
	}
	if (typeof tmpForzar == 'undefined') forzarSentidoH = -1
	else derecha=forzarSentidoH=tmpForzar
	// Para mantener un submenú abierto y cerrar sus hijos, llamar menutopsubmenu(id)
	if (typeof imgName== 'undefined'){
		imgName = arrMenus[id].imgName 
		pegadoA = arrMenus[id].pegadoA 
		papa = arrMenus[id].papa 
		botonW = arrMenus[id].botonW 
		botonH = arrMenus[id].botonH 
	}
	encima=id
	a=id
	var b
	var c
	if (imgName){
		c=imgName.toString()
	}else{
		c=false		
	}	
	tmpDelay = deInmediato ? 0 : delayInicial
	deInmediato = 0
	if (papa){
		b = papa.toString()
		setTimeout("menutopsubmenuB('" + a + "','" + c + "'," + botonW + "," + botonH + ",'" + b + "')",(tmpDelay));
	}else{
		setTimeout("menutopsubmenuB('" + a + "','" + c + "'," + botonW + "," + botonH  + ")",(tmpDelay));
	}
}
function menutopsubmenuB(id, imgName, botonW, botonH, papa) {
	if (encima!=id) return false
	menutopsub=1
	divhija = document.getElementById(id)
	if (id==cur_lyr) {
		forzarW=0
		forzarH=0
		return false
	}else if (!papa){
		// Es abrir menu principal, as+i es que supuestamente cerrar todo lo demás
		menutopsub=0
		if (forzarSentidoH==-1)derecha=1
		abajo=1
		if(!arrMenus[id]) {
			alert ("no existe el menú  "+id)
			return false
		}
		arrMenus[id].visible = true
		tmpFun = arrMenus[id].initFunction
		if (typeof tmpFun == 'function') tmpFun()
		var menu
		for (menu in arrMenus){
			// Cerrar todo menu VISIBLE pues este es principal y debe ser el único a la vista
			if (menu!=id && arrMenus[menu].visible) cerrarHijos(menu)
		}
	}else{
		// Es abrir un SUBMENU
		// Buscar ascendientes
		tmplyr = papa
		strPapas=''
		while(tmplyr){
			// Uno de los papás se está cerrando, entonces no abrir...
			if (!arrMenus[tmplyr].visible) return false
			tmplyr = document.getElementById(tmplyr)
			strlyrpapa = tmplyr.getAttribute('papa')
			arrMenus[id].imgName = imgName
			arrMenus[id].papa = papa
			arrMenus[id].botonW = botonW
			arrMenus[id].botonH = botonH
			if (strlyrpapa==0){
				tmplyr=false
			}else{
				tmplyr=strlyrpapa;		
				strPapas += strlyrpapa+',';
			}
		}			
		for (menu in arrMenus){
			// Cerrar todo menu que no sea parte de sus PAPAS
			if (menu!=id && arrMenus[menu].visible && menu!=papa){
				if (strPapas.indexOf(menu+',')<0) cerrarHijos(menu)
			}
		}
		if(!arrMenus[id]) {
			alert ("no existe el submenú "+id)
			return false
		}
		arrMenus[id].visible = true
		divhija.setAttribute('papa',papa);
		divpapa = document.getElementById(papa)
		divpapa.setAttribute('hija',id);
	}
	cur_lyr = id
//	alert(imgName+id+botonW+botonH)
	menutop(id, imgName, botonW, botonH)
	return true
}
	


function cerrarHijos(id){
	hideLayer(id);
		while(id){
			tmplyr = document.getElementById(id)
			strlyrpapa = tmplyr.getAttribute('hija')
			tmplyr.setAttribute ('hija','0')
			if (strlyrpapa==0){
				id=false
			}else{
				id=strlyrpapa;		
				hideLayer(id);
			}
		}				
}


function menutop(id, imgName, botonW, botonH) {
	// botonW es el ancho a respetar para el botón que abre el menú. Si es 0, se toma el ancho de la imagen del HOver
	// botonH, idem
	var reset_encima
	if (encima) reset_encima = 1 
	if (id) {
		if (cur_lyr !=  id) {
			encima=0;
		}
	}
	if (reset_encima) encima = 1
	if (!id || !imgName){
		return false;
	}

	var lyr = document.getElementById(id);	
	var alinearConMouse = false;
	if (lyr){			
		// Posición donde se abrirá
		if (imgName!='false') {
			// Posicionar con respecto a objeto
			if ((img=MM_findObj(imgName))==null){
				alert('No aencontró objeto '+imgName)
				return false;
			}
			var ypos = findPosY(img)
			var xpos = findPosX(img)
		}else{
			// Posicionar con respecto a mouse
			alinearConMouse = true
			var xpos = mouseX
			var ypos = mouseY
		}
	}else{
		alert('No existe '+id+'_parent')
		return false;
	}
	cur_lyr = id;
	// ====================================
	// ====================================
	var lista_cantidad = 0
	var ul_id
	var mistylesheet = 'css_menutop';
		// DETERMINAR CANTIDAD DE ELEMENTOS DE LISTA EN EL MENÚ
		if (lyr.childNodes.length){
			children = lyr.childNodes
				for (i=0;i<children.length;i++){
				// EVALUAR CADA NODO DENTRO DEL LAYER TRABAJAR CON ÉL
				// AJUSTAR POSICIÓN DEL MENÚ
					if (children[i].nodeName=='UL'){
						ul = children[i]
						// Obtiene id del UL que a su vez nos da el style 
						ul_id = ul.id
					// Si la lista tiene nodos
						if (ul.childNodes.length){
							children_ul = ul.childNodes
							for (ii=0;ii<children_ul.length;ii++){
								if (children_ul[ii].nodeName=='LI'){
									lista_cantidad += 1;
								}
							}
						}
					}
				}
		}

			var sslen = document.styleSheets.length;
			if (sslen<0){
				alert("error en menutop.js -> no hay styleSheets")
			}
			var css = false;
			for (i=0; i<(sslen);i++ ){
				if (document.styleSheets[i].title==mistylesheet){
					css = document.styleSheets[i];
				}
			}
			if (!css){
				if (browsername=="NS" || browsername=="MSIE" ){
					alert('El css que contiene los estilos del menú debe tener title = '+mistylesheet)
				}
				return false;
			}
			var regla_existe_1 = false;
			var regla_existe_2 = false;
			var altura_item = false;
			var altura_paddingtop = false;
			var altura_paddingbottom = false;
			var altura_bordertop = false;
			var altura_borderbottom = false;
			var altura_margintop = false;
			var altura_marginbottom = false;

	if (browsername=="NS"){		
		// EVALUAR STYLE SHEET
			for (i=0;i<css.cssRules.length ; i++ ){									
				rule_selector = css.cssRules[i].selectorText; // Todo lo que hay antes del corchete de la regla Ej #tabla_desplegable li,  li a
				// Buscar heigth de la regla que define style de los elementos del menú (ul)
				if (rule_selector.indexOf(id)>0){
					if (css.cssRules[i].style.width){
						ancho_total_menu = parseFloat(css.cssRules[i].style.width)
					} 
					regla_existe_1 = true
				}else if (rule_selector.indexOf(cssDefaultRule)>0){
					if (css.cssRules[i].style.width){
						ancho_total_menu = parseFloat(css.cssRules[i].style.width)
					} 
					regla_existe_1 = true
				}
				if (rule_selector.indexOf(ul_id)>0){
					//alert (rule_selector)
					regla_existe_2 = true
				// HEIGHT
					if (css.cssRules[i].style.height && !altura_item){
						//alert(css.cssRules[i].selectorText)								
						//alert("___________>"+css.cssRules[i].style.height)		
						altura_item = parseFloat(css.cssRules[i].style.height);
					}
				// PADDING-TOP
					if (css.cssRules[i].style.paddingTop && !altura_paddingtop){
						altura_paddingtop = parseFloat(css.cssRules[i].style.paddingTop);
					}
				// PADDING-BOTTOM
					if (css.cssRules[i].style.paddingBottom && !altura_paddingbottom){
						altura_paddingbottom = parseFloat(css.cssRules[i].style.paddingBottom);
					}

				// BORDER-TOP
					if (css.cssRules[i].style.borderTop && !altura_bordertop){
						altura_bordertop = parseFloat(css.cssRules[i].style.borderTop);
					}
				// BORDER-bottom
					if (css.cssRules[i].style.borderBottom && !altura_borderbottom){
						altura_borderbottom = parseFloat(css.cssRules[i].style.borderBottomWidth);
					}
				// MARGIN-TOP
					if (css.cssRules[i].style.marginTop && !altura_margintop){
						altura_margintop = parseFloat(css.cssRules[i].style.marginTop);
					}
				// MARGIN-bottom
					if (css.cssRules[i].style.marginBottom && !altura_marginbottom){
						altura_marginbottom = parseFloat(css.cssRules[i].style.marginBottom);
					}
				}
			}
		// CONTROL DE ERRORES
			if(!regla_existe_1){
				alert ('En la primera definición del STYLESHEET debería estar incluido #'+id);
				return false;			
			}
			if(!regla_existe_2){
				alert ('No existe una regla en el stylesheet para la tabla del menú llamada '+ul_id);
				return false;			
			}
			if(!altura_item){
				alert ('No está determinado el HEIGHT de la regla de estilo '+ul_id+' en el stylesheet ->'+mistylesheet);
				return false;			
			}
			// Calculada cantidad de elementos del menú, reestablecemos altura de lyr con lo cual los layers invisibles iz y der también se agrandan
			altura_item += altura_paddingtop + altura_paddingbottom + altura_bordertop+altura_borderbottom+altura_margintop+altura_marginbottom;
			altura_total_menu = lista_cantidad * altura_item;
			// Corrección especial para FIREFORX si menu_x tiene borde (establecido en primera regla del css)
			ypos += 2
	}else if (browsername=="MSIE"){	
	// INTERNET EXPLORER
		// EVALUAR STYLE SHEET
			for (i=0;i<css.rules.length ; i++ ){
				rule_selector = css.rules[i].selectorText; // Todo lo que hay antes del corchete de la regla Ej #tabla_desplegable li,  li a
				// Buscar heigth de la regla que define style de los elementos del menú (ul)
				if (rule_selector.indexOf(id)>0){
					if (css.rules[i].style.width){
						ancho_total_menu = parseFloat(css.rules[i].style.width)
					} 
					regla_existe_1 = true
				}else if (rule_selector.indexOf(cssDefaultRule)>0){
					if (css.rules[i].style.width){
						ancho_total_menu = parseFloat(css.rules[i].style.width)
					} 
					regla_existe_1 = true
				}
				if (rule_selector.indexOf(ul_id)>0){
					//alert (rule_selector)
					regla_existe_2 = true
				// HEIGHT
					if (css.rules[i].style.height && !altura_item){	
						altura_item = parseFloat(css.rules[i].style.height);
					}
				// PADDING-TOP
					if (css.rules[i].style.paddingTop && !altura_paddingtop){
						altura_paddingtop = parseFloat(css.rules[i].style.paddingTop);
					}
				// PADDING-BOTTOM
					if (css.rules[i].style.paddingBottom && !altura_paddingbottom){
						altura_paddingbottom = parseFloat(css.rules[i].style.paddingBottom);
					}

				// BORDER-TOP
					if (css.rules[i].style.borderTop && !altura_bordertop){
						altura_bordertop = parseFloat(css.rules[i].style.borderTopWidth);
						//alert("altura_bordertop"+altura_bordertop)								
					}
				// BORDER-bottom
					if (css.rules[i].style.borderBottom && !altura_borderbottom){
						altura_borderbottom = parseFloat(css.rules[i].style.borderBottomWidth);
					}
				// MARGIN-TOP
					if (css.rules[i].style.marginTop && !altura_margintop){
						altura_margintop = parseFloat(css.rules[i].style.marginTop);
					}
				// MARGIN-bottom
					if (css.rules[i].style.marginBottom && !altura_marginbottom){
						altura_marginbottom = parseFloat(css.rules[i].style.marginBottom);
					}
				}
			}

		// CONTROL DE ERRORES
			if(!regla_existe_1){
				//alert ('En la primera definición del STYLESHEET debería estar incluido #'+id);
				//return false;			
			}
			if(!regla_existe_2){
				alert ('No existe una regla en el stylesheet para la tabla del menú llamada '+ul_id);
				return false;			
			}
			if(!altura_item){
				alert ('No está determinado el HEIGHT de la regla de estilo '+ul_id+' en el stylesheet ->'+mistylesheet);
				return false;			
			}
			// Calculada cantidad de elementos del menú, reestablecemos altura de lyr con lo cual los layers invisibles iz y der también se agrandan
			altura_item += altura_paddingtop + altura_paddingbottom + altura_bordertop+altura_borderbottom+altura_margintop+altura_marginbottom;
			altura_total_menu = lista_cantidad * altura_item;
	}
	if (forzarW) ancho_total_menu = forzarW
	if (forzarH) altura_total_menu = forzarH
	forzarW=0
	forzarH=0
	if (!alinearConMouse){
		// AJUSTAR POSICIÓN X
		xpos += botonW
		var xsobra = (menutopsub) ? document.body.clientWidth - (xpos + ancho_total_menu+ancho_total_menu) : document.body.clientWidth - (xpos + ancho_total_menu)	
		ypos += botonH
		var ysobra = document.body.clientHeight - (ypos + altura_total_menu)	
		if (xsobra > 0 && derecha) {
			xpos = (menutopsub) ? xpos  + ancho_total_menu : xpos
		}else{	
			derecha = 0
			xpos -= ancho_total_menu
		}
		if (ysobra < 0 || !abajo) {
			ypos -= altura_total_menu-altura_item
		}			
	}
	lyr.style.top = ypos 
	lyr.style.left = xpos 
	lyr.style.height = altura_total_menu
	lyr.style.width = ancho_total_menu
	showLayer(id)
}
	
	
function findPosX(obj)
{
	var x=1
	var curleft = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curleft += obj.offsetLeft
			obj = obj.offsetParent;
			x++
		}
	}
	return curleft;
}

function findPosY(obj)
{
	var curtop = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curtop += obj.offsetTop
			obj = obj.offsetParent;
		}
	}
	else if (obj.y)
		curtop += obj.y;
	return curtop;
}

var zInd = 300;
function cerrarMenu(id,idAccion){
	if (ultimaAccionAbriendo!=idAccion) return false
	if (encima){
	   var speed = Math.round(resizetime / 100);
		timer = cerrarTime
		setTimeout("cerrarMenu('" + id + "'," + idAccion + ")",(timer * speed));
		return false
	} 
	while (!encima && ultimaAccionAbriendo==idAccion){
		for (menu in arrMenus){
			// Cerrar todo menu que no sea parte de sus PAPAS
			if (arrMenus[menu].visible ){
				cerrarHijos(menu)
			}
		}
		ultimaAccionAbriendo=0
		cur_lyr=0
	}
}
function showLayer(id) {
  var lyr = getElemRefs(id);
  enviarAlFrente(id);
  if (!arrMenus[id].efecto)arrMenus[id].currentSize = parseFloat(lyr.style.height) - 1
  resizelayera(id,arrMenus[id].currentSize,lyr.style.height)
}
function resizelayera(id,alturaInicial,alturaFinal){
	alturaInicial = parseFloat (alturaInicial)
	alturaFinal = parseFloat (alturaFinal)
	lyr = document.getElementById(id)
     //speed for each frame
    var speed = Math.round(resizetime / 100);
    var timer = 0;
    //determine the direction for the blending, if start and end are the same nothing happens
	// iDaCCION Me permite identificar cuando la acción debe ser abortada porque una nueva esta en curso...
	var idAccion = Math.random()*1000
	// Cerrar
	lyr.idAccion = idAccion
    if(alturaInicial > alturaFinal) {
        for(i = alturaInicial; i >= alturaFinal; i--) {
            setTimeout("resizelayerb(" + i + ",'" + id + "'," + idAccion + ")",(timer * speed));			
            timer++;
        }
		//setTimeout("hideLayerB('"+id + "')",(timer * speed));			
	// Abrir		
    } else if(alturaInicial < alturaFinal) {
        for(i = alturaInicial; i <= alturaFinal; i++)
            {
            setTimeout("resizelayerb(" + i + ",'" + id + "'," + idAccion + ")",(timer * speed));
            timer++;
        }
		timer += cerrarTime
		ultimaAccionAbriendo = idAccion
		setTimeout("cerrarMenu('" + id + "'," + idAccion + ")",(timer * speed));

    }  
}

function resizelayerb(altura,id,idAccion){
	lyr = document.getElementById(id)
	if (idAccion != lyr.idAccion) return false
  	lyr.css.visibility = "visible";	
	lyr.style.height = altura
	if(altura==0 && arrMenus[id].currentSize>0){
		lyr.css.visibility = "hidden";			
		tmpFun = arrMenus[id].returnFunction
		if (typeof tmpFun == 'function') tmpFun()
	}
	arrMenus[id].currentSize = altura
}
function hideLayer(id) {
	if(!id) return false
	arrMenus[id].visible = false
	lyr = document.getElementById(id)
	if (!arrMenus[id].efecto)arrMenus[id].currentSize= 1
	resizelayera(id,arrMenus[id].currentSize,0)  
}
function getElemRefs(id) {
	var el = (document.getElementById)? document.getElementById(id): (document.all)? document.all[id]: (document.layers)? document.layers[id]: null;
	if (el) el.css = (el.style)? el.style: el;
	return el;
}
function enviarAlFrente(theDiv) {
	theDiv = document.getElementById(theDiv)
	theDiv.style.zIndex = zInd; 
	zInd++;
}

