var fiConfig = new Object(); // The flight info config
var fiEngine = new Object(); // The flight info engine

function flightInfoConfig(browseFrom, browseTo, searchFrom, searchTo, displayTerminal)
{
	// The date range to use when browsing
	this.browseFrom = browseFrom;
	this.browseTo = browseTo;
	
	// The date range to use when searching
	this.searchFrom = searchFrom;
	this.searchTo = searchTo;
	
	this.displayTerminal = displayTerminal;
}

function flightInfoEngine()
{
	// Build the flight info engine object
	this.xmlDoc = null;
	this.currentAOrD = document.getElementById('searchA').checked ? 'A':'D';
	this.currentFreeTextSearch = document.getElementById('freeTextSearch').value;
	this.interfaceLock = false;
	this.req = null;
}

function startFlightInfoEngine(browseFrom, browseTo, searchFrom, searchTo, displayTerminal)
{
	fiConfig = new flightInfoConfig(browseFrom, browseTo, searchFrom, searchTo, displayTerminal);
	fiEngine = new flightInfoEngine();
	
	// If a the page was initialised with a free-text search, display the 'clear search' button. 
	if(fiEngine.currentFreeTextSearch != '')
		setElementDisplay('clearSearch', 'block');

	setElementInnerHTML('flightData', 'loading...');
	loadFlightData();
	
	window.setInterval(function() { loadFlightData(fiEngine.currentAOrD, fiEngine.currentFreeTextSearch); }, 60000);
}

function loadXMLDoc(url)
{
	try
	{
		if (window.ActiveXObject)
		{
			// Internet Explorer support
			fiEngine.xmlDoc = new ActiveXObject('Microsoft.XMLDOM');
			fiEngine.xmlDoc.onreadystatechange = function () {
				if (fiEngine.xmlDoc.readyState == 4) onLoad(); };
			fiEngine.xmlDoc.load(url);
	 	}
	 	else if (window.XMLHttpRequest)
		{
			// Firefox, Safari and Opera support
			fiEngine.req = new XMLHttpRequest();
			fiEngine.req.onreadystatechange = function () {
				if (fiEngine.req.readyState == 4)
				{
					fiEngine.xmlDoc = fiEngine.req.responseXML;
					onLoad();
				}
			};
			fiEngine.req.open("GET", url, true);
			fiEngine.req.send(null);
		}
		else if (document.implementation && document.implementation.createDocument)
		{
			// Fail-safe.
			fiEngine.xmlDoc = document.implementation.createDocument("", "", null);
			fiEngine.xmlDoc.onload = onLoad;
			fiEngine.xmlDoc.load(url);
		}
	}
	catch(e)
	{
		/*displayFlightDataError(
			'The live flight information can not be retrieved.', 
			'This could be due to your browser\'s security settings.');*/
		switchToBasicMode("Could not create XML doc");
		return false;
	}

	return true;
}

function switchToBasicMode(reason)
{
	document.location = 'FlightInfo?cmd=displayFlightsBasic&reason=' + escape(reason);
}

function loadFlightData(aOrD, freeTextSearch)
{
	if (fiConfig == null)
	{
		switchToBasicMode("fiConfig is null");
		return;
	}
	
	if (fiEngine == null)
	{
		switchToBasicMode("fiEngine is null");
		return;
	}

	if(checkInterfaceLock()) return;
	fiEngine.interfaceLock = true;
		
	if(aOrD == null)
		aOrD = fiEngine.currentAOrD;
		
	if(freeTextSearch == null)
		freeTextSearch = fiEngine.currentFreeTextSearch;
	
	if (freeTextSearch.indexOf("e.g.") == 0)
		freeTextSearch = "";

	// If we are doing a free text search, use the searching from and to dates.
	// If not, use the browsing from and to dates.
	var from, to;
	if(freeTextSearch != null && freeTextSearch != '')
	{
		from = fiConfig.searchFrom;
		to = fiConfig.searchTo;
	}
	else
	{
		from = fiConfig.browseFrom;
		to = fiConfig.browseTo;
	}
	
	if (from == undefined || to == undefined)
	{
		switchToBasicMode("from/to dates are undefined");
		return;
	}
	
	displayLoadingScreen();

	var url = 
		'FlightInfo?cmd=loadFlightXml&aOrD=' + aOrD + 
		'&freeTextSearch=' + freeTextSearch +
		'&from=' + escape(from) + 
		'&to=' + escape(to) + 
		'&__noCache=' + Math.round((Math.random() * 10000));

	loadXMLDoc(url);
	updatePageHeading(aOrD);
}

function updatePageHeading(aOrD)
{
	var pageHeading = document.getElementById("pageHeading");
	if (pageHeading != null)
	{
		pageHeading.innerHTML = aOrD == "A" ? 
			"Live Flight Information - Arrivals" : 
			"Live Flight Information - Departures";
	}
}

/*function displayFlightDataError(caption, msg)
{
	setElementInnerHTML('flightData', 
		'<br /><br /><br /><br /><br /><br /><p align="center"><span style="color: #FF0000; font-weight: bold;">' + caption + '</span><br />' + 
		msg + '</p>');
}*/

