// Form Validation
var submitClicked = false;
var errors = false;
var errorMsg = "";
var contentErrors = false;
var contentErrorMsg = "";
var emailFormatErrorMsg = "";
var alertMsg = "";

var alertRequiredMsg = "The following field(s) is required to continue.";
var alertInvalidEmail = "Your email address is not properly formed. Please re-enter it using a valid email address.";
var alertInvalidField = "The following field(s) have invalid content. Please re-enter it using valid characters.";

var formElement;

// JS Object Definition of a Formbase Fulfillment Request
function configFormbase(argModel, argFormId, argMarketCode, argSource, argPoi, argModelYear, argVehicleName, argSuccessPg, argErrorPg)
{
   this.model = argModel;
   this.formId = argFormId;
   this.marketCode = argMarketCode;
   this.source = argSource;
   this.poi = argPoi;
   this.modelYear = argModelYear;
   this.vehicleName = argVehicleName;
   this.successPg = argSuccessPg;
   this.errorPg = argErrorPg;
}

// JS Function Definitions of a Formbase Fulfillment Request
function getFormbaseObj( argModel )
{
  var i = 0;
  var model_found = false;

  while ( i < fbaseModels.length ) {
    if ( argModel == fbaseModels[i].model ) {
      return fbaseModels[i];
    }
    i++;
  } 
  return null;
}

// JS Function Definitions of a Formbase Fulfillment Request
function alertFbaseModel( argModel )
{
  var tmp = "";

  if ( argModel != null ) {
      tmp =  "hr model:\t\t" + argModel.model + "\n";
      tmp += "formId:\t\t" + argModel.formId + "\n";
      tmp += "marketCode:\t" + argModel.marketCode + "\n";
      tmp += "poi:\t\t" + argModel.poi + "\n";
      tmp += "modelYear:\t" + argModel.modelYear + "\n";
      tmp += "vehicleName:\t" + argModel.vehicleName + "\n";
      tmp += "successPg:\t" + argModel.successPg + "\n";
      tmp += "errorPg:\t\t" + argModel.errorPg + "\n";
  } else {
      tmp = "Empty model object";
  }
  alert(tmp);
}


function isBlank( s ) {
// regEx = /[^\s]/;
//  if( s.length > 0 || !regEx1.test( argValue ) ) return false;

  if( s.length > 0 ) {
    for( var i = 0; i < s.length; i++ ) {
      var c = s.charAt( i );
      if( ( c != ' ') && ( c != '\n' ) && ( c != '\t' ) ) return false;
    }
  }
  return true;
}

function isValidChar( text ) {
  formtext = text.toString();
  for( var j = 0; j < formtext.length; j++ ) {
    var oneChar = formtext.charAt( j );
    if( oneChar > "~" || oneChar < " " ) {
      return false;
    }
  }
  return true;
}

function isCheckboxChecked( argFormObj, argFieldName ) {
  for( var x = 0; x < argFormObj.elements.length; x++ ) {
    formElem = argFormObj.elements[x];
    if ( formElem.type == "checkbox" && formElem.name == argFieldName && formElem.checked ) {
      return true;
    }
  }
  return false;
}

function isRadioChecked( argFormObj, argFieldName ) {
  for( var x = 0; x < argFormObj.elements.length; x++ ) {
    formElem = argFormObj.elements[x];
    if ( formElem.type == "radio" && formElem.name == argFieldName && formElem.checked ) {
      return true;
    }
  }
  return false;
}

function isValidEmail( argValue ) {
  regEx1 = /(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)/;
  regEx2 = /^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?)$/;
    if( ( argValue.length > 0 ) && ( !( !regEx1.test( argValue ) && regEx2.test( argValue ) ) ) ) {
      return false
  } else return true;
}

function isPostalCode( argValue ) {
  regEx1 = /(^[a-zA-Z]\d[a-zA-Z]\d[a-zA-Z]\d$)|(^[a-zA-Z]\d[a-zA-Z] \d[a-zA-Z]\d$)/;
  if( ( argValue.length > 0 ) && ( !regEx1.test( argValue ) ) ) {
    return false
  } else return true;
}

function isZipCode( argValue ) {
  regEx1 = /^\d{5}$|^\d{9}$|^\d{5}-\d{4}$/;
    if( ( argValue.length > 0 ) && ( !regEx1.test( argValue ) ) ) {
      return false
  } else return true;
}

function numeric( argValue ) {
    if( isNaN( argValue ) || argValue.match(" ")) {
        return false;
    } else return true;
}

