function formCheck(form) {
	var retVal = true;
	var bPublicationSelected = false;
	var bFormHasPublications = false;
	var fields = form.getElementsByTagName('input');
	for(var i = 0; i < fields.length; i ++) {
		if(retVal) {
			if(fields[i].className == 'mandatory' && fields[i].value == '') {
				alert('Please make sure all fields with red stars are filled in.');
				fields[i].focus();
				i = fields.length;
				retVal = false;
			}
			if(retVal) {
				switch(fields[i].id.toLowerCase()) {
					case 'email':
					case 'alternateemail':
						if(fields[i].value.search(/.*\@.*\..*/) != 0) {
							if(fields[i].id.toLowerCase() == 'email') {
								alert('Please enter a valid email address');
								fields[i].focus();
								retVal = false;
							} else if(fields[i].value != '') {
								alert('Please enter a valid alternate email address');
								fields[i].focus();
								retVal = false;
							}
						}
					default:
						break;
				}

			}
		}
	}
	if(retVal) {
		//check the CC
		var ccField = document.getElementById('ccnumber');
		if(ccField) {
			var ccnumber = document.getElementById('ccnumber').value;
			chosenCC = form.cctype.options[form.cctype.selectedIndex].innerHTML;
			ccnumber = ccnumber.replace(/[^0-9]/g, '');
			switch(chosenCC) {
				case 'Visa':
					retVal = isVisa(ccnumber);
					if(!retVal) alert('Not a valid Visa Credit Card Number.');
					break;
				case 'Mastercard':
					retVal = isMasterCard(ccnumber);
					if(!retVal) alert('Not a valid Matercard Credit Card Number.');
					break;
				case 'American Express':
					retVal = isAmericanExpress(ccnumber);
					if(!retVal) alert('Not a valid American Express Credit Card Number.');
					break;
				case 'Discover':
					retVal = isDiscover(ccnumber);
					if(!retVal) alert('Not a valid Discover Credit Card Number.');
					break;
				default:
					retVal = false;
					break;
			}
		}
	}
	if(retVal) {
		//check the passwords
		var passwordField = document.getElementById('password');
		var passwordField2 = document.getElementById('password2');
		if(passwordField && passwordField2) {
			if(passwordField.value != passwordField2.value) {
				alert('Passwords do not match');
				retVal = false;
			}
		}
	}
	if(retVal && !bPublicationSelected && bFormHasPublications) {
		alert('Please select at least one publication to subscribe to!');
		retVal = false;
	}
	return retVal;
}

function checkForFilledRadio(sName) {
	var bChecked = false;
	if(sName && sName != '' && document.getElementsByName) {
		var radios = document.getElementsByName(sName);
		if(radios && radios.length >= 1) {
			for(var i = 0; i < radios.length; i ++)  {
				if(radios[i].checked) bChecked = true;
			}
		}
	}
	return bChecked
}

function inArray(array, value) {
	var retVal = -1;
	for(var i = 0; i < array.length; i ++) {
		if(array[i] == value) {
			retVal = i;
			break;
		}
	}
	return retVal;
}

function toggleShippingAddress(checkbox) {
	var nonMandatory = new Array('billing_address2', 'billing_address2_label');
	if(checkbox) {
		var sClass = (!checkbox.checked)?'mandatory':'disabled';
		var bDisabled = (checkbox.checked);
		var container = (checkbox.parentNode && checkbox.parentNode.parentNode)?checkbox.parentNode.parentNode:null;
		if(container && container.getElementsByTagName) {
			var targetInputs = container.getElementsByTagName('input');
			var targetSelects = container.getElementsByTagName('select');
			var finalList = new Array();
			for(var i = 0; i < targetInputs.length; i ++) finalList[finalList.length] = targetInputs[i];
			for(var i = 0; i < targetSelects.length; i ++) finalList[finalList.length] = targetSelects[i];
			if(finalList.length >= 1) {
				var targetLabels = container.getElementsByTagName('label');
				if(targetLabels && targetLabels.length && targetLabels.length >= 1) {
					for(var i = 0; i < finalList.length; i ++) {
						if(finalList[i].id != 'use_shipping' && inArray(nonMandatory, finalList[i].id) < 0) {
							finalList[i].className = sClass;
							finalList[i].disabled = bDisabled;
						} else if(finalList[i].id != 'use_shipping') {
							if(sClass == 'mandatory') targetInputs[i].className = '';
							else finalList[i].className = sClass;
							finalList[i].disabled = bDisabled;
						}
					}
					for(var i = 0; i < targetLabels.length; i ++) {
						if(targetLabels[i].id != 'use_shipping_label' && inArray(nonMandatory, targetLabels[i].id) < 0) {
							targetLabels[i].className = sClass;
						} else if(targetLabels[i].id != 'use_shipping_label') {
							if(sClass == 'mandatory') targetLabels[i].className = '';
							else targetLabels[i].className = sClass;
						}
					}
				}
			}
		}
	}
}

