///////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////
// 	JavaScript Document
// 	Informatica Siglo 21 : Derechos Reservados
// 	Código Generado por Ramiro Gomez Ortiz
//  Código Generado por Fabio Hernandez
// 	Area de Diseño IS21
// 	05 de Octubre de 2006
//  ACTUALIZADO 02 feb 2007
// 	Version 0.2
// 	Cualquier tipo de inquietud en la implementacion y en la generación de este script contactarse
// 	con el Area de diseño del IS21 areadiseno@i-siglo21.com
// 	http : // www.i - siglo21.com
///////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////
var actualMenuObjectXMLDoc;
var actualMenuName;
var menuXmlDoc;
var levelCliked;
var contadorNiveles = 0;
var counterDelay = 0;
//INTERVAL
var LeveslIntervalID;
var initMenuDelay;
//ARRAY
var LevelsInit_array = new Array();
//BOOLEAN
var withDelay = false;
var activeMouseOver = true;
var autoClose = true;
var autoScrollView = true;
var scrollingActive = false;
var initAlto = new Object();
initAlto.init = false;
initAlto.height = 0;
//
var LAST_OPENED_LEVEL = new Array();
var DEFAULT_TARGET = '_blank';
//DEFINE LOS ESTILOS POR DEFECTO O EL SUFIJO DEL ESTILO CORRESPONDIENTE
var FIRST_LEVEL_CLOSED_CSS = 'firstLevelMenu';
var FIRST_LEVEL_OPEN_CSS = 'firstLevelMenu_Open';
var NEXT_LEVELS_CLOSED_CSS = 'SubLevelMenu';
var NEXT_LEVELS_OPEN_CSS = 'SubLevelMenu_Open';
var NEXT_LEVELS_ACTIVE_CSS = 'SubLevelMenu_Active'
//DEFINE EL CARACTER QUE INDICARA SI HAY SUBMENU
var CARACTER_DEFAULT_SUBMENU = '&nbsp;';
var onlyOne = true;
//VARIABLE QUE CAPTURA EL OBJETO EN EL CUAL SE HIZO CLICK Y QUEDA ACTIVO SEÑALANDO EL VINCULO AL CUAL SE SALTO.
var activateObject;
//
var LIMIT_LEVELS_TO_SHOW = 5;
//METODO QUE LLAMA EL SERVICIO HTTPREQUEST
function CreateMenu(src, name) {
    if (document.getElementById(name)){
        if(onlyOne){
            document.getElementById(name).innerHTML = '';
        }
		actualMenuName = name;
		loadXMLHttpRequest(src, drawMenu);;
    }
}
/* METODO QUE PINTA EL PRIMER NIVEL DEL MENU Y RECIBE COMO PARAMETRO UN OBJETO HTTPREQUEST
*PARAMS @objectRequest XML  
*/
function drawMenu(objectRequest) {

	actualMenuObjectXMLDoc = objectRequest.responseXML;
	var urlTarget = '';
	var urlPath = '';
	var urlIcon = '';
	var node = "/menu/item";
	var subNode = "/menu/item/submenu";
	var principalNodes_array = actualMenuObjectXMLDoc.selectNodes(node);
	var principalSubMenusNodes_array = actualMenuObjectXMLDoc.selectNodes(subNode);
	var XpathMenuFirstLevel = "name/text()";
	var XpathMenuFirstUrl = "url/text()";
	var XpathMenuFirstIcon = "icon/text()";
	var XpathMenuTarget = "target/text()";
	var XpathMenuExcludeStyle = "excludeStyle/text()";
	//
	this['LevelsInitObjects'+0+'_array'] = new Array();
	//
	for (var i = 0; i<principalNodes_array.length; i++) {
		var actualMenuFirstLevel_array = principalNodes_array[i].selectNodes(XpathMenuFirstLevel);
		var actualMenuFirstUrl_array = principalNodes_array[i].selectNodes(XpathMenuFirstUrl);
		var actualMenuFirstIcon_array = principalNodes_array[i].selectNodes(XpathMenuFirstIcon);		
		var actualMenuFirstUrlTarget_array = principalNodes_array[i].selectNodes(XpathMenuTarget);
		var actualMenuFirstExcludeStyle_array = principalNodes_array[i].selectNodes(XpathMenuExcludeStyle);
		//
		//
		for (var k = 0; k<actualMenuFirstLevel_array.length; k++) {
			var ACTUAL_CSS_STYLE = FIRST_LEVEL_CLOSED_CSS;
			if (actualMenuFirstLevel_array[k].nodeValue) {
				if (!actualMenuFirstUrl_array[k]) {
					urlPath = null;
					urlTarget = null;
				} else {
					urlPath = actualMenuFirstUrl_array[k].nodeValue;
					if (actualMenuFirstUrlTarget_array[k]) {
						urlTarget = actualMenuFirstUrlTarget_array[k].nodeValue;
					} else {
						urlTarget = DEFAULT_TARGET;
					}
				}
				if (!actualMenuFirstIcon_array[k]){
					urlIcon = null;
				}else{
					urlIcon = actualMenuFirstIcon_array[k].nodeValue
				}
				if (actualMenuFirstExcludeStyle_array.length > 0){
					ACTUAL_CSS_STYLE = actualMenuFirstExcludeStyle_array[k].nodeValue;
				}
				//
				var objFunction = new Object();
				objFunction.name = actualMenuFirstLevel_array[k].nodeValue;
				objFunction.path = urlPath;
				objFunction.urlTarget = urlTarget;
				objFunction.icono = urlIcon;
				objFunction.css = ACTUAL_CSS_STYLE;
				objFunction.obj = principalSubMenusNodes_array[i];
				//
				if (withDelay) {
					LevelsInit_array.push(objFunction);
				} else {
					//CREA EL PRIMER NIVEL DEL MENU SIN DELAY DE TIEMPO. 
					//document['LevelsInitObjects_'+0+'_array'] = new Array();
					createLevel(actualMenuName, 0, contadorNiveles, objFunction.css, objFunction.name,objFunction.icono, objFunction.path, objFunction.urlTarget, objFunction.obj);
				}
			}
		}
	}
	if (withDelay) {
		LeveslIntervalID = setInterval(writeLevels, 50);
	}
	//openLevel([0,0,0,0]);
	//openLevel([0,1]);
}
//
function getLastOpenedLevel(){
	return 	LAST_OPENED_LEVEL;
}


