
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("seller", 'the website address of the online selller'),
	new RequiredField("stockno", 'the online seller\'s stock number for the diamond'),
	new RequiredField("price", 'the price of the online seller\'s diamond'),
	new RequiredField("caratwt", 'the carat weight of the diamond'),
	new RequiredField("shape", 'shape of diamond'),
	new RequiredField("diaReport", 'Diamond Report source'),
	new RequiredField("needs", 'your message'));

// -------------------------------------------------------------------------------------

//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);
}
