// ajax 

function ajustarmasayuda() {
	var mark = document.getElementsByName('masmenos');
	for (var i=0; i<mark.length; i++) {
		
		var lista = mark[i].src.split('mas');
		if (lista.length==1)
			lista = mark[i].src.split('menos');
		
		if (masayuda)
			mark[i].src = lista[0]+'menos'+lista[1];
		else
			mark[i].src = lista[0]+'mas'+lista[1];
	}
}

function shiftmasayuda(control) {
	masayuda = !masayuda;
	ajustarmasayuda();
}

var ventanaayuda = null;
function mostrarpopup(url) {
	if (ventanaayuda==null || ventanaayuda.closed)
		ventanaayuda = window.open(url, '', 'toolbar=0, location=0, directories=0, status=0, menubar=0, scrollbars=0, resizable=0, titlebar=1, width=600, height=340, top=280, left=90')
	else
	{
		ventanaayuda.location = url;
		ventanaayuda.focus();
	}
}

function findPos(obj) {
	var curleft = curtop = 0;
	if (obj.offsetParent) {
	do {
			curleft += obj.offsetLeft;
			curtop += obj.offsetTop;
		} while (obj = obj.offsetParent);
	}
	return [curleft,curtop];
}

var masayuda = false;

function mostrarexplicaciondetalle(control, detalle) {
	var mark = window.parent.document.getElementById('masmenos');
	var listamark = document.getElementsByName('masmenos');
	if (mark!=null || listamark.length>0) {
		if (mark!=null) {
			var lmenos = mark.src.split('menos');
			var masayuda = lmenos.length>1;
		}
		if (masayuda && 
			((listamark.length>0 && listamark[0].style.display!='none') || (mark!=null && mark.style.display!='none')))
		{
			margin=5;
		
			var ele = document.getElementById('explicaciondetalle');
	
			var pos = findPos(control);

			ele.style.top = (1*pos[1]+1*control.offsetHeight-1*ele.offsetHeight);

			ele.style.left = (1*pos[0]+1*control.offsetWidth+margin);
	
			document.getElementById('textoayuda').innerHTML = detalle;
	
			ele.style.display='block';
		}
	}
	return;
}

function estadoexplicaciondetalle() {
	var mark = window.parent.document.getElementById('masmenos');
	if (mark!=null) {
		if (mark!=null) {
			var lmenos = mark.src.split('menos');
			var masayuda = lmenos.length>1;
		}
	}
	return masayuda;
}

function ocultarexplicaciondetalle() {
	if (document.getElementById('explicaciondetalle')!=null)
		document.getElementById('explicaciondetalle').style.display = 'none';
}

// carga los datos que vienen en el html en el objeto javascript correspondiente
function cargarpagina(listaidpag, inicio) {
	var i, j, k;
	var indicador;
	for (i=0; i<listaidpag.length; i++) {
		indicador = document.getElementById('tipopagina'+listaidpag[i]);
		if (indicador!=null) {
			switch (indicador.value) {
				case 'formulario':
				case 'tabla':
					masayuda = document.getElementById('estadoayuda'+listaidpag[i]).value.split('//')=='true';
					var acc = document.getElementById('acc'+listaidpag[i]).value.split('//');
					var opt = document.getElementById('opt'+listaidpag[i]).value.split('//');
					var names = document.getElementById('names'+listaidpag[i]).value.split('//');
					var types = document.getElementById('types'+listaidpag[i]).value.split('//');
					var formatos = document.getElementById('formatos'+listaidpag[i]).value.split('//');
					var id = document.getElementById('id'+listaidpag[i]).value;
					var campos = document.getElementById('campos'+listaidpag[i]).value.split('//');
					var marcados = document.getElementById('marcados'+listaidpag[i]).value.split('//');
					var errvacio = document.getElementById('errvacio'+listaidpag[i]).value.split('//');
					var funcion = document.getElementById('funcion'+listaidpag[i]).value.split('//');
					var errtipo = document.getElementById('errtipo'+listaidpag[i]).value.split('//');
					var oculta = document.getElementById('oculta'+listaidpag[i]).value.split('//');
					var relacionados = document.getElementById('relacionados'+listaidpag[i]).value.split('//');
					var condicion_valida = document.getElementById('condicion_valida'+listaidpag[i]).value.split('//');
//					var eventos = document.getElementById('eventos'+listaidpag[i]).value;
					for (j=0; j<campos.length; j++) {
						campos[j] = campos[j].split('||');
					}
					for (j=0; j<marcados.length; j++) {
						marcados[j] = marcados[j].split('||');
					}
					for (j=0; j<oculta.length; j++) {
						if (oculta[j]!='') {
							oculta[j] = oculta[j].split('||');
						}
					}
					for (j=0; j<relacionados.length; j++) {
						if (relacionados[j]!='') {
							relacionados[j] = relacionados[j].split('||');
						}
					}
					for (j=0; j<condicion_valida.length; j++) {
						if (condicion_valida[j]!='') {
							condicion_valida[j] = condicion_valida[j].split('||');
						}
					}
					var pagactual = document.getElementById('pagini'+listaidpag[i]).value;
					var cantfilaspag = document.getElementById('cantfilaspag'+listaidpag[i]).value;
					datostabla1.modificarTabla(listaidpag[i], acc, opt, names, types, formatos, id, campos, marcados, oculta, relacionados, condicion_valida, errvacio, funcion, errtipo, pagactual, cantfilaspag, inicio);
				break;
			}
		}
	}

	// conserva para cada control, cuales son los controles que lo ocultan
		// para cada una de las tablas
	for (i=0; i<datostabla1.listadatos.length; i++){
			// para cada uno de los campos en la tabla i
		for (j=0; j<datostabla1.listadatos[i].names.length; j++){
			nombreoculta = datostabla1.listadatos[i].names[j];
				// para cada uno de los controles que oculta el campo j
			for (k=0; k<datostabla1.listadatos[i].oculta[j].length; k++){
				var nombreocultado = datostabla1.listadatos[i].oculta[j][k];
					// obtiene la tabla del control nombreocultado
				objetolista = datostabla1.devolverTablaPorControl(nombreocultado);
				p = pos(objetolista.names, nombreocultado);
					// si nombreoculta no esta ya en la lista de controles que ocultan a nombreocultado
				if (pos(objetolista.ocultadopor[p], nombreoculta)<0) {
						// adiciona nombreoculta a la lista que de los controles que ocultan a nombreocultado
					objetolista.ocultadopor[p][objetolista.ocultadopor[p].length] = nombreoculta;
				}
			}
		}
	}
}

// clase para manejar una lista asociativa
function associativeList() {
	this.keys = new Array();
	this.values = new Array();
	this.add = add;
	this.change = change;
	this.remove = remove;
	this.obtain = obtain;
}

function add(key, value) {
	if (pos(this.keys, key)<0) {
		this.keys[this.keys.length] = key;
		this.values[this.values.length] = value;
	}
}

function change(key, value) {
	var p = pos(this.keys, key);
	if (p>=0) {
		this.values[p] = value;
	}
}

function remove(key) {
	var p = pos(this.keys, key);
	if (p>=0) {
		for (var i=p; i<keys.length-1; i++) {
			this.keys[i] = this.keys[i+1];
			this.values[i] = this.values[i+1];
		}
		this.keys.pop();
		this.values.pop();
	}
}

function obtain(key) {
	var p = pos(this.keys, key);
	if (p>=0) {
		return this.values[p];
	} else {
		return null;
	}
}

	// muestra u oculta un control dado su nombre
function ejecutarMuestraOculta(nombreocultado) {
		// obtiene la lista de los controles del formulario con nombreocultado, ya sean uno solo o una lista
	var listadestino = document.getElementsByName(nombreocultado);
	if (listadestino.length==0)
		var listadestino = document.getElementsByName(nombreocultado+'[]');
	if (listadestino.length==0)
		var listadestino = document.getElementsByName(nombreocultado+'0');
	if (listadestino.length==0)
		var listadestino = document.getElementsByName(nombreocultado+'0[]');

	if (listadestino.length!=0) {
			// obtiene la tabla a la que pertenece el control ocultado
		var objetolista1 = datostabla1.devolverTablaPorControl(nombreocultado);
			// obtiene la lista de nombres de controles que afectan al control ocultado
		var listaocultadopor = objetolista1.ocultadopor[pos(objetolista1.names, nombreocultado)];
			// si existe algun control que afecta a nombreocultado
		if (listaocultadopor.length>0) {
				// crea una lista asociativa con los controles que afectan al control ocultado
			var listacontroles = new associativeList();
			for (var j=0; j<listaocultadopor.length; j++) {
				nombreocultadopor = listaocultadopor[j];
					// obtiene la lista de controles de nombreocultadopor
				var controles = document.getElementsByName(nombreocultadopor);
				if (controles.length==0)
					var controles = document.getElementsByName(nombreocultadopor+'[]');
				if (controles.length==0)
					var controles = document.getElementsByName(nombreocultadopor+'0');
				if (controles.length==0)
					var controles = document.getElementsByName(nombreocultadopor+'0[]');
					// adiciona la lista a la lista asociativa con la clave nombreocultadopor
				listacontroles.add(nombreocultadopor, controles);
			}
				// ejecuta la funcion que muestra y oculta el control nombreocultado
			eval('visible_'+nombreocultado+'(listadestino, listacontroles)');
		}
	}
}

	// muestra u oculta controles inicialmente en dependencia del estado inicial de los controles
function muestraocultainicial() {
		// para cada una de las tablas en datostabla1
	for (i=0; i<datostabla1.listadatos.length; i++){
			// para cada uno de los campos en la tabla i
		for (j=0; j<datostabla1.listadatos[i].names.length; j++){
			ejecutarMuestraOculta(datostabla1.listadatos[i].names[j]);
		}
	}
}

	// muestra u oculta controles en dependencia de la accion que se haya realizado sobre un control
	// este es para los eventos onclick y onchange de los controles
function muestraoculta(control) {
	if (control!='undefined' && control!=null)
	{
			// obtiene el nombre del control sobre el que se realizo la accion
		var nombrecontrol = control.name;
		if (nombrecontrol!='undefined' && nombrecontrol!=null)
		{
			var p = nombrecontrol.indexOf('[');
			if (p>=0) {
				nombrecontrol = nombrecontrol.substring(0, p);
			}
			else {
				p = nombrecontrol.indexOf('0');
				if (p==nombrecontrol.length-1){
					nombrecontrol = nombrecontrol.substring(0, p);
				}
				else {
					p = nombrecontrol.indexOf('0[');
					if (p==nombrecontrol.length-1){
						nombrecontrol = nombrecontrol.substring(0, p);
					}
				}
			}
			
				// obtiene la tabla a la que pertenece el control accionado
			var objetolista = datostabla1.devolverTablaPorControl(nombrecontrol);
				// obtiene la lista de los nombre de los controles ocultados por el control accionado
			var listaocultado = objetolista.oculta[pos(objetolista.names, nombrecontrol)];
				// para cada uno de los controles ocultados por el control accionado se ejecuta la funcion que lo muestra y oculta
			for (var i=0; i<listaocultado.length; i++) {
				ejecutarMuestraOculta(listaocultado[i]);
			}
		}
	}
}

	// crea el objeto ajax
