//////////////////////////////////////////////////////////////////////Función de búsqueda
//////////////////////////////////////////////////////////////////////de variables globales:
//Busca una variable dada en todos los frames superiores
function BuscaGlobal(variable){
	return(eval('window.top.'+variable));
}

function PonGlobal(variable,valor){
	eval('window.top.'+variable+'="'+valor+'";');
}

//////////////////////////////////////////////////////////////////////de parámetros:

//Variables globales, favor de no volver a usar estos nombres:

//Variable de control para evitar que se envíe más de una vez una misma petición
var forma_enviada=false;

//Ubicación de la página actual
var ubicacion=""+this.location.href;

//Nombre de la aplicación (Para los cookies)
var Aplica=ubicacion;
for(i=1;i<=3;i++)
	Aplica=Aplica.substring(Aplica.indexOf('/',0) + 1,Aplica.length);
Aplica="/"+ Aplica.substring(0,Aplica.indexOf('/',0));

//Parámetros GET que se le pasan
if(ubicacion.indexOf('?',0)>0)
	var parametros=ubicacion.substring(ubicacion.indexOf('?',0) + 1,ubicacion.length);
else
	var parametros='';

//Función que busca un parámetro dado de la lista de parámetros GET
function busca(parametro){
	lista_par='&'+parametros;

	var inicio=lista_par.indexOf('&'+parametro,0);
	if(inicio==-1)
		return "";
	inicio=lista_par.indexOf('=',inicio)+1;
	if(inicio==-1)
		return "";
	var fin=lista_par.indexOf('&',inicio);
	if(fin==-1)
		fin=lista_par.length;

	return unescape(Substituye(lista_par.substring(inicio,fin),"+"," "));
}

//Función que borra un parámetro dado de la lista de parámetros GET
function borra_parametro(param){
	var viej_valor=busca(param);
	var a_borrar=param+'='+viej_valor;

	var pos_1=parametros.indexOf(a_borrar,0);
	var pos_2=pos_1+a_borrar.length;

	if(parametros.charAt(pos_1-1)=='&')
		pos_1--;
	else if(parametros.charAt(pos_2)=='&')
		pos_2++;

	var nvo_parametros=parametros.substring(0,pos_1)+
		parametros.substring(pos_2,parametros.length);

	parametros=nvo_parametros;
}

//Función que completa los datos de la forma dada en base a los parámetros GET
function leeParamGet(forma){
	for(var i=0;i<forma.length;i++){
		var tipo=forma.elements[i].type;
		var nombre=forma.elements[i].name;
		if(tipo=='text' || tipo=='password' || tipo=='select-one')
			forma.elements[i].value=busca(nombre);
	}
}

///////////////////////////////////////////////////////////////////Función para barra
///////////////////////////////////////////////////////////////////de estado
function B_Espera(texto){
	RepEstado(texto,"barra_espera");
}

function B_Alarma(texto){
	RepEstado(texto,"barra_error");
}

function B_Aviso1(texto){
	RepEstado(texto,"barra_mensaje");
}

function B_Aviso2(texto){
	RepEstado(texto,"barra_aviso2");
}

function B_Limpia(){
	RepEstado('',"barra_mensaje");
}

function RepEstado(texto,estilo){
	var aviso = '<table cellspacing="0" cellpadding="5" border="0">';
	aviso += '<tr><td class='+estilo+'>'+texto+'</td></tr></table>';

	var division=document.getElementById('aviso_sistema_interno');
	if(division!=null){
		division.innerHTML=aviso;
		return;
	}
	division=document.getElementById('aviso_sistema');
	if(division!=null){
		division.innerHTML=aviso;
		return;
	}
	if(texto!=""){
		re = new RegExp("(<ul>)*(<li>)*(</ul>)*(</li>)*", "gi");
		alert(texto.replace(re,""));
	}
}

//////////////////////////////////////////////////////////////////////Funciones de cadenas:
//Separa una cadena usando el separador dado,
//la opción indica que parte de la cadena se requiere 0:izquierda, 1:derecha
function separa(cadena,separador,opcion){
	pos=cadena.indexOf(separador,0);
	if(pos==-1){
		if(opcion==0) return cadena;
		return '';
	}
	salida=cadena.substring(0,pos);
	cadena=cadena.substring(pos+separador.length,cadena.length);
	if(opcion==0) return salida;
	return cadena;
}

// Verifica si una cadena contiene un caracter dado
function Contiene(caracter,cadena) {
	for(var i=0;i<cadena.length;i++)
		if(cadena.substring(i,i+1)==caracter)
			return true;
	return false;
}

//Busca dentro de una cadena una subcadena dada y substitúyela por otra
function Substituye(original,cadBusca,cadSubs){
	var inicio=0;
	var cadena="";
	var cadOrig=original;

	while(true){
		inicio=cadOrig.indexOf(cadBusca,0);
		if(inicio==-1){
			cadena+=cadOrig;
			break;
		}
		cadena+=cadOrig.substring(0,inicio)+cadSubs;
		cadOrig=cadOrig.substring(inicio+cadBusca.length);
	}

	return cadena;
}

