function toggle_submit(o){
	if( o.disabled == true ){
		o.disabled = false;
		o.setAttribute("value","Submit Reservation Request");
	}else{
		o.disabled = true;
		o.setAttribute("value","Processing...");
	}
}

function toggle_error(){
	var single = arguments.length;
	for( var i = 0 ; i < arguments.length ; i++ ){
		var tmp = arguments[i];
		if( tmp.className && tmp.className.toString().indexOf("error") >= 0 ){
			tmp.className = tmp.className.replace("error","");
		}else{
			if( single < 3 ){
				tmp.className = "error";
			}
		}
	}
}

function credit_card_check( cc_number, cc_type ){
		var regex_prefix = "";
		var cc_valid = false;
		cc_number = cc_number.replace( / /g , '' );
		// requires global one
		
		// CC_REGEX  = {"key":"regex",};
		
		// vs, mc/ec, ae
		// check number length
		//switch( cc_type ){
//			case "vs":	// visa
		//		regex_prefix = /^4(.{12}|.{15})$/;
//				break;
	//		case "dnc":	// dinners club
			//	regex_prefix = /^3(0[0-5].{11}|[68].{12})$/;
//				break;				
		//	case "cb": 	// carte blanche
//				regex_prefix = /^3(0[0-5].{11}|[68].{12})$/;
	//			break;				
	//		case "dc":	// discover card							
			//	regex_prefix = /^6011.{12}$/;
		//		break;				
	//		case "jcb":	// JCB
			//	regex_prefix = /^(3.{15}|(2131|1800).{11})$/;
		//		break;				
	//		case "er":	// en Route
			//	regex_prefix = /^2(014|149).{11}$/;
//				break;				
	//		case "mc":	// mastercard
				regex_prefix = /^5[1-5].{14}$/;					
//				break;
//			case "ec":	// eurocard
//				regex_prefix = /^5[1-5].{14}$/;					
//				break;
//			case "ae":
//				regex_prefix = /^3[47].{13}$/;
//			default:
//				break;
//		}
		// check prefix numbers
		cc_valid = CC_REGEX[ cc_type ].test( cc_number );	
		if( ! cc_valid ){
			return false;
		}
		return credit_card_check_luhn( cc_number );
}


function credit_card_check_luhn( n ){
	var numberProduct;
	var numberProductDigitIndex;
	var checkSumTotal = 0;
	for( i = n.length - 1 ; i >= 0 ; i-- ){
		checkSumTotal += parseInt( n.charAt( i ) );
		i--;
		numberProduct = String( ( n.charAt( i ) * 2 ) );
		for( var ip = 0; ip < numberProduct.length; ip++ ){
			checkSumTotal += parseInt( numberProduct.charAt( ip ) );
		}
	}
	return ( checkSumTotal % 10 == 0 );			
}

function reservation_form(frm){
	// disable submit button first
	var ret = true;
	var msg = [];
	var today = new Date();
	var date_base_month = ( today.getMonth() + 1 ).toString();
	var date_base_year = today.getFullYear();
	var date_base =  date_base_year + "" + ( ( date_base_month.length == 1 ) ? "0" + "" + date_base_month : date_base_month );
	var btn_submit = document.getElementById("btnSubmit");
	toggle_submit( btn_submit );			

	// regexes
	var regex_digits = /\d+/;
	var regex_text = /.+/;
	var regex_email = /.+@.+\..+/;

	// required ones
	var first_name = document.getElementById("txtFirstName");			
	var last_name = document.getElementById("txtLastName");			
	var tel = document.getElementById("txtTelephone");			
	var country = document.getElementById("cboCountry");			
	var email = document.getElementById("txtEmail");			
	var cc = document.getElementById("cboCreditCard");			
	var cc_type = cc.options[ cc.selectedIndex ].value;
	var cc_type_text = cc.options[ cc.selectedIndex ].text;
	var cc_number = document.getElementById("txtCreditCardNumber");			
	var cc_dm = document.getElementById("cboCreditCardMonth");			
	var cc_date_month = cc_dm.options[ cc_dm.selectedIndex ].value;
	var cc_dy = document.getElementById("cboCreditCardYear");			
	var cc_date_year = cc_dy.options[ cc_dy.selectedIndex ].value;			
	var cc_name = document.getElementById("txtCreditCardHolder");			
	var cc_address = document.getElementById("txtCreditCardAddress");			
	var disclaimer = document.getElementById("chkAgree");			

	// resubmit
	toggle_error( first_name, last_name, tel, country, email, cc_number, cc_name, cc_address, disclaimer );

	// some client side checks
	if( ! ( first_name.value && first_name.value.length > 1 ) ){
		msg.push( "A valid First Name" );
		toggle_error( first_name );
		ret = false;
	}
	if( ! ( last_name.value && last_name.value.length > 1 ) ){
		msg.push( "A valid Last Name" );
		toggle_error( last_name );				
		ret = false;
	}
	if( ! ( tel.value && regex_digits.test( tel.value ) ) ){
		msg.push( "A valid Telephone number" );
		toggle_error( tel );				
		ret = false;
	}
	if( ! ( email.value && regex_email.test( email.value ) ) ){
		msg.push( "A valid Email address" );
		toggle_error( email );				
		ret = false;
	}
	if( ! ( credit_card_check(cc_number.value, cc_type ) ) ){
		msg.push( "A valid " + cc_type_text + " Credit Card Number" );
		toggle_error( cc_number );				
		ret = false;
	}
	if( ! ( date_base <= ( cc_date_year + "" + cc_date_month ) ) ){
		msg.push( "A valid Credit Card Expiry Date" );
		toggle_error( cc_dm, cc_dy );				
		ret = false;
	}
	if( ! ( cc_name.value && cc_name.value.length > 1 ) ){
		msg.push( "A valid Credit Card Holder name" );
		toggle_error( cc_name );				
		ret = false;
	}
	if( ! ( cc_address.value && cc_address.value.length > 1 ) ){
		msg.push( "A valid Credit Card Holder address" );
		toggle_error( cc_address );				
		ret = false;
	}			
	// agree
	if( ! disclaimer.checked ){
		msg.push( "You need to agree to the terms and conditions." );
		toggle_error( disclaimer );
		ret = false; 
	}
				
	// if return value is false, enable button again
	if( ret == false ){
		alert( "The following errors occured:\n" + msg.join("\n") );
		toggle_submit( btn_submit );
	}
	return ret;
}

