/*
©2003 IntelyGenZ  - www.intelygenz.com - info@intelygenz.com
i_tablas.js v1.10beta10 [libs v1.10]

http://aspirina/ig_intelygenz/ig05_intranet/desarrollo/areas/dev/docs/i_tablas.html

v1.07 [New] HD HTML_DATOS	[New] H  HTML		[Fix] i_exml.js	[Fix] dtPaginarTabla()
v1.08 [New] HP HTML_PAGINAR	[New] HP HTML_TITULOS
v1.09 [New] ShowMarkTR()	[New] GetMarkTR()	[Fix] ColorTR()	[New] GetStyle()	[New] SetStyle()	[Fix] ParseHTML_TITULOS()
v1.10 [New] HF HTML_FIJO	[New] HPF HTML_PAGINAR_FIJO		[New] RemoveTDocultos	[Fix] OrdenarTabla	[Upd] DynTabla()

* Fix
BUG: al hace BuildTable compruebe que existe la Tabla, que es imprescindible
	oTablaSimple.f_createStyleTable(0,"class='win' border=0 width='100%' cellpadding=2 cellspacing=0")
UPD: <CAMPO SELECT>, ver como pasarle un array con los datos a mostrar (quiza este ya hecho)
UPD: Al pintar la primera vez se le pueda pedir que la pinte ya ordenada por algun campo (seguramente se pueda)
UPD: poder ordenar por otros criterios 
BUG: en algunos casos no calcula bien el numero de columnas <OBJ>nColumnas</OBJ> (no tiene en cuenta los COLSPAN)
UPD: Poder elegir entre pintar siempre o cuando haga falta el modulo HTML_PAGINAR
UPD: Mejorar opciones para marcar una fila determinada
BUG: deberiamos comprobar version de i_core.js
BUG de <OBJ>nOrden</OBJ> con HTML (añadir atributo campo="campo", y cogemos nOrden del campo)
BUG: Pulir y arreglar para NS4 / NS6 :MarkTR()	GetStyle()	SetStyle()
	al ordenar se cuelga
BUG : oTabla1.m_nPaginacionModo=1 falla y muestra el HTML mal
BUG : MultiColorTR falla el event cuando descargas algo
Esto no se si ya estara hecho:
	<ENLACE order='fecha desc'>...</ENLACE>
	<ENLACE paginar=''>...</ENLACE>
	<PAGINAR modo='show/hide'>...</PAGINAR>

* Docs
IMPORTANTE: Usar por defecto bCaseIndependiente=1, es MUCHO MAS RAPIDO
	BuscarTabla ('oTabla1','motivo',Fchange.zzTema.value,0,0,1)
Tablas HTML : detallar todos los tipos de bloques HTML
	HF HTML_FIJO : no oculta columnas
Deprecated <ifBD> y <ifFUN> con HTML (sustituir por <IF> <ELSE /> </IF> )
this.m_sMarkColor = "#ff0000"		// si es ="" no añade el evento onClick de MarkTR()
GetMarkTR("oTabla2","<BD>nombre</BD>");
OrdenarTabla (oTablaOld,"email")

USO:
<SCRIPT language="JavaScript" src="../libs/js/i_core.js" id="Ncore"></SCRIPT>
<SCRIPT language="JavaScript" src="../libs/js/i_api_core.js"></SCRIPT>
<SCRIPT language="JavaScript" src="../libs/js/i_exml.js"></SCRIPT>
<SCRIPT language="JavaScript" src="../libs/js/i_tablas.js"></SCRIPT>

oTabla1=new DynTabla("...

function Init(){
	oTabla1.f_printTabla()
}

<BODY>
<SCRIPT>oTabla1.f_draw()</SCRIPT>

*/

oITablas=new function(){
	this.m_sObj="oITablas";
	this.m_nVersion=1.10;
}

if(typeof(oIGZ)=="undefined") {
	alert ("Falta la libreria o el ID de 'i_core.js' o no existe 'i_igz.js'")
}