function nuevoAjax(){
	var xmlhttp=false;
 	try {
 		xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
 	} catch (e) {
 		try {
 			xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
 		} catch (E) {
 			xmlhttp = false;
 		}
  	}

	if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
 		xmlhttp = new XMLHttpRequest();
		xmlhttp.overrideMimeType('text/xml');
	}
	return xmlhttp;
}


var htmlPagina = '';

var listadiv = Array();

function AsignarHtml(mydiv, html, sumar)
{
	if (mydiv!=null) {
//alert(mydiv.id+' - '+html);
//alert("el código que tiene el div "+mydiv.innerHTML);
		if (html!='') {
			html = '<input id="huequito" type="hidden" value="5" />'+html;
			mydiv.style.display = 'block';

			if (mydiv.id != 'contenedorcentro' || habilitado==1)
			{
				if (sumar)
					mydiv.innerHTML += html;									
				else
					mydiv.innerHTML = html;										// pone el codigo html en el div
			}
			else
				mydiv.innerHTML = '<br><font style="font-size:16px; font-weight:bold; color:#FF0000">Sitio en mantenimiento<br>Disculpe las molestias que esto pueda ocasionarle</font>';
				
//alert(mydiv.id+" - inicio "+html);
//alert("fin "+html.substr(html.length-200, 200));
		}
		else
			mydiv.style.display = 'none';

//		if (html.indexOf('script')!=-1) 
//			listadiv[listadiv.length] = mydiv;
	}
}

function ejecutarScript() {
	for (var j=0; j<listadiv.length; j++) {
		mydiv = listadiv[j];
		var elementos = mydiv.getElementsByTagName('script');	// toma los elementos de tag script en el div
	
		nuevoScript = document.createElement('script');			// crea un nuevo elemento del tipo script
		nuevoScript.type = 'text/javascript';					// se indica el tipo del nuevo elemento
		nuevoScript.text = '';
		for(i=0; i<elementos.length; i++) {						// hace un ciclo para cada elemento
			var elemento = elementos[i];	
			if (elemento.innerHTML.length>0) {
				nuevoScript.text += elemento.innerHTML;				// al nuevo elemento se le pone el html del elemento en el div
				if(elemento.src!=null && elemento.src.length>0)		// si el elemento en el div tiene src
					nuevoScript.src = elemento.src;					// se le asigna al nuevo elemento
			}
		}

		if (elementos.length>0) {
//			elementos[0].parentNode.replaceChild(nuevoScript, elementos[0]);	
			elementos[elementos.length-1].parentNode.replaceChild(nuevoScript, elementos[elementos.length-1]);	
		}
	}
	listadiv = Array();

/*
	for (var j=0; j<listadiv.length; j++) {
		mydiv = listadiv[j];
		var elementos = mydiv.getElementsByTagName('script');	// toma los elementos de tag script en el div
	
		for(i=0; i<elementos.length; i++) {						// hace un ciclo para cada elemento
			nuevoScript = document.createElement('script');			// crea un nuevo elemento del tipo script
			nuevoScript.type = 'text/javascript';					// se indica el tipo del nuevo elemento
			nuevoScript.text = '';
			var elemento = elementos[i];	
			if (elemento.innerHTML.length>0) {
				nuevoScript.text += elemento.innerHTML;				// al nuevo elemento se le pone el html del elemento en el div
			}
			if(elemento.src!=null && elemento.src.length>0)		// si el elemento en el div tiene src
				nuevoScript.src = elemento.src;					// se le asigna al nuevo elemento
alert('el script a ejecutar '+nuevoScript.text+' '+nuevoScript.src);
			elementos[i].parentNode.replaceChild(nuevoScript, elementos[i]);	
		}
	}
	listadiv = Array();
*/
}

var paginaprincipal = "indexjs.php";
var raizsalvar = '';
var actualizandolista = false;
var pendientesparams = new Array();
var pendientesopt = new Array();

function actualizarlista(listaparams, listaopt, hab, raizs, desdedentro)
{
//alert('actualizarlista - '+listaparams[0]);
	if (actualizandolista && !desdedentro){
		for (var i=0; i<listaparams.length; i++) {
			pendientesparams[pendientesparams.length] = listaparams[i];
			pendientesopt[pendientesopt.length] = listaopt[i];
		}
	}
	else {
		actualizandolista = true;
	
	var lis = raizs.split('-');
	raizsalvar = lis[0];
	habilitado = hab;
	ajax = nuevoAjax();
	ajax.open("POST", raizsalvar+paginaprincipal,true);

    ajax.onreadystatechange=function() {
        if(ajax.readyState==1){
            //Sucede cuando se esta cargando la pagina
			if (document.getElementById('msncargando')!=null)
				document.getElementById('msncargando').style.display = 'inline';
        }
		else 
		if(ajax.readyState==4) {
            //Sucede cuando la pagina se cargo
            if(ajax.status==200) {
                // Todo OK
				
				var respuesta = ajax.responseText;
				htmlPagina = respuesta;
//alert(htmlPagina);
					// toma los mensajes que vienen en el codigo html y 
					// que aparecen entre <!--iniciomensajes--> y <!--finmensajes-->
				var respuestamensajes = '';
				while (respuesta.indexOf('<!--iniciomensajes-->')!=-1) {
					var bloqini = '<!--iniciomensajes-->';
					var bloqfin = '<!--finmensajes-->';
					
					var pini = respuesta.indexOf(bloqini);
					var pfin = respuesta.indexOf(bloqfin);
					
					respuestamensajes += respuesta.substring(pini+bloqini.length, pfin);
					
					if (pini>0) var prefix = respuesta.substring(0, pini); else var prefix = '';
					if (pfin<respuesta.length-1) var sufix = respuesta.substring(pfin+bloqfin.length); else var sufix = '';
					respuesta = prefix+sufix;
				}

					// toma los datos que vienen en los hidden del codigo html y 
					// que aparecen entre <!--iniciodatos--> y <!--findatos-->
				var respuestadatos = '';
				while (respuesta.indexOf('<!--iniciodatos-->')!=-1) {
					var bloqini = '<!--iniciodatos-->';
					var bloqfin = '<!--findatos-->';
					
					var pini = respuesta.indexOf(bloqini);
					var pfin = respuesta.indexOf(bloqfin);
					
					respuestadatos += respuesta.substring(pini+bloqini.length, pfin);
					
					if (pini>0) var prefix = respuesta.substring(0, pini); else var prefix = '';
					if (pfin<respuesta.length-1) var sufix = respuesta.substring(pfin+bloqfin.length); else var sufix = '';
					respuesta = prefix+sufix;
				}

					// obtiene los bloques de codigo que se muestran en contenedores que no son el principal
					// y que vienen entre <!--formu_<nombre de formulario>--> y <!--finformu-->
				var listacodigo = new Array();
				var listaformu = new Array();
				while (respuesta.indexOf('<!--formu_')!=-1) {
					var bloqfin = '<!--finformu-->';
					
					var pini = respuesta.indexOf('<!--formu_');
					var pini_fin = respuesta.indexOf('-->');
					var pfin = respuesta.indexOf(bloqfin);
					
					listaformu[listaformu.length] = respuesta.substring(pini+10, pini_fin);
					listacodigo[listacodigo.length] = respuesta.substring(pini_fin+3, pfin);
					
					if (pini>0) var prefix = respuesta.substring(0, pini); else var prefix = '';
					if (pfin<respuesta.length-1) var sufix = respuesta.substring(pfin+bloqfin.length); else var sufix = '';
					respuesta = prefix+sufix;
				}

					// lo queda de codigo html es lo que se muestra en el contenedor principal
				var respuestacodigo = respuesta;
				while (respuestacodigo!='' && 
					   (respuestacodigo.charCodeAt(0)==9 || 
						respuestacodigo.charCodeAt(0)==13 || 
						respuestacodigo.charCodeAt(0)==10 || 
						respuestacodigo.charCodeAt(0)==32)) {
					respuestacodigo = respuestacodigo.substring(1);
				}
// aqui
				if (respuestadatos!='') {
					var datos = document.getElementById('contenedordatos'+listaopt[0]);
					if (datos==null) {
						datos = document.getElementById('contenedordatoscentro');
					}
					AsignarHtml(datos, respuestadatos, true);
					datos.style.display = 'none';
					if (datos!=null && respuestadatos.indexOf('script')!=-1) 
						listadiv[listadiv.length] = datos;
				}
				var listahabilitado = document.getElementsByName('habilitado');
				if (listahabilitado.length>0)
					habilitado = listahabilitado[listahabilitado.length-1].value;
//----

				var hh = false;
//alert('a asignar html '+respuestacodigo);
				if (respuestacodigo!='') {
					var contenedor = document.getElementById('contenedor'+listaopt[0]);
					if (contenedor==null) {
						contenedor = document.getElementById('contenedorcentro');
					}
					hh = contenedor!=null; 
					AsignarHtml(contenedor, respuestacodigo, false);
					if (contenedor!=null && respuestacodigo.indexOf('script')!=-1) 
						listadiv[listadiv.length] = contenedor;
				}
				
				var nn = hh;
				for (var z=0; z<listaformu.length; z++) {
					var contenedor = document.getElementById('contenedor_'+listaformu[z]);
					if (!hh && contenedor==null && listacodigo[z]!='') {
						contenedor = document.getElementById('contenedorcentro');
						hh = contenedor!=null;
					}
					AsignarHtml(contenedor, listacodigo[z], false);
					if (!nn && contenedor!=null && listacodigo[z].indexOf('script')!=-1) 
						listadiv[listadiv.length] = contenedor;
				}

/*
				if (respuestadatos!='') {
					var datos = document.getElementById('contenedordatos'+listaopt[0]);
					if (datos==null) {
						datos = document.getElementById('contenedordatoscentro');
					}
					AsignarHtml(datos, respuestadatos, true);
					datos.style.display = 'none';
					if (datos!=null && respuestadatos.indexOf('script')!=-1) 
						listadiv[listadiv.length] = datos;
				}
*/					
				var mensajes = document.getElementById('contenedormensajes');
				if (respuestamensajes!='') {
//alert('mensajes - '+respuestamensajes);
					AsignarHtml(mensajes, respuestamensajes, false);
					if (respuestamensajes.indexOf('script')!=-1) 
						listadiv[listadiv.length] = mensajes;
					mensajes.style.display = 'inline';
//alert('asigno');
				}
				else
				if (mensajes!=null) 
					mensajes.style.display = 'none';

				ejecutarScript();
				
					// muestra u oculta los controles 
				muestraocultainicial();

				//ajustar();
           } else 
			if(ajax.status==404) {
                // La pagina no existe
                contenedor.innerHTML = "La pagina no existe";
            }
			else {
                // Mostramos el posible error
//alert(ajax.status);
                contenedor.innerHTML = "Error:"+ajax.status; 
            }
			if (document.getElementById('msncargando')!=null)
				document.getElementById('msncargando').style.display = 'none';
			
			if (listaparams.length>1) {
				var restoparams = new Array();
				var restoopt = new Array();
				for (var i=1; i<listaparams.length; i++) {
					restoparams[i-1] = listaparams[i];
					restoopt[i-1] = listaopt[i];
				}
				actualizarlista(restoparams, restoopt, hab, raizs, true);
			}
			else {
				actualizandolista = false;
				if (pendientesparams.length>0) {
					var pendientesparams1 = pendientesparams;
					var pendientesopt1 = pendientesopt;
					pendientesparams = new Array();
					pendientesopt = new Array();
					actualizarlista(pendientesparams1, pendientesopt1, hab, raizs, true);
				}
			}
			//ajustar();
       }
    }
	ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
//alert('raizsalvar='+raizsalvar+'&'+listaparams[0]);
//	ajax.send('raizsalvar='+raizsalvar+'&'+listaparams[0]);
//alert('actualizarlista - '+ raizsalvar+paginaprincipal+'raizsalvar='+raizs+'&'+listaparams[0]);
	ajax.send(listaparams[0]+'&'+'raizsalvar='+raizs);

	}
//	ajustar();
}

