﻿// *** Helpers to parse comma-delimited strings *** //
function parseTextAndJoinWithCommaOr(textToParse) {
	var split;
	var result = "";
	var i, j;

	// remove trailing comma, if any
	if (textToParse.lastIndexOf(",") == textToParse.length - 1) {
		textToParse = textToParse.substr(0, textToParse.length - 1);
	}				

	split = textToParse.split(",");
	for (var i = 0; i < split.length - 1; i++) {
		if (split[i].length > 0) {
			result += split[i].toLowerCase() + ", ";
		}
	}
	result += "or " + split[split.length - 1].toLowerCase();
	return result;
}  

function numberOfAdultPax(controls) {
	var count = 0;
	for (control in controls) {
		if (eval(controls[control].getAttribute("isAdult"))) {
			count += parseInt(getSelectValue(controls[control]));
		}
	}
	return count;
}

function numberOfPaxTypePax(paxTypeSystemName, controls) {
	var count = 0;
	for (control in controls) {
		if (controls[control].getAttribute("paxTypeSystemName").toUpperCase() == paxTypeSystemName.toUpperCase()) {
			count += parseInt(getSelectValue(controls[control]));
		}
	}
	return count;
}

function numberOfPax(controls) {
	var count = 0;
	for (control in controls) {
		count += parseInt(getSelectValue(controls[control]));
	}
	return count;
}

function getPaxTypeControls() {
	return parseControlList(document.getElementById("ctlTravelDetails_txtPaxTypeControls").value); 
}

function getPaxTypeReturnControls() {
	return parseControlList(document.getElementById("ctlTravelDetails_txtPaxTypeReturnControls").value);
}

function getAdultPaxTypeNames() {
	return parseTextAndJoinWithCommaOr(document.getElementById("ctlTravelDetails_txtAdultPaxTypeNames").value);
}

function getReturnAdultPaxTypeNames() {
	return parseTextAndJoinWithCommaOr(document.getElementById("ctlTravelDetails_txtReturnAdultPaxTypeNames").value);
}

function getNonAdultPaxTypeNames(controls) {
	return parseTextAndJoinWithCommaOr(nonAdultPaxTypeNames(controls));
}

function getReturnNonAdultPaxTypeNames(controls) {
	return parseTextAndJoinWithCommaOr(nonAdultPaxTypeNames(controls));
}

function nonAdultPaxTypeNames(controls) {
	var isAdult = false;
	var paxTypeNames = "";
	for (control in controls) {
		isAdult = eval(controls[control].getAttribute("isAdult"));
		if (!isAdult) {
			paxTypeNames += controls[control].getAttribute("paxTypeName") + ",";
		}
	}
	return paxTypeNames;
}
// *** End Helpers to parse comma-delimited strings *** //

// ******************** Errors *************************//
function setError(fld, spn, message)
{
	var fldError = document.getElementById(fld);
	var spnError = document.getElementById(spn);
	
	fldError.className = fldError.className + " passenger_error";
	spnError.innerHTML = message;
}

function clearError(fld, spn)
{
	var fldError = document.getElementById(fld);
	var spnError = document.getElementById(spn);
	
	if (fldError != null && fldError.style.display != "none")
	{
		if (fldError.className.indexOf(' passenger_error') > 0)
		{
			fldError.className = fldError.className.substring(0, fldError.className.indexOf(' passenger_error'));
		}
		spnError.innerHTML = "";
	}
	
}

function setPassengerError(message)
{
	setError("ctlTravelDetails_fldPassengers", "spnPassengerError", message);
}

function setVehicleError(message)
{
	setError("ctlTravelDetails_fldVehicles", "spnVehicleError", message);
}
// ****************** End Errors ***********************//

// ************** NMC Login *************** //			
function passwordFocus(passwordClear, password)
{
	var txtPasswordClear = document.getElementById(passwordClear);
	var txtPassword = document.getElementById(password);
	
	txtPasswordClear.style.display = "none";
	txtPassword.style.display = "inline";
	txtPassword.focus();
}

