function $(id){
	return document.getElementById(id);
}
function isBlank(theString){
	var blank = true;
	if(theString != ''){
		for(x=0; x < theString.length; x++)
		{
			var theChar = theString.charAt(x);
			if(theChar != ' '){
				blank = false;
				break;
			}
		}
	}
	return blank;
}
function isEmail(string){
	if (string.search(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/) != -1){
		return true;
	}else{
		return false;
	}
}
function is_numeric(theString){
	var validChars = "0123456789";
	var result = true;
	for(x=0; x < theString.length; x++)	{
		var theChar = theString.charAt( x);
		// is this char in the set of validChars?
		if(validChars.indexOf( theChar) == -1)		{
			result = false;
			break;
		}
	}
	return result;
}
function trim(str, chars) {
    return ltrim(rtrim(str, chars), chars);
}
function ltrim(str, chars) {
    chars = chars || "\\s";
    return str.replace(new RegExp("^[" + chars + "]+", "g"), "");
}
function rtrim(str, chars) {
    chars = chars || "\\s";
    return str.replace(new RegExp("[" + chars + "]+$", "g"), "");
}
function trim_value(id) {
	$(id).value = trim($(id).value);
}




function addClass(target, classValue){
	var pattern = new RegExp("(^| )" + classValue + "( |$)");
	if (!pattern.test(target.className)){
		if (target.className == ""){
			target.className = classValue;
		}else{
			target.className += " " + classValue;
		}
	}
	return true;
}
function removeClass(target, classValue){
	var removedClass = target.className;
	var pattern = new RegExp("(^| )" + classValue + "( |$)");
	removedClass = removedClass.replace(pattern, "$1");
	removedClass = removedClass.replace(/ $/, "");
	target.className = removedClass;
	return true;
}
function dollars(n)
{
	n = eval(n);
	n = Math.round(n*100)/100;
	return  (n == Math.round(n)) ? n += ".00":
			(n*10 == Math.round(n*10)) ? n += "0": n;
}
function num_val(id){
	var val = $(id).value;
	if(is_numeric(val) == true){
		return val;
	}else{
		return 0;
	}
}














function valid_cc_card_date(month_id, year_id){
	var err = '';
	if( isBlank($(month_id).value) || isBlank($(year_id).value) ){
		err += 'Have not entered a valid credit card expiry date!\r\n';
		return err;
	}else{
		var now = new Date();
		var this_month = eval( now.getMonth() + 1);
		var this_year = now.getFullYear();
		var cc_month = $(month_id).value;
		var cc_year = '20' + $(year_id).value;

		if( (this_year == cc_year) && (cc_month < this_month) ){
			err += 'Credit card has expired!\r\n';
			return err;
		}
	}
	return '';
}
function remove_spaces(the_string){
	var charsArray = the_string.split('');
	var new_string = '';
	for(var x=0; x < charsArray.length; x++){
		if( (charsArray[x] != ' ') && (charsArray[x] != '-') ){
			new_string += charsArray[x];
		}
	}
	return new_string;
}
function Mod10(ccNumb) {  // v2.0
	var valid = "0123456789"  // Valid digits in a credit card number
	var len = ccNumb.length;  // The length of the submitted cc number
	var iCCN = parseInt(ccNumb);  // integer of ccNumb
	var sCCN = ccNumb.toString();  // string of ccNumb
	sCCN = sCCN.replace (/^\s+|\s+$/g,'');  // strip spaces
	var iTotal = 0;  // integer total set at zero
	var bNum = true;  // by default assume it is a number
	var bResult = false;  // by default assume it is NOT a valid cc
	var temp;  // temp variable for parsing string
	var calc;  // used for calculation of each digit

	// Determine if the ccNumb is in fact all numbers
	for (var j=0; j<len; j++) {
	  temp = "" + sCCN.substring(j, j+1);
	  if (valid.indexOf(temp) == "-1"){bNum = false;}
	}

	// if it is NOT a number, you can either alert to the fact, or just pass a failure
	if(!bNum){
	  /*alert("Not a Number");*/bResult = false;
	}

	// Determine if it is the proper length
	if((len == 0)&&(bResult)){  // nothing, field is blank AND passed above # check
	  bResult = false;
	} else{  // ccNumb is a number and the proper length - let's see if it is a valid card number
	  if(len >= 15){  // 15 or 16 for Amex or V/MC
	    for(var i=len;i>0;i--){  // LOOP throught the digits of the card
	      calc = parseInt(iCCN) % 10;  // right most digit
	      calc = parseInt(calc);  // assure it is an integer
	      iTotal += calc;  // running total of the card number as we loop - Do Nothing to first digit
	      i--;  // decrement the count - move to the next digit in the card
	      iCCN = iCCN / 10;                               // subtracts right most digit from ccNumb
	      calc = parseInt(iCCN) % 10 ;    // NEXT right most digit
	      calc = calc *2;                                 // multiply the digit by two
	      // Instead of some screwy method of converting 16 to a string and then parsing 1 and 6 and then adding them to make 7,
	      // I use a simple switch statement to change the value of calc2 to 7 if 16 is the multiple.
	      switch(calc){
	        case 10: calc = 1; break;       //5*2=10 & 1+0 = 1
	        case 12: calc = 3; break;       //6*2=12 & 1+2 = 3
	        case 14: calc = 5; break;       //7*2=14 & 1+4 = 5
	        case 16: calc = 7; break;       //8*2=16 & 1+6 = 7
	        case 18: calc = 9; break;       //9*2=18 & 1+8 = 9
	        default: calc = calc;           //4*2= 8 &   8 = 8  -same for all lower numbers
	      }
	    iCCN = iCCN / 10;  // subtracts right most digit from ccNum
	    iTotal += calc;  // running total of the card number as we loop
	  }  // END OF LOOP
	  if ((iTotal%10)==0){  // check to see if the sum Mod 10 is zero
	    bResult = true;  // This IS (or could be) a valid credit card number.
	  } else {
	    bResult = false;  // This could NOT be a valid credit card number
		}
	  }
	}
  	return bResult; // Return the results
}