var alistaparams = new Array();
var alistaopt = new Array();
var alistaadd = new Array();

var listaeventos = new Array();
var actualizando = false;

//var traza = '';

	// actualiza el contenedor de la opcion correspondiente
function actualizar(params, opt, add, cola){
//if (!actualizando) traza = '';
	if (cola && actualizando)
	{
//traza += 'puso en cola '+params+' ---> ';
		alistaparams.push(params);
		alistaopt.push(opt);
		alistaadd.push(add);
	}
	else
	{
//traza += 'a actualizar '+params+' ---> ';
		actualizando = true;
	
		if (add!='') {
			params = 'menuselec=1&' + add[0].join('&') +'&' + params +'&' + add[1].join('&');
		}
		params = 'actjs=1&'+'estadoayuda=' + estadoexplicaciondetalle() +'&' + params;
		
		var listainput = document.getElementsByTagName('input');
		var hiddenrequest = '';
		for (var i=0; i<listainput.length; i++) {
			if (listainput[i].type=='hidden' && listainput[i].name.substr(0, 5)=='dato-') {
				hiddenrequest += '&' + listainput[i].name + '=' +listainput[i].value;
			} 
		}
		if (hiddenrequest!='')
			params += hiddenrequest;
	
		if (params.indexOf('refrescar=1')!=-1) {

			var lista = params.split('&nus[0]=');
			if (lista.length>1)
			{
				var lista1 = lista[1].split('&contrasena[0]=');
				lista2 = lista1[1].split('&');
				document.formdump.nush.value = lista1[0];
				document.formdump.contrasenah.value = lista2[0];
			}
//alert(params);
			
			document.formdump.action = raizsalvar+'index.php?'+lista[0];
			
			document.formdump.submit();
		}
		else {
//alert(params);
			ajax = nuevoAjax();
			ajax.open("POST", raizsalvar+paginaprincipal,true);
		
			ajax.onreadystatechange=function() {
//alert("readyState -> "+ajax.readyState);

				if(ajax.readyState==1){
//alert('-ajax.readyState==1');
					//Sucede cuando se esta cargando la pagina
					var posdiv = params.indexOf('divcargando');
					if (posdiv==-1) {
						if (document.getElementById('msncargando')!=null)
							document.getElementById('msncargando').style.display = 'inline';
					}
					else
					{
						var posini = posdiv+12;
						var posfin = params.indexOf('&', posini);
						if (posfin==-1)
							posfin = params.length-1;
						var nomdiv = params.substring(posini, posfin);
						if (document.getElementById(nomdiv)!=null) {
							document.getElementById(nomdiv).innerHTML = '<div class="cargando" id="msncargando1" style="height:15; width:100%; display:inline; padding:0; color:#000000; font-family:Verdana, Arial, Helvetica, sans-serif; font-size:9px;" align="center"><img src="vistas/primera/imagenes/id_espanol/spinner.gif"/>&nbsp;Cargando...</div>';
						}
					}
					
				}
				else 
				if(ajax.readyState==4) {
//alert('-ajax.readyState==4');
					//Sucede cuando la pagina se cargo
					if(ajax.status==200) {
//alert('-ajax.status==200');
						// Todo OK
						var respuesta = ajax.responseText;
						htmlPagina = respuesta;
//alert('respuesta' + respuesta);
							// toma los mensajes que vienen en el codigo html y 
							// que aparecen entre <!--iniciomensajes--> y <!--finmensajes-->
						respuesta = respuesta.substring(0, respuesta.length-4);
//alert('al inicio respuesta fin --'+respuesta.substring(respuesta.length-100, respuesta.length)+'--');
						var respuestamensajes = '';
						while (respuesta.indexOf('<!--iniciomensajes-->')!=-1) {
							var bloqini = '<!--iniciomensajes-->';
							var bloqfin = '<!--finmensajes-->';
							
							var pini = respuesta.indexOf(bloqini);
							var pfin = respuesta.indexOf(bloqfin);
							if (pini!=-1 && pfin==-1)
								pfin = respuesta.length;
							
							respuestamensajes += respuesta.substring(pini+bloqini.length, pfin);
							
							if (pini>0) var prefix = respuesta.substring(0, pini); else var prefix = '';
							if (pfin<respuesta.length-1) var sufix = respuesta.substring(pfin+bloqfin.length); else var sufix = '';
							respuesta = prefix+sufix;
						}
							// toma los datos que vienen en los hidden del codigo html y 
							// que aparecen entre <!--iniciodatos--> y <!--findatos-->

						var respuestadatos = '';
						while (respuesta.indexOf('<!--iniciodatos-->')!=-1) {
							var bloqini = '<!--iniciodatos-->';
							var bloqfin = '<!--findatos-->';
							
							var pini = respuesta.indexOf(bloqini);
							var pfin = respuesta.indexOf(bloqfin);
							if (pini!=-1 && pfin==-1)
								pfin = respuesta.length;
							
							respuestadatos += respuesta.substring(pini+bloqini.length, pfin);
							
							if (pini>0) var prefix = respuesta.substring(0, pini); else var prefix = '';
							if (pfin<respuesta.length-1) var sufix = respuesta.substring(pfin+bloqfin.length); else var sufix = '';
							respuesta = prefix+sufix;
						}
		
							// obtiene los bloques de codigo que se muestran en contenedores que no son el principal
							// y que vienen entre <!--formu_<nombre de formulario>--> y <!--finformu-->
						var listacodigo = new Array();
						var listaformu = new Array();
						while (respuesta.indexOf('<!--formu_')!=-1) {
							var bloqfin = '<!--finformu-->';
							
							var pini = respuesta.indexOf('<!--formu_');
							var pini_fin = respuesta.indexOf('-->');
							var pfin = respuesta.indexOf(bloqfin);
							
							listaformu[listaformu.length] = respuesta.substring(pini+10, pini_fin);
							listacodigo[listacodigo.length] = respuesta.substring(pini_fin+3, pfin);
							
							if (pini>0) var prefix = respuesta.substring(0, pini); else var prefix = '';
							if (pfin<respuesta.length-1) var sufix = respuesta.substring(pfin+bloqfin.length); else var sufix = '';
							respuesta = prefix+sufix;
//alert(listaformu[listaformu.length-1]+' --'+listacodigo[listacodigo.length-1]+'--');
						}
		
							// lo queda de codigo html es lo que se muestra en el contenedor principal
						var respuestacodigo = respuesta;
						while (respuestacodigo!='' && 
							   (respuestacodigo.charCodeAt(0)==9 || 
								respuestacodigo.charCodeAt(0)==13 || 
								respuestacodigo.charCodeAt(0)==10 || 
								respuestacodigo.charCodeAt(0)==32)) {
							respuestacodigo = respuestacodigo.substring(1);
						}
		
						var hh1 = false;
						var hh2 = false;
						var tienemarco = respuesta.indexOf('<input id="notienemarco" type="hidden" value="0" />')==-1;
						if (respuestacodigo!='') {

							var posdiv = params.indexOf('divcargando');
							if (posdiv!=-1) {
								var posini = posdiv+12;
								var posfin = params.indexOf('&', posini);
								if (posfin==-1)
									posfin = params.length-1;
								var nomdiv = params.substring(posini, posfin);
							}
							else
								var nomdiv = 'contenedor'+opt;
							
							var contenedor = document.getElementById(nomdiv);
							if (contenedor==null && respuesta.indexOf('<div id="contenedormarco">')==-1) {
								if (respuesta.indexOf('<input id="notienemarco" type="hidden" value="0" />')==-1)
									contenedor = document.getElementById('contenedormarco');
								else
									contenedor = document.getElementById('contenedorcentro');
								hh1 = contenedor!=null;

							}

							if (contenedor==null) {
								contenedor = document.getElementById('contenedorcentro');
								hh2 = contenedor!=null;
							}
//alert('principal -- en '+contenedor.id+' - '+respuestacodigo+'-- '+respuestacodigo.length+' - '+respuestacodigo.charCodeAt(0));
							AsignarHtml(contenedor, respuestacodigo, false, 1);
//alert('asigno principal');
							if (contenedor!=null && respuestacodigo.indexOf('script')!=-1) 
								listadiv[listadiv.length] = contenedor;
						}
						
						var nn = hh2;
						hh1 = false;
						for (var z=0; z<listaformu.length; z++) {
//alert('bloque '+listaformu[z]+' - '+listacodigo[z]);
							var contenedor = document.getElementById('contenedor_'+listaformu[z]);
//alert(listaformu[z]+' 1 - '+contenedor);
								
							if (!hh1 && contenedor==null && listacodigo[z]!='' && tienemarco) {
								contenedor = document.getElementById('contenedormarco');
								hh1 = contenedor!=null;
							}
//alert(listaformu[z]+' 2 - '+contenedor);

							if (!hh1 && !hh2 && contenedor==null && listacodigo[z]!='') {
								contenedor = document.getElementById('contenedorcentro');
								hh2 = contenedor!=null;
							}
//alert(listaformu[z]+' 3 - '+contenedor);

							AsignarHtml(contenedor, listacodigo[z], false, 1);
							if (!nn && contenedor!=null && listacodigo[z].indexOf('script')!=-1) 
								listadiv[listadiv.length] = contenedor;
								
							contenedor = document.getElementById('contenedormarco');
							if (contenedor!=null)
								hh1 = contenedor.innerHTML!='';
//alert('asigno marco');
						}
						
						if (respuestadatos!='') {
							var datos = document.getElementById('contenedordatos'+opt);
							if (datos==null) {
								datos = document.getElementById('contenedordatoscentro');
							}
//alert('datos - '+respuestadatos);
							AsignarHtml(datos, respuestadatos, false, 1);
							datos.style.display = 'none';
							if (datos!=null && respuestadatos.indexOf('script')!=-1) 
								listadiv[listadiv.length] = datos;
//alert('asigno datos');
						}
						
						var mensajes = document.getElementById('contenedormensajes');
						if (respuestamensajes!='') {
//alert('mensajes - '+respuestamensajes);
							AsignarHtml(mensajes, respuestamensajes, false, 1);
							if (respuestamensajes.indexOf('script')!=-1) 
								listadiv[listadiv.length] = mensajes;
							mensajes.style.display = 'inline';
//alert('asigno mensajes');
						}
						else
							mensajes.style.display = 'none';
	
//alert('a ejecutar el script');
						ejecutarScript();
//alert('ejecuto el script');
							
							// muestra u oculta los controles 
						muestraocultainicial();
//alert('hizo el muestra oculta');

						//ajustar();
				   } else 
					if(ajax.status==404) {
//alert('-ajax.status==404');
						// La pagina no existe
						contenedor.innerHTML = "La pagina no existe";
					}
					else {
//alert('-ajax.status es otro error');
						// Mostramos el posible error
						contenedor.innerHTML = "Error:"+ajax.status; 
					}
//alert('a ocultar cargando');
					if (document.getElementById('msncargando')!=null)
						document.getElementById('msncargando').style.display = 'none';
					
					evaluareventos();

					if (alistaparams.length>0) {
						params = alistaparams.shift();
						opt = alistaopt.shift();
						add = alistaadd.shift();
//alert('saco de cola');
//traza += 'saco cola '+params+' ---> ';

						actualizar(params, opt, add, false);
					}
					else {
//alert(traza);
						actualizando = false;
					}
				}
//else alert('-es otro readystate');

			}
			ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
			ajax.send(params);
		}
	}
	//ajustar();
}

