i_tablas_nVersion=1.184;
/*
	2006 Intelygenz  - www.intelygenz.com
	[VER] 	 M:\ig_intelygenz\ig05_intranet\desarrollo\areas\dev\docs\i_tablas.txt
	[DOC]	 http://aspirina/ig_intelygenz/ig05_intranet/desarrollo/areas/dev/docs/i_tablas.html
	[UPDATE] M:\ig_intelygenz\ig05_intranet\desarrollo\areas\dev\libs\js\i_tablas.js
*/

oITablas=new function(){
	this.m_sObj="oITablas";
	this.m_nVersion=i_tablas_nVersion;
}

if(typeof(oIGZ)=="undefined") {
	alert ("Falta la libreria o el ID de 'i_core.js' o no existe 'i_igz.js'")
}

try{
	g_sLang = IsUndefined( g_sLang ) || IsNull( g_sLang ) ? "es" : g_sLang;
}catch( e ){
	g_sLang = "es"
}

oIGZ.f_loadLib ("i_tablas",oITablas.m_nVersion);
oIGZ.f_require ("i_exml",1.200);
oIGZ.f_require ("i_lang_"+g_sLang,1.016);
oIGZ.m_a_sStartUps.f_addElements("oIGZ.f_checkLoadedLibs()");

var g_oOnErrorEvent=window.onerror;

var g_sEXMLenlace ="<ENLACE />"
var g_sEXMLerror = "";
var g_oTablaActiva = "";
var g_oTimeoutID  = []
var g_oTimeoutObj = []


/**************************************/

// Guardar estado de tabla
function dtGetParam( sParam ){
	var sValue = null;
	var a_sValues = this.a_sTablasParams;
	var nLen = a_sValues.length;
	for( var i = 0; i < nLen; i+=2 ){
		if ( a_sValues[ i ] == sParam ){
			sValue = a_sValues[ i + 1 ];
			i = nLen;
	  }
  }
  return sValue;
}

function dtSetParam( sParam, sValor ){
	var sValue = null;
	var a_sValues = this.a_sTablasParams;
	var nLen = a_sValues.length;
	var nIndex = nLen;
	for( i = 0; i < nLen; i+=2 ){
		if ( a_sValues[ i ] == sParam ){
			nIndex = i;
	  }
  }
  a_sValues[ nIndex ] = sParam;
  a_sValues[ nIndex + 1 ] = sValor;
}


if ( !navigator.a_sTablasParams ){
   	navigator.a_sTablasParams = new Array();
}	
navigator.f_getParamTabla = dtGetParam;
navigator.f_setParamTabla = dtSetParam;

/******************************************/

function TestTabla(sJSarrayBase){
var a_sArray1,a_sArray2,nFilas,nColumnas,sHTML,f,g
	a_sArray1 = eval ("a_s"+sJSarrayBase)
	a_sArray2 = eval ("a_v"+sJSarrayBase)
	nFilas = sJSarrayBase.f_maGetRegs()
	nColumnas = a_sArray1.length
	sHTML="<TABLE border=1>"
	sHTML += "<TR>"
	for (f=0;f<nColumnas;f++){
		sHTML += "<TD><B>" + a_sArray1[f] + "</B></TD>"
	}
	sHTML += "</TR>"
	for (f=0;f<nFilas;f++){
		sHTML += "<TR>"	
		for (g=0;g<nColumnas;g++){
			sHTML += "<TD>"+a_sArray2[(f*nColumnas)+g]+"</TD>"	
		}
		sHTML += "</TR>"	
	}
	sHTML += "</TABLE>"	
	return (sHTML)
}

function ErrorTabla(sError,oObj,nAlertType){
var sMsgError;
	if (nAlertType) {
		var sLib = "i_tablas.js [" + oITablas.m_nVersion + "] "
		if (!oObj) oObj = sLib
		else sError = sLib + " " + sError
		ErrorJS (sError,oObj,nAlertType-1)
	}
	else if (!oCore.m_sServer=="DEV") {
		sMsgError = "<B><FONT color='#ff0000'>Error Tabla</FONT> Bloque " + g_sEXMLerror + "</B>: " + sError + "<BR>"
		g_oTablaActiva.m_sPreHTML += sMsgError
	}
}


//Recalcula Tabla cuando borramos/añadimos elementos
function InitTabla(vTabla){
	if (typeof(vTabla)=="string") oTabla = eval (vTabla)
	else oTabla = vTabla
	oTabla.f_initTabla()
	

}

// vTabla,[sCampoOrder],[vRefresh],[bDebug]
// vRefresh: bRefresh/MArray
function PintaTabla (vTabla,sCampoOrder,vRefresh,bDebug) {
	if (typeof(vTabla)=="string") oTabla = eval (vTabla)
	else oTabla = vTabla
	oTabla.f_printTabla	(sCampoOrder,bDebug,vRefresh)
}

// oTabla / "sTabla"
function OrdenarTabla(vTabla,sCampo,bNotPrint){
var oTabla,nCampo,sCampoC,nPos,nPos2=-1

	if (typeof(vTabla)=="string") oTabla = eval (vTabla)
	else oTabla = vTabla

	if (oTabla.m_maTabla.f_maGetRegs()==0) return

	if (oTabla.m_a_sOrden=="") oTabla.m_a_sOrden = []	
//	if (oTabla.m_a_sOrden=="" || oTabla.m_a_sOrden.length<oTabla.m_maTabla[0].length) {
//		oTabla.m_a_sOrden =  oTabla.m_a_sOrden.concat(oTabla.m_maTabla[0])
//	}

	sCampo = String (sCampo)
	nCampo = sCampo.length - 5		// " DESC"
	sCampoC = sCampo
	if (nCampo>0 && sCampo.lastIndexOf(" DESC")==nCampo) {
		sCampoC= sCampo.substring (0,nCampo)
	}

//	nPos = BuscaEnArray (oTabla.m_a_sOrden,sCampo)
	nPos = oTabla.m_a_sOrden.f_indexOf (sCampo)
//	if (nPos==-1) nPos = BuscaEnArray (oTabla.m_a_sOrden,sCampoC,1)
	if (nPos==-1) nPos = oTabla.m_a_sOrden.f_indexOf (sCampoC,"",1)
	if (nPos==-1) {
//		nPos = BuscaEnArray (oTabla.m_maTabla[0],sCampoC,1)
		var a_sCOLs = (oTabla.m_maTabla.m_a_sCOLs.length>0) ? oTabla.m_maTabla.m_a_sCOLs : oTabla.m_maTabla[0];
		nPos = a_sCOLs.f_indexOf (sCampoC,"",1)
		if (nPos!=-1) nPos=sCampo 
	}

	if (nPos!=-1)  {
		if (!isNaN(nPos)) oTabla.m_a_sOrden[nPos] = sCampo
		oTabla.f_ordenarTabla(nPos,bNotPrint,oTabla.m_nPagina)		// 1.182 ,oTabla.m_nPagina
	}

}

// [bKeepFilter] Hace busqueda dentro de los resultados de la busqueda anterior (si sCampo es distinto) 
function BuscarTabla(sObjeto,sCampo,sTexto,bCaseDependiente,bExact,bAcentoDependiente,bKeepFilter,bDistintos){
	eval (sObjeto+".f_buscarTabla(sCampo,sTexto,bCaseDependiente,bExact,bAcentoDependiente,bKeepFilter,bDistintos)")
}

function EditarTabla(sObjeto,nReg){
	eval (sObjeto+".f_editarTabla(nReg)")
}

function ValidarTabla(sObjeto,oInput,bNotSubmit,bNotRepinta){
	oTabla = eval (sObjeto)
	SubmitTabla(oTabla,oInput,bNotSubmit,bNotRepinta)
}

// oTabla,[oInput],[bNotSubmit],[bNotRepinta]
function SubmitTabla(oTabla,oInput,bNotSubmit,bNotRepinta){
var nReg,f,sCampo,vValor,oForm
	if (oInput) oForm = oInput.form
	if (ValidarForm(oForm)){
		nReg = oTabla.m_nRegEditC
		if (!oForm) oForm=GetForm()
		for (f=0;f<oForm.length;f++) {
	 		if (ValidarInput (oForm[f],1)) {
				sCampo = oForm[f].name.substr(2)
				vValor = oForm[f].value		
				SetMArray(oTabla.m_sJSarrayBase,sCampo,nReg-1,vValor)
				CampoModificado(oTabla,sCampo)
			}
		}
		if (!bNotSubmit) SubmitForm()	//oForm.submit()
		if (!bNotRepinta) oTabla.f_printTabla()
	}
}

function SetCampoTabla(oTabla,oInput,sCampo,nReg,bNotRepinta){
	if (!ValidarCampo (oInput)){
		vValor = oInput.value
		SetMArray(oTabla.m_sJSarrayBase,sCampo,nReg,vValor)
		CampoModificado(oTabla,sCampo)
		if (!bNotRepinta) oTabla.f_printTabla()
	}
}

function CampoModificado(sObjeto,sCampo){			//Reseteamos Resultados cuando modificamos datos
	eval ("sObjeto.m_nSUMA"+sCampo+"=undefined")	
}

function OcultarColumna(sObjeto,nColumna,bOculta){
	var oTabla = eval (sObjeto)
	var nColumnas = oTabla.m_nColumnas
	if (nColumna > nColumnas) ErrorTabla("OcultarColumna() : la columna "+ nColumna +" no existe",oTabla,1)
	else oTabla.f_ocultarColumna(nColumna,bOculta)
}

function MinimizarTabla(sObjeto){
	eval (sObjeto+".f_minimizarTabla()")
}

function AddFuncPre(sObjeto,sFuncion){
	eval (sObjeto+".f_addFuncPre(sFuncion)")
}

function AddFuncPost(sObjeto,sFuncion){
	eval (sObjeto+".f_addFuncPost(sFuncion)")
}

function AddHTMLPre(sObjeto,sHTML,bReplace){
var oTabla
	oTabla = eval (sObjeto)
	if (bReplace) oTabla.m_sPreHTML  = ""
	oTabla.m_sPreHTML += sHTML
}

function AddHTMLPost(sObjeto,sHTML,bReplace){
var oTabla
	oTabla = eval (sObjeto)
	if (bReplace) oTabla.m_sPostHTML  = ""
	oTabla.m_sPostHTML += sHTML
}

function ShowMarkTR(sObjeto){
	eval (sObjeto+".f_showMarkTR()")
}


function dtPrintSubTabla(a_nRegs){
	this.m_a_nOrden = a_nRegs
//	this.m_nRegistros = a_nRegs.length

	this.f_resetTabla()

	this.f_printTabla();

}


// Si hemos cambiado algo, usar vRefresh
// [bDrawFull] Devuelve TABLE con SPAN incluido (solo usarlo la primera vez y si no se usa oT.f_draw ni oT.f_print)
// [vRefresh] bRefresh/MArray
function dtPrintTabla(sCampoOrder,bDrawFull,vRefresh){
	var n
	var a_sHTML = []

	if (!this.m_oAct) this.f_init()			// Esto realmente deberia estar aqui? !!!


	if (vRefresh) this.f_initTabla(vRefresh)	

	for(n=0;n<this.m_a_sFuncsPre.length;n++){	//Ejecuta PRE PrintTabla
		eval(this.m_a_sFuncsPre[n]);
	}

/*
	sHTML = this.f_drawTabla(sCampoOrder)
	sHTML = this.m_sPreHTML + sHTML + this.m_sPostHTML
	if (bDebug) alert(sHTML)
	this.m_sHTML = sHTML
	this.m_oAct.f_innerHTML(this.m_sHTML);
*/
//	this.m_oAct.f_innerHTML( this.m_sPreHTML+this.f_drawTabla(sCampoOrder)+this.m_sPostHTML);

/*	
	this.m_oAct.f_innerHTML(this.m_sPreHTML);
	this.m_oAct.m_oElement.innerHTML +=	this.f_drawTabla(sCampoOrder);
	if (this.m_sPostHTML) this.m_oAct.m_oElement.innerHTML+=this.m_sPostHTML;
*/
	if (this.m_sPreHTML) a_sHTML.push(this.m_sPreHTML);
	a_sHTML.push(this.f_drawTabla(sCampoOrder));
	if (this.m_sPostHTML) a_sHTML.push(this.m_sPostHTML);

//alert(this.m_sObj+"\n"+a_sHTML.join(" "))
	if (this.m_oAct.m_oElement) {
		this.m_oAct.f_innerHTML (a_sHTML.join(" "))
//		this.m_oAct.m_oElement.innerHTML = a_sHTML.join(" ");
	}
	else {
		if (!bDrawFull) {
			ErrorJS("[i_tablas.dtPrintTabla] No existe el SPAN para la tabla. Falta bDrawFull, oT.f_print() u oT.f_draw()" )
		}
	}


//Antes la pintaba con setTimeout, quiza era para NS (y quiza ya no hace falta) !!!
//	setTimeout(this.m_oAct.m_sObj+".f_innerHTML("+this.m_sObj+".m_sHTML)",100);
//document.all[this.m_sObj].innerHTML = sHTML;
	if (this.m_sPlegadaId) {
		this.f_plegarTabla (2)
//		this.m_bPrintPlegada = 0	
	}

	for(n=0;n<this.m_a_sFuncsPost.length;n++){	//Ejecuta POST PrintTabla
		eval(this.m_a_sFuncsPost[n]);
	}
	
	if (bDrawFull) {
		return (this.f_draw(a_sHTML.join(" ")))
	}
}



