/*

OUTBOUND CODE v1-10

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)
1-10 Tuned for new skylights 8 release - new link params
1-11 - added - expandDates: if true and no flights in date selected by user then use any dates availaible
1-12 - fixed if xml files are invalid - will continue without that route
1-13 - mod to handle new promo/discount codes 

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 ninenineToggle = "false" ; // defaults all prices to £xx.99p
var expandDates = "true"; //true/false to use any dates is none are available in user specced range

var strErrors = "";
var bLoadedOnce = false;
var xmlDoc;
var arrayAllXML = new Array();
var counter = 0;

function flightObj (m1LinkCode, tax, saleFare, adultFare, discountCode, isSale) {
	this.m1LinkCode=m1LinkCode;
	this.tax=parseFloat(tax);
    this.saleFare=parseFloat(saleFare);
	this.adultFare=parseFloat(adultFare);
	this.discountCode=discountCode;
    this.isSale=isSale;
}

function loadEvent_getXML () {
	var loader= new Array()
  	for(z=0;z<arrayXMLFeeds.length;z++) {
  		var d = new Date();
  		var  cacheBuster = d.getTime();
  		var url = "/skylights/xml/FlightData_1WAY_" + arrayXMLFeeds[z].arrivalAirport + "_outbound.xml?cb=" + cacheBuster ;
    	loader[loader.length] = new net.ContentLoader(url, BuildXMLArray, BuildError);
  	}
}


function BuildXMLArray() {
// because the calls are async, need to load array into a matching index position as the arrayXMLFeeds data array.

// is the response flights xml?
	var isXML = this.req.responseText;
	if (/<route/.test(isXML)) {
		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++
			}
		}	
	} else {
	counter++
	}

// when we think we have loaded all the xml needed
	if (counter == arrayXMLFeeds.length) {
		//fill in the empty elements with nothing
		for(h=0;h<arrayXMLFeeds.length;h++) {
			if (arrayAllXML[h] != null) {
				BuildXMLResults(arrayAllXML[h], h);
			}
		}		
	}
	
}

function BuildXMLResults(xmlDoc, arrayAllXMLIndex) {
//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"), stuffing.length);
		//showAllFlight(arrayAllRoutes[r]);
	}
	sortAndBuildOutputArrays(arrayAllRoutes, arrayAllRoutesIndex, arrayAllXMLIndex);
  	//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("M1"),
                                                    0,
                                                    y[w].getAttribute("AdultSaleFare"),
                                                    y[w].getAttribute("AdultRegFare"),
                                                    getDiscountCode(y[w].getAttribute("ADTcode")),
                                                    1
													);
				}
				else if (y[w].getAttribute("AdultRegFare") != "") {
					arrayTemp[arrayTemp.length] = new flightObj(x[w].getAttribute("M1"),
                                                    0,
                                                    y[w].getAttribute("AdultSaleFare"),
                                                    y[w].getAttribute("AdultRegFare"),
                                                    getDiscountCode(y[w].getAttribute("ADTcode")),
                                                    0
													);
				}
				else { //default
				/*	arrayTemp[w] = new flightObj(x[w].getAttribute("M1"),
																x[w].getAttribute("Tax"),
																y[w].getAttribute("AdultRegFare")); */
				}
		}
	
	return arrayTemp;
}


function getDiscountCode(ADTcode) {
		if (ADTcode.length == 4) {
			disCode = ADTcode.substring(3);
		}
		else {
			disCode = "N";
		}
		return disCode;
}




function UpdateStatus(arrayAllRoutes){
  	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, arrayAllXMLIndex ) {
// get the results
//	var destination = codeToAirport(arrayAllRoutes[0][0].m1LinkCode.substring(19,22).toUpperCase());
	var arrivalAirport = codeToAirport(arrayXMLFeeds[arrayAllXMLIndex].arrivalAirport);
	var arrayDepartingAirports = arrayXMLFeeds[arrayAllXMLIndex].departingAirport.split(",");
	var arrayNumOfResults = arrayXMLFeeds[arrayAllXMLIndex].numOfResults.split(",");
	var arrayWeeksOfResults = arrayXMLFeeds[arrayAllXMLIndex].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
                var oldDest = "";
	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]) {

//console.log("match " + arrayAllRoutesIndex[t][0] + " - " + arrayDepartingAirports[i]  + "------------------------------------------------------------------");
//console.log("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 ( (parseInt(arrayAllRoutes[t][k].m1LinkCode.substring(0,8)) >= parseInt(selectionStartDate)) &&
                            (parseInt(arrayAllRoutes[t][k].m1LinkCode.substring(0,8)) <= parseInt(selectionEndDate)) ) {
//console.log("stuff one:");   
							//arrayTemp[arrayTemp.length] = arrayAllRoutes[t][k];
                            arrayTemp.push(arrayAllRoutes[t][k]);
//console.log(arrayAllRoutes[t][k].m1LinkCode.substring(0,8) + " >= " + selectionStartDate + "\n" + arrayAllRoutes[t][k].m1LinkCode.substring(0,8) + " <= " + selectionEndDate);                                           
					}
