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 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 ) ) )
	{
		alert ( mensaje );
		//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)
			alert( mensaje );
		//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)
			alert( mensaje );
		//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)
			alert( mensaje );
		//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;

	//me permite ingresar la fecha sin las barras '/' y me lo convierte..............
	if ( xControlValue.indexOf('/') == -1 && xControlValue.length == 6 ) {
		 xControlValue = xControlValue.substring(0,2) + '/' + xControlValue.substring(2,6);
	}
	
	var xNewValue = xControlValue;

	if ( xControlValue != '' && xControlValue != null )
	{
		xControlValue = "01/" + xControlValue;
	}

	if ( !fncValidar( xControlValue, "##/##/####", laceptanulos , cTipoDate , 10, null, null ,null ) )
	{	if ( fncValidarMes.arguments[2] != true)
			alert( mensaje );
		//fncRestorePrev(cFormName + "." + cControlName ) ;
		return false;
	} else
		cControl.value = xNewValue;		
		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 + "' ])");
	//me permite ingresar la fecha sin las barras '/' y me lo convierte..............
	if ( xControlValue.indexOf('/') == -1 && xControlValue.length == 8 ) {
		xControlValue = xControlValue.substring(0,2) + '/' + xControlValue.substring(2,4) + '/' +
						xControlValue.substring(4,8)
	}

	if ( !fncValidar( xControlValue, "##/##/####", laceptanulos , cTipoDate , 10, null, null ,null ) )
	{	if ( fncValidarFecha.arguments[2] != true)
			alert( mensaje );
		//fncRestorePrev(cFormName + '.' + cControlName) ;
		//cControl.value='';
		cControl.focus();
		cControl.select();
		return false;
	}
	else
		cControl.value = xControlValue;
		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)
			alert( mensaje );
		//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)
			alert( mensaje );
		//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;

	if ( xControlValue == '' ) return true;

	var regexp = /^(\d{1,2}):(\d{2})$/;
	var result = regexp.exec(xControlValue)
	var error = false;

	if ( result == null ) 
		error = true;
	else 
		if ( result[2] <= 59 && result[1] < 24 ) 
			error = false;
		else 
			error = true;

	if ( !error && result[1].length == 1 )
		cControl.value = '0' + cControl.value;
	
	if ( error ) {
		alert(mensaje);
		//fncRestorePrev(cFormName + "." + cControlName ) ;
		return false;
	}

	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 ( xControlValue.indexOf('.') != -1 || !fncValidar( xControlValue, null, laceptanulos , cTipoInteger ,20 , nInferior, nSuperior ,null ) )
	{	if ( fncValidarEntero.arguments[4] != true || xControlValue.indexOf('.') != -1 )
			alert( mensaje );
		//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)
			alert( mensaje );
		//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);
}

//le paso un campo y un mensaje y si el campo esta vacio ( texto o select ) me tira un mensaje,
//hace foco en el campo, y me devuelve false.
function vacio ( campo , mensaje ) {
	
	if ( campo.type == 'text' ) {
		
		if ( campo.value == '' || campo.value == null ) {
			alert( mensaje );
			campo.focus();
			return true;
		}
	} else if ( campo.type == 'select-one' ) {
		
		if ( campo.options.selectedIndex == -1 || 
		     campo.options[campo.selectedIndex].value == 0 ||
		     campo.options[campo.selectedIndex].value == '' ) {
			alert( mensaje );
			campo.focus();
			return true;
		}
	}

	return false;
}

