Event.observe(document,"dom:loaded", initTimetableSearch);		

function initTimetableSearch(event){
	addPrompts('timetable_search_form');
	updateReturnDateFields();
	
	var airport_from_auto_completer = new Ajax.Autocompleter('airportFrom', 'airportFromSuggest', $('timetable_search_form').action, {
		indicator: 'spinnerFrom',
		minChars: 2,
		frequency: 0.4,
		paramName: 'airportSearch',
		afterUpdateElement : setAirportFromID,
		parameters : 'isAjax=1' 
	});

	var airport_to_auto_completer = new Ajax.Autocompleter('airportTo', 'airportToSuggest', $('timetable_search_form').action, {
		indicator: 'spinnerTo',
		minChars: 2,
		frequency: 0.4,
		paramName: 'airportSearch',
		afterUpdateElement : setAirportToID,
		parameters : 'isAjax=1' 
	});
	

	$('airportFrom').observe('click', function(event) {
		$('airportFrom').value = '';
		$('departureCodePair').value = '';
	});

	$('airportTo').observe('click', function(event) {
		$('airportTo').value = '';
		$('arrivalCodePair').value = '';
	});
	
	$('isReturnFlight').observe('click', function(event) {
		updateReturnDateFields();
	});

	var departureResultTable = $('departureResultsTable');
	var returnResultTable = $('returnResultsTable');

	if (departureResultTable) {
		$$('.departureFlight').each(function(row){
			row.observe('click', function(event) {
				departureShowLeg(row.id);
			})
		})

		$$('.departureLegClose').each(function(button){
			button.observe('click', function(event) {
				departureCloseOpenFlights();
			})
		})

		//sortByHiddenCol('duration_departure', $('departureResultsTable')); 

		Event.observe($('departureTime_departure'),'click', sortDepartureByHiddenCol);			
		Event.observe($('arrivalTime_departure'),'click', sortDepartureByHiddenCol);			
		Event.observe($('duration_departure'),'click', sortDepartureByHiddenCol);			

		departuresContentDisplayed();
		
		departureFilterResults(departureDepartureOffset, departureArrivalOffset, true);
	}

	if (returnResultTable) {
		$$('.returnFlight').each(function(row){
			row.observe('click', function(event) {
				returnShowLeg(row.id);
			})
		})

		$$('.returnLegClose').each(function(button){
			button.observe('click', function(event) {
				returnCloseOpenFlights();
			})
		})

		//TableKit.Sortable.sort(returnResultTable, 'duration_return_sort');
		//sortByHiddenCol('duration_return', $('returnResultsTable')); 
		
		Event.observe($('departureTime_return'),'click', sortReturnByHiddenCol);			
		Event.observe($('arrivalTime_return'),'click', sortReturnByHiddenCol);			
		Event.observe($('duration_return'),'click', sortReturnByHiddenCol);			

		//Cant build the slider at this pojnt in time coz the returns tab isnt rendered so the slider cant get the right length - need to do it when the return tab is activated - handled in returnsContentDisplayed()  
		
		returnFilterResults(returnDepartureOffset, returnArrivalOffset, true);

	}

	var minDate = new Date() - 1;

	//Departure date calendar setup
	timeTableDepartureDate = Calendar.setup (
		{
			inputField		:	"departDate",      				 
			trigger			:	"departDateButton",
			min				:	Calendar.dateToInt(new Date()),
			date			:	Calendar.dateToInt(new Date()),
			checkRange		:	true,
			bottomBar		: 	false,
			dateFormat		:	"%d/%m/%Y",
			onSelect		:	function() {
				timeTableReturnDate.args.min = Calendar.intToDate(this.selection.get());
				timeTableReturnDate.args.date = Calendar.intToDate(this.selection.get());
				timeTableReturnDate.redraw();
				timeTableReturnDate.moveTo(Calendar.intToDate(this.selection.get()));
				this.hide();
			}
		}
	);
	
	
	//Return date calendar setup
	timeTableReturnDate = Calendar.setup (
		{
			inputField		:	"returnDate",      				 
			trigger			:	"returnDateButton",   					  
			min				:	Calendar.dateToInt(new Date()),
//			date			:	Calendar.dateToInt(new Date()),
			bottomBar		: 	false,
			dateFormat		:	"%d/%m/%Y",
			checkRange		:	true,
			onSelect		:	function() {
				this.hide();
			}
		}
	);
}


function departureOnChange(handleValues) {
	departureDepartureOffset = handleValues[0];
	departureArrivalOffset = handleValues[1];
	
	departureFilterResults(departureDepartureOffset, departureArrivalOffset, true);
}