//Genera n espacios en blanco
function espacios(n){
	var cadena='';
	for(var i=0;i<=n;i++)
		cadena+='&nbsp;';
	return cadena;
}

function sumaDigitos(numero){
	var suma=0;
	numero=numero+'';
	for (var i=0;i<numero.length;i++) {
		suma+=parseInt(numero.substring(i,i+1));
	}
	return suma;
}

//Sustituye los "enters" por "<br>"
function agregaBR(cadena){
	return Substituye(Substituye(cadena,'<','&lt;'),'\n','<br>\n');
}

//////////////////////////////////////////////////////////////////////Funciones numéricas:

// Esta función verifica si un número se encuentra en un rango dado
function Rango(numero,min,max,tipo) {
	if(numero < min || numero > max) {
		if(tipo=='entero')
			B_Alarma("Debe capturar un número sin decimales entre " + min + " y " + max);
		else
			B_Alarma("Debe capturar un número con decimales entre " + min + " y " + max);

		return false;
	}
	return true;
}

// Verifica si una cadena es un número entero o real
function EsNumero(cadena,real) {
	var caracter;

	//Checa si es NaN
	if(isNaN(cadena))
		return false;

	//Checa que haya capturado algo
	if(cadena.length==0)
		return false;

	//Checa que no haya capturado solo un "-" o un "."
	if(cadena.length==1){
		if(cadena=="-" || cadena==".")
			return false;
	}

	// Se recorrerá la cadena completa
	for(i=0;i<cadena.length;i++){
		// Se analiza caracter por caracter
		caracter=cadena.substring(i,i+1);

		//¿Es el signo de número negativo?
		if(caracter=='-' && i==0)
			continue;

		//¿Es un punto decimal permisible?
		if(caracter=="." && real){
			real=false; // Ya no aceptes más puntos
			continue;
		}

		// ¿El caracter no es un dígito?
		if(caracter<"0" || caracter>"9")
			return false;
	}
	//Es un número válido
	return true;
}

// Redondea un número
function Redondea(numero,digitos){
	return Math.round(numero*Math.pow(10,digitos))/Math.pow(10,digitos);
}

/////////////////////////////////////////////////////////////////////////Funciones de objetos:

//Despliega los nombres de los campos de las formas que estén en la página
function Nombrar_Campos(){
	for(i=0;i<document.forms.length;i++){
		var forma=document.forms[i];
		for(j=0;j<forma.length;j++)
		alert(forma.name+"-"+document.forms[i].elements[j].name);
	}
}

//Esta función obtiene las propiedades del objeto que le pase como parámetro
function leePropiedades(obj,obj_name){
	var result="";
	for(i in obj)
		result += obj_name + "." + i + "=" + obj[i] + "\n";

	return result;
}

//Esta función muestra las propiedades del objeto que le pase como parámetro
function muestraPropiedades(obj){

	var resultado=leePropiedades(obj,obj.name);

	document.writeln("<PRE>\n");
	document.writeln(resultado);
	document.writeln("</PRE>\n");
	document.close();
}

//Verifica si una forma dada existe en el documento
function existeForma(nombreForma){
	for(var i=0;i<document.forms.length;i++)
		if(nombreForma==document.forms[i].name)
			return true;
	return false;
}

////////////////////////////////////////////////////////////////////////Funciones de galletas:
//Guarda una cookie por un número de segundos determinado, si es cero
//la guarda hasta el final de la sesión
function Setcookie(name,value,duracion){
	var argv = Setcookie.arguments;
	var argc = Setcookie.arguments.length;
	if (duracion != 0){
		var exp = new Date();
		exp.setTime(exp.getTime()+duracion*1000);
	}else var exp=null;
	var path = (argc > 3) ? argv[3] : null;
	var domain = (argc > 4) ? argv[4] : null;
	var secure = (argc > 5) ? argv[5] : false;

	document.cookie = name + "=" + escape(value) +
		((exp==null) ? "" : (";expires=" +
		exp.toGMTString())) +
		((path == null) ? "" : ("; path=" + path)) +
		((domain == null) ? "" : ("; domain=" + domain)) +
		((secure == true) ? "; secure" : "");
}

//Función auxiliar de GetCookie
function getcookieVal(offset){
	var endstr = document.cookie.indexOf(";",offset);
	if (endstr == -1)
		endstr = document.cookie.length;
	return unescape(document.cookie.substring(offset,endstr));
}

//Lee una cookie
function Getcookie(name){
	var arg = name + "=";
	var alen = arg.length;
	var clen = document.cookie.length;
	var i = 0;

	while(i < clen){
		var j = i + alen;

		if (document.cookie.substring(i,j) == arg)
			return getcookieVal(j);
		i = document.cookie.indexOf(" ",i) + 1;

		if(i == 0) break;
	}
	return null;
}

//Borra una cookie
function Deletecookie(name,ruta,dominio){
	Setcookie(name,"",-1,ruta,dominio);
}

///////////////////////////////////////////////////////////////////////Funciones de forma:

