var inputsValidator = new Class({
	options:{
		focus_css_class:'focus',
		valid_css_class:'valid',
		invalid_css_class:'invalid',
		norequired_css_class:'norequired',
		rules:{
			name:/^[\d\wáéíóúñÁÉÍÓÚÑ.' \-]{3,128}$/,
			mail:/^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/,
			password:/^[a-zA-Z\d]{3,18}$/,
			number:/^\d+$/,
			date:/^[\d]{2}-[\d]{2}-[\d]{4}$/,
			telephone:/^[\d()+\- ]{7,24}$/,
			text:/^[\w\s\dáéíóúñÁÉÍÓÚÑ.,;:¿?¡!|%$\/]{3,}$/i
		}
	},

	initialize: function(elemns,options){
		this.enabled = true;
		this.status = false;
		this.setOptions(options);
		this.elems = elemns;
		this.elems.each(function(el){
			el.rule = eval('this.options.rules.'+el.getProperty('class').split(' ')[0]);
			el.addEvents({
				focus:function(){
						if(!this.enabled) return;
						el.removeClass(this.options.valid_css_class).removeClass(this.options.invalid_css_class).addClass(this.options.focus_css_class);
					}.bind(this),
				blur:function(){
						var required = !el.hasClass(this.options.norequired_css_class);
						if(!this.enabled) return;
						el.removeClass(this.options.focus_css_class);
						//testing
						if((!required && el.getValue()=='') || el.getValue().test(el.rule)){
							el.addClass(this.options.valid_css_class);
						}else{
							el.addClass(this.options.invalid_css_class);
							this.status = false;
						}
					}.bind(this)
			})
		}, this)
	},
	
	test: function(){
		if(!this.enabled) return null;
		this.status = true;
		this.elems.each(function(el){el.fireEvent('focus').fireEvent('blur')});
		return this.status;
	},

	on:function(){
		if(this.enabled) return;
		this.enabled = true;
		this.test();
	},

	off:function(){
		if(!this.enabled) return;
		this.elems.each(function(el){el.removeClass(this.options.valid_css_class).removeClass(this.options.invalid_css_class).removeClass(this.options.focus_css_class)},this);
		this.enabled = false;
	},
	
	focusInvalid:function(){
		for(var i=0;i<this.elems.length;i++)
			if(this.elems[i].hasClass(this.options.invalid_css_class)){
				this.elems[i].removeClass(this.options.invalid_css_class).addClass(this.options.focus_css_class).focus();
				return;
			}
	},
	
	clean:function(){
		if(!this.enabled) return;
		this.elems.each(function(el){el.setProperty('value','').fireEvent('blur')},this);
	}

});

inputsValidator.implement(new Options);