/*

OUTBOUND CODE v1-9

changes:
1-1 has taxes code
1-2 has canada taxes mod
1-3 has zero salefare replaced with regfare
1-4 fixed single digit day and month bug in- duh!
1-5 all zero fares are allowed, have already been entered into navitaire as 'free seats'
1-6 default 99p price mod
1-7 zero fare highlighting code, remove data from js into shtml file.
1-8 code for special route test added- see taxtables.js
1-9 mod for new tax element in xml feed - essentially 1-8 code removed and new flight object tax element added, removed saleFareToggle code,
	 use a comparason instead and go with the cheapest, now that AdultSaleFares return as null if not present (not 0.00)






multiple departing to single arrival

*/

/* ****************** listing of offers to be displayed *************** */

function offerList(arrivalAirport, departingAirport, numOfResults, weeksOfResults) {
	 	this.arrivalAirport = arrivalAirport
	 	this.departingAirport=departingAirport
	 	this.numOfResults=numOfResults
	 	this.weeksOfResults=weeksOfResults
	}
var arrayXMLFeeds = new Array();

/* data in shtml file */

/* set up stuff *********************************************** */

var taxToggle = "true" ; // adds tax to fares based upon Overseas tax tables - see Sarah N.
var ninenineToggle = "true" ; // defaults all prices to £xx.99p

var strErrors = "";
var intLoadFile = 0;
var bLoadedOnce = false;
var xmlDoc;
var arrayAllXML = new Array();
var counter = 0;

function flightObj (m1LinkCode, tax, adultFare) {
	this.m1LinkCode=m1LinkCode;
	this.tax=parseFloat(tax);
	this.adultFare=parseFloat(adultFare);
	this.showAllFlight=showAllFlight;
}



window.onload = function() {
	scrollTo(0,350);
	loadEvent_getXML();
//	repopulateBM();
}


/*the function is also in tcbmcode.js
function addLoadEvent(func)
{
 var oldonload = window.onload;
 if (typeof window.onload !='function')
 {
  window.onload = func;
 }
 else
 {
  window.onload = function()
   {
    oldonload();;
    func();
   }
 }
}

addLoadEvent(scrollTo(0,350));
addLoadEvent(loadEvent_getXML);
*/


function loadEvent_getXML () {
	var loader= new Array()
  	for(z=0;z<arrayXMLFeeds.length;z++) {
  		var d = new Date();
  		var  cacheBuster = d.getTime();
  		var url = "xml/FlightData_1WAY_" + arrayXMLFeeds[z].arrivalAirport + "_outbound.xml?cb=" + cacheBuster ;
    	loader[loader.length] = new net.ContentLoader(url, BuildXMLArray, BuildError);
//alert("end of a load cycle");
  	}
}


function BuildXMLArray() {
	// because the calls are async, need to load array into a matching index position as the main data array.

	xmlDoc = this.req.responseXML.documentElement;
	var route = xmlDoc.getElementsByTagName("route");
	var destAirport = route[0].getAttribute("DesAiportCode");

	//loop and find index to match
  	for(g=0;g<arrayXMLFeeds.length;g++) {
  		if (arrayXMLFeeds[g].arrivalAirport == destAirport) {
  				arrayAllXML[g] = xmlDoc;
  				counter++
//alert(destAirport + " indexed as " + g);
  		}
  	}

	if (counter == arrayXMLFeeds.length ) {
//alert (counter + " , " + arrayXMLFeeds.length + " must have all the xml data - start build");
		for (p=0;p<arrayAllXML.length; p++) {
			BuildXMLResults(arrayAllXML[p])
		}
	}
}


function BuildXMLResults(xmlDoc) {
//alert("called buildXMLResults");
	//xmlDoc = this.req.responseXML.documentElement;
	var arrayAllRoutes = new Array(); // master array - holds the route arrays of flight objects
	var arrayAllRoutesIndex = new Array(); // matches route number to airport code and number of flights
	var route = xmlDoc.getElementsByTagName("route");
	for (r=0; r<route.length; r++) {
		// master array - format is allroutes[route-index][flight-index]
		var stuffing = getFlights(r, route);
		arrayAllRoutes[r] = stuffing;
		// array for route number vs route airport code,  number of flights on route
		arrayAllRoutesIndex[r] = new Array(route[r].getAttribute("DepAiportCode"), route[r].getElementsByTagName("flight").length);
		//showAllFlight(arrayAllRoutes[r]);
	}
	sortAndBuildOutputArrays(arrayAllRoutes, arrayAllRoutesIndex);
  //	UpdateStatus(arrayAllRoutes);
}