var Cards = new makeArray(8);
Cards[0] = new CardType("MasterCard", "51,52,53,54,55", "16");
var MasterCard = Cards[0];
Cards[1] = new CardType("VisaCard", "4", "13,16");
var VisaCard = Cards[1];
Cards[2] = new CardType("AmExCard", "34,37", "15");
var AmExCard = Cards[2];
Cards[3] = new CardType("DinersClubCard", "30,36,38", "14");
var DinersClubCard = Cards[3];
Cards[4] = new CardType("DiscoverCard", "6011", "16");
var DiscoverCard = Cards[4];
Cards[5] = new CardType("enRouteCard", "2014,2149", "15");
var enRouteCard = Cards[5];
Cards[6] = new CardType("JCBCard", "3088,3096,3112,3158,3337,3528", "16");
var JCBCard = Cards[6];
var LuhnCheckSum = Cards[7] = new CardType();

function CardType() {
	var n;
	var argv = CardType.arguments;
	var argc = CardType.arguments.length;

	this.objname = "object CardType";

	var tmpcardtype = (argc > 0) ? argv[0] : "CardObject";
	var tmprules = (argc > 1) ? argv[1] : "0,1,2,3,4,5,6,7,8,9";
	var tmplen = (argc > 2) ? argv[2] : "13,14,15,16,19";

	this.setCardNumber = setCardNumber;  // set CardNumber method.
	this.setCardType = setCardType;  // setCardType method.
	this.setLen = setLen;  // setLen method.
	this.setRules = setRules;  // setRules method.
//	this.setExpiryDate = setExpiryDate;  // setExpiryDate method.

	this.setCardType(tmpcardtype);
	this.setLen(tmplen);
	this.setRules(tmprules);
	if (argc > 4)
	this.setExpiryDate(argv[3], argv[4]);

//	this.checkCardNumber = checkCardNumber;  // checkCardNumber method.
//	this.getExpiryDate = getExpiryDate;  // getExpiryDate method.
	this.getCardType = getCardType;  // getCardType method.
//	this.isCardNumber = isCardNumber;  // isCardNumber method.
//	this.isExpiryDate = isExpiryDate;  // isExpiryDate method.
//	this.luhnCheck = luhnCheck;// luhnCheck method.
	return this;
}
function getCardType() {
	return this.cardtype;
}
function makeArray(size) {
	this.size = size;
	return this;
}
function setCardNumber(cardnumber) {
	this.cardnumber = cardnumber;
	return this;
}
function setCardType(cardtype) {
	this.cardtype = cardtype;
	return this;
}
function setLen(len) {
	// Create the len array.
	if (len.length == 0 || len == null)
		len = "13,14,15,16,19";

	var tmplen = len;
	n = 1;
	while (tmplen.indexOf(",") != -1) {
		tmplen = tmplen.substring(tmplen.indexOf(",") + 1, tmplen.length);
		n++;
	}
	this.len = new makeArray(n);
	n = 0;
	while (len.indexOf(",") != -1) {
		var tmpstr = len.substring(0, len.indexOf(","));
		this.len[n] = tmpstr;
		len = len.substring(len.indexOf(",") + 1, len.length);
		n++;
	}
	this.len[n] = len;
	return this;
}
function setRules(rules) {
	// Create the rules array.
	if (rules.length == 0 || rules == null)
	rules = "0,1,2,3,4,5,6,7,8,9";

	var tmprules = rules;
	n = 1;
	while (tmprules.indexOf(",") != -1) {
		tmprules = tmprules.substring(tmprules.indexOf(",") + 1, tmprules.length);
		n++;
	}
	this.rules = new makeArray(n);
	n = 0;
	while (rules.indexOf(",") != -1) {
		var tmpstr = rules.substring(0, rules.indexOf(","));
		this.rules[n] = tmpstr;
		rules = rules.substring(rules.indexOf(",") + 1, rules.length);
		n++;
	}
	this.rules[n] = rules;
	return this;
}


















































