/* 
 * Metodo que permite controlar la aparicion de distintos tipos de menu
 * dinamico (con JavaScript) utilizados bajo proxia cms.
 *
 * @author $Author: rruano $
 * @version $Revision: 1.1.2.1.2.1.4.2.2.2 $
 * @since Proxia CMS 4.0
 * @copy Divisa Informatica y Telecomunicaciones S.A.
 */


/* Funciones para mostrat y ocultar capas */
// Funciona con navegadores iexplorer 5 y Netscape 6
// (no ha sido probado con iexplorer4 pero es posible q funcione)


/** FUNCIONES PARA CAPTURAR EL MOVIMIENTO DEL RATON **/
var mouseX = 0;
var mouseY = 0;

//detectamos si es Nestcape porque la captura de eventos es distinta
var isNS = (navigator.appName.indexOf("Netscape") >= 0 &&
                parseFloat(navigator.appVersion) >= 4) ? 1 : 0;

function getMousePosition(e) {

  //la posición se va a desplazar un par de pixels
  var mousePos = new Array();
  
  if (isNS) {
    mousePos[0] = e.pageX + 2;
    mousePos[1] = e.pageY - 2;
  }
  else {
    mousePos[0] = event.clientX + document.body.scrollLeft + 2;
    mousePos[1] = event.clientY + document.body.scrollTop - 2;
  }
  return mousePos;
  
}


/**
 * Coordenada X de un objeto
 */
function findPosX(obj)
{
 var curleft = 0;
 if (obj.offsetParent)
 {
  while (obj.offsetParent)
  {
   curleft += obj.offsetLeft
   obj = obj.offsetParent;
  }
 }
 else if (obj.x)
  curleft += obj.x;
 return curleft;
}

/**
 * Coordenada Y de un objeto
 */

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;
}

/**
 * Esta función permite desplegar el menú vertical asociado a un determinado elemento
 * de primer nivel para su correcta visualización en el sistema.
 */
function showMenu(menuId) {
    var _menu = document.getElementById(menuId);
    if(_menu == undefined) return;

    var _parent;
    var _mainParent;
    if (_menu.parentElement){
        _parent = _menu.parentElement;
        _mainParent = _parent.parentElement;
    }else{
        _parent = _menu.parentNode;
        _mainParent = _parent.parentNode;
    }

    var allChilds = _mainParent.childNodes;

    for(i = 0;i<allChilds.length;i++) {
        if(allChilds[i] == _parent) {
            continue;
        }

        if(allChilds[i].hasChildNodes()) {
            for(j = 0;j<allChilds[i].childNodes.length;j++) {
                if(allChilds[i].childNodes[j].tagName=='UL'){
                    allChilds[i].childNodes[j].style.display = 'none';
                }
            }
        }
    }

    if(_menu.style.display == 'none') {
        _menu.style.display = 'block';
    } else {
        _menu.style.display = 'none';
    }
}


/**
 * Esta función muestra una capa de menú con un nombre identificado por layerName y
 * a partir de un elemento padre identificado por parent.
 *
 * @param    layerName  El nombre de la capa.
 * @param    parent     El nombre del padre.
 */
function showMenuLayer(layerName,parent) {
   // Hacemos esto para ocultar todos los elementos de menú, la jerarquía
   // es: UL > LI > {DIV (menu) DIV (submenu) }
   // Tenemos que ocultar todos los DIV de tipo submenu, a nosotros nos pasan
   // el ID del DIV (menu), con lo cual obtenemos el padre del padre parar
   // poder obtener todas las capas a ocultar.
   var _parentElement = document.getElementById(layerName).parentNode.parentNode;
   if(_parentElement && _parentElement.hasChildNodes()) {
       var _childNodes = _parentElement.getElementsByTagName("DIV");
       for(i=0;i<_childNodes.length;i++) {
           // Recuperamos el nodo actual...
           currentNode = _childNodes[i];
           // Ya estamos en condiciones de procesarlo adecuadamente, sólo si 
           // no somos nosotros....
           if(currentNode.id != layerName && currentNode.id.indexOf('submenu')!=-1) {
               currentNode.style.visibility = 'hidden';
               currentNode.style.display = 'none';
           }
       }
   }

   // Almacenamos todos los IFRAMEs y SELECTS (vamos a ocultarlos, porque sino el menu queda por debajo)
   // en una variable que creamos a nivel de menu.
   if(navigator.family == 'ie4') {
	   	hideSelects(layerName);
   }

   // Pintamos el submenu debajo.
   var dLayer = document.getElementById(layerName).style;
   var parentLayer = document.getElementById(parent);
   _xpos = findPosX(parentLayer);
   _ypos = findPosY(parentLayer);
   _maxx = _xpos + parentLayer.clientWidth;
   _maxy = _ypos + parentLayer.clientHeight;

   dLayer.top = _maxy;
   dLayer.left = _xpos;

   dLayer.display='block';
   dLayer.visibility='visible';

}