//alert("stuffing at " + k + " of " + (arrayAllRoutesIndex[t][1]-1));
				}

					// if there are no flights because the date range is empty of flights - expand the date ranges by
					// stuffing anything !
					if ((arrayTemp.length == 0) && (expandDates == "true")) {
//console.log(arrayTemp.length);                    
//console.log("stuff it all");
						for (k=0; k<arrayAllRoutesIndex[t][1]; k++) {
									//arrayTemp[arrayTemp.length] = arrayAllRoutes[t][k];
                                    arrayTemp.push(arrayAllRoutes[t][k]);
						}
					}
					
                var currDest = codeToAirport(arrayTemp[0].m1LinkCode.substring(19,22));
                var buildLink = "";
//console.log("oldDest: ", oldDest, " currDest", currDest); 

                if (oldDest != currDest) {
                    oldDest = currDest;
//console.log("CHANGE!");
                    buildLink = currDest;
                };
                
                

				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, buildLink);

				}
			}
		}
	

       
    }

// final bit to tudy up:
	scrollTo(0,255);

}

function sigfigs(dateNumber) {
	var dateString;
	if (dateNumber <10) {
		dateString = "0" + dateNumber.toString();
	}
	else {
		dateString = dateNumber.toString();
	}
	return dateString;
}


function buildOutputTable(arrayTemp, buildLink) {
	var txt = "" ;

    if (buildLink != "") {
        txt += "<div class=\"pageLink\"><a name=\"" + buildLink + "\"></a><span>" + buildLink + "<\/span><span class=\"RHS\"><a href=\"#top\">Top of page</a><\/span><br/><table class=\"wide\"><tr><td class=\"dealFrom\">Departing</td><td class=\"dealTo\">Destination</td><td class=\"dealDate\">Date</td><td class=\"dealPrice\">Price from</td><td class=\"dealLink\">&nbsp;</td></tr><\/table><\/div>";
        
        pageLink = document.createElement("a");
        pageLink.href = "#" + buildLink;
        pageLinkName = document.createTextNode(buildLink);
        pageLink.appendChild(pageLinkName);
        document.getElementById("pageLinks").appendChild(pageLink);
        
    }
    
    txt += "<table><tbody><tr>";
    
    txt += "<td class=\"dealFrom\" valign=\"top\">" + codeToAirport(arrayTemp[0].m1LinkCode.substring(16,19)) + "<\/td>" ;
    
	txt += "<td class=\"dealTo\" valign=\"top\">" + codeToAirport(arrayTemp[0].m1LinkCode.substring(19,22)) + "<\/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\">" ;

		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') {
            
                if ((arrayTemp[pb].isSale) == 1 ){ 
                    txt += "<span class='sale'>&pound;" + ninenineFare(arrayTemp[pb].adultFare) + isZeroFareHighlight(arrayTemp[pb].adultFare) + "<\/span> ";
                    txt +=  "<span class='saleLabel'> Now from </span>&pound;" + ninenineFare(arrayTemp[pb].saleFare) + isZeroFareHighlight(arrayTemp[pb].adultFare);
                }
                else{
                    txt +=  "&pound;" + ninenineFare(arrayTemp[pb].adultFare) + isZeroFareHighlight(arrayTemp[pb].adultFare);
                }
                
                ;  
           
               
			}
			else {
            
                if ((arrayTemp[pb].isSale) == 1 ){ 
                    txt += "<span class='sale'>&pound;" + arrayTemp[pb].adultFare + isZeroFareHighlight(arrayTemp[pb].adultFare) + "<\/span> ";
                    txt +=  "<span class='saleLabel'> Now from </span>&pound;" + arrayTemp[pb].saleFare + isZeroFareHighlight(arrayTemp[pb].adultFare);
                }
                else {
                    txt +=  "&pound;" + arrayTemp[pb].adultFare + isZeroFareHighlight(arrayTemp[pb].adultFare);
                };  
            
               
			}
            
     
            txt += "<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=\"openOptionLayer(event,\'" + arrayTemp[lb].m1LinkCode + "\',\'" + arrayTemp[lb].discountCode + "\')\">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 = "";
	}
	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 closeOptionLayer(){
	var optionLayer = document.getElementById("optionLayer");
		if (document.all){ //win
			optionLayer.style.display = "none";
		}
		else { //moz
			optionLayer.setAttribute("style", "display: none;");
		}
		resetAll();
}


