// custom validation for wForms to make it much much better!
function oc(a)
{
  var o = {};
  for(var i=0;i<a.length;i++)
  {
    o[a[i]]='';
  }
  return o;
}



 wFORMS.behaviors['validation'].custom_validation = function(element,classname) {
      var wBehavior = wFORMS.behaviors['validation'];         // shortcut

      var nbErrors = 0;

      if(wBehavior.isEmpty(element.value)) return 0;         // if it's not require already, don't check blank fields

      if (classname.indexOf('|') != -1) {                  // looking for 'validate-something|this|that' in classname
         var options = classname.split('|');
         classname = options[0];
         for (z=1; z<options.length; z++){               // check for field names in options and get values
            obj = document.getElementsByName(options[z]);
            value = false;
            for (i=0; i<obj.length; i++) {
               v = wBehavior.getFieldValue(obj[i]);
               if (v) value = (typeof(v) == 'string') ? v : v[0];
            }
            if (value) options[z] = value;
         }
      }
            
      switch(classname) {
         case "validate-minlen":
         case "validate-minlength":
            if (!options[1]) return;
            if (element.value.length < eval(options[1])) {
               wBehavior.showError(element, "Minimum "+options[1]+" characters");
               nbErrors++;
            }
            break;
         case "validate-maxlen":
         case "validate-maxlength":
            if (!options[1]) return;
            if (element.value.length > eval(options[1])) {
               wBehavior.showError(element, "Maximum "+options[1]+" characters");
               nbErrors++;
            }
            break;
         case "validate-within":
            if (!options[1]) return;
            if (!options[2]) return;
            if (!(element.value >= options[1] && element.value <= options[2])) {
               wBehavior.showError(element, "Must be within "+options[1]+" and "+options[2]+".");
               nbErrors++;
            }
            break;
         case "validate-lt":
         case "validate-less":
            if (!options[1]) return;
            if (!element.value < options[1]) {
               wBehavior.showError(element, "Must be less than "+options[1]+".");
               nbErrors++;
            }
            break;
         case "validate-gt":
         case "validate-greater":
            if (!options[1]) return;
            if (!element.value > options[1]) {
               wBehavior.showError(element, "Must be greater than "+options[1]+".");
               nbErrors++;
            }
            break;
         case "validate-eq":
         case "validate-equal":
            if (!options[1]) return;
            if (element.value != options[1]) {
               wBehavior.showError(element, "Values don't match.");
               nbErrors++;
            }
            break;
         case "validate-ne":
         case "validate-neq":
         case "validate-notequal":
            if (!options[1]) return;
            if (element.value == options[1]) {
               wBehavior.showError(element, "Values can not be the same.");
               nbErrors++;
            }
            break;
         case "validate-number":
         case "validate-numeric":
            if(!wBehavior.isInteger(element.value)) {
               wBehavior.showError(element, wBehavior.errMsg_integer);
               nbErrors++;
            }               
            break;
         case "validate-mod10":
            if (!isMod10()) {
               wBehavior.showError(element, "This is not a valid number.");
               nbErrors++;
            }
            break;
         case "validate-creditcard":
            if (!isMod10()) {
               wBehavior.showError(element, "This is not a valid credit card.");
               nbErrors++;
               return;
            }
            switch (options[1]) {
               case 'V'      : var ccReg = /^4\d{12}(\d{3})?$/; break;         // Visa
               case 'M'      : var ccReg = /^5[1-5]\d{14}$/; break;            // Mastercard
               case 'D'      :                                        // Discover
               case 'S'      : var ccReg = /^6011\d{12}$/; break;            // Discover (why S?)
               case 'A'      : var ccReg = /^3[4|7]\d{13}$/; break;            // American Express
            //   case 'DINERS'   : var ccReg = /^3[0|6|8]\d{12}$/; break;
            //   case 'ENROUTE'   : var ccReg = /^2[014|149]\d{11}$/; break;
            //   case 'JCB'      : var ccReg = /^3[088|096|112|158|337|528]\d{12}$/; break;
            //   case 'SWITCH'   : var ccReg = /^(49030[2-9]|49033[5-9]|49110[1-2]|4911(7[4-9]|8[1-2])|4936[0-9]{2}|564182|6333[0-4][0-9]|6759[0-9]{2})\d{10}(\d{2,3})?$/; break;
            //   case 'DELTA'   : var ccReg = /^4(1373[3-7]|462[0-9]{2}|5397[8|9]|54313|5443[2-5]|54742|567(2[5-9]|3[0-9]|4[0-5])|658[3-7][0-9]|659(0[1-9]|[1-4][0-9]|50)|844[09|10]|909[6-7][0-9]|9218[1|2]|98824)\d{10}$/; break;
            //   case 'SOLO'      : var ccReg = /^(6334[5-9][0-9]|6767[0-9]{2})\d{10}(\d{2,3})?$/; break;
            // Add additonal card types here
               default         : var ccReg = /^0\d{22}$/; // field definition should make this impossible
            }
            if (!ccReg.test(element.value)) {
               wBehavior.showError(element, "Invalid credit card type/number.");
               nbErrors++;
            }
            break;
         case "validate-zipcode":
            if (options[1]) {
               if ( (options[1]=='USA' && isUSAzip(element.value)) ||
                    (options[1]=='CAN' && isCANzip(element.value)) ) break;
            }
            if (isUSAzip(element.value) || isCANzip(element.value)) break;
            wBehavior.showError(element, "This is not a valid zip/postal code.");
            nbErrors++;
            break;
         case "validate-zipusa":
            if (!isUSAzip(element.value)) {
               wBehavior.showError(element, "This is not a valid zip code.");
               nbErrors++;
            }
            break;
         case "validate-zipcan":
            if (!isCANzip(element.value)) {
               wBehavior.showError(element, "This is not a valid postal code.");
               nbErrors++;
            }
            break;
         case "validate-phonenumber":
         case "validate-phone":
            regex   = new RegExp(/^\(?(\d{3})\)?[\s-\.]?(\d{3})[\s-\.]?(\d{4})$/);
            if (!regex.test(element.value)) {
               wBehavior.showError(element, "This is not a valid phone number.");
               nbErrors++;
            } else {
               matched = regex.exec(element.value);
               element.value = '(' + matched[1] + ") " + matched[2] + "-" + matched[3];
            }
            break;      
         case "validate-name":
            regex   = new RegExp(/^[a-zA-Z\s.\-\']+$/);
            if (!regex.test(element.value)) {
               wBehavior.showError(element, "This name appears to be invalid.");
               nbErrors++;
            }
            break; 
            case "validate-price":
            regex   = new RegExp(/^[0-9]+$/);
            if (!regex.test(element.value)) {
               wBehavior.showError(element, "Please enter a price with no pound sign");
               nbErrors++;
            }
            break; 
			case "validate-usernameExists":
			   if (element.value in oc(usernameArray) ) {
               wBehavior.showError(element, "Username already in use - please choose another one");
               nbErrors++;
            }
            break;
		 case "validate-pagename":
            regex   = new RegExp(/^[a-zA-Z\-\_]+$/);
            if (!regex.test(element.value)) {
               wBehavior.showError(element, "Please enter a page name / url with no spaces");
               nbErrors++;
            }
			case "validate-pagenameExists":
			   if (element.value in oc(pagenameArray) ) {
               wBehavior.showError(element, "page name / url already in use - please choose another one");
               nbErrors++;
            }
            break;
		 case "validate-username":
            regex   = new RegExp(/^(?=.*[a-zA-Z])(?!.*\s).{4,20}$/);
            if (!regex.test(element.value)) {
               wBehavior.showError(element, "Please enter a username between 4 and 20 characters with no spaces");
               nbErrors++;
            }
            break; 	
		 case "validate-pword":
            regex   = new RegExp(/^(?=.*[a-z])(?=.*[A-Z])(?!.*\s).{6,12}$/);
            if (!regex.test(element.value)) {
               wBehavior.showError(element, "Please enter a password between 6 and 12 characters with no spaces and at least 1 uppercase letter");
               nbErrors++;
            }
            break; 
		 case "validate-pagename":
            regex   = new RegExp(/^[a-z0-9\-_]+$/);
            if (!regex.test(element.value)) {
               wBehavior.showError(element, "Please enter a page url with no spaces");
               nbErrors++;
            }
            break; 
		 case "validate-ukdate":
            regex   = new RegExp(/^\d{2}\-\d{2}\-\d{4}$/);
            if (!regex.test(element.value)) {
               wBehavior.showError(element, "Please enter a date in the format dd-mm-yyyy");
               nbErrors++;
            }
            break;	
         case "validate-street":
         case "validate-address":
         case "validate-city":
            regex   = new RegExp(/^[a-zA-Z0-9\s.#\(\)\-]+$/);
            if (!regex.test(element.value)) {
               wBehavior.showError(element, "This "+classname.substr(9)+" appears to be invalid.");
               nbErrors++;
            }
            break;      
         case "validate-nopobox":
            regex   = new RegExp(/P\.* *O\.* *B*O*X*/i);
            if (regex.test(element.value)) {
               wBehavior.showError(element, "P.O. box not allowed.");
               nbErrors++;
            }
            break;      

      } //switch
      return nbErrors;

      // validation functions
      
      isUSAzip = function(s) {
         var regex = new RegExp(/^(\d{5})[\-\s]?(\d{4})?$/);
         if (!regex.test(s)) return false;
         matched = regex.exec(s);
         matched.shift();
         s = matched.join(' ');            // always adds space
         s = s.replace(/^\s+|\s+$/g, '') ;   // trim trailing spaces
         s = s.replace(' ','-');            // replace inner space with '-'
         element.value = s;
         return true;
      }
      isCANzip = function(s) {
         s = s.toUpperCase();
         s = s.replace('-',' ');
         var regex = new RegExp(/^([A-Z]\d[A-Z])[\-\s]?(\d[A-Z]\d)$/);
         if (!regex.test(s)) return false;
         matched = regex.exec(s);
         element.value = matched[1] + " " + matched[2];
         return true;
      }
      isMod10 = function() {
         element.value = element.value.split("-").join("");
         // Add even digits in even length strings or odd digits in odd length strings.
         var checksum = 0;
         for (var i=(2-(element.value.length % 2)); i<=element.value.length; i+=2) {
               checksum += parseInt(element.value.charAt(i-1));
         }
         // Analyze odd digits in even length strings or even digits in odd length strings.
         for (var i=(element.value.length % 2) + 1; i<element.value.length; i+=2) {
            var digit = parseInt(element.value.charAt(i-1)) * 2;
            if (digit < 10) { checksum += digit; } else { checksum += (digit-9); }
         }
         return ((checksum % 10) == 0);
      }
            
   } 