
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("addr", 'your address'),
	new RequiredField("csz", 'your city state and zip'),
	new RequiredField("needs", 'your consultation needs'));

// -------------------------------------------------------------------------------------

//alert(badEmail + ' does not appear to be valid.\n\nPlease enter a valid e-mail address to continue.');
//alert(badZipcode + ' does not appear to be valid.\n\nPlease enter a zip code of the form NNNNN or NNNNN-NNNN 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['zipcode'] = check_zipcode;
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_zipcode(possibleZipcode)
{
	if (possibleZipcode.length == 5 && check_number(possibleZipcode)) return true;
	else if (possibleZipcode.length == 10)
	{
		var pos = possibleZipcode.indexOf('-');
		if (pos == -1 || pos == possibleZipcode.length - 1) return false;
		return (check_number(possibleZipcode.substring(0, pos)) && check_number(possibleZipcode.substring(pos + 1)));
	}
	return false;
}

function check_phone(possiblePhoneNumber)
{
	if (possiblePhoneNumber == null || possiblePhoneNumber == '') return false;

	// allow numbers, +, -, (, ), / and .
	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);
}