oIGZ.f_loadLib ("i_tablas",oITablas.m_nVersion);
oIGZ.f_include ("i_api_core",3.14);
oIGZ.f_include ("i_exml",1.12);
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  = new Array();
var g_oTimeoutObj = new Array();

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_getRegsNum()
	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)
	}
	else{
		sMsgError = "<B><FONT color='#ff0000'>Error Tabla</FONT> Bloque " + g_sEXMLerror + "</B>: " + sError + "<BR>"
		g_oTablaActiva.m_sPreHTML += sMsgError
	}
}


// oTabla / "sTabla"
function OrdenarTabla(vTabla,sCampo){
var oTabla,nCampo,sCampoC,nPos
	if (typeof(vTabla)=="string") oTabla = eval (vTabla)
	else oTabla = vTabla
	if (oTabla.m_a_sOrden=="") oTabla.m_a_sOrden =  oTabla.m_maTabla[0]
	
	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)
	if (nPos==-1) nPos = BuscaEnArray (oTabla.m_a_sOrden,sCampoC)

	if (nPos!=-1) {
		oTabla.m_a_sOrden[nPos] = sCampo
		oTabla.f_ordenarTabla(nPos)
	}
}


function BuscarTabla(sObjeto,sCampo,sTexto,bCaseDependiente,bExact,bAcentoDependiente){
	eval (sObjeto+".f_buscarTabla(sCampo,sTexto,bCaseDependiente,bExact,bAcentoDependiente)")
}

function EditarTabla(sObjeto,nReg){
	eval (sObjeto+".f_editarTabla(nReg)")
}

function ValidarTabla(sObjeto,oInput,bNotSubmit,bNotRepinta){
	oTabla = eval (sObjeto)
	SubmitTabla(oTabla,oInput,bNotSubmit,bNotRepinta)
}

function SubmitTabla(oTabla,oInput,bNotSubmit,bNotRepinta){
var nReg,f,sCampo,vValor
	var oForm = oInput.form
	if (ValidarForm(oForm)){
		nReg = oTabla.m_nRegEditC
		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,vValor)
				CampoModificado(oTabla,sCampo)
			}
		}
		if (!bNotSubmit) 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 PlegarTabla(sObjeto){
	eval (sObjeto+".f_plegarTabla()")
}

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 dtPrintTabla(bDebug){
var sHTML,n

	for(n=0;n<this.m_a_sFuncsPre.length;n++){	//Ejecuta PRE PrintTabla
		eval(this.m_a_sFuncsPre[n]);
	}

	sHTML = this.f_drawTabla()
	sHTML = this.m_sPreHTML + sHTML + this.m_sPostHTML

	if (bDebug) alert(sHTML)

	this.m_sHTML = sHTML

//Antes la pintaba con setTimeout, era para NS (quiza ya no hace falta) !!!
//	setTimeout(this.m_oAct.m_sObj+".f_innerHTML("+this.m_sObj+".m_sHTML)",1000);
	this.m_oAct.f_innerHTML(this.m_sHTML);
//document.all[this.m_sObj].innerHTML = sHTML;

	for(n=0;n<this.m_a_sFuncsPost.length;n++){	//Ejecuta POST PrintTabla
		eval(this.m_a_sFuncsPost[n]);
	}

}



function dtDrawTabla(){
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)

	sJSarrayBase = this.m_sJSarrayBase
	nFilas = this.m_nFilas
	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

	if (!nFilas) nFilas = sJSarrayBase.f_getRegsNum()
	nFilasT = this.m_nRegistros
	if (nFilas>nFilasT) nFilas = nFilasT

//Inicio Tabla
	sHTML="<TABLE " + this.f_getData(0,"Style",0,1) + ">"
	
