// JavaScript Document
/*
	
	##################################
	    INSTALACION DEL VALIDADOR
	##################################
	
	1) Incluir el archivo "validador.js" entre las etiquetas <head> de la siguiente manera:
		<head>
		...
		<script language="javascript" type="text/javascript" src="validador.js"></script>
		...
		</head>
	
	2) Incluir el evento onsubmit en la etiqueta del formulario de la siguiente manera:
		
		<form ... onSubmit="return validar(this)" >
		
	3) Añadir las restricciones a los campos deseados en sus respectivos id de la siguiente manera:
	
	##################################
	    RESTRICCIONES A LOS CAMPOS
	##################################
	
	Posibles valores para las cosas a validar:
	
	alfanum:[0|1] 
	int:[0|1] 
	real:[0|1] 
	maxlong:[int]
	minlong:[int]
	mail:[1|0]
	
	EJEMPLOS:
	
	 - Si se desea que el campo sea un número entero:
		<input ... id="int:1" ... />
		
	 - Si se desea que el campo no sea un número entero:
		<input ... id="int:0" ... />
	 
	 - Si se desea que el campo sea un número real:
		<input ... id="real:1" ... />
		
	 - Si se desea que el campo no sea un número real:
		<input ... id="real:0" ... />
		
	 - Si se desea que el campo sea alfanumérico (Sólo letras y números):
		<input ... id="alfanum:1" ... />
		
	 - Si se desea que el campo no sea alfanumérico:
		<input ... id="alfanum:0" ... />
		
	 - Si se desea que el campo no supere los N caracteres de longitud:
		<input ... id="maxlong:N" ... />
		
	 - Si se desea que el campo tenga N o más caracteres de longitud:
		<input ... id="minlong:N" ... />
		
	COMBINACIÓN DE RESTRICCIONES:
	
	 - Si se desea que el campo sea alfanumérico y de longitud entre 3 y 16:
		<input ... id="alfanum:1,maxlong:16,minlong:3" ... />
		
*/
//addRule("alfanum", "^[0|1]$", "^[a-z0-9]*$");

function rule(nombre_rule, regexp_valores, str_funcion, msj_error){
	this.nombre = nombre_rule;
	this.valores = regexp_valores;
	this.funcion = str_funcion;
	this.error = msj_error;
	return this;
}

function restriccion(){
	this.restricciones = new Array();
	this.addRule = function (nombre_rule, regexp_valores, str_funcion, msj_error) {
		if(nombre_rule.toLowerCase().search("^[ ]*[a-z0-9]*[ ]*$") != -1){
			this.restricciones.push(new rule(nombre_rule, regexp_valores, str_funcion, msj_error));
			return true;
		}else{
			alert("Error agregando la regla " + nombre_rule + ". Su nombre debe contener sólo letras o números");
			return false;
		}
	};
	this.validarPropiedad = function (cadena, propiedad){
		propiedad = propiedad.toLowerCase();
		var v = propiedad.split(':').pop();
		var errores = "";
		var cad_valida = true;
		for(var n = 0; n < this.restricciones.length; n++){
			if(propiedad.split(':').shift().search("^[ ]*" + this.restricciones[n].nombre + "[ ]*$") != -1){
				if(v.search(this.restricciones[n].valores) != -1){
					eval('cad_valida = '+this.restricciones[n].funcion+'(cadena, v);');
					if(!cad_valida)
						errores += this.restricciones[n].error.replace("#", v);
				}
			}
		}
		return errores;
	};
	
	this.validar = function (nombre, valor, propiedad){
		var propiedades = propiedad.split(',');
		var resultado = "";
		var error = "";
		for(var n = 0; n < propiedades.length; n++)
			if(propiedades[n] != ""){
				error = this.validarPropiedad(valor, propiedades[n]);
				if(error != "")
					resultado += error.replace("%", nombre);
			}
		return resultado;
	};

	return this;
}

var restricciones = new restriccion();
restricciones.addRule("alfanum", "^[ ]*[1][ ]*$", "es_alfanumerica", "El campo % sólo puede contener letras o números.\n");
restricciones.addRule("mail", "^[ ]*[1][ ]*$", "es_mail", "El campo % no es una dirección de correo válida.\n");
restricciones.addRule("int", "^[ ]*[1][ ]*$", "es_int", "El campo % debe ser un número entero.\n");
restricciones.addRule("real", "^[ ]*[1][ ]*$", "es_real", "El campo % debe ser un número real.\n");
restricciones.addRule("maxlong", "^[ ]*[0-9]+[ ]*$", "es_maxlong", "El campo % excede los # caracteres de longitud.\n");
restricciones.addRule("minlong", "^[ ]*[0-9]+[ ]*$", "es_minlong", "El campo % tiene menos de # caracteres de longitud.\n");

function es_alfanumerica(cad, param){
	return !cad.match("[^a-z^0-9]+");
}
function es_maxlong(cad, param){
	return cad.length <= param;
}

function es_minlong(cad, param){
	return cad.length >= param;
}
function es_mail(cad, param){
	return cad.match("^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@+([_a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]{2,200}\.[a-zA-Z]{2,6}$");
}

function es_int(cad, param){
	return cad.match("^[-]?[0-9]*$");
}

function es_real(cad, param){
	return cad.match("^[-]?[0-9]*[\.\,]?[0-9]*$");
}