// Función que se invoca cuando salimos del menu.
function outOfMenu(e) {
    var _document;
    if(this.parentWindow) {
        _document = this.parentWindow.parentDocument;
    } else {
        _document = this.parentDocument;    
    }
    _document.getElementById(this.hidedLayer).style.visibility = 'hidden';
    this.onmousemove = null;
}

/**
 * Oculta una determinada capa de menú identificada por layerName asociada a un
 * determinado padre, en un tiempo especificado por el parámetro timeout
 */
function hideMenuLayer(e,submenuId,menuId) {
	// Si no es un LI salimos puesto que no estamos abandonado la capa sino una hija
	// y si estamos en un enlace interno también porque si no casca...
	// Vease: http://www.quirksmode.org/js/events_mouse.html
	
	if(document.getElementById(menuId)==null)
		return;
	
	// Nodo padre.
	var mousePosition = getMousePosition(e);
	var mouseX = mousePosition[0];
	var mouseY = mousePosition[1];
	var parentLI = document.getElementById(menuId).parentNode;
	xpos = findPosX(parentLI)+3;
    ypos = findPosY(parentLI);	
	
	maxx = xpos + document.getElementById(submenuId).clientWidth+5;
	if(isNS) {
		maxy = ypos + parentLI.clientHeight+document.getElementById(submenuId).clientHeight-1;
	} else {
		maxy = ypos + parentLI.clientHeight+document.getElementById(submenuId).clientHeight-10;
	}
	//alert(mouseX+' '+mouseY+'['+xpos+','+ypos+','+maxx+','+maxy+']');
	
	// Si se cumple estamos fuera...
	if(mouseX > maxx || mouseY > maxy || mouseX < xpos || mouseY < ypos) {
		_hideMenuLayer(submenuId,menuId);
	}
}

/**
 * Oculta una capa física del sistema.
 */
function _hideMenuLayer(layerName,parent) {
   var dLayer = document.getElementById(layerName);
   
   dLayer.style.visibility = 'hidden';
   dLayer.style.display = 'none';
        
   // Verificamos si hay alguno activo..  (vease comentario anterior)
   var _parentElement = document.getElementById(layerName).parentNode.parentNode;
   var someoneVisible = false;
   if(_parentElement && _parentElement.hasChildNodes()) {
	   var _childNodes = _parentElement.getElementsByTagName("DIV");
       for(i=0;i<_childNodes.length;i++) {
		   // Recuperamos el nodo actual...
           var currentNode = _childNodes[i];
           // Ya estamos en condiciones de procesarlo adecuadamente, sólo si 
           // no somos nosotros....
           if(currentNode.id != layerName && currentNode.id.indexOf('submenu')!=-1 && currentNode.style.display == 'block') {
			   someoneVisible = true;
               break;
           }
        }
   }
   //Volvemos a mostrar los SELECT e IFRAME
   if(navigator.family == 'ie4') {
	   	showSelects(layerName);
   }
}


/** FUNCIONES PARA LAS CAPAS **/

/** 
 * muestra una capa 
 *
 * @param name	el identificador unico de la capa
 */
function showToolTip(name) {
  
  moveLayerTo(name,mouseX,mouseY);	
  var elm = document.getElementById(name);
  elm.style.visibility = "visible";

}

/**
 * oculta una capa 
 *
 * @param name	el identificador unico de la capa
 */
function hideToolTip(name) {
  
  var elm = document.getElementById(name);
  elm.style.visibility = "hidden";

}

/**
 * mueve la capa
 *
 * @param name	el identificador unico de la capa
 * @param x		coordenada x de la esquina superior izquierda donde 
 *				queremos poner la capa
 * @param y		coordenada y de la esquina superior izquierda donde 
 *				queremos poner la capa
 */
function moveLayerTo(name,x,y) {
	
	var elm = document.getElementById(name);
    elm.style.left = x;
    elm.style.top  = y;
	
}



