﻿/// <reference path="http://ajax.microsoft.com/ajax/jquery/jquery-1.4.2.js" />
(function ($, undefined) {

    window.setupTimetable = function (departureselector, arrivalselector, airports, citypairs) {
        var airportlookup = {};
        for (var i = 0; i < airports.length; i++) {
            var airport = airports[i];
            airportlookup[airport.iata] = airport;
        }
        var allorigins = [];
        var alldestinations = [];
        var urls = {};

        for (var i = 0; i < citypairs.length; i++) {
            var citypair = citypairs[i];
            var origin = airportlookup[citypair.from];
            var destination = airportlookup[citypair.to];
            if (destination !== undefined && origin !== undefined) {
                var destinations = origin.destinations;
                if (destinations === undefined) {
                    destinations = origin.destinations = [];
                }
                destinations.push(citypair.to);

                var origins = destination.origins;
                if (origins === undefined) {
                    origins = destination.origins = [];
                }
                origins.push(citypair.from);

                if (!origin.visitedorigin) {
                    origin.visitedorigin = true;
                    allorigins.push(origin.iata);
                }
                if (!destination.visiteddestination) {
                    destination.visiteddestination = true;
                    alldestinations.push(destination.iata);
                }
                urls[origin.iata + destination.iata] = citypair.url;
            }
        }

        function comparebyiata(iata1, iata2) {
            var x = airportlookup[iata1];
            var y = airportlookup[iata2];
            var r = (y.name < x.name) - (x.name < y.name);
            return r ? r: (y.country < x.country) - (x.country < y.country);
        }

        allorigins.sort(comparebyiata);
        alldestinations.sort(comparebyiata);

        for (var i = 0; i < airports.length; i++) {
            var airport = airports[i];
            if (airport.destinations) airport.destinations.sort(comparebyiata);
            if (airport.origins) airport.origins.sort(comparebyiata);
        }

        var departureText = $(departureselector)[0].innerHTML;
        var arrivalText = $(arrivalselector)[0].innerHTML;

        function setupSelect(selector, firstoption, values, defaultvalue) {

            var str = [];
            str.push(firstoption);
            for (var i = 0; i < values.length; i++) {
                var airport = airportlookup[values[i]];
                str.push("<option value='");
                str.push(airport.iata);
                str.push("'");
                if (defaultvalue === airport.iata) {
                    str.push(" selected='selected'");
                }
                str.push(">");
                str.push(airport.name);
                str.push(", ");
                str.push(airport.country);
                str.push("</option>");
            }

            $(selector).empty().append(str.join(""));
        }


        var defaultFrom = $.cookie("timetable_from");
        var defaultTo /*= $.cookie("timetable_to")*/;

        setupSelect(departureselector, departureText, defaultTo ? airportlookup[defaultTo].origins : allorigins, defaultFrom);
        setupSelect(arrivalselector, arrivalText, defaultFrom ? airportlookup[defaultFrom].destinations : alldestinations, defaultTo);

        function onchange(selector, firstoption, values, defaultvalue) {
            var from = $(departureselector + " :selected").val();
            var to = $(arrivalselector + " :selected").val();
            var url = urls[from + to];
            if (url !== undefined) {
                $.cookie("timetable_from", from);
                //$.cookie("timetable_to", to);
                window.location.href = url;
            } else {
                setupSelect(selector, firstoption, values, defaultvalue);
            }
        }

        $(departureselector).change(function () {
            var selected = $(departureselector + " :selected").val();
            onchange(arrivalselector, arrivalText, selected == 0 ? alldestinations : airportlookup[selected].destinations, $(arrivalselector + " :selected").val());
        });
        $(arrivalselector).change(function () {
            var selected = $(arrivalselector + " :selected").val();
            onchange(departureselector, departureText, selected == 0 ? allorigins : airportlookup[selected].origins, $(departureselector + " :selected").val());
        });
    }
})(jQuery);

