var bCancel = false;

function validate(form)
{
	var errorText = document.getElementById('errorText');
	errorText.innerHTML = '';
	return validateForm(form);
}

function validateForm(form)
{
	var bValid = false;
	if (bCancel)
	{
		bValid = true;
	}
	else 
	{
		var result = validateRequired(form) & validateFixedLengthNumeric(form) & validateNumeric(form) & validateEmail(form);
		bValid = (result == 1);
	}
	return bValid;
} 

function requestForm_required ()
{
	this.a0 = new Array("realname", "Name is required.", new Function ("varName", " return this[varName];"));
	this.a1 = new Array("PhoneAreaCode", "Phone Number Area Code is required.", new Function ("varName", " return this[varName];"));
	this.a2 = new Array("PhonePrefix", "Phone Number Prefix is required.", new Function ("varName", " return this[varName];"));
	this.a3 = new Array("PhoneSuffix", "Phone Number Suffix is required.", new Function ("varName", " return this[varName];"));
	this.a4 = new Array("email", "Email Address is required.", new Function ("varName", " return this[varName];"));
	this.a5 = new Array("Comments", "Tell Us What You Need is required.", new Function ("varName", " return this[varName];"));
}

function requestForm_FixedLengthNumericValidations ()
{ 
	this.a0 = new Array("Zipcode", "Zip Code must be 5 digits.", new Function ("varName", "this.length='5';  return this[varName];"));
	this.a1 = new Array("ZipcodeExt", "Zip Code Extension must be 4 digits.", new Function ("varName", "this.length='4';  return this[varName];"));
	this.a2 = new Array("PhoneAreaCode", "Phone Number Area Code must be 3 digits.", new Function ("varName", "this.length='3';  return this[varName];"));
	this.a3 = new Array("PhonePrefix", "Phone Number Prefix must be 3 digits.", new Function ("varName", "this.length='3';  return this[varName];"));
	this.a4 = new Array("PhoneSuffix", "Phone Number Suffix must be 4 digits.", new Function ("varName", "this.length='4';  return this[varName];"));
} 

function requestForm_NumericValidations ()
{ 
	this.a0 = new Array("PhoneExt", "Phone Number Extension must be numeric.", new Function ("varName", " return this[varName];"));
} 

function requestForm_email ()
{ 
	this.a0 = new Array("email", "Email Address is invalid.", new Function ("varName", " return this[varName];"));
}

function handleErrors(messages)
{
	var errorText = document.getElementById('errorText');
	if (errorText.innerHTML != '')
	{
		errorText.innerHTML += '<br>';
	}
	errorText.innerHTML += messages.join('<br>');
}

function validateRequired(form)
{
	var isValid = true;
	var focusField = null;
	var i = 0;
	var messages = new Array();
	var formName = form.getAttributeNode("name");

	oRequired = eval('new ' + formName.value + '_required()');

	for (x in oRequired) {
		var field = form[oRequired[x][0]];

		if ((field.type == 'hidden' ||
			field.type == 'text' ||
			field.type == 'textarea' ||
			field.type == 'file' ||
			field.type == 'checkbox' ||
			field.type == 'select-one' ||
			field.type == 'password') &&
			field.disabled == false) {

			var value = '';
			// get field's value
			if (field.type == "select-one") {
				var si = field.selectedIndex;
				if (si >= 0) {
					value = field.options[si].value;
				}
			} else if (field.type == 'checkbox') {
				if (field.checked) {
					value = field.value;
				}
			} else {
				value = field.value;
			}

			if (trim(value).length == 0) {

				if (i == 0) {
					focusField = field;
				}
				messages[i++] = oRequired[x][1];
				isValid = false;
			}
		} else if (field.type == "select-multiple") { 
			var numOptions = field.options.length;
			lastSelected=-1;
			for(loop=numOptions-1;loop>=0;loop--) {
				if(field.options[loop].selected) {
					lastSelected = loop;
					value = field.options[loop].value;
					break;
				}
			}
			if(lastSelected < 0 || trim(value).length == 0) {
				if(i == 0) {
					focusField = field;
				}
				messages[i++] = oRequired[x][1];
				isValid=false;
			}
		} else if ((field.length > 0) && (field[0].type == 'radio' || field[0].type == 'checkbox')) {
			isChecked=-1;
			for (loop=0;loop < field.length;loop++) {
				if (field[loop].checked) {
					isChecked=loop;
					break; // only one needs to be checked
				}
			}
			if (isChecked < 0) {
				if (i == 0) {
					focusField = field[0];
				}
				messages[i++] = oRequired[x][1];
				isValid=false;
			}
		}
	}
	if (messages.length > 0) {
	   focusField.focus();
	   handleErrors(messages);
	}
	return isValid;
}

// Trim whitespace from left and right sides of s.
function trim(s) {
	return s.replace( /^\s*/, "" ).replace( /\s*$/, "" );
}

