///////////////////CascadedDropdown Menu/////////////////
 //Date : 08/09/2001                                   //
 //Version : 1.0                                       //
 //Author Mr.Arun N Kumar                              //
 //EMail: n_arunk@hotmail.com                          //        
 ///////////////////////////////////////////////////////
 // Modifications on this code is not recomended
 // Suggestions are welcome
 //-------------------------------------------------------
 //Modificada:Mayo 2007
 //Versión: 2.0
 //Autor: Juan Pedro
 //e-mail:jcancelo@smonica.com
 //
 //Cambios:
 //Cambio de la programación para utilizar la especificación oficial del DOM
 //el programa estaba hecho utilizando la propiedad children (y otras específicas de IE) que devuelve
 //un array de objetos con todos los nodos hijos. Esta propiedad es específica
 //de IE. Sólo le queda el esqueleto de lo que tenía 
 //Soporte para que la barra principal no tenga submenús y
 //pueda ejecutar acción directamente.
 //---------------------------------------------------------
 //Variables globales
 //---------------------------------------------------------
 var idOcultar = null   //identificador devuelto por setTimeout
 var tipoMenu = 'H' //H=Horizontal V=Vertical
 var oReglaBar = null  //Para no tener que cargarla cada vez que presento un men?
 var oReglaMenu = null
 var oReglaItem = null    //Para no tener que cargarla cada ver que presento un submen?
 var topActual = 0  //El top del men? actualmente visualizado