function nmcValidInput()
{
	var chkNMCDetails = document.getElementById("ctlTravelDetails_chkNMCDetails");
	var txtNMCNo = document.getElementById("ctlTravelDetails_txtNMCNo");
	var txtNMCPassword = document.getElementById("ctlTravelDetails_txtNMCPassword");
	
	clearError("ctlTravelDetails_fldNMCDetails", "ctlTravelDetails_spnNMCError");
	
	if (chkNMCDetails == null) {
		return true;
	}
	
	if (!chkNMCDetails.checked) {
		return true;
	}
	
	txtNMCNo.value = trim(txtNMCNo.value);
	if (isEmpty(txtNMCNo)) {
		setError("ctlTravelDetails_fldNMCDetails", "ctlTravelDetails_spnNMCError", "You need to enter your NMC membership number!")
		txtNMCNo.focus();
		return false;
	} else {
		if (isNaN(txtNMCNo.value)) {
			setError("ctlTravelDetails_fldNMCDetails", "ctlTravelDetails_spnNMCError", "The membership number must be numeric!");
			txtNMCNo.focus();
			return false;
		}
	}
	
	txtNMCPassword.value = trim(txtNMCPassword.value);
	if (isEmpty(txtNMCPassword)) {
		setError("ctlTravelDetails_fldNMCDetails", "ctlTravelDetails_spnNMCError", "You need to enter your Password!");
		passwordFocus("ctlTravelDetails_txtNMCPasswordClear", "ctlTravelDetails_txtNMCPassword");
		return false;
	}
	
	txtNMCPassword.value = txtNMCPassword.value.toUpperCase();

	return true;
}
// ************ End NMC Login ************* //

function paxValidInput(type)
{
	var paxTypeControls = (type == "departing") ? getPaxTypeControls() : getPaxTypeReturnControls();
	var minPax = parseInt(document.getElementById("ctlTravelDetails_txtMinPax").value);
	var maxPax = parseInt(document.getElementById("ctlTravelDetails_txtMaxPax").value);
	
	// Prevent both seniors and students on the same leg
	if (numberOfPaxTypePax("Senior", paxTypeControls) > 0
		&& numberOfPaxTypePax("Student", paxTypeControls) > 0) {
		setPassengerError("Seniors and students cannot be booked on the same leg.\nYou will need to book one of the special pax eg, senior or student as an adult.");
		return false;
	}
	
	// Min adults
	if (numberOfAdultPax(paxTypeControls) == 0) {
		// Booking has no adults
		paxTypeControls[0].focus();
		setPassengerError("You must have at least one " + getAdultPaxTypeNames() + " on each leg.");
		return false;
	}
	
	// Min total pax
	if (numberOfPax(paxTypeControls) < minPax) {
		paxTypeControls[0].focus();
		setPassengerError("You must book at least " + minPax + " passengers on the outbound sailing.");
		return false;
	}
	
	//Max total pax
	if (numberOfPax(paxTypeControls) > maxPax) {
		paxTypeControls[0].focus();
		setPassengerError("You may only book a maximum of " + maxPax + " passengers at one time.");
		return false;
	}
	return true;
}

function vehiclePaxValidInput(type)
{
	var isPackage = parseInt(document.getElementById("ctlTravelDetails_txtPackageID").value) > 0;
	var vehicletype = new Array();
	var paxTypeControls = (type == "departing" || document.getElementById("passengers_returning").style.display == "none") ? getPaxTypeControls() : getPaxTypeReturnControls();
	var fldVehicles = document.getElementById("ctlTravelDetails_fldVehicles");
	
	// shortcut - if the vehicles fieldset is not displayed, don't check and return true
	if (fldVehicles == null || fldVehicles.style.display == "none")
	{
		return true;
	}

	// check to see which vehicle controls to validate against - if they're return but we're not showing different return vehicle then use departing vehicle settings
	if (type == "returning" && document.getElementById("vehicle_returning_options").style.display == "none")
	{
		type = "departing";
	}
		
	if (!document.getElementById("ctlTravelDetails_vehicle_" + type + "_radio_no_vehicle").checked)
	{	
		if (document.getElementById("ctlTravelDetails_vehicle_" + type + "_radio_vehicle").checked)
		{
			var vehicleElement = "ctlTravelDetails_txt" + ((type == "departing") ? "DepartVehicle" : "ReturnVehicle");
			vehicletype = document.getElementById(vehicleElement + "Detail").value.split(",");
		}
		else
		{
			vehicletype = document.getElementById("ctlTravelDetails_txtMotorcycleDetail").value.split(",");
		}
			
		// check number of passengers allowed by vehicle type				
		if (vehicletype.length > 0 && vehicletype[0]!="-1" && (numberOfPax(paxTypeControls) > parseInt(vehicletype[2]))) {
			paxTypeControls[0].focus();
			setPassengerError("You may only book " + vehicletype[2] + " passengers in this vehicle.");
			return false;
		}
	}
	return true;
}

