/**
 * @author Ben Neil
 * @projectDescription 
 * validator is a js validation script object
 * used to validate form fields and present useful client information
 * 
 * I usually run a batch validation during a submit of my form like follows:
 * function validateForm(form) {
 *   if (validator.isNotEmpty(form.FirstName)) {
 *       if (validator.isNotEmpty(form.LastName)) {
 *           if (validator.isNotEmpty(form.Email)) {
 *               if (ivalidator.sEMailAddr(form.Email)) {
 *                   if (validator.isZip(form.Zipcode)) {
 *                  everything is good so submit info goes here
 *                  }
 *               }
 *            }
 *         }
 *      }
 *   }
 *
 * And here are some sample of implementation on the form
 * <label for="FirstName">First Name</label><input id="FirstName" name="FirstName" onBlur="isNotEmpty(this);" maxlength="30" /> //checks for isNotEmpty
 * <label for="Email">Email</label><input id="Email" name="Email" onBlur="if (isNotEmpty(this)) {isEMailAddr(this)}"  maxlength="45" /> //checks for if its empty then if its a valid email
 * <select name="CountryList" onChange="isChosen(this);">  //checks if the first value has changed
 */

var validator = {
   
    errorField : false,
    backgroundColorOnError: '#f17070',
    backgroundColorOnValid: 'white',

   // validates that the field value string has one or more characters in it
   isNotEmpty : function(elem) {
        var str = elem.value;
       var re = /.+/;
       if(!str.match(re)) {
           document.getElementById(validator.errorField).innerHTML = "Please fill in the required field(s).";
         elem.style.backgroundColor = validator.backgroundColorOnError;
           //setTimeout("focusElement('" + elem.form.name + "', '" + elem.name + "')", 0);
           return false;
       } else {
           document.getElementById(validator.errorField).innerHTML = "";
         elem.style.backgroundColor = validator.backgroundColorOnValid;
           return true;
       }
   },
   
   //validates that the entry is a positive or negative number
   isaNumber : function(elem) {
      var str = elem.value;
      var re = /^\d+$/;
      str = str.toString();
   
       if (!str.match(re)) {
         document.getElementById(validator.errorField).innerHTML = "Enter only numbers into the field.";
         elem.style.backgroundColor = validator.backgroundColorOnError;
         //setTimeout("focusElement('" + elem.form.name + "', '" + elem.name + "')", 0);
         return false;
       }else{
         elem.style.backgroundColor = validator.backgroundColorOnValid;
         return true;
      }
   },
   
   // validates that the entry is 16 characters long
   isLen16 : function(elem) {
        var str = elem.value;
       var re = /\b.{16}\b/;
       if (!str.match(re)) {
           document.getElementById(validator.errorField).innerHTML = "Entry does not contain the required 16 characters.";
           elem.style.backgroundColor = validator.backgroundColorOnError;
           //setTimeout("focusElement('" + elem.form.name + "', '" + elem.name + "')", 0);
           return false;
       } else {
           document.getElementById(validator.errorField).innerHTML = "";
           elem.style.backgroundColor = validator.backgroundColorOnValid;
           return true;
       }
   },
   
   // validates that the entry is 6 characters long
   isLen6 : function(elem) {
        var str = elem.value;
       var re = /\b.{6}\b/;
       if (!str.match(re)) {
           document.getElementById(validator.errorField).innerHTML = "Entry does not contain the required 6 characters.";
           elem.style.backgroundColor = validator.backgroundColorOnError;
           //setTimeout("focusElement('" + elem.form.name + "', '" + elem.name + "')", 0);
           return false;
       } else {
           document.getElementById(validator.errorField).innerHTML = "";
            elem.style.backgroundColor = validator.backgroundColorOnValid;
          return true;
       }
   },
   
   // validates that the entry is formatted as an e-mail address
   isEMailAddr : function(elem) {
        var str = elem.value;
       var re = /^[\w-]+(\.[\w-]+)*@([\w-]+\.)+[a-zA-Z]{2,7}$/;
       if (!str.match(re)) {
           document.getElementById(validator.errorField).innerHTML = "Verify the e-mail address format.";
           elem.style.backgroundColor = validator.backgroundColorOnError;
           //setTimeout("focusElement('" + elem.form.name + "', '" + elem.name + "')", 0);
           return false;
       } else {
           elem.style.backgroundColor = validator.backgroundColorOnValid;
           document.getElementById(validator.errorField).innerHTML = "";
           return true;
       }
   },
   
   // validate that the user made a selection other than default
   isChosen : function(select) {
       if (select.selectedIndex == 0) {
           document.getElementById(validator.errorField).innerHTML = "Please make a choice from the list.";
           return false;
       } else {
           document.getElementById(validator.errorField).innerHTML = "";
           return true;
       }
   },
   
   // validate zipcode
   isZip : function(elem){
      var str = elem.value;
      var re = /^\d{5}([\-]\d{4})?$/;
       if (!str.match(re)) {
           document.getElementById(validator.errorField).innerHTML = "Verify the zipcode format.";
           elem.style.backgroundColor = validator.backgroundColorOnError;
           //setTimeout("focusElement('" + elem.form.name + "', '" + elem.name + "')", 0);
           return false;
       } else {
           elem.style.backgroundColor = validator.backgroundColorOnValid;
           document.getElementById(validator.errorField).innerHTML = "";
           return true;
       }
   },
   
   //verify that the field doesn't contain HTML code
   isNotHtml : function(elem){
      var str = elem.value;
      var re = /<\S[^><]*>/g;
       if (str.match(re)) {
           document.getElementById(validator.errorField).innerHTML = "Verify there isn't HTML in that field.";
           elem.style.backgroundColor = validator.backgroundColorOnError;
           //setTimeout("focusElement('" + elem.form.name + "', '" + elem.name + "')", 0);
           return false;
       } else {
           elem.style.backgroundColor = validator.backgroundColorOnValid;
           document.getElementById(validator.errorField).innerHTML = "";
           return true;
       }
   },
   
   //verify zipcode+4
   isZipPlus4 : function(elem){
      var str = elem.value;
      var re = /^\d{5}-\d{4}$/;
       if (!str.match(re)) {
           document.getElementById(validator.errorField).innerHTML = "Verify ZipCode Is Correct";
           elem.style.backgroundColor = validator.backgroundColorOnError;
           //setTimeout("focusElement('" + elem.form.name + "', '" + elem.name + "')", 0);
           return false;
       } else {
           elem.style.backgroundColor = validator.backgroundColorOnValid;
           document.getElementById(validator.errorField).innerHTML = "";
           return true;
       }
   },

   //verify Ansi input (alphanumeric, no spaces)
   isAlphanumeric : function(elem){
      var str = elem.value;
      var re = /^[a-zA-Z0-9]+$/;
       if (!str.match(re)) {
           document.getElementById(validator.errorField).innerHTML = "Verify the field is alphanumeric only (no spaces)";
           elem.style.backgroundColor = validator.backgroundColorOnError;
           //setTimeout("focusElement('" + elem.form.name + "', '" + elem.name + "')", 0);
           return false;
       } else {
           elem.style.backgroundColor = validator.backgroundColorOnValid;
           document.getElementById(validator.errorField).innerHTML = "";
           return true;
       }
   },
   
   //verify Positive Integer
   isPositiveInt : function(elem){
      var str = elem.value;
      var re = /^\d+$/;
       if (!str.match(re)) {
           document.getElementById(validator.errorField).innerHTML = "Verify the field is a positive integer";
           elem.style.backgroundColor = validator.backgroundColorOnError;
           //setTimeout("focusElement('" + elem.form.name + "', '" + elem.name + "')", 0);
           return false;
       } else {
           elem.style.backgroundColor = validator.backgroundColorOnValid;
           document.getElementById(validator.errorField).innerHTML = "";
           return true;
       }
   },
   
   
   //verify date with slashes
   isDateSlashes : function(elem){
      var str = elem.value;
      var re = /^\d{1,2}\/\d{1,2}\/\d{4}$/;
       if (!str.match(re)) {
           document.getElementById(validator.errorField).innerHTML = "Verify the field is a date with slashes";
           elem.style.backgroundColor = validator.backgroundColorOnError;
           //setTimeout("focusElement('" + elem.form.name + "', '" + elem.name + "')", 0);
           return false;
       } else {
           elem.style.backgroundColor = validator.backgroundColorOnValid;
           document.getElementById(validator.errorField).innerHTML = "";
           return true;
       }
   },
   
   //verify valid HTML hexadecimal color codes
   isValidHex : function(elem){
      var str = elem.value;
      var re = /^#?([a-f]|[A-F]|[0-9]){3}(([a-f]|[A-F]|[0-9]){3})?$/;
       if (!str.match(re)) {
           document.getElementById(validator.errorField).innerHTML = "Verify the field is correctly hexadecimal color code";
           elem.style.backgroundColor = validator.backgroundColorOnError;
           //setTimeout("focusElement('" + elem.form.name + "', '" + elem.name + "')", 0);
           return false;
       } else {
           elem.style.backgroundColor = validator.backgroundColorOnValid;
           document.getElementById(validator.errorField).innerHTML = "";
           return true;
       }
   },   
   
   //verify its a social security number
   isSSnumber : function(elem){
      var str = elem.value;
      var re = /^\d{3}-\d{2}-\d{4}$/;
       if (!str.match(re)) {
           document.getElementById(validator.errorField).innerHTML = "Verify the field is a social security number";
           elem.style.backgroundColor = validator.backgroundColorOnError;
           //setTimeout("focusElement('" + elem.form.name + "', '" + elem.name + "')", 0);
           return false;
       } else {
           elem.style.backgroundColor = validator.backgroundColorOnValid;
           document.getElementById(validator.errorField).innerHTML = "";
           return true;
       }
   },
   
   //verify its a valid us phone number, it will accept a dot, a space, a dash, a forward slash, between the numbers
   //as well as a 1 or 0 in front, area code is not necessary
   //reg matches : 2405525009 | 1(240) 652-5009 | 240/752-5009 ext.55
   //fails : (2405525009 | 2 (240) 652-5009
   isValidPhone : function(elem){
      var str = elem.value;
      var re = /^(1\s*[-\/\.]?)?(\((\d{3})\)|(\d{3}))\s*[-\/\.]?\s*(\d{3})\s*[-\/\.]?\s*(\d{4})\s*(([xX]|[eE][xX][tT])\.?\s*(\d+))*$/;
       if (!str.match(re)) {
           document.getElementById(validator.errorField).innerHTML = "Verify the field is a social security number";
           elem.style.backgroundColor = validator.backgroundColorOnError;
           //setTimeout("focusElement('" + elem.form.name + "', '" + elem.name + "')", 0);
           return false;
       } else {
           elem.style.backgroundColor = validator.backgroundColorOnValid;
           document.getElementById(validator.errorField).innerHTML = "";
           return true;
       }
   },
   //verify if a check box is checked
   isChecked : function(elem){
      var str = elem;
      var re = str.checked;
   
       if (!re) {
           document.getElementById(validator.errorField).innerHTML = "Verify that you have checked the box";
           elem.style.backgroundColor = validator.backgroundColorOnError;
           return false;
       } else {
           document.getElementById(validator.errorField).innerHTML = "";
           return true;
       }
   },
   
   //focus to an element.. since i prefer on blur I left this out.. since it can cause an infite loop
   //however if u prefer onChange events just uncomment those
   focusElement : function(formName, elemName) {
       var elem = document.forms[formName].elements[elemName];
       //elem.focus();
       //elem.select();
   }
}