// Funciones de los formularios

	// limpia el formulario, situandole los datos iniciales
function cancelar(opt, listaidpag) {
	OcultarMensaje(opt);
	
	var objetolista, boxes, marcados, fila, h, i, fila, listamarcados, j, l;
	for (l=0; l<listaidpag.length; l++) {
		idpag = listaidpag[l];
		datostabla1.restaurarTabla(idpag);
		objetolista = datostabla1.devolverTabla(idpag);
		if (objetolista!=null) {
			for (h=0; h<objetolista.names.length; h++) {
				switch (objetolista.types[h]) {
					case 'listradio':
					case 'listcheckbox':
						for (fila=0; fila<objetolista.campos[h].length; fila++) {
							switch (objetolista.types[h]) {
								case 'listradio':
									controles = document.getElementsByName(objetolista.names[h]+fila);
									if (controles.length==0) {
										controles = document.getElementsByName(objetolista.names[h]);
									}
									for (i=0; i<controles.length; i++) {
										controles[i].checked = objetolista.inimarcados[h][fila]==controles[i].value;
									}
								break;
								case 'listcheckbox':
									controles = document.getElementsByName(objetolista.names[h]+fila+'[]');
									for (i=0; i<controles.length; i++) {
										controles[i].checked = pos(objetolista.inimarcados[h][fila].split(','), controles[i].value)!=-1;
									}
								break;
							}
						}
						break;
					case 'listtextarea':
						for (fila=0; fila<objetolista.campos[h].length; fila++) {
							controles = document.getElementsByName(objetolista.names[h]+fila+'[]');
							var listainicampos = objetolista.inicampos[h][fila].split('&&');
							for (i=0; i<controles.length; i++) {
								if (i<listainicampos.length)
									controles[i].value = listainicampos[i];
								else
									controles[i].value = '';
							}
						}
						break;
					default:
						controles = document.getElementsByName(objetolista.names[h]+'[]');
						if (controles.length==0) {
							controles = document.getElementsByName(objetolista.names[h]);
						}
						for (i=0; i<controles.length; i++) {
							switch (objetolista.types[h]) {
								case 'radio':
								case 'checkbox':
									controles[i].checked = pos(objetolista.inimarcados[h], controles[i].value)!=-1;
								break;
								case 'select':
									if (objetolista.inimarcados[h][i]!='') {
										controles[i].value = objetolista.inimarcados[h][i];
									} else {
										controles[i].value = 0;
									}
									listaeventos[listaeventos.length] = controles[i].onchange;
									break;
								default:
									ModificarValor(objetolista.types[h], controles[i], objetolista.inicampos[h][i]);
							}
						}
				}
			}
		}
//alert('formu '+idpag+' eventos '+objetolista.eventos);
//		if (objetolista.eventos!='')
//			eval(objetolista.eventos);
	}

	evaluareventos();
	
	muestraocultainicial();
}

function evaluareventos() {
	while (!actualizando && listaeventos.length>0) {
		evaluarevento(listaeventos.shift());
	}
}

function evaluarevento(evento) {
	if (evento!=null) {
		String.prototype.rep = evento;
		String.prototype.rep();
	}
}

// Manejo de las tablas
	// objeto con los datos de todas las tablas en la pagina
var datostabla1 = new datostabla();
var listawindows = new Array();
var habilitado = 1;

function datostabla() {
	this.acc = '';
	this.opt = '';
	this.listatabla = new Array();
	this.listadatos = new Array();
	this.listapaginador = new Array();
	this.modificarTabla = modificarTabla;
	this.devolverTabla = devolverTabla;
	this.devolverTablaPorControl = devolverTablaPorControl;
	this.eliminarTabla = eliminarTabla;
	this.restaurarTabla = restaurarTabla;
	this.devolverPaginador = devolverPaginador;
}

function infotabla(acc, opt, names, types, formatos, id, campos, marcados, oculta, relacionados, condicion_valida, errvacio, funcion, errtipo)
{
	this.acc = acc;
	this.opt = opt;
	this.names = names;
	this.types = types;
	this.formatos = formatos;
	this.id = id;

	this.inicampos = new Array(campos.length);
	for (var i=0; i<campos.length; i++) {
		this.inicampos[i] = campos[i].join('|');
		this.inicampos[i] = this.inicampos[i].split('|');
	}
	this.inimarcados = new Array(marcados.length);
	for (var i=0; i<marcados.length; i++) {
		if (this.types[i]=='listcheckbox') {
			this.inimarcados[i] = new Array(marcados[i].length);
			for (var j=0; j<marcados[i].length; j++) {
				this.inimarcados[i][j] = marcados[i][j];
			}
		} else {
			this.inimarcados[i] = marcados[i].join('|');
			this.inimarcados[i] = this.inimarcados[i].split('|');
		}
	}

	this.campos = campos;
	this.marcados = marcados;
	this.errvacio = errvacio;
	this.funcion = funcion;
	this.errtipo = errtipo;
	this.actualizarMarcados = actualizarMarcados;
	this.desMarcar = desMarcar;
	this.actualizarMarcadoslist = actualizarMarcadoslist;
	this.actualizarCampos = actualizarCampos;
	this.actualizarCamposlist = actualizarCamposlist;

	this.oculta = oculta;
	this.ocultadopor = new Array();
	for (var i=0; i<oculta.length; i++) {
		this.ocultadopor[this.ocultadopor.length] = new Array();
	}
	
	this.relacionados = relacionados;
	this.condicion_valida = condicion_valida;
//	this.eventos = eventos;
}

function restaurarTabla(nombre)
{
	var p = pos(this.listatabla, nombre);

	if (pos!=-1) {
		this.listadatos[p].campos = new Array(this.listadatos[p].inicampos.length);
		for (var i=0; i<this.listadatos[p].inicampos.length; i++) {
			this.listadatos[p].campos[i] = this.listadatos[p].inicampos[i].join('|');
			this.listadatos[p].campos[i] = this.listadatos[p].campos[i].split('|');
		}
		this.listadatos[p].marcados = new Array(this.listadatos[p].inimarcados.length);
		for (var i=0; i<this.listadatos[p].inimarcados.length; i++) {
			this.listadatos[p].marcados[i] = this.listadatos[p].inimarcados[i].join('|');
			this.listadatos[p].marcados[i] = this.listadatos[p].marcados[i].split('!');
		}
	}
}

function modificarTabla(nombre, acc, opt, names, types, formatos, id, campos, marcados, oculta, relacionados, condicion_valida, errvacio, funcion, errtipo, pagactual, cantfilaspag, inicio) {

	var TotalFilas = campos[0].length;
	if(cantfilaspag==0) cantfilaspag=1;
	var ParteEntera = Math.floor(TotalFilas/cantfilaspag);
	var Resto;
	if (TotalFilas-ParteEntera*cantfilaspag>0)
		Resto = 1;
	else
		Resto = 0;
	var totalpaginas = ParteEntera+Resto;
	if (totalpaginas==0) 
		totalpaginas=1;

	var nuevosdatos = new infotabla(acc, opt, names, types, formatos, id, campos, marcados, oculta, relacionados, condicion_valida, errvacio, funcion, errtipo);
	var p = pos(this.listatabla, nombre);
	if (p==-1) {
		this.listatabla[this.listatabla.length] = nombre;
		this.listadatos[this.listadatos.length] = nuevosdatos;
		this.listapaginador[this.listapaginador.length] = new paginado(totalpaginas, pagactual, cantfilaspag);
	} else {
		if (inicio!='1') {
			nuevosdatos.inicampos = this.listadatos[p].inicampos;
			nuevosdatos.inimarcados = this.listadatos[p].inimarcados;
		}
		this.listadatos[p] = nuevosdatos;
		this.listapaginador[p].pagactual = 0;
		this.listapaginador[p].totalpag = totalpaginas;
	}
}

function devolverTabla(nombre) {
	if (pos(this.listatabla, nombre)>=0)
		return this.listadatos[pos(this.listatabla, nombre)];
	else 
		return null;
}

function devolverTablaPorControl(nombrecontrol) {
	var nombretabla = '';
	for (var i=0; i<this.listadatos.length; i++) {
		p = pos(this.listadatos[i].names, nombrecontrol);
		if (p>=0) {
			nombretabla = this.listatabla[i];
			break;
		}
	}
	
	if (nombretabla=='')
		return null;
	else
		return this.listadatos[pos(this.listatabla, nombretabla)];
}

function devolverPaginador(nombre) {
	return this.listapaginador[pos(this.listatabla, nombre)];
}

function eliminarTabla(nombre) {
	var i, j=0;
	var nuevalistatabla = new Array();
	var nuevalistadatos = new Array();
	for (i=0; this.listatabla.length; i++) {
		if (this.listatabla[i]!=nombre) {
			nuevalistatabla[j] = this.listatabla[i];
			nuevalistadatos[j] = this.listadatos[i];
			j++;
		}
	}
	this.listatabla = nuevalistatabla;
	this.listadatos = nuevalistadatos;
}