function vehicleValidInput(type, trailer)
{
	var isPackage = parseInt(document.getElementById("ctlTravelDetails_txtPackageID").value) > 0;
	var vehicletype = new Array();
	var vehicleElement = "ctlTravelDetails_txt" + ((type == "departing") ? "Depart" : "Return") + ((!trailer) ? "Vehicle" : "Trailer");
	var motorisedOrTowed = (!trailer) ? "vehicle" : "towed vehicle";
	
	if (!isPackage && document.getElementById("ctlTravelDetails_fldVehicles") && !document.getElementById("ctlTravelDetails_vehicle_" + type + "_radio_no_vehicle").checked) {
		vehicletype = document.getElementById(vehicleElement + "Detail").value.split(",");
	}

	// check if length required
	if(vehicletype.length > 0 && vehicletype[0] != "-1" && vehicletype[1] == "True"){
		var txtVehicleLength = document.getElementById(vehicleElement + "Length");
		var txtVehicleLengthInput = document.getElementById("vehicle_type_" + vehicletype[0] + "_" + type + "_length_input");

		txtVehicleLength.value = txtVehicleLengthInput.value;
		if(txtVehicleLength.value.length == 0){
			txtVehicleLengthInput.focus();
			txtVehicleLengthInput.select();
			setVehicleError("Sorry, the " + motorisedOrTowed + " length is required.");
			return false;
		}

		// check if length is numeric - it should be due to the filter but we'll check anyway
		if(isNaN(txtVehicleLength.value)){
			txtVehicleLengthInput.focus();
			txtVehicleLengthInput.select();
			setVehicleError("Sorry, the " + motorisedOrTowed + " length needs to be a metric numeric value.");
			return false;
		}
		
		// check if length is greater than max
		if(parseFloat(txtVehicleLength.value)>parseFloat(vehicletype[3])){
			txtVehicleLengthInput.focus();
			txtVehicleLengthInput.select();
			setVehicleError("Sorry, the " + motorisedOrTowed + " length is greater than the maximum length allowed.");
			return false;
		}
	}
	return true;
}

function travelDetailsValidInput(differentReturnPax, differentReturnVehicles)
{
	var canChangeOutboundLeg = eval(document.getElementById("ctlTravelDetails_txtCanChangeOutboundLeg").value);
	var canChangeReturnboundLeg = eval(document.getElementById("ctlTravelDetails_txtCanChangeReturnboundLeg").value);
	
	clearError("ctlTravelDetails_fldPassengers", "spnPassengerError");
	clearError("ctlTravelDetails_fldVehicles", "spnVehicleError");
	
	// now set the server-accessible dates from the JavaScript calendar controls
	var departCalendarDay = document.getElementById("calendar_departing_days");
	var departCalendarMonth = document.getElementById("calendar_departing_months");
	var departDate = new Date(parseInt(getSelectValue(departCalendarMonth).substring(2,6), 10), parseInt(getSelectValue(departCalendarMonth).substring(0,2), 10) - 1, parseInt(getSelectValue(departCalendarDay), 10));

	var returnCalendarDay = document.getElementById("calendar_returning_days");
	var returnCalendarMonth = document.getElementById("calendar_returning_months");
	var returnDate = new Date(parseInt(getSelectValue(returnCalendarMonth).substring(2,6), 10), parseInt(getSelectValue(returnCalendarMonth).substring(0,2), 10) - 1, parseInt(getSelectValue(returnCalendarDay), 10));

	var txtDepartDate = document.getElementById("ctlTravelDetails_txtDepartDate");
	var txtReturnDate = document.getElementById("ctlTravelDetails_txtReturnDate");
	
	txtDepartDate.value = departDate.getFullYear().toString();
	if (departDate.getMonth() + 1 < 10)
	{
		txtDepartDate.value = txtDepartDate.value + "0";
	}
	txtDepartDate.value = txtDepartDate.value + (departDate.getMonth() + 1).toString();
	if (departDate.getDate() < 10)
	{
		txtDepartDate.value = txtDepartDate.value + "0";
	}
	txtDepartDate.value = txtDepartDate.value + departDate.getDate().toString();

	txtReturnDate.value = returnDate.getFullYear().toString();
	if (returnDate.getMonth() + 1 < 10)
	{
		txtReturnDate.value = txtReturnDate.value + "0";
	}
	txtReturnDate.value = txtReturnDate.value + (returnDate.getMonth() + 1).toString();
	if (returnDate.getDate() < 10)
	{
		txtReturnDate.value = txtReturnDate.value + "0";
	}
	txtReturnDate.value = txtReturnDate.value + returnDate.getDate().toString();		
		
	var validDepartPax = paxValidInput("departing");
	if (!validDepartPax)
	{
		return false;
	}

	// repeat all the pax validation for return pax (only required if pax are different on the return leg)
	if (differentReturnPax || document.getElementById("passengers_returning").style.display == "block")
	{
		var validReturnPax = paxValidInput("returning");
		if (!validReturnPax)
		{
			return false;
		}
	}
	
	// check departing vehicle pax limits
	var validDepartVehiclePax = vehiclePaxValidInput("departing");
	if (!validDepartVehiclePax)
	{
		return false;
	}
	
	// check return vehicle pax limits (if required)
	if (document.getElementById("ctlTravelDetails_from_returning").checked)
	{
		var validReturnVehiclePax = vehiclePaxValidInput("returning");
		if (!validReturnVehiclePax)
		{
			return false;
		}
	}
	
	var fldVehicles = document.getElementById("ctlTravelDetails_fldVehicles");

	if (fldVehicles != null && fldVehicles.style.display != "none")
	{
		// check vehicle lengths
		var validDepartVehicle = vehicleValidInput("departing", false);
		if (!validDepartVehicle)
		{
			return false;
		}
		
		// check trailer lengths
		if (document.getElementById("ctlTravelDetails_vehicle_departing_radio_vehicle").checked && document.getElementById("ctlTravelDetails_departing_towed_checkbox").checked)
		{
			var validDepartTrailer = vehicleValidInput("departing", true);
			if (!validDepartTrailer)
			{
				return false;
			}
		}
		
		// repeat all the vehicle validation for return vehicles (only required if vehicles are different on the return leg)
		if (document.getElementById("ctlTravelDetails_from_returning").checked)
		{
			if (differentReturnVehicles || document.getElementById("vehicle_returning").style.display == "block")
			{
				var validReturnVehicle = vehicleValidInput("returning", false);
				if (!validReturnVehicle)
				{
					return false;
				}
				
				if (document.getElementById("ctlTravelDetails_vehicle_returning_radio_vehicle").checked && document.getElementById("ctlTravelDetails_returning_towed_checkbox").checked)
				{
					var validReturnTrailer = vehicleValidInput("returning", true);
					if (!validReturnTrailer)
					{
						return false;
					}
				}
			}
		}
	}

	var validNMCInput = nmcValidInput();
	if (!validNMCInput)
	{	
		return false;
	}

	return true;
}

