/*
 * Dynamically attach the validation event to the form
 */
function validate_init() {
	var objForm;
	
	if (!document.getElementById) {return false;}
	
	// Setup the array of fields to be validated (included in page-specific file)
	if (!validate_init_fields()) {return false;}
	
	// Attach the "onsubmit" event handler to the form
	objForm = document.getElementById("frmCallbackRequest");
	if (!objForm) {return false;}
	
	objForm.onsubmit = validate_form;
	
	return (true);
} // validate_init


// Validate for any data (i.e. not whitespace)
function validate_notEmpty (strData) {
	var rxpTest = /\S+/;
	return rxpTest.test(strData);
} // validate_notEmpty



// Validate for an email address
function validate_email (strData) {
	var rxpTest = /^[^@]+@[^@.]+\.[^@]*\w\w$/;
	return rxpTest.test(strData);
} // validate_email



// Validate for a telephone number
function validate_telephone (strData) {
	var rxpTest = /^\+?[0-9 ()-]+[0-9]$/;
	return rxpTest.test(strData);
} // validate_telephone



// Validate for a number (optional minimum and maximum values)
function validate_number (dblData, dblMin, dblMax) {
	var rxpTest;
	var strData;
	
	strData = dblData.toString();

	// Strip out any commas that may be lurking in the number
	strData = strData.replace(/,/g, "");
	
	// Check whether we have anything left
	if (strData.length < 1) {
		return false;
	}
	
	// Validate the "number"
	rxpTest = /^\d*\.*\d*$/;
	if (!rxpTest.test(strData)) {
		return false;
	}
	
	dblData = strData * 1;
	
	// Check that the number falls in the required range
	if (dblMin != undefined) {
		if (dblData < dblMin) {
			return false;
		}
	}
	
	if (dblMax != undefined) {
		if (dblData > dblMax) {
			return false;
		}
	}
	
	return true;
} // validate_number



// Validate string
function validate_string (strData, intMinLength, intMaxLength) {
	var intLength = strData.length;
	if ((intLength < intMinLength) || (intLength > intMaxLength)) {
		return false;
	} else {
		return true;
	} // if - else
} // validate_string



// Validate that something is not a given string
function validate_notStringValue (strData, strTest) {
	var rxpTest = new RegExp("^" + strTest + "$");
	return (!rxpTest.test(strData));
} // validate_notStringValue


/*
 * Highlight those fields requiring attention
 *
 * @param	 	arrFields		An array of fields
 * @param		arrMessages		An array of error messages to show
 */
function validate_setHighlight(arrFields, arrMessages) {
	var objField, objDiv;
	var strClass;
	var intLoop, intLength;
	var blnReturn;
	
	blnReturn	= true;
	intLength	= arrFields.length;
	
	// Highlight the fields
	for (intLoop = 0; intLoop < intLength; intLoop++) {
		objField = document.getElementById(arrFields[intLoop]);
		
		if (!objField) {
			blnReturn = false;
		} else {
			if (objField.className) {
				objField.className += " invalid";
			} else {
				objField.className = "invalid";
			} // if - else
		} // if - else
	} // for
	
	// Show the error messages
	if (arrFields.length > 0) {
		intLength = arrMessages.length;
		for (intLoop = 0; intLoop < intLength; intLoop++) {
			objDiv = document.getElementById(arrMessages[intLoop]);
			if (!objDiv) {
				blnReturn = false;
			} else {
				objDiv.style.display = "block";
			} // if - else
		} // for
	} // if
	
	return (blnReturn);
} // validate_setHighlight


/*
 * Clear the field highlighting
 *
 * @param		arrFields		An array of fields
 * @param		arrMessages		An array of error messages to hide
 */
function validate_clearHighlight(arrFields, arrMessages) {
	var arrClasses;
	var objField, objPattern, objDiv;
	var strNewClass;
	var intLoop, intLength;
	var intClassLoop, intClassLength;
	var blnReturn;
	
	blnReturn	= true;
	intLength	= arrFields.length;
	
	for (intLoop = 0; intLoop < intLength; intLoop++) {
		objField = document.getElementById(arrFields[intLoop].id);
		
		if (!objField) {
			blnReturn = false;
		} else {
			if (objField.className) {
				arrClasses		= objField.className.split(" ");
				intClassLength	= arrClasses.length;
				strNewClass		= "";
				
				for (intClassLoop = 0; intClassLoop < intClassLength; intClassLoop++) {
					if (arrClasses[intClassLoop].toLowerCase() != "invalid") {
						strNewClass += arrClasses[intClassLoop] + " ";
					} // if
				} // for
				
				objField.className = strNewClass;
			} // if
		} // if - else
	} // for
	
	intLength = arrMessages.length;
	for (intLoop = 0; intLoop < intLength; intLoop++) {
		objDiv = document.getElementById(arrMessages[intLoop]);
		if (!objDiv) {
			blnReturn = false;
		} else {
			objDiv.style.display = "none";
		} // if - else
	} // for
	
	return (blnReturn);
} // validate_clearHighlight




// Attach a function to the window.onload event
window.onload = validate_init;