// Dylan... In order to use this, you need to have a css class 'required' for required fields
//  and the class 'optional' for a set of fields, one of which is required
//
//  In your form, make a hidden input with the following structure:
//
//    <input type="hidden" name="required" value="field1,field2,optionalField1|optionalField2" />
//
//  That says 'field1', 'field2', and either 'optionalField1' or 'optionalField2' are required
//  NOTE: These should be the 'id' of the inputs, not necessarily the 'name'
//
//  Then put in your form:
//     <form ... onsubmit="return checkRequired(this);">
//
//  If required fields are missing, they will be highlighted with the appropriate css
//  class and the form will not be submitted.
//
var missingRequired = new Array();
var missingOptional = new Array();

// IE 5.0 fix, friggin IE 5.0
if (typeof Array.prototype.push == "undefined") {
  Array.prototype.push = function () {
		for (var i = 0; i < arguments.length; i++) {
		  this[this.length] = arguments[i];
		}
		return this.length;
  };
}

function checkRequired(myForm) {
	if (myForm.required && myForm.required.value) {

		missingRequired = resetRequiredFields(missingRequired);
		missingOptional = resetRequiredFields(missingOptional);

		var requiredFields = myForm.required.value.split(",");
		for (var i=0; i<requiredFields.length; i++) {
			var fieldName = requiredFields[i];
			if (fieldName.indexOf("?") != -1) {
				var dependantFields = fieldName.split("?");
				var master = dependantFields[0];
				if (checkValue(master)) {
					fieldName = dependantFields[1];
				} else {
					continue;
				}
			}
			if (fieldName.indexOf("|") != -1) {
				var optionalFields = fieldName.split("|");
				var noneFilled = true;
				
				for (var j=0; j<optionalFields.length; j++) {
					if (checkValue(optionalFields[j])) {
						noneFilled = false;
						break;
					}
				}
				if (noneFilled) {
					for (var j=0; j<optionalFields.length; j++) {
						missingOptional.push(optionalFields[j]);
					}
				}
			}
			else if (! checkValue(fieldName)) {
				missingRequired.push(fieldName);
			}
		}
		if (missingRequired.length > 0 || missingOptional.length > 0) {
			setRequiredFields(missingRequired, "required");
			setRequiredFields(missingOptional, "optional");


			var errorMessage = document.getElementById("missing_required");
			if (errorMessage) {
				errorMessage.style.display = "block";
				errorMessage.scrollIntoView(true);
			}
			return false;
		}
		else {
			return true;
		}
	}
	else {
		return true;
	}
}

function resetRequiredFields(fields) {
	// used only inside checkForm, do not call this function
	if (fields.length > 0) {
		for (var i=0; i<fields.length; i++) {
			var myLabel = getLabelFor(fields[i]);
			if (myLabel) {
				myLabel.className = myLabel.className.replace(/\s*(required|optional)/, "");
			}
			var myField = document.getElementById(fields[i]);
			if (myField) {
				myField.className = myField.className.replace(/\s*(required|optional)/, "");
			}
		}
	}

	fields = new Array();
	return fields;
}

function setRequiredFields(fields, className) {
	// used only inside checkForm, do not call this function
	for (var i=0; i<fields.length; i++) {

		var myLabel = getLabelFor(fields[i]);
		if (myLabel) {
			myLabel.className += " " + className;
		}
		var myField = document.getElementById(fields[i]);
		if (myField) {
			myField.className += " " + className;
      			myField.scrollIntoView(false);
		}
	}
}

function checkValue(fieldName) {
	// used only inside checkForm, do not call this function
	var myElement = document.getElementById(fieldName);
	if (myElement && myElement.style.display != "none") {
		if (myElement.type == "select-one" || myElement.type == "select-multiple") {
			for (var i=0; i<myElement.options.length; i++) {
				if (myElement.options[i].selected && myElement.options[i].value != '') {
					return true;
				}
			}
			return false;
		} else if (myElement.type == "checkbox" || myElement.type == "radio") {
			return myElement.checked;
		} else if (myElement.value == null || myElement.value.search(/\S/) == -1) {
			return false;
		}
	}
	return true;
}

var myLabels = new Array();
function getLabelFor(elementId) {
	// this is needed by checkForm() but can be used elsewhere as desired
	if (myLabels.length == 0) {
		myLabels = document.getElementsByTagName("LABEL");
	}
	for (var i=0; i<myLabels.length; i++) {
		if (myLabels[i].htmlFor == elementId) {
			return myLabels[i];
		}
	}
}

