

function AFormValidateForm(form) {

	var is_valid = true;

	var errors = new Array();

	var list = toArray(form.getElementsByTagName('input'));

	list = list.concat(toArray(form.getElementsByTagName('textarea')));

	list = list.concat(toArray(form.getElementsByTagName('select')));

	

	for (var j = 0; j < list.length; j++) {

		var f = list[j];

		is_valid = is_valid && AFormValidate(f, false);

		errors = errors.concat(f.validation_errors);

	}

	if (!is_valid && errors.length > 0) {

		alert(errors.join("\n"));

	}

	return is_valid;

}



function AFormValidate(element, show_popup) {

	var show_popup = (show_popup == null) ? true : show_popup;



	if (isString(element)) {

		element = getElement(element);

	}

	if (!element) {

		return false;

	}

	var val = element.value;

	var is_valid = true;

	var desc = element.resultField ? element.resultField.innerHTML : (element.name ? element.name : (element.id ? element.id : ''));

	element.validation_errors = new Array();

		

	if (element.validations.find('required')) {

		is_valid = AFormValidateRequired(val, element.orig);

		if (!is_valid) {

			element.validation_errors.push(desc + ' is required' );

		}

	}

	if (is_valid && element.attributes && element.attributes['maxlength'] && element.attributes['maxlength'].value) {

		is_valid = AFormValidateMaxLength(val, element.attributes['maxlength'].value);

		if (!is_valid) {

			element.validation_errors.push(desc + ' exeeds the maximum length of ' + element.attributes['maxlength'].value );

		}

	}

	for (var i = 0; i < element.validations.length ; i++) {

		var validation = element.validations[i];

		if (!is_valid) {

			break;

		}



		switch(validation) {

			case 'email':

				is_valid = AFormValidateEmail(val);

				if (!is_valid) {

					element.validation_errors.push(desc + ' is not a valid Email');

				}

				break;

			case 'date':

				is_valid = AFormValidateDate(val);

				if (!is_valid) {

					element.validation_errors.push(desc + ' is not a valid Date');

				}

				break;

			case 'phone':

				is_valid = AFormValidatePhone(val);

				if (!is_valid) {

					element.validation_errors.push(desc + ' is not a valid Phone #. Expecting: ###-###-####');

				}

				break;

			case 'password':

				is_valid = AFormValidatePassword(val);

				if (!is_valid) {

					element.validation_errors.push(desc + ' is not a valid Password');

				}

				break;

			case 'name':

				is_valid = AFormValidateName(val);

				if (!is_valid) {

					element.validation_errors.push(desc + ' is not a valid Name');

				}

				break;

			case 'numeric':

				is_valid = AFormValidateNumeric(val);

				if (!is_valid) {

					element.validation_errors.push(desc + ' is not a valid Number');

				}

				break;

		}

		if (is_valid) {

			if (validation.substring(0,4) == 'min-') {

				var num = parseInt(validation.substring(4));

				num = (isInteger(num)) ? num : 0;

				is_valid = AFormValidateMinLength(val, num);

				if (!is_valid) {

					element.validation_errors.push(desc + ' is shorter than the minimum length of ' + num );

				}

			}

			if (validation.substring(0,4) == 'max-') {

				var num = parseInt(validation.substring(4));

				num = (isInteger(num)) ? num : -1;

				is_valid = AFormValidateMaxLength(val, num);

				if (!is_valid) {

					element.validation_errors.push(desc + ' exeeds the maximum length of ' + num );

				}

			}

		}

	}

	// Todo

	// notify the label by changing the class.

	if (!is_valid && show_popup)	{

		alert(element.validation_errors.join("\n"));

	}

	return is_valid;

}



function AFormValidateRequired(val, orig) {

	orig = null;

	orig = (orig == null) ? '' : orig;

	return val != orig;

}





function AFormValidateMinLength(val, min) {

	return val.length >= min;

}



function AFormValidateMaxLength(val, max) {

	if (max == -1) {

		return true;

	}

	return val.length <= max;

}



function AFormValidateLength(val, min, max) {

	return AFormValidateMinLength(val, min) && AFormValidateMaxLength(val, max);

}



function AFormValidateEmail(v) {

	 var r = /^[a-zA-Z0-9._-]+@([a-zA-Z0-9.-]+\.)+[a-zA-Z0-9.-]{2,4}$/;

	 return r.test(v);

}



function AFormValidateDate(v) {

	 var r = /(((0[13578]|10|12)([-.\/])(0[1-9]|[12][0-9]|3[01])([-.\/])(\d{4}))|((0[469]|11)([-.\/])([0][1-9]|[12][0-9]|30)([-.\/])(\d{4}))|((2)([-.\/])(0[1-9]|1[0-9]|2[0-8])([-.\/])(\d{4}))|((2)(\.|-|\/)(29)([-.\/])([02468][048]00))|((2)([-.\/])(29)([-.\/])([13579][26]00))|((2)([-.\/])(29)([-.\/])([0-9][0-9][0][48]))|((2)([-.\/])(29)([-.\/])([0-9][0-9][2468][048]))|((2)([-.\/])(29)([-.\/])([0-9][0-9][13579][26])))/;

	 return r.test(v);

}



function AFormValidatePhone(v) {

	 var r = /^(\d{3}-\d{3}-\d{4})*$/;

	 return r.test(v);

}



function AFormValidatePassword(v) {

	 var r = /^[a-zA-Z]\w{3,14}$/;

	 return r.test(v);

}



function AFormValidateName(v) {

	 var r = /^([a-zA-z\s]{4,32})$/;

	 return r.test(v);

}



function AFormValidateNumeric(v) {

	 var r = /^(\d|-)?(\d|,)*\.?\d*$/;

	 return r.test(v);

}



function AFormValidateAllForms() {



	if (document.getElementsByTagName) {

		var forms = document.getElementsByTagName('form');



		for (var i = 0; i < forms.length; i++) {

			var form = forms[i];

			form.onsubmit = function(e) { return AFormValidateForm(getTarget(e)) };

			

			var labels = new Object();



			var list = form.getElementsByTagName('label');

			for ( var j = 0; j < list.length; j++) {

				var label = list[j];

				if (label.attributes && label.attributes['for'] && label.innerHTML) {

					var id = label.attributes['for'].value;

					labels[id] = label;

				}

			}



			var list = toArray(form.getElementsByTagName('input'));

			list = list.concat(toArray(form.getElementsByTagName('textarea')));

			list = list.concat(toArray(form.getElementsByTagName('select')));

			for ( var j = 0; j < list.length; j++) {

				var f = list[j];

				if (f.id && labels[f.id]) {

					f.resultField = labels[f.id];

				}

				if (f.className) {

					f.validations = f.className.split(' ');

				} else {

					f.validations = new Array();

				}

				f.orig = f.value;

				//addEvent(f, 'change', function(e) { return AFormValidate(getTarget(e)); });

			}

		}

	}

}



addEvent(window, 'load', AFormValidateAllForms);