function calendar_click(selectedDate, id){
	var txtCalendarDate;
	if (id == "calendar_departing")
	{
		txtCalendarDate = document.getElementById("ctlTravelDetails_txtDepartDate");
	}
	else
	{
		txtCalendarDate = document.getElementById("ctlTravelDetails_txtReturnDate");
	}
	
	txtCalendarDate.value = selectedDate.getFullYear().toString();
	if (selectedDate.getMonth() + 1 < 10)
	{
		txtCalendarDate.value = txtCalendarDate.value + "0";
	}
	txtCalendarDate.value = txtCalendarDate.value + (selectedDate.getMonth() + 1).toString();
	if (selectedDate.getDate() < 10)
	{
		txtCalendarDate.value = txtCalendarDate.value + "0";
	}
	txtCalendarDate.value = txtCalendarDate.value + selectedDate.getDate().toString();
}

function loadCalendars(departSelected, departMinimum, departMaximum, returnSelected, returnMinimum, returnMaximum)
{
	// create the first (departing) calendar
	var departCalendar = new CalendarBlock("calendar_departing", departSelected, departMinimum, departMaximum, calendar_click);
	departCalendar.fillMonths();
	departCalendar.fillSelectDays();

	// create the second (returning) calendar
	var returnCalendar = new CalendarBlock("calendar_returning", returnSelected, returnMinimum, returnMaximum, calendar_click);
	returnCalendar.fillMonths();
	returnCalendar.fillSelectDays();

	// link calendars
	departCalendar.linkCalendar(returnCalendar, "greater_than");
	returnCalendar.linkCalendar(departCalendar, "less_than");
}