function alphaNumeric( argValue ) {
  // regEx = /[^\u0000-\u017F\s0-9\-\'\.]/;
  regEx = /[^A-Za-z0-9\s\-\'\.]/;
  if( ( argValue.length > 0 ) && ( regEx.test( argValue ) ) ) {
    return false;
  } else return true;
}

function alpha( argValue ) {
  // regEx = /[^\u0000-\u017F\s\-\']/;
  regEx = /[^A-Za-z\s\-\']/;
  //regEx = /[^$A-Za-z]/;
  if( ( argValue.length > 0 ) && ( regEx.test( argValue ) ) ) {
    return false;
  } else return true;
}

function emailValid( argValue ) {
    regEx1 = /(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)/;
    regEx2 = /^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?)$/;
    if( ( argValue.length > 0 ) && ( !( !regEx1.test( argValue ) && regEx2.test( argValue ) ) ) ) {
        return false
    } else return true;
}

function validateForm(arg_formObj) {
  contentErrors = false;
  emailFormatError = false;
  regExTransform = /\s/g;

  if( submitClicked == true ) return false;
    else submitClicked = true;

  // are required fields blank or do they contain non-english characters
  for( var i = 0; i < arg_formObj.elements.length; i++ ) {
    formElement = arg_formObj.elements[i];
	
      switch( formElement.type ) {
        case "text" :
          if( ( formElement.required ) && (( formElement.value == null ) || isBlank( formElement.value )) ) {
            errors = true;
            errorMsg += formElement.required + "\n";
          } else {
          formElement.value = formElement.value.replace(regExTransform, " ");
          // if( this is an email address or zipcode field )...
          switch( formElement.subtype ) {
            case "email" :
              if( !isValidEmail( formElement.value )) {
                emailFormatError = true;
              } 
              break;

            case "zipcode" :
			  // zipcode should be numeric, so we check for that
              if(  !isZipCode( formElement.value ) ) {
			    contentErrors = true;
		        contentErrorMsg += (formElement.required?formElement.required:formElement.label) + "\n";
              }
              break;
			
            case "postalandzip" :
			  // zipcode should be numeric, so we check for that
              if( ( !isPostalCode( formElement.value ) && !isZipCode( formElement.value )) ) {
			    contentErrors = true;
		        contentErrorMsg += (formElement.required?formElement.required:formElement.label) + "\n";
              }
              break;
			
            case "postalcode" :
              if( !isPostalCode( formElement.value )) {
			    contentErrors = true;
		        contentErrorMsg += (formElement.required?formElement.required:formElement.label) + "\n";
              }
              break;
			
            case "areacode" :
              // areacode should be numeric, so we check for that
              if( ( formElement.value.length != 0 ||  formElement.required ) && ( formElement.value.length != 3 || isNaN( formElement.value ) ) ) {
                contentErrors = true;
                contentErrorMsg += (formElement.required?formElement.required:formElement.label) + "\n";
              }
              break;
	
            case "phone" :
              // phone should be numeric, so we check for that
              if( ( formElement.value.length != 0 ||  formElement.required ) && ( formElement.value.length != 7 || isNaN( formElement.value ) ) ) {
                contentErrors = true;
                contentErrorMsg += (formElement.required?formElement.required:formElement.label) + "\n";
              }
              break;
			
            case "alphaNum" :
              if(  !alphaNumeric( formElement.value ) ) {
                contentErrors = true;
                contentErrorMsg += (formElement.required?formElement.required:formElement.label) + "\n";
              }
              break;
			
            default:
		      if( !alpha( formElement.value ) ) {
                contentErrors = true;
                contentErrorMsg += (formElement.required?formElement.required:formElement.label) + "\n";
              }
              break;
            }		  
          }		  
          break;
        case "select-one" :
          if( (formElement.required) && isBlank( formElement.options[formElement.selectedIndex].value ) ) {
            errors = true;
            errorMsg += formElement.required + "\n";
          }
          break;
        case "checkbox" : 
          if( (formElement.required) && !isCheckboxChecked( arg_formObj, formElement.name ) ) {
            errors = true;
            errorMsg += formElement.required + "\n";
          }
          break;
        case "radio" : 
          if( (formElement.required) && !isRadioChecked( arg_formObj, formElement.name )  ) {
            errors = true;
            errorMsg += formElement.required + "\n";
          }
          break;
	    }  // end switch required
  }   // end for loop

  if( errors  ) {
    alertMsg += alertRequiredMsg + "\n-------------------------------\n";
    alertMsg += errorMsg;
  }
  if( emailFormatError  ) {
    if( errors ) alertMsg += "\n";
    alertMsg += alertInvalidEmail + "\n-------------------------------\n";
    alertMsg += emailFormatErrorMsg;
  }
  if( contentErrors  ) {
    if( errors || emailFormatError ) alertMsg += "\n";
    alertMsg += alertInvalidField + "\n-------------------------------\n";
    alertMsg += contentErrorMsg;
  }
  if( errors || emailFormatError || contentErrors ) {
    alert( alertMsg );
    submitClicked = false;
    errors = false;
    errorMsg = "";
	emailFormatError = false;
    emailFormatErrorMsg = "";
    contentErrors = false;
    contentErrorMsg = "";
    alertMsg = "";
    return false;
  } else {
    return true;
  }

}

function appendZip (arg_form) {

if (arg_form.success_pg.value.indexOf("zip=") != -1 ) {
    arg_form.error_pg.value = arg_form.error_pg.value.substring(0,arg_form.error_pg.value.indexOf("zip=")-1);
    arg_form.success_pg.value = arg_form.success_pg.value.substring(0,arg_form.success_pg.value.indexOf("zip=")-1);
}
  arg_form.error_pg.value += "&zip=" + arg_form.A19$3$zipcode.value;
  arg_form.success_pg.value += "&zip=" + arg_form.A19$3$zipcode.value;
}

function preSubmit (arg_form) {
  if ( validateForm( arg_form ) ) {
    appendZip(arg_form);
    return true;
  } else {
    return false;
  }
}
