

var cities = new Array(7);
var outCities = new Array(7);
var outCityInCityMap = new Array(7);
var oneWay = false;

cities[0] = new Array('XXX','--Return--');
cities[1] = new Array('AKL','Auckland (AKL)');
cities[2] = new Array('LAX','Los Angeles (LAX)');
cities[3] = new Array('PPT','Tahiti (Papeete)');
cities[4] = new Array('CDG','Paris (CDG)');
cities[5] = new Array('SYD','Sydney (SYD)');
cities[6] = new Array('NRT','Tokyo (NRT)');

outCities = new Array(cities[0],cities[1],cities[2],cities[3],cities[4],cities[5],cities[6]);
outCityInCityMap[0] = outCities; 
outCityInCityMap[1] = new Array(outCities[0],outCities[2],outCities[3],outCities[5]);
outCityInCityMap[2] = new Array(outCities[0],outCities[1],outCities[3],outCities[4],outCities[5]);
outCityInCityMap[3] = new Array(outCities[0],outCities[1],outCities[2],outCities[4],outCities[5],outCities[6]);
outCityInCityMap[4] = new Array(outCities[0],outCities[2],outCities[3]);
outCityInCityMap[5] = new Array(outCities[0],outCities[1],outCities[2],outCities[3]);
outCityInCityMap[6] = new Array(outCities[0],outCities[3]);

// Function to 
function initCities() {
    var departCity = GetControl("ddlOrigin");
    for(i=0; i<outCities.length; i++)
    {
        departCity.options[i] = new Option();
        departCity.options[i].value = outCities[i][0];
        departCity.options[i].text = outCities[i][1];
        
    }
    departCity.options[0].text = "--Depart--"; 

    var returnCity = GetControl("ddlDestination");
    for(i=0; i<outCities.length; i++)
    {
        returnCity.options[i] = new Option();
        returnCity.options[i].value = outCities[i][0];
        returnCity.options[i].text = outCities[i][1];
    }
    var radio = GetControl("rbReturn");
    radio.checked = true;
}

function loadToCities() {
    var departCity = GetControl("ddlOrigin");
    var returnCity = GetControl("ddlDestination");
    var selValue = returnCity.options[returnCity.selectedIndex].value;

    // Delete all options
    var cpt = returnCity.length-1;
    while (cpt >= 0)
    {
        returnCity.options[cpt] = null;
        returnCity.options[cpt] = null;
	  cpt--;
    }

    // Load toCities if the departCity is a valid selection
    for(i=0; i<outCityInCityMap[departCity.selectedIndex].length; i++)
    {
            returnCity.options[i] = new Option();
            returnCity.options[i].value = outCityInCityMap[departCity.selectedIndex][i][0];
            returnCity.options[i].text = outCityInCityMap[departCity.selectedIndex][i][1];
            // Keep the selected index if possible
		if (returnCity.options[i].value == selValue) {
			returnCity.options[i].selected = true;
		}
        }

    // Change text of first option if one way trip
    if (oneWay) {
    	SetReturnControls("--Arrive--", true);
    }

}

function datesSetup()
{
	setupDateControls(GetControl("ddlDepDay"), GetControl("ddlDepMonth"), GetControl("txtDepartureDate").value);
	setupDateControls(GetControl("ddlRetDay"), GetControl("ddlRetMonth"), GetControl("txtReturnDate").value);
}

function updateTripDates()
{
	GetControl("txtDepartureDate").value = GetControl("ddlDepDay").value + " " + GetControl("ddlDepMonth").value;
	GetControl("txtReturnDate").value = GetControl("ddlRetDay").value + " " + GetControl("ddlRetMonth").value;
}

function GetControl(controlName)
{
	return document.getElementById(controlName);
}

function GetValidDest(selectedOri)
{
	if (PortPairs.length == 0)
		return null;
	for (var i = 0; i < PortPairs.length; i++)
		if (PortPairs[i][0] == selectedOri)
			return PortPairs[i];
	return null;
}

function selectOneWay()
{
	oneWay = true;
	SetReturnControls("--Arrive--", true);
}

function selectReturn()
{
	oneWay = false;
	SetReturnControls("--Return--", false);
}

function SetReturnControls(newText, disabled)
{
	GetControl("ddlRetDay").disabled = disabled;
	GetControl("ddlRetMonth").disabled = disabled;
	GetControl("ddlDestination").options[0].text = newText;
}

