

var cities = new Array(7);
var outCities = new Array(7);
var outCityInCityMap = new Array(7);
var oneWay = false;

cities[0] = new Array('XXX','-- 往路 --');
cities[1] = new Array('AKL','オークランド (AKL)');
cities[2] = new Array('LAX','ロサンゼルス (LAX)');
cities[3] = new Array('PPT','タヒチ(パペーテ) (PPT)');
cities[4] = new Array('CDG','パリ (CDG)');
cities[5] = new Array('SYD','シドニー (SYD)');
cities[6] = new Array('NRT','東京 (NRT)');
cities[7] = new Array('BOB','ボラボラ (BOB)');
cities[8] = new Array('FAV','ファカラバ (FAV)');
cities[9] = new Array('HUH','フアヒネ (HUH)');
cities[10] = new Array('MOZ','モーレア (MOZ)');
cities[11] = new Array('RFP','ライアテア (RFP)');
cities[12] = new Array('RGI','ランギロア (RGI)');
cities[13] = new Array('TIH','ティケハウ (TIH)');
cities[14] = new Array('XMH','マニヒ (XMH)');


outCities = new Array(cities[0],cities[1],cities[2],cities[3],cities[4],cities[5],cities[6],cities[7],cities[8],cities[9],cities[10],cities[11],cities[12],cities[13],cities[14]);
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],outCities[7],outCities[8],outCities[9],outCities[10],outCities[11],outCities[12],outCities[13],outCities[14]);
//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 = "--出発地--"; 

    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("--到着地--", 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;

	var ctlMoisDep = GetControl("txtDepartureDate").value.split(" ");
	var moisdedepart = tabMois[ctlMoisDep[1]].value + "/" + ctlMoisDep[2];
	var datededepart = tabMois[ctlMoisDep[1]].value + "/" + ctlMoisDep[0] + "/" + ctlMoisDep[2];
	
	cal1.cfg.setProperty("pagedate",moisdedepart,false);
	cal1.cfg.setProperty("selected",datededepart,false);
	cal1.render();
	
	var ctlMoisRet = GetControl("txtReturnDate").value.split(" ");
	var moisderetour = tabMois[ctlMoisRet[1]].value + "/" + ctlMoisRet[2];
	var datederetour = tabMois[ctlMoisRet[1]].value + "/" + ctlMoisRet[0] + "/" + ctlMoisRet[2];
	
	cal2.cfg.setProperty("pagedate",moisderetour,false);
	cal2.cfg.setProperty("selected",datederetour,false);
	cal2.render();	
}

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("--到着地--", true);
}

function selectReturn()
{
	oneWay = false;
	SetReturnControls("-- 往路 --", 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.");
		alert("出発地が入力されていません。お確かめになって、もう一度実行してください。");
		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.");	
		alert("目的地が入力されていません。お確かめになって、もう一度実行してください。");				
		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.");
		alert("出発地と目的地が同じです。お確かめになって、もう一度実行してください。");
		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");
		alert("席のご予約は合計最大７名までです。（子供・幼児（０才から１１才・座席あり）も含みます。）");
		return false;
	}	
	else if (totalSeats < 1)
	{
		GetControl("spnPassengerError").style.display = "inline";
		//alert("Your reservation must contain at least one adult passenger");
		alert("ご予約は、大人１名以上を選択してください。");
		return false;
	}	
	else if (totalSeats == childCount)
	{
		GetControl("spnPassengerError").style.display = "inline";
		//alert("Children must be accompanied by at least one adult");
		alert("お子様は、保護者の方が少なくとも１人は付き添ってください。");
		return false;
	}	
	else if (totalAccompanyingInfantSeats < infantCount)
	{
		GetControl("spnPassengerError").style.display = "inline";
		//alert("Every infant must be accompanied by an adult");
		alert("幼児１人につき、保護者の方が必ず付き添ってください。");
		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)
	{
	//hack
		var splitedDateDep = GetControl("txtDepartureDate").value.split(" ");
		var depDate = new Date(splitedDateDep[2] + "/" + tabMois[splitedDateDep[1]].text + "/" + splitedDateDep[0]);
//		var depDate = new Date(GetControl("txtDepartureDate").value);

		var splitedDateRet = GetControl("txtReturnDate").value.split(" ");
		var retDate = new Date(splitedDateRet[2] + "/" + tabMois[splitedDateRet[1]].text + "/" + splitedDateRet[0]);
//		var retDate = new Date(GetControl("txtReturnDate").value);
	//finhack

		//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.");
			alert("帰国ご希望日のご予約をまだ承っておりません。 チケットのご予約は" + maxNbDays + "日前までです。");		
			return false;
		}
		if (retDate < depDate)
		{
			GetControl("spnRetDateError").style.display = "inline";
			//alert("Return date must not be earlier than departure date.");
			alert("帰国ご希望日は、出発ご希望日より後の日付を選択してください。");
			return false;
		}
	}
	return true;
}

function ValidateDepartDate()
{	
//hack
	var splitedDate = GetControl("txtDepartureDate").value.split(" ");
	var depDate = new Date(splitedDate[2] + "/" + tabMois[splitedDate[1]].text + "/" + splitedDate[0]);
//	var depDate = new Date(GetControl("txtDepartureDate").value);
//finhack

	//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.");
		alert("出発ご希望日のご予約をまだ承っておりません。 チケットのご予約は最大" + maxNbDays + "日前までです。");
		return false;
	}
	return true;
}