function dtDrawTabla(sCampoOrder){
var sJSarrayBase,nFilas,nColumnas,nBloque,bOrdenar,nPagina,nPaginas,nFilasT,nColumnasT,nFila,nFilasK,sHTML,nTD,sHTMLtemp
var e,f,g,h,sEnlace,sFuncion,nPos
var sEXML,sEXML2,sEXML3,sEXMLnew,sEXMLtemp
var a_sTlist,nTlist,a_aTDstyle,a_aTDtexto,nStileL,nTextoL,a_sTDstyle,a_sTDtexto

	g_oTablaActiva = this;
//	if (!this.m_oAct) this.f_init()			// Esto realmente deberia estar aqui? !!!

//	if (this.m_sTablaVacia!="") return(this.m_sTablaVacia)
//	if (!this.m_nRegistros) return(this.m_sTablaVacia)	//1.165
	if (!this.m_nRegistros && this.m_sTablaVacia!="") return(this.m_sTablaVacia)	//1.176


//Esto creo que sobra porque ya lo hacemos en DynTabla() !!!
/*
	sJSarrayBase = this.m_sJSarrayBase		//Refresh
	if(IsArray(sJSarrayBase)){
		this.m_maTabla[0] = sJSarrayBase[0];
		this.m_maTabla[1] = sJSarrayBase[1];
	}
	else{
		this.m_maTabla[0] = eval ("a_s"+sJSarrayBase)
		this.m_maTabla[1] = eval ("a_v"+sJSarrayBase)		
	}
*/
	if (sCampoOrder) {
		OrdenarTabla(this,sCampoOrder,1)
//		OrdenarTabla(this.m_sObj,sCampoOrder,1)
	}

	nColumnas = this.m_nColumnas
	bOrdenar = this.m_bOrdenar
	nPagina = this.m_nPagina
	nPaginas = this.m_nPaginas
	this.m_nFila=1
	this.m_nRegistro=1

	this.m_nOrden=1
//	this.m_nRegEditC = 0

	nFilas = this.m_nFilas

/*
	nFilas = this.m_nFilasMax
	if (!nFilas) { 
		nFilas = this.m_sJSarrayBase.f_maGetRegs()
//		this.m_nFilas = nFilas	//1.168
	}
	this.m_nFilas = nFilas;

	this.m_nPaginas = (Math.floor((nRegs-1)/this.m_nFilas)) +1
*/

	nFilasT = this.m_nRegistros	//1.168
//	if (nFilas>nFilasT) nFilas = nFilasT	//1.168

//Inicio Tabla

	var a_sHTML = [];
	a_sHTML.push("<TABLE " + this.f_getData(0,"Style",0,1) + ">");

//	sHTML="<TABLE " + this.f_getData(0,"Style",0,1) + ">"

//	var oTableDOM = document.createElement (sHTML)
//	var oTBodyDOM = document.createElement ("TBODY")

	sHTML = ""
	
//Bloques
	a_sTlist=this.m_a_nTabla
	nTlist=a_sTlist.length
	for (e=0;e<nTlist;e=e+this.nTlistSize){
		sTipoBloque = a_sTlist[e].toString().toUpperCase()
		nBloque = a_sTlist[e+1]
		g_sEXMLerror = nBloque + " de tipo ["+sTipoBloque+"]";	//Para ERRORES por falta de datos

		if (nBloque>=this.m_a_oChilds.length){
			ErrorTabla("dtDrawTabla() : el bloque "+ g_sEXMLerror +" no existe",this,1)
		}

		a_aTDstyle = this.f_getData(nBloque,"Style",0)		//nBloque
		a_aTDtexto = this.f_getData(nBloque,"Datos",0)		//a_sTlist[e+2]

		sJSarrayBase = ""		//1.168
		if (a_aTDtexto.length==4 && IsMArrays(a_aTDtexto[3])) {		//1.168
			sJSarrayBase = a_aTDtexto[3]		//1.168
			nFilas = sJSarrayBase.f_maGetRegs()		//1.168
		}
		else {
			nFilas = this.m_nFilas		//1.168
		}
		if (nFilas>nFilasT) nFilas = nFilasT		//1.168

		switch (sTipoBloque) {			//Tipos de Blocks
		case "FIJO":
			sTipoBloque = "F"
			break
		case "TITULOS":
			sTipoBloque = "T"
			break
		case "DATOS":
			sTipoBloque = "D"
			break
		case "HTML_DATO":
			sTipoBloque = "HD1"
			break
		case "HTML_DATOS":
			sTipoBloque = "HD"
			break
		case "HTML_TITULOS":
			sTipoBloque = "HT"
			break
		case "HTML_PAGINAR":
			sTipoBloque = "HP"
			break
		case "HTML_PAGINAR_FIJO":
			sTipoBloque = "HPF"
			break
		case "HTML":
			sTipoBloque = "H"
			break
		case "HTML_FIJO":
			sTipoBloque = "HF"
			break
		case "HTML_BUSCAR":
			sTipoBloque = "HB"
			break
		case "BUSCAR":
			sTipoBloque = "B"
			break
		case "PAGINAR":
			sTipoBloque = "P2"
			break
		case "PAGINARFIJO":
			sTipoBloque = "P2F"
			break
		}

		if (this.m_bMinimizada!=0 && sTipoBloque!="F" && sTipoBloque!="V") sTipoBloque ="Nada"
//		if (sTipoBloque=="D") nFilasC =0

		switch (sTipoBloque) {			//Tipos de Blocks
		case "Nada":
			break

		case "T":
			nColumnasT=	this.f_getData(nBloque,"Datos",0,-1)-1
			sHTML += "<TR " + ParseEXMLs (a_aTDstyle[2],this,sJSarrayBase,0) + ">"
			nTD =  a_aTDstyle.length - 3
			for (f=0;f<nColumnasT;f++){
				if (!this.m_a_sOculta[f]){		//Columna visible
					sHTML += "<TD " + ParseEXMLs(a_aTDstyle[(f%nTD)+3],this,sJSarrayBase,0) + ">"	

					this.m_nOrden = 0
					if (this.m_nOrdenColumna==f) {
						this.m_nOrden = 1+this.m_nOrdenDir
					}
	
					sHTMLtemp = ParseEXMLs(a_aTDtexto[f+1],this,sJSarrayBase,0)

					if (this.m_a_sOrden[f]) {		//Ordena
						sFuncion = "\"" + this.m_sObj+".f_ordenarTabla("+f+")\""
//						sEnlace = "javascript:CreaSetTimeout("+sFuncion+")"
						sEnlace = "CreaSetTimeout("+sFuncion+")"
						nPos = sHTMLtemp.indexOf(g_sEXMLenlace)
						if (nPos!=-1){
							sHTMLtemp= sHTMLtemp.substr(0,nPos)+sEnlace+sHTMLtemp.substr(nPos+g_sEXMLenlace.length)
						}
						else{
//							sHTMLtemp= "<a href='" + sEnlace + "'>"+ sHTMLtemp + "</a>"							
							sHTMLtemp= "<a onclick='" + sEnlace + "'>"+ sHTMLtemp + "</a>"							
						}
					}
					sHTML+= sHTMLtemp + "</TD>"
				}
			}
			sHTML += "</TR>"
			break
		case "P2":
			if (nFilas>=nFilasT) break		//
		case "P2F":

			sHTML += "<TR><TD colspan="+nColumnas+" style='padding:0'>"
			sHTML += "<TABLE "+ParseEXMLs (a_aTDstyle[1],this,sJSarrayBase,0)+">"
			sHTML += "<TR " + ParseEXMLs (a_aTDstyle[2],this,sJSarrayBase,0) + ">"

			nColumnasC = a_aTDtexto.length - 2
			nTD 	=  a_aTDstyle.length - 3
			
			for (g=0;g<nColumnasC;g++){
				sHTML += "<TD " + ParseEXMLs (a_aTDstyle[(g%nTD)+3],this,sJSarrayBase,0)  + ">"	
				sEXML = a_aTDtexto[g+2]
				var n = GetTagEXML (sEXML,"ENLACE")

				switch (n) {
				case "INI":
					n = "0"
					break
				case "FIN":
					n = -9
					break
				case "-":
					n = -1
					break
				case "+":
					n = 1
					break
				}				
				if (n!=""){
					n=parseInt (n)
					if (n>1){			// Pinta n Paginas
						var nPaginaC = 0
						sEXML2 = sEXML
						sEXML = ""

						var nPaginaInicial = nPagina - Math.floor(n/2)
						if (nPaginaInicial<=0) nPaginaInicial=1
						var nPaginaFinal = nPaginaInicial+ (n-1)
						if (nPaginaFinal>nPaginas) {
							nPaginaFinal= nPaginas
							nPaginaInicial = nPaginas - (n-1) 
							if (nPaginaInicial<=0) nPaginaInicial=1
						}

						if (nPaginaInicial>1) sEXML += this.m_sPaginacionPre

						for (h=nPaginaInicial;h<=nPaginaFinal;h++){
							if (h==nPagina){
								sEXML += h + "&nbsp;"
							}
							else{
								sFuncion = "\"" + this.m_sObj+".f_paginarTabla("+ h + ")\""
								sEnlace = "javascript:CreaSetTimeout("+sFuncion+")"
								sEXML3 = SetTagEXML (sEXML2,"PAGINA ",h,1)	
								sEXML += SetTagEXML (sEXML3,"ENLACE",sEnlace,0)							
							}
							if (h>=nPaginas) break
						}
						if (nPaginaFinal<nPaginas) sEXML += this.m_sPaginacionPost
					}
					else{
						if (Math.abs(n)==1) {
							n += nPagina
						}
						else {
							if (n==0) n=1
							if (n==-9) n=nPaginas
						}
						if (this.m_nPaginacionModo!=2 && (n==0 || n>nPaginas || n==nPagina)){
							if (!this.m_nPaginacionModo) sEXML ="&nbsp;"
							else sEXML = GetTagEXML (sEXML,"A")
						}
						else{
							sFuncion = "\"" + this.m_sObj+".f_paginarTabla("+ n + ")\""
							sEnlace = "javascript:CreaSetTimeout("+sFuncion+")"
							sEXML = SetTagEXML (sEXML,"ENLACE",sEnlace,0)
						}
					}
				}
				sHTML += ParseEXMLs (sEXML,this,sJSarrayBase,0)
				sHTML += "</TD>"	
			}
			sHTML += "</TR>"	
			sHTML += "</TABLE>"
			sHTML += "</TD></TR>"

			break
		case "P":
			if (nFilas>=nFilasT) break		//nPagina && 
		case "PF":
			sHTML += "<TR><TD colspan="+nColumnas+" style='padding:0'>"
			sHTML += "<TABLE "+ParseEXMLs (a_aTDstyle[1],this,sJSarrayBase,0)+">"
			sHTML += "<TR " + ParseEXMLs (a_aTDstyle[2],this,sJSarrayBase,0) + ">"

			sHTML += "<TD "+ ParseEXMLs(a_aTDstyle[3],this,sJSarrayBase,0) +">&nbsp;"	
			if (nPagina>1) {
				sFuncion = "\"" + this.m_sObj+".f_paginarTabla("+ (nPagina-1) + ")\""
//				sEnlace = "javascript:CreaSetTimeout("+sFuncion+")"
				sEnlace = "CreaSetTimeout("+sFuncion+")"
				sHTMLtemp = a_aTDtexto[2]
				nPos = sHTMLtemp.indexOf(g_sEXMLenlace)
				if (nPos!=-1){
					sHTML += sHTMLtemp.substr(0,nPos)+sEnlace+sHTMLtemp.substr(nPos+g_sEXMLenlace.length)
				}
				else{
//					sHTML += "<a href='"+ sEnlace +"'>"+sHTMLtemp+"</a>"
					sHTML += "<a onclick='"+ sEnlace +"'>"+sHTMLtemp+"</a>"
				}
			}	
			sHTML += "</TD>"

			sHTML += "<TD "+ ParseEXMLs(a_aTDstyle[4],this,sJSarrayBase,0) + ">"	
			sHTML += ParseEXMLs(a_aTDtexto[3],this,sJSarrayBase,0)
			sHTML += "</TD>"

			sHTML += "<TD "+ParseEXMLs(a_aTDstyle[5],this,sJSarrayBase,0)+">&nbsp;"
			if ((nFilas*nPagina)<nFilasT) {
				var sFuncion = "\"" + this.m_sObj+".f_paginarTabla("+ (nPagina+1) + ")\""
//				sEnlace = "javascript:CreaSetTimeout("+sFuncion+")"
				sEnlace = "CreaSetTimeout("+sFuncion+")"
				sHTMLtemp = a_aTDtexto[4]
				nPos = sHTMLtemp.indexOf(g_sEXMLenlace)
				if (nPos!=-1){
					sHTML += sHTMLtemp.substr(0,nPos)+sEnlace+sHTMLtemp.substr(nPos+g_sEXMLenlace.length)
				}
				else{
//					sHTML += "<a href='"+ sEnlace +"'>"+sHTMLtemp+"</a>"
					sHTML += "<a onclick='"+ sEnlace +"'>"+sHTMLtemp+"</a>"
				}
			}
			sHTML += "</TD>"	

			sHTML += "</TR>"	
			sHTML += "</TABLE>"
			sHTML += "</TD></TR>"

			break
		case "B":
				if (this.m_sBusqueda=="") break
		case "E":
		case "F":
				sHTML += "<TR><TD colspan="+nColumnas+" style='padding:0'>"			//Faltan estilos para este TR y TD !!!
				sHTML += "<TABLE "+ParseEXMLs (a_aTDstyle[1],this,sJSarrayBase,0)+">"
				sHTML += "<TR " + ParseEXMLs (a_aTDstyle[2],this,sJSarrayBase,0) + ">"
				nColumnasC = a_aTDtexto.length - 2
				nTD 	=  a_aTDstyle.length - 3
				for (g=0;g<nColumnasC;g++){
					sHTML += "<TD " + ParseEXMLs (a_aTDstyle[(g%nTD)+3],this,sJSarrayBase,0)  + ">"	
					sHTML += ParseEXMLs (a_aTDtexto[g+2],this,sJSarrayBase,0)
					sHTML += "</TD>"	
				}
				sHTML += "</TR>"	
				sHTML += "</TABLE>"
				sHTML += "</TD></TR>"
				if (sTipoBloque=="B") this.m_sBusqueda=""			//limpio la busqueda
			break

		case "HT":
			sEXML = ParseHTML_TITULOS (this,a_aTDtexto[2])
			sHTMLtemp = ParseEXMLs (sEXML,this,sJSarrayBase,0)
			sHTML += (this,sHTMLtemp)
			break

		case "HP":
			if (nFilas>=nFilasT) break
		case "HPF":
			sEXML = ParseHTML_PAGINAR (this,a_aTDtexto[2])
			sHTML += ParseEXMLs (sEXML,this,sJSarrayBase,0)
			break
		case "HD":
			nFilasC =0
		case "HD1":
			if (sTipoBloque=="HD1") nFilasC = 1
		case "HB":
			if (sTipoBloque=="HB" ) {
				if (this.m_sBusqueda=="") break
				nFilasC = 1
			}
		case "HF":
			if (sTipoBloque=="HF") nFilasC = 1
		case "H":
			if (sTipoBloque=="H") nFilasC = 1
			sEXML = a_aTDtexto[2]
			if(!nFilasC && this.m_sOrdenColor && this.m_nOrdenColumna!=null) {
				nPos = sEXML.f_indexOf ("<TD",0,1,this.m_nOrdenColumna+1)
				if (nPos!=-1) {
					sOrdenColor=" bgcolor='"+ this.m_sOrdenColor +"'"
					sEXML = sEXML.f_replace ("<TD",sOrdenColor,2,1,nPos)
				}
			}
			nFilaDatos=0
			nDatoInicial = 0
			if (nPagina>1) nDatoInicial=((nPagina-1)*nFilas)
			nFilasK = nFilas
			if ((nDatoInicial+nFilasK)>nFilasT) nFilasK = nFilasT - nDatoInicial		
//			if (nFilasC && sTipoBloque!="HD1") nFilasK = nFilasC
			if (nFilasC) nFilasK = nFilasC

//alert (nFilaDatos + "_" + nDatoInicial)
			while (nFilaDatos<nFilasK){
				nFila = nFilaDatos
//status+="["+nFila+"]"
				nFila += nDatoInicial
				this.m_nFila=nFilaDatos+1		//¿para que valen?
				if (bOrdenar) nFila = this.m_a_nOrden[nFila]
//status+="{"+nFila+"}"
				this.m_nRegistro=nFila+1
				sEXMLtemp = sEXML;
				if (nFilasC==0 && a_aTDtexto[1]==1 && this.m_nRegEdit && this.m_nRegEdit == this.m_nRegistro){
//					this.m_nRegEditC = nFila
					var a_aTDtextoT = this.f_getData(nBloque,"Input",0)
					if (!a_aTDtextoT) ErrorTabla("dtDrawTabla() : el bloque de Inputs para Editar no existe",this,1)
					sEXMLtemp = a_aTDtextoT[2]
				}
				if (!nFilasC && this.m_a_bMark[nFila]) {
					sMarkColor=" bgcolor='"+ this.m_sMarkColor +"'"
					sEXMLtemp = sEXMLtemp.f_replace ("<TR",sMarkColor,2,1)
				}
				sHTMLtemp = ParseEXMLs (sEXMLtemp,this,sJSarrayBase,nFila)
				if (sTipoBloque!="HF") sHTMLtemp = RemoveTDocultos(this,sHTMLtemp)
//				sHTML += sHTMLtemp
				a_sHTML.push(sHTMLtemp);
				nFilaDatos ++
			}
			break

		default:
			nFilasC = sTipoBloque
			if (sTipoBloque=="D") nFilasC =0
			nStyleL = this.f_getData(nBloque,"Style",-1)		//a_sTlist[e+1]
			nTextoL = this.f_getData(nBloque,"Datos",-1)		//a_sTlist[e+2]
			nFilaDatos=0
			nDatoInicial = 0
			if (nPagina>1) nDatoInicial=((nPagina-1)*nFilas)
			f=0
			nFilasK = nFilas
			if ((nDatoInicial+nFilasK)>nFilasT) nFilasK = nFilasT - nDatoInicial		
			if (nFilasC) nFilasK = nFilasC
			if (nFilasC=="V") nFilasK=1

//alert(nFilas+"_"+nFilaDatos+"_"+nFilasK+"_"+nFilasC)

			while (nFilaDatos<nFilasK){
				nFila = nFilaDatos
				nFila += nDatoInicial
				this.m_nFila=nFilaDatos+1
				if (bOrdenar) nFila = this.m_a_nOrden[nFila]
				this.m_nRegistro=nFila+1
//if (bOrdenar) alert(GetMArray("Clientes","nombre",nFila)
				a_sTDstyle = this.f_getData(nBloque,"Style",f%nStyleL)
				a_sTDtexto = this.f_getData(nBloque,"Datos",f%nTextoL)

				if (nFilasC==0 && a_sTDtexto[1]==1 && this.m_nRegEdit && this.m_nRegEdit == this.m_nRegistro){
//					this.m_nRegEditC = nFila
					a_sTDtexto = this.f_getData(nBloque,"Input",0)
					if (!a_sTDtexto) ErrorTabla("dtDrawTabla() : el bloque de Inputs para Editar no existe",this,1)
				}

				nColumnasC = a_sTDtexto.length - 2
//if ((nColumnasC)>nColumnas) alert(nColumnasC+"sobran datos"+nColumnas)

				sMarkColor=""
				if (!nFilasC && this.m_a_bMark[nFila]) sMarkColor="bgcolor='"+ this.m_sMarkColor +"' "

				sHTML += "<TR " + sMarkColor + ParseEXMLs (a_sTDstyle[1],this,sJSarrayBase,nFila) + ">"	
				nTD 	=  a_sTDstyle.length - 2
				for (g=0;g<nColumnasC;g++){			//Columnas
					var sOrdenColor = "";
					if (!this.m_a_sOculta[g]){		//Columna visible
						if (a_sTDtexto[1]==1 && this.m_sOrdenColor && g==this.m_nOrdenColumna) sOrdenColor=" bgcolor='"+ this.m_sOrdenColor +"'"
						sHTML += "<TD " + ParseEXMLs (a_sTDstyle[(g%nTD)+2],this,sJSarrayBase,nFila) + sOrdenColor + ">"	
						sHTML += ParseEXMLs (a_sTDtexto[g+2],this,sJSarrayBase,nFila)
						sHTML += "</TD>"	
					}
				}
				sHTML += "</TR>"	
				f++
				if (!(f%nTextoL)) nFilaDatos ++		// si termino un bloque, cuento la fila
			}
		}
		if (sHTML) {
			a_sHTML.push(sHTML);
			sHTML = ""
		}

//		this.m_oAct.m_oElement.innerHTML+=sHTML;
//		oTRDOM = document.createElement("TR")
//		oTableDOM.appendChild (oTRDOM) 

//		oTBodyDOM.innerHTML += sHTML 
//		sHTML = ""
	}
//	oTableDOM.appendChild(oTBodyDOM);
//	this.m_oAct.m_oElement.appendChild(oTableDOM);
	a_sHTML.push("</TABLE>");
//	this.m_oAct.m_oElement.innerHTML+=a_sHTML.join('');
	return (a_sHTML.join(''))
	
//	sHTML += "</TABLE>"
//	this.m_oAct.m_oElement.innerHTML+=sHTML;
//	return (sHTML)
}