//Almacena en un cookie el valor del campo de una forma por un número determinado de dias
function Almacena(forma,campo,dias,ruta,dominio){
	var nombre=forma.name+'-'+campo.name;
	var valor=campo.value;
	if(valor!="" && valor!="%")
		Setcookie(nombre,valor,dias*60*60*24,ruta,dominio);
	else
		Deletecookie(nombre,ruta,dominio);
}

//Busca todos los campos de todas las formas en las cookies
function Leer_Valores(){
	for(var i=0;i<document.forms.length;i++){
		var forma=document.forms[i];
		for(var j=0;j<forma.length;j++){
			var obj=document.forms[i].elements[j];
			if(obj.name!=""){
				var tipo=obj.type;
				if(( tipo=="text" || tipo=="password" ||
					tipo=="select-one")){
					var nombre=forma.name+'-'+obj.name;
					valor=Getcookie(nombre);
					if(valor!=null)
						obj.value=valor;
				}
			}
		}
	}
}

//Borra las cookies de los campos de una forma dada
function Borrar_Valores(forma){
	for(j=0;j<forma.length;j++){
		var obj=forma.elements[j];
		var nombre=forma.name+'-'+obj.name;
		Deletecookie(nombre,Aplica);
	}
}


//Verifica todas las validaciones
function valida_todo(form){
	if(form.name!='f_busca' && forma_enviada)
		if(!confirm('Los datos ya han sido enviados, ¿quiere volverlos a enviar?')) return false;

	for(j=0;j<form.length;j++){
		var obj=form.elements[j];
		if(obj.name.length>0 && (obj.type=='text' ||
					obj.type=='textarea' ||
					obj.type=='password')){
			var funcion=null;
			eval('funcion='+'tag_'+form.name+'_'+obj.name);
			if(!eval(funcion)){
				obj.focus();
				obj.select();
				return false;
			}
		}
	}

	forma_enviada = true;
	return true;
}