function openLevel(sublevel_array){
	for(i=0;i<sublevel_array.length;i++){
		responseClickedMenu(null,this['LevelsInitObjects'+i+'_array'][sublevel_array[i]])
	}
}
//METODO QUE ESCRIBE LOS NIVELES CON UN DELAY DE TIEMPO
function writeLevels() {
	if (counterDelay<LevelsInit_array.length) {
		//CREA EL PRIMER NIVEL CON UN DELAY DE TIEMPO PARA CREAR UN EFECTO.
		createLevel(actualMenuName, 0, counterDelay, LevelsInit_array[counterDelay].css, LevelsInit_array[counterDelay].name,LevelsInit_array[counterDelay].icono, LevelsInit_array[counterDelay].path, LevelsInit_array[counterDelay].urlTarget, LevelsInit_array[counterDelay].obj);
		counterDelay++;
	} else {
		clearInterval(LeveslIntervalID);
	}
}
//METODO QUE ASIGNA LAS PROPIEDADES A LOS OBJECTS DEL SUBMENU Y LO ADICIONA.
function createSubMenu(parent, nivel, id, css, name, url) {
	var rename = name.replace(/ /gi,'')
	var Sublevel = document.createElement("div");
	Sublevel.nivel = nivel;
	Sublevel.className = NEXT_LEVELS_OPEN_CSS;
	Sublevel.classNameOpen = NEXT_LEVELS_OPEN_CSS;
	Sublevel.classNameClose = NEXT_LEVELS_CLOSED_CSS;
	Sublevel.classNameActive = NEXT_LEVELS_ACTIVE_CSS;
	Sublevel.id = id;
	document.getElementById(parent).appendChild(Sublevel);
}
//METODO QUE CREA EL NIVEL BASADO EN
//LOS PARAMETROS QUE RECIBE
//@ PARAMS parent : el objeto que va contener el nivel
//@ PARAMS nivel : el numero del nivel a construir
//@ PARAMS id : el ID que permitira la ubicacion del objeto.
//@ PARAMS css : el estilo correspondiente a ese nivel
//@ PARAMS name : nombre del nivel
//@ PARAMS url : url a donde llevaria el item
//@ PARAMS targetURL : en donde se desee que abra el url
//@ PARAMS parentNode : Nodo padre del XML
function createLevel(parent, nivel, id, css, name,icon, url, targetUrl, parentNode) {
	var indicador = nivel+1;
	if (indicador <= LIMIT_LEVELS_TO_SHOW){
		var rename = name.replace(/ /gi,'');
		var level = newDivIS21('Level_'+contadorNiveles, '', css, parent)
		//
		if(autoClose){
			this['LevelsInitObjects'+nivel+'_array'].push(level);
		}
		//AGREGANDO NUEVAS PROPIEDADES AL DIV QUE SE CREO//
		level.nivel = nivel;
		level.locationURL = url;
		level.target = targetUrl;
		// urlSubmenu // boolean que determina si hay hijos !!!
		levelCliked = parent;
		level.subFunction = true;
		level.subnivel = rename+'SubLevel_'+id;
		level.parentNodeXml = parentNode;
		//
		level.classNameOpen = css+'_Open';
		level.classNameClose = css;
		level.classNameActive = css+'_Active';	
		
		if (activeMouseOver){
			level.onmouseover = function(event){
				if (this.className != this.classNameActive){
					this.className = this.className+'_Over';
				}
			}
			level.onmouseout = function(event){
				if (this.className != this.classNameActive){
					this.className = this.classNameClose;
				}
			}
		}
		//CREANDO EL TEXTO DEL PRIMER NIVEL//
		if (icon != undefined){
			var iconMenu = newDivIS21(level.id+'icon_'+id, '', 'Icon_menu', level)
			var imageIconMenu = newImageIS21(level.id+'icon_img'+id, icon, null, null, iconMenu);
		}
		//
		var labelMenu = newLabelIS21(level.id+'_ahref_'+id, name, '', level);
		labelMenu.unselectable = 'on';
		//
		level.onclick = function(event) {
			LAST_OPENED_LEVEL = new Array();
			responseClickedMenu(event,this)
		};
		//
		level.hasSubMenu = validateSubmenu(level);
		if (level.hasSubMenu){
			level.sublevelImage = newDivIS21('LevelSubmenu_'+contadorNiveles, CARACTER_DEFAULT_SUBMENU, css+'_Submenu', level);
		}
		//
		createSubMenu(parent, nivel+1, level.subnivel, 'sub_'+css, name, '');
		contadorNiveles++;
	}
}