//Si quiero dejar el onload al JavaScript
 
 if (window.addEventListener) {
    window.addEventListener('load',InitMenu,false);
 }
 else if (window.attachEvent) {
    window.attachEvent('onload',InitMenu);
 }

 function InitMenu()
 {
    var nombreMenu = 'menubar'
    var objMenu = document.getElementById(nombreMenu)
    var oRegla = dameRegla('.menubar')
    oReglaBar = dameRegla('.bar')  //Para no tener que cargarla cada vez que presento un men?
    oReglaMenu = dameRegla('.menu')
    oReglaItem = dameRegla('.menuitem')    //Para no tener que cargarla cada ver que presento un submen?
    tipoMenu = isNaN(parseInt(oRegla.style.width))?'H':'V'
    var bar = objMenu.childNodes
    for(var i=0;i < bar.length;i++) {
        if (bar[i].id != null) {
            //Para que se despliegue el submen? de opciones
            bar[i].onmouseover = new Function("ShowMenu('"+bar[i].id+"')")
            bar[i].onmouseout = activarOcultar
            var nombreMenu = dameAtributo(bar[i],'menu')
            if (nombreMenu != null) {
                bar[i].style.cursor = 'default'
                var menu=document.getElementById(nombreMenu)
                menu.style.visibility = "hidden"
                var items = menu.childNodes
                for(var j=0; j<items.length; j++) {
                    if (items[j].id != null) {
                        var menuItem = document.getElementById(items[j].id)
                        menuItem.onmouseover = new Function("highlight('"+items[j].id+"')")
                        menuItem.onmouseout = activarOcultar
                        var nombreMenuItem = dameAtributo(menuItem,'menu') 
                        if(nombreMenuItem != null) {
                            FindSubMenu(nombreMenuItem)
                        }
                        var cmd = dameAtributo(menuItem,'cmd')
                        if(cmd != null) {
                            menuItem.onclick = new Function("Do('"+cmd+"')")
                        } 
                    }
                }            
            }
            else {
                bar[i].style.cursor = 'pointer';
                var cmd = dameAtributo(bar[i],'cmd')
                if(cmd != null) {
                    bar[i].onclick = new Function("Do('"+cmd+"')")
                } 
            }
        }    
        
    }  
 }
 
 function FindSubMenu(id)
 {
    var menu=document.getElementById(id)
    menu.style.visibility = "hidden"
    var items = menu.childNodes
    for(var j=0; j<items.length; j++) {
        if (items[j].id != null) {
            var menuItem = document.getElementById(items[j].id)
            menuItem.onmouseover = new Function("highlight('"+menuItem.id+"')")
            menuItem.onmouseout = activarOcultar
            var nombreMenu = dameAtributo(menuItem,'menu')
            if(nombreMenu != null) {
                FindSubMenu(nombreMenu)
            }
            var cmd = dameAtributo(menuItem,'cmd')
            if(cmd != null)  {
                menuItem.onclick = new Function("Do('"+cmd+"')")
            } 
        }
    }  
 } 
 
 function ShowMenu(id)
 {
    //desactivar el sistema de ocultar el menú, que se volverá a activar cuando abandone la opción
    desactivarOcultar()
    //saber qué menú de la barra es
    var posOrdenMenu = id.lastIndexOf('_')
    var ordenMenu = parseInt(id.substr(posOrdenMenu+1,1))
    var objBarra = document.getElementById('menubar')
    HideMenu(objBarra)
    var bar = document.getElementById(id) 
    var nombreMenu = dameAtributo(bar,'menu')
    if (nombreMenu != null) {
        var menu = document.getElementById(nombreMenu)
        //Averiguo el top del menú de barra para calcular a partir de él el top del desplegado
        var aPosBarra = findPos(objBarra)
        //Array para el top,left del desplegable
        var aPos = [aPosBarra[0],0]
        //Necesito saber las medidas de la clase (estilo) .bar para poder situarme en el documento
        if (oReglaBar) {
            var anchoMenu = 0
            var anchoBar = 0
            var altoMenu = 0
            anchoBar = dameAnchoCaja(oReglaBar.style)
            if (tipoMenu == 'H') {
                aPos[0] += dameAltoCaja(oReglaBar.style);
                aPos[1] = anchoBar*(ordenMenu-1)
                aPos[1] += aPosBarra[1]
                anchoMenu = dameAnchoCaja(oReglaMenu.style)
                //Para que si est? a la derecha del todo y el men? se sale del ?rea de visualizaci?n, lo coloque hacia izquierda
                if (aPos[1] + anchoMenu > document.body.clientWidth) {
                    aPos[1] -= (anchoMenu - anchoBar)     
                }
            }
            else {
                aPos[0] += dameAltoCaja(oReglaBar.style)*(ordenMenu-1)
                aPos[1] += anchoBar
                aPos[1] += aPosBarra[1]
                //Para que si se sale por la parte de abajo, se muestre hacia arriba
                altoMenu = dameAltoCaja(oReglaItem.style)
                altoMenu *= dameNumero(dameAtributo(menu,'numopc'))-1
                if (aPos[0] + altoMenu > document.body.clientHeight) {
                    aPos[0] -= altoMenu
                }
            }
        }
        topActual = aPos[0]
        menu.style.top = aPos[0] + 'px'
        menu.style.left = aPos[1] + 'px'
        menu.style.visibility = "visible"
        
    }
 }
 
 function ShowSubMenu(id)
 {
    /*
    saber qu? men? de la barra es (n? de orden). Es posible por la forma en la que son nombrados.
    Con esto puedo evitar el tener distintos m?todos segun sea FireFox o IE
    */
    
    var posOrdenMenu = id.lastIndexOf('_')
    var ordenMenu = parseInt(id.substr(posOrdenMenu+1,1))
    var obj = document.getElementById(id)
    var PMenu = document.getElementById(obj.parentNode.id)
    var nombremenu = dameAtributo(obj,'menu')
    if(nombremenu != null) {
        var menu = document.getElementById(nombremenu)
        var aPos = findPos(PMenu)
        if (oReglaItem) {
            var anchoMenu = 0
            if (tipoMenu == 'H') {
                aPos[0] += dameAltoCaja(oReglaItem.style)*(ordenMenu-1)
                anchoMenu = dameAnchoCaja(oReglaMenu.style)
                aPos[1] += anchoMenu 
                if (aPos[1] + anchoMenu > document.body.clientWidth) {
                    aPos[1] -= (anchoMenu*2)
                }
            }
            else {
                aPos[0] = 0 //Para usar el topActual que ya tenemos calculado
                aPos[0] += topActual + dameAltoCaja(oReglaItem.style)*(ordenMenu-1)
                aPos[1] += dameAnchoCaja(oReglaMenu.style)
            }
        }
        menu.style.visibility = "visible"
        menu.style.top = aPos[0]+'px'
        menu.style.left = aPos[1]+'px'
    }
  } 
 
   
 function highlight(id)
 {
    var obj = document.getElementById(id)
    desactivarOcultar()
    var elements = obj.parentNode.childNodes
    for(var i=0;i<elements.length;i++) {
        if (elements[i].id != null) {
            var nombreSubMenu = dameAtributo(elements[i],'menu')
            if (elements[i].id != id) {
                elements[i].className = "menuitem"
                if (nombreSubMenu != null) {
                    var menu = document.getElementById(nombreSubMenu)
                    menu.style.visibility = "hidden"                 
                    HideHijos(menu)
                }
            }
            else {
                obj.style.cursor = nombreSubMenu==null?'pointer':'default'
            }
        }
    } 
    window.defaultStatus = obj.title
    if (dameAtributo(obj,'menu') != null) {
        ShowSubMenu(id)
    }
 }
   
 function Do(cmd)
 {
    if (cmd != null) {    
        window.location.assign(cmd)
        //var ejecuta = new Function("",cmd);
        //ejecuta();
    }
 }
   
 function HideMenu(obj)
 {
    if (arguments.length == 0) {
        obj = document.getElementById('menubar')
    }    
    var child = obj.childNodes
    for(var j =0;j<child.length;j++) {
        if (child[j].id != null){
            var nombreMenu = dameAtributo(child[j],'menu')
            if(nombreMenu != null) {
                var childMenu = document.getElementById(nombreMenu)
                var childMenuMas = childMenu.childNodes
                var hayMenuMas = 0
                for (var n = 0;n < childMenuMas.length;n++) {
                    if (childMenuMas[n].id != null) { 
                        hayMenuMas++
                    }
                }
                if(hayMenuMas > 0) {
                    HideMenu(childMenu)
                }
                childMenu.style.visibility = "hidden" 
            }
        }
    }
 }
 function HideHijos(obj)
 {
    var child = obj.childNodes
    for (var i=0;i < child.length;i++) {
        if (child[i].id != null) {
            var nombreMenu = dameAtributo(child[i],'menu')
            if(nombreMenu != null) {
                var childMenu = document.getElementById(nombreMenu)
                HideHijos(childMenu)
                child[i].style.visibility = "hidden"
            }
        }
    }
 }

