function validateForms() {
	var elementsForms;
	
	if (!document.getElementsByTagName) return false;
	elementsForms = document.getElementsByTagName("form"); 
	for (var intCounter = 0; intCounter < elementsForms.length; intCounter++) { 
		return validateForm(elementsForms[intCounter]);
	} 
}
	
function validateForm(currentForm) {
	var blnvalidate = true;
	var elementsInputs;
	var elementsSelects;
	var alertText = '';
	
 	elementsInputs = currentForm.getElementsByTagName("input");
 
	for (var intCounter = 0; intCounter < elementsInputs.length; intCounter++) {
		if (elementsInputs[intCounter].id == "email") {
 			if (validateEmail(elementsInputs, intCounter)) {
 				blnvalidate = false;
 				alertText += "Invalid or missing email address.\n";
			}
		} else if (elementsInputs[intCounter].id == "name_display") {
 			if (validateText(elementsInputs, intCounter, /^.{3,}$/)) {
				for (var i = 0; i < elementsInputs.length; i++) {
          if (elementsInputs[i].id == "anonymous") {
 			      if (elementsInputs[i].checked == false) {
       				blnvalidate = false;
 			        alertText += "Donor display name must be > 2 characters, unless you check the 'Anonymous donation' box.\n";
 			      }
 			    }
        }
		  }
		} else if (elementsInputs[intCounter].id == "name_given") {
 			if (validateText(elementsInputs, intCounter, /^[A-Za-z]{2,}$/)) {
 				blnvalidate = false;
        alertText += "Given name must be > 1 character.\n";
		  }
		} else if (elementsInputs[intCounter].id == "name_family") {
 			if (validateText(elementsInputs, intCounter, /^[A-Za-z]{2,}$/)) {
 				blnvalidate = false;
        alertText += "Family name must be > 1 character.\n";
		  }
		} else if (elementsInputs[intCounter].id == "amount") {
 			if (validateInt(elementsInputs, intCounter)) {
 				blnvalidate = false;
        alertText += "Donation amount must be an integer > 0.\n";
		  }
		} else if (elementsInputs[intCounter].id == "cc_number") {
 			if (validateText(elementsInputs, intCounter, /^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13})$/) ||
 			  !luhn_validate(elementsInputs, intCounter)) {
   				blnvalidate = false;
          alertText += "The credit card number entered is missing, invalid, or from a card not accepted by this website.\n";
		  }
		}
	}

  if (alertText != '') alert("The following problem(s) with your submission were detected. Please correct and try again:\n\n" + alertText);
	return blnvalidate;
}

function validateEmail(elementsInputs, intCounter) {
	var emailFilter=/^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$/;
	//var emailFilter=/^.+@.+\..{2,3}$/;
	if (!emailFilter.test(elementsInputs[intCounter].value)) { 
		return true; 
	} 
}
	
function validateText(elementsInputs, intCounter, regex) {
	if (!regex.test(elementsInputs[intCounter].value)) {
	//if (elementsInputs[intCounter].value == "") {
		return true;
	}
}

function validateInt(elementsInputs, intCounter) {
  var val = elementsInputs[intCounter].value;
  if ((val == null) || (val.length == 0)) return true;

  for (i = 0; i < val.length; i++) {
     var c = val.charAt(i);
     if (!isDigit(c)) return true;
  }
}

function isDigit (c) {
  return ((c >= "0") && (c <= "9"));
}

function luhn_validate(elementsInputs, intCounter) {
  var cardNumber = strrev(elementsInputs[intCounter].value);
  var numSum = 0;

  for (i = 0; i < cardNumber.length; i++) {
    var currentNum = parseInt(cardNumber.charAt(i));

// Double every second digit
    if (i % 2 == 1) currentNum *= 2;

// Add digits of 2-digit numbers together
    if (currentNum > 9) {
      var firstNum = currentNum % 10;
      var secondNum = (currentNum - firstNum) / 10;
      currentNum = firstNum + secondNum;
    }

    numSum += currentNum;
  }

// If the total has no remainder it's OK
  return (numSum % 10 == 0);
}

function strrev(str) {
   if (!str) return '';
   var revstr='';
   for (i = str.length-1; i>=0; i--)
       revstr+=str.charAt(i)
   return revstr;
}

/*
function validateDropdown(elementsSelects, intCounter) {
	var emailFilter=/^Choose subject...$/;
	if (emailFilter.test(elementsSelects[intCounter].value)) { 
		return true; 
	} 
}
*/

function applyOnSubmitToForms() {
	elementsForms = document.getElementsByTagName("form"); 
	for (var intCounter = 0; intCounter < elementsForms.length; intCounter++) { 
		elementsForms[intCounter].onsubmit = function () {
			if (!validateForms()) {
				return false;
			} else {
				//alert("The form has been completed and can be submitted.");
			}
		}
	} 
}		

function addLoadEvent(func) {
 	var oldonload = window.onload;
	if (typeof window.onload != 'function') {
		window.onload = func;
	} else {
		window.onload = function() {
  		oldonload();
  		func();
	  }
	}
}

addLoadEvent(applyOnSubmitToForms);
