var bCancel = false;

function validateVolvoInformationForm(form)
{
	if (bCancel)
		return true;
    else
		var formValidationResult;
       	formValidationResult = validateRequired(form) && validateMask(form) && validateMinLength(form) && validateMaxLength(form) && validateDate(form) && checkrequiredradiobuttons(form) && validateotherfieldsintheform(form) && validateEmail(form);
    	return (formValidationResult == 1);
}

	function validateotherfieldsintheform(frm)
	{
		var isValid = true;
		var fields = new Array();
	 	var i = 0;

		if(frm.company[1].checked==true)
		{
			if(frm.company_name.value=="")
			{
				isValid = false;
    			frm.company_name.focus();
    			fields[i++] = "Company name is required.";
			}
		}

		if(frm.rep_call[0].checked==true)
		{

			if(frm.contact_method[0].checked==false && frm.contact_method[1].checked==false && frm.contact_method[2].checked==false)
			{
				isValid = false;
    			frm.specify_from.focus();
    			fields[i++] = "Contact Method is required.";
			}

			if(frm.contact_method[0].checked==true ||  frm.contact_method[2].checked==true )
			{
				if(frm.time_to_call[0].checked==false && frm.time_to_call[1].checked==false && frm.time_to_call[2].checked==false)
				{
					isValid = false;
    				frm.specify_from.focus();
    				fields[i++] = "Time to call is required.";
    			}
			}

			if(frm.time_to_call[0].checked==true || frm.time_to_call[1].checked==true || frm.time_to_call[2].checked==true)
			{
				if(frm.time_to_call[2].checked==true)
				{
					if(frm.specify_from.value=="")
					{
						isValid = false;
    					frm.specify_from.focus();
    					fields[i++] = "Please specify the other time to call (FROM TIME).";
    				}
					if(frm.specify_to.value=="")
					{
						isValid = false;
    					frm.specify_to.focus();
    					fields[i++] = "Please specify the other time to call (TO TIME).";
    				}
				}
			}

			if(frm.contact_method[0].checked==true || frm.contact_method[1].checked==true || frm.contact_method[2].checked==true)
			{
				if(frm.contact_method[1].checked==true || frm.contact_method[2].checked==true)
				{
					if(frm.email.value=="")
					{
						isValid = false;
    					frm.email.focus();
    					fields[i++] = "Please provide email address to contact you by email.";
    				}
				}
				if(frm.contact_method[0].checked==true || frm.contact_method[2].checked==true)
				{
					var phone = frm.area_code.value + frm.prefix.value + frm.suffix.value
					if(phone.length  != 10)
					{
						isValid = false;
    					frm.area_code.focus();
    					fields[i++] = "Please provide 10 digit phone number to contact you by phone.";
    				}
				}
			}
		}


		if(frm.purchased_already[0].checked==true)
		{
			if(frm.model.selectedIndex == 0)
			{
				isValid = false;
    			frm.model.focus();
    			fields[i++] = "Please select a Volvo Model from the list.";
    		}
			if(frm.vin.value=="")
			{
				isValid = false;
    			frm.vin.focus();
    			fields[i++] = "Please enter the Vehicle Identification Number of the Volvo vehicle.";
    		}

    		if(frm.vin.value != "")
    		{
    			if (frm.vin.value.length != 17)
				{
		  			isValid = false;
		  			frm.vin.focus();
		  			fields[i++] = "Please enter  17 characters in the Vehicle Identification Number."
				}

				if (!validateVin(frm.vin.value))
				{
		  			isValid = false;
		  			frm.vin.focus();
		  			fields[i++] = "Please enter a valid Vehicle Identification Number."
				}

				if(frm.vin.value.substring(9,10) != 4 )
				{
					if(frm.vin.value.substring(9,10) != 5)
					{
						isValid = false;
		  				frm.vin.focus();
		  				fields[i++] = "Only 2004 AND 2005 model year vehicles are eligible."
					}
				}
			}

			if(frm.sale_date.value=="")
			{
				isValid = false;
		  		frm.sale_date.focus();
		  		fields[i++] = "Enter the Vehicle Sale Date."
			}
		}

		if(frm.volvo_rep_call.checked==true)
		{
			if(frm.email.value=="")
			{
				isValid = false;
    			frm.email.focus();
    			fields[i++] = "Please provide email address to contact you by email.";
    		}
		}

/*
		if(frm.volvo_rep_call[0].checked==true)
		{
			if(frm.volvo_contact_method[0].checked==false && frm.volvo_contact_method[1].checked==false && frm.volvo_contact_method[2].checked==false)
			{
				isValid = false;
    			frm.comments.focus();
    			fields[i++] = "Please indicate how we may contact you for Volvo promotions.";
    		}

			if(frm.volvo_contact_method[0].checked==true || frm.volvo_contact_method[2].checked==true)
    		{
				if(frm.email.value=="")
				{
					isValid = false;
    				frm.email.focus();
    				fields[i++] = "Please provide email address to contact you by email.";
    			}
    		}
		}
*/

		var val = frm.comments.value;
		var len = val.length;
		if(len > 200)
		{
	 		isValid = false;
	 		frm.comments.focus();
	 		fields[i++] = "Cannot enter more than 200 characters in comments."
		}

     	if (fields.length > 0)
     	{
       		alert(fields.join('\n'));
     	}

		return isValid;
	}

	function validateVin(vin)
	{
		var checkOK = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghjklmnpqrstuvwxyz0123456789";
		var checkStr = vin;
		var allValid = true;
		var theLength = checkStr.length;
		var good_num = true;

		for (i = 0;  i < checkStr.length;  i++)
		{
			ch = checkStr.charAt(i);
		    for (j = 0;  j < checkOK.length;  j++)
				if (ch == checkOK.charAt(j))
					break;
		    	if (j == checkOK.length)
				{
					allValid = false;
					break;
				}
		}

		return allValid;
	}

	function checkrequiredradiobuttons (frm)
	{
	 var btn = null
	 var isValid = true;
	 var fields = new Array();
	 var i = 0
	 btn = checkradioButton(frm.company);

	 if (btn == null)
	 {
    	isValid = false;
    	frm.first_name.focus();
    	fields[i++] = "Individual or Company is required.";
	 }

	 btn = checkradioButton(frm.purchased_already);

	 if (btn == null)
	 {
    	isValid = false;
    	frm.vin.focus();
    	fields[i++] = "Purchased already is required.";
	 }

	 btn = checkradioButton(frm.rep_call);

	 if (btn == null)
	 {
    	isValid = false;
    	frm.area_code.focus();
    	fields[i++] = "Volvo Representative to call is required.";
	 }

	 //btn = checkradioButton(frm.volvo_rep_call);

	 //if (btn == null)
	 //{
    //	isValid = false;
    //	frm.comments.focus();
    //	fields[i++] = "Receive information about Volvo is required.";
	 //}

     if (fields.length > 0)
     {
       alert(fields.join('\n'));
     }

	 return isValid;
	}

	function checkradioButton(btn)
	{
		var cnt = -1;
		for (var i=0; i < btn.length; i++)
		{
   			if (btn[i].checked) {cnt = i; i = btn.length;}
   		}
		if (cnt > -1) return btn[cnt].value;
		else return null;
	}

    function required () {
     this.a0 = new Array("title", "Title is required.", new Function ("varName", " return this[varName];"));
     this.a1 = new Array("first_name", "First name is required.", new Function ("varName", "this.mask=/^[ \\.\\-a-zA-Z]*$/;  return this[varName];"));
     this.a2 = new Array("last_name", "Last name is required.", new Function ("varName", "this.mask=/^[ \\.\\-a-zA-Z]*$/;  return this[varName];"));
     this.a3 = new Array("street", "Address is required.", new Function ("varName", "this.mask=/^[ \\.\\-0-9a-zA-Z]*$/;  return this[varName];"));
     this.a4 = new Array("city", "City is required.", new Function ("varName", "this.mask=/^[ \\.\\-a-zA-Z]*$/;  return this[varName];"));
     this.a5 = new Array("address_state", "State is required.", new Function ("varName", "this.mask=/^[a-zA-Z]*$/; this.minlength='2';  return this[varName];"));
     this.a6 = new Array("zip", "Zipcode is required.", new Function ("varName", "this.maxlength='5'; this.mask=/^[0-9]*$/; this.minlength='5';  return this[varName];"));
    }

    function mask () {
     this.a0 = new Array("first_name", "The first name is invalid", new Function ("varName", "this.mask=/^[ \\.\\-a-zA-Z]*$/;  return this[varName];"));
     this.a1 = new Array("last_name", "The last name is invalid", new Function ("varName", "this.mask=/^[ \\.\\-a-zA-Z]*$/;  return this[varName];"));
     this.a2 = new Array("street", "The address is invalid", new Function ("varName", "this.mask=/^[ \\.\\-0-9a-zA-Z]*$/;  return this[varName];"));
     this.a3 = new Array("city", "The city is invalid", new Function ("varName", "this.mask=/^[ \\.\\-a-zA-Z]*$/;  return this[varName];"));
     this.a4 = new Array("address_state", "The state is invalid", new Function ("varName", "this.mask=/^[a-zA-Z]*$/; this.minlength='2';  return this[varName];"));
     this.a5 = new Array("zip", "The zipcode is invalid", new Function ("varName", "this.maxlength='5'; this.mask=/^[0-9]*$/; this.minlength='5';  return this[varName];"));
    }

    function minlength () {
     this.a0 = new Array("address_state", "state can not be less than 2 characters.", new Function ("varName", "this.mask=/^[a-zA-Z]*$/; this.minlength='2';  return this[varName];"));
     this.a1 = new Array("zip", "zipcode can not be less than 5 characters.", new Function ("varName", "this.maxlength='5'; this.mask=/^[0-9]*$/; this.minlength='5';  return this[varName];"));
    }

    function maxlength () {
     this.a0 = new Array("zip", "zipcode can not be greater than 5 characters.", new Function ("varName", "this.maxlength='5'; this.mask=/^[0-9]*$/; this.minlength='5';  return this[varName];"));
    }

    function DateValidations () {
     this.a0 = new Array("sale_date", "The sales date is invalid.  Please use the following format: MM/dd/yyyy", new Function ("varName", "this.datePatternStrict='MM/dd/yyyy';  return this[varName];"));
    }

	function email()
	{
		this.a0 = new Array("email", "This email address is invalid", new Function ("varName", " return this[varName];"));
	}