function CreaSetTimeout(sFuncion,nTime){
	if (nTime=="") nTime=1
	if (oIGZ.m_bNS4){
		setTimeout(sFuncion,nTime)
	}
	else{
		eval (sFuncion)
	}
}

function ParseHTML_TITULOS (oTabla,sEXML) {
	var nOrdenCol = 0;
	var nPos=0;
	
	var sOrderTag = GetTagEXML (sEXML,"ORDERBY",1)
	while (sOrderTag){
		oTabla.m_nOrden = 0
		if (oTabla.m_nOrdenColumna==nOrdenCol) {
			oTabla.m_nOrden = 1+oTabla.m_nOrdenDir
		}
		nPos = sEXML.f_indexOf ("sOrderTag",0,0);   //replace desde sOrderTag los <OBJ>nOrden</OBJ> por m_nOrden
		sEXML = sEXML.f_replace ("<OBJ>nOrden</OBJ>",oTabla.m_nOrden,0,1,nPos)
		
		oTabla.m_a_sOrden[nOrdenCol] = GetTagEXML (sOrderTag,"ORDERBY")
		
		var sFuncion = "\"" + oTabla.m_sObj+".f_ordenarTabla("+nOrdenCol+")\""
		var sEnlace = "javascript:CreaSetTimeout("+sFuncion+")"
		
		sEXML = SetTagEXML (sEXML,"ORDERBY",sEnlace,0)
		
		nOrdenCol++
		sOrderTag = GetTagEXML (sEXML,"ORDERBY",1)
	}

	return (sEXML);
}


