//Run on page load
$.metadata.setType("attr", "validate");
$(document).ready(function(){
	});

function initializeReservationsCC()
{
	$("#frmMain").validate({
		errorClass: "missing",
		highlight: function(element, errorClass) {
			$(element.form).find("label[for=" + element.id + "]").addClass(errorClass);
		},
		unhighlight: function(element, errorClass) {
			$(element.form).find("label[for=" + element.id + "]").removeClass(errorClass);
		},
		errorLabelContainer: "#errorContainer",
		wrapper: "li",
		groups: {
			cc_exp: "exp_mo exp_yr"
		},
		messages: {
			card_type: 'Credit card type',
			cc_no: 'Credit card number',
			exp_mo: {
				required: 'Expiration month'
			},
			exp_yr: {
				required: 'Expiration year'
			},
			cvv: 'CVV',
			cardholder_name: 'Cardholder name',
			billing_street: 'Billing street',
			billing_city: 'Billing city',
			billing_state: 'Billing state',
			billing_zip: 'Billing zip',
			home_phone: 'Home phone required',
			name: 'Passenger name',
			visitormail: 'Valid email required'
		},
		rules: {
			billing_zip: {
				required: true,
				minlength: 5,
				digits: true
			},
			cc_no: {
				required: true,
				creditcard: true
			},
			exp_mo: {
				required: true,
				expirationValidator: true
			},
			exp_yr: {
				required: true,
				expirationValidator: true
			},
			cvv: {
				required: true,
				maxlength: 5,
				digits: true

			},
			visitormail: {
				required: true,
				email: true
			},
			name: {
				required: true
			},
			home_phone: {
				required: true
			}
		},
		invalidHandler: function(form, validator) {
			var errors = validator.numberOfInvalids();
			if (errors) {
				var message = errors == 1
				? 'You missed 1 field. It has been highlighted in red.'
				: 'You missed ' + errors + ' fields. They have been highlighted in red.';
				$("#errorCount").html(message);
				$("#errorCount").show();
				$.scrollTo("#errorCount", "500");
			} else {
				$("#errorCount").hide();
			}
		},
		focusInvalid: false
	});
}

function returnReservationSelected(element){
	return $('#cbReturnReservation:checked').length == 1;
}

