var FormValidation = new Class({

	Implements: [Options],

	element: null,
	span: null,
	telephoneRegEx:  /^[0-9\- \.\(\)\+]+$/i,

	options: {
		errorMessage: 'Field is required'
	},

	initialize: function(options, element) {
		this.element = element;
		this.setOptions(options);
		this.setupErrorMessageSpan();
		this.setupEvents();
	},

	setupErrorMessageSpan: function() {
		this.span = new Element('span');
		this.span.addClass('errorMessage');
		this.span.setStyle('display', 'block');
		var parent = this.element.getParent();
		this.span.inject(parent);
	},

	setErrorClass: function() {
		this.element.getParent().removeClass('valid');
		this.element.getParent().addClass('error');
		this.span.set('text', this.options.errorMessage);
		this.span.setStyle('display', 'block');
	},

	setValidClass: function() {
		this.element.getParent().removeClass('error');
		this.element.getParent().addClass('valid');
		this.span.set('text', '').setStyle('display', 'none');
	},

	clearValidationClass: function() {
		this.element.getParent().removeClass('error');
		this.element.getParent().removeClass('valid');
		this.span.setStyle('display', 'block');
	}

});



/* Class for required text only, no other validation checks */

var RequiredText = new Class({

	Extends: FormValidation,

	setupEvents: function() {
		this.element.addEvent('focus', function() {
			this.clearValidationClass();
		}.bind(this));

		this.element.addEvent('blur', function(){
			if (this.element.get('value') == "") {
				this.setErrorClass();
			}
			else {
				this.setValidClass();
			}
		}.bind(this));
	}

});




/* Class for required emails only */

var RequiredEmail = new Class({

	Extends: FormValidation,

	setupEvents: function() {
		this.element.addEvent('focus', function() {
			this.clearValidationClass();
		}.bind(this));

		this.element.addEvent('blur', function(){
			if (!this.isValid()) {
				this.setErrorClass();
			}
			else {
				this.setValidClass();
			}
		}.bind(this));
	},

	isValid: function() {
		if (this.element.get('value') == "") return false;
		var emailRegEx = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
		str = this.element.get('value');
		if(!str.match(emailRegEx)) return false;
		return true;
	}

});



/* Class for required telephone numbers only */

var RequiredTelephone = new Class({

	Extends: FormValidation,

	setupEvents: function() {
		this.element.addEvent('focus', function() {
			this.clearValidationClass();
		}.bind(this));

		this.element.addEvent('blur', function(){
			if (!this.isValid()) {
				this.setErrorClass();
			}
			else {
				this.setValidClass();
			}
		}.bind(this));
	},

	isValid: function() {
		if (this.element.get('value') == "") return false;
		str = this.element.get('value');
		if(!str.match(this.telephoneRegEx)) return false;
		return true;
	}

});

/* Class for optional telephone numbers only */

var OptionalTelephone = new Class({

	Extends: FormValidation,

	setupEvents: function() {
		this.element.addEvent('focus', function() {
			this.clearValidationClass();
		}.bind(this));

		this.element.addEvent('blur', function(){
			if (!this.isValid()) {
				this.setErrorClass();
			}
			else {
				if (this.element.get('value') != "") {
					this.setValidClass();
				}
				else {
					this.span.set('text', "");
				}
			}
		}.bind(this));
	},

	isValid: function() {
		if (this.element.get('value') == "") return true;
		str = this.element.get('value');
		if(!str.match(this.telephoneRegEx)) return false;
		return true;
	}

});

