﻿var uit_ids = {
    'be': 2,
    'bg': 3,
    'de': 4,
    'de': 5,
    'ee': 6,
    'fi': 7,
    'fr': 8,
    'gr': 9,
    'gb': 10,
    'hu': 11,
    'ie': 12,
    'it': 13,
    'hr': 14,
    'lv': 15,
    'lt': 16,
    'po': 19,
    'lu': 20,
    'nl': 21,
    'no': 22,
    'at': 23,
    'pt': 24,
    'ro': 25,
    'rs': 26,
    'si': 27,
    'sk': 28,
    'es': 29,
    'cz': 30,
    'tr': 31,
    'se': 32,
    'ch': 33,
    'mt': 34,
    'cy': 35,
    'al': 36,
    'ba': 37,
    'mk': 38,
    'md': 39,
    'ua': 40,
    'ru': 41
};

var routeplanner = {

    map: null,
    gdir: null,
    geocoder: null,
    addressMarker: null,
    locale: null,
    endLocation: null,
    hotelsLoaded: false,

    initialize: function (locale) {
        if (GBrowserIsCompatible()) {
            this.locale = locale != undefined ? locale : 'nl_BE';
            this.geocoder = new GClientGeocoder();
            this.geocoder.setBaseCountryCode('be');
            this.geocoder.locale = this.locale;
            this.initMapsControls();
        }
    },

    initMaps: function () {
        if (this.map == null) {
            $('#maps-result').show();
            this.map = new GMap2(document.getElementById("maps-canvas"));
            this.gdir = new GDirections(this.map, document.getElementById("maps-directions"));
            GEvent.addListener(this.gdir, "addoverlay", this.onGDirectionsLoad);
            GEvent.addListener(this.gdir, "error", this.handleErrors);
            this.map.addControl(new GSmallMapControl());
            this.map.addControl(new GMapTypeControl());
        }
    },

    initMapsControls: function () {

        // JQuery ref naar maps-controls div
        var $mc = $('#maps-locations');

        // bij het klikken van de tussenstop toevoegen knop
        // kopieren we de verborgen tussenstop div en 
        // plaatsen deze onder de div waaruit geklikt wordt
        $mc.find('.maps-btn-tussenstop').live('click', function () {
            var $location = $(this).closest('.maps-location');
            var $clone = $('.maps-tmp-tussenstop').clone();
            $clone.removeClass('maps-tmp-tussenstop');
            $clone.addClass('maps-tussenstop');
            $clone.show();
            $location.after($clone);
            var $input = $clone.find('input').focus();

            $input.keyup(routeplanner.onKeyUpLocation);

            $input.change(routeplanner.onChangeLocation);
        });

        // verwijderen de tussenstop div rond de verwijder knop
        $mc.find('.maps-btn-tussenstop-verwijderen').live('click', function () {
            $(this).closest('.maps-tussenstop').remove();
            routeplanner.showDirections();
        });

        // het klikken van berekenen opvangen
        $('#maps-bereken').click(function () {
            routeplanner.endLocation = $('.maps-location:visible input').last().val();
            routeplanner.hideError();
            $('#lijnRouteplanner').hide();
            $('#maps-result').show();
            $('#maps-accor-hotels').show();
            $('#maps-weather').show();
            $('#print').show();
            $('#maps-accor-hotels .wrap').empty();
            routeplanner.initMaps();
            routeplanner.map.clearOverlays();
            routeplanner.showDirections();
        });

        // eerste veld focus geven bij laden pagina
        $('#maps-locations input:first').focus();

        // bij het wijzigen worden suggesties opgehaald
        $('#maps-locations input').keyup(routeplanner.onKeyUpLocation);
        $('#maps-locations input').change(routeplanner.onChangeLocation);

        $('.maps-suggestion').live('click', function () {
            var $a = $(this)
            var address = $a.html();
            var placemark = $a.data('placemark');
            placemark.address = address;
            var $location = $a.closest('.maps-location');

            var $input = $location.find('input');
            $input.val(address);
            $input.data('placemark', placemark);
            var $suggest = $location.find('.maps-suggestions');
            $suggest.empty();
        });

        $('#maps-wayback').click(function () {
            var locations = $('.maps-location:visible input').map(function () { return this.value; });

            $('.maps-location:visible input').each(function (i, obj) {
                $(obj).val(locations[locations.length - i - 1]);
            });

            $('#maps-bereken').click();
        });

        $('#maps-nieuwe-route').click(function () {
            location.reload(true);
        });

    },

    showDirections: function () {
        var directions = routeplanner.getDirectionsString();
        var avoidHighways = routeplanner.getAvoidHighways();
        var avoidToll = routeplanner.getAvoidToll();

        this.gdir.load(directions, { "locale": this.locale,
            "avoidHighways": avoidHighways,
            "avoidToll": avoidToll
        });
    },

    setPrintUrl: function (zoomLevel) {

        var dir = '';

        $('.maps-location:visible input').each(function (i) {
            var value = $(this).val();
            if (value == '') return;
            if (i == 0) dir += '&saddr=' + encodeURI(value) + '&daddr=';
            else {
                if (i > 1) dir += '+to:';
                dir += encodeURI(value);
            }
        });

        var maps_url;
        if (routeplanner.locale == 'nl_BE')
            maps_url = 'http://maps.google.be/maps?f=d&source=s_d' + dir + '&hl=nl&ie=UTF-8&pw=2&t=h&z=' + zoomLevel;
        else
            maps_url = 'http://maps.google.be/maps?f=d&source=s_d' + dir + '&hl=fr&ie=UTF-8&pw=2&t=h&z=' + zoomLevel;
        document.getElementById('print').getElementsByTagName('a')[0].href = maps_url;
        document.getElementById('print').getElementsByTagName('a')[0].target = "_blank";
    },

    loadAccordHotels: function () {
        var taal = 'NL'
        if (routeplanner.locale != 'nl_BE')
            taal = 'FR'

        var endPoint = routeplanner.gdir.getRoute(routeplanner.gdir.getNumGeocodes() - 2).getEndLatLng();
        var searchUrl = '../../../WebHandlers/AccorHotels.ashx?latitude=' + endPoint.lat() + '&longitude=' + endPoint.lng() + '&distance=10&lang=' + taal;

        GDownloadUrl(searchUrl, function (data) {

            var xml = GXml.parse(data);
            var markers = xml.documentElement.getElementsByTagName('marker');
            var icon = routeplanner.getIcon();

            $('#maps-accor-hotels .empty').css('display', markers.length > 0 ? 'none' : 'block');

            for (var i = 0; i < markers.length; i++) {

                var $marker = $(markers[i]);

                var name = $marker.find('name').text();
                var address = $marker.find('address').text();
                var point = new GLatLng(parseFloat($marker.find('lat').text()), parseFloat($marker.find('lng').text()));
                var imageUrl = $marker.find('imageUrl').text();
                var beschrijving = $marker.find('beschrijving').text();
                var bookingUrl = $marker.find('bookingUrl').text();
                var distance = $marker.find('distance').text();

                var html = routeplanner.getAccorHtml(name, address, bookingUrl, imageUrl, beschrijving, distance);
                if (i < 5) $('#maps-accor-hotels .wrap').append(html);

                var marker = routeplanner.createMarker(point, icon, html);

                routeplanner.map.addOverlay(marker);
            }
        });
    },

    loadUitMagazines: function () {
        var land_code = routeplanner.gdir.getRoute(0).getEndGeocode().AddressDetails.Country.CountryNameCode.toLowerCase();
        if (uit_ids[land_code] != undefined) {
            $('#uit-frame').attr('src', 'uit.aspx?id=' + uit_ids[land_code]);
        }
        else {
            $('#uit-frame').attr('src', 'uit.aspx');
        }
    },

    loadWeather: function () {

        var count = routeplanner.gdir.getNumGeocodes();
        var address;
        var city;
        var country;
        routeplanner.geocoder.getLocations(routeplanner.endLocation, function (theResponse) {
            address = theResponse.Placemark[0].AddressDetails;
            if (address.Country.AdministrativeArea != undefined) {
                if (address.Country.AdministrativeArea.SubAdministrativeArea != undefined) {
                    if (address.Country.AdministrativeArea.SubAdministrativeArea.Locality != undefined)
                        city = address.Country.AdministrativeArea.SubAdministrativeArea.Locality.LocalityName;
                    else
                        city = address.Country.AdministrativeArea.SubAdministrativeArea.SubAdministrativeAreaName;
                }
                else if (address.Country.AdministrativeArea.Locality != undefined) {
                    city = address.Country.AdministrativeArea.Locality.LocalityName;
                }
                else {
                    city = address.Country.AdministrativeArea.AdministrativeAreaName;
                }
            }
            else if (address.Country.SubAdministrativeArea != undefined) {
                city = address.Country.SubAdministrativeArea.Locality.LocalityName;
            }
            else if (address.Country.Locality != undefined) {
                city = address.Country.Locality.LocalityName;
            }
            else {
                city = address.Country.CountryName;
            }
            country = address.Country.CountryName;

            var req_string;

            if (city == country) {
                req_string = country;
                $('#maps-accor-hotels').hide();
                $('#maps-weather').hide();
            }
            else {
                req_string = city + ', ' + country;
            }


            // set the weather page
            if (document.getElementById('hidJetair').value == "True")
                var weather_url = '../weather.aspx?location=' + encodeURI(req_string) + '&lang=' + this.locale;
            else
                var weather_url = 'weather.aspx?location=' + encodeURI(req_string) + '&lang=' + this.locale;

            $('#weather-frame').attr('src', weather_url);
        });
    },

    createMarker: function (point, icon, html) {

        var marker = new GMarker(point, icon);

        GEvent.addListener(marker, 'click', function () {
            marker.openInfoWindowHtml(html, { maxWidth: 200 });
        });
        return marker;
    },

    getAccorHtml: function (name, address, bookingUrl, imageUrl, beschrijving, distance) {
        // start div
        var html = '<div class="accor-hotel-info">';
        // de hotel afbeelding
        html += '<img height="50" style="float:right;"src="' + imageUrl + '"/>';
        // titel link en adres
        html += '<b><a target="_blank" href="' + bookingUrl + '">' + name + '</a></b><br/>' + address + ' (' + Math.round(distance.replace(',', '.') * 100) / 100 + 'km)';
        // beschrijving
        html += '<p>' + beschrijving + '</p>';
        // einde div
        html += '</div>';

        return html;
    },

    getIcon: function () {
        var icon = new GIcon();
        icon.image = '../../../Layout/Routeplanner/accor-icon.png';
        icon.iconSize = new GSize(28, 22);
        icon.iconAnchor = new GPoint(10, 21);
        icon.infoWindowAnchor = new GPoint(20, 32);
        return icon;
    },

    onGDirectionsLoad: function () {

        // set the zoom level on the print page
        routeplanner.setPrintUrl(routeplanner.map.getZoom());

        // load the weather card
        if (document.getElementById('hidWeather').value == "True") {
            routeplanner.loadWeather();
        }

        // load Accorhotels
        if (document.getElementById('hidHotels').value == "True") {
            routeplanner.loadAccordHotels();
        }

        // load Uit-Magazine articles
        if (document.getElementById('hidUit').value == "True") {
            routeplanner.loadUitMagazines();
        }

        $('#maps-wayback').show();
        $('#maps-nieuwe-route').show();
    },

    getDirectionsString: function () {
        var dir = '';
        $('.maps-location:visible input').each(function (i) {
            var value = $(this).val();
            if (value == '') return;
            if (i == 0) dir += 'from: ' + value;
            else dir += ' to: ' + value;
        });
        return dir;
    },

    getAvoidHighways: function () {
        return $('#maps-avoid-highways').is(':checked');
    },

    getAvoidToll: function () {
        return $('#maps-avoid-toll').is(':checked');
    },

    validateDestinations: function () {

        $('.maps-location:visible input').each(function () {
            routeplanner.isValidDestination($(this));
        });

    },

    onKeyUpLocation: function () {
        var input = this;
        clearTimeout($.data(this, 'timer'));
        var wait = setTimeout(function () { routeplanner.onChangeLocation(input) }, 1000);
        $(this).data('timer', wait);
    },

    onChangeLocation: function (input) {

        var $input = $(input);
        var $location = $input.closest('.maps-location');
        var $suggest = $location.find('.maps-suggestions');

        //if ($input.attr('tabindex') == 1) $input.val($input.val() + ', Belgie');

        $suggest.empty();
        routeplanner.geocoder.getLocations($input.val(), function (response) {
            if (response.Placemark != undefined) {
                $input.data('placemark', response.Placemark[0]);
                $input.removeClass('invalid');
                $input.addClass('valid');
                $.each(response.Placemark, function () {
                    $suggest.append('<a href="javascript:void(0)" class="maps-suggestion">' + this.address + '</a><br/>');
                    $suggest.find('.maps-suggestion').data('placemark', this);
                });
            } else {
                $input.removeClass('valid');
                $input.addClass('invalid');
                if (routeplanner.locale == 'nl_BE')
                    $suggest.append('Geen geldige locatie.');
                else
                    $suggest.append('Pas de localisation valable');
            }
        });
    },

    handleErrors: function () {
        if (routeplanner.gdir.getStatus().code == G_GEO_UNKNOWN_ADDRESS) {
            if (routeplanner.locale == "nl_BE")
                routeplanner.showError("Geen geldige locatie gevonden op basis van het opgegeven adres. Probeer met meer of minder zoektermen.");
            else
                routeplanner.showError("Aucune localisation valable n'a pu être trouvée sur base de l'adresse introduite. Réessayez avec plus ou moins de termes.");
        }
        //alert("No corresponding geographic location could be found for one of the specified addresses. This may be due to the fact that the address is relatively new, or it may be incorrect.\nError code: " + routeplanner.gdir.getStatus().code);
        else if (routeplanner.gdir.getStatus().code == G_GEO_SERVER_ERROR) {
            if (routeplanner.locale == 'nl_BE')
                routeplanner.showError("Ongeldige parameter.");
            else
                routeplanner.showError("Geen geldige locatie gevonden op basis van het opgegeven adres. Probeer met meer of minder zoektermen.");
        }
        //alert("A geocoding or directions request could not be successfully processed, yet the exact reason for the failure is not known.\n Error code: " + routeplanner.gdir.getStatus().code);
        else if (routeplanner.gdir.getStatus().code == G_GEO_MISSING_QUERY) {
            if (routeplanner.locale == 'nl_BE')
                routeplanner.showError("Ongeldige parameter.");
            else
                routeplanner.showError("Paramètre invalide");
        }
        //alert("The HTTP q parameter was either missing or had no value. For geocoder requests, this means that an empty address was specified as input. For directions requests, routeplanner means that no query was specified in the input.\n Error code: " + routeplanner.gdir.getStatus().code);
        else if (routeplanner.gdir.getStatus().code == G_GEO_BAD_KEY) {
            if (routeplanner.locale == 'nl_BE')
                routeplanner.showError("Ongeldige parameter.");
            else
                routeplanner.showError("Paramètre invalide");
        }
        //alert("The given key is either invalid or does not match the domain for which it was given. \n Error code: " + routeplanner.gdir.getStatus().code);
        else if (routeplanner.gdir.getStatus().code == G_GEO_BAD_REQUEST) {
            if (routeplanner.locale == 'nl_BE')
                routeplanner.showError("Ongeldige parameter.");
            else
                routeplanner.showError("Paramètre invalide");
        }
        //alert("A directions request could not be successfully parsed.\n Error code: " + routeplanner.gdir.getStatus().code);
        else {
            //routeplanner.showError("Er deed zich een ongekende error voor.");
            if (routeplanner.locale == 'nl_BE')
                routeplanner.showError("De routeplanner was niet in staat een route te berekenen. Gelieve opnieuw te proberen met andere locaties.");
            else
                routeplanner.showError("L'itinéraire ne peut pas être calculé. Essayez de nouveau avec un autre endroit.");
            //alert("An unknown error occurred.");
        }
    },

    showError: function (message) {
        $('#maps-error').show().html(message);
        $('#maps-result').hide();
        $('#maps-accor-hotels').hide();
        $('#maps-weather').hide();
        $('#print').hide();
    },

    hideError: function () {
        $('#maps-error').hide();
    }
}
