/**************************************************************************************
	EasyValidator
	=============
	by Pixelindustries (2009)
	
	for more information / license information, please contact me/us
	
	to use translated error-messages, include the relevent easyvalidator.[language].js
	just including this will take care of everything!
	
**************************************************************************************/

var EasyValidator = new Class({

	Implements: Options,
	
	// in addition to the manual regex tests below, you may also use the "magic tests":
	// "max-length-XXX" and "min-length-XXX" (where XXX is any number)
	
	tests:
	[
		['not-empty', 'This is a required field.', function(elm) {
				return elm.get('value').trim() != '';
			}],
		['email', 'Please enter a valid email address.', function (elm) {
				return /\w{1,}[@][\w\-]{1,}([.]([\w\-]{1,})){1,3}$/.test(elm.get('value').trim());
			}],
		['phone', 'Please enter a valid phone number.', function (elm) {
				return /^[0-9 \-#\+]{8,}$/.test(elm.get('value').trim());
			}],
		['alphanumeric', 'Please only use alphanumeric characters.', function (elm) {
				return /^[0-9a-zA-Z_]*$/.test(elm.get('value').trim());
			}],
		['not-null', 'This is a required field.', function(elm) {
			return elm.get('value').trim() != '0' && elm.get('value').trim() != '';
			}],
			
		['checked', 'This is a required field.', function(elm) {
			if(elm.get('type') == 'checkbox'){
				return elm.get('checked');
			}else{
				alert('checked only for checkboxes')			
			}
		}]
	],
	
	options: {
		failedClass: '',
		passedClass: '',
		showError: function(elm, error) { },
		hideError: function(elm) { },
		translatedMessages: {
			'min-length': 'Minimum length of this value is %len% characters.',
			'max-length': 'Maximum length of this value is %len% characters.'
		}
	},
	
	initialize: function(options) {
		options = options || {};
		options.translatedMessages = options.translatedMessages || EasyValidator.translatedMessages || this.options.translatedMessages;
		this.setOptions(options);
	},
	
	addTest: function(test) {
		this.tests.push(test);
	},
	
	validate: function(form) {
		var valid = true;
		$(form).getElements('input,select').each(function(elm, index) {
			var passed = this.validate_field(elm);
			valid = valid && passed;
		}.bind(this));
		
		return valid;
	},
	
	validate_field: function(elm) {
		var passed = true;
		elm = $(elm);
		elm.get('class').split(' ').each(function(c, index) {
			if (c.substring(0,2) == 'v:') {
				if (c.substring(2,12) == 'min-length') {
					passed = passed && this.length_test(elm, 'min', c.substring(13).toInt());
				} else if (c.substring(2,12) == 'max-length') {
					passed = passed && this.length_test(elm, 'max', c.substring(13).toInt());
				} else {
					passed = passed && this.test(elm, c.substring(2));
				}
			}
		}.bind(this));
		return passed;
	},
	
	length_test: function(elm, dif, len) {
		var passed, message;
		if (dif == 'min') {
			passed = new RegExp('.{'+len+',}').test(elm.get('value').trim());
			message = this.options.translatedMessages['min-length'].replace('%len%', len);
		} else {
			passed = new RegExp('^.{0,'+len+'}$').test(elm.get('value').trim());
			message = this.options.translatedMessages['max-length'].replace('%len%', len);
		}
		this.feedback(elm, passed, message);
		return passed;
	},
	
	test: function(elm, test) {
		var passed = true;
		this.tests.each(function(t, i) {
			if (t[0] == test) {
				passed = t[2](elm);
				this.feedback(elm, passed, this.options.translatedMessages[t[0]] || t[1]);
				return;
			}
		}.bind(this));
		return passed;
	},
	
	feedback: function(elm, passed, message) {
		if (passed) {
			this.options.hideError(elm);
			elm.removeClass(this.options.failedClass);
			elm.addClass(this.options.passedClass);
		} else {
			this.options.showError(elm, message);
			elm.removeClass(this.options.passedClass);
			elm.addClass(this.options.failedClass);
		}
	}
	
});