function initializeReservations()
{
	$("#frmMain").validate({
		rules: {
			//Pick up type
			puradio: {
				required: true
			},
			doradio: {
				required: true
			},
			doradioReturn: {
				required: returnReservationSelected
			},
			type: {
				required: function(element){
					return ($("input[name='rtradio']:checked").val() == 'Regular');
				}
			},
			passenger: {
				required: function(element){
					return ($("input[name='rtradio']:checked").val() == 'Penland');
				}
			},
			pu_street: {
				required: function(element){
					return ($("input[name='puradio']:checked").val() == 'Location');
				}
			},
			pu_city: {
				required: function(element){
					return ($("input[name='puradio']:checked").val() == 'Location');
				}
			},
			pu_zip: {
				required: function(element){
					return ($("input[name='puradio']:checked").val() == 'Location');
				},
				minlength: 5,
				digits: true
			},
			pu_hotel: {
				required: function(element){
					return ($("input[name='puradio']:checked").val() == 'Hotel');
				}
			},
			pu_airport: {
				required: function(element){
					return ($("input[name='puradio']:checked").val() == 'Airport');
				}
			},
			pu_carrier: {
				required: function(element){
					return ($("input[name='puradio']:checked").val() == 'Airport');
				}
			},
			pu_flight: {
				required: function(element){
					return ($("input[name='puradio']:checked").val() == 'Airport');
				}
			},
			pu_HH: {
				required: true
			},
			MM: {
				required: true
			},
			month: {
				required: true
			},
			day: {
				required: true
			},
			year: {
				required: true,
				reservationDate: true
			},
			pu_HHReturn: {
				required: returnReservationSelected
			},
			MMReturn: {
				required: returnReservationSelected
			},
			monthReturn: {
				required: returnReservationSelected
			},
			dayReturn: {
				required: returnReservationSelected
			},
			yearReturn: {
				required: returnReservationSelected
			},
			fa_HH: {
				required: function(element){
					return ($("input[name='puradio']:checked").val() == 'Airport');
				}
			},
			do_street: {
				required: function(element){
					return ($("input[name='doradio']:checked").val() == 'Location');
				}
			},
			do_city: {
				required: function(element){
					return ($("input[name='doradio']:checked").val() == 'Location');
				}
			},
			do_zip: {
				required: function(element){
					return ($("input[name='doradio']:checked").val() == 'Location');
				},
				minlength: 5,
				maxlength: 5,
				digits: true
			},
			do_streetReturn: {
				required: function(element){
					return returnReservationSelected(element) && ($("input[name='doradioReturn']:checked").val() == 'Location');
				}
			},
			do_cityReturn: {
				required: function(element){
					return returnReservationSelected(element) && ($("input[name='doradioReturn']:checked").val() == 'Location');
				}
			},
			do_zipReturn: {
				required: function(element){
					return returnReservationSelected(element) && ($("input[name='doradioReturn']:checked").val() == 'Location');
				},
				minlength: 5,
				maxlength: 5,
				digits: true
			},
			do_airport: {
				required: function(element){
					return ($("input[name='doradio']:checked").val() == 'Airport');
				}
			},
			do_carrier: {
				required: function(element){
					return ($("input[name='doradio']:checked").val() == 'Airport');
				}
			},
			do_flight: {
				required: function(element){
					return ($("input[name='doradio']:checked").val() == 'Airport');
				}
			},
			dt_HH: {
				required: function(element){
					return ($("input[name='doradio']:checked").val() == 'Airport');
				}
			},
			do_directions: {
				required: function(element){
					return ($("input[name='doradio']:checked").val() == 'As Directed');
				}
			},
			do_airportReturn: {
				required: function(element){
					return returnReservationSelected(element) && ($("input[name='doradioReturn']:checked").val() == 'Airport');
				}
			},
			do_carrierReturn: {
				required: function(element){
					return returnReservationSelected(element) && ($("input[name='doradioReturn']:checked").val() == 'Airport');
				}
			},
			do_flightReturn: {
				required: function(element){
					return returnReservationSelected(element) && ($("input[name='doradioReturn']:checked").val() == 'Airport');
				}
			},
			dt_HHReturn: {
				required: function(element){
					return returnReservationSelected(element) && ($("input[name='doradioReturn']:checked").val() == 'Airport');
				}
			},
			do_directionsReturn: {
				required: function(element){
					return returnReservationSelected(element) && ($("input[name='doradioReturn']:checked").val() == 'As Directed');
				}
			},
			toc: {
				required: function(element){
					return ($("input[name='rtradio']:checked").val() == 'Penland');
				}
			}
		},
		/*debug: true,*/
		messages: {
			passenger: 'Passenger type',
			type: 'Vehicle type',
			pu_hotel: "Pick up hotel",
			pu_street: 'Pick up street',
			pu_city: 'Pick up city',
			pu_zip: 'Pick up zip',
			pu_airport: 'Pick up airport',
			pu_carrier: 'Pick up carrier',
			pu_flight: 'Pick up flight',
			fa_HH: 'Pick up time',
			do_street: 'Drop off street',
			do_city: 'Drop off city',
			do_zip: 'Drop off zip',
			do_streetReturn: 'Return drop off street',
			do_cityReturn: 'Return drop off city',
			do_zipReturn: 'Return drop off zip',
			do_airport: 'Drop off airport',
			do_carrier: 'Drop off carrier',
			do_flight: 'Drop off flight',
			dt_HH: 'Drop off time',
			do_directions: 'Drop off instructions',
			do_streetReturn: 'Return drop off street',
			do_cityReturn: 'Return drop off city',
			do_zipReturn: 'Return drop off zip',
			do_airportReturn: 'Return drop off airport',
			do_carrierReturn: 'Return drop off carrier',
			do_flightReturn: 'Return drop off flight',
			dt_HHReturn: 'Return drop off time',
			do_directionsReturn: 'Return drop off instructions',
			doradioReturn: 'Return type required',
			toc: 'Terms and Conditions',
			rtradio: 'Reservation type',
			puradio: 'Pick up type',
			doradio: 'Drop off type',
			month: 'Pick up date',
			pu_HH: 'Pick up hour required',
			MM: 'Pick up minute required',
			month: {
				required: 'Pick up month required'
			},
			day: {
				required: 'Pick up day required'
			},
			year: {
				required: 'Pick up year required'
			},
			pu_HHReturn: "Return hour required",
			MMReturn: "Return minutes required",
			monthReturn: "Return month required",
			dayReturn: "Return day required",
			yearReturn: "Return year required"
		},
		focusInvalid: false,
		invalidHandler: function(form, validator) {
			var errors = validator.numberOfInvalids();
			if (errors) {
				var message = errors == 1
				? 'You missed 1 field. It has been highlighted in red.'
				: 'You missed ' + errors + ' fields. They have been highlighted in red.';
				$("#errorCount").html(message);
				$("#errorCount").show();
				$.scrollTo("#errorCount", "500");
			} else {
				$("#errorCount").hide();
			}
		},
		errorClass: "missing",
		errorLabelContainer: "#errorContainer",
		wrapper: "li",
		highlight: function(element, errorClass) {
			$(element.form).find("label[for=" + element.id + "]").addClass(errorClass);
		},
		unhighlight: function(element, errorClass) {
			$(element.form).find("label[for=" + element.id + "]").removeClass(errorClass);
		}
	});

	displayFormElements();
}

