/**
 * Validation functions.
 *
 * @version $Revision: #1 $ $Date: 2011/09/22 $
 * @author spensr
 * @author $Author: james.gennoy $
 */

var haveErrors = 0;

/**
 * Convenience method used to determine if any validation errors have occured.
 * @param errors A boolean value which determines if a validation error has occured.
 */
function isError(errors) {
	if (!haveErrors && errors) haveErrors = errors;
}

function get(elementId) {
	return document.getElementById(elementId);
}

/**
 * Determines if an date is valid.
 * Example: isDate("date", "errorMessage", "Not a valid date, must be mm/dd/yyyy");
 * @param elementId The id of the element being validated.
 * @param errorMessage The error message to display if the validation fails.
 * @param errorId The id of the element containing error messages. If null, it will default to elementId + "Error".
 * @return true if the date is valid; false otherwise.
 */
function isDate(elementId, errorMessage, errorId) {
	var aElement = get(elementId);
	var aElementLabel = get(elementId + "Label");
	aElementLabel.className = "";
	var error;
	if (errorId != null) {
		error = get(errorId);
	} else {
		error = get(elementId + "Error");
	}
	error.className = "";
	error.innerHTML = "";
	if (/^\d{1,2}(\/)\d{1,2}\1\d{4}$/.test(aElement.value)) {
		var aDate = new Date(aElement.value);
		if (!aDate || aDate == null || aDate == 'Invalid Date' || aDate == 'NaN') {
			error.className = "errorMessage";
			error.innerHTML = errorMessage;
			aElementLabel.className = "validate";
			isError(true);
			return false;
		} else {
			return true;
		}
	} else {
		error.className = "errorMessage";
		error.innerHTML = errorMessage;
		aElementLabel.className = "validate";
		isError(true);
		return false;
	}
}

/**
 * Determines if an email address is valid.
 * Example: isEmail("email", "errorMessage", "Not a valid email address");
 * @param elementId The id of the element being validated.
 * @param errorMessage The error message to display if the validation fails.
 * @param errorId The id of the element containing error messages. If null, it will default to elementId + "Error".
 * @return true if the email address is valid; false otherwise.
 */
function isEmail(elementId, errorMessage, errorId) {
	var aElement = get(elementId);
	var aElementLabel = get(elementId + "Label");
	aElementLabel.className = "";
	var error;
	if (errorId != null) {
		error = get(errorId);
	} else {
		error = get(elementId + "Error");
	}
	error.className = "";
	error.innerHTML = "";
	if (/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test(aElement.value)) {
		return true;
	} else {
		error.className = "errorMessage";
		error.innerHTML = errorMessage;
		aElementLabel.className = "validate";
		isError(true);
		return false;
	}
}

/**
 * Determines if a string is empty based on its length.
 * Example: isEmpty("field", "errorMessage", "The string is empty");
 * @param elementId The id of the element being validated.
 * @param errorMessage The error message to display if the validation fails.
 * @param errorId The id of the element containing error messages. If null, it will default to elementId + "Error".
 * @return true if the string is empty; false otherwise.
 */
function isEmpty(elementId, errorMessage, errorId) {
	var aElement = get(elementId);
	var aElementLabel = get(elementId + "Label");
	aElementLabel.className = "";
	var error;
	if (errorId != null) {
		error = get(errorId);
	} else {
		error = get(elementId + "Error");
	}
	error.className = "";
	error.innerHTML = "";
	if (aElement.options) {
		if (aElement.options.length == 0) {
			error.className = "errorMessage";
			error.innerHTML = errorMessage;
			aElementLabel.className = "validate";
			isError(true);
			return true;
		}
	} else if (aElement.value.length < 1) {
		error.className = "errorMessage";
		error.innerHTML = errorMessage;
		aElementLabel.className = "validate";
		isError(true);
		return true;
	} else {
		return false;
	}
}

