// $Id: requiredFields.js 2519 2009-02-09 08:41:17Z dmf $
// Just the fundamental required fields function

// Variables to be populated in the HTML
var requiredFields = new Array; //the fields' names
var fieldNames = new Array; 
var valStrings = new Array;

// On our big forms looping through all the field is slow, so let's do it only once.
var formElementIndex = new Array;
var formElementIndexInitialised = false;

function initFormElementIndex(formObject) {
	if (typeof formObject == "undefined") { formObject = document.forms[0]; }
	var lastElement = '';
	//alert ('Initialising');
	for (var i = 0; i < formObject.elements.length; i++) {
		if (formObject.elements[i].name != lastElement) {
			lastElement = formObject.elements[i].name;
			if (lastElement) { formElementIndex[lastElement] = i; }
			//alert ('formElementIndex['+lastElement+'] = '+formElementIndex[lastElement]);
		}
		//status = (i+1) + '/' + formObject.elements.length;
	}
	formElementIndexInitialised = true;
	return true;
}

// Check for population of required fields
function checkRequiredFields (formObject) { 
	var fieldCheck = true;
	var fieldFirst = "";
	var fieldValue, thisField, selIndex, gotFirstElement;
	var fieldsNeeded = "\n" + valStrings["incompleteFields"] + "\n\n\t"; 

	//alert ("Checking Required Fields");
	//alert ('typeof(formObject) is ' + typeof(formObject));
	//alert ('typeof(formObject.elements) is ' + typeof(formObject.elements));
	if (!formElementIndexInitialised) { initFormElementIndex(formObject); }
	// Loop through fields looking for empty or whitespace values, or their analogues in selects & checkboxes
	for (var fieldNum=0; fieldNum < requiredFields.length; fieldNum++) {
		thisField = (requiredFields[fieldNum].match(/[_~%].*/) ? requiredFields[fieldNum].substr(1) : requiredFields[fieldNum]);
		//alert ('thisField = ' + thisField);
		if (typeof formElementIndex[thisField] == "undefined") {
			alert ("Error: " + thisField + " doesn't exist!");
		} else {
			//alert (thisField + ' is not undefined.');
		}
		if (requiredFields[fieldNum].substr(0,1) == "_") { 
			//Then we have a select box which requires a non-null value
			//alert (thisField + ' is a select box.');
			selIndex = formObject.elements[formElementIndex[thisField]].selectedIndex;
			//alert (thisField + "'s selectedIndex is "+ selIndex);
			if (selIndex == -1) {
				fieldValue = "";
			} else {
				fieldValue = formObject.elements[formElementIndex[thisField]].options[selIndex].value;
			}
		} else if (requiredFields[fieldNum].substr(0,1) == "~") { 
			//Then we have a SINGLE checkbox which must be checked
			//Could be handled by % but the loop is slow
			fieldValue = (formObject.elements[thisField].checked ? "T" : "");
		} else if (requiredFields[fieldNum].substr(0,1) == "%") { 
			//Then we have a MULTIPLE checkbox, one of which must be checked
			gotFirstElement = fieldValue = false;
			for (var i = formElementIndex[thisField]; i < formObject.elements.length; i++) {
				if (formObject.elements[i].name == thisField) {
					fieldValue = (fieldValue || formObject.elements[i].checked);
					if (!gotFirstElement) { gotFirstElement = true; }
				} else if (gotFirstElement) {
					break;  // terminate the loop when we go on to another form element.
				}
			}
			fieldValue = (fieldValue ? "T" : "");
		} else  {
			//Then we have an ordinary input
			fieldValue = formObject.elements[formElementIndex[thisField]].value;
		}
		//alert (requiredFields[fieldNum] + " = [" + fieldValue + "]");
		if ((fieldValue == "") || (fieldValue.match(/^\s*$/))) {
			fieldsNeeded += fieldNames[fieldNum] + "\n\t"; 
			fieldCheck = false;
			if (!fieldFirst) { fieldFirst = formElementIndex[thisField]; }
		} 
	} 
	
	if (fieldCheck) {
		return true;
	} else {
		alert (fieldsNeeded);
		//alert ('About to focus formObject.elements[' + fieldFirst + ']');
		formObject.elements[fieldFirst].focus();
		return false; 
	}
}