function openOptionLayer(e, mm1, discountCode) {

	// get cursor position
	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);
	}
	
	// set form hidden field to be the mm1 attribute - this can be sl or tos deeplink code
	document.getElementById("pax_m1").setAttribute("value", mm1);	
	
	// set form hidden field to be the discountCode attribute - only applies to SL, TOS is ""
	document.getElementById("pax_discountCode").setAttribute("value", discountCode);	
	
	//check if it a tos or a sl flight - modify optionLayer accordingly
	//determine search type from link_info
	var pattern = /www1\.flythomascook\.com/;
	if (pattern.test(mm1)) { //TOS	
		changeDisplay("returnOption", "none");
		document.getElementById("pax_action").setAttribute("value", "tos");
	}
	else {
		changeDisplay("returnOption", "block");
		setFlightDates(document.getElementById("duration").options[document.getElementById("duration").selectedIndex].value);
		document.getElementById("pax_action").setAttribute("value", "slOneWay");
	}
	
	//show and position the layer
	var optionLayer = document.getElementById("optionLayer");
	if (document.all){ //win
		optionLayer.style.display = "block";
		optionLayer.style.top = (cursor.y-20);
		optionLayer.style.left = (cursor.x+20);
	}
	else { //moz
		optionLayer.setAttribute("style", "display: block; position: absolute; top: " + (cursor.y - 20) + "px ; left: " + (cursor.x + 20) + "px ;");
	}
}

function setFlightDates(duration) {

	if ((duration == 0) || (duration == "")) {
		resetAll();
	} 
	else {	
		changeDisplay("displayDepDates", "inline");
		changeDisplay("displayRetDates", "inline");
		document.getElementById("pax_action").setAttribute("value", "slReturn");
		var dayArray = ["Sun","Mon","Tue","Wed","Thu","Fri","Sat"];
		var monthArray = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];
		// departing
		var depAirport = document.getElementById("pax_m1").value.substring(16,19);
		var depDateStr = document.getElementById("pax_m1").value.substring(0,8);
		var depDate = new Date(depDateStr.substring(0,4), (depDateStr.substring(4,6)-1), depDateStr.substring(6,8));
		var oldDEl = document.getElementById("displayDepDates").childNodes[0];
		var newDEl = document.createTextNode("Departing " + depAirport + " on: " + dayArray[depDate.getDay()] + " " + addLeadingZero(depDate.getDate()) + " " + monthArray[depDate.getMonth()] + " " + depDate.getFullYear());
		document.getElementById("displayDepDates").replaceChild(newDEl, oldDEl);	
		// returning
		var retAirport = document.getElementById("pax_m1").value.substring(19,22);
		var retDateMS = ( (depDate.getTime()) + (duration * 24 * 60 * 60 * 1000) );
		var retDate = new Date(retDateMS);
		document.getElementById("pax_retDate").setAttribute("value", retDate.getFullYear().toString() + addLeadingZero(retDate.getMonth()+1) + addLeadingZero(retDate.getDate()) );
		var oldREl = document.getElementById("displayRetDates").childNodes[0];
		var newREl = document.createTextNode("Returning " + retAirport + " on: " + dayArray[retDate.getDay()] + " " + addLeadingZero(retDate.getDate()) + " " + monthArray[retDate.getMonth()] + " " + retDate.getFullYear());
		document.getElementById("displayRetDates").replaceChild(newREl, oldREl);
	}
}

function changeDisplay(elId, state) {
	if (document.getElementById(elId)) {
		if (document.all){ //win
			document.getElementById(elId).style.display = state;
		}
		else { //moz
			document.getElementById(elId).setAttribute("style","display: " + state);
		}	
	}
}