function actualizarMarcados(col, control, fila) {
	switch (this.types[col]) {
		case 'radio':
		case 'checkbox':
			var marcado = pos(this.marcados[col], control.value)!=-1;
			if (control.checked && !marcado) {
				if (this.types[col]=='radio') {
					this.marcados[col] = new Array();
				}
				this.marcados[col][this.marcados[col].length] = control.value;
			} else 
			if (!control.checked && marcado) {
				var nuevosmarcados = new Array();
				for (k=0; k<this.marcados[col].length; k++) {
					if (this.marcados[col][k]!=control.value) {
						nuevosmarcados[nuevosmarcados.length] = this.marcados[col][k];
					}
				}
				this.marcados[col] = nuevosmarcados;
			}
		break;
		case 'select':
			this.marcados[col][fila] = control.value;
		break;
	}
}

function desMarcar(col, control, fila) {
	switch (this.types[col]) {
		case 'radio':
		case 'checkbox':
//alert('antes se desmarco '+this.marcados[col]);
			this.marcados[col] = new Array();
//alert('despues se desmarco '+this.marcados[col]);
			control.value = 0;
		break;
		case 'select':
			this.marcados[col][fila] = 0;
			control.value = 0;
		break;
	}
}

function actualizarCampos(col, control, fila) {
	switch (this.types[col]) {
		case 'date':
		case 'text':
		case 'textarea':
			this.campos[col][fila] = control.value;
		break;
	}
}

function actualizarCamposlist(col, control, pos, fila) {
	var lista = this.campos[col][fila].split('&&');
	lista[pos] = control.value;
	this.campos[col][fila] = lista.join('&&');
}

function actualizarMarcadoslist(i, control, fila) {
	var marcar, desmarcar, marcado, listamarcados;
	switch (this.types[i]) {
		case 'listradio':
			marcado = this.marcados[i][fila]==control.value;
		break;
		case 'listcheckbox':
			if (this.marcados[i][fila]!=null) {
				listamarcados = this.marcados[i][fila].split(',');
				marcado = control.value!='' && pos(listamarcados, control.value)!=-1;
			} else {
				listamarcados = new Array();
				marcado = false;
			}
		break;
	}
	marcar = control.checked && !marcado;
	desmarcar = !control.checked && marcado;
	switch (this.types[i]) {
		case 'listradio':
			if (marcar) {
				this.marcados[i][fila] = control.value;
			}
			else
			if (desmarcar) {
				this.marcados[i][fila] = '';
			}
		break;
		case 'listcheckbox':
			var nuevosmarcados = new Array();
			if (marcar) {
				listamarcados[listamarcados.length] = control.value;
				for (k=0; k<listamarcados.length; k++) {
					if (listamarcados[k]!='')
						nuevosmarcados[nuevosmarcados.length] = listamarcados[k];
				}
				this.marcados[i][fila] = nuevosmarcados.join(',');
			} else 
			if (desmarcar) {
				for (k=0; k<listamarcados.length; k++) {
					if (listamarcados[k]!='' && listamarcados[k]!=control.value) {
						nuevosmarcados[nuevosmarcados.length] = listamarcados[k];
					}
				}
				this.marcados[i][fila] = nuevosmarcados.join(',');
			}
		break;
	}
}

	// crea una lista con los valores de los checkboxes marcados en la tabla
function ObtenerMarcados(idpag) {
	var objetolista, boxes, j, marcados;
	marcados = new Array();
	j = -1;
	objetolista = datostabla1.devolverTabla(idpag);
	boxes = document.getElementsByName(objetolista.names[objetolista.id]+'[]');
	if (boxes==null)
		boxes = document.getElementsByName(objetolista.names[objetolista.id]);
	for (i=0; i<boxes.length; i++) {
		objetolista.actualizarMarcados(objetolista.id, boxes[i], i);
	}
	for (i=0; i<objetolista.marcados[objetolista.id].length; i++) {
		marcados[i] = objetolista.names[objetolista.id]+'['+i+']='+objetolista.marcados[i];
	}
	return marcados;
}

var listanametabs = new Array();
var listaobjtabs = new Array();

function ObtenerValoresTabs() {
	var valores = new Array();
	for (i=0; i<datostabla1.listadatos.length; i++) {
		objetolista = datostabla1.listadatos[i];
		for (h=0; h<objetolista.names.length; h++) {
			switch (objetolista.types[h]) {
				case 'tabs':
					var eltabpanel = listaobjtabs[listanametabs.indexOf(objetolista.names[h])];
					var eltab = eltabpanel.getActiveTab();
					valores[valores.length] = 'acttab_tabs_'+objetolista.names[h]+'='+eltab.contentEl;
				break;
			}
		}
	}
	return valores;
}

	// crea una lista con los valores de las variables en la tabla
function ObtenerValoresTabla(idpag) {
	var objetolista, paginador, boxes, marcados, fila, h, i, fila, listamarcados, j, controles;
	datosacc = new Array();
	valores = new Array();
	objetolista = datostabla1.devolverTabla(idpag);
	if (objetolista!=null) {

		datosacc[datosacc.length] = 'acc='+objetolista.acc;
		datosacc[datosacc.length] = 'opt='+objetolista.opt;

		paginador = datostabla1.devolverPaginador(idpag);
		var filaini = paginador.pagactual*paginador.cantfilas;
		var filafin = (paginador.pagactual+1)*paginador.cantfilas-1;
		for (h=0; h<objetolista.names.length; h++) {
			if (objetolista.id==h) {
				for (i=0; i<objetolista.campos[h].length; i++) {
					switch (objetolista.types[h]) {
						case 'select':
							valores[valores.length] = 'id_'+idpag+'['+i+']='+objetolista.marcados[h][i];
							break;
						default:
							valores[valores.length] = 'id_'+idpag+'['+i+']='+objetolista.campos[h][i];
					}
				}
			}
			switch (objetolista.types[h]) {
				case 'listradio':
					for (fila=filaini; fila<=filafin; fila++) {
						i = fila-filaini;
						controles = document.getElementsByName(objetolista.names[h]+i);
						if (controles.length==0) {
							controles = document.getElementsByName(objetolista.names[h]);
						}
						
						for (i=0; i<controles.length; i++) {
							objetolista.actualizarMarcadoslist(h, controles[i], fila);
						}
					}
					for (fila=0; fila<objetolista.campos[h].length; fila++) {
						if (objetolista.marcados[h][fila]!='') {
							valores[valores.length] = objetolista.names[h]+fila+'='+objetolista.marcados[h][fila];
						}
					}
				case 'listcheckbox':
					for (fila=filaini; fila<=filafin; fila++) {
						i = fila-filaini;
						controles = document.getElementsByName(objetolista.names[h]+i+'[]');
						if (controles.length==0) {
							controles = document.getElementsByName(objetolista.names[h]+'[]');
						}
						
						for (i=0; i<controles.length; i++) {
							objetolista.actualizarMarcadoslist(h, controles[i], fila);
						}
					}
						
					for (fila=0; fila<objetolista.campos[h].length; fila++) {
						if (objetolista.marcados[h][fila]!='') {
							valores[valores.length] = objetolista.names[h]+fila+'='+escape(objetolista.marcados[h][fila]);
						}
					}
					break;
				case 'radio':
					controles = document.getElementsByName(objetolista.names[h]);
					for (i=0; i<controles.length; i++) {
						objetolista.actualizarMarcados(h, controles[i], i);
					}
					for (i=0; i<objetolista.marcados[h].length; i++) {
						if (objetolista.marcados[h][i]!='' && objetolista.marcados[h][i]!=0) {
							valores[valores.length] = objetolista.names[h]+'='+objetolista.marcados[h][i];
						}
					}
					break;
				case 'checkbox':
					controles = document.getElementsByName(objetolista.names[h]+'[]');
					for (i=0; i<controles.length; i++) {
						objetolista.actualizarMarcados(h, controles[i], i);
					}
					var j = 0;
					for (i=0; i<objetolista.marcados[h].length; i++) {
						if (objetolista.marcados[h][i]!='' && objetolista.marcados[h][i]!=0) {
							valores[valores.length] = objetolista.names[h]+'['+j+']='+objetolista.marcados[h][i];
							j++;
						}
					}
					break;
				case 'select':
					controles = document.getElementsByName(objetolista.names[h]+'[]');
					if (controles.length==0) {
						controles = document.getElementsByName(objetolista.names[h]);
					}
					for (fila=filaini; fila<=filafin; fila++) {
						i = fila - filaini;
						if (i<controles.length)
							objetolista.actualizarMarcados(h, controles[i], fila);
					}
					for (i=0; i<objetolista.marcados[h].length; i++) {
						valores[valores.length] = objetolista.names[h]+'['+i+']='+objetolista.marcados[h][i];
					}
					break;
					
				case 'listtextarea':
					for (fila=filaini; fila<=filafin; fila++) {
						i = fila-filaini;
						controles = document.getElementsByName(objetolista.names[h]+i+'[]');
						if (controles.length==0) {
							controles = document.getElementsByName(objetolista.names[h]+'[]');
						}
						
						for (i=0; i<controles.length; i++) {
							objetolista.actualizarCamposlist(h, controles[i], i, fila);
						}
					}
						
					for (fila=0; fila<objetolista.campos[h].length; fila++) {
						if (objetolista.campos[h][fila]!='') {
							var lista = objetolista.campos[h][fila].split('&&');
							for (ii=0; ii<lista.length; ii++) {
								valores[valores.length] = objetolista.names[h]+fila+'['+ii+']='+escape(lista[ii]);
							}
						}
					}
					break;
				default:
					controles = document.getElementsByName(objetolista.names[h]+'[]');
					if (controles.length==0) {
						controles = document.getElementsByName(objetolista.names[h]);
					}
					for (fila=filaini; fila<=filafin; fila++) {
						i = fila - filaini;
						if (i<controles.length) {
							objetolista.actualizarCampos(h, controles[i], fila);
						}
					}
					for (i=0; i<objetolista.campos[h].length; i++) {
						valores[valores.length] = objetolista.names[h]+'['+i+']='+escape(objetolista.campos[h][i]);
					}
					break;
			}
		}
	}
	return new Array(datosacc, valores);
}


function ObtenerGetvars(listaidpag) {
	getaccs = new Array();
	getvars = new Array();
	for (i=0; i<listaidpag.length; i++) {
		 getvarsformu= ObtenerValoresTabla(listaidpag[i]);
		 getaccs = getaccs.concat(getvarsformu[0]);
		 getvars = getvars.concat(getvarsformu[1]);
	}
	getaccs1 = ObtenerValoresTabs();
	getaccs = getaccs.concat(getaccs1);
	return new Array(getaccs, getvars);
}

	// si existen checkboxes marcados en la tabla los desmarca
	// actualiza el contenedor de la opcion opt, con el html que devuelve el llamado a url
	// se envian por get los valores de las variables en idpag