//Valida la entrada de un campo de una forma
function valida(forma,campo,tipo,nulo,min,max,nombreCampo){

	if(!(tipo=='cadena' || tipo=='fecha' || tipo=='real' ||
		tipo=='entero' || tipo=='hora' || tipo=='moneda' || tipo=='moneda_ext' ||
		tipo=='cadnum' || tipo=='email' || tipo=='imss')){
		B_Alarma("No reconozco el tipo " + tipo);
		return false;
	}

	//El usuario no capturó nada ¿es válido?
	if(campo.value.length==0)
		if(nulo){
			return true;
		}else{
			if(nombreCampo!=null && nombreCampo!='')
				B_Alarma("El campo "+nombreCampo+" es requerido");
			else if(tipo=='cadena')
				B_Alarma("Debe capturar un texto");
			else if(tipo=='fecha')
				B_Alarma("Debe capturar una fecha");
			else if(tipo=='real')
				B_Alarma("Debe capturar un número con decimales");
			else if(tipo=='entero')
				B_Alarma("Debe capturar un número sin decimales");
			else if(tipo=='moneda' || tipo=='moneda_ext')
				B_Alarma("Debe capturar una cantidad monetaria");
			else if(tipo=='cadnum')
				B_Alarma("Debe capturar un número");
			else
				B_Alarma("Debe capturar un " + tipo);
			return false;
		}

	//¿Se debe capturar un número?
	if(tipo=="real" || tipo=="entero"){
		//Verifica si capturó un número real válido
		if(tipo=="real")
			if(!EsNumero(campo.value,true)){
				B_Alarma("El valor del campo "+nombreCampo+" no coincide con el tipo de datos solicitado. Debe capturar un número con decimales");
				return false;
			}

		//Verifica si capturó un número entero válido
		if(tipo=="entero")
			if(!EsNumero(campo.value,false)){
				B_Alarma("El valor del campo "+nombreCampo+" no coincide con el tipo de datos solicitado. Debe capturar un número sin decimales");
				return false;
			}

		var convertido=eval(campo.value);

		//¿Tiene que estar dentro de un rango?
		if(min==0 && max==0 || min==null && max==null)
			campo.value=convertido;
		else
			//Verifica si está dentro del rango permisible
			if (Rango(convertido,min,max,tipo))
				campo.value=convertido;
			else{
				return false;
			}
	}

	//¿Se debe capturar una fecha?
	if(tipo=="fecha"){

		//Cambia los '-' por '/'
		campo.value=Substituye(campo.value,'-','/')
		//Cambia los '.' por '/'
		campo.value=Substituye(campo.value,'.','/')

		var leap = false;
		var pos_sep_1=campo.value.indexOf('/',0);
		if(pos_sep_1<=0){
			B_Alarma("Falta el primer separador '/'");
			return false;
		}

		var dias=campo.value.substring(0,pos_sep_1);
		if (!EsNumero(dias,false) || !Rango(dias,1,31,'entero')){
			B_Alarma("Recuerde que el dia debe ser de 1 a 31");
			return false;
		}
		var pos_sep_2=campo.value.indexOf('/',pos_sep_1+1);
		if(pos_sep_2<=0){
			B_Alarma("Falta el segundo separador '/'");
			return false;
		}
		var meses=campo.value.substring(pos_sep_1+1,pos_sep_2);
		if (!EsNumero(meses,false) || !Rango(meses,1,12,'entero')){
			B_Alarma("Recuerde que el mes debe ser de 1 a 12");
			return false;
		}
		var anios=campo.value.substring(pos_sep_2+1);
		if (!EsNumero(anios,false) || !Rango(anios,1930,2020,'entero')){
			B_Alarma("Recuerde que el año debe estar entre 1930 y 2020");
			return false;
		}
		/* Validation leap-year / february / day */
		if ((anios % 4 == 0) || (anios % 100 == 0) || (anios % 400 == 0)) {
			leap = true;
		}
		if ((meses == 2) && (leap) && (dias > 29)){
			B_Alarma("Recuerde que febrero solo tiene 29 dias, "+anios+" es bisiesto");
			return false;
		}
		if ((meses == 2) && (!leap) && (dias > 28)){
			B_Alarma("Recuerde que febrero solo tiene 28 dias, "+anios+" no es bisiesto");
			return false;
		}

		/* Validation of other months */
		if ((dias > 30) && ((meses == 4) || (meses == 6) || (meses == 9) ||
		(meses == 11))){
			B_Alarma("Recuerde que este mes solo tiene 30 dias");
			return false;
		}

		//¿Tiene un límite inferior?
		if(!(min==0 || min==null)){
			if(comparaFechas(min,campo.value)==-1){
				B_Alarma("No puede capturar una fecha anterior al "+min);
				return false;
			}
		}

		//¿Tiene un límite superior?
		if(!(max==0 || max==null)){
			if(comparaFechas(campo.value,max)==-1){
				B_Alarma("No puede capturar una fecha posterior al "+max);
				return false;
			}
		}
	}

	//¿Se debe capturar una hora?
	if(tipo=="hora"){
		var pos_sep=campo.value.indexOf(':',0);
		if(pos_sep<=0){
			B_Alarma("Falta el separador ':'");
			return false;
		}
		var horas=campo.value.substring(0,pos_sep);
		if (!EsNumero(horas,false) || !Rango(horas,0,23,'entero')){
			B_Alarma("Recuerde que la hora puede ser de 0 a 23");
			return false;
		}
		var minutos=campo.value.substring(pos_sep+1);
		if (!EsNumero(minutos,false) || !Rango(minutos,0,59,'entero')){
			B_Alarma("Recuerde que los minutos pueden ser de 0 a 59");
			return false;
		}

		//¿Tiene un límite inferior?
		if(!(min==0 || min==null)){
			if(hora_decimal(min)>hora_decimal(campo.value)){
				B_Alarma("No puede capturar una hora anterior a "+min);
				return false;
			}
		}

		//¿Tiene un límite superior?
		if(!(max==0 || max==null)){
			if(hora_decimal(max)<hora_decimal(campo.value)){
				B_Alarma("No puede capturar una hora posterior al "+max);
				return false;
			}
		}
	}

	//¿Se debe capturar una cifra monetaria?
	if(tipo=="moneda"){
		var valor_real=conv_Real(campo.value);
		if(!EsNumero(valor_real,true)){
			B_Alarma("El valor del campo "+nombreCampo+" no coincide con el tipo de datos solicitado. Debe capturar una cantidad monetaria");
			return false;
		}
		//Verifica si tiene un "máximo"
		if(max!=null && valor_real>Redondea(max,2)){
			B_Alarma("El valor del campo "+nombreCampo+" no puede ser mayor a "+conv_Moneda(max));
			return false;
		}
		//Verifica si tiene un "mínimo"
		if(min!=null && valor_real<Redondea(min,2)){
			B_Alarma("El valor del campo "+nombreCampo+" no puede ser menor a "+conv_Moneda(min));
			return false;
		}
		campo.value=conv_Moneda(valor_real);
	}

	//¿Se debe capturar una cifra monetaria extendida (4 decimales)?
	if(tipo=="moneda_ext"){
		var valor_real=conv_Real_ext(campo.value);
		if(!EsNumero(valor_real,true)){
			B_Alarma("El valor del campo "+nombreCampo+" no coincide con el tipo de datos solicitado. Debe capturar una cantidad monetaria");
			return false;
		}
		//Verifica si tiene un "máximo"
		if(max!=null && valor_real>Redondea(max,4)){
			B_Alarma("El valor del campo "+nombreCampo+" no puede ser mayor a "+conv_Moneda_ext(max));
			return false;
		}
		//Verifica si tiene un "mínimo"
		if(min!=null && valor_real<Redondea(min,4)){
			B_Alarma("El valor del campo "+nombreCampo+" no puede ser menor a "+conv_Moneda_ext(min));
			return false;
		}
		campo.value=conv_Moneda_ext(valor_real);
	}

	//¿Se debe capturar una cadena?
	if(tipo=="cadena"){
		//Verifica si tiene un "máximo" de caracteres
		if(max>0 && campo.value.length>max){
			B_Alarma("El valor del campo "+nombreCampo+" no puede tener más de "+max+" caracteres");
			return false;
		}
		//Verifica si tiene un "mínimo" de caracteres
		if(min>0 && campo.value.length<min){
			B_Alarma("El valor del campo "+nombreCampo+" no puede tener menos de "+min+" caracteres");
			return false;
		}
	}

	//¿Se debe capturar una cadena numérica?
	if(tipo=="cadnum"){
		//Verifica si tiene un "máximo" de caracteres
		if(max>0 && campo.value.length>max){
			B_Alarma("El valor del campo "+nombreCampo+" no puede tener más de "+max+" dígitos");
			return false;
		}
		//Verifica si tiene un "mínimo" de caracteres
		if(min>0 && campo.value.length<min){
			B_Alarma("El valor del campo "+nombreCampo+" no puede tener menos de "+min+" dígitos");
			return false;
		}
		//Revisa cada caracter capturado para estar seguros de que son dígitos
		for(i=0;i<campo.value.length;i++)
		if(campo.value.charAt(i)<'0' || campo.value.charAt(i)>'9'){
			B_Alarma("El valor del campo "+nombreCampo+" sólo puede contener dígitos");
			return false;
		}
	}

	//¿Se debe capturar un email?
	if(tipo=="email"){
		var str=campo.value
		var filter=/^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i
		if(!filter.test(str)){
			B_Alarma("El valor del campo "+nombreCampo+" no coincide con el tipo de datos solicitado. Debe capturar un correo electrónico válido");
			return false;
		}
	}

	//¿Se debe capturar una clave del IMSS?
	if(tipo=="imss"){
		var clave=campo.value;
		if(clave.length<11){
			B_Alarma("La clave del IMSS debe tener 11 dígitos");
			return false;
		}
		var dv=0;
		var factor=0;
		for (var i=0;i<10;i++) {
			if(factor==1) factor=2; else factor=1;
			dv+=sumaDigitos(factor*parseInt(clave.substring(i,i+1)));
		}
		if(dv==0){
			B_Alarma("Debe capturar la clave del IMSS");
			return false;
		}
		dv=Math.ceil(dv/10)*10-dv;
		if(dv!=clave.substring(10,11)){
			B_Alarma("La clave IMSS no es válida");
			return false;
		}
	}

	return true;
}