function ParseHTML_PAGINAR (oTabla,sEXML) {
	var n,h,nPaginaC,nPaginaInicial,nPaginaFinal;
	var sEXMLtemp,sEXMLnew,sEXML2,sEXML3;
	var sFuncion,sEnlace;
	var sOuterTag;

	var nPagina = oTabla.m_nPagina;
	var nPaginas = oTabla.m_nPaginas;
	
	var sEnlaceTag = GetTagEXML (sEXML,"ENLACE",1)
	while (sEnlaceTag){	
		n = GetTagEXML (sEnlaceTag,"ENLACE")
		sEXMLtemp = ""
		sEXMLnew = ""
		
		if (n!=""){
			switch (n) {
			case "INI":
				n = "0"
				break
			case "FIN":
				n = -9
				break
			case "-":
				n = -1
				break
			case "+":
				n = 1
				break
			}				
			n=parseInt (n)
			if (n>1){			// Pinta n Paginas
				nPaginaC = 0
				sEXML2 = sEXML

				nPaginaInicial = nPagina - Math.floor(n/2)
				if (nPaginaInicial<=0) nPaginaInicial=1
				nPaginaFinal = nPaginaInicial+ (n-1)
				if (nPaginaFinal>nPaginas) {
					nPaginaFinal= nPaginas
					nPaginaInicial = nPaginas - (n-1) 
					if (nPaginaInicial<=0) nPaginaInicial=1
				}

				sOuterTag = GetOuterTag (sEXML,sEnlaceTag,"A");
				if (nPaginaInicial>1) sEXMLtemp += oTabla.m_sPaginacionPre
//alert(nPaginaInicial+"_"+nPaginaFinal)

				if (nPaginaInicial>nPaginaFinal) nPaginaFinal=nPaginaInicial
				for (h=nPaginaInicial;h<=nPaginaFinal;h++){
					if (h==nPagina || nPaginas==0){
						sEXMLnew += h;
					}
					else{
						sFuncion = "\"" + oTabla.m_sObj+".f_paginarTabla("+ h + ")\""
						sEnlace = "javascript:CreaSetTimeout("+sFuncion+")"
						sEXML3 = SetTagEXML (sOuterTag,"PAGINA ",h,1);
						sEXMLnew += SetTagEXML (sEXML3,"ENLACE",sEnlace,0);						
					}
					sEXMLnew += "&nbsp;"
					if (h>=nPaginas) break
				}
				if (nPaginaFinal<nPaginas) sEXMLnew += oTabla.m_sPaginacionPost
			}
			else{
				if (Math.abs(n)==1) {
					n += nPagina
				}
				else {
					if (n==0) n=1
					if (n==-9) n=nPaginas
				}
				if (nPaginas==0 || (oTabla.m_nPaginacionModo!=2 && (n==0 || n>nPaginas || n==nPagina))){
					if (!oTabla.m_nPaginacionModo) sEXMLnew ="&nbsp;"
					else {
						sOuterTag = GetOuterTag (sEXML,sEnlaceTag,"A");
						sOuterTag = SetTagEXML (sOuterTag,"ENLACE");
						sEXMLnew = GetTagEXML (sOuterTag,"A");
					}
				}
				else {
					sFuncion = "\"" + oTabla.m_sObj+".f_paginarTabla("+ n + ")\""
					sEnlace = "javascript:CreaSetTimeout("+sFuncion+")"
					sEXMLtemp = sEnlace
				}
			}
			if (sEXMLnew) {
				sOuterTag = GetOuterTag (sEXML,sEnlaceTag,"A");
				sEXML = sEXML.f_replace(sOuterTag, sEXMLnew,0,1);
			}
			else{
				sEXML = SetTagEXML (sEXML,"ENLACE",sEXMLtemp,0)
			}		
		}
		sEnlaceTag = GetTagEXML (sEXML,"ENLACE",1)
	}
	return (sEXML)
}

function RemoveTDocultos(oTabla,sHTMLtemp){ 
var f,nPos,sTag
	for (f=oTabla.m_a_sOculta.length;f>0;f--){
		if (oTabla.m_a_sOculta[f-1]){
			nPos = sHTMLtemp.f_indexOf ("<TD",0,1,f)
			if (nPos==-1) ErrorTabla ("RemoveTDocultos() : la columna "+f+" no se encuentra ",oTabla,1)
			else {
				sTag = GetTagEXML (sHTMLtemp.substring(nPos),"TD",1)
				if (sTag) sHTMLtemp = sHTMLtemp.f_replace (sTag,"",0,1,nPos)
			}
//alert(f + " "+ nPos + " " + sTag +" " )
		}
	}
	return (sHTMLtemp)
}

function dtOrdenarTabla(nColumna,bNotPrint,nPagina){
var f,sJSarrayBase,nDir=0,a_vArray,sCampo,nCampo,a_nOrdenOld,a_nOrden
	sJSarrayBase = this.m_sJSarrayBase

	if (isNaN (nColumna)) {
		sCampo = nColumna
	}
	else {
		if (this.m_nOrdenColumna==nColumna){
			nDir = this.m_nOrdenDir + 1
			if (nDir>=2) nDir=0
		}
		else {
			nDir=0
		}
		this.m_nOrdenDir = nDir
		sCampo= this.m_a_sOrden[nColumna]
	}

	this.m_sOrdenCampo = sCampo
	nCampo = sCampo.length - 5
	if (nCampo>0 && sCampo.lastIndexOf(" DESC")==nCampo) {
		nDir = 1&(~nDir)
		sCampo= sCampo.substring (0,nCampo)
	}

	if ( this.m_bGuardarEstado ){	  //!!!QUIQUE Guardar Estado
		var sParamOrder = sCampo + ( nDir == 0 ? "" : " DESC" );
		navigator.f_setParamTabla( window.location.href + this.m_sObj + "_orden", sParamOrder )
	}
//alert(sJSarrayBase.f_maDebug ())
//alert(this.m_maTabla[0])

	if (this.m_nRegistros != this.m_nRegistrosT) {		//Hay una busqueda activa		
		var a_sCOLs = (this.m_maTabla.m_a_sCOLs.length>0) ? this.m_maTabla.m_a_sCOLs : this.m_maTabla[0];
		var maSubArray = [a_sCOLs]
		maSubArray[0] = a_sCOLs;
		maSubArray[1] = [];
		SubMArray (sJSarrayBase,maSubArray[1],this.m_a_nOrden)
		sJSarrayBase = maSubArray
		a_nOrdenOld = this.m_a_nOrden
	}
 
//alert(sJSarrayBase.f_maDebug ())

	if (this.m_sPlegadaId) {			//Ordeno padres y sueltos
		var nReg, nId, nPos, a_nHijosIdx, a_nHijos
//alert(this.m_maTabla.f_maSubIndexOf (this.m_sPlegadaIdPadre,"",1))
		var a_nPadresIdx = this.m_a_nPlegadaRegsPadres.concat(this.m_maTabla.f_maSubIndexOf (this.m_sPlegadaIdPadre,"",1))
		a_nOrden = this.m_maTabla.f_maSubSort (a_nPadresIdx,sCampo,1,nDir)
		for (f=0;f<this.m_a_nPlegadaIdsPadres.length;f++){	//Cojo hijos y Ordeno hijos de padre x
			nReg = this.m_a_nPlegadaRegsPadres[f]
			nId  = this.m_a_nPlegadaIdsPadres [f]
			a_nHijosIdx = this.m_maTabla.f_maSubIndexOf(this.m_sPlegadaIdPadre,nId,1)
			//Busco pos de reg 		
			nPos = a_nOrden.f_indexOf (nReg,"",1)
//alert (nPos +"\n"+ nReg+"_"+nId+"\n"+a_nOrden+"\n"+a_nHijosIdx+"\nReg:"+this.m_a_nPlegadaRegsPadres+"\n\nId:"+this.m_a_nPlegadaIdsPadres)	
			if (nPos!=-1) {
//alert(a_nHijosIdx+"_"+sCampo+"_"+nDir)
				a_nHijos = this.m_maTabla.f_maSubSort (a_nHijosIdx,sCampo,1,nDir)
				//Los inserto detras del padre x
				a_nOrden = a_nOrden.f_insert (a_nHijos,nPos+1)
			}
		}
//alert (this.m_maTabla.f_maSubSort (a_nPadresIdx,sCampo,1,nDir) +"\n"+a_nOrden+"\n"+this.m_a_nPlegadaRegsPadres)
	}
	else {
		a_nOrden = sJSarrayBase.f_maSort(sCampo,1,nDir)
	}
	
	if (a_nOrden) {				//Ha ordenado
		this.m_a_nOrden = a_nOrden
	
		if (a_nOrdenOld) {
			for (var f = 0; f < a_nOrdenOld.length ; f++){
				this.m_a_nOrden[f]=  a_nOrdenOld[this.m_a_nOrden[f]]
			}
		}
		if (!isNaN (nColumna)) this.m_nOrdenColumna=nColumna

	  //!!!QUIQUE Guardar Estado
		if ( IsNull( nPagina ) || isNaN( nPagina ) ){
			this.m_nPagina = 1;
		  	if ( this.m_bGuardarEstado ){
		  		navigator.f_setParamTabla( window.location.href + this.m_sObj + "_pagina", 1 )
			}
	  	}
	  	else{
			this.m_nPagina = nPagina;
		}
	  //!!!QUIQUE
		this.m_bOrdenar = 1
	//	this.m_nRegistros = this.m_nRegistrosT
		if (!bNotPrint) this.f_printTabla();
	}
}

function dtBuscarTabla(sCampo,sTexto,bCaseDep,bExact,bAcentoDep,bKeepFilter,bDistintos,sLogic){
	if (this.m_bOrdenar && bKeepFilter && this.m_sOrdenCampo!=sCampo){
		var a_vDatos = []
		var a_nListado = this.m_a_nOrden
		a_vDatos = (this.m_maTabla).f_maGetCol(sCampo)
		a_vDatos = a_vDatos.f_getVals  (this.m_a_nOrden)
//		this.m_a_nOrden = BuscarSubArray(a_vDatos,sTexto,1,bCaseDep,bExact,bAcentoDep)
		this.m_a_nOrden = a_nListado.f_getVals (a_vDatos.f_subIndexOf (sTexto,1,bCaseDep,!bExact,bAcentoDep))
		if (bDistintos) this.m_a_nOrden = a_nListado.f_subCompare (this.m_a_nOrden,0,0,0)
	}
	else {		//v1.182
/*
		for (f=0;f<sJSarrayBase.f_maGetRegs();f++){
			a_nListado[f] = f;
		}
		this.m_a_nOrden = BuscarSubMArray(sJSarrayBase,sCampo,sTexto,1,bCaseDep,bExact,bAcentoDep)
//BuscarSubMArray(sArrayBase,sCampo,sTexto,bIndices,bCaseDep,bExact,bAcentoDep)
		if (bDistintos) this.m_a_nOrden = a_nListado.f_subCompare (this.m_a_nOrden,0,0,0)
*/
			if (IsNull(bExact)) bExact=0
			this.m_a_nOrden = this.m_sJSarrayBase.f_maSubIndexOf (sCampo,sTexto,1,0,1,bCaseDep,!bExact,bAcentoDep,0,bDistintos,sLogic)
	}

/*
	a_nListado = a_nListado.concat (this.m_a_nOrden) 
alert (a_nListado + "\n" + this.m_a_nOrden)
	this.m_a_nOrden = a_nListado.f_subDistinct (0,0)
alert(this.m_a_nOrden)
*/
//	this.m_sOrdenCampo= sCampo			//v1.120
	this.m_sBusqueda = sTexto

	this.f_resetTabla()

	this.f_printTabla(this.m_sOrdenCampo)
}

function dtResetTabla () {
	this.m_nRegistros = this.m_a_nOrden.length
	this.m_nPaginas = (Math.floor((this.m_nRegistros-1)/this.m_nFilas)) +1

	this.m_nPagina = 1
	this.m_bOrdenar = 1

	if ( this.m_bGuardarEstado ){
	 	navigator.f_setParamTabla( window.location.href + this.m_sObj + "_buscar", this.m_a_nOrden );
	 	navigator.f_setParamTabla( window.location.href + this.m_sObj + "_m_nRegistros", this.m_nRegistros );
	 	navigator.f_setParamTabla( window.location.href + this.m_sObj + "_m_nPaginas", this.m_nPaginas );
	 	navigator.f_setParamTabla( window.location.href + this.m_sObj + "_m_sBusqueda", this.m_sBusqueda );
	}
	
}


function dtShowMarkTR(){
	this.m_a_nOrden = []

	var nMarks = 0
	for (var f=0;f<this.m_a_bMark.length;f++){
		if (this.m_a_bMark[f]) this.m_a_nOrden[nMarks++] = f
	}

	this.m_nRegistros = this.m_a_nOrden.length
	this.m_nPaginas = (Math.floor((this.m_nRegistros-1)/this.m_nFilas)) +1

	this.m_nPagina = 1
	this.m_bOrdenar = 1
	this.m_sBusqueda = ""		//sTexto

	this.f_printTabla()
}

function dtEditarTabla(nReg){
	var nPos = nReg-1
//	if (this.m_a_nOrden) nPos = BuscaEnArray (this.m_a_nOrden,nPos)
	//if (this.m_a_nOrden) nPos = this.m_a_nOrden.f_indexOf (nPos)
	if (this.m_a_nOrden && this.m_a_nOrden!="") nPos = this.m_a_nOrden.f_indexOf (nPos)

//		nPos = BuscaEnArray (oTabla.m_maTabla[0],sCampoC,1)

	this.m_nPagina = (Math.floor((nPos)/this.m_nFilas)) +1
//alert (nReg + "_" + nPos + "_" +this.m_nPagina+"_"+this.m_a_nOrden)

	this.m_nRegEdit = nReg
	this.m_nRegEditC = nReg
	this.f_printTabla()
	this.m_nRegEdit = 0
}

function dtMinimizarTabla(){
	this.m_bMinimizada ^= 1  

	this.f_printTabla()
}

function dtOcultarColumna(nColumna,bOculta){
var nColState,nCols=0
	nColState = this.m_a_sOculta[nColumna]
	if (nColState!=bOculta){
		nCols=1
		if (bOculta) nCols=-1
		this.m_a_sOculta[nColumna] = bOculta
	}

	this.m_nColumnas += nCols
//alert(this.m_nColumnas + "___" + ColumnasOcultas(this.m_a_sOculta))
	this.f_printTabla()
}

