var displayTerminal = true;

var arrivals = null;
var departures = null;

var interfaceLock = false;

var arrivalsUrl = '/flightinformation/arrivals.json';
var departuresUrl = '/flightinformation/departures.json';

var currentDate = null;
var currentAOrD = 'A';
var currentFreeTextSearch = '';

var intervalId = 0;
var count = 0;

$(document).ready(function() {
	var qsFreeTextSearch = querySt("freeTextSearch");
	var qsAOrD = querySt("aOrD");
	
	if (qsFreeTextSearch != '' && qsFreeTextSearch != null)
	{
		currentFreeTextSearch = qsFreeTextSearch.replace('+', ' ');
		currentAOrD = qsAOrD; 
		document.getElementById('freeTextSearch').value = currentFreeTextSearch ;
		
		if (currentAOrD == 'A')
		{
			$("#searchA").attr('checked', true); 
			$("#searchD").attr('checked', false); 
			swapToArrivals(true);
		} 
		else
		{
			$("#searchA").attr('checked', false); 
			$("#searchD").attr('checked', true); 
			swapToDepartures(true);
		}		
	}
	else
	{
		currentFreeTextSearch = document.getElementById('freeTextSearch').value;
		currentAOrD = $("input[name='searchAOrD']:checked").val(); 
	}
	
	loadFlights();
	startAutoRefresh();
});

function startAutoRefresh()
{
	intervalId = window.setInterval(function() { loadFlights();  }, 60000);
}

function loadFlights()
{
	count++;
	if (count > 15) 
	{
		window.clearInterval(intervalId);
		intervalId = -1;
		count = 0;
		$('#flightData').html('<br /><br /><br /><br /><br /><br /><center><h2>Live flight information has stopped refreshing automatically. <br />Please <a href="javascript:loadFlights();startAutoRefresh();">click here</a> to continue displaying the live data.</h2></center>');
		return;
	}

	if(checkInterfaceLock()) return;

	if (currentAOrD == 'A') loadArrivals(function() { renderResults(currentFreeTextSearch); }); 
	else loadDepartures(function() { renderResults(currentFreeTextSearch); }); 
}

var errorText = '<br /><br /><br /><br /><br /><br /><center><h2>Sorry, there was an error loading the live flight information.<br />Please <a href="/flights">click here</a> to reload the page.</h2></center>';

function loadArrivals(func)
{
	interfaceLock = true;
	displayLoadingScreen();

	$.ajax({    
		url: arrivalsUrl,  
		cache: false,
		contentType: "application/json; charset=utf-8",
		dataType: "json",
		beforeSend: function(x) {
			if(x && x.overrideMimeType) {
				x.overrideMimeType("application/json; charset=UTF-8");
			}
		},
		success: function(data){
			arrivals = data.flights;
			func();
			interfaceLock = false;
		},
		error: function (XMLHttpRequest, textStatus, errorThrown) {
			$('#flightData').html(errorText);
			window.clearInterval(intervalId);
			intervalId = -1;
		}
	});
}

function showArrivals()
{
	if(checkInterfaceLock()) return;

	loadArrivals(function() { renderResults(currentFreeTextSearch); }); 
	currentAOrD = 'A';
	swapToArrivals(true);
	
	if (intervalId == -1) startAutoRefresh();
}

function loadDepartures(func)
{
	interfaceLock = true;
	displayLoadingScreen();

	$.ajax({    
		url: departuresUrl,
		cache: false,
		contentType: "application/json; charset=utf-8",
		dataType: "json",
		beforeSend: function(x) {
			if(x && x.overrideMimeType) {
				x.overrideMimeType("application/json; charset=UTF-8");
			}
		},
		success: function(data){
			departures = data.flights;
			func();
			interfaceLock = false;
		},
		error: function (XMLHttpRequest, textStatus, errorThrown) {
			$('#flightData').html(errorText);
			window.clearInterval(intervalId);
			intervalId = -1;
		}
	});
}

function showDepartures()
{
	if(checkInterfaceLock()) return;

	loadDepartures(function() { renderResults(currentFreeTextSearch); }); 
	currentAOrD = 'D';
	swapToDepartures(true);
	
	if (intervalId == -1) startAutoRefresh();
}

function doSearch()
{
	currentFreeTextSearch = document.getElementById('freeTextSearch').value;
	var oldAOrD = currentAOrD;
	currentAOrD = $("input[name='searchAOrD']:checked").val(); 
	
	if (oldAOrD == currentAOrD) renderResults(currentFreeTextSearch);
	else if(currentAOrD == 'A') showArrivals();
	else showDepartures();
	
	if (intervalId == -1) startAutoRefresh();
}