function validateMaxLength(form) {
                var isValid = true;
                var focusField = null;
                var i = 0;
                var fields = new Array();
                oMaxLength = new maxlength();
                for (x in oMaxLength) {
                    var field = form[oMaxLength[x][0]];

                    if (field.type == 'text' ||
                        field.type == 'textarea') {

                        var iMax = parseInt(oMaxLength[x][2]("maxlength"));
                        if (field.value.length > iMax) {
                            if (i == 0) {
                                focusField = field;
                            }
                            fields[i++] = oMaxLength[x][1];
                            isValid = false;
                        }
                    }
                }
                if (fields.length > 0) {
                   focusField.focus();
                   alert(fields.join('\n'));
                }
                return isValid;
            }
function validateRequired(form) {
                var isValid = true;
                var focusField = null;
                var i = 0;
                var fields = new Array();
                oRequired = new required();
                for (x in oRequired) {
                	var field = form[oRequired[x][0]];

                    if (field.type == 'text' ||
                        field.type == 'textarea' ||
                        field.type == 'file' ||
                        field.type == 'select-one' ||
                        field.type == 'radio' ||
                        field.type == 'password') {

                        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 (trim(value).length == 0) {

	                        if (i == 0) {
	                            focusField = field;
	                        }
	                        fields[i++] = oRequired[x][1];
	                        isValid = false;
                        }
                    }
                }
                if (fields.length > 0) {
                   focusField.focus();
                   alert(fields.join('\n'));
                }
                return isValid;
            }

            // Trim whitespace from left and right sides of s.
            function trim(s) {
                return s.replace( /^\s*/, "" ).replace( /\s*$/, "" );
            }