//Toggles visible items based on pick-up type
function PUChanged()
{
	$("#tblPULocation").hide();
	$("#tblPUAirport").hide();
	$("#tblPUHotel").hide();
	$("#spanDOAirport").show();
	$("#lblPUTime").html("Time:");


	//Hide the hotel pick up option if penland
	var reservationType = $("input[name='rtradio']:checked").val();
	if(reservationType == 'Penland') {
		$("#spanPUHotel").hide();
		$("#spanPUPenland").show();
		$("#spanDOPenland").show();
	}
	else {
		$("#spanPUHotel").show();
		$("#spanPUPenland").hide();
		$("#spanDOPenland").hide();
	}

	if($("#divPUType").is(":visible"))
	{
		switch($("input[name='puradio']:checked").val())
		{
			case "Location":
				$("#tblPULocation").show();
				break;
			case "Airport":
				$("#tblPUAirport").show();
				$("#spanDOAirport").hide();
				$("#tblDOAirport").hide();
				$("#lblPUTime").html("Flight Arrival Time:");
				break;
			case "Hotel":
				$("#tblPUHotel").show();
				break;
			case "Penland":
				$("#spanDOPenland").hide();
				break;
		}
	}

	return true;
}

function PUChangedReturn()
{
	$("#tblPULocationReturn").hide();
	$("#tblPUAirportReturn").hide();
	$("#tblPUHotelReturn").hide();
	$("#spanDOAirportReturn").show();

	//Hide the hotel pick up option if penland
	var reservationTypeReturn = $("input[name='rtradio']:checked").val();
	if(reservationTypeReturn == 'Penland') {
		$("#spanPUHotelReturn").hide();
		$("#spanPUPenlandReturn").show();
		$("#spanDOPenlandReturn").show();
	}
	else {
		$("#spanPUHotelReturn").show();
		$("#spanPUPenlandReturn").hide();
		$("#spanDOPenlandReturn").hide();
	}

	if($("#divPUTypeReturn").is(":visible"))
	{
		switch($("input[name='puradioReturn']:checked").val())
		{
			case "Location":
				$("#tblPULocationReturn").show();
				break;
			case "Airport":
				$("#tblPUAirportReturn").show();
				$("#spanDOAirportReturn").hide();
				$("#tblDOAirportReturn").hide();
				break;
			case "Hotel":
				$("#tblPUHotelReturn").show();
				break;
			case "Penland":
				$("#spanDOPenlandReturn").hide();
				break;
		}
	}

	return true;
}


//Toggles visible items based on drop-off type
function DOChanged()
{
	//First, hide all three types
	$("#tblDOLocation").hide();
	$("#tblDOAirport").hide();
	$("#tblDOAsDirected").hide();
	$("#lblDOTime").html("Time:");
	$("#spanDOPenlandReturn").show();

	if($("#divDOType").is(":visible"))
	{
		switch($("input[name='doradio']:checked").val())
		{
			case "Location":
				$("#tblDOLocation").show();
				break;
			case "Airport":
				$("#tblDOAirport").show();
				$("#lblDOTime").html("Flight Arrival Time:");
				break;
			case "As Directed":
				$("#tblDOAsDirected").show();
				break;
			case "Penland":
				$("#spanDOPenlandReturn").hide();
				break;

		}
	}
	return true;
}