//METODO QUE RESPONDE AL CLICK EN EL MENU//
function responseClickedMenu(event,obj){
	if (activateObject){
		activateObject.className = activateObject.classNameClose;
	}
	if(obj.hasSubMenu){
		if (obj.subFunction) {
			obj.className = obj.classNameOpen;
			if (obj.hasSubMenu){
				obj.sublevelImage.className = obj.classNameClose+'_Submenu_Open';
			}
			obj.subFunction = false;
			showNextLevel(event, obj);
		} else {
			obj.className = obj.classNameClose;
			if (obj.hasSubMenu){
				obj.sublevelImage.className = obj.classNameClose+'_Submenu';
			}
			removeNextLevel(event, obj);
		}
	}else{
		activateObject = obj;
		activateObject.className = activateObject.classNameActive;
	}
	//
	if (activeMouseOver){
		obj.lastClassName = obj.className;
	}
	//
	if (obj.locationURL != null){
		if(obj.target == '_self'){
			parent.location.href = obj.locationURL;
		}else if (obj.target == '_blank'){
			window.open(obj.locationURL,'','')
		}else{
			parent[obj.target].location.href = obj.locationURL;
		}
	}
	//SECCION QUE SE ENCARGA DE CERRAR LOS OTROS SUBMENUS DE NIVEL 0 QUE ESTEN ABIERTOS 
	//ESTO PARA AGARANTIZAR UN MANEJO PROPORCIONAL DE OPCIONES EN EL MENU.
	if (autoClose){
		for (var i=0; i<this['LevelsInitObjects'+obj.nivel+'_array'].length; i++){
				if (this['LevelsInitObjects'+obj.nivel+'_array'][i].id != obj.id){
					removeNextLevel(event, this['LevelsInitObjects'+obj.nivel+'_array'][i]);
				}
		}
	}	
}


//REMUEVE LOS ITEMS DE UN NIVEL ESPECIFICO//
function removeNextLevel(event, object) {
	if(object.nextSibling){
		if (object.sublevelImage){
			object.sublevelImage.className = object.classNameClose+'_Submenu';
		}
		var hijo = object.nextSibling;
		var items_array = new Array();
		for (var i = 0; i<hijo.childNodes.length; i++) {
			items_array.push(document.getElementById(hijo.childNodes[i].id));
		}
		for (var i = 0; i<items_array.length; i++) {
			hijo.removeChild(items_array[i]);
		}
		object.subFunction = true;
	}
	validateScroll();
}