function rechazaEnvio(mensaje){
	forma_enviada = false;
	cursor_normal();
	B_Aviso1(mensaje);
}

//////////////////////////////////////////////////////Función para determinar el ancho y el alto de una ventana
function anchoVentana(){
	if (parseInt(navigator.appVersion)>3) {
		if (navigator.appName=="Netscape")
			return window.innerWidth;
		if (navigator.appName.indexOf("Microsoft")!=-1)
			return document.body.offsetWidth;
	}
	return 0;
}

function altoVentana(){
	if (parseInt(navigator.appVersion)>3) {
		if (navigator.appName=="Netscape")
			return winH = window.innerHeight;
		if (navigator.appName.indexOf("Microsoft")!=-1)
			return document.body.offsetHeight;
	}
	return 0;
}

/////////////////////////////////////////////////////////Funciones para el manejo de cantidades
/////////////////////////////////////////////////////////monetarias
//Convierte un valor numérico a una cadena de valor monetario
function conv_Moneda(valor){
	if(valor.length==0) return '';
	if(isNaN(valor)) return('');
	if(valor==0) return('$ 0.00');
	if(valor<0) var resultado='$ -'; else var resultado='$ ';
	valor=Math.abs(valor);

	var temp=''+Math.round(valor*100);
	var longi=temp.length-2;

	if(longi%3>0){
		resultado+=temp.substring(0,longi%3);
		if(Math.floor(longi/3)>0) resultado+=',';
		temp=temp.substring(longi%3);
	}
	for(var i=Math.floor(longi/3);i>=1;i--){
		resultado+=temp.substring(0,3);
		if(i>1) resultado+=',';
		temp=temp.substring(3);
	}
	if(longi==-1) resultado+='0.0'+temp;
	else if(longi==0) resultado+='0.'+temp;
	else resultado+='.'+temp;

	return(resultado);
}

function conv_Real(valor){
	if(valor.length==0) return '';
	if(EsNumero(valor,true)) return parseFloat(valor);
	var resultado=valor;

	while(true){
		var pos=resultado.indexOf('$',0);
		if(pos<0) break;
		resultado=resultado.substring(pos+1);
	}
	while(true){
		var pos=resultado.indexOf(',',0);
		if(pos<0) break;
		resultado=resultado.substring(0,pos)+''+resultado.substring(pos+1);
	}

	return(Redondea(parseFloat(resultado),2));
}