function DesmarcarLlamar(url, opt, idpag, listaidpag) {
	var objetolista, controles, i, getvars, getvarsformu;
	objetolista = datostabla1.devolverTabla(idpag);

	controles = document.getElementsByName(objetolista.names[objetolista.id]+'[]');
	if (controles==null)
		controles = document.getElementsByName(objetolista.names[objetolista.id]);
	for (i=0; i<controles.length; i++) {
		objetolista.desMarcar(objetolista.id, controles[i], i);
	}

	getvars = ObtenerGetvars(listaidpag);

	actualizar(url, opt, getvars, true);
}

	// actualiza el contenedor de la opcion opt, con el html que devuelve el llamado a url
	// se envian por get los valores de las variables en idpag
function Llamar(url, opt, listaidpag) {
	var i, getvars, getvarsformu;

	getvars = ObtenerGetvars(listaidpag);

	actualizar(url, opt, getvars, true);
}

	// si existen checkboxes marcados en la tabla
	// actualiza el contenedor de la opcion opt, con el html que devuelve el llamado a url
	// se envian por get los valores de las variables en idpag
function ChequearmarcadosLlamar(mnserror, url, opt, listaidpag) {
	var objetolista, controles, boxes, i;
	objetolista = datostabla1.devolverTabla(listaidpag[0]);

	controles = document.getElementsByName(objetolista.names[objetolista.id]+'[]');
	if (controles==null)
		controles = document.getElementsByName(objetolista.names[objetolista.id]);
	for (i=0; i<controles.length; i++) {
		objetolista.actualizarMarcados(objetolista.id, controles[i], i);
	}

	b = false;
	boxes = objetolista.marcados[objetolista.id];
	for (i=0; i<boxes.length; i++) {
		b = boxes[i]!=0;
		if (b)
			break;
	}
	if (!b) 
		MostrarMensajeError(mnserror);
	else {

		getvars = ObtenerGetvars(listaidpag);

		actualizar(url, opt, getvars, true);
	}
}

	// si los datos en los formularios estan correctos y se confirma
	// actualiza el contenedor de la opcion opt, con el html que devuelve el llamado a url
	// se envian por get los valores de las variables en idpag
function ValidarConfirmarLlamar(preg, url, opt, listaidpag, opt1) {
	var idpag, mnserror, objetolista, complemento, h, k, i, j, l, b, z, b1, marc, getvars;
	OcultarMensaje(opt);
	
	mnserror = '';
	b = true;

	getvars = ObtenerGetvars(listaidpag);

	for (l=0; l<listaidpag.length; l++) {
		idpag = listaidpag[l];
		// Validar
		objetolista = datostabla1.devolverTabla(idpag);
		if (objetolista!=null) {
				// determina si se cumplen cada una de las condiciones para validar los campos del formulario
			var condicion_valida_vacio = new Array();
			var condicion_valida_funcion = new Array();
			var condicion_valida_adicional = new Array();

			for (i=0; i<objetolista.condicion_valida.length; i++) {
				if (objetolista.condicion_valida[i].length==0) {
					condicion_valida_vacio[condicion_valida_vacio.length] = true;
					condicion_valida_funcion[condicion_valida_funcion.length] = true;
					condicion_valida_adicional[condicion_valida_adicional.length] = true;
				}
				else {
					var listadatos = objetolista.campos[i];
					var listarelacionados = new associativeList();
					for (j=0; j<objetolista.condicion_valida[i].length; j++) {
						var objetolistaOtro = datostabla1.devolverTablaPorControl(objetolista.condicion_valida[i][j]);
						if (objetolistaOtro!=null) {
							var p = pos(objetolistaOtro.names, objetolista.condicion_valida[i][j]);
							if (p!=-1) {
								if (objetolistaOtro.types[p]=='checkbox' || objetolistaOtro.types[p]=='radio' || 
									objetolistaOtro.types[p]=='select' || objetolistaOtro.types[p]=='listradio' || 
									objetolistaOtro.types[p]=='listcheckbox')
									listarelacionados.add(objetolista.condicion_valida[i][j], objetolistaOtro.marcados[p]);
								else
									listarelacionados.add(objetolista.condicion_valida[i][j], objetolistaOtro.campos[p]);
							}
							else
								listarelacionados.add(objetolista.condicion_valida[i][j], new Array());
						}
						else
							listarelacionados.add(objetolista.condicion_valida[i][j], new Array());
					}

					var resp = eval('condicionvalida_'+objetolista.names[i]+'(listadatos, listarelacionados)');
					condicion_valida_vacio[condicion_valida_vacio.length] = resp[0];
					condicion_valida_funcion[condicion_valida_funcion.length] = resp[1];
					condicion_valida_adicional[condicion_valida_adicional.length] = resp[2];
				}
			}

			// determina si existen todos los valores que son obligatorios
			for (i=0; i<objetolista.errvacio.length; i++) {
				var listacontroles = document.getElementsByName(objetolista.names[i]);
				if (listacontroles.length==0)
					listacontroles = document.getElementsByName(objetolista.names[i]+'[]');
				if (listacontroles.length==0)
					listacontroles = document.getElementsByName(objetolista.names[i]+'0');
				if (listacontroles.length==0)
					listacontroles = document.getElementsByName(objetolista.names[i]+'0[]');
				if (listacontroles.length!=0 && condicion_valida_vacio[i] && objetolista.errvacio[i]!='') {
					switch (objetolista.types[i]) {
						case 'checkbox':
						case 'radio':
							b1 = false;
						break;
						default:
							b1 = true;
						break;
					}
					for (j=0; j<objetolista.campos[i].length; j++) {
						if (j>=listacontroles.length || listacontroles[j].style.display!='none')
							switch (objetolista.types[i]) {
								case 'listcheckbox':
								case 'listradio':
									// en la lista de check o radio de cada fila tiene que existir al menos un marcado
									if (j<objetolista.marcados[i].length) {
										marc = objetolista.marcados[i][j].split(',');
										b2 = marc.length==0;
										for (z=0; z<marc.length; z++) {
											b2 = b2 || marc[z]!='';
										}
										b1 = b1 && b2;
									}
									break;
								case 'checkbox':
								case 'radio':
									// al menos un check o un radio tienen que estar marcados en la columna, es decir,
									// que el valor del check o del radio en la fila esta en la lista de los marcados de la columna
									camp = objetolista.campos[i];
									b2 = false;
									for (z=0; z<camp.length; z++) {
										b2 = b2 || pos(objetolista.marcados[i], camp[z])!=-1;
									}
									b1 = b1 || b2;
									break;
								case 'select':
									// todos los select tienen que estar seleccionados
									b1 = b1 && objetolista.marcados[i][j]!=0;
									break;
								case 'listtextarea':
									// en la lista de textarea tiene que existir al menos uno con valor
									marc = objetolista.campos[i][j].split('&&');
									b2 = false;
									for (z=0; z<marc.length; z++) {
										b2 = b2 || marc[z]!='';
									}
									b1 = b1 && b2;
									break;
								case 'date':
								case 'text':
								case 'textarea':
									// todos los text y textarea tienen que tener algo escrito
									b1 = b1 && objetolista.campos[i][j]!='';
									break;
							}
					}
					b = b && b1;
					if (!b1) {
						mnserror += objetolista.errvacio[i]+'<br/>';
					}
				}
			}
	
				// determina todos los valores entrados son del tipo necesario
			for (i=0; i<objetolista.funcion.length; i++) {
				var listacontroles = document.getElementsByName(objetolista.names[i]);
				if (listacontroles.length==0)
					listacontroles = document.getElementsByName(objetolista.names[i]+'[]');
				if (listacontroles.length!=0 && condicion_valida_funcion[i] && objetolista.funcion[i]!='') {
					b1 = true;
					for (j=0; j<objetolista.campos[i].length; j++) {
						if (objetolista.campos[i][j]!='') {
							switch (objetolista.types[i]) {
								case 'date':
								case 'text':
								case 'textarea':
									// todos tienen que ser del tipo requerido
									b1 = eval(objetolista.funcion[i]+"('"+objetolista.campos[i][j]+"')");
									break;
							}
						}
	
						if (!b1) {
							mnserror += objetolista.errtipo[i]+'<br/>';
						}
						b = b && b1;
					}
				}
			}
			
				// determina si se cumplen las condicicones adicionales que se indican cuando hay valores que estan relacionados
			for (i=0; i<objetolista.relacionados.length; i++) {
				if (condicion_valida_adicional[i] && objetolista.relacionados[i].length>0) {
					var listadatos = objetolista.campos[i];
					var listarelacionados = new associativeList();
					for (j=0; j<objetolista.relacionados[i].length; j++) {
						var objetolistaOtro = datostabla1.devolverTablaPorControl(objetolista.relacionados[i][j]);
						if (objetolistaOtro!=null) {
							var p = pos(objetolistaOtro.names, objetolista.relacionados[i][j]);
							if (p!=-1) {
								if (objetolistaOtro.types[p]=='checkbox' || objetolistaOtro.types[p]=='radio' || 
									objetolistaOtro.types[p]=='select' || objetolistaOtro.types[p]=='listradio' || 
									objetolistaOtro.types[p]=='listcheckbox')
									listarelacionados.add(objetolista.relacionados[i][j], objetolistaOtro.marcados[p]);
								else
									listarelacionados.add(objetolista.relacionados[i][j], objetolistaOtro.campos[p]);
							}
							else
								listarelacionados.add(objetolista.relacionados[i][j], new Array());
						}
						else
							listarelacionados.add(objetolista.relacionados[i][j], new Array());
					}
					var listaerrores = eval('validarrelaciones_'+objetolista.names[i]+'(listadatos, listarelacionados)');
					if (listaerrores.length>0)
					{
						mnserror += listaerrores.join('<br/>')+'<br/>';
						b = false;
					}
			}
		}
		}
	}
			
	if (!b) 
		MostrarMensajeError(mnserror);
	else {
 		if (preg=='') 
			actualizar(url, opt1, getvars, true);
		else {
			Ext.MessageBox.show({
			   title: 'Confirmaci&oacute;n',
			   msg: preg,
			   buttons: {yes:'S&iacute;', no:'No'},
			   fn: callback_ValidarConfirmarLlamar,
			   icon: Ext.MessageBox.QUESTION
			});
		}
	}

	function callback_ValidarConfirmarLlamar(btn) {
		if (btn=='yes')
			actualizar(url, opt1, getvars, true);
	}
}

