var controlsToValidateArr = new Array();

function createValidationMessageContainer(ctrl) {
	ctrl.valMsg = document.createElement("span");
	ctrl.valMsg.className = "validationMessage";
	ctrl.parentNode.appendChild(ctrl.valMsg);
}

function addFormValidation(form) {
	for(var i = 0; i < form.elements.length; i++) {
		if(
			form.elements[i].getAttribute("requiredErrorMessage") ||
			form.elements[i].getAttribute("emailErrorMessage") ||
			form.elements[i].getAttribute("dateErrorMessage") ||
			form.elements[i].getAttribute("numberErrorMessage") ||
			form.elements[i].getAttribute("lengthEqualErrorMessage") ||
			form.elements[i].getAttribute("lengthLessOrEqualErrorMessage")
		) {
			controlsToValidateArr[controlsToValidateArr.length] = form.elements[i];
			createValidationMessageContainer(form.elements[i]);
		}
	}
}

function validateForm(form) {
	var ctrl;
	form.firstNotValidControl = null;
	form.isValid = true;
	for(var i = 0; i < controlsToValidateArr.length; i++) {
		ctrl = controlsToValidateArr[i];

		CssClasses(ctrl).remove("invalid");
		ctrl.valMsg.style.display = "none";
		if(!isCtrlEnabled(ctrl)) continue;
		
		if(ctrl.getAttribute("emailErrorMessage"))
			if(!isEMailAddr(ctrl))
				setInvalid(ctrl, "emailErrorMessage");

		if(ctrl.getAttribute("dateErrorMessage"))
			if(!isDate(ctrl))
				setInvalid(ctrl, "dateErrorMessage");

		if(ctrl.getAttribute("lengthLessOrEqualErrorMessage"))
			if(!isLengthLessOrEqual(ctrl))
				setInvalid(ctrl, "lengthLessOrEqualErrorMessage");

		if(ctrl.getAttribute("lengthEqualErrorMessage"))
			if(!isLengthEqual(ctrl))
				setInvalid(ctrl, "lengthEqualErrorMessage");

		if(ctrl.getAttribute("numberErrorMessage"))
			if(!isNumber(ctrl))
				setInvalid(ctrl, "numberErrorMessage");

		if(ctrl.getAttribute("requiredErrorMessage"))
			if(!isNotEmpty(ctrl))
				setInvalid(ctrl, "requiredErrorMessage");
	}

	function setInvalid(ctrl, attr) {
		CssClasses(ctrl).add("invalid");
		ctrl.valMsg.innerHTML = ctrl.getAttribute(attr);
		ctrl.valMsg.style.display = "inline";
		if(!form.firstNotValidControl) form.firstNotValidControl = controlsToValidateArr[i];
		form.isValid = false;
	}
	
	if(form.isValid)
		return true;
	else {
		form.firstNotValidControl.focus();
		return false;
	}
}

function isCtrlEnabled(elem) {
	var parent = elem.parentNode;
	var disp;
	if (elem.disabled) return false;

	while (parent.tagName != "BODY") {
		if(isMSIE)
			disp = parent.currentStyle.display;
		else
			disp = getComputedStyle(parent, null).display;

		if (disp == "none")
			return false;

		parent = parent.parentNode;
	}
	return true;
}


// validates that the field value string has one or more characters in it
function isNotEmpty(elem) {
	var str = elem.value;
	var re = /.+/;
	if(!str.match(re)) return false;
	else return true;
}
//validates that the entry is a positive or negative number
function isNumber(elem) {
	var str = elem.value;
	var re = /^[-]?\d*\.?\d*$/;
	str = str.toString();
	if(!str) return true;
	if(!str.match(re)) return false;
	return true;
}
// validates that the entry is formatted as an e-mail address
function isEMailAddr(elem) {
	var str = elem.value;
    var re = /^[\w-]+(\.[\w-]+)*@([\w-]+\.)+[a-zA-Z]{2,7}$/;
	if(!str) return true;
    if(!str.match(re)) return false;
	else return true;
}
// validates that the entry is formatted as an date
// Date yyyy-mm-dd
// 1900-01-01 through 2099-12-31
// Matches invalid dates such as February 31st
function isDate(elem) {
	var str = elem.value;
    var re = /^(19|20)[0-9]{2}-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])/;
	if(!str) return true;
    if(!str.match(re)) return false;
	else return true;
}
// validates that the entry has some length
function isLengthEqual(elem) {
	var str = elem.value;
	var valLength = parseInt(elem.getAttribute("lengthEqualErrorMessage").match(/\d+/));
	if(str.length == valLength) return true;
	else return false;
}
// validates that the entry has less or some length
function isLengthLessOrEqual(elem) {
	var str = elem.value;
	var valLength = parseInt(elem.getAttribute("lengthLessOrEqualErrorMessage").match(/\d+/));
	if(str.length <= valLength) return true;
	else return false;
}
// validate that the user made a selection other than default
function isChosen(select) {
    if (select.selectedIndex == 0) {
        return false;
    } else {
        return true;
    }
}

// validate that the user has checked one of the radio buttons
function isValidRadio(radio) {
    var valid = false;
    for (var i = 0; i < radio.length; i++) {
        if (radio[i].checked) {
            return true;
        }
    }
    return false;
}