//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]

		switch (sTipoBloque) {			//Tipos de Blocks
		case "FIJO":
			sTipoBloque = "F"
			break
		case "TITULOS":
			sTipoBloque = "T"
			break
		case "DATOS":
			sTipoBloque = "D"
			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 "BUSCAR":
			sTipoBloque = "B"
			break
		case "PAGINAR":
			sTipoBloque = "P2"
			break
		case "PAGINARFIJO":
			sTipoBloque = "P2F"
			break
		}

		if (this.m_bPlegada!=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,"",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,"",0) + ">"	

					this.m_nOrden = 0
					if (this.m_nOrdenColumna==f) {
						this.m_nOrden = 1+this.m_nOrdenDir
					}
	
					sHTMLtemp = ParseEXMLs(a_aTDtexto[f+1],this,"",0)

					if (this.m_a_sOrden[f]) {		//Ordena
						sFuncion = "\"" + this.m_sObj+".f_ordenarTabla("+f+")\""
						sEnlace = "javascript: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>"							
						}
					}
					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,"",0)+">"
			sHTML += "<TR " + ParseEXMLs (a_aTDstyle[2],this,"",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,"",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,"",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,"",0)+">"
			sHTML += "<TR " + ParseEXMLs (a_aTDstyle[2],this,"",0) + ">"

			sHTML += "<TD "+ ParseEXMLs(a_aTDstyle[3],this,"",0) +">&nbsp;"	
			if (nPagina>1) {
				sFuncion = "\"" + this.m_sObj+".f_paginarTabla("+ (nPagina-1) + ")\""
				sEnlace = "javascript: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 += "</TD>"

			sHTML += "<TD "+ ParseEXMLs(a_aTDstyle[4],this,"",0) + ">"	
			sHTML += ParseEXMLs(a_aTDtexto[3],this,"",0)
			sHTML += "</TD>"

			sHTML += "<TD "+ParseEXMLs(a_aTDstyle[5],this,"",0)+">&nbsp;"
			if ((nFilas*nPagina)<nFilasT) {
				var sFuncion = "\"" + this.m_sObj+".f_paginarTabla("+ (nPagina+1) + ")\""
				sEnlace = "javascript: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 += "</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,"",0)+">"
				sHTML += "<TR " + ParseEXMLs (a_aTDstyle[2],this,"",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,"",0)  + ">"	
					sHTML += ParseEXMLs (a_aTDtexto[g+2],this,"",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,"",0)
			sHTML += RemoveTDocultos(this,sHTMLtemp)
			break

		case "HP":
			if (nFilas>=nFilasT) break
		case "HPF":
			sEXML = ParseHTML_PAGINAR (this,a_aTDtexto[2])
			sHTML += ParseEXMLs (sEXML,this,"",0)
			break
		case "HD":
			nFilasC =0
		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) nFilasK = nFilasC

			while (nFilaDatos<nFilasK){
				nFila = nFilaDatos
				nFila += nDatoInicial
				this.m_nFila=nFilaDatos+1		//¿para que valen?
				this.m_nRegistro=nFila+1		//¿para que valen?
				if (bOrdenar) nFila = this.m_a_nOrden[nFila]
				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,"",nFila)
				if (sTipoBloque!="HF") sHTMLtemp = RemoveTDocultos(this,sHTMLtemp)
				sHTML += 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		//¿para que valen?
				this.m_nRegistro=nFila+1		//¿para que valen?
				if (bOrdenar) nFila = this.m_a_nOrden[nFila]
//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,"",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,"",nFila) + sOrdenColor + ">"	
						sHTML += ParseEXMLs (a_sTDtexto[g+2],this,"",nFila)
						sHTML += "</TD>"	
					}
				}
				sHTML += "</TR>"	
				f++
				if (!(f%nTextoL)) nFilaDatos ++		// si termino un bloque, cuento la fila
			}
		}
	}
	sHTML += "</TABLE>"
	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")

  sFuncion = "\"" + oTabla.m_sObj+".f_ordenarTabla("+nOrdenCol+")\""
  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
				for (h=nPaginaInicial;h<=nPaginaFinal;h++){
					if (h==nPagina){
						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 (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 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){
var sJSarrayBase,nDir,a_vArray,sCampo,nCampo,a_nOrdenOld,a_nOrden
	sJSarrayBase = this.m_sJSarrayBase
	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]

	nCampo = sCampo.length - 5
	if (nCampo>0 && sCampo.lastIndexOf(" DESC")==nCampo) {
		nDir = 1&(~nDir)
		sCampo= sCampo.substring (0,nCampo)
	}

	if (this.m_nRegistros != this.m_nRegistrosT) {		//Hay una busqueda activa
		a_sSubArray = eval ("a_s"+sJSarrayBase)
		a_vSubArray = new Array();
		SubMArray (sJSarrayBase,a_vSubArray,this.m_a_nOrden)
		sJSarrayBase = "SubArray"
		a_nOrdenOld = this.m_a_nOrden
	}

	a_nOrden = OrdenarMultiarray(sJSarrayBase,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]]
			}
		}
		this.m_nOrdenColumna=nColumna
		this.m_nPagina = 1
		this.m_bOrdenar = 1
	//	this.m_nRegistros = this.m_nRegistrosT

		this.f_printTabla();
	}
}


