// JavaScript Document

sfsValidatorField = new Class ({
	Implements: Options,
	input:'',
	element:null,
	has_error:false,
	options:{
		message:'',
		error_class:'',
		error_display:''
	},
	initialize:function(input,options) {
		this.setOptions(options);
		this.input = input;
		this.element = $(input);
		//element = $(this.options.input);
		
		//this.cleanError();
	},
	setError: function(has_error, default_message) {
		
		
		var message = $(this.input + '_message');
		var check = $(this.input + '_check');
		this.has_error = has_error;
		
		if(has_error)
		{
			if(this.element) this.element.addClass('invalid_input');
			if(message)
			{
				message.innerHTML = this.options.message;
				message.addClass('invalid');
			}
			if(check)
			{
				check.removeClass('valid');
				check.addClass('invalid');
			}
		}
		else
		{
			
			if(this.element) this.element.removeClass('invalid_input');
			if(message)
			{
				message.innerHTML = '';
				message.addClass('valid');
			}
			if(check)
			{
				check.removeClass('invalid');
				check.addClass('valid');
			}
		}
	},
	cleanError: function () {
		var message = $(this.input + '_message');
		var check = $(this.input + '_check');
		
		if(message)
		{
			message.innerHTML = this.options.message;
			message.removeClass('invalid');
		}
		if(check)
		{
			check.removeClass('invalid');
			check.removeClass('valid');
		}
		//if(this.options.error_display != '') {
//			var dsp = $(this.options.error_display);
//			dsp.innerHTML = '';
//			if(this.options.error_class != '') {
//				this.dsp.removeClass(this.options.error_class);
//			}
//		}
//		if(this.options.error_check != '' && this.options.error_check_class != '') {
//			$(this.options.error_check).removeClass(this.options.error_check_class);;
//		}
	}
});

sfsValidator = new Class({
	Implements: Options,
	options:{errorClass:''},
	inputs:new Hash(),
	errors:new Array(),
	hasErrors: false,
	cleanError: function (input,options) {
		
	},
	addInput: function (field)
	{
		this.inputs[field.input] = field;
	},
	addError: function(has_error,field,default_message) {
		if(field.options.message == '') { field.options.message = field.input +': ' + default_message;}
		field.setError(has_error);
		this.errors.push(field);
	},
	getPreviousError: function(field) {
		
		var npt = this.inputs[field]
		
		if( npt != undefined) {
			if(npt.has_error) return true;
		}
		return false
	},
	
	has_errors: function()
	{
		var flag = false;
		this.inputs.each( function(el)
		{
			//alert('hola');
			if(el.has_error) flag = true;
			
		});
		
		return flag;
	},
	get_errors: function ()
	{
		var ret = new Array();
		this.inputs.each(function (el)
		{
			if(el.has_error) ret.push(el.input);
		});
		return ret.toString();
	},
	testReg:function (input,regex,options, default_message) {
		//if(this.getPreviousError(input)) return false;
		
		var f = this.inputs[input];
		if( f == undefined) {
			var f= new sfsValidatorField(input, options);
		}
		
		var npt = $(input);
		
		if(npt)
		{
			var rsp = regex.test(npt.value);
		}
		else
		{
			var rsp = false;	
		}
		//alert(rsp);
		f.options.message = options.message;
		f.setError(!rsp,default_message);
		this.addInput(f);
		return rsp;
	},
	testFunc:function (input,func,options, default_message) {
		var f = this.inputs[input];
		if( f == undefined) {
			var f= new sfsValidatorField(input, options);
		}
		this.npt = $(input);
		
		if(this.npt)
		{
			var rsp = func();
		}
		else
		{
			var rsp = false;	
		} 
		f.options.message = options.message;
		f.setError(!rsp,default_message);
		this.addInput(f);
		return rsp;
	},
	setCustom:function(input,options)
	{
		var f = this.inputs[input];
		if( f == undefined) {
			var f= new sfsValidatorField(input, options);
		}
		
		f.options.message = options.message;
		f.setError(true,options.message);
		this.addInput(f);
		return false;
	},
	//clear:function(input)
//	{
//		var f= new sfsValidatorField(input, options);
//		f.cleanError();
//		return false;
//	},
	required:function(input,options) {
		var regex = /[^.*]/;
		//alert('required');
		return this.testReg(input, regex, options, "El campo es un valor requerido");
	},
	
	same:function(input,options) {
		var self = this;
		var func = function(){ return self.npt.value == $(options.compare).value }
		return this.testFunc(input, func, options, "No coindide con " + options.compare);
	},
	
	email:function(input,options) {
		var regex = /^[a-z0-9._%-]+@[a-z0-9.-]+\.[a-z]{2,4}$/i;
		return this.testReg(input, regex, options, "No es un email válido");
	},
	nonzero:function(input,options){
		var regex = /^[0]+$/i;
		return this.testReg(input, regex, options, "El campo " + input + " debe ser diferente a 0");
	},
	greater:function(input,options)
	{
		var msg =  "No es mayor que " + options.value;
		var self = this;
		
		var func = function(){ return self.npt.value > options.value }
		return this.testFunc(input, func, options,msg);
	},
	integers:function(input,options) {
		var regex = /^\d\d*$/ ;
		return this.testReg(input, regex, options, "El campo debe contener números enteros");
	},
	match_value:function(input,options) {
		var self = this;
		var func = function(){ return self.npt.value == options.compare }
		return this.testFunc(input, func, options, "No coindide con " + options.compare);
	},
	other_value:function(input,options) {
		var self = this;
		var func = function(){ return self.npt.value != options.compare }
		return this.testFunc(input, func, options, "No coindide con " + options.compare);
	}
	
	
	
	
});
