function popup(pageURL,x,y){
	var newwin = window.open( pageURL, "_blank", "toolbar=no,location=no,status=no,menubar=no,scrollbars=yes,width=" + x + ",height=" + y + ",resizable=yes" );
}


function email_check(str) {
	var at="@"
	var dot="."
	var lat=str.indexOf(at)
	var lstr=str.length
	var ldot=str.indexOf(dot)
	if (str.indexOf(at)==-1){
	   return false
	}
	
	if (str.indexOf(at)==-1 || str.indexOf(at)==0 || str.indexOf(at)==lstr){
	   return false
	}
	
	if (str.indexOf(dot)==-1 || str.indexOf(dot)==0 || str.indexOf(dot)==lstr){
		return false
	}
	
	 if (str.indexOf(at,(lat+1))!=-1){
		return false
	 }
	
	 if (str.substring(lat-1,lat)==dot || str.substring(lat+1,lat+2)==dot){
		return false
	 }
	
	 if (str.indexOf(dot,(lat+2))==-1){
		return false
	 }
	
	 if (str.indexOf(" ")!=-1){
		return false
	 }

	 return true					
}

function mailinglist_check(){
	if(email_check(document.mailinglist_form.mailinglist.value) == false){
		alert('Your email address is invalid.');
		return false;
	}
	else if(document.mailinglist_form.radiobutton[0].checked == false && document.mailinglist_form.radiobutton[1].checked == false){
		alert('You must select subscribe or unsubscribe.');
		return false;
	}
	return true;
}

// this will verify the form contents
function check_form(){
	var isError = false;
	var errorMsg = "";
	var good_char = "0123456789.";

	try{
		// make sure the form is complete
		if(document.address_form.Name.value == ''){
			isError = true;
			errorMsg += "\nYour name must be included.";
		}
		if(document.address_form.CC_NUMBER){
			if(document.address_form.CC_NUMBER.value == ''){
				isError = true;
				errorMsg += "\nYour credit card number must be included.";
			}
			else{
				var found = false;
				for(var i = 0; i < cc_choices.length; i++){
						if(cc_choices[i] == document.address_form.CC_TYPE.value){
							found = true;
							break;
						}
				}
				if(found == true && checkCreditCard (document.address_form.CC_NUMBER.value, document.address_form.CC_TYPE.value) == false){
					isError = true;
					errorMsg += "\nThe credit card number is incorrect.";
				}
			}
		}
		if(document.address_form.CC_TYPE && document.address_form.CC_TYPE.value == ''){
			isError = true;
			errorMsg += "\nYour credit card type must be included.";
		}
		if(document.address_form.CC_EXPIRE_Y && document.address_form.CC_EXPIRE_Y.value == ''){
			isError = true;
			errorMsg += "\nYour credit card expirey year must be included.";
		}
		if(document.address_form.CC_EXPIRE_M && document.address_form.CC_EXPIRE_M.value == ''){
			isError = true;
			errorMsg += "\nYour credit card expirey month must be included.";
		}
		if(document.address_form.CC_CVV && document.address_form.CC_CVV.value == ''){
			isError = true;
			errorMsg += "\nA credit cards cvv must be included.";
		}
		if(document.address_form.Address1.value == ''){
			isError = true;
			errorMsg += "\nA street address must be included.";
		}
		if(document.address_form.City.value == ''){
			isError = true;
			errorMsg += "\nA city must be included.";
		}
		if(document.address_form.ZipCode.value == ''){
			isError = true;
			errorMsg += "\nA zip code must be included.";
		}
		if(document.address_form.Country.value == ''){
			isError = true;
			errorMsg += "\nA country must be included.";
		}
		if(document.address_form.Email.value == ''){
			isError = true;
			errorMsg += "\nAn email address must be included.";
		}

		if(isError == true){
			alert(errorMsg);
			return false;
		}
		else{
			return true;
		}
	}
	catch(e){
		if(e instanceof TypeError){
			alert("You must fill out the form completely and correctly!");
			alert("An exception occurred in the script. Error name: " + e.name + ". Error message: " + e.message);
			return false;
		}
		else if(e instanceof SyntaxError){
			alert("There is an error in the JavaScript code. Please inform the webmaster of this site.");
			return false;
		}
		else if(e instanceof RangeError){
			alert("You must fill out the form completely and correctly!");
			return false;
		}
		else if(e instanceof ReferenceError){
			alert("There is an error in the site code. Please inform the webmaster of this site.");
			return false;
		}
		else{
			alert("An exception occurred in the script. Error name: " + e.name + ". Error message: " + e.message);
			return false;
		}
		
	}
	finally{
		//alert("finally");
	}
}

// creates popup that explains what a cvv number is
function open_cvv(){
	thewindow = window.open('cc_cvv.html', 'cnew', config='height=400,width=450,toolbar=no,menubar=no,scrollbars=yes,resizable=no,location=no,directories=no,status=yes');
}

