window.addEvent('domready', function(){
	var JFormValidator = new Class({
		initialize: function()
		{
			// Initialize variables
			this.handlers	= Object();
			this.custom		= Object();
	
			// Default handlers
			this.setHandler('username',
				function (value) {
					regex = new RegExp("[\<|\>|\"|\'|\%|\;|\(|\)|\&]", "i");
					return !regex.test(value);
				}
			);
	
			this.setHandler('password',
				function (value) {
					regex=/^\S[\S ]{2,98}\S$/;
					return regex.test(value);
				}
			);
	
			this.setHandler('numeric',
				function (value) {
					regex=/^(\d|-)?(\d|,)*\.?\d*$/;
					return regex.test(value);
				}
			);
	
			this.setHandler('email',
				function (value) {
					regex=/^[a-zA-Z0-9._-]+@([a-zA-Z0-9.-]+\.)+[a-zA-Z0-9.-]{2,4}$/;
					return regex.test(value);
				}
			);
			
			this.setHandler('phone',
				function (value) {
					value = value.replace(/[-\(\)\/\.+ ]/g,'');
					if (value.substring(0,2) == '00') value = value.substring(2);
					if (value.substring(0,1) == '0') value = value.substring(1);
					var y=parseInt(value);
	  			if (isNaN(y)) return false;
	   			return value==y && value.toString()==y.toString(); 
				}
			);
			
			this.setHandler('url',
				function (value) {
					if (value.substring(0,7) == 'http://') value = value.substring(7);
					regex = /^(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/;
					return regex.test(value);
				}
			);
	  
	
			// Attach to forms with class 'form-validate'
			var forms = $$('form.form-validate');
			forms.each(function(form){ this.attachToForm(form); }, this);
		},
	
		setHandler: function(name, fn, en)
		{
			en = (en == '') ? true : en;
			this.handlers[name] = { enabled: en, exec: fn };
		},
	
		attachToForm: function(form)
		{
			// Iterate through the form object and attach the validate method to all input fields.
			$A(form.elements).each(function(el){
				el = $(el);
				if ((el.getTag() == 'input' || el.getTag() == 'button') && el.getProperty('type') == 'submit') {
					if (el.hasClass('validate')) {
						el.onclick = function(){return document.formvalidator.isValid(this.form);};
					}
				} else {
					el.addEvent('blur', function(){return document.formvalidator.validate(this);});
				}
			});
		},
	
		validate: function(el)
		{
			// If the field is required make sure it has a value
			if ($(el).hasClass('required')) {
				if (!($(el).get('value'))) {
					this.handleResponse(false, el);
					return false;
				}
			}
	
			// Only validate the field if the validate class is set
			var handler = (el.className && el.className.search(/validate-([a-zA-Z0-9\_\-]+)/) != -1) ? el.className.match(/validate-([a-zA-Z0-9\_\-]+)/)[1] : "";
			if (handler == '') {
				this.handleResponse(true, el);
				return true;
			}
	
			// Check the additional validation types
			if ((handler) && (handler != 'none') && (this.handlers[handler]) && $(el).get('value')) {
				// Execute the validation handler and return result
				if (this.handlers[handler].exec($(el).get('value')) != true) {
					this.handleResponse(false, el);
					return false;
				}
			}
	
			// Return validation state
			this.handleResponse(true, el);
			return true;
		},
	
		isValid: function(form){
			var valid = true;
	
			// Validate form fields
			for (var i=0;i < form.elements.length; i++) {
				if (this.validate(form.elements[i]) == false) {
					valid = false;
				}
			}
	
			// Run custom form validators if present
			if ($(this.custom)){
				$(this.custom).each(function(validator){
					if (validator.exec() != true) {
						valid = false;
					}
				});
			}
	
			return valid;
		},
	
		handleResponse: function(state, el)
		{
			// Find the label object for the given field if it exists
			if (!(el.labelref)) {
				var labels = $$('label');
				labels.each(function(label){
					if (label.getProperty('for') == el.getProperty('id')) {
						el.labelref = label;
					}
				});
			}
	
			// Set the element and its label (if exists) invalid state
			if (state == false) {
				el.addClass('invalid');
				if (el.getParent().hasClass('input'))
					el.getParent().addClass('invalid');
				if (el.labelref) {
					$(el.labelref).addClass('invalid');
				}
				el.addEvent('change', function(){document.formvalidator.validate(el)});
			} else {
				el.removeClass('invalid');
				el.removeEvents('change');
				if (el.getParent().hasClass('input'))
					el.getParent().removeClass('invalid');
				if (el.labelref) {
					$(el.labelref).removeClass('invalid');
				}
			}
		}
	});
	document.formvalidator = new JFormValidator();
});