function doSubmit(){
	var errmsg = '';
	var em = $('email').value;

	removeClass($('name'), 'error');
	removeClass($('address'), 'error');
	removeClass($('email'), 'error');
	removeClass($('country'), 'error');
	removeClass($('day_phone'), 'error');
	removeClass($('night_phone'), 'error');
	removeClass($('fax'), 'error');
	
	removeClass($('trip'), 'error');
	removeClass($('preferred_date'), 'error');
	removeClass($('preferred_time'), 'error');
	removeClass($('number_adults'), 'error');
	removeClass($('number_children'), 'error');
	removeClass($('participants'), 'error');
	removeClass($('medical_conditions'), 'error');
	
	removeClass($('comments'), 'error');
	
	removeClass($('cost'), 'error');
	removeClass($('card_number'), 'error');
	removeClass($('expiry_month'), 'error');
	removeClass($('expiry_year'), 'error');
	removeClass($('payment_other'), 'error');
	
	if($('conditions').checked == false){
		errmsg += 'Confirm you have read the booking conditions!\r\n';
		addClass($('conditions'), 'error');
	}
	
	if(isBlank($('name').value)){
		errmsg += '\'Name\' must be filled in!\r\n';
		addClass($('name'), 'error');
	}
	if(isBlank(em)){
		errmsg += 'Must enter an email address!\r\n';
		addClass($('email'), 'error');
	}else if(isEmail(em) != true){
		errmsg += 'Invalid E-mail Address! Please re-enter.\r\n';
		addClass($('email'), 'error');
	}
	
	if( isBlank($('trip').value) ){
		errmsg += 'A trip must be selected!\r\n';
		addClass($('trip'), 'error');
	} else {
		if( isBlank($('preferred_date').value) ){
			errmsg += 'Enter a preferred date for the ' + $('trip').value + ' trip!\r\n';
			addClass($('preferred_date'), 'error');
		}
		if( isBlank($('preferred_time').value) ){
			errmsg += 'Enter a preferred time for the ' + $('trip').value + ' trip!\r\n';
			addClass($('preferred_time'), 'error');
		}
		if( isBlank($('number_adults').value) && isBlank($('number_children').value) ){
			errmsg += 'Enter the number of adults and children participating on the ' + $('trip').value + ' trip!\r\n';
			addClass($('number_adults'), 'error');
			addClass($('number_children'), 'error');
		}
	}


// checking credit card data
	var ccNum = remove_spaces( $('card_number').value );

	if( ccNum != '' ){
	
		var cc_date_validate = valid_cc_card_date('expiry_month', 'expiry_year');
		if(cc_date_validate != ''){
			errmsg += cc_date_validate;
			addClass($('expiry_month'), 'error');
			addClass($('expiry_year'), 'error');
		}
		
		if( Mod10(ccNum) == false ){
			errmsg += 'This is NOT a valid Credit Card Number!';
			addClass($('card_number'), 'error');
		}else{
//alert('got here');

//alert('got here2');
//			errmsg += 'cardname = ' + cardname;
		}
		
		
	}
	

	
	
	
	
// end checking credit card data
	
	
	if(errmsg != ''){
		alert(errmsg);
		return false;
	}
    return true;
}


function calc_cost(){
	var total1 = 0;
	var total2 = 0;
	
	if($('trip').value != ''){

		var trip_name = $('trip').value;
		var adult_price = adult_price_ar[trip_name];
		var child_price = child_price_ar[trip_name];
		
		var total1 = eval( (num_val('number_adults') * adult_price) + (num_val('number_children') * child_price) );
	}
	$('cost').value = dollars( eval(total1) );
}


function init() {
	$('trip').onblur = function () { return calc_cost(); }
	$('number_adults').onblur = function () { trim_value('number_adults'); return calc_cost(); }
	$('number_children').onblur = function () { trim_value('number_children'); return calc_cost(); }
	

	$('book_form').onsubmit = function () {
        		return doSubmit();
    		}
}
window.onload = init;

