
requiredFields = new Array(
	new RequiredField("fname", 'your first name'),
	new RequiredField("lname", 'your last name'),
	new RequiredField("phoneac", 'your area code', 'number', 3),
	new RequiredField("phonepre", 'your phone number prefix', 'number', 3),
	new RequiredField("phonenum", 'your phone number\'s last 4 digits', 'number', 4),
	new RequiredField("email", 'your email address', 'email'),
	new RequiredField("needs", 'your message'));

// -------------------------------------------------------------------------------------

//alert(badEmail + ' does not appear to be valid.\n\nPlease enter a valid e-mail address to continue.');
//alert(badNumeric + ' is not all numbers.\n\nPlease enter only numbers in that field to continue.');

validationTypes = new Object();
validationTypes['email'] = check_email;
validationTypes['number'] = check_number;
validationTypes['string'] = check_string;
validationTypes['phone'] = check_phone;

function validate_form(formName)
{
	var form = document.forms[formName];
	var missingFields = new Array();
	var invalidFields = new Array();

	for (var i = 0; i < requiredFields.length; ++i)
	{
		var fieldName = requiredFields[i].fieldName;
		var field = form.elements[fieldName];
		if (!field) continue;

		var value = '';
		if (field.type == 'text' || field.type == 'textarea') value = field.value;
		else if (field[0] && field[0].type == 'radio') value = value_of_radio(field);
		else if (field.type == 'select-one' || field.type == 'select-multiple')
		{
			if (field.selectedIndex == -1)
			{
				missingFields[missingFields.length] = requiredFields[i].description;
				continue;
			}
			value = field.options[field.selectedIndex].value;
		}

		if (value == '')
			missingFields[missingFields.length] = requiredFields[i].description;
		else
		{
			var validationType = requiredFields[i].validationType;
			var minLength = requiredFields[i].minLength;
			var validationFunction = validationTypes[validationType];
			if (!validationFunction(value) || (minLength > 0 && value.length < minLength))
				invalidFields[invalidFields.length] = requiredFields[i].description;
		}
	}

	var msg = '';
	if (missingFields.length > 0)
	{
		if (missingFields.length == 1) msg = 'A required field was not filled in.\n\n';
		else msg = 'Some required fields were not filled in.\n\n';
		msg += 'Please enter ' + list_fields(missingFields) + ' to continue.';
	}
	else if (invalidFields.length > 0)
	{
		if (invalidFields.length == 1) msg = 'A field was not formatted correctly.\n\n';
		else msg = 'Some fields were not formatted correctly.\n\n';
		msg += 'Please re-enter ' + list_fields(invalidFields) + ' in the proper format to continue.';
	}

	if (msg.length == 0) return true;
	alert(msg);
	return false;
}

function list_fields(array)
{
	var fields = '';
	var len = array.length - 1;
	for (var i = 0; i <= len; ++i)
	{
		if (i) fields += ', ';
		if (len > 0 && i == len) fields += 'and ';
		fields += array[i];
	}

	return fields;
}

function check_email(possibleEmailAddress)
{
	if (possibleEmailAddress == null || possibleEmailAddress == '') return false;
	if (/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test(possibleEmailAddress)) return true;
	return false;
}


function check_phone(possiblePhoneNumber)
{
	if (possiblePhoneNumber == null || possiblePhoneNumber == '') return false;

	// allow numbers
	var validChars = '0123456789';

	var digits = '';
	for (var i = 0; i < possiblePhoneNumber.length; ++i)
	{
		var ch = possiblePhoneNumber.charAt(i);
		if (validChars.indexOf(ch) == -1) return false;
		if (!isNaN(parseInt(ch, 10))) digits += '' + ch;
	}

	// there must be at least 7 digits for a US phone number
	//if (digits.length < 7) return false;

	return true;
}

// min/max length, min/max value
function check_number(possibleNumber)
{
	if (possibleNumber == null || possibleNumber == '') return false;
	if (/^\d*$/.test(possibleNumber)) return true;
	return false;
}

function check_string(possibleString)
{
	return true;
}

function value_of_radio(radioObj)
{
	for (var i = 0; i < radioObj.length; ++i)
		if (radioObj[i].checked) return radioObj[i].value;

	return '';
}

// validationType is optional (default is string), minLength is optional
function RequiredField(fieldName, description, validationType, minLength)
{
	this.fieldName = fieldName;
	this.description = description;
	this.validationType = (validationType ? validationType : 'string');
	this.minLength = (minLength ? minLength : 0);
}
