var cTipoText		= "text";
var cTipoChar		= "char";
var cTipoVarChar	= "varchar";
var cTipoInteger	= "integer";
var cTipoLong		= "long";
var cTipoDouble		= "double";
var cTipoBoolean	= "boolean";
var cTipoDate		= "date";
var cTipoDateCorto	= "datecorto";
var cTipoMes		= "mes";
var cTipoAnio		= "anio";
var cTipoTime		= "time";
var cTipoEmail		= "email";

var xPreviousValue 
xStrPreviousValue = "";
xPreviousValue = new Array()


function fncDecimalCorrecto (cControl,valorCampo,decimales,enteros) 
			{ 
			var cFormName = cControl.form.name;
	        var cControlName = cControl.name;
	        var xControlValue = cControl.value;
			
			 
			var numPosPunto = 0; 
			var strParteEntera = ""; 
			var strParteDecimal = ""; 
			var NUM_DECIMALES = decimales; 
			var NUM_ENTEROS = enteros; 
			
			
			/* Sólo puede teclear el número de decimales indicado en NUM_DECIMALES */ 
			if ((numPosPunto = valorCampo.indexOf(".")) != -1) 
			{ 
			   strParteEntera = valorCampo.substr(0,(numPosPunto)); 
			   strParteDecimal = valorCampo.substr((numPosPunto + 1), valorCampo.length);
			   if ((strParteDecimal.length > (NUM_DECIMALES)) ||  (strParteEntera.length > (NUM_ENTEROS )))
			   { 
			     alert('El formato del numero es incorrecto. Observe el ejemplo a la derecha');
				 fncRestorePrev(cFormName + "." + cControlName ) ;
				 return false;
			   }else{
			     return true
			    } 
		    }else
			{
			
			
			if (valorCampo.length > (NUM_ENTEROS))
			   { 
			   	alert('El formato del numero es incorrecto. Observe el ejemplo a la derecha');
				fncRestorePrev(cFormName + "." + cControlName ) ;
				return false;
			    }else{
			   	  return true
			    }
			}
		}


function fncSavePrev( cControl )
{	var txtTemp
	txtTemp = escape(cControl.value)
	eval( "xPreviousValue[ '" + cControl.form.name + "." + cControl.name +"' ] = '" + txtTemp + "'" );	
}

function fncRestorePrev(cControlname)
{	eval("document." + cControlname + ".value = unescape(xPreviousValue[ '" + cControlname +"' ])");
	eval("document." + cControlname + ".select();");
	eval("document." + cControlname + ".focus();");
}

function fncValidarPassword ( cControl, nMin, nMax, laceptanulos, mensaje ) {
	var cFormName = cControl.form.name;
	var cControlName = cControl.name;
	var xControlValue = cControl.value;

	if (laceptanulos && ( xControlValue == '' || xControlValue == null ) )
		return true;

	if ( xControlValue.length < nMin || xControlValue.length > nMax || xControlValue.indexOf(' ') != -1 ||
		 ( !laceptanulos && ( xControlValue == '' || xControlValue == null ) ) )
	{
		if (!fncValorVacio(mensaje))		
			alert ( mensaje );
		else
			alert("El Password es incorrecto");
		fncRestorePrev(cFormName + "." + cControlName );		
		return false;
	}
	else
		return true

}

function fncValidarEmail( cControl, nLongitud, laceptanulos , mensaje )
{	var cFormName = cControl.form.name;
	var cControlName = cControl.name;
	var xControlValue = cControl.value;
	eval("xStrPreviousValue = unescape(xPreviousValue[ '" + cFormName + "." + cControlName + "' ])");
	if ( !fncValidar( xControlValue, null, laceptanulos , cTipoEmail ,nLongitud, null,null,null ) )
	{	if ( fncValidarEmail.arguments[3] != true)
		if (!fncValorVacio(mensaje))		
			alert ( mensaje );
		else
			alert("El e-mail es incorrecto");		
		fncRestorePrev(cFormName + "." + cControlName ) ;
		return false;
	}
	else
		return true
}

function fncValidarText( cControl, nLongitud, laceptanulos , mensaje )
{	var cFormName = cControl.form.name;
	var cControlName = cControl.name;
	var xControlValue = cControl.value;
	eval("xStrPreviousValue = unescape(xPreviousValue[ '" + cFormName + "." + cControlName + "' ])");
	if ( !fncValidar( xControlValue, null, laceptanulos , cTipoText ,nLongitud, null,null,null ) )
	{	if ( fncValidarText.arguments[3] != true)
			if (!fncValorVacio(mensaje))		
			alert ( mensaje );
		else
			alert("El texto es incorrecto");
		//Trunca el string a la longitud debida
		cControl.value = xControlValue.substr(0, nLongitud);
		cControl.focus();
		//fncRestorePrev(cFormName + "." + cControlName ) ;
		return false;
	}
	else
		return true;
}

