
var Validation = {
	elements : null,
	rules : null,
	errors : 0,
	errorsMsg : [],
	firstError : null,
	confirmar : false,
	form:null,

	initialize: function(){
			this.confirmar=false;		
			this.elements = Form.getElements(this.form);
			this.rules = this.initRules();
			this.errors = 0;
			this.errorsMsg = new Array();
			this.firstError = null;
		},
	validate: function(form,opt){
			this.form = $(form);
			if(!this.form ) {
					alert("La forma con el id "+form+" no existe");
					return false;
			}			
						
			if(typeof opt!="object") opt = {};
			if(typeof opt.confirmar=="undefined") opt.confirmar=false;
			if(typeof opt.submit=="undefined") opt.submit = false;			
			this.initialize();
			this.getProps(this.form);
			this.errors = 0;
			this.errorsMsg = new Array();
			this.firstError = null;
			
			for(var i = 0; i < this.elements.length ; i++){
					Element.removeClassName(this.elements[i],"requiredfail");
					this.isValid(this.elements[i]);
				}
			t = "";
			if(this.errors != 0){
				t +=  "Se encontraron errores en el formulario: \n\n";
			
				for(var i = 0; i < this.errors ; i++){
						t += "* "+ this.errorsMsg[i] + "\n";
				}
				if(typeof Alert=="object") Alert.error("ERROR",[t.nl2br()]);
				else alert(t);
				this.firstError.focus();
				return false;
			}
			else{
				if(opt.confirmar){
					if(confirm("¿Seguro que desea enviar el formluario?")){
						 if(opt.submit)
						 this.form.submit();
						 else return true;
					}else{
						return false;
					}
				}else{
					if(opt.submit)
					this.form.submit();
					else return true;
				}
				
			}

		},
		
	isValid: function(ele){
		// Preprocesamiento 

		//Checa si esta vacio y si tiene la clase empty, en cuyo caso, ignora la validacion
		if( Element.hasClassName(ele, "empty") )
			if(ele.value.length == 0)
				return;
		// Checa si el elemento con el id igual al title de "ele" tiene el mismo valor				
		if( Element.hasClassName(ele, "dupe")){
			if( ! (other = $(ele.title) )) {
				alert("No se encuentra el elemento " +ele.title);
				Element.addClassName(ele,"requiredfail");
				return;
			}
			if( ele.value != other.value ){
				this.firstError = ele;
				if(ele.alt == "")
					this.errorsMsg.push("El elemento "+ele.name+" debe ser igual al elemento "+ other.name);
				else
					this.errorsMsg.push(ele.alt);
				Element.addClassName(ele,"requiredfail");				
				this.errors ++;
			}
			
		}
	
		// Procesado de reglas
		for(i = 0; i < this.rules.length; i++){
			if( Element.hasClassName(ele, this.rules[i].type) ){ // Si tiene la clase de la regla 

				if(ele.type == 'radio'){ // Si el elemento es un radio, busca todos los radios con el nombre y comprueba con el checked
					val = "";
					radios = Form.getInputs(this.form, "radio", ele.name);
					for(j = 0; j< radios.length; j++){
						if(radios[j].checked == true){
							val = radios[j].value;
							break;
						}
					}
	
				}
			
				if(ele.type == 'radio') 
					t = this.rules[i].checkValue(val);	
				else
					t = this.rules[i].checkValue(ele.value);					
				
				if ( t ){ //Si no es valido el regex

					if( this.firstError == null )
						this.firstError = ele;
					this.errorsMsg.push(this.getMessage(ele, this.rules[i] ));
					Element.addClassName(ele,"requiredfail");
					this.errors++;
				}
			}
		}
	},
	getMessage: function(ele, rule){
		if(typeof ele.alt != 'undefined' && ele.alt != ''){
			return ele.alt;
		}
		else{
			return rule.message.replace("XXXX", ele.name);	
		}
		
	},
	
	getProps: function(f){
		t = ""
		for(k in f){
			t += k + " => " + f[k] + "\n";
		}
		return t;

	},
	initRules: function(){

		a = new Array();
		a.push( new Rule("required", /./, "El campo XXXX es requerido" ) );
		a.push( new Rule("digits",  /^[0-9\s]+$/, "El campo XXXX debe ser un numero" ) );
		a.push( new Rule("nonzero",  /^[1-9]*$/ , "El campo XXXX debe ser un numero diferente de cero" ) );
		a.push( new Rule("chars",  /./ , "El campo XXXX debe tener solo caracteres" ) );
		a.push( new Rule("alpha", /^[A-Za-z0-9\.\_\,\:\;\#\s]+$/ , "El campo XXXX debe ser un caracter alfanumerico (no simbolos)" ) );
		a.push( new Rule("email", /^([a-zA-Z0-9_.+-])+@(([a-zA-Z0-9-])+.)+([a-zA-Z0-9]{2,6})+$/ , "El campo XXXX debe ser un email valido" ) );
		//a.push( new Rule("date", /^(19|20)\d\d[- /.](0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])$/ , "El campo XXXX debe ser una fecha valida en el formato YYYY-MM-DD" ) );		

//	Para mas buenos ejemplos de validacion http://www.merlyn.demon.co.uk/js-valid.htm#Val

		return a;
	}
	
};

var Rule = Class.create();

Rule.prototype = {
	initialize: function (type, regexp, message){
		this.type = type;
		this.regexp = regexp;
		this.message = message;
		
		},
	
	checkValue: function(value){
		if(this.regexp.test(value))
			return false;
		else
			return true;
		
	}
};

