// cummulative validator.js by james Zarvis

var element1_array = new Array();
var element2_array = new Array();
var descriptor_array = new Array();
var type_array = new Array();
var fail_color_array = new Array();

var validate_failed = false;
var first_fail = "";

var digits = "0123456789";
// non-digit characters which are allowed in phone numbers
var phoneNumberDelimiters = "()- ";
// characters which are allowed in international phone numbers
// (a leading + is OK)
var validWorldPhoneChars = phoneNumberDelimiters + "+";
// Minimum no of digits in an international phone no.
var minDigitsInIPhoneNumber = 10;

function isInteger(s)
{   var i;
    for (i = 0; i < s.length; i++)
    {
        // Check that current character is number.
        var c = s.charAt(i);
        if (((c < "0") || (c > "9"))) return false;
    }
    // All characters are numbers.
    return true;
}

function stripCharsInBag(s, bag)
{   var i;
    var returnString = "";
    // Search through string's characters one by one.
    // If character is not in bag, append to returnString.
    for (i = 0; i < s.length; i++)
    {
        // Check that current character isn't whitespace.
        var c = s.charAt(i);
        if (bag.indexOf(c) == -1) returnString += c;
    }
    return returnString;
}

function checkInternationalPhone(strPhone){
s=stripCharsInBag(strPhone,validWorldPhoneChars);
return (isInteger(s) && s.length >= minDigitsInIPhoneNumber);
}

function isValidCardNumber(strNum)
{
   var nCheck = 0;
   var nDigit = 0;
   var bEven  = false;

   for (n = strNum.length - 1; n >= 0; n--)
   {
      var cDigit = strNum.charAt (n);
      if (isDigit (cDigit))
      {
         var nDigit = parseInt(cDigit, 10);
         if (bEven)
         {
            if ((nDigit *= 2) > 9)
               nDigit -= 9;
         }
         nCheck += nDigit;
         bEven = ! bEven;
      }
      else if (cDigit != ' ' && cDigit != '.' && cDigit != '-')
      {
         return false;
      }
   }
   return (nCheck % 10) == 0;
}

function isDigit (c)
{
   var strAllowed = "1234567890";
   return (strAllowed.indexOf (c) != -1);
}

function isCardTypeCorrect (strNum, type)
{
   var nLen = 0;
   for (n = 0; n < strNum.length; n++)
   {
      if (isDigit (strNum.substring (n,n+1)))
         ++nLen;
   }

   if (type == 'Visa')
      return ((strNum.substring(0,1) == '4') && (nLen == 13 || nLen == 16));
   else if (type == 'Amex')
      return ((strNum.substring(0,2) == '34' || strNum.substring(0,2) == '37') && (nLen == 15));
   else if (type == 'Master Card')
      return ((strNum.substring(0,2) == '51' || strNum.substring(0,2) == '52'
              || strNum.substring(0,2) == '53' || strNum.substring(0,2) == '54'
              || strNum.substring(0,2) == '55') && (nLen == 16));
   else
      return false;
}

// zip

function validateZIP(field) {
var valid = "0123456789-";
var hyphencount = 0;

if (field.length!=5 && field.length!=10) {
//alert("Please enter your 5 digit or 5 digit+4 zip code.");
return false;
}
for (var i=0; i < field.length; i++) {
temp = "" + field.substring(i, i+1);
if (temp == "-") hyphencount++;
if (valid.indexOf(temp) == "-1") {
//alert("Invalid characters in your zip code.  Please try again.");
return false;
}
if ((hyphencount > 1) || ((field.length==10) && ""+field.charAt(5)!="-")) {
//alert("The hyphen character should be used with a properly formatted 5 digit+four zip code, like '12345-6789'.   Please try again.");
return false;
   }
}
return true;
}

function TextCountValidate (field_text, validate_action, text_limit) {

// validate_action = null, word or char

if ((validate_action == null) || (validate_action == 'char')) {
show_word_count = false;
show_char_count = true;
}else{
show_word_count = true;
show_char_count = false;
}
if (show_char_count == null) {
show_char_count = false;
show_word_count = true;
}

var char_count = document.getElementById(field_text).value.length;
var fullStr = document.getElementById(field_text).value + " ";
var initial_whitespace_rExp = /^[^A-Za-z0-9]+/gi;
var left_trimmedStr = fullStr.replace(initial_whitespace_rExp, "");
var non_alphanumerics_rExp = rExp = /[^A-Za-z0-9]+/gi;
var cleanedStr = left_trimmedStr.replace(non_alphanumerics_rExp, " ");
var splitString = cleanedStr.split(" ");
var word_count = splitString.length -1;
if (fullStr.length <2) {
word_count = 0;
}

if (show_word_count) {
if(word_count > parseInt(text_limit)){
alert ("You are limited to " + text_limit + " Words.  You have used " + word_count + " Words. Please edit to reduce the number of words.");
document.getElementById(field_text).focus();
return word_count;
}
}

if (show_char_count) {
if(char_count > parseInt(text_limit)){
alert ("You are limited to " + text_limit + " Characters.  You have used " + char_count + " Characters. Please edit to reduce the number of Characters.");
document.getElementById(field_text).focus();
return char_count;
}
}

}

function validator_push(element,element2,descriptor,type,fail_color) {
element1_array.push(element);
element2_array.push(element2);
descriptor_array.push(descriptor);
type_array.push(type);
fail_color_array.push(fail_color);
}

function setfailcolor(element,fail_color) {
document.getElementById(element).style.backgroundColor=fail_color;
}

function resetcolor(element) {
document.getElementById(element).style.backgroundColor="";
}