//Convierte un valor numérico a una cadena de valor monetario extendido
function conv_Moneda_ext(valor){
	if(isNaN(valor)) return('');
	if(valor==0) return('$ 0.0000');
	if(valor<0) var resultado='$ -'; else var resultado='$ ';
	valor=Math.abs(valor);

	var temp=''+Math.round(valor*10000);
	var longi=temp.length-4;

	if(longi%3>0){
		resultado+=temp.substring(0,longi%3);
		if(Math.floor(longi/3)>0) resultado+=',';
		temp=temp.substring(longi%3);
	}
	for(var i=Math.floor(longi/3);i>=1;i--){
		resultado+=temp.substring(0,3);
		if(i>1) resultado+=',';
		temp=temp.substring(3);
	}
	if(longi==-3) resultado+='0.000'+temp;
	else if(longi==-2) resultado+='0.00'+temp;
	else if(longi==-1) resultado+='0.0'+temp;
	else if(longi==0) resultado+='0.'+temp;
	else resultado+='.'+temp;

	return(resultado);
}

function conv_Real_ext(valor){
	if(valor.length==0) return 0;
	if(EsNumero(valor,true)) return parseFloat(valor);
	var resultado=valor;

	while(true){
		var pos=resultado.indexOf('$',0);
		if(pos<0) break;
		resultado=resultado.substring(pos+1);
	}
	while(true){
		var pos=resultado.indexOf(',',0);
		if(pos<0) break;
		resultado=resultado.substring(0,pos)+''+resultado.substring(pos+1);
	}

	return(Redondea(parseFloat(resultado),4));
}

////////////////////////////////////////////Función para deshabilitar menú contextual
//Disable right mouse click Script
//By Maximus (maximus@nsimail.com) w/ mods by DynamicDrive
//For full source code, visit http://www.dynamicdrive.com

///////////////////////////////////
function clickIE4(){
	if (event.button==2){
	return false;
	}
}

function clickNS4(e){
	if (document.layers||document.getElementById&&!document.all){
		if (e.which==2||e.which==3){
			return false;
		}
	}
}

if (document.layers){
	document.captureEvents(Event.MOUSEDOWN);
	document.onmousedown=clickNS4;
}
else if (document.all&&!document.getElementById){
	document.onmousedown=clickIE4;
}

//document.oncontextmenu=new Function("return false");

// Genera popups //////////////////////////////////////////
function popup(doc,nombre,width,height){
	var w,h,win;	
	w = (screen.availWidth -  width) / 2;
	h = (screen.availHeight - height) / 2;	
	win = window.open(doc, nombre, 'menubar=no,location=no,resizable=yes,toolbar=no,status=no,width='+width+',height='+height+',top='+h+',left='+w+',screenX='+w+',screenY='+h);
	win.focus();
}

//Confirmación para abandonar la pantalla
function confExit(){
	return !confirm("No se guardaron los cambios. ¿Desea regresar a la pantalla?");
}

//Pon el foco en la primer caja de captura de la pantalla

////Funciones para poner el foco a un campo de la forma////////////////////////////
function setFocus(i) {
	i.blur();
	i.focus();
	i.select();
}

function setFocusInit(){
	var all = document.getElementsByTagName("input");
	for(i=0;i<all.length;i++){
		if(all[i].type=="hidden" || all[i].style.visibility=="hidden") continue;
		setFocus(all[i]);
		return;
	}
}

setFocusInit();

//Función para eliminar espacios laterales
function trim(cadena){
	var ltrim = /^\s*/;
	var rtrim = /\s*$/;
	cadena = cadena.replace(ltrim, "");
	cadena = cadena.replace(rtrim, "");
	return cadena;
}

//Función de verificación de fechas////////////////////////////////////////////
function validaFechaHora(fechaHora){
	var fecha = fechaHora.substring(0,fechaHora.indexOf(' '));
	var hora = fechaHora.substring(fechaHora.indexOf(' ')+1);
	if(!validaFecha(fecha)) return false;
	if(!validaHora(hora)) return false;
	return true;
}
function validaHora(hora){
	var horas=hora.substring(0,hora.indexOf(':',0));
	if (!EsNumero(horas,false) || !Rango(horas,0,23,'entero')){
		B_Alarma("Recuerde que la hora debe ser de 0 a 23");
		return false;
	}
	var minutos=hora.substring(hora.indexOf(':',0)+1);
	if (!EsNumero(minutos,false) || !Rango(minutos,0,59,'entero')){
		B_Alarma("Recuerde que los minutos deben ser de 0 a 59");
		return false;
	}
	return true;
}
function validaFecha(fecha){
	var leap = false;
	var pos_sep_1=fecha.indexOf('/',0);
	if(pos_sep_1<=0){
		B_Alarma("Falta el primer separador '/'");
		return false;
	}
	var dias=fecha.substring(0,pos_sep_1);
	if (!EsNumero(dias,false) || !Rango(dias,1,31,'entero')){
		B_Alarma("Recuerde que el dia debe ser de 1 a 31");
		return false;
	}
	var pos_sep_2=fecha.indexOf('/',pos_sep_1+1);
	if(pos_sep_2<=0){
		B_Alarma("Falta el segundo separador '/'");
		return false;
	}
	var meses=fecha.substring(pos_sep_1+1,pos_sep_2);
	if (!EsNumero(meses,false) || !Rango(meses,1,12,'entero')){
		B_Alarma("Recuerde que el mes debe ser de 1 a 12");
		return false;
	}
	var anios=fecha.substring(pos_sep_2+1);
	if (!EsNumero(anios,false) || !Rango(anios,0000,9999,'entero')){
		B_Alarma("Recuerde que el año debe estar entre el 0000 y el 9999");
		return false;
	}
	/* Validation leap-year / february / day */
	if ((anios % 4 == 0) || (anios % 100 == 0) || (anios % 400 == 0)) {
		leap = true;
	}
	if ((meses == 2) && (leap) && (dias > 29)){
		B_Alarma("Recuerde que febrero solo tiene 29 dias, "+anios+" es bisiesto");
		return false;
	}
	if ((meses == 2) && (!leap) && (dias > 28)){
		B_Alarma("Recuerde que febrero solo tiene 28 dias, "+anios+" no es bisiesto");
		return false;
	}
	/* Validation of other months */
	if ((dias > 30) && ((meses == 4) || (meses == 6) || (meses == 9) ||
		(meses == 11))){
		B_Alarma("Recuerde que este mes solo tiene 30 dias");
		return false;
	}
	return true;
}