function validate_creditcard(cardNumber) {
	var isValid = false;
	if(cardNumber.replace(/ /g, '') != '') {
		//Make sure we have nothing but numbers and spaces
		var ccCheckRegExp = /[^\d ]/;
		isValid = !ccCheckRegExp.test(cardNumber);
		if (isValid){
			var cardNumbersOnly = cardNumber.replace(/[^0-9]/g, '');
			var cardNumberLength = cardNumbersOnly.length;
			//Test for mastercard
			isValid = cardNumberLength == 16 && cardNumbersOnly.search(/^5[1-5]/) >= 0;
			//Test for visa
			(!isValid)?isValid = (cardNumberLength == 16 || cardNumberLength == 13) && cardNumbersOnly.search(/^4/) >= 0:null;
			//Test for amex
			(!isValid)?isValid = cardNumberLength == 15 && cardNumbersOnly.search(/^3[47]/) >= 0:null;
			//Test for discover
			(!isValid)?isValid = cardNumberLength == 16 && cardNumbersOnly.search(/^6011/) >= 0:null;
			//Test for diners club
			(!isValid)?isValid = cardNumberLength == 14 && (cardNumbersOnly.search(/^30[0-5]/) || cardNumbersOnly.search(/^3[68]/) >= 0):null;
			//Test for the first kind of JCB
			(!isValid)?isValid = cardNumberLength == 16 && cardNumbersOnly.search(/^3/) >= 0:null;
			//Test for the second kind of JCB
			(!isValid)?isValid = cardNumberLength == 15 && (cardNumbersOnly.search(/^2131/) || cardNumbersOnly.search(/^1800/) >= 0):null;
		}
		//If it's a valid card type, check for a valid number combination (Mod 10)
		if (isValid){
			var numberProduct;
			var numberProductDigitIndex;
			var checkSumTotal = 0;
			
			for (digitCounter = cardNumberLength - 1; digitCounter >= 0; digitCounter--){
				checkSumTotal += parseInt (cardNumbersOnly.charAt(digitCounter));
				digitCounter--;
				numberProduct = String((cardNumbersOnly.charAt(digitCounter) * 2));
				for (var productDigitCounter = 0;productDigitCounter < numberProduct.length;productDigitCounter++){
					checkSumTotal += parseInt(numberProduct.charAt(productDigitCounter));
				}
			}
			isValid = (checkSumTotal % 10 == 0);
		}
	}
	return isValid
}


function isVisa(cc)
{
  if (((cc.length == 16) || (cc.length == 13)) &&
      (cc.substring(0,1) == 4))
    return isCreditCard(cc);
  return false;
}  // END FUNCTION isVisa()


function isMasterCard(cc)
{
  firstdig = cc.substring(0,1);
  seconddig = cc.substring(1,2);
  if ((cc.length == 16) && (firstdig == 5) &&
      ((seconddig >= 1) && (seconddig <= 5)))
    return isCreditCard(cc);
  return false;

} // END FUNCTION isMasterCard()


function isAmericanExpress(cc)
{
  firstdig = cc.substring(0,1);
  seconddig = cc.substring(1,2);
  if ((cc.length == 15) && (firstdig == 3) &&
      ((seconddig == 4) || (seconddig == 7)))
    return isCreditCard(cc);
  return false;

} // END FUNCTION isAmericanExpress()


function isDiscover(cc)
{
  first4digs = cc.substring(0,4);
  if ((cc.length == 16) && (first4digs == "6011"))
    return isCreditCard(cc);
  return false;

} // END FUNCTION isDiscover()

/*  ================================================================
    FUNCTION:  isCreditCard(st)
 
    INPUT:     st - a string representing a credit card number

    RETURNS:  true, if the credit card number passes the Luhn Mod-10
		    test.
	      false, otherwise
    ================================================================ */

function isCreditCard(st) {
  // Encoding only works on cards with less than 19 digits
  if (st.length > 19)
    return (false);

  sum = 0; mul = 1; l = st.length;
  for (i = 0; i < l; i++) {
    digit = st.substring(l-i-1,l-i);
    tproduct = parseInt(digit ,10)*mul;
    if (tproduct >= 10)
      sum += (tproduct % 10) + 1;
    else
      sum += tproduct;
    if (mul == 1)
      mul++;
    else
      mul--;
  }
// Uncomment the following line to help create credit card numbers
// 1. Create a dummy number with a 0 as the last digit
// 2. Examine the sum written out
// 3. Replace the last digit with the difference between the sum and
//    the next multiple of 10.

//  document.writeln("<BR>Sum      = ",sum,"<BR>");
//  alert("Sum      = " + sum);

  if ((sum % 10) == 0)
    return (true);
  else
    return (false);

} // END FUNCTION isCreditCard()