// *********************

//sCampoId,sCampoIdPadre,[bCreaRegPlegable],[bDesplegada]
function dtInitPlegarTabla(sCampoId,sCampoIdPadre,bCreaRegPlegable,bDesplegada,a_sCopiarCampos){
	oIGZ.f_require ("i_core",0.516);
	this.m_sPlegadaId = sCampoId
	this.m_sPlegadaIdPadre = sCampoIdPadre
	this.f_initArrayIdPadres(0)
	this.m_a_bPlegadaPadre = new Array (this.m_a_nPlegadaIdsPadres.length) 
	if (bCreaRegPlegable) this.f_registroPlegable(a_sCopiarCampos)
	this.f_marcarPlegarPadre ()
	this.f_initArrayIdPadres(1)
	var bPlegada = 1
	if (bDesplegada) bPlegada=0
	for (var f=0; f<this.m_a_bPlegadaPadre.length; f++){
		this.m_a_bPlegadaPadre[f] = bPlegada
	}
//	this.m_bPrintPlegada = 1
}


function dtPlegarTabla (nPlegar) {
	var f,nReg
//	var a_nRegsIndex = []
//Si le paso param deberia forzar la accion
//	if (bPlegar)

	for (f=0;f<this.m_a_nPlegadaRegsPadres.length;f++) {
//	this.m_a_nPlegadaRegsPadres = []
//	this.m_a_bPlegadaPadre = ""
		this.f_plegarPadre (this.m_a_nPlegadaRegsPadres[f],nPlegar)
	}

/*
	for (f=0; f<this.m_a_nPlegadaIdsPadres.length;f++){
		nReg = this.m_maTabla.f_maGetReg ( this.m_sPlegadaId, this.m_a_nPlegadaIdsPadres[f] ) 		
		if (nReg!=-1) a_nRegsIndex[a_nRegsIndex.length] = nReg
	}
	for (f=0;f<a_nRegsIndex.length;f++) {
		this.f_plegarPadre (a_nRegsIndex[f]+1)
	}
*/
}


function dtMarcarPlegarPadre () {
	var f,nReg
	for (f=0; f<this.m_a_nPlegadaIdsPadres.length; f++) {
		nReg = this.m_maTabla.f_maGetReg ( this.m_sPlegadaId, this.m_a_nPlegadaIdsPadres[f] ) 
		if (nReg!=-1){
			this.m_maTabla.f_maSetVal (this.m_sPlegadaIdPadre,this.m_cPlegadaPadre,nReg)
//			this.m_maTabla.f_maSetVal (this.m_sPlegadaId,"P"+f,nReg)
		}
	}	
}

function dtInitArrayIdPadres (bIndices) {
	if (bIndices){
		this.m_a_nPlegadaRegsPadres = this.m_maTabla.f_maSubIndexOf ( this.m_sPlegadaIdPadre,this.m_cPlegadaPadre, 1) 
//alert(this.m_a_nPlegadaRegsPadres)
// Este da errores cuando creas hijos:
//		this.m_a_nPlegadaRegsPadres = this.m_maTabla.f_maSubIndexOf ( this.m_sPlegadaId,this.m_a_nPlegadaIdsPadres, 1)
	}
	else{
		var a_nRegs = this.m_maTabla.f_maSubDistinct (this.m_sPlegadaIdPadre)
		vValor = ""
		var nReg = a_nRegs.f_indexOf (vValor) 
		if (nReg!=-1) a_nRegs = a_nRegs.f_delete ( nReg, 1 ) 
		this.m_a_nPlegadaIdsPadres = a_nRegs
	}
}


function dtRegistroPlegable (a_sCampos) {		// inserta un registro plegable
	var f,g,nReg
	var a_vPadres = this.m_a_nPlegadaIdsPadres
	if (!a_sCampos) a_sCampos = []
	for (f=0; f<a_vPadres .length; f++) {
		nReg = this.m_maTabla.f_maGetReg ( this.m_sPlegadaIdPadre, a_vPadres[f] ) 
		if (nReg!=-1){
			this.m_maTabla.f_maNewRow ("",nReg)
//			maTabla.f_maNewRow (maTabla.f_maGetRows (nReg),nReg)
			this.m_maTabla.f_maSetVal (this.m_sPlegadaId,a_vPadres[f],nReg)
//			this.m_maTabla.f_maSetVal (this.m_sPlegadaId,"P"+f,nReg)
			this.m_maTabla.f_maSetVal (this.m_sPlegadaIdPadre,"xxxxxxxxxxxx",nReg)
//alert (nReg +"\n"+ this.m_maTabla.m_a_aROWs[nReg].length+"\n"+ this.m_maTabla.f_maGetVal(this.m_sPlegadaIdPadre,nReg))
			for (g=0;g<a_sCampos.length;g++){
				this.m_maTabla.f_maSetVal (a_sCampos[g],this.m_maTabla.f_maGetVal(a_sCampos[g],nReg+1),nReg)			
			}

//alert (nReg+"_"+this.m_maTabla.f_maGetVal (this.m_sPlegadaId,nReg)+"_V:"+a_vPadres[f])
		}
	}	
}



// nModo: undefined / 0 / 1 / 2 : cambiar / plegar / desplegar / pintar estado actual
function dtPlegarPadre (nReg,nPlegado,oAnchor) {
	var nPos = this.m_a_nPlegadaRegsPadres.f_indexOf (nReg)
	var bEstadoActual = this.m_a_bPlegadaPadre[nPos]
	if (IsNull(nPlegado)) {
		nPlegado = 1-bEstadoActual
	}
	else {
		if (nPlegado==2) {
			nPlegado = bEstadoActual
		}
	}
	this.m_a_bPlegadaPadre[nPos] = nPlegado
	var sIdName = this.m_sObjeto + "_" + nReg
	var oTR = document.getElementById(sIdName)

	if (oTR) {
//		oTR = oTR.id
//DebugObj (oTR,10)
//alert(nPlegado+"____"+nTR+"_"+oTR+"xxx"+sIdName)

		oTR = eval (sIdName)		// v1.155 este eval es imprescindible para plegar/desplegar todas las filas relacionadas
		var nTR	= oTR.length	
		var sDisplay="inline"
		if (nPlegado) {
			sDisplay = "none"		
		}
		if (oAnchor) oAnchor.innerHTML = oAnchor.innerHTML.replace(RegExp("["+this.m_a_sPlegadaTexto[1^nPlegado]+"]",""), this.m_a_sPlegadaTexto[nPlegado]);

/*
	if (nTR) sDisplay = oTR[0].style.display
	else sDisplay = oTR.style.display
	if (sDisplay=="none") sDisplay = "inline"
	else sDisplay = "none"	
*/	
		if (nTR) {
			for (x=0;x<nTR;x++) {
		    	oTR[x].style.display=sDisplay;
			}
		}
		else { 
		    oTR.style.display=sDisplay;
		}
	}
	else {
/*
var oObj = oTR
var s=''
for (i in oObj){
	vValue=eval("oObj."+i);
	if (vValue!=null) s += i +" = "+vValue+"\t"
	if (i%4==0) s += "\n"
}
alert(s)
*/
		ErrorTabla("dtPlegarPadre: "+sIdName+" no tiene hijos o no se han pintado (¿paginacion, busqueda,...?) o a los TR de sus hijos les falta &lt;OBJ&gt;f_plegarPrintId()&lt;/OBJ&gt;",this)
	}
}

function dtPlegarEsPadre (nReg) {
	var bPadre=0
	if (nReg==undefined) nReg = this.m_nRegistro-1
	if (this.m_maTabla.f_maGetVal (this.m_sPlegadaIdPadre,nReg)==this.m_cPlegadaPadre) {
		bPadre=1
	}
	return (bPadre)
}

function dtPlegarEsHijo () {
	var bHijo=0
	var nReg = this.m_nRegistro-1
	var sTipo = this.m_maTabla.f_maGetVal (this.m_sPlegadaIdPadre,nReg)
	if (sTipo && sTipo!=this.m_cPlegadaPadre) {
		bHijo=1
	}
	return (bHijo)
}

function dtPlegarEsHuerfano () {
	var bHuerfano=0
	var nReg = this.m_nRegistro-1
	if (!this.m_maTabla.f_maGetVal (this.m_sPlegadaIdPadre,nReg)) {
		bHuerfano=1
	}
	return (bHuerfano)
}

//Deprecated
function dtPlegarHREF() {
	var sHTML = "javascript:"+this.m_sObjeto+".f_plegarPadre("+(this.m_nRegistro-1)+")"
	return (sHTML)
}

function dtPlegarOnClick() {
	var sHTML = this.m_sObjeto+".f_plegarPadre("+(this.m_nRegistro-1)+",null,this);return false"
	return (sHTML)
}


function dtPlegarPrintId () {
	var sHTML = ""
	var nReg = this.m_nRegistro-1
	var sIdPadre = this.m_maTabla.f_maGetVal (this.m_sPlegadaIdPadre,nReg )
	if (sIdPadre && sIdPadre!=this.m_cPlegadaPadre) {
//<OBJ>sObjeto</OBJ>_<BD>"+oTabla3.m_sPlegadaIdPadre+"</BD>'
		nRegPadre = this.m_maTabla.f_maGetReg (this.m_sPlegadaId,sIdPadre)
//if (nRegPadre==-1) ErrorJS("i_tablas - "+this.m_sPlegadaId+"_"+sIdPadre,this.m_maTabla,1)
		if (nRegPadre!=-1) sHTML += " id='"+this.m_sObjeto+"_"+ nRegPadre +"'"
	}
	return (sHTML)
}


function dtSumaPadre (a_sCampoSuma) {
	var f,g,nId,a_vSuma,nSuma
	if (!IsArray(a_sCampoSuma)) a_sCampoSuma = [a_sCampoSuma]
	for (f=0;f<this.m_a_nPlegadaRegsPadres.length;f++){
		nId = this.m_maTabla.f_maGetVal ( this.m_sPlegadaId, this.m_a_nPlegadaRegsPadres[f]) 
		for (g=0;g<a_sCampoSuma.length;g++){
			a_vSuma = this.m_maTabla.f_maSubValIf ( this.m_sPlegadaIdPadre, nId, a_sCampoSuma[g] )
			nSuma = a_vSuma.f_suma()
			this.m_maTabla.f_maSetVal ( a_sCampoSuma[g],nSuma,this.m_a_nPlegadaRegsPadres[f])
		}
	}	
}

function dtAvgPadre (a_sCampoAvg) {
	var f,g,nId,a_vAvg,nAvg
	if (!IsArray(a_sCampoAvg)) a_sCampoAvg = [a_sCampoAvg]
	for (f=0;f<this.m_a_nPlegadaRegsPadres.length;f++){
		nId = this.m_maTabla.f_maGetVal ( this.m_sPlegadaId, this.m_a_nPlegadaRegsPadres[f]) 
		for (g=0;g<a_sCampoAvg.length;g++){
			a_vAvg = this.m_maTabla.f_maSubValIf ( this.m_sPlegadaIdPadre, nId, a_sCampoAvg[g] )
			nAvg = a_vAvg.f_avg()
			this.m_maTabla.f_maSetVal ( a_sCampoAvg[g],nAvg,this.m_a_nPlegadaRegsPadres[f])
		}
	}	
}

function dtExmlPadre (sCampo,sEXML) {
	var f,nId,sHTML
	for (f=0;f<this.m_a_nPlegadaRegsPadres.length;f++){
		sHTML = ParseEXMLs (sEXML,"",this.m_maTabla,this.m_a_nPlegadaRegsPadres[f])
		this.m_maTabla.f_maSetVal (sCampo,sHTML,this.m_a_nPlegadaRegsPadres[f])
	}	
}

// *********************


function dtPaginarTabla(nPagina){
var sJSarrayBase,sHTML
	sJSarrayBase = this.m_sJSarrayBase

	if (nPagina>0 && nPagina<=this.m_nPaginas){	
	  //!!!QUIQUE Guardar Estado
		if ( this.m_bGuardarEstado ){
	  		navigator.f_setParamTabla( window.location.href + this.m_sObj + "_pagina", nPagina )
		}
	  //!!!QUIQUE
		this.m_nPagina = nPagina
		this.f_printTabla()
	}
}

