var formValidation = (function(){
	var predefined = {
		required: {re: /[^.*]/, msg: "This field is required."},
		alpha: {re: /^[a-z ._-]+$/i, msg: "This field accepts alphabetic characters only."},
		alphanum: {re: /^[a-z0-9 ._-]+$/i, msg: "This field accepts alphanumeric characters only."},
		integer: {re: /^[-+]?\d+$/, msg: "Please enter a valid integer."},
		real: {re: /^[-+]?\d*\.?\d+$/, msg: "Please enter a valid number."},
		date: {re: /^((((0[13578])|([13578])|(1[02]))[\/](([1-9])|([0-2][0-9])|(3[01])))|(((0[469])|([469])|(11))[\/](([1-9])|([0-2][0-9])|(30)))|((2|02)[\/](([1-9])|([0-2][0-9]))))[\/]\d{4}$|^\d{4}$/, msg: "Please enter a valid date (mm/dd/yyyy)."},
		email: {re: /^[a-z0-9._%-]+@[a-z0-9.-]+\.[a-z]{2,4}$/i, msg: "Please enter a valid email."},
		phone: {re: /^[\d\s ().-]+$/, msg: "Please enter a valid phone."},
		url: {re: /^(http|https|ftp)\:\/\/[a-z0-9\-\.]+\.[a-z]{2,3}(:[a-z0-9]*)?\/?([a-z0-9\-\._\?\,\'\/\\\+&amp;%\$#\=~])*$/i, msg: "Please enter a valid url."},
		confirm: {msg: "Confirm Password does not match original Password."}
	};
	var forms_to_validate = [];
	return {
		init: function () {
			var forms = document.getElementsByTagName('form');
			for (forms_i=0,forms_len=forms.length; forms_i<forms_len; forms_i++) {
				if (forms[forms_i].className == 'validate') {
					forms_to_validate[forms[forms_i].name] = [[],forms[forms_i]];
					forms[forms_i].groups = [];
					var inputs = forms[forms_i].getElementsByTagName('input');
					var selects = forms[forms_i].getElementsByTagName('select');
					for (inputs_i=0,inputs_len=inputs.length; inputs_i<inputs_len; inputs_i++) {
						if (inputs[inputs_i].alt) {
							eval('var inputObject = ' + inputs[inputs_i].alt);
							if (inputObject.group) {
								if (forms[forms_i].groups && forms[forms_i].groups[inputObject.group]) {
									forms[forms_i].groups[inputObject.group][0]++;
								} else {
									forms[forms_i].groups[inputObject.group] = [1,0];
								}
							}
							forms_to_validate[forms[forms_i].name][0][forms_to_validate[forms[forms_i].name][0].length] = [inputs[inputs_i],inputObject];
						}
					}
					for (selects_i=0,selects_len=selects.length; selects_i<selects_len; selects_i++) {
						if (selects[selects_i].title) {
							eval('var inputObject = ' + selects[selects_i].title);
							if (inputObject.group) {
								if (forms[forms_i].groups[inputObject.group]) {
									forms[forms_i].groups[inputObject.group][0]++;
								} else {
									forms[forms_i].groups[inputObject.group] = [1,0];
								}
							}
							forms_to_validate[forms[forms_i].name][0][forms_to_validate[forms[forms_i].name][0].length] = [selects[selects_i],inputObject];
						}
					}
					forms[forms_i].onsubmit = function () {return formValidation.validate(this.name)}
				}
			}
		},
		validate: function (formName) {
			// CUSTOM EFFECTS START
			var f = forms_to_validate[formName][0];
			var fObj = forms_to_validate[formName][1];
			var groups = fObj.groups;
			var fail = false;
			
			for (var group in groups) groups[group][1] = false;
			
			for (fields_i=0,fields_len=f.length; fields_i<fields_len; fields_i++) {
				var field = f[fields_i][0];
				var effectElement = field.parentNode;
				var value = field.value;
				var options = f[fields_i][1];
				
				if (field.type == 'radio') {
					var radiofail = true;
					var radios = forms_to_validate[formName][1][field.name];
					for (radios_i=0,radios_len=radios.length; radios_i<radios_len; radios_i++) {
						if (radios[radios_i].checked) {
							radiofail = false;
						}
					}
					if (radiofail) {
						var field = forms_to_validate[formName][1][field.name][0];
						var effectElement = field.parentNode;
						fail = true;
						if (options.classes.length==2) {
							effectElement.className = effectElement.className.replace(' ' + options.classes[1],'').replace(options.classes[1],'').replace(' ' + options.classes[0],'').replace(options.classes[0],'');
							effectElement.className = effectElement.className.length==false?options.classes[1]:effectElement.className+' '+options.classes[1];
						}
					} else {
						if (options.classes.length==2) {
							effectElement.className = effectElement.className.replace(' ' + options.classes[1],'').replace(options.classes[1],'').replace(' ' + options.classes[0],'').replace(options.classes[0],'');
							effectElement.className = effectElement.className.length==false?options.classes[0]:effectElement.className+' '+options.classes[0];
						}
					}
				} else if ((!options.optional) || ((options.optional) && value.length > 0)) {
					if (typeof options.re == 'string') {
						if (!predefined[options.re].re.test(value)) {
							fail = true;
							if (options.classes.length==2) {
								if (options.group) {
									if (fObj.groups[options.group][0] != fObj.groups[options.group][1]) {
									effectElement.className = effectElement.className.replace(' ' + options.classes[1],'').replace(options.classes[1],'').replace(' ' + options.classes[0],'').replace(options.classes[0],'');
									effectElement.className = effectElement.className.length==false?options.classes[1]:effectElement.className+' '+options.classes[1];
									}
								} else {
									effectElement.className = effectElement.className.replace(' ' + options.classes[1],'').replace(options.classes[1],'').replace(' ' + options.classes[0],'').replace(options.classes[0],'');
									effectElement.className = effectElement.className.length==false?options.classes[1]:effectElement.className+' '+options.classes[1];
								}
								field.className = field.className.replace(' ' + options.classes[1] + '_field','').replace(options.classes[1] + '_field','').replace(' ' + options.classes[0] + '_field','').replace(options.classes[0] + '_field','');
								field.className = field.className.length==false?options.classes[1] + '_field':field.className+' '+options.classes[1] + '_field';
							}
						} else {
							if (options.classes.length==2) {
								if (options.group) {
									fObj.groups[options.group][1]++;
									if (fObj.groups[options.group][0] == fObj.groups[options.group][1]) {
									effectElement.className = effectElement.className.replace(' ' + options.classes[1],'').replace(options.classes[1],'').replace(' ' + options.classes[0],'').replace(options.classes[0],'');
									effectElement.className = effectElement.className.length==false?options.classes[0]:effectElement.className+' '+options.classes[0];
									}
								} else {
									effectElement.className = effectElement.className.replace(' ' + options.classes[1],'').replace(options.classes[1],'').replace(' ' + options.classes[0],'').replace(options.classes[0],'');
									effectElement.className = effectElement.className.length==false?options.classes[0]:effectElement.className+' '+options.classes[0];
								}
								field.className = field.className.replace(' ' + options.classes[1] + '_field','').replace(options.classes[1] + '_field','').replace(' ' + options.classes[0] + '_field','').replace(options.classes[0] + '_field','');
								field.className = field.className.length==false?options.classes[0] + '_field':field.className+' '+options.classes[0] + '_field';
							}
						}
					} else if (typeof options.re == 'object' || typeof options.re == 'function') {
						if (!options.re.test(value)) {
							fail = true;
							if (options.classes.length==2) {
								if (options.group) {
									if (fObj.groups[options.group][0] != fObj.groups[options.group][1]) {
									effectElement.className = effectElement.className.replace(' ' + options.classes[1],'').replace(options.classes[1],'').replace(' ' + options.classes[0],'').replace(options.classes[0],'');
									effectElement.className = effectElement.className.length==false?options.classes[1]:effectElement.className+' '+options.classes[1];
									}
								} else {
									effectElement.className = effectElement.className.replace(' ' + options.classes[1],'').replace(options.classes[1],'').replace(' ' + options.classes[0],'').replace(options.classes[0],'');
									effectElement.className = effectElement.className.length==false?options.classes[1]:effectElement.className+' '+options.classes[1];
								}
								field.className = field.className.replace(' ' + options.classes[1] + '_field','').replace(options.classes[1] + '_field','').replace(' ' + options.classes[0] + '_field','').replace(options.classes[0] + '_field','');
								field.className = field.className.length==false?options.classes[1] + '_field':field.className+' '+options.classes[1] + '_field';
							}
						} else {
							if (options.classes.length==2) {
								if (options.group) {
									fObj.groups[options.group][1]++;
									if (fObj.groups[options.group][0] == fObj.groups[options.group][1]) {
									effectElement.className = effectElement.className.replace(' ' + options.classes[1],'').replace(options.classes[1],'').replace(' ' + options.classes[0],'').replace(options.classes[0],'');
									effectElement.className = effectElement.className.length==false?options.classes[0]:effectElement.className+' '+options.classes[0];
									}
								} else {
									effectElement.className = effectElement.className.replace(' ' + options.classes[1],'').replace(options.classes[1],'').replace(' ' + options.classes[0],'').replace(options.classes[0],'');
									effectElement.className = effectElement.className.length==false?options.classes[0]:effectElement.className+' '+options.classes[0];
								}
								field.className = field.className.replace(' ' + options.classes[1] + '_field','').replace(options.classes[1] + '_field','').replace(' ' + options.classes[0] + '_field','').replace(options.classes[0] + '_field','');
								field.className = field.className.length==false?options.classes[0] + '_field':field.className+' '+options.classes[0] + '_field';
							}
						}
					}
				} else if ((options.optional) && value.length == 0) {
					if (options.group) {
						fObj.groups[options.group][1]++;
						if (fObj.groups[options.group][0] == fObj.groups[options.group][1]) {
						effectElement.className = effectElement.className.replace(' ' + options.classes[1],'').replace(options.classes[1],'').replace(' ' + options.classes[0],'').replace(options.classes[0],'');
						effectElement.className = effectElement.className.length==false?options.classes[0]:effectElement.className+' '+options.classes[0];
						}
					} else {
						effectElement.className = effectElement.className.replace(' ' + options.classes[1],'').replace(options.classes[1],'').replace(' ' + options.classes[0],'').replace(options.classes[0],'');
						effectElement.className = effectElement.className.length==false?options.classes[0]:effectElement.className+' '+options.classes[0];
					}
					field.className = field.className.replace(' ' + options.classes[1] + '_field','').replace(options.classes[1] + '_field','').replace(' ' + options.classes[0] + '_field','').replace(options.classes[0] + '_field','');
					field.className = field.className.length==false?options.classes[0] + '_field':field.className+' '+options.classes[0] + '_field';
				}
			}
			return fail==false?true:false;
			// CUSTOM EFFECTS END
		}
	}
})();
var oldonload = window.onload;
if (typeof window.onload != 'function') {
	window.onload = formValidation.init;
} else {
	window.onload = function() {
		oldonload();
		formValidation.init();
	}
}