/* 
Esta funcion valida que el tipo de datos de todos los controles de un formulario esten correctos de acuerdo a su definicion y sino muestra error.
Para usar esta funcion en cada control de la pagina se debe agregar un atributo :  validateAs="" con los valores :  integer, string, double, date, time
Ejemplo :  <input type ="text" class="FlatEdit" value="0.0.0.0" name="ed_direccion_ip_fija"  size="15" maxlength="20" validateAs="integer">
Juli.-
*/
function validacionGeneral (auxForm) {
	var auxValue;
	var auxNull;
	var resValida;

	for (i = 0; i < auxForm.elements.length; i++) {

		auxValue = auxForm.elements[i].value;
		auxNull = auxForm.elements[i].nullValue;

/*  Fixed By Pablo E Fino auxNull == "0" a los dos if de abajo*/
		if (auxNull == "" || auxNull == null || auxNull == " " || auxNull == "true") 
			auxNull = true;
		else
			auxNull = false;	

		// Si el campo no acepta nulos y esta vacio --> Error y salgo del for
		if (!auxNull && (auxValue == "" || auxValue == null || auxValue == " ")) {
			alert("Debe completar todos los campos requeridos");
			auxForm.elements[i].focus();
			auxForm.elements[i].select();
			return(false);
		}
		
		//		alert(auxForm.elements.name);
		//INTEGER
		if (auxForm.elements[i].validateAs == "integer") {
			resValida = fncValidarEntero( auxForm.elements[i], -999999999, 999999999, auxNull , "El valor [ " + auxValue + " ] es incorrecto, por favor, verifíquelo!");
		}
		else
			//DECIMAL	
			if (auxForm.elements[i].validateAs == "decimal") {				
				resValida = fncValidarDecimal( auxForm.elements[i], -999999999, 999999999, auxNull , "El valor [ " + auxValue + " ] es incorrecto, por favor, verifíquelo!");
			}
			else
				//STRING	
				if (auxForm.elements[i].validateAs == "string") {
					resValida = fncValidarString( auxForm.elements[i], 255, auxNull , "El valor [ " + auxValue + " ] es incorrecto, por favor, verifíquelo!");		
				}
				else
					//DATE
					if (auxForm.elements[i].validateAs == "date") {
						resValida = fncValidarFecha( auxForm.elements[i], auxNull , "El valor [ " + auxValue + " ] es incorrecto, por favor, verifíquelo!");		
					}
					else
						//TIME
						if (auxForm.elements[i].validateAs == "time") {
							resValida = fncValidarHora( auxForm.elements[i], auxNull , "El valor [ " + auxValue + " ] es incorrecto, por favor, verifíquelo!");		
						}
						else
							//MAIL
							if (auxForm.elements[i].validateAs == "mail") {
								resValida = fncValidarEmail( auxForm.elements[i], 255, auxNull, "El valor [ " + auxValue + " ] es incorrecto, por favor, verifíquelo!" );		
							}
							else
								//MONTH
								if (auxForm.elements[i].validateAs == "month") {
									resValida = fncValidarMes( auxForm.elements[i], auxNull , "El valor [ " + auxValue + " ] es incorrecto, por favor, verifíquelo!");		
								}
								else
									//YEAR
									if (auxForm.elements[i].validateAs == "year") {
										resValida = fncValidarAnio( auxForm.elements[i], auxNull , "El valor [ " + auxValue + " ] es incorrecto, por favor, verifíquelo!");		
									}
									else
										//SHORTDATE
										if (auxForm.elements[i].validateAs == "shortdate") {
											resValida = fncValidarFechaCorta( auxForm.elements[i], auxNull , "El valor [ " + auxValue + " ] es incorrecto, por favor, verifíquelo!");		
										}
										else
											//TEXT
											if (auxForm.elements[i].validateAs == "text") {
												resValida = fncValidarText( auxForm.elements[i], 255, auxNull , "El valor [ " + auxValue + " ] es incorrecto, por favor, verifíquelo!");		
											}
											else
												//SI NO ES NINGUNO DE ESTOS --> NO NECESITA VALIDACION
												resValida = true;


		if (!resValida) {
			auxForm.elements[i].focus();
			auxForm.elements[i].select();
			return(false);
		}

	} // for

	return(true);
		
} // function