function dtModuloPaginacion (sEstilo,nPags, nColspanSum) {
	if (!nPags) nPags=5
	if (!nColspanSum) nColspanSum = 0;
	var sClass= ""
	if (sEstilo) sClass = " class='"+sEstilo+"'"
	var sHTML = ""
	sHTML += "<TR"+sClass+">"
	sHTML += "	<TD colspan='<FUN><OBJ>nColumnas</OBJ>+"+nColspanSum+"</FUN>'>"
	sHTML += 	"<TABLE><TR>"
	sHTML +=		"<TD style='width=100%'>"+oIGZ.f_langText("Pagina")+" <B><OBJ>nPagina</OBJ></B> / <OBJ>nPaginas</OBJ> (<OBJ>nRegistros</OBJ> "+oIGZ.f_langText("Resultados")+")</TD>"
	sHTML +=		"<TD>(<A href='<ENLACE>INI</ENLACE>'>"+oIGZ.f_langText("Primera")+"</A>)</TD>"
	sHTML +=		"<TD>[<A href='<ENLACE>-</ENLACE>'>"+oIGZ.f_langText("Anterior")+"</A>]</TD>"
	sHTML +=		"<TD style='width="+(50*nPags)+"'><NOBR><A href='<ENLACE>"+nPags+"</ENLACE>'>[<PAGINA />]</A></NOBR></TD>"
//	sHTML +=		"<TD><TABLE border=1 style='width="+(25*nPags)+"'><TR><A href='<ENLACE>"+nPags+"</ENLACE>'>[<PAGINA />]</A></TR></TABLE></TD>"
	sHTML +=		"<TD>[<A href='<ENLACE>+</ENLACE>'>"+oIGZ.f_langText("Siguiente")+"</A>]</TD>"
	sHTML +=		"<TD>(<A href='<ENLACE>FIN</ENLACE>'>"+oIGZ.f_langText("Ultima")+"</A>)</TD>"
	sHTML += 	"</TR></TABLE>"
	sHTML += 	"</TD>"
	sHTML += "</TR>"
	return sHTML;
}	
	



function dtAddFuncPre(sFuncion){
	this.f_addFuncsPre("sFuncsPre",0,sFuncion)			 
}

function dtAddFuncPost(sFuncion){
	this.f_addFuncsPre("sFuncsPost",0,sFuncion)			 
}


function dtEstelaFila(bEstelaActiva,sColorIni,nPasos,nTime){
	this.m_bEstelaActiva = bEstelaActiva
	if (sColorIni) this.m_sColorIni = sColorIni
	if (nPasos) this.m_nPasos = nPasos
	if (nTime) this.m_nTime = nTime
}


// MultiColoresTR (['#e0e0e0','#c0c0c0'],['#e0f8e0','#c0d8c0'],<OBJ>nRegistro</OBJ>,['#308030','#606060'])
// [a_]sColorBase,[a_]sColorActivo,nRegistro,[a_sColorTexto]
function MultiColoresTR (a_sColorBase,a_sColorActivo,nRegistro,a_sColorTexto){
	var sColorBase="",sColorActivo="",sHTML = ""
	if (IsNull(nRegistro)) {
		ErrorTabla ("MultiColoresTR() : falta el parametro con el numero de registro")		
		nRegistro=0
	}

	if (!IsNull(a_sColorBase)) {
		if(typeof(a_sColorBase)=="string") a_sColorBase=a_sColorBase.split();	//String 2 Array
		sColorBase = a_sColorBase[nRegistro%(a_sColorBase.length)]
//if (sColorBase==" [object Object]") ErrorJS (sColorBase+a_sColorBase+"_"+nRegistro +"_"+a_sColorBase.length,"",1)
		sHTML += " bgcolor='"+sColorBase+"'"
	}
	
	if (!IsNull(a_sColorActivo)) {
		if(typeof(a_sColorActivo)=="string") a_sColorActivo=a_sColorActivo.split();
		sColorActivo = a_sColorActivo[nRegistro%(a_sColorActivo.length)]
	}


//	if (oIGZ.m_bIE && (sColorActivo || a_sColorTexto)){
	if ( (sColorActivo || a_sColorTexto)){
		if (!a_sColorTexto) a_sColorTexto = ["",""]

		sHTML += " onMouseover=\"ColorTR('"+sColorActivo+"',"+nRegistro+",'"+a_sColorTexto[0]+"')\""
		sHTML += " onMouseout=\"ColorTRini('"+sColorBase+"',"+nRegistro+",'"+a_sColorTexto[1]+"')\""
		if (g_oTablaActiva.m_sMarkColor) sHTML += " onclick=\"MarkTR('"+sColorBase+"',"+nRegistro+")\"";
	}
	return sHTML
}


function MarkTR(sColorBase,nTR){
	var layer=event.srcElement || event.currentTarget || event.target
	var oObjeto = GetSource(layer)

	var oTabla=GetObjetoTabla(oObjeto);
	if (oTabla){
		nTR--
		if (oTabla.m_bOrdenar) nTR = oTabla.m_a_nOrden[nTR]
	
		var bMark = oTabla.m_a_bMark[nTR] ^ 1
		if (sColorBase) {
			if (bMark) sColorBase = oTabla.m_sMarkColor
			SetStyle (oObjeto, "bgcolor", sColorBase ,1)
		}
		oTabla.m_a_bMark[nTR] = bMark;
	}
}

function MarkTRCheck(oTabla,nTR){
	if (!oTabla) return
	bMark = 0
	nTR--
	if (oTabla.m_bOrdenar) nTR = oTabla.m_a_nOrden[nTR]
	if (oTabla.m_a_bMark[nTR]) bMark=1	
	return (bMark)
}

//Devuelve un array con los datos del EXML de los TR marcados
function GetMarkTR(sObjeto,sEXML){
var a_vDatos = []
var f=0;g=0;
	var oTabla = eval (sObjeto)
	var nLen = oTabla.m_a_bMark.length;
	
	for (f=0; f<nLen;f++){
		if (oTabla.m_a_bMark[f]) a_vDatos[g++]= ParseEXMLs (sEXML,"",oTabla.m_sJSarrayBase,f)
	}
//status = a_vDatos	
	return (a_vDatos)
}	


function ColorTR(sColorFondo,nTR,sColorTexto){
	if (!window.event) event=arguments.callee.caller.arguments[0];
	var layer=event.srcElement || event.currentTarget || event.target
	var oObjeto = GetSource(layer)

	var oTabla=GetObjetoTabla(oObjeto);		//v1.09
	if (MarkTRCheck(oTabla,nTR)) return;

//	oObjeto = GetSource(event.srcElement)
//	SetStyle (oObjeto, "bgcolor", oTabla)		//v1.169 Para que valia???


//	if (sColorTexto) oObjeto.style.color = sColorTexto
	if (sColorTexto) SetStyle (oObjeto, "color", sColorTexto)
//	if (sColorFondo && oObjeto.style.backgroundColor!=sColorFondo && oObjeto.id!="ignore"){

	if (sColorFondo && GetStyle (oObjeto, "bgcolor",1)!=sColorFondo){
//		oObjeto.style.backgroundColor=sColorFondo
		SetStyle (oObjeto, "bgcolor", sColorFondo, 1)

		var oTabla=GetObjetoTabla(oObjeto);
		if(oTabla && oTabla.m_sOrdenColor && oTabla.m_nOrdenColumna!=null && oTabla.m_nOrdenColumna<=oObjeto.childNodes.length) oObjeto.childNodes[oTabla.m_nOrdenColumna].style.backgroundColor=sColorFondo;
	}
 	var oObjetoT = g_oTimeoutID[nTR]
	clearTimeout(oObjetoT)

}

function ColorTRini(sColorFondo,nTR,sColorTexto){
	if (!window.event) event=arguments.callee.caller.arguments[0];
	var layer=event.srcElement || event.currentTarget || event.target
	var oObjeto = GetSource(layer)
//	var oObjeto = GetSource(event.srcElement)

	var oTabla=GetObjetoTabla(oObjeto);		//v1.09
	if (MarkTRCheck(oTabla,nTR)) return;

//x1 = oObjeto.getElementsByTagName('TR');
//alert("1"+oObjeto+x1)

//	if (sColorTexto) oObjeto.style.color = sColorTexto
	if (sColorTexto) SetStyle (oObjeto, "color", sColorTexto, 0)

	if (sColorFondo){
	
/*		if (event.fromElement.contains(event.toElement)||oObjeto.contains(event.toElement)||oObjeto.id=="ignore"){
			return
		}
*/	
		if (event.toElement!=oObjeto){
			oTabla = GetObjetoTabla(oObjeto);
	
			if (oTabla && oTabla.m_bEstelaActiva){
				sColorActual = oTabla.m_sColorIni
//				if (sColorActual=="") sColorActual = oObjeto.style.backgroundColor
				if (sColorActual=="") sColorActual = GetStyle (oObjeto, "bgcolor",1)
				
				if (sColorActual && sColorActual!=sColorFondo){
					g_oTimeoutObj[nTR]=oObjeto
					CicloColoresObj("",sColorActual,sColorFondo,oTabla.m_nPasos,oTabla.m_nTime,0,nTR,0)
				}
			}
			else {
//				oObjeto.style.backgroundColor = sColorFondo
				SetStyle (oObjeto, "bgcolor", sColorFondo,1)
//SetTRcolor(oObjeto, "#00ff00")

			}
			if(oTabla && oTabla.m_sOrdenColor && oTabla.m_nOrdenColumna!=null && oTabla.m_nOrdenColumna<=oObjeto.childNodes.length) {
				oObjeto.childNodes[oTabla.m_nOrdenColumna].style.backgroundColor = oTabla.m_sOrdenColor;
			}
		}
	}
}

function GetSource(oObjeto){
    if (!oObjeto || typeof(oObjeto.style) == 'undefined') return false;

	if (oObjeto.tagName=="TR"||oObjeto.tagName=="TABLE"){
		return false;
	}

	while(oObjeto && oObjeto.tagName != "TR"){
//alert(oObjeto.tagName)
		if (oObjeto.parentNode) oObjeto = oObjeto.parentNode;
		else if (oObjeto.parentElement) oObjeto = oObjeto.parentElement;
//		oObjeto=oObjeto.parentElement		// TR
	}
	return (oObjeto)
}


function CicloColoresObj(oObjeto,sColorS,sColorD,nPasos,nTime,nPasosC,nObj,bLoop){	//Form,hexColor1,hexColor2,nPasos,nVelocidad
var nColorS,nColorD,sFuncion
var sColor = "#"

	if (!nObj) nObj=0
	clearTimeout(g_oTimeoutID[nObj])
	if (oObjeto=="") oObjeto=g_oTimeoutObj[nObj]

	if (oObjeto){		//mirar si existe el objeto
		nPasosC++
		if (nPasosC!=nPasos){
			for (f=0;f<3;f++){
				nColorS = parseInt("0x"+ sColorS.substr(1+(f*2),2))
				nColorD = parseInt("0x"+ sColorD.substr(1+(f*2),2))
				nColorS = Math.round( nColorS + ((nColorD-nColorS)*nPasosC)/nPasos )
				if (nColorS<16) sColor +="0"
				sColor += nColorS.toString(16)			//Dec2Hex
			}
			sFuncion="CicloColoresObj('','"+sColorS+"','"+sColorD+"',"+nPasos+","+nTime+","+nPasosC+","+nObj+","+bLoop+")"
		}
		else {
			sColor=sColorD
			nPasosC=0
			sFuncion="CicloColoresObj('','"+sColorD+"','"+sColorS+"',"+nPasos+","+nTime+","+nPasosC+","+nObj+","+bLoop+")"
		}

		if (bLoop || nPasosC!=0) g_oTimeoutID[nObj] = setTimeout (sFuncion,nTime)	
//		oObjeto.style.backgroundColor = sColor
//SetTRcolor(oObjeto, "#0000ff")
		SetStyle (oObjeto, "bgcolor", sColor,1)
	}
}


function GetObjetoTabla(oSource){			//Devuelve null si no lo encuentra
	if (!oSource) return;
	var oSourceLay=oSource;

	while(oSourceLay && oSourceLay.tagName!="SPAN" && oSourceLay.tagName!="DIV"){
		if (oSourceLay.parentNode) oSourceLay = oSourceLay.parentNode;
		else if (oSourceLay.parentElement) oSourceLay = oSourceLay.parentElement;
//		oSourceLay=oSourceLay.parentElement
	}

	if (oSourceLay) oSourceLay=eval("o"+oSourceLay.id.substring(1));	//Objeto Tabla
	return(oSourceLay);
}

function SetTRcolor(oRow, sColor){
    var oCells;
    var f;

    if (typeof(oRow.style) == 'undefined') return false;

    if (typeof(document.getElementsByTagName) != 'undefined') {
        oCells = oRow.getElementsByTagName('td');
    }
    else if (typeof(oRow.cells) != 'undefined') {
        oCells = oRow.cells;
    }
    else {
        return false;
    }

    var bDOM    = false;
    if (typeof(window.opera) == 'undefined' && typeof(oCells[0].getAttribute) != 'undefined') {
        bDOM    = true;
    }

	var rowCellsCnt=1
    if (bDOM) {
//           oRow.setAttribute('backgroundColor', sColor, 0);
        for (f = 0; f < rowCellsCnt; f++) {
            oCells[f].setAttribute('bgcolor', sColor, 0);
        }
//        oRow.style.backgroundColor = sColor;
    }
    else {
//            oRow.style.backgroundColor = sColor;
        for (f = 0; f < rowCellsCnt; f++) {
            oCells[f].style.backgroundColor = sColor;
        }
    }
}



