var submitClicked = false;
var errors = false;
var errorMsg = "";
var contentErrors = false;
var contentErrorMsg = "";
var emailFormatErrorMsg = "";
var alertMsg = "";

var formElement;
  


function isBlank( s ) {
  if( s.length > 0 ) return false;
  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 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 numeric( argValue ) {
	if( isNaN( argValue ) || argValue.match(" ")) {
		return false;
	} else return true;
}

function alphaNumeric( argValue ) {
  regEx = /[^A-Za-z0-9\s\-\'\.]/;
  if( ( argValue.length > 0 ) && ( regEx.test( argValue ) ) ) {
	return false;
  } else return true;
}

function alpha( argValue ) {
  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];
	
    if( formElement.required ) {
      switch( formElement.type ) {
        case "text" :
          if( ( 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( (formElement.value.length != 5 && formElement.value.length != 9) || isNaN( formElement.value )) {
			    contentErrors = true;
		        contentErrorMsg += formElement.required + "\n";
              }
              break;
			
            case "areacode" :
              // areacode should be numeric, so we check for that
              if( (formElement.value.length != 3) || isNaN( formElement.value )) {
                contentErrors = true;
                contentErrorMsg += formElement.required + "\n";
              }
              break;
	
            case "phone" :
              // phone should be numeric, so we check for that
              if( (formElement.value.length != 7) || isNaN( formElement.value )) {
                contentErrors = true;
                contentErrorMsg += formElement.required + "\n";
              }
              break;
			
            case "alphaNum" :
              if(  !alphaNumeric( formElement.value ) ) {
                contentErrors = true;
                contentErrorMsg += formElement.required + "\n";
              }
              break;
			
            default:
		      if( !alpha( formElement.value ) ) {
                contentErrors = true;
                contentErrorMsg += formElement.required + "\n";
              }
              break;
            }		  
          }		  
          break;
        case "select-one" :
          if( isBlank( formElement.options[formElement.selectedIndex].value ) ) {
            errors = true;
            errorMsg += formElement.required + "\n";
          }
          if( !alpha( formElement.options[formElement.selectedIndex].value ) ) {
            contentErrors = true;
            contentErrorMsg += formElement.required + "\n";
          }
          break;
        case "checkbox" : 
          if( ! formElement.checked ) {
            errors = true;
            errorMsg += formElement.required + "\n";
          }
          break;
	  }  // end switch required
      } else {
	  	// now we check the non-required fields, validating the content ONLY if there's something there
	  	switch( formElement.type ) {
          case "text" :
            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( (formElement.value && formElement.value.length != 5 && formElement.value.length != 9) || isNaN( formElement.value )) {
                  contentErrors = true;
                  contentErrorMsg += formElement.label + "\n";
                }
                break;
			
              case "areacode" :
                // areacode should be numeric, so we check for that
                if( (formElement.value && formElement.value.length != 3) || isNaN( formElement.value )) {
                  contentErrors = true;
                  contentErrorMsg += formElement.label + "\n";
                }
                break;
			
              case "phone" :
                // phone should be numeric, so we check for that
                if( (formElement.value && formElement.value.length != 7) || isNaN( formElement.value )) {
                  contentErrors = true;
                  contentErrorMsg += formElement.label + "\n";
                }
                break;
			
              case "alphaNum" :
                if( formElement.value && !alphaNumeric( formElement.value ) ) {
                  contentErrors = true;
                  contentErrorMsg += formElement.label + "\n";
                }
                break;
			
              default:
                if( formElement.value && !alpha( formElement.value) ) {
                  contentErrors = true;
                  contentErrorMsg += formElement.label + "\n";
                }
                break;
            }   // end of switch  formElement.subtype
            break;

        	case "select-one" :
				// pull-downs don't need to be validated
          	break;
        }   // end of switch formElement.type
      }    // end if-else
  }   // end for loop
  if( errors  ) {
    alertMsg += "The following field(s) is required to continue.\n-------------------------------\n";
    alertMsg += errorMsg;
  }
  if( emailFormatError  ) {
    if( errors ) alertMsg += "\n";
    alertMsg += "Your email address is not properly formed.\nPlease re-enter it using a valid email address.\n-------------------------------\n";
    alertMsg += emailFormatErrorMsg;
  }
  if( contentErrors  ) {
    if( errors || emailFormatError ) alertMsg += "\n";
    alertMsg += "The following field(s) have invalid content.\nPlease re-enter it using valid characters.\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;
  }

}