function clearSearch()
{
	setElementDisplay('clearSearch', 'none');
	currentFreeTextSearch = '';
	loadFlights();
	document.getElementById("freeTextSearch").value = '';
}

function renderResults(searchText)
{
	updatePageHeading(currentAOrD);

	if (currentAOrD == 'A') flights = arrivals;
	else flights = departures;
	
	if (searchText.indexOf("e.g.") == 0)
		searchText = "";
		
	searchText = searchText.toLowerCase();
	currentDate = null;	
	
	var html = '';
	var totalRecords = 0;
	
	$.each(flights, function(i, item)
	{
		// TODO: render out date
	
		if (searchText == '' || searchText == null)
		{
			html += renderFlight(item);
			totalRecords++;
		}
		else
		{
			if (flightFuzzyMatchesSearchText(item, searchText))
			{
				html += renderFlight(item);
				totalRecords++;
			}
		}
	});
	
	html += '</table>';
	
	if(totalRecords == 0)
	{
		html =
			'<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>';
	}
	
	$('#flightData').html(html);
	
	var now = new Date();
	$('#lastUpdate').html(now.toLocaleString());
	$('#totalRecords').html(totalRecords);
}

function flightFuzzyMatchesSearchText(flight, searchText)
{
  searchText = searchText.toLowerCase();

  var flightNumber = flight.flightNumber.toLowerCase().replace(/ /g, "");
  var searchTextFlightNumber = searchText.replace(/ /g, "");
  
	if (flightNumber.indexOf(searchTextFlightNumber) != -1) return true;

	if (flight.destination.toLowerCase().match(searchText)) return true;

	return false;
}

function renderFlight(flight)
{
	var row = '';

	if(currentDate == null || currentDate != flight.schdDate)
	{
		row = '<table cellpadding="0" cellspacing="0" border="0" class="table_flight table_flight_content"><tr><th class="row_date">' + flight.schdDate + '</td></tr></table><table cellpadding="0" cellspacing="0" border="0" class="table_flight table_flight_content">';
		currentDate = flight.schdDate;
	}
	
	var terminal = flight.terminal;
	var terminalIndex = 1;
	
	if(terminal == 'T1')
		terminalIndex = 1;
	else if(terminal == 'T2')
		terminalIndex = 2;
	else if(terminal == 'T3')
		terminalIndex = 3;
	
	row += '<tr>';
	if(displayTerminal) row += '<td class="row1"><img src="images/t' + terminalIndex + '_small.gif" alt="' + terminal + '" /></td>';
	row += '<td class="row2">' + flight.flightNumber + '</td>';
	row += '<td class="row3">' + flight.schdTime + '</td>' ;
	row += '<td class="row4">' + flight.destination + '</td>' ;
	row += '<td class="row5">' + flight.status + '</td>';
	row += '</tr>';
	
	return row;
}

function displayLoadingScreen()
{
	$('#flightData').html('<br /><br /><br /><br /><br /><br /><div align="center" style="font-size: 20px;"><b>loading</b><br /><img src="images/progress.gif" /></div>');
}

function updatePageHeading(aOrD)
{
	var pageHeading = document.getElementById("pageHeading");
	if (pageHeading != null)
	{
		pageHeading.innerHTML = aOrD == "A" ? 
			"Live Flight Information - Arrivals" : 
			"Live Flight Information - Departures";
	}
}

function swapToDepartures(ignoreInterfaceLock)
{
	if(!ignoreInterfaceLock && checkInterfaceLock()) return;
	$('#modeHeading').html('Departing To');
	$('#departuresinactive').css('display', 'none');
	$('#departurescurrent').css('display', 'block');
	$('#arrivalsinactive').css('display', 'block');
	$('#arrivalscurrent').css('display', 'none');
}

function swapToArrivals(ignoreInterfaceLock)
{
	if(!ignoreInterfaceLock && checkInterfaceLock()) return;
	$('#modeHeading').html('Arriving From');
	$('#arrivalsinactive').css('display', 'none');
	$('#arrivalscurrent').css('display', 'block');
	$('#departuresinactive').css('display', 'block');
	$('#departurescurrent').css('display', 'none');
}

function checkInterfaceLock()
{
	if(interfaceLock) return true;
	return false;
}

function querySt(ji) 
{
	hu = window.location.search.substring(1);
	gy = hu.split("&");
	for (i=0;i<gy.length;i++) {
		ft = gy[i].split("=");
		if (ft[0] == ji) {
			return ft[1];
		}
	}
}