function fncValidarString( cControl, nLongitud, laceptanulos , mensaje )
{	var cFormName = cControl.form.name;
	var cControlName = cControl.name;
	var xControlValue = cControl.value;
	eval("xStrPreviousValue = unescape(xPreviousValue[ '" + cFormName + "." + cControlName + "' ])");
	if ( !fncValidar( xControlValue, "b", laceptanulos , cTipoVarChar ,nLongitud, null,null,null ) )
	{	if ( fncValidarString.arguments[3] != true)
			if (!fncValorVacio(mensaje))		
			alert ( mensaje );
		else
			alert("El texto es incorrecto");
		fncRestorePrev(cFormName + "." + cControlName ) ;
		return false;
	}
	else
		return true
}

function fncValidarFecha( cControl, laceptanulos , mensaje )
{	var cFormName = cControl.form.name;
	var cControlName = cControl.name;
	var xControlValue = cControl.value;
	eval("xStrPreviousValue = unescape(xPreviousValue[ '" + cFormName + "." + cControlName + "' ])");
	if ( !fncValidar( xControlValue, "##/##/####", laceptanulos , cTipoDate , 10, null, null ,null ) )
	{	if ( fncValidarFecha.arguments[2] != true)
			if (!fncValorVacio(mensaje))		
			alert ( mensaje );
		else
			alert("La Fecha es incorrecta");
		fncRestorePrev(cFormName + "." + cControlName ) ;
		return false;
	}
	else
		return true;
}

function fncValidarFechaCorta( cControl, laceptanulos , mensaje )
{	var cFormName = cControl.form.name;
	var cControlName = cControl.name;
	var xControlValue = cControl.value;
	eval("xStrPreviousValue = unescape(xPreviousValue[ '" + cFormName + "." + cControlName + "' ])");
	if ( !fncValidar( xControlValue, "##/##", laceptanulos , cTipoDateCorto , 5, null, null ,null ) )
	{	if ( fncValidarFechaCorta.arguments[2] != true)
			if (!fncValorVacio(mensaje))		
			alert ( mensaje );
		else
			alert("La Fecha es incorrecta");
		fncRestorePrev(cFormName + "." + cControlName ) ;
		return false;
	}
	else
		return true;
}

function fncValidarMes( cControl, laceptanulos , mensaje )
{	var cFormName = cControl.form.name;
	var cControlName = cControl.name;
	var xControlValue = cControl.value;
	eval("xStrPreviousValue = unescape(xPreviousValue[ '" + cFormName + "." + cControlName + "' ])");
	if ( !fncValidar( xControlValue, "##", laceptanulos , cTipoMes , 2, null, null ,null ) )
	{	if ( fncValidarMes.arguments[2] != true)
			if (!fncValorVacio(mensaje))		
			alert ( mensaje );
		else
			alert("El Mes es incorrecto");
		fncRestorePrev(cFormName + "." + cControlName ) ;
		return false;
	}
	else
		return true;
}

function fncValidarAnio( cControl, laceptanulos , mensaje )
{	var cFormName = cControl.form.name;
	var cControlName = cControl.name;
	var xControlValue = cControl.value;
	eval("xStrPreviousValue = unescape(xPreviousValue[ '" + cFormName + "." + cControlName + "' ])");
	if ( !fncValidar( xControlValue, "####", laceptanulos , cTipoAnio , 4, null, null ,null ) )
	{	if ( fncValidarAnio.arguments[2] != true)
			if (!fncValorVacio(mensaje))		
			alert ( mensaje );
		else
			alert("El Año es incorrecto");
		fncRestorePrev(cFormName + "." + cControlName ) ;
		return false;
	}
	else
		return true;
}

function fncValidarHora( cControl, laceptanulos , mensaje )
{	var cFormName = cControl.form.name;
	var cControlName = cControl.name;
	var xControlValue = cControl.value;
	eval("xStrPreviousValue = unescape(xPreviousValue[ '" + cFormName + "." + cControlName + "' ])");
	if ( !fncValidar( xControlValue, "##:##", laceptanulos , cTipoTime , 5, null, null ,null ) )
	{	if ( fncValidarHora.arguments[2] != true)
			if (!fncValorVacio(mensaje))		
			alert ( mensaje );
		else
			alert("La Hora es incorrecta");
		fncRestorePrev(cFormName + "." + cControlName ) ;
		return false;
	}
	else
		return true;
}

