
requiredFields = new Array(
	new RequiredField("fname", 'your first 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 appraisal or membership needs'));

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

//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);
}