function getFlights(q, route) {
	var x=route[q].getElementsByTagName("flight");
	var y=route[q].getElementsByTagName("prices");
	var arrayTemp = new Array();

	for (w=0;w<x.length;w++)	{

			if (y[w].getAttribute("AdultSaleFare") != "") { // take any saleFare over a regFare
				arrayTemp[arrayTemp.length] = new flightObj(x[w].getAttribute("M1LinkCode"),
															x[w].getAttribute("Tax"),
															y[w].getAttribute("AdultSaleFare"));
			}
			else if (y[w].getAttribute("AdultRegFare") != "") {
				arrayTemp[arrayTemp.length] = new flightObj(x[w].getAttribute("M1LinkCode"),
															x[w].getAttribute("Tax"),
															y[w].getAttribute("AdultRegFare"));
			}
			else { //default
			/*	arrayTemp[w] = new flightObj(x[w].getAttribute("M1LinkCode"),
															x[w].getAttribute("Tax"),
															y[w].getAttribute("AdultRegFare")); */
			}
	}
	return arrayTemp;
}


function UpdateStatus(arrayAllRoutes){
  	intLoadFile++;
  	if(intLoadFile < arrayXMLFeeds.length){
  		document.getElementById("reporter").innerHTML = "Loaded File " + intLoadFile + " of " + arrayXMLFeeds.length + strErrors;
 	}
 	else if(intLoadFile >= arrayXMLFeeds.length && !bLoadedOnce){
    	document.getElementById("reporter").innerHTML = "Loading Completed, " + intLoadFile + " of " + arrayXMLFeeds.length + strErrors;
    	if(!arrayAllRoutes){
      		alert("No XML offers are loaded");
     		return false;
   		}
    bLoadedOnce = true;
  	}
}

function BuildError(){
  	strErrors += "Error:" + "Problem loading XML data file" + "<br/>";
//UpdateStatus();
// as its fallen over lets tell the customer
	document.getElementById("loader").innerHTML="<p>Sorry there is a problem with the data feed,<br/>please try again later!<\/p>";
// and stop here!
}

function sortAndBuildOutputArrays(arrayAllRoutes, arrayAllRoutesIndex) {
// get the results
//	var destination = codeToAirport(arrayAllRoutes[0][0].m1LinkCode.substring(19,22).toUpperCase());
	var arrivalAirport = codeToAirport(arrayXMLFeeds[intLoadFile].arrivalAirport);
	var arrayDepartingAirports = arrayXMLFeeds[intLoadFile].departingAirport.split(",");
	var arrayNumOfResults = arrayXMLFeeds[intLoadFile].numOfResults.split(",");
	var arrayWeeksOfResults = arrayXMLFeeds[intLoadFile].weeksOfResults.split(",");

	var theDate= new Date();

	if ( (arrayDepartingAirports.length != arrayNumOfResults.length) ||
		(arrayDepartingAirports.length != arrayWeeksOfResults.length) ||
		(arrayNumOfResults.length != arrayWeeksOfResults.length)){
	alert("STOP \n Destinations, number of results and weeks in advance don't match in configuration file\n Arrival airport = " + arrivalAirport);
	}

// as we are ready to produce output.. lets remove the loading div called from contentloader.js
	document.getElementById("loader").style.display="none";
// and add the table header row
	document.getElementById("dealsHeader").style.display="block";

// loop through the required departure airports

	for(i=0; i<arrayDepartingAirports.length; i++) {
		var numOfResults = arrayNumOfResults[i]
		var weeksOfResults = arrayWeeksOfResults[i]
		var arrayTemp = new Array();

		currentDateAsString = theDate.getFullYear().toString() + sigfigs((theDate.getMonth()+1)) + sigfigs(theDate.getDate());
		var selectionStartDate = plusDaysToDate(currentDateAsString, 3);
		var selectionEndDate = plusDaysToDate(selectionStartDate, (weeksOfResults*7));

//alert("Current " + currentDateAsString);
//alert ("Start " + selectionStartDate);
//alert ("End " + selectionEndDate);

		for(t=0; t<(arrayAllRoutes.length); t++) {
		//alert("i=" + i + " t=" + t);

		// get airport code of current arrayAllRoutes index
		//alert("does " + arrayDepartingAirports[i] +  " match " + arrayAllRoutesIndex[t][0])
			if (arrayAllRoutesIndex[t][0] == arrayDepartingAirports[i]) {

				//alert("match")
				//alert("number of flights in the set is " + arrayAllRoutesIndex[t][1])

				// so loop through the number of matches and add them to a temp array to produce a short list
				//alert(arrayAllRoutesIndex[t][1]);
				for (k=0; k<arrayAllRoutesIndex[t][1]; k++) {

					// only stuff flights that meet the date critera and not zero priced:
					if ( (arrayAllRoutes[t][k].m1LinkCode.substring(0,8) >= selectionStartDate) &&
							(arrayAllRoutes[t][k].m1LinkCode.substring(0,8) <= selectionEndDate) ) {
							arrayTemp[arrayTemp.length] = arrayAllRoutes[t][k];
					}

					//alert("stuffing at " + k + " of " + (arrayAllRoutesIndex[t][1]-1));
				}

				if (arrayTemp.length !=0) {
					// sorts the short list of results:

					// 1) sort into price order:
					arrayTemp.sort(sortByadultFare);

					// 2) sort by the amount of results required:
					arrayTemp = arrayTemp.slice(0, numOfResults);

					// quick show short list:
					//showAllFlight(arrayTemp);

					//build output table
					buildOutputTable(arrayTemp);
				}
			}
		}
	}
}