function departureOnSlide(handleValues) {
	var departureDepartureOffset = handleValues[0];
	var departureArrivalOffset = handleValues[1];
	
	departureFilterResults(departureDepartureOffset, departureArrivalOffset, false);
}

function returnOnChange(handleValues) {
	returnDepartureOffset = handleValues[0];
	returnArrivalOffset = handleValues[1];
	
	returnFilterResults(returnDepartureOffset, returnArrivalOffset, true);
}

function returnOnSlide(handleValues) {
	var returnDepartureOffset = handleValues[0];
	var returnArrivalOffset = handleValues[1];

	returnFilterResults(returnDepartureOffset, returnArrivalOffset, false);
}

function updateReturnDateFields() {
	if($('isReturnFlight').checked){
		$('returnDate').disabled=false;
		$('returnDateButton').show();
	}else{
		$('returnDate').disabled=true;
		$('returnDateButton').hide();
	}
}


function setAirportFromID(text, li) {
	$('departureCodePair').value = li.id;
}

function setAirportToID(text, li) {
	$('arrivalCodePair').value = li.id;
}


function timeTableSearchValidate(theForm) {
	clearPrompts(theForm.id);

	if ($('airportFrom').value.length == 0 && $('departureCodePair').value.length == 0) {
		$('airportFrom').setAttribute('required', true)
	} else {
		$('airportFrom').setAttribute('required', false)
	}

	if ($('airportTo').value.length == 0 && $('arrivalCodePair').value.length == 0) {
		$('airportTo').setAttribute('required', true)
	} else {
		$('airportTo').setAttribute('required', false)
	}

	if ($('isReturnFlight').checked) {
		$('returnDate').setAttribute('required', true)
	} else {
		$('returnDate').setAttribute('required', false)
	}

	var errors = customValidateForm(theForm);

	if (errors.length) {
		
		$('validationError').update(errors.replace(/\n/ig,'<br>'));
		$('validationError').show();

		addPrompts(theForm.id);
		
		return false;
	} else {
		$('validationError').hide();
	} 
	
	return true
}


function showLegDetails(flightID, flightDirection) {
	var legs = $$('.' + flightID + '_leg');
	var flightDetails = $(flightID.toString());		

	if (legs.length && flightDetails) {
		for (var i=legs.length - 1; i >= 0 ; i--) {
			var leg = legs[i];
			leg.addClassName(flightDirection + 'LegOnDisplay');
			flightDetails.insert({'after' : leg});
			flightDetails.addClassName(flightDirection + 'ShowingLegDetails');
		}
	}
	
}

function departureShowLeg(flightID) {

	departureCloseOpenFlights();

	showLegDetails(flightID, 'departure');	
	
}

function returnShowLeg(flightID) {

	returnCloseOpenFlights();

	showLegDetails(flightID, 'return');	
	
}

function departureCloseOpenFlights() {
	closeOpenFlights('departure');
}

function returnCloseOpenFlights() {
	closeOpenFlights('return');
}

function closeOpenFlights(flightDirection) {
	var legs = $$('.' + flightDirection + 'LegOnDisplay');
	var flights = $$('.' + flightDirection + 'ShowingLegDetails');
	
	for (var i=0; i < legs.length ; i++) {
		var leg = legs[i];
		leg.removeClassName(flightDirection + 'LegOnDisplay');
		$(flightDirection + 'Legs').insert({'bottom' : leg});
	}
	
	flights.each(function(f){
		f.removeClassName(flightDirection + 'ShowingLegDetails');
	});	
}


function sortDepartureByHiddenCol(event, arg) {
	departureCloseOpenFlights();	
	sortByHiddenCol(this.id, $('departureResultsTable'));
}

function sortReturnByHiddenCol(event, arg) {
	returnCloseOpenFlights();
	sortByHiddenCol(this.id, $('returnResultsTable'));
}

function sortByHiddenCol(id, table) {
	var clickedColumn = $(id);
	var sortColumn = $(id + '_sort');

	if (sortColumn && clickedColumn) {
		TableKit.Sortable.sort(table, sortColumn);
		if (sortColumn.hasClassName('sortasc')) {
			clickedColumn.addClassName('sortasc');
			clickedColumn.removeClassName('sortdesc');
		} else {
			clickedColumn.removeClassName('sortasc');
			clickedColumn.addClassName('sortdesc');
		}
	}
}