function dtBuscarTabla(sCampo,sTexto,bCaseDependiente,bExact,bAcentoDependiente){
var sJSarrayBase
	sJSarrayBase = this.m_sJSarrayBase

	this.m_a_nOrden = BuscarSubMArray(sJSarrayBase,sCampo,sTexto,1,bCaseDependiente,bExact,bAcentoDependiente)
	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 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){
	this.m_nRegEdit = nReg
//	this.m_nRegEditC = nReg
	this.f_printTabla()
	this.m_nRegEdit = 0
}


function dtPlegarTabla(){
	this.m_bPlegada ^= 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()
}

function dtPaginarTabla(nPagina){
var sJSarrayBase,sHTML
	sJSarrayBase = this.m_sJSarrayBase

	if (nPagina>0 && nPagina<=this.m_nPaginas){	
		this.m_nPagina = nPagina
		this.f_printTabla()
	}
}


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){
	if (typeof(nRegistro)=="undefined") {
		ErrorTabla ("MultiColoresTR() : falta el parametro con el numero de registro")		
		nRegistro=0
	}
	if(typeof(a_sColorBase)=="string") a_sColorBase=a_sColorBase.split();	//String 2 Array
	if(typeof(a_sColorActivo)=="string") a_sColorActivo=a_sColorActivo.split();
	var sColorBase = a_sColorBase[nRegistro%(a_sColorBase.length)]
	var sColorActivo = a_sColorActivo[nRegistro%(a_sColorActivo.length)]

	var sHTML = " bgcolor='"+sColorBase+"'"
//	if (oIGZ.m_bIE && (sColorActivo || a_sColorTexto)){
	if ( (sColorActivo || a_sColorTexto)){
		if (!a_sColorTexto) a_sColorTexto = new Array("","")

		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 (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)
//	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 && oTabla1.m_sOrdenColor && oTabla.m_nOrdenColumna!=null) oObjeto.childNodes[oTabla.m_nOrdenColumna].style.backgroundColor=sColorFondo
	}
}

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) {
				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){
	if (typeof(bLayRelativo)=="undefined") bLayRelativo=1

	this.f_addObjMethods=oWebAPI.f_addObjMethods;
	this.f_addObjMethods(sBase,null,null,null,null,null,1,null,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_drawTabla = dtDrawTabla
	this.f_printTabla = dtPrintTabla
	this.f_ordenarTabla = dtOrdenarTabla
	this.f_paginarTabla = dtPaginarTabla
	this.f_buscarTabla = dtBuscarTabla
	this.f_editarTabla = dtEditarTabla
	this.f_plegarTabla = dtPlegarTabla
	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)){
		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)		
	}	
	
	this.m_nFilas = 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_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_bPlegada=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_a_bMark = [];	
	this.m_sMarkColor = "";	

	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()");
}

// 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+"=new Array();");
 	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(){
var sJSarrayBase,nRegs

	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]

	sJSarrayBase = this.m_sJSarrayBase

	nRegs = sJSarrayBase.f_getRegsNum()

	this.m_nRegistros = nRegs			//Registros con los que trabajamos
	this.m_nRegistrosT = nRegs			//Registros totales

	if (nRegs!=0) this.m_sTablaVacia=""

	this.m_nPaginas = (Math.floor((nRegs-1)/this.m_nFilas)) +1

	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)
}

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 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=oWebAPI.f_addObjMethods;
	this.f_addObjMethods(sBase,null,null,null,null,null,1);

	this.m_a_aStyle=new Array();
	this.m_a_aDatos =new Array();
	this.m_a_aInput =new Array();
	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)
}

