/*
-------------------------------------------------------
VERIFIES THAT REQUIRED FIELDS ARE POPULATED
			AND
THAT FIELDS DO NOT EXCEED A MAXIMUM CHARACTER LENGTH
-------------------------------------------------------

---------INSTRUCTIONS----------------------------------
Include this VerifyRequiredFields.js file.

Tag a Field as Required:
	1. Add the attribute required to the field.
	2. Set the attribute required to the field 
	   description you want displayed to the user.

Tag a Field as NOT Required:
	1. DON'T add the attribute required to the field.
	2. Set the attribute required to "false".

-------------------------------------------------------

Tag a Field with a Character Limit:
	1. Add the attribute maxCharacters.
	2. Set the maxCharacters attribute to the maximum 
	   number of characters you want the field to hold.

Tag a Field with NO Character Limit:
	1. DON'T add the attribute maxCharacters.
	2. Set the maxCharacters attribute to "false".

--------------------------------------------------------

Check Required Fields & Maximum Character Lengths:
    1. Add "return verifyRequiredFields(FORM OBJECT);" 
	   to the onSubmit attribute of the FORM element.

HINT: IF NO VALUE IS ADDED TO required A GENERIC 
	  MESSAGE WILL BE DISPLAYED!

HINT: IF NO NUMERIC VALUE IS ADDED TO maxCharacters 
	  ATTRIBUTE THEN IT WILL BE IGNORED.
-------------------------------------------------------
*/

var attribRequired = "required";
var attribMaxChars = "maxCharacters";

function verifyRequiredFields(objForm) {
	var requiredField;
	var requiredMsg = "The form cannot be submitted.\n\n";
	var continueSubmitting = true;
	var aryChkFields = getFieldsByAttrib(objForm,attribRequired);
	objForm.setAttribute("missingRequiredFields","false");
	
	for (var i=0; i<aryChkFields.length ; i++) {
		requiredField = verifyRequiredField(aryChkFields[i]);
		if (requiredField) {
			if (requiredField.getAttribute(attribRequired).length > 0) {
				requiredMsg = requiredField.getAttribute(attribRequired) + " field is required.";
			}
			else {
				requiredMsg = "A field is required.";
			}
			window.alert(requiredMsg);
			try {
				requiredField.focus();
			}
			catch(e) {}
			continueSubmitting = false;
			objForm.setAttribute("missingRequiredFields","true");
			break;
		}
	}
	
	if (continueSubmitting) {
		continueSubmitting = verifyMaxCharacterFields(objForm);
	}
	
	return continueSubmitting;

}

function verifyRequiredField(obj) {
	var returnValue = false;
	
	//if obj is text (id) then get the actual object
	if (!obj.type) {
		obj = document.getElementById(obj);
	}
	
	//Determine object type
	switch (obj.type.toLowerCase()) {
		case "password":
			if (obj.value.replace(/\s/g,"").length <=0) {
				obj.value = "";
				returnValue = obj;
			}
			break;
		case "radio":
			var atLeastOneChecked = false;
			var objGroup = document.getElementsByName(obj.name);
			for (i=0; i < objGroup.length; i++){
				if (objGroup[i].checked) {
					atLeastOneChecked = true;
					break;
				}
			}
			if (! atLeastOneChecked) {
				returnValue = obj;
			}
			break;
		case "select-one":
			if (obj.selectedIndex <= 0) {
				returnValue = obj;				
			}
			break;
		case "text":
			if (obj.value.replace(/\s/g,"").length <=0) {
				obj.value = "";
				returnValue = obj;				
			}
			break;
		case "textarea":
			if (obj.value.replace(/\s/g,"").length <=0) {
				obj.value = "";
				returnValue = obj;
			}
			break;
		case "checkbox":
			var atLeastOneChecked = false;
			var objGroup = document.getElementsByName(obj.name);
			for (i=0; i < objGroup.length; i++){
				if (objGroup[i].checked) {
					atLeastOneChecked = true;
				}
			}
			if (! atLeastOneChecked) {
				returnValue = obj;
			}
			break;
		default:
			break;
	}
	
	return returnValue;
}

function getFieldsByAttrib(objForm,attribName) {
	var aryElementTagNames = new Array("input","select","textarea");
	var aryRequiredFields = new Array();
	var aryElements;

	for (var i=0; i<aryElementTagNames.length; i++) {
		aryElements = objForm.getElementsByTagName(aryElementTagNames[i]);
		for (var x=0; x<aryElements.length; x++) {
			//window.alert(aryElements[x].id + "\nRequired: [" + aryElements[x].getAttribute(attribName) + "]");
			if (aryElements[x].getAttribute(attribName) != null && aryElements[x].getAttribute(attribName) != "false") {
				aryRequiredFields[aryRequiredFields.length] = aryElements[x];
				//window.alert(aryRequiredFields.length + "\n" + aryRequiredFields[aryRequiredFields.length - 1].id + "\n" + aryElements[x]);
			}
		}
	}
	
	return aryRequiredFields;
}

function verifyMaxCharacterFields(objForm) {
	var maxCharsExceededField;
	var maxCharsMsg = "The form cannot be submitted.\n\n";
	var continueSubmitting = true;
	var aryChkFields = getFieldsByAttrib(objForm,attribMaxChars);
	var rng;
	objForm.setAttribute("missingRequiredFields","false");
	
	for (var i=0; i<aryChkFields.length ; i++) {
		maxCharsExceededField = verifyMaxCharacterField(aryChkFields[i]);
		if (maxCharsExceededField) {
			if (maxCharsExceededField.getAttribute(attribMaxChars).length > 0) {
				maxCharsMsg = "The maximum character length of [" + maxCharsExceededField.getAttribute(attribMaxChars) + "] for the selected field has been exceeded.";
				maxCharsMsg += "\n\nPlease reduce the current character count of " + maxCharsExceededField.value.length + " to " + maxCharsExceededField.getAttribute(attribMaxChars) + " or less.";

				window.alert(maxCharsMsg);
				try {
					maxCharsExceededField.focus();
				}
				catch(e) {}
				rng = maxCharsExceededField.createTextRange();
				rng.move('character',maxCharsExceededField.value.length);
				rng.select();
				continueSubmitting = false;
				objForm.setAttribute("missingRequiredFields","true");
				break;
			}
		}
	}
	
	return continueSubmitting;
}

function verifyMaxCharacterField(obj) {
	var returnValue = false;
	var intMaxChars;
	var objValue;

	//if obj is text (id) then get the actual object
	if (!obj.type) {
		obj = document.getElementById(obj);
	}
	
	try {
		intMaxChars = parseInt(obj.getAttribute("maxCharacters"));
		objValue = obj.value;
		
		if (obj.getAttribute("keyValue")) {
			objValue = obj.getAttribute("keyValue");
		}
		if (objValue.length > intMaxChars) {
			returnValue = obj;
		}
	}
	catch(e) {}
	
	return returnValue;
}


/*
-------------------------------------------------------
END OF VerifyRequiredFields.js
-------------------------------------------------------
*/