function fncValidarEntero( cControl, nInferior, nSuperior, laceptanulos , mensaje )
 {	var cFormName = cControl.form.name;
	var cControlName = cControl.name;
	var xControlValue = cControl.value;
	eval("xStrPreviousValue = unescape(xPreviousValue[ '" + cFormName + "." + cControlName + "' ])");
	if ( !fncValidar( xControlValue, null, laceptanulos , cTipoInteger ,20 , nInferior, nSuperior ,null ) )
	{	if ( fncValidarEntero.arguments[4] != true)
			if (!fncValorVacio(mensaje))		
			alert ( mensaje );
		else
			alert("El número es incorrecto");
		fncRestorePrev(cFormName + "." + cControlName ) ;
		return false;
	}
	else
		return true
}

function fncValidarDecimal( cControl, nInferior, nSuperior, laceptanulos , mensaje )
{	var cFormName = cControl.form.name;
	var cControlName = cControl.name;
	var xControlValue = cControl.value;
	eval("xStrPreviousValue = unescape(xPreviousValue[ '" + cFormName + "." + cControlName + "' ])");
	if ( !fncValidar( xControlValue, null, laceptanulos , cTipoInteger ,20 , nInferior, nSuperior ,null ) )
	{	if ( fncValidarDecimal.arguments[4] != true)
			if (!fncValorVacio(mensaje))		
			alert ( mensaje );
		else
			alert("El número es incorrecto");
		fncRestorePrev(cFormName + "." + cControlName ) ;
		return false;
	}
	else
		return true
}

function fncValidar(valor,mascara,aceptanulo,tipodedato,longitud,limiteinferior,limitesuperior,expresionregular)
{	/*	valor: string con valor del control. Obligatorio
		mascara: string con la mascara de entrada. Opcional
		aceptanulo: Booleano que indica si el control puede ser vacio.Obligatorio
		tipodedato: string tipo de dato que contiene el control.Obligatorio
		longitud: integer longitud del tipo de dato.Obligatorio
		limiteinferior: double parte del rango de numeros permitido para los numericos.Opcional
		limitesuperior:double parte del rango de numeros permitido para los numericos.Opcional			
		expresionregular:string con expresion regular para validar el control.Opcional	*/

	if ( (aceptanulo && valor.length == 0) || (!aceptanulo && valor.length == 0 && xStrPreviousValue.length == 0) )
	{
		/*Para permitir navegar por los campos. Luego se chequea cuando se realiza un submit*/
		return (true)
	}
	else
	{	if ( !aceptanulo && valor.length == 0 && xStrPreviousValue.length != 0 )
			return (false);
		/*El double será el único que no tendrá longitud ni máscara*/
		/*Es peligroso ya que puede hacer que reviente el sql si se ingresa un número muy grande*/
		if ((valor.length > longitud) && (tipodedato != cTipoDouble))
			return(false);
		else
		{
			switch(tipodedato)
			{	//case cTipoText:
				case 'text':
					//El tipo text acepta en primera instancia cualquier tipo de datos
					return(true);
					break;
				//case cTipoVarChar:
				case 'varchar':
					//Chequea validez con la máscara
					return(fncMascara(valor,mascara,longitud));
					break;
				//case cTipoChar:
				case 'char':
					//Chequea validez con la máscara
					return(fncMascara(valor,mascara,null));
					break;
				//case cTipoInteger:
				case 'integer':
					return(fncEsnumerico(valor,mascara,limiteinferior,limitesuperior,expresionregular,'parseInt'));
					break;
				//case cTipoLong:
				case 'long':
					return(fncEsnumerico(valor,mascara,limiteinferior,limitesuperior,expresionregular,'parseInt'));
					break;
				//case cTipoDouble:
				case 'double':
					return(fncEsnumerico(valor,mascara,limiteinferior,limitesuperior,expresionregular,'parseFloat'));
					break;
				//case cTipoBoolean:
				case 'boolean':
					//Se asume que estará controlado por código
					return(true);
					break;
				//case cTipoEmail:
				case 'email':
					if (valor.indexOf("@")<1)
						return (false) ;
					break;
				//case cTipoDate:
				case 'date':
					var dia;
					var mes;
					var ano;
					var FechaEsCorrecta
					if (valor.length != 10)
						return(false);
					else
						if (fncMascara(valor,mascara,null))
							{	dia = valor.substring(0,2);
								mes = valor.substring(3,5);
								ano = valor.substring(6,10);
								if ( (parseInt(mes) < 0 || parseInt(mes) > 12 ) || (parseInt(dia) < 0 || parseInt(dia) > 31) || ( parseInt(ano) < 1910 || parseInt(ano) > 2050 ) )
									return(false)
								else
									{
									FechaEsCorrecta = new Date( ano , mes - 1 , dia)
									if ( ( FechaEsCorrecta.getDate() == dia ) && ( FechaEsCorrecta.getMonth() + 1  == mes ) )
										return(true);
									else
										return(false);
									}
							}
						else
							return(false);
					break;
				//case cTipoDateCorto:
				case 'datecorto':
					var dia;
					var mes;
					var FechaEsCorrecta
					if (valor.length != 5)
						return(false);
					else
						if (fncMascara(valor,mascara,null))
							{	dia = valor.substring(0,2);
								mes = valor.substring(3,5);
								if ( (parseInt(mes) < 0 || parseInt(mes) > 12 ) || (parseInt(dia) < 0 || parseInt(dia) > 31))
									return(false)
							}
						else
							return(false);
					break;

				//case cTipoMes:
				case 'mes':
					var mes;
					var FechaEsCorrecta
					if (valor.length != 2)
						return(false);
					else
						if (fncMascara(valor,mascara,null))
							{	mes = valor.substring(0,2);
								if (parseInt(mes) < 0 || parseInt(mes) > 12 ) 
									return(false)
							}
						else
							return(false);
					break;
				//case cTipoAnio:
				case 'anio':
					var anio;
					var FechaEsCorrecta
					if (valor.length != 4)
						return(false);
					else
						if (fncMascara(valor,mascara,null))
							{	anio = valor.substring(0,4);
								if (parseInt(anio) < 1900 || parseInt(mes) > 2030 ) 
									return(false)
							}
						else
							return(false);
					break;
				//case cTipoTime:
				case 'time':
					var hora;
					var minutos;
					//Chequear la máscara o l a expresión regular
					//Deberá tener un tratamiento especial
					if (valor.length != 5)
						return(false);
					else
						if(fncMascara(valor,mascara,null))
							{	hora = valor.substring(0,2);
								minutos = valor.substring(3,5);
								if ( parseInt(minutos) >= 0 && parseInt(minutos) <= 59) 
									if ( ((parseInt(hora) < 24) && (parseInt(hora) >= 0))  || (parseInt(hora) == 24 && parseInt(minutos) == 0 ))
										return(true);
									else
										return(false);
								else
									return(false);
							}
						else
							return(false);
					break;
			}
		}
	}
	return(true);
}