//////////////////////////////////////////////////////////Funciones para el desplegado del cursor
function pon_cursor(frame,cursor){
	if(frame.document.body!=null)
		frame.document.body.style.cursor=cursor;
}

function itera_cursor(frame,cursor,i){
	pon_cursor(frame,cursor);
	if(frame.document.frames.length==0) return;
	for(i=0;i<frame.document.frames.length;i++){
		itera_cursor(frame.document.frames[i],cursor,i+1);
	}
}

function cursor_reloj(){
	if(document.body!=null)
		document.body.style.cursor="wait";
	itera_cursor(window.top,"wait",1);
}

function cursor_normal(){
	if(document.body!=null)
		document.body.style.cursor="default";
	itera_cursor(window.top,"default",1);
}

//////////////////////////////////////////////////////////Funciones para el manejo de fechas
/*Esta función solo funciona para fechas posteriores al 1 de enero de 1970*/
function fecha_date(fecha){
	var pos_sep_1=fecha.indexOf('/',0);
	var dia=fecha.substring(0,pos_sep_1);
	var pos_sep_2=fecha.indexOf('/',pos_sep_1+1);
	var mes=fecha.substring(pos_sep_1+1,pos_sep_2)-1;
	var anio=fecha.substring(pos_sep_2+1);

	return(new Date(anio,mes,dia));
}

/*Suma un número de días arbitrario a una fecha dada*/
function sumaDias(f, n){
	var d=new Date(fecha_date(f).getTime()+n*86400000+3600000);
	return d.getDate()+'/'+(d.getMonth()+1)+'/'+d.getFullYear();
}

/*Regresa una cadena con el formato de fecha seleccionado*/
var NombreMes = new Array('Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio',
                               'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre');
var NombreSemana = new Array('Domingo', 'Lunes', 'Martes', 'Miércoles', 'Jueves', 'Viernes', 'Sábado');
function formateaFechaEspaniol(fecha,formato){
	var d=new Date(fecha_date(fecha).getTime());
	return NombreSemana[d.getDay()]+' '+d.getDate()+' '+NombreMes[d.getMonth()]+' '+d.getFullYear();
}

/*Regresa 1 si fecha1 es menor a fecha2, -1 si es alrevés o 0 si son iguales*/
function comparaFechas(fecha1,fecha2){
	var pos_sep_1=fecha1.indexOf('/',0);
	var dia1=parseInt(fecha1.substring(0,pos_sep_1),10);
	var pos_sep_2=fecha1.indexOf('/',pos_sep_1+1);
	var mes1=parseInt(fecha1.substring(pos_sep_1+1,pos_sep_2)-1,10);
	var anio1=parseInt(fecha1.substring(pos_sep_2+1),10);

	pos_sep_1=fecha2.indexOf('/',0);
	var dia2=parseInt(fecha2.substring(0,pos_sep_1),10);
	pos_sep_2=fecha2.indexOf('/',pos_sep_1+1);
	var mes2=parseInt(fecha2.substring(pos_sep_1+1,pos_sep_2)-1,10);
	var anio2=parseInt(fecha2.substring(pos_sep_2+1),10);

	if(anio1<anio2) return(1);
	if(anio1>anio2) return(-1);

	if(mes1<mes2) return(1);
	if(mes1>mes2) return(-1);

	if(dia1<dia2) return(1);
	if(dia1>dia2) return(-1);

	return(0);
}

//////////////////////////////////////////////////////////Funciones para el manejo de horas
function hora_decimal(hora_sexa){
	var pos_sep=hora_sexa.indexOf(':',0);
	if(pos_sep<=0) return hora_sexa*60.0;
	var horas=hora_sexa.substring(0,pos_sep);
	var minutos=hora_sexa.substring(pos_sep+1);
	return parseInt(horas,10)*60+parseInt(minutos,10);
}

function hora_sexa(hora_dec){
	var horas=Math.floor(hora_dec/60);
	var minutos=Math.floor(hora_dec-horas*60.0);
	if(minutos<10)
		return horas+':0'+minutos
	return horas+':'+minutos
}