function GetStyle(oObjeto, sAtributo, bDetectDOM){
var vValor;
	if (!oObjeto) return false;
    if (typeof(oObjeto.style) == 'undefined') return false;

    var bDOM    = false;
    if (bDetectDOM && typeof(window.opera) == 'undefined' && typeof(oObjeto.getAttribute) != 'undefined') {
        bDOM    = true;
    }

    if (bDOM) {
        vValor = oObjeto.getAttribute(sAtributo, 0);
    }
    else {       
        eval ("vValor = oObjeto.style."+sAtributo);
    }
	return (vValor)
}

function SetStyle(oObjeto, sAtributo, sValor, bDetectDOM){
	if (!oObjeto || oObjeto.style == 'undefined') return false;

    var bDOM    = false;
    if (bDetectDOM && typeof(window.opera) == 'undefined' && typeof(oObjeto.getAttribute) != 'undefined') {
        bDOM    = true;
    }
    if (bDOM) {
        oObjeto.setAttribute(sAtributo, sValor, 0);
    }
    else {
        eval ("oObjeto.style."+sAtributo+" = sValor");
    }
}

// ----------------------------------

//
// DynTabla
// bLayRelativo : no vale para NS4, por defecto lo usamos
function DynTabla(sBase,sJSarrayBase,nFilas,nColumnas,sTablaVacia,sObj,bLayRelativo,bGuardarEstado){
	if (typeof(bLayRelativo)=="undefined") bLayRelativo=1

	this.f_addObjMethods=oTablaAPI.f_addObjMethods;
	this.f_addObjMethods(sBase,1,bLayRelativo);

	this.m_nVersion=oITablas.m_nVersion;

	this.f_checkObj   =dtCheckObj
	this.f_createStyleTable	=dtCreateStyle;
	this.f_createStyleTR	=dtCreateStyle;
	this.f_createStyle		=dtCreateStyle;
	this.f_createDatos = dtCreateDatos;
	this.f_createInput = dtCreateInput;
	this.f_createOrden 	= addArgs2Array;	//dtCreateOrden;
	this.f_createOculta = addArgs2Array;
	this.f_buildTable =dtBuildTable;
	this.f_add2Table  =addArgs2Array;

	this.f_getData=dtGetData;

	this.f_initTabla = dtInitTabla
	this.f_drawTabla = dtDrawTabla
	this.f_printTabla = dtPrintTabla
	this.f_printSubTabla = dtPrintSubTabla
	this.f_resetTabla = dtResetTabla
	this.f_ordenarTabla = dtOrdenarTabla
	this.f_paginarTabla = dtPaginarTabla
	this.f_buscarTabla = dtBuscarTabla
	this.f_editarTabla = dtEditarTabla
	this.f_minimizarTabla = dtMinimizarTabla
	this.f_ocultarColumna = dtOcultarColumna
	this.f_init=function (){
		this.m_oAct=eval(this.m_sAct);
	}
	this.f_addFuncPre = dtAddFuncPre
	this.f_addFuncPost= dtAddFuncPost
	this.f_showMarkTR = dtShowMarkTR

	this.m_sObjeto = this.m_sObj
	this.m_sJSarrayBase = sJSarrayBase
	this.m_maTabla = []

	if(IsArray(sJSarrayBase) || sJSarrayBase.m_sObj){
//		this.m_maTabla[0] = sJSarrayBase[0];
//		this.m_maTabla[1] = sJSarrayBase[1];
		this.m_maTabla = sJSarrayBase
	}
	else{
		this.m_maTabla[0] = eval ("a_s"+sJSarrayBase);
		this.m_maTabla[1] = eval ("a_v"+sJSarrayBase);
	}
	
	this.m_nFilas = 0
	this.m_nFilasMax = nFilas
	if (nColumnas) this.m_nColumnas = nColumnas
	this.m_sTablaVacia = ""
	if (sTablaVacia) this.m_sTablaVacia = sTablaVacia
	this.m_nOrdenDir=0
	this.m_nOrdenColumna = null
	this.m_sOrdenCampo = ""
	this.m_sPaginacionPre  = ""
	this.m_sPaginacionPost = ""
	this.m_nPaginacionModo = 1
	this.m_sOrdenColor = ""
	this.m_nFila=0
	this.m_nRegistro=0
	this.m_nRegEdit=0
	this.m_nRegEditC=0
	this.m_bMinimizada=0
	this.m_sBusqueda = ""
	this.m_sPreHTML = ""
	this.m_sPostHTML = ""

	this.f_estelaFila = dtEstelaFila;
	this.m_bEstelaActiva = 1
	this.m_sColorIni = ""
	this.m_nPasos = 12
	this.m_nTime = 10
	this.m_bCacheTagSUMA = 0

	this.m_a_bMark = [];	
	this.m_sMarkColor = "";	

	this.f_initPlegarTabla = dtInitPlegarTabla
	this.f_plegarTabla = dtPlegarTabla
	this.f_plegarPadre = dtPlegarPadre
	this.f_initArrayIdPadres = dtInitArrayIdPadres
	this.f_registroPlegable= dtRegistroPlegable
	this.f_marcarPlegarPadre = dtMarcarPlegarPadre
	this.f_plegarPrintId= dtPlegarPrintId
	this.f_plegarEsPadre= dtPlegarEsPadre
	this.f_plegarEsHijo = dtPlegarEsHijo
	this.f_plegarEsHuerfano = dtPlegarEsHuerfano
	this.f_plegarHREF = dtPlegarHREF
	this.f_plegarOnClick = dtPlegarOnClick 

	this.f_sumaPadre= dtSumaPadre 
	this.f_avgPadre = dtAvgPadre
	this.f_exmlPadre = dtExmlPadre

	this.f_initStyle = dtInitStyle
	this.f_changeStyle = dtChangeStyle

	this.f_moduloPaginacion = dtModuloPaginacion
	
	this.m_sPlegadaId = ""
	this.m_sPlegadaIdPadre = ""
	this.m_cPlegadaPadre = -1
//	this.m_bPrintPlegada = 1
	this.m_a_nPlegadaIdsPadres = []
	this.m_a_nPlegadaRegsPadres = []
	this.m_a_bPlegadaPadre = []
	this.m_a_sPlegadaTexto = ["-","+"]

	this.f_addFuncsPre=addArgs2Array;
	this.f_addFuncsPre("sFuncsPre",1);
	this.f_addFuncsPost=addArgs2Array;
	this.f_addFuncsPost("sFuncsPost",1);

	//Guarda el nombre del objeto
	this.m_oAct="";
	if(sObj) this.m_sAct=sObj;
	else this.m_sAct=this.m_sObj;
	//Añade método f_init() al Init() de la página
//	oIGZ.m_a_sStartDraws.f_addElements("<fun>"+this.m_sObj+".f_init()");

  //!!! QUIQUE Guardar Estado de la Tabla
  	this.m_bGuardarEstado = ( oIGZ.m_bIE ? ( IsNull( bGuardarEstado ) ? 1 : bGuardarEstado ) : 0 );
  //!!!QUIQUE

	this.m_bEXMLReturn = 1
	this.m_sEXMLReturn = undefined

	this.m_sStyleBase
	this.m_sStyleMouseOver
	this.m_sStyleMouseClick


	// Funcionalidades para edicion rapida - (JONAS)
	this.m_bNewRow = 0;
	this.f_newRow  = function (){
		if ( !this.m_bNewRow ) {
			this.m_bNewRow = 1;
			this.m_maTabla.f_addRow();
			this.f_printTabla("", 0, this.m_maTabla);
			this.f_editarTabla( this.m_maTabla.f_length() );
		}	
	}
	this.f_editRow = function (nReg){
		this.f_cancelEditRow();
		this.f_editarTabla( nReg+1 );
	}
	this.f_cancelEditRow = function (){
		if ( this.m_bNewRow ) {
			this.m_maTabla.f_delRow( this.m_maTabla.f_length()-1 );
			this.m_bNewRow = 0;
		}
		this.f_printTabla();
	}

	this.f_refreshTabla = function (maData,bReset) {	//relacionada con dtInitTabla
		this.m_bNewRow = 0;
		this.m_maTabla = maData;
		this.f_printTabla("", 0, this.m_maTabla);
		if (bReset){	//v1.1823
			this.m_sOrdenCampo = ""
			this.m_nOrdenColumna = null
			this.m_a_nOrden = [];
			this.m_nPagina = 1;				
		}
	}
	// Funcionalidades para edicion rapida - (JONAS)

}

// Api core v2.98
// 5.24. addArgs2Array
//		 sArray: Nombre Array
//		 bSubs : [0] Añade , [1] Substituye
function addArgs2Array(sArray,bSubs){
	var nArgIni=2;
 	var nArgC  =0;
	if(eval("typeof(this.m_a_"+sArray+")")=="undefined") eval("this.m_a_"+sArray+"=[];");
 	var oArgs=arguments;

	if(oArgs[nArgIni]!=null && typeof(oArgs[nArgIni])=="object" && oArgs[nArgIni].length!="undefined"){
		oArgs=arguments[nArgIni];
		nArgIni=0;
 	}
	for(var nArg=nArgIni;nArg<oArgs.length;nArg++){
		var vValue=oArgs[nArg];	
		if(!bSubs) nArgC=eval("this.m_a_"+sArray+".length");
		if(vValue!=null) eval("this.m_a_"+sArray+"["+nArgC+"]=vValue;");
		nArgC++;
	}
}

function dtBuildTable(){
	if (IsUndefined(this.m_a_aStyle) && !this.m_a_oChilds[0].m_a_aStyle.length ) {		//1.181
		ErrorTabla ("dtBuildTable() : es necesario definir .f_createStyleTable()",this,1)
		return
	}
	
	this.f_createOrden("sOrden",1)	//v1.08

	this.f_add2Table("nTabla",0,arguments);
	this.nTlistSize = 3				//N. de datos de f_buildTable (3 para mantener compatibilidad)

	this.m_nPagina = 1				//N. de pagina actual [0/x no paginar/numero de pagina]

	this.f_initTabla()

	if (!this.m_nColumnas) {
		if (typeof(this.f_getData(0,"Style",0)[2])=="undefined") {
			this.m_nColumnas = this.f_getData(0,"Datos",0)[2].f_countMatches("</TD>",1)
		}
		else {
			this.m_nColumnas = this.f_getData(0,"Datos",0,-1)-1	
		}
	}
	this.m_nColumnasT = this.m_nColumnas

	if (!this.m_a_sOculta) this.f_createOculta("sOculta",0,0)	
	this.m_nColumnas -= ColumnasOcultas(this.m_a_sOculta)
}

// [vRefresh] bRefresh/MArray
function dtInitTabla(vRefresh) {
	this.f_isLay(); // Siempre revisar los elementos donde vamos a repintar (Jonas)
	if (vRefresh){						//1.162 Relacionada con: .f_refreshTabla()
		if (IsMArrays(vRefresh)) {
			this.m_sJSarrayBase = vRefresh
		}
		this.m_sMarkColor = ""
		this.m_sOrdenColor = ""
		this.m_a_bMark	= []			//1.182

	 	navigator.f_setParamTabla( window.location.href + this.m_sObj + "_+", null );
//	 	navigator.f_setParamTabla( window.location.href + this.m_sObj + "_m_nRegistros", null );
//		this.m_a_nOrden = []
		this.m_bOrdenar = 0
	}
		
	var nRegs = this.m_sJSarrayBase.f_maGetRegs()
	this.m_nRegistros = nRegs			//Registros con los que trabajamos
	this.m_nRegistrosT = nRegs			//Registros totales
//	if (nRegs!=0) this.m_sTablaVacia=""		//1.165

	this.m_nFila=0
	if (this.m_nFilasMax) this.m_nFilas = this.m_nFilasMax
	else this.m_nFilas = nRegs;

//ErrorJS (this,"",1)

	this.m_nPaginas = (Math.floor((nRegs-1)/this.m_nFilas)) +1
	if (!vRefresh && this.m_bGuardarEstado ){
		var sCampoOrder = navigator.f_getParamTabla( window.location.href + this.m_sObj + "_orden" );
		if ( !IsNull( sCampoOrder) && this.m_sJSarrayBase.f_maGetColPos (sCampoOrder)!=-1 ){
			this.m_sOrdenCampo = sCampoOrder;
		}
		var nParamPag = navigator.f_getParamTabla( window.location.href + this.m_sObj + "_pagina" )
		if ( !IsNull( nParamPag ) ){
			this.m_nPagina = new Number( nParamPag );
		}
		var a_nParamBuscar = navigator.f_getParamTabla( window.location.href + this.m_sObj + "_buscar" )

		if ( !IsNull( a_nParamBuscar ) ){
			this.m_a_nOrden = a_nParamBuscar;
			this.m_nRegistros = navigator.f_getParamTabla( window.location.href + this.m_sObj + "_m_nRegistros"  );
			this.m_nPaginas = navigator.f_getParamTabla( window.location.href + this.m_sObj + "_m_nPaginas" );
			this.m_sBusqueda = navigator.f_getParamTabla( window.location.href + this.m_sObj + "_m_sBusqueda" );
		}
	}
 	if (this.m_sOrdenCampo){
		this.f_ordenarTabla(this.m_sOrdenCampo,1,this.m_nPagina)
	}
	if (this.m_nPagina>this.m_nPaginas) this.m_nPagina=this.m_nPaginas

//status+="["+this.m_nRegistros+"_"+this.m_a_nOrden+"]"
}