function sigfigs(dateNumber) {
	var dateString;
	if (dateNumber <10) {
		dateString = "0" + dateNumber.toString();
	}
	else {
		dateString = dateNumber.toString();
	}
	return dateString;
}


function buildOutputTable(arrayTemp) {
	var txt = "<table><tbody><tr>" ;

	txt += "<td class=\"dealTo\" valign=\"top\">" + codeToAirport(arrayTemp[0].m1LinkCode.substring(19,22)) + "<\/td>" ;
	txt += "<td class=\"dealFrom\" valign=\"top\">" + codeToAirport(arrayTemp[0].m1LinkCode.substring(16,19)) + "<\/td>" ;

	// date block
	txt += "<td class=\"dealDate\" valign=\"top\">" ;
	for (db=0; db<arrayTemp.length; db++) {
		txt += arrayTemp[db].m1LinkCode.substring(6,8)
				+ "/" + arrayTemp[db].m1LinkCode.substring(4,6)
				+ "/" + arrayTemp[db].m1LinkCode.substring(0,4)  + "<br \/>";
	}
	txt += "<\/td>" ;

// price block
	// check if taxes and stuff is needed
	txt += "<td  class=\"dealPrice\" valign=\"top\">" ;
	if (taxToggle == "true"){
		for (pb=0; pb<arrayTemp.length; pb++) {
				var fare = (arrayTemp[pb].adultFare + arrayTemp[pb].tax);
				//99p code - must be done after taxed fares in case fares and taxes != .99
				if (ninenineToggle == 'true') {
					txt += isZeroFareHighlight(arrayTemp[pb].adultFare) + "&pound;" + ninenineFare(fare) + "<br \/>";
				}
				else {
					txt += isZeroFareHighlight(arrayTemp[pb].adultFare) + "&pound;" + fare + "<br \/>";
				}
		}
		txt += "<\/td>" ;
	}
	else {
		for (pb=0; pb<arrayTemp.length; pb++) {
			var fare = arrayTemp[pb].adultFare;
			//99p code - must be done after taxed fares in case fares and taxes != .99
			if (ninenineToggle == 'true') {
				txt += isZeroFareHighlight(arrayTemp[pb].adultFare) + "&pound;" + ninenineFare(fare) + "<br \/>";
			}
			else {
				txt += isZeroFareHighlight(arrayTemp[pb].adultFare) + "&pound;" + fare + "<br \/>";
			}
		}
		txt += "<\/td>" ;
	}


	// link block
	txt += "<td class=\"dealLink\"valign=\"top\">" ;
	for (lb=0; lb<arrayTemp.length; lb++) {
		txt += "<a href=\"javascript:void(0)\" onClick=\"openPaxLayer(event,\'" + arrayTemp[lb].m1LinkCode + "\')\">Book it!<\/a>" + "<br \/>";
	}
	txt += "<\/td>" ;

	txt += "<\/tr><\/tbody><\/table>" ;

	var dealsTable = document.getElementById("dealsTable");
	var aDiv = document.createElement("div");
//	aDiv.setAttribute("class","deal");
	aDiv.innerHTML=txt;
	dealsTable.appendChild(aDiv);
}