function validateDate(form) {
               var bValid = true;
               var focusField = null;
               var i = 0;
               var fields = new Array();
               oDate = new DateValidations();
               for (x in oDate) {
                   var value = form[oDate[x][0]].value;
                   var datePattern = oDate[x][2]("datePatternStrict");
                   if ((form[oDate[x][0]].type == 'text' ||
                        form[oDate[x][0]].type == 'textarea') &&
                       (value.length > 0) &&
                       (datePattern.length > 0)) {
                     var MONTH = "MM";
                     var DAY = "dd";
                     var YEAR = "yyyy";
                     var orderMonth = datePattern.indexOf(MONTH);
                     var orderDay = datePattern.indexOf(DAY);
                     var orderYear = datePattern.indexOf(YEAR);
                     if ((orderDay < orderYear && orderDay > orderMonth)) {
                         var iDelim1 = orderMonth + MONTH.length;
                         var iDelim2 = orderDay + DAY.length;
                         var delim1 = datePattern.substring(iDelim1, iDelim1 + 1);
                         var delim2 = datePattern.substring(iDelim2, iDelim2 + 1);
                         if (iDelim1 == orderDay && iDelim2 == orderYear) {
                            dateRegexp = new RegExp("^(\\d{2})(\\d{2})(\\d{4})$");
                         } else if (iDelim1 == orderDay) {
                            dateRegexp = new RegExp("^(\\d{2})(\\d{2})[" + delim2 + "](\\d{4})$");
                         } else if (iDelim2 == orderYear) {
                            dateRegexp = new RegExp("^(\\d{2})[" + delim1 + "](\\d{2})(\\d{4})$");
                         } else {
                            dateRegexp = new RegExp("^(\\d{2})[" + delim1 + "](\\d{2})[" + delim2 + "](\\d{4})$");
                         }
                         var matched = dateRegexp.exec(value);
                         if(matched != null) {
                            if (!isValidDate(matched[2], matched[1], matched[3])) {
                               if (i == 0) {
                                   focusField = form[oDate[x][0]];
                               }
                               fields[i++] = oDate[x][1];
                               bValid =  false;
                            }
                         } else {
                            if (i == 0) {
                                focusField = form[oDate[x][0]];
                            }
                            fields[i++] = oDate[x][1];
                            bValid =  false;
                         }
                     } else if ((orderMonth < orderYear && orderMonth > orderDay)) {
                         var iDelim1 = orderDay + DAY.length;
                         var iDelim2 = orderMonth + MONTH.length;
                         var delim1 = datePattern.substring(iDelim1, iDelim1 + 1);
                         var delim2 = datePattern.substring(iDelim2, iDelim2 + 1);
                         if (iDelim1 == orderMonth && iDelim2 == orderYear) {
                             dateRegexp = new RegExp("^(\\d{2})(\\d{2})(\\d{4})$");
                         } else if (iDelim1 == orderMonth) {
                             dateRegexp = new RegExp("^(\\d{2})(\\d{2})[" + delim2 + "](\\d{4})$");
                         } else if (iDelim2 == orderYear) {
                             dateRegexp = new RegExp("^(\\d{2})[" + delim1 + "](\\d{2})(\\d{4})$");
                         } else {
                             dateRegexp = new RegExp("^(\\d{2})[" + delim1 + "](\\d{2})[" + delim2 + "](\\d{4})$");
                         }
                         var matched = dateRegexp.exec(value);
                         if(matched != null) {
                             if (!isValidDate(matched[1], matched[2], matched[3])) {
                                 if (i == 0) {
                                     focusField = form[oDate[x][0]];
                                 }
                                 fields[i++] = oDate[x][1];
                                 bValid =  false;
                              }
                         } else {
                             if (i == 0) {
                                 focusField = form[oDate[x][0]];
                             }
                             fields[i++] = oDate[x][1];
                             bValid =  false;
                         }
                     } else if ((orderMonth > orderYear && orderMonth < orderDay)) {
                         var iDelim1 = orderYear + YEAR.length;
                         var iDelim2 = orderMonth + MONTH.length;
                         var delim1 = datePattern.substring(iDelim1, iDelim1 + 1);
                         var delim2 = datePattern.substring(iDelim2, iDelim2 + 1);
                         if (iDelim1 == orderMonth && iDelim2 == orderDay) {
                             dateRegexp = new RegExp("^(\\d{4})(\\d{2})(\\d{2})$");
                         } else if (iDelim1 == orderMonth) {
                             dateRegexp = new RegExp("^(\\d{4})(\\d{2})[" + delim2 + "](\\d{2})$");
                         } else if (iDelim2 == orderDay) {
                             dateRegexp = new RegExp("^(\\d{4})[" + delim1 + "](\\d{2})(\\d{2})$");
                         } else {
                             dateRegexp = new RegExp("^(\\d{4})[" + delim1 + "](\\d{2})[" + delim2 + "](\\d{2})$");
                         }
                         var matched = dateRegexp.exec(value);
                         if(matched != null) {
                             if (!isValidDate(matched[3], matched[2], matched[1])) {
                                 if (i == 0) {
                                     focusField = form[oDate[x][0]];
                                  }
                                  fields[i++] = oDate[x][1];
                                  bValid =  false;
                              }
                          } else {
                              if (i == 0) {
                                  focusField = form[oDate[x][0]];
                              }
                              fields[i++] = oDate[x][1];
                              bValid =  false;
                          }
                     } else {
                         if (i == 0) {
                             focusField = form[oDate[x][0]];
                         }
                         fields[i++] = oDate[x][1];
                         bValid =  false;
                     }
                  }
               }
               if (fields.length > 0) {
                  focusField.focus();
                  alert(fields.join('\n'));
               }
               return bValid;
            }

	    function isValidDate(day, month, year) {
	        if (month < 1 || month > 12) {
                    return false;
                }
                if (day < 1 || day > 31) {
                    return false;
                }
                if ((month == 4 || month == 6 || month == 9 || month == 11) &&
                    (day == 31)) {
                    return false;
                }
                if (month == 2) {
                    var leap = (year % 4 == 0 &&
                               (year % 100 != 0 || year % 400 == 0));
                    if (day>29 || (day == 29 && !leap)) {
                        return false;
                    }
                }
                return true;
            }

