var Validator = new Class({

	options: {
		
		errorMessages: {
		
			required : "required field",
			wrong: "wrong field",
			short: "field too short",
			long: "field too long",
			low: "value too low",
			high: "value too high"
		},
		
		regex: {
			
			NUMBER : /^[-+]?\d*\.?\d+$/,
			EMAIL : /^[a-z0-9._%-]+@[a-z0-9.-]+\.[a-z]{2,4}$/i,
			PHONE : /^[\d\s ().-]+$/,
			ABSOLUTE_URL : /^(http|https|ftp)\:\/\/[a-z0-9\-\.]+\.[a-z]{2,3}(:[a-z0-9]*)?\/?([a-z0-9\-\._\?\,\'\/\\\+&amp;%\$#\=~])*$/i,
			USERNAME : /^[a-zA-Z0-9_-]+$/,
			PASSWORD : /^[a-zA-Z0-9_-]+$/,
			DOMAIN : /^([a-zA-Z0-9]){3,}$/,
			HTML_SIZE : /^[0-9]+(px|%)?$/,
			NOME : /^[a-zA-Z\s\']+$/
		}
	},
	
	initialize: function(options){
	
		this.setOptions(this.options, options);
	
	},
	
	testRegExp: function(value, re){
	
		return new RegExp(re).test(value);
	},
	
	validateFieldAndSetError: function(elem, required, regex, minLength, maxLength, minValue, maxValue){
		
		var errLabel = this.validateField(elem, required, regex, minLength, maxLength, minValue, maxValue);
		
		if(errLabel != 'correct')
		{
			this.setError(elem, errLabel);
			return errLabel;
		}
		
		this.setValid(elem);
		return true;
	},
	
	validateField: function(elem, required, regex, minLength, maxLength, minValue, maxValue){
		
		var elemVal = $(elem).value;
		
		if(required && elemVal == '') 							return 'required';
		if($defined(minLength) && elemVal.length < minLength) 	return 'short';
		if($defined(maxLength) && elemVal.length > maxLength) 	return 'long';
		if($defined(minValue) && elemVal < minValue) 			return 'low';
		if($defined(maxValue) && elemVal > maxValue) 			return 'high';
		if($defined(regex) && !this.testRegExp(elemVal, regex)) return 'wrong';
		
		return 'correct';
	},
	
	setError: function(elem, errLabel){
		
		if($defined($(elem))) $(elem).addClass('error');
		if($defined($(elem + '_errmsg')))
		{
			if($defined(this.options.errorMessages[errLabel + '_' + elem])) $(elem + '_errmsg').setHTML(this.options.errorMessages[errLabel + '_' + elem]);
			else if($defined(this.options.errorMessages[errLabel])) $(elem + '_errmsg').setHTML(this.options.errorMessages[errLabel]);
		}
	},
	
	setValid: function(elem){
	
		if($defined($(elem))) $(elem).removeClass('error');
		if($defined($(elem + '_errmsg'))) $(elem + '_errmsg').empty();
	}
});

Validator.implement(new Options());