function departureFilterResults(departureOffset, departureArrivalOffset, updateTable) {
	
	departureCloseOpenFlights();
	
	var departureResults = $$('.departureFlight');
	var filterDepartureDate = new Date(departureEarliestDepart.valueOf() + (3600000 * departureOffset));
	var filterArrivalDate = new Date(departureLatestArrive.valueOf() + (3600000 * (departureArrivalOffset - departureHoursRange)));
	var resultCount = 0;
	var stopsSelection = $F('departureStops');
	
	$('departureDepartureDate').update(formatDate(filterDepartureDate));
	$('departureArrivalDate').update(formatDate(filterArrivalDate));
	
	for (var i = 0; i < departureResults.length; i++) {
		var row = departureResults[i];
		var departureDate = new Date(Date.parse($('departureJSDate_' + row.id).innerHTML));
		var arrivalDate =  new Date(Date.parse($('arrivalJSDate_' + row.id).innerHTML));
		var legCount = $('legCount_' + row.id).innerHTML.valueOf();

		var displayRow = true;
		
		if (departureDate < filterDepartureDate || arrivalDate > filterArrivalDate || (stopsSelection.length > 0 && stopsSelection != legCount)) {
			displayRow = false;
		}		

		if (displayRow) {
			resultCount++;
			if (updateTable) row.show();
		} else {
			if (updateTable) row.hide();
		}		
	}

	$('departureResultCount').update(resultCount);
}

function returnFilterResults(departureOffset, arrivalOffset, updateTable) {
	
	returnCloseOpenFlights();
	
	var returnResults = $$('.returnFlight');
	var filterDepartureDate = new Date(returnEarliestDepart.valueOf() + (3600000 * departureOffset));
	var filterArrivalDate = new Date(returnLatestArrive.valueOf() + (3600000 * (arrivalOffset - returnHoursRange)));
	var resultCount = 0;
	var stopsSelection = $F('returnStops');
	
	$('returnDepartureDate').update(formatDate(filterDepartureDate));
	$('returnArrivalDate').update(formatDate(filterArrivalDate));
	
	for (var i = 0; i < returnResults.length; i++) {
		var row = returnResults[i];
		var departureDate = new Date(Date.parse($('departureJSDate_' + row.id).innerHTML));
		var arrivalDate =  new Date(Date.parse($('arrivalJSDate_' + row.id).innerHTML));
		var legCount = $('legCount_' + row.id).innerHTML.valueOf();

		var displayRow = true;
		
		if (departureDate < filterDepartureDate || arrivalDate > filterArrivalDate || (stopsSelection.length > 0 && stopsSelection != legCount)) {
			displayRow = false;
		}		

		if (displayRow) {
			resultCount++;
			if (updateTable) row.show();
		} else {
			if (updateTable) row.hide();
		}		
	}

	$('returnResultCount').update(resultCount);
}

function formatDate(date) {
	var months = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];
	var hours = date.getHours();
	var minutes = date.getMinutes();
	var day = date.getDate();
	var month = months[date.getMonth()];
	var amPm = '';
	var dateString = '';
/*
	if (hours > 11) {
		amPm = 'pm';
		if (hours > 12) {
			hours = hours % 12;
		}
	} else {
		amPm = 'am';
		if (hours == 0) {
			hours = 12;
		}
	}
*/
	dateString =  padTextNumber(hours.toString()) + ':' + padTextNumber(minutes) + amPm + ' ' + day.toString() + ' ' + month;
	
	return dateString;	
}

function padTextNumber(number) {
	var textNumber = number.toString();
	
	if (textNumber.length == 1) {
		textNumber = '0' + textNumber;
	}
	
	return textNumber;
	
}

function departuresContentDisplayed() {
	if (window.departureSlider == undefined) {
		departureSlider = new Control.Slider([$('departureHandle1'), $('departureHandle2')], 'departureTrack', {
		    range:$R(0, departureHoursRange),
		    values:$R(0, departureHoursRange),
		    step:1,
		    restricted:true,
		    sliderValue: [0, departureHoursRange],
			onChange: departureOnChange,
			onSlide: departureOnSlide
	    });			
	}
}

function returnsContentDisplayed() {
	if (window.returnSlider == undefined) {
		returnSlider = new Control.Slider([$('returnHandle1'), $('returnHandle2')], 'returnTrack', {
		    range:$R(0, returnHoursRange),
		    values:$R(0, returnHoursRange),
		    step:1,
		    restricted:true,
		    sliderValue: [0, returnHoursRange],
			onChange: returnOnChange,
			onSlide: returnOnSlide
	    });			
	}
}