function fncEsnumerico(valor,mascara,limiteinferior,limitesuperior,expresionregular,funcion)
{	//Solo Integer y Long deberían tener máscara
	//Double no tiene máscara ya que daría error por ejemplo para una máscara ####.## el número 2.34
	//Pregunta si es numerico
	if(!isNaN(valor))
	{	//Si tiene máscara chequearla	
		if (mascara!=null)
			if (!fncMascara(valor,mascara,null))
				return(false);
		//Ok.Chequea el resto
		//Chequear si tiene límites
		if ((limiteinferior != null) && (limitesuperior != null))
		{	
			

			if ( ( eval(funcion + '( valor ) >= ' + limiteinferior ) ) && ( eval(funcion +'( valor ) <= ' + limitesuperior ) ) ) 
				return(true);
			else
				return(false)
		}
		else
		{	if (expresionregular != null)
				//chequear expresion regular
				return(valores.match(expresionregular));
		}
		return(true);
	}
	else
		return(false);
}


function fncMascara(valor,mascara,longitud)
{	/*
	valor: string con valor del campo.Obligatorio
	mascara: string formato de la máscara.Obligatorio
	longitud: integer longitud del campo (En este caso solo text y varchar lo pasaran).Opcional
	los varchar deberán ingresar la longitud ya que la máscara es una repetición de un caracter de máscara. El resto de los tipos no debería tener máscara 	*/
	var largo;
	var i;
	var p;

	if (longitud!=null)
	{	if (valor.length > longitud)
			return(false);
		else 
			largo = longitud;
	}
	else
	{
		largo = valor.length;
	}
	i = 0;
	p = 0;
	if (mascara != null)
	{
		while(i < largo)
		{	
			switch(mascara.charAt(p))

			{	case "#" :
					//Numerico
					if (valor.charAt(i).match(/[0-9]/)==null) 
						return(false);
					break;
				case "a" :
					//Letras
					if (valor.substr(0).match(/[a-zA-Z]/)==null) 
						return(false);
					break;
				case "b" : 
					//Letras y Números menos el signo Ç
					if ( valor.substr(0).match(/[0-9a-zA-Z]/) == null )
						return(false);   
					if ( valor.substr(0).match(/Ç/) != null  )    
						return(false);   
					break;
				case "c" :  
					//Cualquier signo    
				default :
					if (valor.charAt(i) != mascara.charAt(p))    
						return(false);
					break;  
			}  
			i++;  
			if(longitud==null)
				p++;   
		}
	}
	//Si llega a este punto todo OK
	return(true);
}