/*
    Ocultar el men? si estamos m?s de 1 seg con el rat?n fuera del men?. Se ejecuta en el onmouseout de la opci?n
*/ 
function activarOcultar()
{
    idOcultar = window.setTimeout("HideMenu()",1000)
}
/*
    Desactivar la ocultaci?n del men?. Se ejecuta cuando una opci?n recibe el foco
*/
function desactivarOcultar()
{
    if (idOcultar != null) {
        window.clearTimeout(idOcultar)
        idOcultar = null
    }
} 
//-----------------------------------------------------
// Funciones necesarias para que el c?digo sea igual para FireFox que para IE
//-----------------------------------------------------
/*
    Para obtener un atributo de un objeto, si el objeto no tiene atributo devuelve null
    Necesaria porque Mozilla no puede acceder a los atributos no estandar a traves de obj.atributo
 */
function dameAtributo(obj,atributo)
{
    var valor = null
    var atributos = obj.attributes.getNamedItem(atributo)
    if (atributos) {
        valor = atributos.nodeValue
    }
    return valor
 }
 
/*
    Busca la posici?n del top y left de un determinado objeto y la devuelve como un array
    [top,left]
*/ 
function findPos(obj)
{
    var curLeft = curTop = 0
    if (obj.offsetParent) {
        curTop = obj.offsetTop
        curLeft = obj.offsetLeft
        while (obj = obj.offsetParent) {
            curTop += obj.offsetTop
            curLeft += obj.offsetLeft
        }
    }
    return [curTop,curLeft]
 }
 
 /*
    Busca la regla de cierto nombre mirando todas las hojas de estilo de la p?gina.
    Si la encuentra devuelve el objeto y sino devuelve false
 */
function dameRegla(nombreRegla)
{
    var cssRegla = false
    var objHojas = null
    var objHojaActual = null
    var objReglas = null
    var acabo = false
    objHojas = document.styleSheets
    for (var n = 0;n < objHojas.length;n++) {
        objHojaActual = objHojas[n]
        var i = 0
        objReglas = objHojaActual.cssRules?objHojaActual.cssRules:objHojaActual.rules
        while (acabo == false && i < objReglas.length) {
            cssRegla = objReglas[i]
            if (cssRegla.selectorText == nombreRegla) {
                acabo = true
            }
            i++
        }
        if (acabo == true) {
            n = objHojas.length
        }
    }
    return cssRegla
}

/*
    Para obtener el valor num?rico de un borde left o borde right... aunque no est?n definidas, en cuyo caso
    devuelve 0
*/
function dameNumero(xValor)
{
    numero = 0
    numero = parseInt(xValor)
    if (isNaN(numero)){
        numero = 0
    }
    return numero
}

/*
    Para calcular el alto de una caja contenedora en base al estilo utilizado
*/

function dameAltoCaja(oStyle)
{
    var alto = 0;
    alto = dameNumero(oStyle.borderTopWidth)+dameNumero(oStyle.borderBottomWidth);
    alto += dameNumero(oStyle.paddingTop) + dameNumero(oStyle.paddingBottom);
    alto += dameNumero(oStyle.marginTop) + dameNumero(oStyle.marginBottom);
    alto += Math.max(dameNumero(oStyle.lineHeight),dameNumero(oStyle.height));
    return alto;
}

function dameAnchoCaja(oStyle)
{
    var ancho = 0;
    ancho = dameNumero(oStyle.borderLeftWidth)+dameNumero(oStyle.borderRightWidth);
    ancho += dameNumero(oStyle.paddingLeft) + dameNumero(oStyle.paddingRight);
    ancho += dameNumero(oStyle.marginLeft) + dameNumero(oStyle.marginRight);
    ancho += dameNumero(oStyle.width);
    return ancho;
}

