init();

function init() {
   Description = new Array();
   RequireText = 0;
   RequireSelect = 0;
   RequireRadio = 0;
   RequireCheckbox = 0;
   RequireRegex = 0;
}

function ValidateForm(theForm) {
   if (ProcessTexts(theForm,RequireText) &&
   ProcessSelects(theForm,RequireSelect) &&
   ProcessRadios(theForm,RequireRadio) &&
   ProcessCheckboxes(theForm,RequireCheckbox) &&
   ProcessRegexes(theForm,RequireRegex)
   ) {
      return true;
   } else {
      return false;
   }
}

function ProcessTexts(formname,fields) {
   if(typeof fields != "object") {return true;} //don't bother if the form doesn't require any
   if (fields.length == 0) { return true; } //short-circuit, legacy.
   for( var i = 0; i<fields.length; i++) {
      if(formname.elements[fields[i]].value.length < 1) {
         formname.elements[fields[i]].focus();
         if (Description[fields[i]]) {
            alert(Description[fields[i]]);
         } else {
            alert("Please enter your " + fields[i] + ".");
         }
         return false;
      }
   }
   return true;
}
function ProcessSelects(formname,fields) {
   if(typeof fields != "object") {return true;} //don't bother if the form doesn't require any
   if (fields.length == 0) { return true; } //short-circuit, legacy.
   for( var i = 0; i<fields.length; i++) {
      if(formname.elements[fields[i]].selectedIndex < 1) {
         formname.elements[fields[i]].focus();
         if (Description[fields[i]]) {
            alert(Description[fields[i]]);
         } else {
            alert("Please select your " + fields[i] + ".");
         }
         return false;
      }
   }
   return true;
}
function ProcessRadios(formname,groups) {
   if(typeof groups != "object") {return true;} //don't bother if the form doesn't require any
   if (groups.length == 0) { return true; } //short-circuit, legacy.
   for (var j = 0; j < groups.length; j++) {
      var field = groups[j];
      var hits = 0;
      for( var i = 0; i< formname.elements[field].length; i++) { // start one field past the desc.
         if(formname.elements[field][i].checked) { //the user better not have specified nonexistent fields...
            hits++; //increment hit counter
         }
      }
      if (hits < 1) {
         if (Description[field]) {
            alert(Description[field]);
         } else {
            alert("Please select an option from the " + field + " group.");
         }
         formname.elements[field][0].focus();
         return false;
      }
   }
   return true;
}
function ProcessCheckboxes(formname,groups) {
   if(typeof groups != "object") {return true;} //don't bother if the form doesn't require any
   if (groups.length == 0) { return true; } //short-circuit, legacy.
   for (var j = 0; j < groups.length; j++) {
      var fields = groups[j];
      var groupdesc = fields[0];  //grab that description
      var hits = 0;
      for( var i = 1; i<fields.length; i++) { // start one field past the desc.
         if(formname.elements[fields[i]].checked) { //the user better not have specified nonexistent fields...
            hits++; //increment hit counter
         }
      }
      if (hits < 1) {
         if (Description[groupdesc]) {
            alert(Description[groupdesc]);
         } else {
            alert("Please select an option from the " + groupdesc + " group.");
         }
         formname.elements[fields[1]].focus();
         return false;
      }
   }
   return true;
}
function ProcessRegexes(formname,pairs) {
   if(typeof pairs != "object") {return true;} //don't bother if the form doesn't require any
   if (pairs.length == 0) { return true; } //short-circuit, legacy.
   for (var j = 0; j < pairs.length; j++) {
      var thispair = pairs[j];
      var hits = 0;
      var field = thispair[0];
      var regex = thispair[1];

      if(!regex.exec(formname.elements[field].value)) {
         if (Description["reg" + field]) {
            alert(Description["reg" + field].replace(/\$val/, formname.elements[field].value));
         } else {
            alert("The text you entered in the " + field + " field is improperly formatted. Please check your entry and try again.");
         }
         formname.elements[field].focus();
         return false;
      }
   }
   return true;
}


// end form validation service. ;)



/*
<script language="JavaScript">
<!--

var Description = new Array();

RequireText = new Array("Name","Company","Address","City","State","Zip","Phone","Fax","Date");
Description["Date"] = "Please enter today's date.";
Description["Fax"] = "Please enter your Fax Number.";
Description["Phone"] = "Please enter your Phone Number.";

RequireSelect = new Array("SomeSelect");
Description["SomeSelect"] = "Please select a flying frobozz disc type.";

RequireRadio = new Array("radio1","radio2");
Description["radio2"] = "Please select an option from the Foo Group.";

         // Checkbox groups are complicated.
         // Enter the names of the boxes in the group you wish to require.
         // Then push their array names onto the RequireCheckbox array.
         // Plus, checkboxes need to have a group name as the first element on the array.
         // here's a sample.
         // SampleCheckbox = new Array("SampleBox","a","b");
         // Description["SampleBox"] = "Please choose a box from the foo bar group.";
         // RequireCheckbox = new Array(SampleCheckbox);
         // of course, this is a sample.  Don't uncomment it.
RequireCheckbox = new Array();

Regex1 = new Array("fieldname",/regex/);
Description["regfieldname"] = "you entered invalidly formatted text"; // what if fieldname is both required and format-checked?
Regex2 = new Array("fieldname",/regex/);
Regex3 = new Array("fieldname",/regex/);
RequireRegex = new Array(Regex1,Regex2,Regex3);

//-->
</script>
*/