function ConfirmarLlamar(preg, url, opt, listaidpag, opt1) {
	OcultarMensaje(opt);

	getvars = ObtenerGetvars(listaidpag);
	
	if (preg=='') 
		actualizar(url, opt1, getvars, true);
	else {
		Ext.MessageBox.show({
		   title: 'Confirmaci&oacute;n',
		   msg: preg,
		   buttons: {yes:'S&iacute;', no:'No'},
		   fn: callback_ConfirmarLlamar,
		   icon: Ext.MessageBox.QUESTION
		});
	}

	function callback_ConfirmarLlamar(btn) {
		if (btn=='yes')
			actualizar(url, opt1, getvars, true);
	}
}

	// si existen checkboxes marcados en la tabla y se confirma la accion
	// actualiza el contenedor de la opcion opt, con el html que devuelve el llamado a url
	// se envian por get los valores de las variables en idpag
function ChequearmarcadosConfirmarLlamar(mnserror, preg, compltexto, complvalor, url, opt, listaidpag) {
	var objetolista, controles, boxes, complemento, h, k, i, j, l;
	complemento = '';
//	objetolista = datostabla1.devolverTabla(idpag);
	objetolista = datostabla1.devolverTabla(listaidpag[0]);

	controles = document.getElementsByName(objetolista.names[objetolista.id]+'[]');
	for (i=0; i<controles.length; i++) {
		objetolista.actualizarMarcados(objetolista.id, controles[i], i);
	}

	boxes = objetolista.marcados[objetolista.id];
	for (i=0; i<boxes.length; i++) {
		if (boxes[i]!=0) {
			h = pos(objetolista.campos[objetolista.id], boxes[i]);
			if (compltexto.length>0) {
				for (j=0; j<compltexto.length; j++) {
					k = pos(objetolista.names, complvalor[j]);
					if (k!=-1)
						complemento += compltexto[j] + ': ' + objetolista.campos[k][h];
					if (j<compltexto.length-1)
						complemento += ' - ';
				}
				complemento += '<br/>';
			}
		}
	}
	if (complemento=='') 
		MostrarMensajeError(mnserror);
	else {
		b = true;

		getvars = ObtenerGetvars(listaidpag);

		Ext.MessageBox.show({
		   title: 'Confirmaci&oacute;n',
		   msg: preg+'<br/>'+complemento,
		   buttons: {yes:'S&iacute;', no:'No'},
		   fn: callback_ChequearmarcadosConfirmarLlamar,
		   icon: Ext.MessageBox.QUESTION
		});
	}

	function callback_ChequearmarcadosConfirmarLlamar(btn) {
		if (btn=='yes')
			actualizar(url, opt, getvars, true);
	}
}

// funciones de paginado de las tablas
function rowOverEffect(object) {
  	if (object.className == 'dataTableRow') object.className = 'dataTableRowOver';
}

function rowOutEffect(object) {
  	if (object.className == 'dataTableRowOver') object.className = 'dataTableRow';
}

function paginado(totalpag, pagactual, cantfilas)
{
	this.totalpag = totalpag;
	this.pagactual = pagactual;
	this.cantfilas = cantfilas;
}

function OcultarMensaje(opt) {
	if (document.getElementById('mns'+opt+1)!=null)
		document.getElementById('mns'+opt+1).style.display = 'none';
}

function ActualizarPaginador(clavetabla, opt, paginador, combo)
{
	var objetolista = datostabla1.devolverTabla(clavetabla);
	
	paginador.totalpag = Math.ceil(objetolista.campos[0].length/paginador.cantfilas);
	
	combo.value = paginador.pagactual;

	OcultarMensaje(opt);

	if (paginador.pagactual==0)
		document.getElementById('dec'+clavetabla).style.display = 'none';
	else
		document.getElementById('dec'+clavetabla).style.display = 'inline';
	if (paginador.pagactual==(paginador.totalpag-1))
		document.getElementById('inc'+clavetabla).style.display = 'none';
	else
		document.getElementById('inc'+clavetabla).style.display = 'inline';
}

function ModificarValor(tipo, control, valor) {
	switch (tipo) {
		case 'image':
			control.src = valor;
		break;
		case 'div':
			control.innerHTML = valor;
		break;
		default:
			control.value = valor;  // select, checkbox, text, radio
		break;
	}
}

function MostrarValores(claveTabla, posant, posini, cantfilas) {
	var nombrelista, marcado, nuevomarcados, k, j, controles, valormostrar;
	nombrelista = datostabla1.devolverTabla(claveTabla);
	for (i=0; i<nombrelista.names.length; i++) {
		switch (nombrelista.types[i]) {
			case 'listcheckbox':
			case 'listradio':
				for (k=0; k<cantfilas; k++) {
					if (nombrelista.types[i]=='listradio') {
						controles = document.getElementsByName(nombrelista.names[i]+k);
					} else {
						controles = document.getElementsByName(nombrelista.names[i]+k+'[]');
					}
					if (controles!=null && controles.length>0) {
						for (j=0; j<controles.length; j++) {
								// conserva los marcados en la pagina anterior
							if (k<posant+cantfilas && k<nombrelista.campos[i].length-posant) {
								nombrelista.actualizarMarcadoslist(i, controles[j], posant+k);
							}
						}

						for (j=0; j<controles.length; j++) {
								// oculta los controles en el caso que no tengan valor en esta pagina
							if (k<posini+cantfilas && k<nombrelista.campos[i].length-posini) {
								controles[j].style.display = 'inline';
								document.getElementById('label_'+nombrelista.names[i]+k+j).style.display = 'inline';
									// situa en el control los marcados de la pagina actual
								if (nombrelista.types[i]=='listradio') {
									controles[j].checked = nombrelista.marcados[i][posini+k]==controles[j].value;
								} else {
									var listamarcados = nombrelista.marcados[i][posini+k].split(',');
									controles[j].checked = (pos(listamarcados, controles[j].value)!=-1);
								}
							} else {
								controles[j].style.display = 'none';
								document.getElementById('label_'+nombrelista.names[i]+k+j).style.display = 'none';
							}
						}
					}
				}
			break;
			case 'listtextarea':
				for (k=0; k<cantfilas; k++) {
					if (nombrelista.types[i]=='listradio') {
						controles = document.getElementsByName(nombrelista.names[i]+k);
					} else {
						controles = document.getElementsByName(nombrelista.names[i]+k+'[]');
					}
					if (controles!=null && controles.length>0) {
						for (j=0; j<controles.length; j++) {
								// conserva los marcados en la pagina anterior
							if (k<posant+cantfilas && k<nombrelista.campos[i].length-posant) {
								nombrelista.actualizarCamposlist(i, controles[j], posant+k);
							}
						}

						for (j=0; j<controles.length; j++) {
								// oculta los controles en el caso que no tengan valor en esta pagina
							if (k<posini+cantfilas && k<nombrelista.campos[i].length-posini) {
								controles[j].style.display = 'inline';
								document.getElementById('label_'+nombrelista.names[i]+k+j).style.display = 'inline';
								
									// situa en el control los valores de la pagina actual
								var listavalores = nombrelista.campos[i][posini+k].split('&&');
								controles[j].value = listavalores[j];
							} else {
								controles[j].style.display = 'none';
								document.getElementById('label_'+nombrelista.names[i]+k+j).style.display = 'none';
							}
						}
					}
				}
			break;
			default:
				if (nombrelista.types[i]=='radio') {
					controles = document.getElementsByName(nombrelista.names[i]);
				} else {
					controles = document.getElementsByName(nombrelista.names[i]+'[]');
				}
					// conserva los marcados y los valores de los controles en la pagina anterior
				for (j=0; j<controles.length; j++) {
					switch (nombrelista.types[i]) {
						case 'checkbox':
						case 'radio':
								// conserva los marcados de la pagina anterior para los checkbox y radio
							nombrelista.actualizarMarcados(i, controles[j], i);
							break;
						case 'select':
								// conserva los seleccionados de la pagina anterior para los select
							nombrelista.actualizarMarcados(i, controles[j], i);
						case 'date':
						case 'text':
						case 'textarea':
								// conserva los valores de la pagina anterior para text, textarea y select
							if (j<posant+cantfilas && j<nombrelista.campos[i].length-posant) {
								nombrelista.campos[i][posant+j] = controles[j].value;
							}
					}
				}
		
					// actualiza los valores de los controles para la pagina actual
				for (j=0; j<controles.length; j++) {
						// determina el valor que debe tener el control en la pagina actual
					if (j>=posini+cantfilas || j>=nombrelista.campos[i].length-posini) {
						valor = '';
						valormostrar = '';
					}
					else {
						valor = nombrelista.campos[i][posini+j];

						if (nombrelista.formatos[i]=='boolean') {
							if (valor==1) {
								valormostrar = 'x';
							}
							else {
								valormostrar = '';
							}
						}
						else {
							valormostrar = valor;
						}
					}
						// situa en el control los valores de la pagina actual
					ModificarValor(nombrelista.types[i], controles[j], valormostrar);
					
						// situa en el control los marcados de la pagina actual para los checkbox, radio y select
					switch (nombrelista.types[i]) {
						case 'checkbox':
						case 'radio':
							controles[j].checked = (valor!='') && (pos(nombrelista.marcados[i], valor)!=-1);
							break;
						case 'select':
							controles[j].value = valor;
							break;
					}
					
						// oculta los controles en el caso que no tengan valor en esta pagina
					if (j<posini+cantfilas && j<nombrelista.campos[i].length-posini) {
						if (nombrelista.types[i]=='date') {
							var eldiv = document.getElementById('contenedor_'+nombrelista.names[i]+j);
							eldiv.style.display = 'inline';
						}
						else
							controles[j].style.display = 'inline';
					} else {
						if (nombrelista.types[i]=='date') {
							var eldiv = document.getElementById('contenedor_'+nombrelista.names[i]+j);
							eldiv.style.display = 'none';
						}
						else {
							controles[j].style.display = 'none';
						}
					}
				}
		}
	}

	muestraocultainicial();
}

function DecrementarPagina(claveTabla, opt, idcombo)
{
	var paginador = datostabla1.devolverPaginador(claveTabla);
	var lista = document.getElementsByName(idcombo);
	var combo = lista[0];

	if (paginador.pagactual>0) {
		var pagant = paginador.pagactual;
		paginador.pagactual--;
		
		ActualizarPaginador(claveTabla, opt, paginador, combo);
		
		MostrarValores(claveTabla, pagant*paginador.cantfilas, paginador.pagactual*paginador.cantfilas, paginador.cantfilas);
	}
}

function IncrementarPagina(claveTabla, opt, idcombo)
{
	var paginador = datostabla1.devolverPaginador(claveTabla);
	var lista = document.getElementsByName(idcombo);
	var combo = lista[0];
	
	if (paginador.pagactual<paginador.totalpag-1) {
		var pagant = paginador.pagactual;
		paginador.pagactual++;
		ActualizarPaginador(claveTabla, opt, paginador, combo);
	
		MostrarValores(claveTabla, pagant*paginador.cantfilas, paginador.pagactual*paginador.cantfilas, paginador.cantfilas);
	}
}