function ColumnasOcultas(a_vArray){
var f,nColsOcultas=0
	for (f=0;f<a_vArray.length;f++){
		
		if (a_vArray[f]==1) nColsOcultas++
	}		
	return (nColsOcultas)
}



// nData=-1 -> Devuelve Length
function dtGetData(nMod,sType,nArray,nData){
	var vData=this.m_a_oChilds[nMod];
	if(nMod==-1) vData=this.m_a_oChilds.length;
	if(nArray!=null){
		if(nArray==-1) vData=eval(vData.m_sObj+".m_a_a"+sType+".length");
		else vData=eval(vData.m_sObj+".m_a_a"+sType+"[nArray]");
	}
	if(nData!=null){
		if(nData==-1) vData=vData.length; 
		else vData=vData[nData];
	}
	return (vData);
}

function dtCheckObj(nObj){
	if(nObj>=this.m_a_oChilds.length){
		nObj=this.m_a_oChilds.length;
		eval("o"+this.m_sBase+"Mod"+nObj+"=new DTMod('"+this.m_sBase+"Mod"+nObj+"')");
		this.f_addChilds(eval("o"+this.m_sBase+"Mod"+nObj));
	}
}

function dtInitStyle (sStyleBase,sStyleMouseOver,sStyleMouseClick) {
	var sHTML = ""
	if (!this.m_sPlegadaId  || !this.f_plegarEsPadre()) {
		if (!this.m_sStyleBase) {
			this.m_sStyleBase = sStyleBase
			this.m_sStyleMouseOver = sStyleMouseOver
			this.m_sStyleMouseClick = sStyleMouseClick
		}

		var nFila = this.m_nFila-1
		var nReg = this.m_nRegistro
/*
		if (nFila==0) {
			this.m_sStyleBase = sStyleBase
			this.m_sStyleMouseOver = sStyleMouseOver
			this.m_sStyleMouseClick = sStyleMouseClick
		}
*/
		if (this.m_a_bMark[nReg]) sHTML += " class='" +sStyleMouseClick +"'"
		else sHTML += " class='" +sStyleBase + nFila%2 +"'"
		if (sStyleMouseOver) {
			sHTML += " onmouseout='"+this.m_sObjeto+".f_changeStyle(this,"+nFila+","+nReg+")'"
			sHTML += " onmouseover='"+this.m_sObjeto+".f_changeStyle(this,0,"+nReg+",1)'"

			if (sStyleMouseClick) sHTML += " onclick='"+this.m_sObjeto+".f_changeStyle(this,0,"+nReg+",2)'"
		}
	}
	return(sHTML)
}

//nMouseAction 0/1/2	out/over/click
function dtChangeStyle (oTR,nFila,nReg,nMouse) {
	var sStyle;
	var bMark = this.m_a_bMark[nReg]
	switch (nMouse) {
		case 1:
			sStyle = this.m_sStyleMouseOver
			break
		case 2:
			this.m_a_bMark[nReg] = bMark ^ 1;
			if (bMark ^ 1) sStyle = this.m_sStyleMouseClick
			else sStyle = this.m_sStyleMouseOver
			break
		default:
			if (bMark) sStyle = this.m_sStyleMouseClick
			else sStyle = this.m_sStyleBase + nFila%2 
	}
//status+= nMouse +"="+sStyle+"/"	
	oTR.className = sStyle;	
}

function dtCreateStyle(nObj){
	this.f_checkObj(nObj);
	var oObj=this.m_a_oChilds[nObj];

	if (typeof(oObj)!="object") {
		ErrorTabla ("dtCreateStyle() : el bloque de estilos "+ (nObj-1) +" no esta definido",this,1)
		return			
	}
	var nLength=oObj.m_a_aStyle.length;
	oObj.f_addStyle("sStyle"+nLength,0,arguments);
	oObj.m_a_aStyle[oObj.m_a_aStyle.length]=eval(oObj.m_sObj+".m_a_sStyle"+nLength);
//alert("2"+oObj.m_a_aStyle)
}

function dtCreateDatos(nObj){
	this.f_checkObj(nObj);
	var oObj=this.m_a_oChilds[nObj];
	if (typeof(oObj)!="object") {		//si hemos definido el estilo anterior, no detecta que falta el de datos !!!
		ErrorTabla ("dtCreateDatos() : el bloque de datos "+ (nObj-1) +" no esta definido",this,1)
		return			
	}
	var nLength=oObj.m_a_aDatos.length;
	oObj.f_addDatos("sDatos"+nLength,0,arguments);
	oObj.m_a_aDatos[oObj.m_a_aDatos.length]=eval(oObj.m_sObj+".m_a_sDatos"+nLength);
}

function dtCreateInput(nObj){
	this.f_checkObj(nObj);
	var oObj=this.m_a_oChilds[nObj];
	if (typeof(oObj)!="object") {		//si hemos definido el estilo anterior, no detecta que falta el de Input !!!
		ErrorTabla ("dtCreateInput() : el bloque de INPUTs "+ (nObj-1) +" no esta definido",this,1)
		return			
	}
	var nLength=oObj.m_a_aInput.length;
	oObj.f_addInput("sInput"+nLength,0,arguments);
	oObj.m_a_aInput[oObj.m_a_aInput.length]=eval(oObj.m_sObj+".m_a_sInput"+nLength);
}


function DTMod(sBase){
	this.f_addObjMethods=oTablaAPI.f_addObjMethods;
	this.f_addObjMethods(sBase,1);

	this.m_a_aStyle=[]
	this.m_a_aDatos =[]
	this.m_a_aInput =[]
	this.f_addStyle=addArgs2Array;
	this.f_addDatos =addArgs2Array;
	this.f_addInput =addArgs2Array;
}


// AUX

// sSinFecha (si dFecha es nula): [0/string] : devuelve la fecha de hoy(por defecto)/devuelve la cadena sSinFecha (o un guion si le pasamos un 1)
function FechaHoraTexto(sParametro,dFecha,sSinFecha){ 			// 1.1 fecha/fechacorta/fechamini/aaaammdd/fechaminiXX/fechahoraXX/hora/dia/dia_texto/mes/mes_texto/anyo/horas/minutos/ 
var cEspacio = "&nbsp;"					//para que no se corte la fecha
var sDe = cEspacio + "de" + cEspacio	// " de "
var a_mes=new Array (0,"Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio","Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre")
var a_dia=new Array ("Domingo","Lunes","Martes","Miércoles","Jueves","Viernes","Sábado")
var vFecha,dia,dia_texto,mes,mes_texto,anyo,horas,minutos,minuto,hora,fecha,fechacorta,fechahora,fechamini,fechaminiXX,fechahoraXX

	vFecha = ""
	if (sSinFecha) vFecha=sSinFecha
	if (sSinFecha==1) vFecha ="-"
	if (dFecha || !sSinFecha){
		if (dFecha) {
			if (typeof(dFecha)!="object" || dFecha.constructor!=Date){
				dFecha = CambiaFecha(dFecha)	//Paso fecha a formato USA
				dFecha = new Date(dFecha); 		//Fecha que le pasamos
			}
		}
		else {
			dFecha = new Date(); 			//Fecha de hoy
		}
	
		dia= dFecha.getDate()
		dia_texto = a_dia[dFecha.getDay()]
		mes = dFecha.getMonth() + 1
		mes_texto = a_mes[mes]
//		anyo = dFecha.getFullYear()		//En NS3 getYear() !!!
		anyo = dFecha.getYear()			//En NS3 getYear() !!!
		if (anyo<=30) anyo+=100
		if (anyo<=150) anyo+=1900
	
		horas = dFecha.getHours()
		minutos = dFecha.getMinutes()
	
		minuto = minutos
		if (minuto<10) minuto="0" + minuto
		hora = horas + ":" + minuto
		fecha = dia_texto + "," + cEspacio + dia + sDe + mes_texto + sDe + anyo

		switch (sParametro.toLowerCase()) {
		case "fechacorta":
			vFecha = dia + sDe + mes_texto + sDe + anyo
			break
		case "fechahora":
			vFecha = fecha + cEspacio + hora
			break
		case "fechamini":
			vFecha = dia + "/" + mes + "/" + anyo
			break
		case "fechaminixx":
			if (dia<10) dia="0" + dia
			if (mes<10) mes="0" + mes
			vFecha = dia + "/" + mes + "/" + anyo
			break
		case "fechahoraxx":
			if (dia<10) dia="0" + dia
			if (mes<10) mes="0" + mes
			vFecha = dia + "/" + mes + "/" + anyo + " " + hora
			break
		case "aaaammdd":
			if (dia<10) dia="0" + dia
			if (mes<10) mes="0" + mes
			vFecha =  anyo + mes + dia
			break
		default:
			vFecha = eval (sParametro.toLowerCase())
		}
	}
	return (vFecha)
}


//
// oTablaAPI Permite usar i_tablas sin tener que cargar i_api_core
//
oTablaAPI = new function (){
	this.m_nVersion=1.001;
	this.f_addObjMethods=function (sInstance,bVisib,bRelative){
		this.m_sBase=sInstance;
		this.m_sObj ="o"+this.m_sBase;
		this.m_sId  ="L"+this.m_sBase;
//		if(this.m_bIE || this.m_bNS) 
		if(this.m_bIE4) this.m_sElement="document.all['"+this.m_sId+"']";
		else this.m_sElement="document.getElementById('"+this.m_sId+"')";
		this.m_sLay=this.m_sElement+".style";
		this.m_sName="N"+this.m_sBase;

		oIGZ.m_a_sStartUps.f_addElements(this.m_sObj+".f_isLay()");

		this.f_isLay=function (){
			if(eval(this.m_sElement)!=null){
			this.m_oElement=eval(this.m_sElement);
				this.m_oLay=eval(this.m_sLay);
			}
		}

		this.m_bActive  =0;
		this.m_nAlpha   =100;
		this.m_bRelative=bRelative;
		this.m_bVisib   =bVisib;

		this.m_a_oChilds =[];
		this.m_a_oParents=[];
		this.f_addChilds=function (){
			for(var n=0;n<arguments.length;n++){
				var oChild=arguments[n];
				this.m_a_oChilds.f_addElements(oChild);
				oChild.m_a_oParents=oChild.m_a_oParents.concat(this.m_a_oParents);
				oChild.m_a_oParents.f_addElements(this);
				oChild.m_oParent=this;
				oChild.m_oGod   =oChild.m_a_oParents[0];
			}
		}

		this.f_innerHTML=function (sInner){
//			oCore.m_oErrorJS = this
			window.onerror = function ErrorTrapJS(sError,sURL,nLinea) { sError="\n"+sURL+"\nLinea "+nLinea + " : " + sError;ErrorJS ("[i_tablas.f_innerHTML] no puede pintar HTML dentro de algun TAG, en esa posicion o HTML incorrecto"+sError+"\nHTML:\n"+sInner,null,1); return (true);}	
//			this.m_sInnerHTML = sInner;
//			this.m_oElement.innerHTML=this.m_sInnerHTML;
			this.m_oElement.innerHTML=sInner;
			window.onerror = oCore.m_oOnErrorEvent	
		}
		this.f_print=function (sInner){ document.write( this.f_draw(sInner) ); }
		this.f_draw=function (sInner){
			var sHTML="";

			sHTML+="<SPAN id='"+this.m_sId+"'";								// <SPAN>
			var sPosition="absolute";										//position
			if(this.m_bRelative) sPosition="relative";
			sHTML+=" style='position: "+sPosition+"; ";
			var sVisib="hidden";											//visibility
			if(this.m_bVisib) sVisib="visible";
			sHTML+=" visibility: "+sVisib+";";
			sHTML+="'>";
			if(sInner) sHTML+=sInner;
			sHTML+="</SPAN>";												// </SPAN>

			return (sHTML);
		}
	}
}