function validateEmail(form) {
                var bValid = true;
                var focusField = null;
                var i = 0;
                var fields = new Array();
                oEmail = new email();
                for (x in oEmail) {
                    if ((form[oEmail[x][0]].type == 'text' ||
                         form[oEmail[x][0]].type == 'textarea') &&
                        (form[oEmail[x][0]].value.length > 0)) {
                        if (!checkEmail(form[oEmail[x][0]].value)) {
                            if (i == 0) {
                                focusField = form[oEmail[x][0]];
                            }
                            fields[i++] = oEmail[x][1];
                            bValid = false;
                        }
                    }
                }
                if (fields.length > 0) {
                    focusField.focus();
                    alert(fields.join('\n'));
                }
                return bValid;
            }

            /**
             * Reference: Sandeep V. Tamhankar (stamhankar@hotmail.com),
             * http://javascript.internet.com
             */
            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;
            }
function validateMask(form) {
                var isValid = true;
                var focusField = null;
                var i = 0;
                var fields = new Array();
                oMasked = new mask();
                for (x in oMasked) {
                    var field = form[oMasked[x][0]];

                    if ((field.type == 'text' ||
                         field.type == 'textarea') &&
                         (field.value.length > 0)) {

                        if (!matchPattern(field.value, oMasked[x][2]("mask"))) {
                            if (i == 0) {
                                focusField = field;
                            }
                            fields[i++] = oMasked[x][1];
                            isValid = false;
                        }
                    }
                }

                if (fields.length > 0) {
                   focusField.focus();
                   alert(fields.join('\n'));
                }
                return isValid;
            }

            function matchPattern(value, mask) {
               return mask.exec(value);
            }
function validateMinLength(form) {
                var isValid = true;
                var focusField = null;
                var i = 0;
                var fields = new Array();
                oMinLength = new minlength();
                for (x in oMinLength) {
                    var field = form[oMinLength[x][0]];

                    if (field.type == 'text' ||
                        field.type == 'textarea') {

                        var iMin = parseInt(oMinLength[x][2]("minlength"));
                        if ((trim(field.value).length > 0) && (field.value.length < iMin)) {
                            if (i == 0) {
                                focusField = field;
                            }
                            fields[i++] = oMinLength[x][1];
                            isValid = false;
                        }
                    }
                }
                if (fields.length > 0) {
                   focusField.focus();
                   alert(fields.join('\n'));
                }
                return isValid;
            }