/**
 * Determines if two strings are equal to each other.
 * Example: isEqual("field", "field2", "errorMessage", "The two values are not equal");
 * @param elementId The id of the element being validated.
 * @param elementId2 The id of the second element being validated.
 * @param errorMessage The error message to display if the validation fails.
 * @param errorId The id of the element containing error messages. If null, it will default to elementId + "Error".
 * @return true if the strings are equal; false otherwise.
 */
function isEqual(elementId, elementId2, errorMessage, errorId) {
	var aElement = get(elementId);
	var aElementLabel = get(elementId + "Label");
	var aElement2 = get(elementId2);
	var aElementLabel2 = get(elementId2 + "Label");
	aElementLabel.className = "";
	aElementLabel2.className = "";
	var error;
	if (errorId != null) {
		error = get(errorId);
	} else {
		error = get(elementId + "Error");
	}
	error.className = "";
	error.innerHTML = "";
	if (aElement.value == aElement2.value && aElement.value.length > 0) {
		return true;
	} else {
		error.className = "errorMessage";
		error.innerHTML = errorMessage;
		aElementLabel.className = "validate";
		aElementLabel2.className = "validate";
		isError(true);
		return false;
	}
}

/**
 * Determines if a string's length is within the supplied range.
 * Example: isInLengthRange(0, 5, "field", "errorMessage", "The string must be within 0 and 5 characters in length");
 * @param begin The beginning length range value.
 * @param end The ending length range value.
 * @param elementId The id of the element being validated.
 * @param errorMessage The error message to display if the validation fails.
 * @param errorId The id of the element containing error messages. If null, it will default to elementId + "Error".
 * @return true if the string is in the length range; false otherwise.
 */
function isInLengthRange(begin, end, elementId, errorMessage, errorId) {
	var aElement = get(elementId);
	var aElementLabel = get(elementId + "Label");
	aElementLabel.className = "";
	var error;
	if (errorId != null) {
		error = get(errorId);
	} else {
		error = get(elementId + "Error");
	}
	error.className = "";
	error.innerHTML = "";
	if (aElement.value.length >= begin && aElement.value.length <= end) {
		return true;
	} else {
		error.className = "errorMessage";
		error.innerHTML = errorMessage;
		aElementLabel.className = "validate";
		isError(true);
		return false;
	}
}

/**
 * Determines if a string is numeric.
 * Example: isNumeric("field", "errorMessage", "Not a valid number");
 * @param elementId The id of the element being validated.
 * @param errorMessage The error message to display if the validation fails.
 * @param errorId The id of the element containing error messages. If null, it will default to elementId + "Error".
 * @return true if the string is numeric; false otherwise.
 */
function isNumeric(elementId, errorMessage, errorId) {
    var aElement = get(elementId);
	var aElementLabel = get(elementId + "Label");
	aElementLabel.className = "";
	var error;
	if (errorId != null) {
		error = get(errorId);
	} else {
		error = get(elementId + "Error");
	}
	error.className = "";
	error.innerHTML = "";
	if (/[^0-9]/.test(aElement.value) || aElement.value.length == 0) {
		error.className = "errorMessage";
		error.innerHTML = errorMessage;
	   	aElementLabel.className = "validate";
	   	isError(true);
		return false;
	} else {
	   	return true;
	}
}

/**
 * Determines if a string is a valid zip code.
 * Example: isZip("field", "errorMessage", "Not a valid zip code");
 * @param elementId The id of the element being validated.
 * @param errorMessage The error message to display if the validation fails.
 * @param errorId The id of the element containing error messages. If null, it will default to elementId + "Error".
 * @return true if the string is a valid zip code; false otherwise.
 */
function isZip(elementId, errorMessage, errorId) {
	var aElement = get(elementId);
	var aElementLabel = get(elementId + "Label");
	aElementLabel.className = "";
	var error;
	if (errorId != null) {
		error = get(errorId);
	} else {
		error = get(elementId + "Error");
	}
	error.className = "";
	error.innerHTML = "";
	if (/(^\d{5}$)|(^\d{5}-\d{4}$)/.test(aElement.value)) {
		return true;
	} else {
		error.className = "errorMessage";
		error.innerHTML = errorMessage;
		aElementLabel.className = "validate";
		isError(true);
		return false;
	}
}

