i_exml_menu_mod_nVersion=2.103;
/**
	intelygenZ  - www.intelygenz.com
	[DOC]	 M:\ig_intelygenz\ig05_intranet\desarrollo\areas\dev\docs\i_exml_menu_mod.txt
	[UPDATE] M:\ig_intelygenz\ig05_intranet\desarrollo\areas\dev\libs\js\i_exml_menu_mod.js

		open -> i_exml.js , i_marray.js, i_gfx.js

*/

oIGZ.f_loadLib("i_exml_menu_mod", i_exml_menu_mod_nVersion);
oIGZ.f_require("i_gfx", 0.16);
oIGZ.f_require("i_exml", 0.18);
oIGZ.f_require("i_marray", 0.16);

function EXMLMenuMOD(sObj, maData, sParentIdColName, sIdColName, sActionColName, sBlockColName, sIFRAME_Name){
	this.m_sObj		= sObj;
	this.m_nVersion	= i_exml_menu_mod_nVersion;
	this.m_sKeyName	= "[i_exml_menu_mod v"+this.m_nVersion+"]";
	this.m_oObj		= this;

	// Control de Errores Básicos en la definición de una instancia
	this.m_maData	    = maData;
	if(!this.m_maData)    ErrorJS(this.m_sKeyName+" - No se han encontrado datos en el MArray.\nEXMLMenuMOD(sObj, *maData*, ... )");
	if(!sParentIdColName) ErrorJS(this.m_sKeyName+" - No se ha definido un nombre de columna de id padre para la relación jerárquica.\nEXMLMenu(sObj, maData, *sParentIdColName*, ... )");
	if(maData.m_a_sCOLs.f_indexOf(sParentIdColName)==-1) ErrorJS(this.m_sKeyName+" - El nombre de columna de id padre para la relación jerárquica ("+sParentIdColName+") no existe en el MArray ["+maData.m_a_sCOLs+"]");
	if(!sIdColName) 	  ErrorJS(this.m_sKeyName+" - No se ha definido un nombre de columna de id única para la relación jerárquica.\nEXMLMenu(sObj, maData, sParentIdColName, *sIdColName*)");
	if(maData.m_a_sCOLs.f_indexOf(sIdColName)==-1) ErrorJS(this.m_sKeyName+" - El nombre de columna de id única para la relación jerárquica ("+sIdColName+") no existe en el MArray ["+maData.m_a_sCOLs+"]");

	// Nombre de las columnas que definen la jerarquia
	this.m_sParentIdColName = sParentIdColName;
	this.m_sIdColName		= sIdColName;

	// Nombre de la columna cuyo contenido se ejectua al hacer onclick en una opción
	this.m_sActionColName	= sActionColName;

	// Nombre de un campo del MArray de datos con el nombre del Bloque EXML que se aplicará al registro
	// Si m_sBlockColName no tiene valor o ese registro no tiene valor para la colunmna m_sBlockColName
	// por defecto se usa el bloque "default" para todos los nodos 
	// a menos que se defina un "Level_N" donde N es el nivel del Nodo en la jerarquia
	this.m_sBlockColName	= sBlockColName;


	this.m_sIFRAME_Name = "";
	if (sIFRAME_Name) this.m_sIFRAME_Name = sIFRAME_Name;
	this.m_oIFRAME = null;

	//Tambien existen los TAGs:
	//	<LEVEL> que devuelve un int con el nivel del nodo
	//  <IS_PARENT> que devuelve 1 si tiene hijos 0 si no los tiene
	//	<CHILDS> que devuelve un int el número de hijos (usarlo en niveles con muchos NODOS es un poco lento)
	this.m_a_sOwnTAGs = [
	                    ];

	//nOrden 1 - Vertical, 2 - Horizontal
	this.m_maBlocks = new MArray(["sName", "sEXML_TR", "nOrden", "sPropName", "vPropValue"]
	 						    ,[["default", "<BD>"+sIdColName+"</BD>", 1, "COLOR", ["#F0F0F0", "A0A0A0", "A0A0A0", "#F0F0F0"]]
	 							 ]
	 							);

	this.m_a_oDOMs = [];
	this.m_oObj    = null;
	this.f_init = function (vId_Active){
		this.m_oObj = document.getElementById(this.m_sEXMLMenuMod);
		this.f_TD2MenuTD(this.m_oObj);
		this.m_a_oDOMs[0] = this.m_oObj;
		this.m_oObj.innerHTML = this.f_drawChildMod(this.m_oObj);
		this.f_applyFX2Mod(this.m_oObj);
		this.f_resizeIFrame();
	}

	//Bloques y OwnTAGs
	//
	this.f_parseOwnTAGs = function (sStr){
		var sOwnTAG, sOwnEXML, nAttPos;
		for(var f=0; f<this.m_a_sOwnTAGs.length; f+=2){
			sOwnTAG =this.m_a_sOwnTAGs[f];
			sOwnEXML=this.m_a_sOwnTAGs[f+1];
			sStr=sStr.f_replace(sOwnTAG, sOwnEXML);
		}
		return (sStr);
	}
	this.f_newBlock = function (sName, sEXML_TR, nOrden, sPropName, vPropValue){
		var nReg = this.m_maBlocks.f_getReg("sName", sName, 1);
		if(nReg!=-1) this.m_maBlocks.f_delRow(nReg);
		this.m_maBlocks.f_addRow([sName, this.f_parseOwnTAGs(sEXML_TR), nOrden, sPropName, vPropValue]);
	}
	this.f_getBlock = function (sBlockName, sEXML_TagName){
		var sEXML = this.m_maBlocks.f_getValIf("sName", sBlockName, sEXML_TagName);
		if(!sEXML) sEXML = this.m_maBlocks.f_getValIf("sName", "default", sEXML_TagName);
		if(!sEXML) ErrorJS(this.m_sKeyName+" - No se ha encontrado ningún 'Bloque' con el nombre '"+sBlockName+"' y el TAG ["+sEXML_TagName+"]");
		return (sEXML);
	}

	//Jerarquía y Comunicacion (MArray - ObjDOM)
	//
	this.f_getRegParents = function (vId) {
		var nReg, a_vParentRegs = [];
		while (vId && nReg!=-1){
			nReg = this.m_maData.f_getReg(this.m_sIdColName, vId);
			a_vParentRegs.push( nReg );
			vId = this.m_maData.f_getVal(this.m_sParentIdColName, nReg);
		}
		return (a_vParentRegs.reverse());
	}
	this.f_getRegChilds  = function (vId_Parent) { return ( this.m_maData.f_subIndexOf(this.m_sParentIdColName, vId_Parent)); }
	this.f_getId  		 = function (nReg){ return ( this.m_maData.f_getVal(this.m_sIdColName, nReg)); }
	this.f_getParentId	 = function (nReg){ return ( this.m_maData.f_getVal(this.m_sParentIdColName, nReg,"")); }
	this.f_getDOM_TD	 = function (vId) { return ( document.getElementById("EXMLMenuMod_"+this.m_sObj+"_TD_"+vId)); }
	this.f_getDOM_SPAN	 = function (vId) { return ( document.getElementById("EXMLMenuMod_"+this.m_sObj+"_SPAN_"+vId+"_Childs")); }
	this.f_TD2MenuTD = function (oDOM_TD){
		oDOM_TD.m_oMenu  = this;
		oDOM_TD.m_nReg   = this.m_maData.f_getReg(this.m_sIdColName, oDOM_TD.getAttribute("m_vId"));
		oDOM_TD.m_vId    = this.m_maData.f_getVal(this.m_sIdColName, oDOM_TD.m_nReg, "");
		oDOM_TD.m_nOrden = Number(oDOM_TD.getAttribute("m_nOrden"));

		var vParentId = this.f_getParentId(oDOM_TD.m_nReg);
		if (vParentId){
			oDOM_TD.m_oParentTD  = this.f_getDOM_TD(vParentId);
			oDOM_TD.m_oSPAN  	 = this.f_getDOM_SPAN(vParentId);
			oDOM_TD.m_a_oParents = [];
			if(oDOM_TD.m_oParentTD && oDOM_TD.m_oParentTD.m_a_oParents) oDOM_TD.m_a_oParents = oDOM_TD.m_a_oParents.concat(oDOM_TD.m_oParentTD.m_a_oParents);
			oDOM_TD.m_a_oParents.push(oDOM_TD.m_oParentTD);
		}
		else {
			oDOM_TD.m_oParentTD  = this.m_oObj;
			oDOM_TD.m_oSPAN		 = this.m_oObj;
			oDOM_TD.m_a_oParents = [];
		}
	}

	// Draw & Print
	//

//	this.m_sIFRAME = "EXMLMenuMod_"+this.m_sObj+"_IFRAME_Childs";
	this.m_sEXMLMenuMod = "EXMLMenuMod_"+this.m_sObj+"_SPAN__Childs";
	this.f_draw  = function (){ return ("<TABLE cellpadding=0 cellspacing=0 border=0><TR><TD m_vId='' id='"+this.m_sEXMLMenuMod+"' m_bIsParent='1' ></TD></TR></TABLE>"); }
//	this.f_draw  = function (){ return ("<IFRAME id='"+this.m_sIFRAME+"'style='position: absolute; top: 200px; left: 100px;' allowtransparency='true' background-color='transparent' width=500 height=60></IFRAME>"); }
	this.f_print = function (){ document.write(this.f_draw()); }

	this.f_drawChildMod = function(oDOM_TD){
		var sInner, sHTML, sEXML, a_sHTML = [];
		var nChilds, bIsParent;
		var a_nRegChilds  = this.f_getRegChilds(oDOM_TD.m_vId);	// Registros de los Hijos
		var nChildsLength = a_nRegChilds.length;				// Número de Hijos
		var a_oParents	  = oDOM_TD.m_a_oParents;				// Ancestros del Padre
		if (nChildsLength>0){
			var vId, sPropName, vPropValue, nOrden;
			a_sHTML.push("<TABLE cellpadding=0 cellspacing=0 border=0>");

			var nLevel = a_oParents.length;							// Nivel del Padre
			if(oDOM_TD.getAttribute("m_nLevel")!=null) nLevel++;	// Le sumo uno porquer es el nivel de los hijos (solo a partir del nivel 0)
			var sBlock = "Level_"+nLevel;							// Bloque por defecto a partir del Nivel

			// FX - Eventos del Ratón
			// 
			nOrden 	   = this.f_getBlock(sBlock, "nOrden");
			sPropName  = this.f_getBlock(sBlock, "sPropName");
			vPropValue = this.f_getBlock(sBlock, "vPropValue");

			if (nOrden==2) a_sHTML.push("<TR>");
			for (var f=0; f<nChildsLength; f++){
				// Cálculo si el hijo f tiene hijos
				bIsParent = 0;
				if (this.m_maData.f_getValIf(this.m_sParentIdColName, this.m_maData.f_getVal(this.m_sIdColName, a_nRegChilds[f]), this.m_sIdColName)) bIsParent=1;
		
				// Id del registro f
				vId = this.m_maData.f_getVal(this.m_sIdColName, a_nRegChilds[f]);		

				// Parseo de OwnTAGs
				// 
				if (this.m_sBlockColName) sBlock = this.m_maData.f_getVal(this.m_sBlockColName, a_nRegChilds[f]);
				sInner = this.f_getBlock(sBlock, "sEXML_TR");
				sInner = sInner.f_replace("<LEVEL>", nLevel);
				sInner = sInner.f_replace("<IS_PARENT>", bIsParent);
				if (sInner.indexOf("<CHILDS>")!=-1){
					nChilds = this.f_getRegChilds(this.m_maData.f_getVal(this.m_sIdColName, a_nRegChilds[f])).length;
					sInner  = sInner.f_replace("<CHILDS>", nChilds);
				}
				// TR EXML - Construcción del HTML del Nodo
				// 
				sEXML  = "";
				if(nOrden==1) sEXML  += "<TR>";
				sEXML += "<TD id='EXMLMenuMod_"+this.m_sObj+"_TD_"+vId+"' "
					   + "m_vId='"+vId+"' "
					   + "m_nPosChild='"+f+"' "
					   + "m_bIsParent='"+bIsParent+"' "
					   + "m_nLevel='"+nLevel+"' "
					   + "m_nOrden='"+nOrden+"' "
					   + "m_sTipoFX='"+sPropName+"' "
					   + "m_sArrayFX='"+vPropValue+"' "
					   + this.f_drawTipo(sPropName, vPropValue)+" "
					   + "onmouseover='"+this.m_sObj+".f_menuEvents(this, 1)' "
					   + "onmouseout='"+this.m_sObj+".f_stHideChilds(this)' "
					   + "onclick='"+this.m_sObj+".f_menuAction(this)' "
					   + ">"+sInner+"</TD>"
					   ;
				if(nOrden==1) sEXML += "</TR>";
				a_sHTML.push(ParseEXMLs (sEXML, "", this.m_maData, a_nRegChilds[f]));
			}
			if(nOrden==2) a_sHTML.push("</TR>");
			a_sHTML.push("</TABLE>");
		}
		return (a_sHTML.join(""));
	}

	this.f_printSPANChild = function (oDOM_TD) {
		var sIdDOM = oDOM_TD.getAttribute("id");

		// Cojo DOM_TR_Childs de Cache
		var oDOM_SPAN_Child = this.f_getDOMCache (sIdDOM);
		// Construyo DOM_TR_Childs si no esta en cache		
		if(!oDOM_SPAN_Child){
			oDOM_SPAN_Child = document.createElement("SPAN");
			oDOM_SPAN_Child.setAttribute("id", "EXMLMenuMod_"+this.m_sObj+"_SPAN_"+oDOM_TD.m_vId+"_Childs");
			oDOM_SPAN_Child.setAttribute("m_vId", oDOM_TD.m_vId+"_Childs");
			oDOM_SPAN_Child.style.position   = "absolute";
			oDOM_SPAN_Child.style.visibility = "hidden";

			oDOM_SPAN_Child.m_oParentTD = oDOM_TD;
			oDOM_TD.m_oSPAN_Child 		= oDOM_SPAN_Child;

			oDOM_SPAN_Child.innerHTML = this.f_drawChildMod(oDOM_TD, oDOM_SPAN_Child);
			this.f_saveDOMCache(sIdDOM, oDOM_SPAN_Child);
			document.body.appendChild(oDOM_SPAN_Child);

			this.f_applyFX2Mod(oDOM_SPAN_Child);
		}
		oDOM_TD.m_bOpen = 1;
		// Muestro Módulo
		this.f_showMod(oDOM_SPAN_Child);
	}

	this.m_a_oDOM_SPAN = [];
	this.f_showMod = function (oDOM_SPAN){
		var nPosX, nPosY;
		var oParent_TD = oDOM_SPAN.m_oParentTD
		var nParentX = iGFX.f_getPosX(oParent_TD);
		var nParentY = iGFX.f_getPosY(oParent_TD);
		var nParentW = iGFX.f_getSizeX(oParent_TD);
		var nParentH = iGFX.f_getSizeY(oParent_TD);

		if (oParent_TD.m_nOrden==1){ 	// Vertical
			nPosX = nParentX+nParentW;
			nPosY = nParentY;
		}
		else { 							// Horizontal
			nPosX = nParentX;
			nPosY = nParentY+nParentH;
		}

		if(typeof(SetHideAllSelect)!="undefined") SetHideAllSelect();
		oDOM_SPAN.style.left = nPosX+"px";		
		oDOM_SPAN.style.top  = nPosY+"px";
		oDOM_SPAN.style.visibility = "visible";
		this.m_a_oDOM_SPAN.push(oDOM_SPAN);

		this.f_resizeIFrame();
	}

	this.f_resizeIFrame = function (){
		if (this.m_sIFRAME_Name){
			this.m_oIFRAME = parent.document.getElementById(this.m_sIFRAME_Name);
			if (oIGZ.m_bIE){
				if (document.body.scrollWidth==0 || document.body.scrollHeight==0) {
					var oThis = this;
					setTimeout (function (){ oThis.f_resizeIFrame(); }, 500);
				} 
				else {
					parent.document.getElementById(this.m_sIFRAME_Name).width  = document.body.scrollWidth;
					parent.document.getElementById(this.m_sIFRAME_Name).height = document.body.scrollHeight;	
				}
			}
			else {
//window.status = "fds"+parent.document.getElementById(this.m_sIFRAME_Name).contentDocument.body.scrollHeight;
				if (document.body.scrollWidth!=0 && document.body.scrollHeight!=0) {
					parent.document.getElementById(this.m_sIFRAME_Name).width  = document.body.scrollWidth;
					parent.document.getElementById(this.m_sIFRAME_Name).height = document.body.scrollHeight;
				}
			}
		}
	}


	//Cache de Objetos DOM
	//
	this.m_maDOMCache    = new MArray(["sDOMId", "oDOM_SPAN_Child"],[]);
	this.f_cleanDOMCache = function (){ this.m_maDOMCache = new MArray(["sDOMId", "oDOM_SPAN_Child"],[]); }
	this.f_getDOMCache   = function (sDOMId){ return (this.m_maDOMCache.f_getValIf("sDOMId", sDOMId, "oDOM_SPAN_Child", 0)); }
	this.f_saveDOMCache  = function (sDOMId, oDOM_SPAN_Child){ this.m_maDOMCache.f_addRow([sDOMId, oDOM_SPAN_Child]); }
	this.f_delDOMCacheElement = function (sDOMId){ this.m_maDOMCache.f_delRowIf("sDOMId", sDOMId); }


	// Acciones y Eventos
	//
	this.f_menuAction = function (oDOM_TD){
		var sAction = this.m_maData.f_getVal(this.m_sActionColName, oDOM_TD.m_nReg);
		sAction = ParseEXMLs (sAction, "", this.m_maData, oDOM_TD.m_nReg);
		eval(sAction);
	}
	this.f_menuEvents = function (oDOM_TD, bMouseOnOut){
		clearTimeout( this.m_stHideChilds );
		this.f_initFX(oDOM_TD);
		if (bMouseOnOut==1){
			var f = this.m_a_oDOMs.length;
			var oDOM_TMP, oSPAN = oDOM_TD.m_oSPAN;

			var oParent_SPAN = this.f_getDOM_SPAN(  oDOM_TD.m_oParentTD.m_vId );
			if (this.m_a_oDOMs[f-1].id!=oSPAN.id){
				while (--f>0 && this.m_a_oDOMs[f].id!=oParent_SPAN.id){
					oDOM_TMP = this.m_a_oDOMs[f];
					this.f_hideChild(oDOM_TMP);
					this.m_a_oDOMs.splice(f, 1);
				}
			}
			if (oDOM_TD.getAttribute("m_bIsParent")==1){
				this.f_printSPANChild(oDOM_TD);
				this.m_a_oDOMs[this.m_a_oDOMs.length] = oDOM_TD.m_oSPAN_Child;
			}
		}
		oDOM_TD.f_fx(1);
	}
	this.f_stHideChilds = function (oDOM_TD){
		oDOM_TD.f_fx(0);
		oDOM_TD.f_hideChilds = function (){
			var oMenu = this.m_oMenu;
			clearTimeout( oMenu.m_stHideChilds );
			var f=oMenu.m_a_oDOMs.length;
			while (--f>0){
				oMenu.f_hideChild(oMenu.m_a_oDOMs[f]);
				oMenu.f_applyFX2Mod(oMenu.m_a_oDOMs[f]);
				oMenu.m_a_oDOMs.splice(f, 1);
			}
			if(typeof(SetShowAllSelect)!="undefined") SetShowAllSelect();
		}
		this.m_stHideChilds	= setTimeout ( function (){ oDOM_TD.f_hideChilds(); }, 300);
	}
	this.f_hideChild = function (oDOM_SPAN) {
		var nTransFX=null;
		if (nTransFX==null){
			oDOM_SPAN.style.visibility = "hidden";
			oDOM_SPAN.style.left = -oDOM_SPAN.offsetWidth;
			oDOM_SPAN.style.top  = -oDOM_SPAN.offsetHeight;
		}
		this.f_resizeIFrame();
	}

	//Efectos de menuEvents
	//
	this.f_drawTipo = function (sTipoFX, a_sArrayFX){
		var sHTML;
		switch (sTipoFX.toUpperCase()){
			case "COLOR":
				sHTML = " style='background-color: "+a_sArrayFX[1]+"; color: "+a_sArrayFX[0]+";' ";
				break;
			case "TAIL":
				sHTML = " style='background-color: "+a_sArrayFX[1]+"; color: "+a_sArrayFX[0]+";' ";
				break;
			default:	//COLOR
				sHTML = "";
				break;
		}
		return (sHTML);
	}
	this.f_initFX = function (oDOM_TD){
		if (!oDOM_TD.m_a_vArrayFX){
			this.f_TD2MenuTD(oDOM_TD);
			oDOM_TD.m_a_vArrayFX = oDOM_TD.getAttribute("m_sArrayFX").split(",");
			oDOM_TD.f_fx 	     = this.f_getFX ( oDOM_TD.getAttribute("m_sTipoFX") );
			oDOM_TD.m_mouseOn	 = 0;
		}
	}
	this.f_fx	 = function(){ }
	this.f_getFX = function (sTipo){
		var f_func;
		switch (sTipo.toUpperCase()){
			case "CSS":
				f_func = this.f_fxCss;
				break;
			case "TAIL":
				f_func = this.f_fxTail;
				break;
			default:	//COLOR
				f_func = this.f_fxColor;
				break;
		}
		return (f_func);
	}

	this.f_fxColor = function (){
		if (this.m_mouseOn && this.m_oMenu.m_a_oDOMs.f_indexOf(this.m_vId,"m_vId")==-1){
			this.m_mouseOn=0;
			this.style.color = this.m_a_vArrayFX[0];
			this.style.backgroundColor = this.m_a_vArrayFX[1];
		}
		else {
			this.m_mouseOn=1;
			this.style.color = this.m_a_vArrayFX[2];
			this.style.backgroundColor = this.m_a_vArrayFX[3];
		}
	}

	this.f_fxCss = function (bForceEstado){
		var nIndex;
		if (this.m_mouseOn==0 && bForceEstado!=0){		// MouseOut
			this.m_mouseOn=1;
			nIndex = 3;
			if (this.m_bActivo && this.m_a_vArrayFX.length>2) nIndex = 5;
		}
		else {											// MouseOver
			this.m_mouseOn=0;
			nIndex = 2;
			if (this.m_bActivo){
				nIndex=3;
				if (this.m_a_vArrayFX.length>2) nIndex = 4;
			}
		}
		this.parentNode.parentNode.parentNode.className = this.m_a_vArrayFX[nIndex-2];	// TABLE
		if(Number(this.m_bIsParent)==1) nIndex+=2;										// TD Padre
		this.className = this.m_a_vArrayFX[nIndex];										// TD
	}

	this.f_fxTail = function (){
		alert(this.m_a_vArrayFX)
	}

	this.f_applyFX2Mod = function (oDOM_SPAN){
		var f, a_oChilds;
		var oFirstChild = oDOM_SPAN.childNodes[0].childNodes[0].childNodes[0].childNodes[0];
		oDOM_SPAN.m_nOrden = oFirstChild.getAttribute("m_nOrden");
		if (oDOM_SPAN.m_nOrden==1){			// Vertical
			a_oChilds = oDOM_SPAN.childNodes[0].childNodes[0].childNodes;
			for (f=0; f<a_oChilds.length; f++){
				this.f_initFX( a_oChilds[f].childNodes[0] );
				a_oChilds[f].childNodes[0].f_fx(0);
			}
		}
		else {					// Horizontal
			a_oChilds = oDOM_SPAN.childNodes[0].childNodes[0].childNodes[0].childNodes;
			for (f=0; f<a_oChilds.length; f++){
				this.f_initFX( a_oChilds[f] );
				a_oChilds[f].f_fx(0);
			}
		}
	}

}