function validateScroll(){
	if (!initAlto.init){
		initAlto.init = true;
		initAlto.height = parseInt(document.getElementById(actualMenuName).offsetHeight);
	}
	var altoDiv = initAlto.height;
	var altoContent = parseInt(document.getElementById(actualMenuName).scrollHeight);
	//
	if(altoContent > altoDiv){
		if (autoScrollView){
			if (!scrollingActive){
				var variable = document.getElementById(actualMenuName).style.paddingRight.length;
				if (variable == 0){
					document.getElementById(actualMenuName).style.paddingRight = '16px';
				}else{
					document.getElementById(actualMenuName).style.paddingRight = (parseInt(document.getElementById(actualMenuName).style.paddingRight)+16)+'px';
				}
			}
		}
		document.getElementById(actualMenuName).style.overflow='auto';
		document.getElementById(actualMenuName).style.overflowX='hidden';
		scrollingActive = true;
	}else{
		if (autoScrollView){
			if (document.getElementById(actualMenuName).style.paddingRight){
			var initPx = parseInt(document.getElementById(actualMenuName).style.paddingRight);
			var newPx = initPx-16;
			if (newPx < 0){
				document.getElementById(actualMenuName).style.paddingRight = '0px';	
				}else{
				document.getElementById(actualMenuName).style.paddingRight = newPx+'px';
				}
			}
		}
		scrollingActive = false;
	}
}

function validateSubmenu(object){
	var validate = false;
	var subNode = "item/submenu";
	var principalSubMenusNodes_array = object.parentNodeXml.selectNodes(subNode);
	for (var i = 0; i<principalSubMenusNodes_array.length; i++) {
			validate = true;
	}
	return validate
}


function showNextLevel(event, object) {
	//
	
	var urlPath;
	var urlTarget;
	var urlIcon;
	var submenusIteration = false;
	var xmlMenu = "/menu";
	var xmlItem = "/item";
	var xmlName = "/name";
	var xmlUrl = "/url";
	var xmlTarget = "/target";
	var xmlText = "/text()";
	var xmlSubMenu = "item/submenu";
	//
	LAST_OPENED_LEVEL.push(object.nivel);
	var indicador = object.nivel+1;
	var locationCreate = object.subnivel;
	this['LevelsInitObjects'+indicador+'_array'] = new Array();
	//
	var node = "item";
	var subNode = "item/submenu";
		var principalNodes_array = object.parentNodeXml.selectNodes(node);
		var principalSubMenusNodes_array = object.parentNodeXml.selectNodes(subNode);
		var XpathMenuFirstLevel = "name/text()";
		var XpathMenuFirstUrl = "url/text()";
		var XpathMenuFirstIcon = "icon/text()";
		var XpathMenuTarget = "target/text()";
		
		for (var i = 0; i<principalNodes_array.length; i++) {
	
			var actualMenuFirstLevel_array = principalNodes_array[i].selectNodes(XpathMenuFirstLevel);
			var actualMenuFirstUrl_array = principalNodes_array[i].selectNodes(XpathMenuFirstUrl);
			var actualMenuFirstIcon_array = principalNodes_array[i].selectNodes(XpathMenuFirstIcon);			
			var actualMenuFirstUrlTarget_array = principalNodes_array[i].selectNodes(XpathMenuTarget);
			for (var k = 0; k<actualMenuFirstLevel_array.length; k++) {
				if (actualMenuFirstLevel_array[k].nodeValue) {
					if (!actualMenuFirstUrl_array[k]) {
						urlPath = null;
						urlTarget = null;
					} else {
						urlPath = actualMenuFirstUrl_array[k].nodeValue;
						if (actualMenuFirstUrlTarget_array[k]) {
							urlTarget = actualMenuFirstUrlTarget_array[k].nodeValue;
						} else {
							urlTarget = DEFAULT_TARGET;
						}
					}
					if (!actualMenuFirstIcon_array[k]){
						urlIcon = null;
					}else{
						urlIcon = actualMenuFirstIcon_array[k].nodeValue
					}
					createLevel(locationCreate, indicador, indicador+contadorNiveles, NEXT_LEVELS_CLOSED_CSS+indicador, actualMenuFirstLevel_array[k].nodeValue,urlIcon, urlPath, urlTarget, principalSubMenusNodes_array[i]);
				}
			}
			contadorNiveles++;
		}
}