function validateFixedLengthNumeric(form)
{
	var bValid = true;
	var focusField = null;
	var i = 0;
	var messages = new Array();
	var formName = form.getAttributeNode("name"); 

	oFixedLengthNumeric = eval('new ' + formName.value + '_FixedLengthNumericValidations()');
	for (x in oFixedLengthNumeric) {
		var field = form[oFixedLengthNumeric[x][0]];

		if ((field.type == 'hidden' ||
			field.type == 'text' ||
			field.type == 'textarea' ||
			field.type == 'select-one' ||
			field.type == 'radio') &&
			field.disabled == false) {

			var value = '';
			// get field's value
			if (field.type == "select-one") {
				var si = field.selectedIndex;
				if (si >= 0) {
					value = field.options[si].value;
				}
			} else {
				value = field.value;
			}

			if (value.length > 0) {

				if (!isAllDigits(value)) {
					bValid = false;
					if (i == 0) {
						focusField = field;
					}
					messages[i++] = oFixedLengthNumeric[x][1];

				} else {
					var iLength = parseInt(oFixedLengthNumeric[x][2]("length"));
					if ((trim(field.value).length > 0) && (field.value.length != iLength)) {
						if (i == 0) {
							focusField = field;
						}
						messages[i++] = oFixedLengthNumeric[x][1];
						isValid = false;
					}
			   }
		   }
		}
	}
	if (messages.length > 0) {
	   focusField.focus();
	   handleErrors(messages);
	}
	return bValid;
}

function validateNumeric(form)
{
	var bValid = true;
	var focusField = null;
	var i = 0;
	var messages = new Array();
	var formName = form.getAttributeNode("name"); 

	oNumeric = eval('new ' + formName.value + '_NumericValidations()');
	for (x in oNumeric) {
		var field = form[oNumeric[x][0]];

		if ((field.type == 'hidden' ||
			field.type == 'text' ||
			field.type == 'textarea' ||
			field.type == 'select-one' ||
			field.type == 'radio') &&
			field.disabled == false) {

			var value = '';
			// get field's value
			if (field.type == "select-one") {
				var si = field.selectedIndex;
				if (si >= 0) {
					value = field.options[si].value;
				}
			} else {
				value = field.value;
			}

			if (value.length > 0) {
				if (!isAllDigits(value)) {
					bValid = false;
					if (i == 0) {
						focusField = field;
					}
					messages[i++] = oNumeric[x][1];
				}
		   }
		}
	}
	if (messages.length > 0) {
	   focusField.focus();
	   handleErrors(messages);
	}
	return bValid;
}

function isAllDigits(argvalue)
{
	argvalue = argvalue.toString();
	var validChars = "0123456789";
	var startFrom = 0;
	if (argvalue.substring(0, 2) == "0x") {
	   validChars = "0123456789abcdefABCDEF";
	   startFrom = 2;
	} else if (argvalue.charAt(0) == "-") {
		startFrom = 1;
	}

	for (var n = startFrom; n < argvalue.length; n++) {
		if (validChars.indexOf(argvalue.substring(n, n+1)) == -1) return false;
	}
	return true;
}

function validateEmail(form)
{
	var bValid = true;
	var focusField = null;
	var i = 0;
	var messages = new Array();
	var formName = form.getAttributeNode("name");

	oEmail = eval('new ' + formName.value + '_email()');

	for (x in oEmail) {
		var field = form[oEmail[x][0]];
		if ((field.type == 'hidden' || 
			 field.type == 'text' ||
			 field.type == 'textarea') &&
			(field.value.length > 0) &&
			field.disabled == false) {
			if (!checkEmail(field.value)) {
				if (i == 0) {
					focusField = field;
				}
				messages[i++] = oEmail[x][1];
				bValid = false;
			}
		}
	}
	if (messages.length > 0) {
		focusField.focus();
		handleErrors(messages);
	}
	return bValid;
}

function checkEmail(emailStr)
{
   if (emailStr.length == 0) {
	   return true;
   }
   var emailPat=/^(.+)@(.+)$/;
   var specialChars="\\(\\)<>@,;:\\\\\\\"\\.\\[\\]";
   var validChars="\[^\\s" + specialChars + "\]";
   var quotedUser="(\"[^\"]*\")";
   var ipDomainPat=/^(\d{1,3})[.](\d{1,3})[.](\d{1,3})[.](\d{1,3})$/;
   var atom=validChars + '+';
   var word="(" + atom + "|" + quotedUser + ")";
   var userPat=new RegExp("^" + word + "(\\." + word + ")*$");
   var domainPat=new RegExp("^" + atom + "(\\." + atom + ")*$");
   var matchArray=emailStr.match(emailPat);
   if (matchArray == null) {
	   return false;
   }
   var user=matchArray[1];
   var domain=matchArray[2];
   if (user.match(userPat) == null) {
	   return false;
   }
   var IPArray = domain.match(ipDomainPat);
   if (IPArray != null) {
	   for (var i = 1; i <= 4; i++) {
		  if (IPArray[i] > 255) {
			 return false;
		  }
	   }
	   return true;
   }
   var domainArray=domain.match(domainPat);
   if (domainArray == null) {
	   return false;
   }
   var atomPat=new RegExp(atom,"g");
   var domArr=domain.match(atomPat);
   var len=domArr.length;
   if ((domArr[domArr.length-1].length < 2) ||
	   (domArr[domArr.length-1].length > 3)) {
	   return false;
   }
   if (len < 2) {
	   return false;
   }
   return true;
}

