﻿//Objetos
//

var objAnt = null;
var objAbierto = null;

function AlternaVisibilidad(aNode)
{
    aNode.style.visibility = (aNode.style.visibility == "visible") ? "hidden" : "visible";
    aNode.style.display = (aNode.style.display == "block") ? "none" : "block";
}

function NodoEsAncestro(aNode, aAncestorNode)
{
    var myReturnResult = false;

    if ((aNode != null) && (aNode.parentNode != null) && (aAncestorNode != null))
    {
        myReturnResult = (aNode.parentNode.id == aAncestorNode.id);
        
        if (!myReturnResult)
            myReturnResult = NodoEsAncestro(aNode.parentNode, aAncestorNode);
    }
    
    
    return myReturnResult;
}

function EsNivel0Nodo(aNode)
{
    return ((aNode != null) && (aNode.parentNode != null) && (aNode.parentNode.parentNode != null)
        && (aNode.parentNode.parentNode.id == 'menuAvalora'))
}

function EncuentraYCierraNivel0Nodo(aNode)
{
    var myLevel0Node = EncuentraNivel0Nodo(aNode);
    
    if (myLevel0Node != null)
        AlternaVisibilidad(myLevel0Node);
}

function EncuentraNivel0Nodo(aNode)
{   
    var myLevel0Node = null;

    if ((aNode != null) && (aNode.parentNode != null) && (aNode.parentNode.parentNode != null))
    {
        if (aNode.parentNode.parentNode.id == 'menuAvalora')
            myLevel0Node = aNode;
        else
            myLevel0Node = EncuentraNivel0Nodo(aNode.parentNode);
    }
    
    return myLevel0Node;
}

function NodosEnMismoNivel0Nodo(aFirstNode, aSecondNode)
{
    var myFirstLevel0Node = EncuentraNivel0Nodo(aFirstNode);
    var mySecondLevel0Node = EncuentraNivel0Nodo(aSecondNode);
    
    return ((myFirstLevel0Node != null) && (mySecondLevel0Node != null)
        && (myFirstLevel0Node.id == mySecondLevel0Node.id));
}



//Funcion que oculta o muestra el menu
function Open(ValorOpen)
{   
    //Retrocede al UL padre
    var objOpen = ValorOpen.parentNode.getElementsByTagName('UL')[0];
    
    
    if ((objAbierto != null))
    {
        //si objAbierto.id == objOpen.id el usuario quiere cerrar el menu abierto
        //y no tenemos que hacer nada
        if (objAbierto.id == objOpen.id)
            objAbierto = null;
        else
        {
            //si objAbierto es el ancestro de objOpen no debemos cerrar objAbierto
            if (NodoEsAncestro(objOpen, objAbierto))
            {
                objAbierto = objOpen;
            }
            //si objOpen es el ancestro de objAbierto, tenemos que cerrar objAbierto
            //y poner null en objAbierto, porque objOpen se va a cerrar también
            else if (NodoEsAncestro(objAbierto, objOpen))
            {
                //cerramos objAbierto
                AlternaVisibilidad(objAbierto);
                //objOpen se va a cerrar
                objAbierto = null;
            }
            else
            {
                //cerramos objAbierto
                AlternaVisibilidad(objAbierto);
                
                //si objAbierto no es menu de nivel 0 y si objOpen y objAbierto no tienen
                //el mismo ancestro de nivel 0, tenemos que encontrar node de nivel 0 y 
                //cerrarlo
                if (!EsNivel0Nodo(objAbierto) && !NodosEnMismoNivel0Nodo(objOpen, objAbierto))
                    EncuentraYCierraNivel0Nodo(objAbierto);
                
                objAbierto = objOpen;
            }
        }
    }    
    else
        objAbierto = objOpen;
    
    AlternaVisibilidad(objOpen);
}

//Funcion que, inicialmente, oculta todos los hijos y, despues, oculta todos menos el marcado
function oculta(valor, ValorOpen)
{ //valor = Raiz de ULs; ValorOpen = UL que NO ocultamos
  if (valor == ValorOpen)
  {
    ValorOpen = '';
  }

  var abuelos = document.getElementById(valor).childNodes;
  //Recorre los hijos del menuAvalora
  for (i=0 ;i<abuelos.length;i++)
  {
    if (abuelos[i].tagName == 'LI')
    {
      padres = abuelos[i].childNodes;
      for (j=0 ;j<padres.length;j++)
      {
        if (padres[j].tagName == 'UL' && padres[j].id != ValorOpen)
        {//Tiene nivel 2
          padres[j].style.visibility = "hidden";
	 	      padres[j].style.display = "none";
	 	      
          hijos = padres[j].childNodes;
          for (k=0 ;k< hijos.length;k++)
          {
            if (hijos[k].tagName == 'LI')
            {
              nietos = hijos[k].childNodes;
              for (l=0 ;l<nietos.length;l++)
              {
                if (nietos[l].tagName == 'UL' && nietos[l].id != ValorOpen)
                {//Tiene nivel 3
                  nietos[l].style.visibility = "hidden";
                  nietos[l].style.display = "none";
                }  
              }
            }
          }
        }
      }
    }
  }
}