function setControls(differentReturnPax, differentReturnVehicles)
{	

	// set the vehicle radios/checkboxes
	if (!bookingLoaded)
	{
		// set vehicle types/lengths (either defaulting to first vehicle in list if a new search or preselcted absed on booking/session/form values).
		// Just call the selectVehicle function once for each vehicle variation - the associated textbox has been set server-side.
		selectVehicle("departing", "vehicle", true);
		selectVehicle("departing", "trailer", true);
		selectVehicle("returning", "vehicle", true);
		selectVehicle("returning", "trailer", true);
	}
	else
	// set the outbound vehicle radios/checkboxes (this also sets the vehicle radio/length controls)
	{
		var departVehicleTypeID = parseInt(document.getElementById("ctlTravelDetails_txtDepartVehicleTypeID").value);
		var returnVehicleTypeID = parseInt(document.getElementById("ctlTravelDetails_txtReturnVehicleTypeID").value);
		var motorcycleDetail = document.getElementById("ctlTravelDetails_txtMotorcycleDetail").value.split(',');

		if (departVehicleTypeID > 0)
		{
			if (departVehicleTypeID != parseInt(motorcycleDetail[0]))
			{
				document.getElementById("ctlTravelDetails_vehicle_departing_radio_vehicle").checked = true;
				toggleVehicleTab("departing", true);
				toggleMotorcycleTab("departing", false);
				checkDifferentReturnVehicles();
				
				var departTrailerTypeID = parseInt(document.getElementById("ctlTravelDetails_txtDepartTrailerTypeID").value);
				if (departTrailerTypeID > 0)
				{
					document.getElementById("ctlTravelDetails_departing_towed_checkbox").checked = true;
					checkTowedVehicle("departing",document.getElementById("ctlTravelDetails_departing_towed_checkbox"));
				}
			}
			else
			{
				document.getElementById("ctlTravelDetails_vehicle_departing_radio_motorcycle").checked = true;
				toggleVehicleTab("departing", false);				
				toggleMotorcycleTab("departing", true);
			}
		}
		
		if (returnVehicleTypeID > 0)
		{
			if (returnVehicleTypeID != parseInt(motorcycleDetail[0]))
			{
				document.getElementById("ctlTravelDetails_vehicle_returning_radio_vehicle").checked = true;
//				toggleVehicleTab("returning", true);
//				toggleMotorcycleTab("returning", false);
				checkDifferentReturnVehicles();
				
				var returnTrailerTypeID = parseInt(document.getElementById("ctlTravelDetails_txtReturnTrailerTypeID").value);
				if (returnTrailerTypeID > 0)
				{
					document.getElementById("ctlTravelDetails_returning_towed_checkbox").checked = true;
					checkTowedVehicle("returning",document.getElementById("ctlTravelDetails_returning_towed_checkbox"));
				}
			}
			else
			{
				document.getElementById("ctlTravelDetails_vehicle_returning_radio_motorcycle").checked = true;
//				toggleVehicleTab("returning", false);
//				toggleMotorcycleTab("returning", true);
			}
			
			// now if the return vehicle different flag is false, set the corresponding radio accordingly
			if (!differentReturnVehicles)
			{
				document.getElementById("ctlTravelDetails_vehicle_returning_radio_same_as_departing").checked = true;
			}
		}
		
		// Now disable controls if this is required
		var canChangeOutboundLeg = document.getElementById("ctlTravelDetails_txtCanChangeOutboundLeg");
		var canChangeReturnboundLeg = document.getElementById("ctlTravelDetails_txtCanChangeReturnboundLeg");
		
		if (canChangeOutboundLeg.value.toUpperCase() != "TRUE")
		{
			document.getElementById("calendar_departing_days").disabled = "disabled";
			document.getElementById("calendar_departing_months").disabled = "disabled";
			
			var reasonCannotChangeOutboundLeg = document.getElementById("ctlTravelDetails_txtReasonCannotChangeOutboundLeg");
			var calendar_departing_open = document.getElementById("calendar_departing_open");
			calendar_departing_open.onclick = "";
			calendar_departing_open.title = reasonCannotChangeOutboundLeg.value;
		}
		
		if (canChangeReturnboundLeg.value.toUpperCase() != "TRUE")
		{
			document.getElementById("calendar_returning_days").disabled = "disabled";
			document.getElementById("calendar_returning_months").disabled = "disabled";
			
			var reasonCannotChangeReturnboundLeg = document.getElementById("ctlTravelDetails_txtReasonCannotChangeReturnboundLeg");
			var calendar_returning_open = document.getElementById("calendar_returning_open");
			calendar_returning_open.onclick = "";
			calendar_returning_open.title = reasonCannotChangeReturnboundLeg.value;
		}
	}
	
	// display return dates if return booking
	if (document.getElementById("ctlTravelDetails_from_returning").checked)
	{
		checkOneWay(false);
	}

	// display different return pax/vehicles if required
	if (differentReturnPax && document.getElementById("ctlTravelDetails_from_returning").checked)
	{
		checkReturnPassengers();
	}

	if (differentReturnVehicles && document.getElementById("ctlTravelDetails_from_returning").checked)
	{
		checkReturnVehicle();		
	}
}