function isZeroFareHighlight (fare) {
	var  zeroFareHighlight;
	if ( fare == "0" ) {
		//zeroFareHighlight =  "<img src='images/freeSeat.gif' width='40' height='15' alt='Free seat - you just pay the taxes!' />";
		zeroFareHighlight = "<span class='zeroFare'>Free!</span>";
	}
	else {
		//zeroFareHighlight =  "<img src='images/transpix.gif' width='40' height='15' />";
		zeroFareHighlight = "<span class='noZeroFare'> </span>";
	}
	return zeroFareHighlight;
}


function ninenineFare (fare) {
	var fareSplit = new Array;
	fareSplit = (fare.toString()).split(".");
	//alert("a " + fareSplit[0] + " b " + fareSplit[1]);
	var nineninefare = fareSplit[0] + ".99";
	return nineninefare;
}



function openPaxLayer(e, mm1) {
    e = e || window.event;
    var cursor = {x:0, y:0};
    if (e.pageX || e.pageY) {
        cursor.x = e.pageX;
        cursor.y = e.pageY;
    }
    else {
        var de = document.documentElement;
        var b = document.body;
        cursor.x = e.clientX +
            (de.scrollLeft || b.scrollLeft) - (de.clientLeft || 0);
        cursor.y = e.clientY +
            (de.scrollTop || b.scrollTop) - (de.clientTop || 0);
    }
	var paxLayer = document.getElementById("paxLayer");
	if (document.all){ //win
		paxLayer.style.display = "block";
		paxLayer.style.top = (cursor.y-20);
		paxLayer.style.left = (cursor.x+20);
	}
	else { //moz
		paxLayer.setAttribute("style", "display: block; background-color: #eeeeee; z-index: 100; position: absolute; top: " + (cursor.y - 20) + "px ; left: " + (cursor.x + 20) + "px ;");
	}

	// set form hidden field to be the mm1 attribute
	document.getElementById("pax_m1").setAttribute("value", mm1);
}