function addLeadingZero(num) {
	var numAsStr;
	if (num < 10) {
		numAsStr = "0" + num;
	} 
	else {
		numAsStr = num;
	}
	return numAsStr.toString();
}

function resetAll() {
	changeDisplay("displayDepDates", "none");
	changeDisplay("displayRetDates", "none");
	document.getElementById("displayDepDates").replaceChild(document.createTextNode(" "), document.getElementById("displayDepDates").childNodes[0]);
	document.getElementById("displayRetDates").replaceChild(document.createTextNode(" "), document.getElementById("displayRetDates").childNodes[0]);
	document.getElementById("pax_retDate").setAttribute("value","");
	document.getElementById("pax_action").setAttribute("value","slOneWay");
	document.getElementById("duration").selectedIndex=0;
}

function process(form) {
	// grab some form info
	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 link_info = document.getElementById("pax_m1").getAttribute("value");
	var retDate = document.getElementById("pax_retDate").getAttribute("value"); 
	var action = document.getElementById("pax_action").getAttribute("value");

	// do some pax checking first
	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;
	}

	//let set the discounting type, these will be ignored for TOS and SLReturn:
	var DiscountType = document.getElementById("pax_discountCode").getAttribute("value");
	if (DiscountType == "N") {
		var deals_ADULTpx = "&ADULTpx=ADT";
		var deals_CHILDpx = "&CHILDpx=CHD";
		var deals_MODE = "&MODE=";
	} 
	else if ((DiscountType == "X") || (DiscountType == "Y")) {
		var deals_ADULTpx = "&ADULTpx=ADT" + DiscountType;
		var deals_CHILDpx = "&CHILDpx=CHD" + DiscountType;
		var deals_MODE = "&MODE=PROMO_" + DiscountType;
	}
	else if (DiscountType == "I") {
		var deals_ADULTpx = "&ADULTpx=ADTI";
		var deals_CHILDpx = "&CHILDpx=CHDI";
		var deals_MODE = "&MODE=";
	} 
	else { //default
		var deals_ADULTpx = "&ADULTpx=ADT";
		var deals_CHILDpx = "&CHILDpx=CHD";
		var deals_MODE = "&MODE=";
	}
	
	//other shared values
	var pattern = /149.122.160.43/;
	if (pattern.test(window.location.href)) {
		var deals_root="http://149.122.160.43:8080/skylights/cgi-bin/skylights.cgi?";
	}
	else {
		var deals_root="https://book.flythomascook.com/skylights/cgi-bin/skylights.cgi?";
	}
	var deals_CHILD = "&CHILD=" + deals_childPax.options[deals_childPax.selectedIndex].value;
	var deals_INFANT = "&INFANT=" + deals_infantPax.options[deals_infantPax.selectedIndex].value;
	var deals_language = "&language=EN";
	var deals_module = "&module=SB";
	var deals_sid = "&sid=";	
	var deals_from1 = "&from1=" +  link_info.substring(16,19);
	var deals_to1 = "&to1=" + link_info.substring(19,22);					
					
	// do the required action
	switch (action) {
		case "slOneWay": //SL deep linked search
			var deals_ADULT = "&ADULT=" + deals_adultPax.options[deals_adultPax.selectedIndex].value;
			var deals_numberMarkets = "&numberMarkets=1";
			var deals_page = "&page=SELECT";
			var deals_m1 = "&m1=" + link_info;
			var deals_flight_1 = "&flight_1=" + link_info.substring(0,50) + "|" + link_info.substring(50,52) + "|" + link_info.substring(52,54) + "||" + link_info.substring(54,55) + "|" + link_info.substring(56,61);
			var deals_event= "&event=select";
			var deals_departDay1 = "&departDay1=" + link_info.substring(6,8);
			var deals_departMonth1 = "&departMonth1=" + link_info.substring(0,6);
			var deals_travel = "&travel=1";
			//build url for deep link
			var deals_url = deals_root + deals_MODE + deals_ADULT + deals_ADULTpx + deals_CHILD + deals_CHILDpx + deals_INFANT + deals_numberMarkets + deals_language + deals_module + deals_page + deals_m1 + deals_flight_1 + deals_sid + deals_event + deals_from1 + deals_to1 + deals_departDay1 + deals_departMonth1 + deals_travel;
			//build url for nedstat tracking
			//var nedstat_url = "http://uk.sitestat.com/tcook/flythomascook/s?flytc.out-deals.sl_OneWay." + "from-" + deals_m1.substring(20,23) +	".to-" + deals_m1.substring(23,26) + ".date-" + deals_m1.substring(4,12) + "&ns_type=clickout&ns_url=" ;				
		break;
		
		case "slReturn": //SL std search
			var deals_ADULT = "ADULT=" + deals_adultPax.options[deals_adultPax.selectedIndex].value;
			var deals_numberMarkets = "&numberMarkets=2";
			var deals_page = "&page=SEARCH";
			var deals_event= "&event=search";
			var deals_departDay1 = "&departDay1=" + link_info.substring(6,8);
			var deals_departDay2 = "&departDay2=" + retDate.substring(6,8);
			var deals_departMonth1 = "&departMonth1=" + link_info.substring(0,6);
			var deals_departMonth2 = "&departMonth2=" + retDate.substring(0,6);
			var deals_travel = "&travel=2";
			//build url for deep link
			var deals_url = deals_root + deals_ADULT + deals_CHILD + deals_INFANT + deals_numberMarkets + deals_language + deals_module + deals_page + deals_sid + deals_event + deals_from1 + deals_to1 + deals_departDay1 + deals_departMonth1 + deals_departDay2 + deals_departMonth2 + deals_travel;
			//build url for nedstat tracking
			//var nedstat_url = "http://uk.sitestat.com/tcook/flythomascook/s?flytc.out-deals.sl_Return." + "from-" + link_info.substring(16,19) +	".to-" + link_info.substring(19,22) + ".date-" + link_info.substring(0,6) + link_info.substring(6,8) + "_" + retDate + "&ns_type=clickout&ns_url=" ;
		break;

		case "tos":
			var deals_root="http://www1.flythomascook.com/flytc/productSearch.vm?";
			var deals_searchType = "&searchType=R";
			var deals_departureCode = "&departureCode=" + link_info.substring(80,83);
			var deals_departureDay = "&departureDay=" + link_info.substring(97,99);
			var deals_departureYearMonth =	"&departureYearMonth=" + link_info.substring(119,126);
			var deals_departureDateMinus =	"&departureDateMinus=" + 7;
			var deals_departureDatePlus = "&departureDatePlus=" + 7;
			var deals_noAdults = "&noAdults=" + deals_adultPax.options[deals_adultPax.selectedIndex].value;
			var deals_noChildren = "&noChildren=" + deals_childPax.options[deals_childPax.selectedIndex].value;
			var deals_destinationCode = "&destinationCode=" + link_info.substring(208,211);
			var deals_returnDay = "&returnDay=" + link_info.substring(222,224);
			var deals_returnYearMonth = "&returnYearMonth=" + link_info.substring(241,248);;
			var deals_noInfants = "&noInfants=" + deals_infantPax.options[deals_infantPax.selectedIndex].value;
			//build url for deep link
			var deals_url = deals_root+deals_searchType+deals_departureCode+deals_departureDay+deals_departureYearMonth+deals_departureDateMinus+deals_departureDatePlus+deals_noAdults+deals_noChildren+deals_destinationCode+deals_returnDay+deals_returnYearMonth+deals_noInfants;
			//build url for nedstat tracking
			//var nedstat_url = "http://uk.sitestat.com/tcook/flythomascook/s?flytc.out-deals.tos." + "from-" + deals_departureCode.substring(15,18) + ".to-" + deals_destinationCode.substring(17,20) + ".date-" + deals_departureYearMonth.substring(20,24) + deals_departureYearMonth.substring(25,27) + deals_departureDay.substring(14,16) + "&ns_type=clickout&ns_url=" ;
		break;
	}
	
	// a bit of debugging help in dev
	var pattern = /149.122.160.43/;
	if (pattern.test(window.location.href)) {
		//alert("Booking Type: \n " + action + "\n\n" +	"Tracking link: \n" + nedstat_url + "\n\n" + "URL: \n " + deals_url + "\n\n");
		alert("Booking Type: \n " + action + "\n\n" +	"Tracking link: \n" + "\n\n" + "URL: \n " + deals_url + "\n\n");
	}
	
	
	//window.location.href = nedstat_url + deals_url;
	window.location.href = 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";
	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";
    airport["NBE"] = "Enfhida";
    airport["DJE"] = "Djerba";    

	return airport[code];
}