function onLoad()
{
	if (fiEngine.xmlDoc == null)
	{
		switchToBasicMode("fiEngine.xmlDoc was null");
		return;
	}

	var flightInfo = fiEngine.xmlDoc.getElementsByTagName('flightinfo');
	if (flightInfo[0] == null)
	{
		switchToBasicMode("flightInfo tag not found in response");
		return;
	}
	
	var flights = fiEngine.xmlDoc.getElementsByTagName('flight');
	var totalRecords = flightInfo[0].getAttribute('totalRecords');
	setElementInnerHTML('totalRecords', totalRecords);
	
	fiEngine.currentAOrD = flightInfo[0].getAttribute('aOrD');
	if(fiEngine.currentAOrD == 'A')
		swapToArrivals(true);
	else
		swapToDepartures(true);
	
	if(totalRecords == 0)
	{
		setElementInnerHTML('flightData', 
			'<table cellpadding="0" cellspacing="0" border="0" class="table_flight">' +
                '<tr><td colspan="5">Sorry, there were no flights which matched your search</td></tr>' +
            '</table>');
	}
	else renderResults(flights);
	
	fiEngine.interfaceLock = false;
	
	setElementVisibility('progressBar', false);
}

function renderResults(flights)
{
	var html = '';
	
	var currentDate = null;	
	for (i = 0; i < flights.length; i++)
	{
		var terminal = flights[i].getAttribute('term');
		var terminalIndex = 1;
		
		if(terminal == 'T1')
			terminalIndex = 1;
		else if(terminal == 'T2')
			terminalIndex = 2;
		else if(terminal == 'T3')
			terminalIndex = 3;
		
		var itemDate = flights[i].getAttribute('schdDate');
		//itemDate = itemDate.substring(0, itemDate.length - 9);
		
		if(currentDate == null || currentDate != itemDate)
		{
			html += '<table cellpadding="0" cellspacing="0" border="0" class="table_flight table_flight_content">';
			html += '<tr><th class="row_date">' + itemDate + '</td></tr>';
			html += '</table>';
			html += '<table cellpadding="0" cellspacing="0" border="0" class="table_flight table_flight_content">';
			currentDate = itemDate;
		}
		
		html += '<tr>';
		
		if(fiConfig.displayTerminal)
			html += '<td class="row1"><img src="/Shared/images/terminals/t' + terminalIndex + '_small.gif" alt="' + terminal + '" /></td>';
		
		html += 
			'<td class="row2">' + flights[i].getAttribute('fn') + '</td>' + 
			'<td class="row3">' + flights[i].getAttribute('schdTime') + '</td>' +
			'<td class="row4"">' + flights[i].getAttribute('dest') + '</td>' + 
			'<td class="row5">' + flights[i].getAttribute('status') + '</td>' + 
			'</tr>';
	}
	
	html += '</table>';
	
	setElementInnerHTML('flightData', html);
	
	var now = new Date();
	setElementInnerHTML('lastUpdate', now.toLocaleString());
}


function swapToDepartures(ignoreInterfaceLock)
{
	if(!ignoreInterfaceLock && checkInterfaceLock()) return;
	setElementInnerHTML('modeHeading', 'Departing To');
	setElementDisplay('departuresinactive', 'none');
	setElementDisplay('departurescurrent', 'block');
	setElementDisplay('arrivalsinactive', 'block');
	setElementDisplay('arrivalscurrent', 'none');
}

function swapToArrivals(ignoreInterfaceLock)
{
	if(!ignoreInterfaceLock && checkInterfaceLock()) return;
	setElementInnerHTML('modeHeading', 'Arriving From');
	setElementDisplay('arrivalsinactive', 'none');
	setElementDisplay('arrivalscurrent', 'block');
	setElementDisplay('departuresinactive', 'block');
	setElementDisplay('departurescurrent', 'none');
}

function checkInterfaceLock()
{
	if(fiEngine.interfaceLock)
	{
		trace('Interface locked');
		return true;
	}
	
	return false;
}

function doFreeTextSearch()
{
	if(checkInterfaceLock()) return;

	fiEngine.currentFreeTextSearch = document.getElementById('freeTextSearch').value;
	if(fiEngine.currentFreeTextSearch == '') 
	{
		alert('Please enter a search term.');
		return;
	}
	
	fiEngine.currentAOrD = document.getElementById('searchA').checked ? 'A':'D';
		
	loadFlightData();
	setElementDisplay('clearSearch', 'block');
}

function clearSearch()
{
	setElementDisplay('clearSearch', 'none');
	fiEngine.currentFreeTextSearch = '';
	loadFlightData();
	document.getElementById("freeTextSearch").value = '';
}

function displayLoadingScreen()
{
	setElementInnerHTML('flightData', 
		'<br /><br /><br /><br /><br /><br /><div align="center" style="font-size: 20px;"><b>loading</b><br /><img src="/Shared/images/progress.gif" /></div>');
}