function CambiarPagina(claveTabla, opt, idcombo)
{
	var paginador = datostabla1.devolverPaginador(claveTabla);
	var lista = document.getElementsByName(idcombo);
	var combo = lista[0];

	var pagant = paginador.pagactual;
	paginador.pagactual = combo.value;
		
	ActualizarPaginador(claveTabla, opt, paginador, combo);

	MostrarValores(claveTabla, pagant*paginador.cantfilas, paginador.pagactual*paginador.cantfilas, paginador.cantfilas);
}

// Utilidades
function MostrarMensaje(opt, Texto)
{
	document.getElementById('mns'+opt+1).style.display = 'inline';
	document.getElementById('mns'+opt+2).className = 'mensaje';
	document.getElementById('mns'+opt+3).innerHTML = Texto;
}

//function MostrarMensajeError(opt, Texto)
function MostrarMensajeError(Texto)
{
	Ext.MessageBox.show({
	   title: 'Error',
	   msg: Texto,
	   buttons: Ext.MessageBox.OK,
	   fn: callBack_MostrarMensajeError,
	   icon: Ext.MessageBox.ERROR
	});
	
	function callBack_MostrarMensajeError(btn) {
	}
	
//	document.getElementById('mns'+opt+1).style.display = 'inline';
//	document.getElementById('mns'+opt+2).className = 'mensajeerror';
//	document.getElementById('mns'+opt+3).innerHTML = Texto;
}

function MostrarMensajeInformacion(Texto)
{
	Ext.MessageBox.show({
	   title: 'Informaci&oacute;n',
	   msg: Texto,
	   buttons: Ext.MessageBox.OK,
	   fn: callBack_MostrarMensajeInformacion,
	   icon: Ext.MessageBox.INFO
	});
	
	function callBack_MostrarMensajeInformacion(btn) {
	}
	
}

function pos(arreglo, valor)
{
	var b;
	var i;
	for (i=0; i<arreglo.length; i++)
	{
		b = arreglo[i]==valor;
		if (b)
			break;
	}
	var p;
	if (b)
		p = i;
	else
		p = -1;
	return p;
//	return arreglo.indexOf(valor);
}

// FUNCIONES DE VALIDACION	
// Devuelve true si el $Texto esta formado por caracteres numericos (0..9).
function Telefono(Texto)
{
	if (Texto=='campo_vaciado')
	{
			b = true;
	}
	else
	{
		var b = true;
		var i = 0;
		var char;
		while (b && i<Texto.length)
		{
			char = Texto.substr(i, 1);
			b = b && (('0'<= char && char<='9') || 
						char=='(' || char==')' ||
						char=='-');
			i++;
		}
	}
	return b;
}

// Devuelve true si el $Texto esta formado por caracteres numericos (0..9).
function SoloDigitos(Texto)
{
	if (Texto=='campo_vaciado')
	{
			b = true;
	}
	else
	{
		var b = true;
		var i = 0;
		var char;
		while (b && i<Texto.length)
		{
			char = Texto.substr(i, 1);
			b = b && "0"<=char && char<="9";
			i++;
		}
	}
	return b;
}

//Devuleve true si el $Texto esta en un formato que se corresponda con el de la hora militar
function HoraMilitar(Texto)
{	
	if (Texto=='campo_vaciado')
	{
			b = true;
	}
	else
	{
		var b = true;			
		a=Texto.charAt(0);
		b=Texto.charAt(1);
		c=Texto.charAt(2);
		d=Texto.charAt(3);
		e=Texto.charAt(4);	
		
		if (Texto.length!=5 || a<0 || a>2 || c!=':' || d<0 || d>5 || e<0 || e>9)
		b=false;
		if(a==2){
		 if(b<0 || b>3)
		  b=false;
		}
		else
		{
			if(b<0 || b>9)
			b=false;
		}
	}
	return b;
}

// Devuelve true si el $Texto es un numero real.
function Real(Texto)
{
	if (Texto=='campo_vaciado')
	{
			b = true;
	}
	else
	{
		var p = Texto.indexOf('.');
		if (p<0) {
			b = SoloDigitos(Texto);
		}
		else {
			var b = ((p>0 && p<Texto.length-1) || (!p && !(p===0)));
			var i = 0;
			var char;
			while (b && i<Texto.length)
			{
				char = Texto.substr(i, 1);
				b = b && (("0"<=char && char<="9") || "."==char || ","==char);
				i++;
			}
		}
	}
	return b;
}

function utf8_encode(cad) {
	var newcad = '';
	for (var i=0; i<cad.length; i++)
		newcad += String.fromCharCode(cad.charCodeAt(i));
	return newcad;
}

// Devuelve true si el $Texto esta formado por caracteres alfabeticos 
//mayusculas y minusculas (A..Z, a..z, las vocales acentuadas)
function SoloAlfabeticos(Texto)
{
//	Texto = utf8_encode(Texto);
	var i = 0;
	var b = 1;
	var char;
	while (i<Texto.length)
	{
		char = Texto.substr(i, 1);
		if (b==1 && ((char!=" ") &&
			 (char!="_") &&
			 ("a">char || char>"z") &&
			 ("A">char || char>"Z") &&
			 (char!=String.fromCharCode(225)) &&  // 
			 (char!=String.fromCharCode(233)) &&  // 
			 (char!=String.fromCharCode(237)) &&  // 
			 (char!=String.fromCharCode(243)) &&  // 
			 (char!=String.fromCharCode(250)) &&  // 
			 (char!=String.fromCharCode(252)) &&  // 
			 (char!=String.fromCharCode(193)) &&  // 
			 (char!=String.fromCharCode(201)) &&  // 
			 (char!=String.fromCharCode(205)) &&  // 
			 (char!=String.fromCharCode(211)) &&  // 
			 (char!=String.fromCharCode(218)) &&  // 
			 (char!=String.fromCharCode(241)) &&  // 
			 (char!=String.fromCharCode(209))))   // 
			b = 0;
		i++;
	}
	return (b==1);
}

function SoloMayusculas(Texto)
{
	var b = true;
	var i = 0;
	while (b && i<Texto.length)
	{
		char = Texto.substr(i, 1);
		b = b && 
		     ("A"<=char && char<="Z");
		i++;
	}
	return b;
}

// Devuelve true si el $Texto esta formado por caracteres alfabeticos 
//mayusculas (A..Z), caracteres numericos (0..9), 
function NumeroIdentidad(Texto)
{
	if (Texto=='campo_vaciado')
	{
			b = true;
	}
	else
	{
		var b = true;
		var i = 0;
		var char;
		while (b && i<Texto.length)
		{
			char = Texto.substr(i, 1);
			b = b && 
				(("0"<=char && char<="9") || 
				 ("A"<=char && char<="Z") ||
				 (char=="-") ||
				 (char=="/"));
			i++;
		}
	}
	return b;
}

// Devuelve true si el $Texto esta formado por caracteres alfabeticos 
// minusculas (a..z), caracteres numericos (0..9), 
// no se admiten caracteres especiales.
function LetrasMinDigitos(Texto)
{
	var b = true;
	var i = 0;
	var char;
	while (b && i<Texto.length)
	{
		char = Texto.substr(i, 1);
		b = b && 
		    (("0"<=char && char<="9") || 
			 ("a"<=char && char<="z"));
		i++;
	}
	return b;
}

// Devuelve true si el $Texto esta formado por caracteres alfabeticos 
// en mayusculas (A..Z), caracteres numericos (0..9), 
// no se admiten caracteres especiales.
function LetrasMayDigitos(Texto)
{
	var b = true;
	var i = 0;
	var char;
	while (b && i<Texto.length)
	{
		char = Texto.substr(i, 1);
		b = b && 
		    (("0"<=char && char<="9") || 
			 ("A"<=char && char<="Z"));
		i++;
	}
	return b;
}

function LetrasMayMinDigitos(Texto)
{
	var b = true;
	var i = 0;
	var char;
	while (b && i<Texto.length)
	{
		char = Texto.substr(i, 1);
		b = b && 
		    (("a"<=char && char<="z") ||
			 ("0"<=char && char<="9") || 
			 ("A"<=char && char<="Z"));
		i++;
	}
	return b;
}

function CaracteresUrl(Texto)
{
	var b = true;
	i = 0;
	while (b && i<=Texto.length-1)
	{
		var char = Texto.substr(i, 1);
		b = b && 
				(("a"<=char && char<="z") ||
				 ("0"<=char && char<="9") || 
				 ("A"<=char && char<="Z") ||
				 char=='.' ||
				 char=='-' ||
				 char=='_');
		i++;
	}
	return b;
}

function Url(Texto)
{
	if (Texto=='campo_vaciado')
	{
			b = true;
	}
	else
	{
		if (Texto.substring(0, 7)=='http://')
			Texto = Texto.substring(7, Texto.length-1);
		var Lista = Texto.split('/');
		Texto = Lista[0];
		var Lista = Texto.split('.');
		var b = Lista.length>1;
		for (var i=0; i<Lista.length; i++)
		{
			b = b && CaracteresUrl(Lista[i]);
			if (!b)
				break;
		}
	}
	return b;
}

function Email(Texto)
{
	if (Texto=='campo_vaciado')
	{
			b = true;
	}
	else
	{
		var Lista = Texto.split('@');
		var b = Lista.length>=2 && Lista[1].length>=2;
		if (b) {
			for (var i=0; i<Lista[1].length; i++) {
				var char = Lista[1].substr(i, 1);
				b = b && 
						(("a"<=char && char<="z") ||
						 ("0"<=char && char<="9") || 
						 ("A"<=char && char<="Z") ||
						 char=='.' ||
						 char=='-' ||
						 char=='_');
				if (!b)
					break;
			}
			for (i=0; i<Lista[0].length; i++)
			{
				var char = Lista[0].substr(i, 1);
				b = b && 
						(("a"<=char && char<="z") ||
						 ("0"<=char && char<="9") || 
						 ("A"<=char && char<="Z") ||
						 char=='.' ||
						 char=='-' ||
						 char==' ');
				if (!b)
					break;
			}
		}
	}
	return b;
}

function DireccionIP(Texto)
{
	if (Texto=='campo_vaciado')
	{
			b = true;
	}
	else
	{
		var Lista = Texto.split('.');
		b = Lista.length==4;
		for (i=0; i<Lista.length; i++)
		{
			b = b && SoloDigitos(Lista[i]) && Lista[i].length<=3;
			if (!b)
				break;
		}
	}
	return b;
}

function NumeroIdentidad(Texto)
{
	if (Texto=='campo_vaciado')
	{
			b = true;
	}
	else
	{
		var b = true;
		var i = 0;
		while (b && i<Texto.length)
		{
			var char = Texto.substr(i, 1);
			b = b && 
				(("0"<=char && char<="9") || 
				 ("A"<=char && char<="Z") ||
				 (char=="-") ||
				 (char=="/"));
			i++;
		}
	}
	return b;
}