//Función para deshabilitar la tecla enter en las formas
function fakeTab() {
	if (window.event.keyCode == 13 && window.event.srcElement.type!="button" &&
		(window.event.srcElement.tagName=="INPUT" ||
		window.event.srcElement.tagName=="SELECT")) {
		window.event.keyCode = 9;
	}
	if(event.ctrlKey && window.event && window.event.keyCode == 78){ // Capture and remap N
		window.event.keyCode = 555;
		return false;
	}
}
//Establece por default el uso del TAB en lugar del ENTER para botones,Input y Select
document.onkeydown = fakeTab;

//Función para convertir lo capturado a mayúsculas
function uppercase(){
  key = window.event.keyCode;
  window.event.keyCode = String.fromCharCode(key).toUpperCase().charCodeAt(0);
}

//Funciones para habilitar/deshabilitar caracteres tecleados
function disableKeyArray(arreglo){
	for(i=0;i<arreglo.length;i++)
		if (window.event.keyCode == arreglo[i].charCodeAt(0)){
			window.event.keyCode = 0;
		}
}

function enableKeyArray(arreglo){
	bandera = true;
	for(i=0;i<arreglo.length;i++)
		if (window.event.keyCode == arreglo[i].charCodeAt(0)){
			bandera = false;
		}
	if(bandera)
		window.event.keyCode = 0;
}

function disableKey(inicio,final){
	if (window.event.keyCode >= inicio.charCodeAt(0) &&
		window.event.keyCode <= final.charCodeAt(0))
		window.event.keyCode = 0;
}

function enableKey(inicio,final){
	if (!(window.event.keyCode >= inicio.charCodeAt(0) &&
		window.event.keyCode <= final.charCodeAt(0)))
		window.event.keyCode = 0;
}

function enableEntero(){
	enableKeyArray(['0','1','2','3','4','5','6','7','8','9','-']);
}

function enableReal(){
	enableKeyArray(['0','1','2','3','4','5','6','7','8','9','-','.']);
}

function enableMoneda(){
	enableKeyArray(['0','1','2','3','4','5','6','7','8','9','-','.',' ','$']);
}

function enableHora(){
	enableKeyArray(['0','1','2','3','4','5','6','7','8','9',':']);
}

/*Convierte una fecha de formato yyyymmdd a dd/mm/yyyy*/
function bigDecimal2Fecha(fecha){
	if(fecha.length!=8) return '';
	var anio=fecha.substring(0,4);
	var mes=fecha.substring(4,6);
	if(mes<10)
		mes=mes.substring(1);
	var dia=fecha.substring(6);
	if(dia<10)
		dia=dia.substring(1);
	return dia+'/'+mes+'/'+anio;
}

/*Convierte una fecha de formato dd/mm/yyyy a yyyymmdd*/
function fecha2BigDecimal(fecha){
	if(fecha==null || fecha.length==0) return '0';
	var pos_sep_1=fecha.indexOf('/',0);
	var dia=fecha.substring(0,pos_sep_1);
	var pos_sep_2=fecha.indexOf('/',pos_sep_1+1);
	var mes=fecha.substring(pos_sep_1+1,pos_sep_2);
	var anio=fecha.substring(pos_sep_2+1);
	if(mes.length<2){
		mes='0'+mes;
	}
	if(dia.length<2){
		dia='0'+dia;
	}
	return anio+''+mes+''+dia;
}

/*Converte una hora de formato hhmmss a hh:mm*/
function bigDecimal2Hora(pHora){
	var hora=new String(pHora);
	for(i=hora.length;i<6;i++) hora='0'+hora;
	hora=hora.substring(0,4);
	hora=hora.substring(0,2)+':'+hora.substring(2,4);
	if(hora.charAt(0)=='0')
		hora=hora.substring(1,5);
	return hora;
}

/*Converte una hora de formato hh:mm a hhmmss*/
function hora2BigDecimal(pHora){
	var hora=new String(pHora);
	for(i=hora.length;i<5;i++) hora='0'+hora;
	hora=hora.substring(0,2)+hora.substring(3,5)+'00';
	return hora;
}
////////////////////////////////////////////////////////////////////////////////Funciones para AJAX

function makeRequest(method,url,data) {
	var http_request = false;
	if (window.XMLHttpRequest) { // Mozilla, Safari,...
		http_request = new XMLHttpRequest();
		if (http_request.overrideMimeType) {
			http_request.overrideMimeType('text/xml');
		}
	} else if (window.ActiveXObject) { // IE
		try {
			http_request = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			try {
				http_request = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e) {}
		}
	}
	if (!http_request) {
		alert('Giving up :( Cannot create an XMLHTTP instance');
		return false;
	}
	http_request.onreadystatechange = function() { recibeAjax(http_request); };
	http_request.open(method, url, true);
	http_request.send(null);
}

function codificaHTML(cadena){
	cadena=Substituye(cadena,'&','&amp');
	cadena=Substituye(cadena,'&','&amp;');
	cadena=Substituye(cadena,'<','&lt;');
	cadena=Substituye(cadena,'>','&gt;');
	cadena=Substituye(cadena,'"','&quot;');
	return escape(cadena);
}
