//Some generic form validation functions.
//This is not complete, but should provide a starting point for your
//own special needs.


// A utility function that returns true if a string 
// contains only whitespace characters.

function isblank(s)
{
  for(var i = 0; i < s.length; i++)
  {
     var c = s.charAt(i);
     if ((c != ' ') &&
         (c != '\n') &&
         (c != '\t'))
        return false;
  }
  return true;
}


// This is the function that performs <form> validation.  
// It will be invoked from the onSubmit() event handler.
// The handler should return whatever value this function
// returns.

function verify(f)
{
  var msg;
  var empty_fields = "";
  var errors = "";
  var whyreq = false;

  // Loop through the elements of the form, looking for all
  // text and textarea elements that don't have an
  // "optional" property defined.  Then, check for fields
  // that are empty and make a list of them.
  // Also, if any of these elements have a "min" or a "max"
  // property defined, then verify that they are numbers 
  // and that they are in the right range.
  // Put together error messages for fields that are wrong.

for(var i = 0; i < f.length; i++)
  {
     var e = f.elements[i];

     if ((e.type == "text") ||
         (e.type == "textarea") ||
         (e.state))
     {


if (!e.optional) //if required
{

        if ((e.value == null) ||
            (e.value == "") ||
            isblank(e.value))
        {
           empty_fields += "\n        " +
                           e.description;
           continue;
        }
} //endif required

        // Now check for fields that are supposed 
        // to be numeric.

        if (e.numeric ||
           (e.min != null) ||
           (e.max != null))
        {
           var v = parseFloat(e.value);
           if (isNaN(v) ||
              ((e.min != null) && (v < e.min)) ||
              ((e.max != null) && (v > e.max)))
           {
              errors += "\n- The field " +
                        e.description +
                        " must be a number";
              if (e.min != null)
                 errors += " that is greater than " +
                           e.min;

              if (e.max != null &&
                  e.min != null)
                 errors += " and less than " +
                           e.max;

              else if (e.max != null)
                 errors += " that is less than " +
                           e.max;

              errors += ".\n";
           }
        }

        // Now check for fields that are supposed 
        // to be emails.
        // Not exactly as described in RFC 2822, but 
        // a rough attempt
        // of the form "local-bit@domain-bit"
        // The strict regexp for legal email addresses
        // runs about 2 printed pages.

        if (e.email && !isblank(e.value))
        {
           var seenAt = false;
           var append = "";
           for(var j = 0; j < e.value.length; j++)
           {
              var c = e.value.charAt(j);
              if ((c == ' ') ||
                  (c == '\n') ||
                  (c == '\t'))
                 append += 
     "\n           - not contain white-space";
              if ((c == '@') && (seenAt == true))
                 append += 
     "\n           - contain only one @";
              if ((c == '@'))
                 seenAt = true;
           }

           if (seenAt == false)
              append += 
     "\n           - contain exactly one @";
           if (append)
              errors += "\n- The field " +
                        e.description +
                        " must: " + append;
        }

        // Now check for fields that are supposed 
        // to be dates.

        if (e.datetype && !isblank(e.value))
        {
           var slashCount = 0;
           var append = "";
           var addedError1 = false;
           var addedError2 = false;

           for(var j = 0; j < e.value.length; j++)
           {
              var c = e.value.charAt(j);

              if ((c == '/'))
                 slashCount++;

              if (c != '/' &&
                 (c < '0' || c > '9') &&
                 addedError1 == false)
              {
                 addedError1 = true;
                 append += 
     "\n           - must contain only numbers " +
     "and forward-slashes";
              }
           }

           if (j != 10 || slashCount != 2)
              append += 
     "\n           - must have the format DD/MM/YYYY";
           if (slashCount != 2)
              append += 
     "\n           - must contain two slashes";
           if (append)
              errors +=  "- The field " + 
                         e.description + 
                         " must: " + append;
        }

        // Now check for fields that are supposed 
        // not to have spaces

        if (e.nospaces)
        {
           var seenAt = false;
           var append = "";

           for(var j = 0; j < e.value.length; j++)
           {
              var c = e.value.charAt(j);

              if ((c == ' ') ||
                  (c == '\n') ||
                  (c == '\t'))
                 errors += "- The field " + e.description +
                           " must not contains white-space";
           }
        }

     } // if (type is text or textarea or specific select)

if (e.type == 'checkbox') // see if at least 1 checkbox is checked
{
if (e.checked) whyreq = true;
}  //end of checkbox 

  } // for each character in field

  //Now make an error msg if no checkboxes were checked
  //Must do this after all fields are tested

if (!whyreq)
{
errors += "\n-At least one checkbox in the \n"+
          "\"Reason for Contact\" group must be checked";
}  // end of checkbox error msg generation

  // Now, if there were any errors, then display the
  // messages, and return false to prevent the form from
  // being submitted.  Otherwise return true.

  if (!empty_fields && !errors) 
     return true;

  msg  = "______________________________________________________\n\n"
  msg += "The form was not submitted because of the " +
         "following error(s).\n";
  msg += "Please correct these error(s) and re-submit.\n";
  msg += "______________________________________________________\n\n"

  if (empty_fields)
  {
     msg += "- The following required field(s) are empty:"
           + empty_fields + "\n";
     if (errors)
        msg += "\n";
  }
  msg += errors;
  alert(msg);
  return false;
}

//The validationConfig() function finds all the forms 
//on the page and sets the onsubmit event handler.
//From a practical sense, you probably have only one
//form.  If you have more, give each a class, test
//for which form by the class, eg. 
//   function validationConfig() {
//      var forms = document.getElementsByTagName("form");
//      for (var i=0; i<forms.length; i++) {
//         if (forms.getAttribut("class") == "form1" {
//            forms[i].onsubmit = function() {
//               ...
//            }
//         }
//         if (forms.getAttribut("class") == "form2" {
//            forms[i].onsubmit = function() {
//               ...
//            }
//         }
//      }
//   }
//and each could be configured differently.
//This is where you would tell the validation functions
//whether a field is optional, and what type of field it
//is.

   window.onload = validationConfig;
   function validationConfig() {
      if (!document.getElementsByTagName) return false;
      var forms = document.getElementsByTagName("form");
      for (var i=0; i<forms.length; i++) {
         forms[i].onsubmit = function() {
            this.fname.optional = true;
	    this.lname.optional = true;
	    this.comp.optional = true;
	    this.addr1.optional = true;
	    this.addr2.optional = true;
	    this.city.optional = true;
	    this.state.optional = true;
	    this.state.state = true;
	    this.zip.optional = true;
	    this.email.optional = true;
	    this.phone.optional = true;
		this.message.description = 'Message';
	    return verify(this);
	 }
      }
   } //End of validation configuration.