function process(form) {
	var deals_totalPax;
	var deals_adultPax = document.getElementById("pax_adult");
	var deals_childPax = document.getElementById("pax_child");
	var deals_infantPax = document.getElementById("pax_infant");
	var deals_url;

	var deals_root="http://book.flythomascook.com/skylights/cgi-bin/skylights.cgi?";
	var deals_ADULT = "ADULT=" + deals_adultPax.options[deals_adultPax.selectedIndex].value;
	var deals_ADULTpx = "&ADULTpx=ADTI";
	var deals_CHILD = "&CHILD=" + deals_childPax.options[deals_childPax.selectedIndex].value;
	var deals_CHILDpx = "&CHILDpx=CHDI";
	var deals_INFANT = "&INFANT=" + deals_infantPax.options[deals_infantPax.selectedIndex].value;
	var deals_language = "&language=EN";
	var deals_m1 = "&m1=" + document.getElementById("pax_m1").getAttribute("value");
	var deals_m1DO = "&m1DO=7";
	var deals_m1DP = "&m1DP=7";
	var deals_m1F = "&m1F=++++++++++++++++++++++++";
	var deals_m2 = "&m2=";
	var deals_m2DO = "&m2DO=7";
	var deals_m2DP = "&m2DP=7";
	var deals_m2F = "&m2F=++++++++++++++++++++++++";
	var deals_module = "&module=SB";
	var deals_nom = "&nom=1";
	var deals_page = "&page=CONFIRM";
	var deals_pxValue = "&px=";
	var deals_tc = "&tc=2";

	// pax check
	if (parseInt(deals_adultPax.options[deals_adultPax.selectedIndex].value) + parseInt(deals_childPax.options[deals_childPax.selectedIndex].value) + parseInt(deals_infantPax.options[deals_infantPax.selectedIndex].value) > 9) {
		alert("You are allowed a maximum of 9 passengers \n per booking online. If your party is larger \n than this, please call our reservation center.");
		return false;
	}

	if (parseInt(deals_infantPax.options[deals_infantPax.selectedIndex].value) > parseInt(deals_adultPax.options[deals_adultPax.selectedIndex].value)) {
		alert("Sorry, you cannot select more infants \n than the number of adults travelling.");
		return false;
	}


	// set pxValue
	if (parseInt(deals_adultPax.options[deals_adultPax.selectedIndex].value) != 0) {
		deals_pxValue += "ADULT+ADTI" + deals_adultPax.options[deals_adultPax.selectedIndex].value;
	}

	if (parseInt(deals_childPax.options[deals_childPax.selectedIndex].value) != 0) {
		deals_pxValue += "CHILD+CHDI" + deals_childPax.options[deals_childPax.selectedIndex].value;
	}

	if (parseInt(deals_infantPax.options[deals_infantPax.selectedIndex].value) != 0) {
		deals_pxValue += "INF+" + deals_infantPax.options[deals_infantPax.selectedIndex].value;
	}

	//build url for deep link
	var deals_url = deals_root + deals_ADULT + deals_ADULTpx + deals_CHILD + deals_CHILDpx + deals_INFANT + deals_language + deals_m1 + deals_m1DO + deals_m1DP + deals_m1F + deals_m2 + deals_m2DO + deals_m2DP + deals_m2F + deals_module + deals_nom + deals_page + deals_pxValue + deals_tc

	//build url for nedstat tracking
	var nedstat_url = "http://uk.sitestat.com/tcook/flythomascook/s?flytc.out-deals." +
								"from-" + deals_m1.substring(20,23) +
								".to-" + deals_m1.substring(23,26) +
								".date-" + deals_m1.substring(4,12) +
								"&ns_type=clickout&ns_url=" ;

	window.location.href = nedstat_url + deals_url;
}



function sortByadultFare(a, b) { // to change order: return ((x < y) ? 1 : ((x > y) ? -1 : 0));
    var x = a.adultFare;
    var y = b.adultFare;
    return ((x < y) ? -1 : ((x > y) ? 1 : 0));
}


function plusDaysToDate(linkCode, plusDays) {
	var outYear, outMonth, outDay, inDate, inYear, inMonth, inDay, inDateStr;
	var plusDaysMS = (1000*60*60*24*plusDays);

	outYear = linkCode.substring(0,4);
	outMonth = linkCode.substring(4,6);
	outDay = linkCode.substring(6,8);

	outDate = new Date();
	inDate = new Date();

	outDate.setFullYear(outYear, outMonth-1, outDay);
	outMS = outDate.getTime();
	inDateMS = (outMS + plusDaysMS);

	inDate.setTime(inDateMS);

	inYear = String(inDate.getFullYear());
	inMonth= String(inDate.getMonth()+1);
	inDay= String(inDate.getDate());

	if (inMonth.length == 1) inMonth =  "0".concat (inMonth);
	if (inDay.length == 1) inDay = "0".concat (inDay);

	inDateStr = inYear.concat(inMonth, inDay);
	return inDateStr;
}


function showAllFlight(Array) {
	var para = document.createElement("p");
	var output = document.getElementById("main");
	output.appendChild(para);

	var txt="";
	for (ii=0;ii<Array.length;ii++){
		txt += 	Array[ii].m1LinkCode + " " + Array[ii].adultFare + "\n" ;
	}

	var text = document.createTextNode(txt);
	para.appendChild(text);
}