function ClearErrorIndicators()
{
    GetControl("spnOriginError").style.display = "none";
    GetControl("spnDestinationError").style.display = "none";
    GetControl("spnPassengerError").style.display = "none";
    GetControl("spnRetDateError").style.display = "none";
    GetControl("spnDepDateError").style.display = "none";
}

function ValidateUserInputs()
{
    ClearErrorIndicators();
	var valid = true;
	valid = ValidateCityPair();
	
	if (!valid)
		return false;
		
	valid = ValidateSeatCount();
	
	if (!valid)
		return false;
		
	valid = ValidateDepartDate();	
		
	if (!valid)
		return false;			
		
	valid = ValidateReturnDate();	
		
	if (!valid)
		return false;
		
	return true;
}
	
function ValidateCityPair() 
{
	var ori = GetControl("ddlOrigin").value;
	var des = GetControl("ddlDestination").value;
	
	if (ori == "XXX")
	{
		GetControl("spnOriginError").style.display = "inline";
		alert("You have not selected a departure city.  Please check your selection and try again.");
		return false;
	}
		
	if (des == "XXX")
	{
		GetControl("spnDestinationError").style.display = "inline";
		alert("You have not selected a destination city.  Please check your selection and try again.");		
		return false;
	}
		
	if (ori == des)	
	{				
		GetControl("spnDestinationError").style.display = "inline";
		alert("Your departure and arrival cities are the same.  Please check your selection and try again.");
		return false;
	}
	
	return true;
}

function ValidateSeatCount()
{
	var infantCount = (GetControl("ddlInfantCount") == null) ? 0 : parseInt(GetControl("ddlInfantCount").value);
	var childCount = parseInt(GetControl("ddlChildCount").value);
	var adultCount = parseInt(GetControl("ddlAdultCount").value);
	var totalSeats = adultCount + childCount;
	var totalAccompanyingInfantSeats = totalSeats - childCount;

	if (totalSeats > 7) 
	{
		GetControl("spnPassengerError").style.display = "inline";
		alert("Total requested seats (including children) must not exceed 7");
		return false;
	}	
	else if (totalSeats < 1)
	{
		GetControl("spnPassengerError").style.display = "inline";
		alert("Your reservation must contain at least one adult passenger");
		return false;
	}	
	else if (totalSeats == childCount)
	{
		GetControl("spnPassengerError").style.display = "inline";
		alert("Children must be accompanied by at least one adult");
		return false;
	}	
	else if (totalAccompanyingInfantSeats < infantCount)
	{
		GetControl("spnPassengerError").style.display = "inline";
		alert("Every infant must be accompanied by an adult");
		return false;
	}	
	else
	{
		return true;
		
	}
}

function addDays(d,D)
{
  var x= new Date(2000,1,1), y= new Date(2000,1,1); 
  if(x.setDate(128) > y.valueOf())
  { D.setDate(D.getDate()+d); return D; }
  // Safari setDate(uint8) workaround
  if(d < 0)
    for(var i= -97; d < i; d-= i) 
      D.setDate(D.getDate()+i);
  else
    for(var i= 96; d > i; d-= i) 
      D.setDate(D.getDate()+i);
  D.setDate(D.getDate()+d);
  return D;
}

function ValidateReturnDate()
{	
	if (GetControl("rbReturn").checked)
	{
		var depDate = new Date(GetControl("txtDepartureDate").value);
		var retDate = new Date(GetControl("txtReturnDate").value);
		
		//Can only book 326 days out.
		var maxDate = new Date(today);
		//Safari Bug : maxDate.setDate(today.getDate() + maxNbDays);
		addDays(maxNbDays, maxDate);
		
		if (maxDate < retDate)
		{
			GetControl("spnRetDateError").style.display = "inline";
			alert("Return date is too far into the future. Tickets can be booked max " + maxNbDays + " days in advance.");
			return false;
		}
		if (retDate < depDate)
		{
			GetControl("spnRetDateError").style.display = "inline";
			alert("Return date must not be earlier than departure date.");
			return false;
		}
	}
	return true;
}

function ValidateDepartDate()
{	
	var depDate = new Date(GetControl("txtDepartureDate").value);
	
	//Can only book 326 days out.
	var maxDate = new Date(today);
	//Safari Bug : maxDate.setDate(today.getDate() +  maxNbDays);
	addDays(maxNbDays, maxDate);
	
	if (maxDate < depDate)
	{
		GetControl("spnDepDateError").style.display = "inline";
		alert("Departure date is too far into the future. Tickets can be booked max " + maxNbDays + " days in advance.");
		return false;
	}
	return true;
}