function setfailed(element,fail_color) {
if(! validate_failed){
	first_fail = element;
	validate_failed = true;
}
setfailcolor(element,fail_color);
}

function dovalidate() {
// set some vars
var re=/^.+\@.+\..+\$/;
var regex = /^[\w\.-]+@[\w\.-]+\.[a-zA-Z]{2,3}$/
var alert_text = "";

// now to check all elements in the master validator arrays

for(looper=0;looper<=element1_array.length;looper++){

// type is email,phone,numeric,duplicate,ischecked,ischeckedstop,blank,dropcheck or credit

switch(type_array[looper]){
case 'email':
if(! regex.test(document.getElementById(element1_array[looper]).value))  { alert_text+='Please enter a valid '+descriptor_array[looper]+'.\n'; setfailed(element1_array[looper],fail_color_array[looper]); }else{ resetcolor(element1_array[looper]);  };
break;

case 'phone':
if (document.getElementById(element1_array[looper]).value=="") { alert_text+='You left the '+descriptor_array[looper]+' field blank.\n'; setfailed(element1_array[looper],fail_color_array[looper]); }else{ resetcolor(element1_array[looper]);  };
if (checkInternationalPhone(document.getElementById(element1_array[looper]).value)==false)  { alert_text+='Please enter a valid '+descriptor_array[looper]+'.\n'; setfailed(element1_array[looper],fail_color_array[looper]);  }else{ resetcolor(element1_array[looper]);  };
break;

case 'numeric':
if (document.getElementById(element1_array[looper]).value=="") { alert_text+='You left the '+descriptor_array[looper]+' field blank.\n'; setfailed(element1_array[looper],fail_color_array[looper]); }else{ resetcolor(element1_array[looper]);  };
if (isInteger(document.getElementById(element1_array[looper]).value)==false)  { alert_text+='Please enter a valid '+descriptor_array[looper]+'.\n'; setfailed(element1_array[looper],fail_color_array[looper]); }else{ resetcolor(element1_array[looper]);  };
break;

case 'zipcode':
if (document.getElementById(element1_array[looper]).value=="") { alert_text+='You left the '+descriptor_array[looper]+' field blank.\n'; setfailed(element1_array[looper],fail_color_array[looper]); }else{ resetcolor(element1_array[looper]);  };
if (validateZIP(document.getElementById(element1_array[looper]).value)==false)  { alert_text+='Please enter a valid '+descriptor_array[looper]+'.\n'; setfailed(element1_array[looper],fail_color_array[looper]); }else{ resetcolor(element1_array[looper]);  };
break;

case 'duplicate':
if (document.getElementById(element1_array[looper]).value!=document.getElementById(element2_array[looper]).value) { alert_text+=descriptor_array[looper]+'\n'; setfailed(element1_array[looper],fail_color_array[looper]); }else{ resetcolor(element1_array[looper]);  };
break;

case 'valcheck':
if (document.getElementById(element1_array[looper]).value!=element2_array[looper]) { alert_text+=descriptor_array[looper]+'\n'; setfailed(element1_array[looper],fail_color_array[looper]); }else{ resetcolor(element1_array[looper]);  };
break;

// case 'ischeckedquick':
// if (! document.getElementById(element1_array[looper]).checked) { alert_text+=descriptor_array[looper]+'\n'; setfailcolor(element1_array[looper],fail_color_array[looper]); }else{ resetcolor(element1_array[looper]);  };
// break;

case 'ischecked':
if (! document.getElementById(element1_array[looper]).checked) { alert_text+=descriptor_array[looper]+'\n'; setfailed(element1_array[looper],fail_color_array[looper]); }else{ resetcolor(element1_array[looper]);  };
break;

case 'blank':
if (document.getElementById(element1_array[looper]).value=="") { alert_text+='You left the '+descriptor_array[looper]+' field blank.\n'; setfailed(element1_array[looper],fail_color_array[looper]); }else{ resetcolor(element1_array[looper]);  };
break;

case 'dropcheck':
if (document.getElementById(element1_array[looper]).options[document.getElementById(element1_array[looper]).selectedIndex].value==element2_array[looper]) { alert_text+=descriptor_array[looper]+'\n'; setfailed(element1_array[looper],fail_color_array[looper]); }else{ resetcolor(element1_array[looper]);  };
break;

case 'credit':
if (! isValidCardNumber(document.getElementById(element1_array[looper]).value)) { alert_text+='Your credit card number is invalid.\n'; setfailed(element1_array[looper],fail_color_array[looper]); }else{ resetcolor(element1_array[looper]);  };
break;

// case 'radiocheck':
// var tripval = -1;

//    alert(document.element1_array[looper].length);
//    for (var i=0; i < document.element1_array[looper].length; i++) {
//    if (document.element1_array[looper][i].checked) {tripval = i; i = document.element1_array[looper].length;}
//    }

// if (tripval == -1)  { alert_text+=descriptor_array[looper]+'\n'; setfailed(element1_array[looper],fail_color_array[looper]); }else{ resetcolor(element1_array[looper]);  };
// break;
}


// end for loop
}

if(validate_failed){

// display the alert
alert(alert_text);

// select the first false item on the list
document.getElementById(first_fail).focus();

//alert(document.getElementById(first_fail).type);

if((document.getElementById(first_fail).type != "select")&&(document.getElementById(first_fail).type != "select-one")){
document.getElementById(first_fail).select();
}

// clear the arrays
element1_array = new Array();
element2_array = new Array();
descriptor_array = new Array();
type_array = new Array();
fail_color_array = new Array();

// clear the alert text
alert_text = "";

// clear the boolean variables
validate_failed = false;
first_fail = "";

return false;
} else{
return true;
}
// end function
}