var ccErrorNo = 0;
var ccErrors = new Array ()

ccErrors [0] = "Unknown card type";
ccErrors [1] = "No card number provided";
ccErrors [2] = "Credit card number is in invalid format";
ccErrors [3] = "Credit card number is invalid";
ccErrors [4] = "Credit card number has an inappropriate number of digits";

var cc_choices = new Array('Visa','MasterCard','DinersClub','CarteBlanche','AmEx');

function checkCreditCard (cardnumber, cardname) {

  // Array to hold the permitted card characteristics
  var cards = new Array();

  // Define the cards we support. You may add addtional card types.
  
  //  Name:      As in the selection box of the form - must be same as user's
  //  Length:    List of possible valid lengths of the card number for the card
  //  prefixes:  List of possible prefixes for the card
  //  checkdigit Boolean to say whether there is a check digit
  
  cards [0] = {name: "Visa", 
               length: "13,16", 
               prefixes: "4",
               checkdigit: true};
  cards [1] = {name: "MasterCard", 
               length: "16", 
               prefixes: "51,52,53,54,55",
               checkdigit: true};
  cards [2] = {name: "DinersClub", 
               length: "14,", 
               prefixes: "300,301,302,303,304,305,36,38",
               checkdigit: true};
  cards [3] = {name: "CarteBlanche", 
               length: "14", 
               prefixes: "300,301,302,303,304,305,36,38",
               checkdigit: true};
  cards [4] = {name: "AmEx", 
               length: "15", 
               prefixes: "34,37",
               checkdigit: true};
               
  // Establish card type
  var cardType = -1;
  for (i=0; i<cards.length; i++) {

    // See if it is this card (ignoring the case of the string)
    if (cardname.toLowerCase () == cards[i].name.toLowerCase()) {
      cardType = i;
      break;
    }
  }
  
  // If card type not found, report an error
  if (cardType == -1) {
     ccErrorNo = 0;
     return false; 
  }
   
  // Ensure that the user has provided a credit card number
  if (cardnumber.length == 0)  {
     ccErrorNo = 1;
     return false; 
  }
  
  // Check that the number is numeric, although we do permit a space to occur  
  // every four digits. 
  var cardNo = cardnumber
  var cardexp = /^([0-9]{4})\s?([0-9]{4})\s?([0-9]{4})\s?([0-9]{1,4})$/;
  if (!cardexp.exec(cardNo))  {
     ccErrorNo = 2;
     return false; 
  }
    
  // Now remove any spaces from the credit card number
  cardexp.exec(cardNo);
  cardNo = RegExp.$1 + RegExp.$2 + RegExp.$3 + RegExp.$4;
       
  // Now check the modulus 10 check digit - if required
  if (cards[cardType].checkdigit) {
    var checksum = 0;                                  // running checksum total
    var mychar = "";                                   // next char to process
    var j = 1;                                         // takes value of 1 or 2
  
    // Process each digit one by one starting at the right
    for (i = cardNo.length - 1; i >= 0; i--) {
    
      // Extract the next digit and multiply by 1 or 2 on alternative digits.
      calc = Number(cardNo.charAt(i)) * j;
    
      // If the result is in two digits add 1 to the checksum total
      if (calc > 9) {
        checksum = checksum + 1;
        calc = calc - 10;
      }
    
      // Add the units element to the checksum total
      checksum = checksum + calc;
    
      // Switch the value of j
      if (j ==1) {j = 2} else {j = 1};
    } 
  
    // All done - if checksum is divisible by 10, it is a valid modulus 10.
    // If not, report an error.
    if (checksum % 10 != 0)  {
     ccErrorNo = 3;
     return false; 
    }
  }  

  // The following are the card-specific checks we undertake.
  var LengthValid = false;
  var PrefixValid = false; 
  var undefined; 

  // We use these for holding the valid lengths and prefixes of a card type
  var prefix = new Array ();
  var lengths = new Array ();
    
  // Load an array with the valid prefixes for this card
  prefix = cards[cardType].prefixes.split(",");
      
  // Now see if any of them match what we have in the card number
  for (i=0; i<prefix.length; i++) {
    var exp = new RegExp ("^" + prefix[i]);
    if (exp.test (cardNo)) PrefixValid = true;
  }
      
  // If it isn't a valid prefix there's no point at looking at the length
  if (!PrefixValid) {
     ccErrorNo = 3;
     return false; 
  }
    
  // See if the length is valid for this card
  lengths = cards[cardType].length.split(",");
  for (j=0; j<lengths.length; j++) {
    if (cardNo.length == lengths[j]) LengthValid = true;
  }
  
  // See if all is OK by seeing if the length was valid. We only check the 
  // length if all else was hunky dory.
  if (!LengthValid) {
     ccErrorNo = 4;
     return false; 
  };   
  
  // The credit card is in the required format.
  return true;
}