function DOChangedReturn()
{
	//First, hide all three types
	$("#tblDOLocationReturn").hide();
	$("#tblDOAirportReturn").hide();
	$("#tblDOAsDirectedReturn").hide();
	$("#lblPUTimeReturn").html("Time:");

	if($("#divDOTypeReturn").is(":visible"))
	{
		switch($("input[name='doradioReturn']:checked").val())
		{
			case "Location":
				$("#tblDOLocationReturn").show();
				break;
			case "Airport":
				$("#tblDOAirportReturn").show();
				$("#lblPUTimeReturn").html("Flight Departure Time:");
				break;
			case "As Directed":
				$("#tblDOAsDirectedReturn").show();
				break;
		}
	}
	return true;
}

//Function to determine which form elements should be displayed
function displayFormElements()
{
	//Determine what part of Penland TOS should be displayed, based on reservation type
	togglePenlandTOS();

	var reservationType = $("input[name='rtradio']:checked").val();
	var returnReservation = $("#cbReturnReservation:checked").val();
	var penlandTOS = $("#toc:checked").val();

	//Only display the form elements if they have selected 'Regular' reservation type or 'Penland' and have accepted TOS
	if(reservationType == null || (reservationType == 'Penland' && penlandTOS == null))
	{
		$("#divDOType").hide();
		$("#divPUType").hide();
		$("#divPassengerInfo").hide();
		$("#divReturnReservations").hide();
		$("#divSubmit").hide();
	}
	else
	{
		$("#divDOType").show();
		$("#divPUType").show();
		$("#divPassengerInfo").show();
		$("#divReturnReservations").show();
		$("#divSubmit").show();
	}

	//Only display the form elements if they have selected 'Regular' reservation type or 'Penland' and have accepted TOS
	if(returnReservation == null || returnReservation == "false" || (reservationType == 'Penland' && penlandTOS == null))
	{
		$("#divDOTypeReturn").hide();
		$("#divPUTypeReturn").hide();
		$("#divPassengerInfoReturn").hide();
		$("#divReturnDateTime").hide();
	}
	else
	{
		$("#divDOTypeReturn").show();
		$("#divPUTypeReturn").show();
		$("#divPassengerInfoReturn").show();
		$("#divReturnDateTime").show();
	}

	if(reservationType == 'Penland')
	{
		$("#trPassenger").show();
		$("#trType").hide();
	}
	else
	{
		$("#trPassenger").hide();
		$("#trType").show();
	}

	DOChanged();
	PUChanged();

	DOChangedReturn();
	PUChangedReturn();

	if($("input[name='doradio']:checked").val() == "Penland")
	{
		$("#spanDOPenlandReturn").hide();
	}

}

function togglePenlandTOS()
{
	//Determine if checkbox should be displayed.  If checked, display, otherwise hide until TOS are downloaded
	if($("#tosDownloaded").val() == '1')
	{
		$("#divPenlandTOSAgree").show();
	}
	else
	{
		$("#divPenlandTOSAgree").hide();
	}

	var t = $("input[name='rtradio']:checked").val();
	switch(t)
	{
		case "Penland":
			$("#divPenlandTOS").show();
			break;
		default:
			$("#divPenlandTOS").hide();
			break;
	}
}

//Fired when the user clicks to download Penland TOS
function penlandTOSDownload()
{
	$("#tosDownloaded").val('1');
	displayFormElements();
	return true;
}

function monthToInt($month){

	switch($month)
	{
		case "Jan":
			return 0;
		case "Feb":
			return 1;
		case "Mar":
			return 2;
		case "Apr":
			return 3;
		case "May":
			return 4;
		case "Jun":
			return 5;
		case "Jul":
			return 6;
		case "Aug":
			return 7;
		case "Sep":
			return 8;
		case "Oct":
			return 9;
		case "Nov":
			return 10;
		case "Dec":
			return 11;
	}
}

jQuery.validator.addMethod(
	"reservationDate",
	function(value, element) {
			var day = parseInt($("#day").val(), 10);
			var month = monthToInt($("#month").val());
			var year =  parseInt($("#year").val(), 10);
			var temp = new Date();
			var today = new Date(temp.getFullYear(), temp.getMonth(), temp.getDate());
			var resDate = new Date(year, month, day);
			return resDate >= today;
	},
	"Reservation date cannot be a previous date"
);

jQuery.validator.addMethod(
	"expirationValidator",
	function(value, element) {
			var month = parseInt($("#exp_mo").val(), 10) - 1;
			var year =  parseInt($("#exp_yr").val(), 10);
			var temp = new Date();
			var currentYear = temp.getFullYear();
			var currentMonth = temp.getMonth();

			if(year < currentYear || (year == currentYear && month < currentMonth))
				return false;
			else
				return true;
	},
	"Credit card expiration"
);