function codeToAirport (code)
{
	var airport =  new Array();
	airport ["ABZ"] = "Aberdeen";
	airport ["BFS"] = "Belfast";
	airport ["BHX"] = "Birmingham";
	airport ["BOH"] = "Bournemouth";
	airport ["BRS"] = "Bristol";
	airport ["CWL"] = "Cardiff";
	airport ["DSA"] = "Doncaster Robin Hood";
	airport ["MME"] = "Durham Tees-Valley";
	airport ["EDI"] = "Edinburgh";
	airport ["EXT"] = "Exeter";
	airport ["GLA"] = "Glasgow";
	airport ["HUY"] = "Humberside";
	airport ["LBA"] = "Leeds/Bradford";
	airport ["LPL"] = "Liverpool";
	airport ["LGW"] = "London Gatwick";
	airport ["LTN"] = "London Luton";
	airport ["STN"] = "London Stansted";
	airport ["MAN"] = "Manchester";
	airport ["NCL"] = "Newcastle";
	airport ["NWI"] = "Norwich"
	airport ["EMA"] = "Nottingham East Midlands";

	airport["AGA"] = "Agadir";
	airport["ALC"] = "Alicante";
	airport["LEI"] = "Almeria";
	airport["AYT"] = "Antalya";
	airport["BJL"] = "Banjul";
	airport["BJV"] = "Bodrum";
	airport["BOJ"] = "Bourgas";
	airport["YYC"] = "Calgary";
	airport["CUN"] = "Cancun";
	airport["CTA"] = "Catania";
	airport["CMB"] = "Colombo";
	airport["CFU"] = "Corfu";
	airport["GOI"] = "Dabolim/Goa";
	airport["DLM"] = "Dalaman";
	airport["POP"] = "Dominican Republic/Puerto Plata";
	airport["VDB"] = "Fagernes";
	airport["FAO"] = "Faro";
	airport["SFB"] = "Florida/Sanford";
	airport["FUE"] = "Fuerteventura";
	airport["FNC"] = "Funchal/Madeira";
	airport["GVA"] = "Geneva";
	airport["GRO"] = "Gerona";
	airport["GNB"] = "Grenoble";
	airport["LPA"] = "Gran Canaria";
	airport["YHZ"] = "Halifax";
	airport["SKG"] = "Halkidiki";
	airport["HER"] = "Heraklion/Crete";
	airport["HRG"] = "Hurghada";
	airport["IBZ"] = "Ibiza";
	airport["INN"] = "Innsbruck";
	airport["ADB"] = "Izmir";
	airport["XRY"] = "Jerez";
	airport["KLX"] = "Kalamata";
	airport["KVA"] = "Kavala";
	airport["EFL"] = "Kefalonia";
	airport["KGS"] = "Kos";
	airport["TRV"] = "Trivandrum";
	airport["ACE"] = "Lanzarote";
	airport["LCA"] = "Larnaca/Cyprus";
	airport["LXS"] = "Lemnos";
	airport["LXR"] = "Luxor";
	airport["LYS"] = "Lyon";
	airport["PMI"] = "Majorca/Palma";
	airport["AGP"] = "Malaga";
	airport["MLE"] = "Male";
	airport["MLA"] = "Malta";
	airport["RMF"] = "Marsa Alam";
	airport["MAH"] = "Menorca";
	airport["MBA"] = "Mombasa";
	airport["MIR"] = "Monastir/Tunisia";
	airport["MBJ"] = "Montego Bay";
	airport["YUL"] = "Montreal";
	airport["NAP"] = "Naples";
	airport["OSD"] = "Ostersund";
	airport["YOW"] = "Ottawa";
	airport["PFO"] = "Paphos";
	airport["PDV"] = "Plovdiv";
	airport["PUJ"] = "Punta Cana";
	airport["PVK"] = "Preveza";
	airport["YQB"] = "Quebec";
	airport["REU"] = "Reus";
	airport["RHO"] = "Rhodes";
	airport["RVN"] = "Rovaniemi";
	airport["SSA"] = "Salvador Dois de Julho";
	airport["SZG"] = "Salzburg";
	airport["JTR"] = "Santorini";
	airport["SSH"] = "Sharm El Sheikh";
	airport["JSI"] = "Skiathos";
	airport["SOF"] = "Sofia";
	airport["SPU"] = "Split";
	airport["TFS"] = "Tenerife";
	airport["TLS"] = "Toulouse";
	airport["YYZ"] = "Toronto";
	airport["TRN"] = "Turin";
	airport["YVR"] = "Vancouver";
	airport["VAR"] = "Varna/Bulgaria";
	airport["VCE"] = "Venice";
	airport["VRN"] = "Verona";
	airport["ZTH"] = "Zante";

	return airport[code];
}



