﻿/* ----- Helper functions -----*/

function getQuerystring(key, default_) {
    if (default_ == null) default_ = "";
    key = key.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
    var regex = new RegExp("[\\?&]" + key + "=([^&#]*)");
    var qs = regex.exec(window.location.href);
    if (qs == null)
        return default_;
    else
        return qs[1];
}

/*-----------------------------*/
/*-------- Map Handler --------*/
/*-----------------------------*/
var mapHandler = (function() {
    var map;
    var mgr;
    var gdir;
    var lastlinkid;
    var companyMarkers = [];
    var brandMarkers = [];
    var unsortedBrandMarkers = [];
    var side_bar_html;
    var side_bar_html_brands;

    var mapDataDealers;

    // Constants
    var iconPath = '/Templates/GMaps/Images/';
    var hlcolor = '#dddddd';
    var bgcolor = 'transparent';

    /*-------- Icons --------*/
    var normIcon = new GIcon();
    normIcon.image = iconPath + 'marker_norm/image.png';
    normIcon.shadow = iconPath + 'marker_norm/shadow.png';
    normIcon.iconSize = new GSize(17, 31);
    normIcon.shadowSize = new GSize(33, 31);
    normIcon.iconAnchor = new GPoint(9, 31);
    normIcon.infoWindowAnchor = new GPoint(9, 0);
    normIcon.printImage = iconPath + 'marker_norm/printImage.gif';
    normIcon.mozPrintImage = iconPath + 'marker_norm/mozPrintImage.gif';
    normIcon.printShadow = iconPath + 'marker_norm/printShadow.gif';
    normIcon.transparent = iconPath + 'marker_norm/transparent.png';
    normIcon.imageMap = [12, 0, 14, 1, 15, 2, 16, 3, 16, 4, 16, 5, 16, 6, 16, 7, 16, 8, 16, 9, 16, 10, 16, 11, 16, 12, 16, 13, 16, 14, 15, 15, 14, 16, 12, 17, 10, 18, 9, 19, 8, 20, 8, 21, 8, 22, 8, 23, 7, 24, 7, 25, 7, 26, 7, 27, 7, 28, 7, 29, 6, 29, 6, 28, 6, 27, 6, 26, 6, 25, 6, 24, 6, 23, 6, 22, 6, 21, 6, 20, 6, 19, 6, 18, 4, 17, 3, 16, 1, 15, 1, 14, 0, 13, 0, 12, 0, 11, 0, 10, 0, 9, 0, 8, 0, 7, 0, 6, 0, 5, 0, 4, 1, 3, 1, 2, 2, 1, 4, 0];

    // Get Europcar Icon
    function getEBUIcon(shadow) {
        var euroIcon2 = new GIcon();
        euroIcon2.image = iconPath + 'marker_euro2/image.png';
        if (shadow == true) {
            euroIcon2.shadow = iconPath + 'marker_euro2/shadow.png';
        }
        else {
            euroIcon2.shadow = '';
        }
        euroIcon2.iconSize = new GSize(63, 37);
        euroIcon2.shadowSize = new GSize(82, 37);
        euroIcon2.iconAnchor = new GPoint(0, 37);
        euroIcon2.infoWindowAnchor = new GPoint(32, 0);
        euroIcon2.printImage = iconPath + 'marker_euro2/printImage.gif';
        euroIcon2.mozPrintImage = iconPath + 'marker_euro2/mozPrintImage.gif';
        euroIcon2.printShadow = iconPath + 'marker_euro2/printShadow.gif';
        euroIcon2.transparent = iconPath + 'marker_euro2/transparent.png';
        euroIcon2.imageMap = [62, 0, 62, 1, 62, 2, 62, 3, 62, 4, 62, 5, 62, 6, 62, 7, 62, 8, 62, 9, 62, 10, 62, 11, 62, 12, 62, 13, 62, 14, 62, 15, 62, 16, 3, 17, 3, 18, 3, 19, 3, 20, 3, 21, 3, 22, 3, 23, 3, 24, 3, 25, 3, 26, 3, 27, 3, 28, 5, 29, 6, 30, 6, 31, 6, 32, 6, 33, 6, 34, 5, 35, 5, 36, 2, 36, 1, 35, 0, 34, 0, 33, 0, 32, 0, 31, 0, 30, 1, 29, 3, 28, 3, 27, 3, 26, 3, 25, 3, 24, 3, 23, 3, 22, 3, 21, 3, 20, 3, 19, 3, 18, 3, 17, 3, 16, 3, 15, 3, 14, 3, 13, 3, 12, 3, 11, 3, 10, 3, 9, 3, 8, 3, 7, 3, 6, 3, 5, 3, 4, 3, 3, 3, 2, 3, 1, 3, 0];
        return euroIcon2;
    }

    // Get BrandIcons
    function getBrandIcon(brand, shadow) {
        var icon = new GIcon(G_DEFAULT_ICON);
        if (brand == "N") {
            icon.iconSize = new GSize(23, 31);
            icon.image = iconPath + brand + '.png';
        }
        else if (brand == "P") {
            icon.iconSize = new GSize(26, 22);
            icon.image = iconPath + brand + '2.png';
        }
        else {
            icon.iconSize = new GSize(23, 22);
            icon.image = iconPath + brand + '.png';
        }

        icon.printImage = iconPath + 'marker_brand/printImage.gif';
        icon.mozPrintImage = iconPath + 'marker_brand/mozPrintImage.gif';
        if (shadow == true) {
            icon.shadow = iconPath + 'marker_brand/noshadow.png';
        } else {
            icon.shadow = '';
        }
        icon.transparent = iconPath + 'marker_brand/transparent.png';
        icon.shadowSize = new GSize(44, 42);
        icon.printShadow = iconPath + 'marker_brand/printShadow.gif';
        icon.iconAnchor = new GPoint(12, 42);

        icon.infoWindowAnchor = new GPoint(12, 0);
        icon.imageMap = [15, 0, 17, 1, 18, 2, 19, 3, 20, 4, 20, 5, 21, 6, 21, 7, 22, 8, 22, 9, 22, 10, 22, 11, 22, 12, 22, 13, 22, 14, 21, 15, 21, 16, 20, 17, 20, 18, 19, 19, 18, 20, 16, 21, 12, 22, 12, 23, 12, 24, 12, 25, 12, 26, 12, 27, 12, 28, 12, 29, 12, 30, 12, 31, 12, 32, 12, 33, 13, 34, 14, 35, 15, 36, 15, 37, 15, 38, 14, 39, 13, 40, 12, 41, 10, 41, 9, 40, 8, 39, 8, 38, 7, 37, 8, 36, 8, 35, 9, 34, 10, 33, 10, 32, 10, 31, 10, 30, 10, 29, 10, 28, 10, 27, 10, 26, 10, 25, 10, 24, 10, 23, 10, 22, 6, 21, 4, 20, 3, 19, 2, 18, 1, 17, 1, 16, 0, 15, 0, 14, 0, 13, 0, 12, 0, 11, 0, 10, 0, 9, 0, 8, 0, 7, 1, 6, 1, 5, 2, 4, 3, 3, 4, 2, 5, 1, 7, 0];
        return icon;
    }

    /*-------- Markers --------*/
    function getDealerMarkers(jsonUrl) {
        // Read json objects and set to global variable mapDataDealers
        $.ajax({
            type: "GET",
            url: jsonUrl,
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function(json) {
                mapDataDealers = json;
                $("#loading_message").hide();
                if (typeof onInitSuccess == 'function') {
                    onInitSuccess();
                }
            }
        });
    }

    function resetMarker(currMarker) {
        if (currMarker.my_clickToken) {
            GEvent.removeListener(currMarker.my_clickToken);
            delete currMarker.my_clickToken;
        }
        if (currMarker.my_mouseovertoken) {
            GEvent.removeListener(currMarker.my_mouseovertoken);
            delete currMarker.my_mouseovertoken;
        }
        if (currMarker.my_mouseouttoken) {
            GEvent.removeListener(currMarker.my_mouseouttoken);
            delete currMarker.my_mouseouttoken;
        }
    }



    /*-------- Brand Markers --------*/
    function sortBrandMarkers(a, b) {
        return a.order - b.order;
    }

    function pushBrandMarker(currMarker, position) {
        var markerExists = false;
        var brandExists = false;
        var brandMarkerIndex = 0;
        var point;
        var numberOfPoints = 0;
        var leftMenuIcon = "";

        for (var j = 0; j < brandMarkers.length; j++) {
            var iteratingMarker = brandMarkers[j];
            var currentLat = parseFloat(currMarker.lat);
            var currentLng = parseFloat(currMarker.lng);
            var iteratingLat = parseFloat(iteratingMarker.lat);
            var iteratingLng = parseFloat(iteratingMarker.lng);
            if (currentLat.toFixed(5) == iteratingLat.toFixed(5) && currentLng.toFixed(5) == iteratingLng.toFixed(5)) {
                markerExists = true;
                numberOfPoints += 1;
                if (currMarker.brnd == iteratingMarker.my_brand && currMarker.brnd != "EBU") {
                    brandExists = true;
                    brandMarkerIndex = j;
                }
            }
        }

        if (currMarker.type == "ÅF") {
            leftMenuIcon = '<br /><img src="' + iconPath + 'sales_icon.png" alt="Återförsäljare" />';
        }
        else if (currMarker.type == "VERKSTAD") {
            leftMenuIcon = '<br /><img src="' + iconPath + 'service_icon.png" alt="Verkstad" />';
        }

        if (brandExists == true) {
            var dealerName = (currMarker.name.length > 0) ? currMarker.name : currMarker.dname;
            var dealerUrl = (currMarker.url.length > 0) ? currMarker.url : currMarker.durl;
            var my_html = (currMarker.addr.length > 0) ? currMarker.addr : currMarker.daddr + '<br />';
            my_html += (currMarker.city.length > 0) ? currMarker.city : currMarker.dcity + '<br />';
            my_html += (currMarker.phn.length > 0) ? currMarker.phn : currMarker.dphn + '<br />';
            my_html += '<a href="http://' + dealerUrl +'" target="_blank">';
            my_html += dealerUrl + '</a>' + '<br /><a href="javascript:sidebarHandler.toggleRoadGuide()">Vägbeskrivning<\/a>';
            side_bar_html_brands += '<div id="link' + ((brandMarkerIndex * 1) + 1) + '"><a class="heading" href="javascript:mapHandler.brandMarkerClick(' + brandMarkerIndex + ')">' + dealerName + '<\/a><br />' + my_html + leftMenuIcon + '<\/div>';
        }
        else {

            if (markerExists == true) {
                var newLng = parseFloat(currMarker.lng);
                newLng = newLng + (0.0003 * numberOfPoints);
                newLng = newLng.toFixed(5);
                point = new GLatLng(parseFloat(currMarker.lat), newLng);
            }
            else {
                point = new GLatLng(parseFloat(currMarker.lat), parseFloat(currMarker.lng));
            }

            var marker;
            if (currMarker.brnd == 'EBU') {
                if (position == 0 || (position > 0 && markerExists == false)) {
                    marker = new GMarker(point, getEBUIcon(true));
                }
                else {
                    marker = new GMarker(point, getEBUIcon(false));
                }

            }
            else {

                if (position == 0 || (position > 0 && markerExists == false)) {
                    marker = new GMarker(point, getBrandIcon(currMarker.brnd, true)); //gicons[currMarker.brand]);
                }
                else {
                    marker = new GMarker(point, getBrandIcon(currMarker.brnd, false)); //gicons[currMarker.brand]);
                }
            }
            var dealerName = (currMarker.name.length > 0) ? currMarker.name : currMarker.dname;
            var dealerCity = (currMarker.city.length > 0) ? currMarker.city : currMarker.dcity;
            var dealerUrl = (currMarker.url.length > 0) ? currMarker.url : currMarker.durl;
            var my_html = (currMarker.addr.length > 0) ? currMarker.addr : currMarker.daddr + '<br />';
            my_html += dealerCity + '<br />';
            my_html += (currMarker.phn.length > 0) ? currMarker.phn : currMarker.dphn + '<br />';
            my_html += '<a href="http://' + dealerUrl + '" target="_blank">';
            my_html += dealerUrl + '</a>' + '<br /><a href="javascript:sidebarHandler.toggleRoadGuide()">Vägbeskrivning<\/a>';

            marker.my_name = dealerName + ', ' + dealerCity;
            marker.my_type = currMarker.type;
            marker.my_brand = currMarker.brnd;
            marker.lat = currMarker.lat;
            marker.lng = currMarker.lng;
            marker.linkid = '#link' + (brandMarkers.length * 10);

            side_bar_html_brands += '<div id="link' + (brandMarkers.length * 10) + '"><a class="heading" href="javascript:mapHandler.brandMarkerClick(' + brandMarkers.length + ')">' + dealerName + '<\/a><br />' + my_html + leftMenuIcon + '<\/div>';

            addBrandMarkerClickHandler(marker, dealerName + ', ' + dealerCity + '<br /><a href="javascript:sidebarHandler.toggleRoadGuide()">Vägbeskrivning<\/a>');
            brandMarkers.push(marker);
        }
    }

    // Clickfunkction for brand markers markers
    function addBrandMarkerClickHandler(marker, my_html) {
        marker.my_clickToken = GEvent.addListener(marker, "click",
	    function() {
	        var iwAnchor = marker.getIcon().infoWindowAnchor;
	        var iconAnchor = marker.getIcon().iconAnchor;
	        var offset = new GSize(iwAnchor.x - iconAnchor.x, iwAnchor.y - iconAnchor.y);
	        map.openInfoWindow(marker.getLatLng(), my_html, { pixelOffset: offset });
	        $(marker.linkid).css('background-color', hlcolor);
	        var linkId = (marker.linkid.substr(5, 1) * 1) + 1;
	        if ($("#link" + linkId) != null) {
	            $('#link' + linkId).css('background-color', hlcolor);
	        }
	        lastlinkid = marker.linkid;
	        sidebarHandler.dynamicScroll(marker.linkid);
	        sidebarHandler.setToAddress(marker.my_name + '@' + marker.lat + ',' + marker.lng);
	    });

        marker.my_mouseovertoken = GEvent.addListener(marker, "mouseover", function() {
            var linkId = 0;
            if (lastlinkid.length > 0) {
                linkId = (lastlinkid.substr(5, 1) * 1) + 1;
                $(lastlinkid).css('background-color', bgcolor);
                if ($("#link" + linkId) != null) {
                    $('#link' + linkId).css('background-color', bgcolor);
                }
            }
            $(marker.linkid).css('background-color', hlcolor);
            linkId = (marker.linkid.substr(5, 1) * 1) + 1;
            if ($("#link" + linkId) != null) {
                $('#link' + linkId).css('background-color', hlcolor);
            }
            lastlinkid = marker.linkid;
            sidebarHandler.dynamicScroll(marker.linkid);
        });

        marker.my_mouseouttoken = GEvent.addListener(marker, "mouseout", function() {
            var linkId = 0;
            if (lastlinkid.length > 0) {
                linkId += (lastlinkid.substr(5, 1) * 1) + 1;
                if ($("#link" + linkId) != null) {
                    $('#link' + linkId).css('background-color', bgcolor);
                }
                $(lastlinkid).css('background-color', bgcolor);
            }
        });
    }

    /*-------- Company Markers --------*/
    function pushCompanyMarker(currMarker) {
        var markerExists = false;
        var point;
        var bounds = map.getBounds();
        for (var j = 0, len = companyMarkers.length; j < len; j++) {
            var iteratingMarker = companyMarkers[j];
            if (currMarker.lat == iteratingMarker.lat && currMarker.lng == iteratingMarker.lng) {
                markerExists = true;
                break;
            }
        }
        point = new GLatLng(parseFloat(currMarker.lat), parseFloat(currMarker.lng));
        if (markerExists == false && bounds.containsLatLng(point)) {

            var marker = new GMarker(point, normIcon);
            var my_html = currMarker.daddr + '<br />' + currMarker.dcity + '<br />' + currMarker.dphn + '<br />';
            my_html += '<a href="http://' + currMarker.durl + '" target="_blank">' + currMarker.durl + '</a>' + '<br /><a href="javascript:sidebarHandler.toggleRoadGuide()">Vägbeskrivning<\/a>';
            marker.my_html = my_html;
            marker.my_name = currMarker.dname + ', ' + currMarker.dcity;
            marker.point = point;
            marker.lat = currMarker.lat;
            marker.lng = currMarker.lng;
            marker.linkid = '#link' + companyMarkers.length;
            side_bar_html += '<div id="link' + companyMarkers.length + '"><a class="heading" href="javascript:mapHandler.markerClick(' + companyMarkers.length + ')" onmouseover="javascript:mapHandler.markerHover(' + companyMarkers.length + ')" onmouseout="javascript:mapHandler.markerOut(' + companyMarkers.length + ')">' + currMarker.dname + '<\/a><br>' + my_html + '<\/div>';
            addCompanyMarkerHandlers(marker);
            companyMarkers.push(marker);
        }
    }

    // Handlers for company markers
    function addCompanyMarkerHandlers(marker) {
        marker.my_clickToken = GEvent.addListener(marker, "click",
	    function() {
	        var zoom = map.getZoom();
	        if (zoom < 7) {
	            map.setCenter(marker.point, 7);
	        }
	        else {
	            if (lastlinkid.length > 0) {
	                $(lastlinkid).css('background-color', bgcolor);
	                if (lastlinkid == marker.linkid) {
	                    var newLat = parseFloat(marker.lat);
	                    newLat = newLat + (0.00025);
	                    newLat = newLat.toFixed(7);
	                    var point = new GLatLng(parseFloat(newLat), marker.lng);
	                    sidebarHandler.setToAddress(marker.my_name + '@' + marker.lat + ',' + marker.lng);
	                    map.setCenter(point, 17);
	                }
	                else {
	                    $(marker.linkid).css('background-color', hlcolor);
	                    lastlinkid = marker.linkid;
	                    sidebarHandler.dynamicScroll(marker.linkid);
	                }
	            }
	            else {
	                $(marker.linkid).css('background-color', hlcolor);
	                lastlinkid = marker.linkid;
	                sidebarHandler.dynamicScroll(marker.linkid);
	            }
	        }
	    });

        // Switch icon on marker mouseover and mouseout
        marker.my_mouseovertoken = GEvent.addListener(marker, "mouseover", function() {
            marker.setImage(iconPath + 'marker_norm/red.png');
            if (lastlinkid.length > 0) {
                $(lastlinkid).css('background-color', bgcolor);
            }
            $(marker.linkid).css('background-color', hlcolor);
            lastlinkid = marker.linkid;
            sidebarHandler.dynamicScroll(marker.linkid);
        });

        marker.my_mouseouttoken = GEvent.addListener(marker, "mouseout", function() {
            marker.setImage(iconPath + 'marker_norm/image.png');
            if (lastlinkid.length > 0) {
                $(lastlinkid).css('background-color', bgcolor);
            }
        });
    }

    /*------------------------------*/
    /* Map Handler Public Functions */
    /*------------------------------*/
    return {
        /* Initalization of map */
        init: function(mapObj, jsonUrl) {
            try {
                if (GBrowserIsCompatible()) {
                    map = new GMap2(document.getElementById(mapObj));
                    map.addControl(new GLargeMapControl3D());

                    map.setCenter(new GLatLng(61.000000, 15.458008), 5, G_NORMAL_MAP);
                    mgr = new MarkerManager(map);
                    map.setUIToDefault();

                    map.my_closetoken = GEvent.addListener(map, "infowindowclose", function() {
                        var linkId = 0;
                        if (lastlinkid.length > 0) {
                            linkId += (lastlinkid.substr(4, 1) * 1) + 1;
                            if ($("#link" + linkId) != null) {
                                $("#link" + linkId).css('background-color', bgcolor);
                            }
                            $(lastlinkid).css('background-color', bgcolor);
                        }
                    });

                    map.my_moveendtoken = GEvent.addListener(map, "moveend", function() {
                        mapHandler.reset();
                        mapHandler.setMarkers(selectorHandler.getActiveRetailers, selectorHandler.getActiveGarages, selectorHandler.getRentState());
                        sidebarHandler.setSidebarInfo(mapHandler.getMarkerInfo());
                    });

                    // Set how far zooming out can go
                    G_PHYSICAL_MAP.getMinimumResolution = function() { return 5 };
                    G_NORMAL_MAP.getMinimumResolution = function() { return 5 };
                    G_SATELLITE_MAP.getMinimumResolution = function() { return 5 };
                    G_HYBRID_MAP.getMinimumResolution = function() { return 5 };
                    //How close.
                    G_PHYSICAL_MAP.getMaximumResolution = function() { return 17 };
                    G_NORMAL_MAP.getMaximumResolution = function() { return 17 };
                    G_SATELLITE_MAP.getMaximumResolution = function() { return 17 };
                    G_HYBRID_MAP.getMaximumResolution = function() { return 17 };
                }

                getDealerMarkers(jsonUrl);
            }
            catch (err) {
                alert(err.description);
            }
        },

        /* Initalization of GDirections */
        initDirections: function(dirObj) {
            gdir = new GDirections(map, document.getElementById(dirObj));

            var reasons = [];
            reasons[G_GEO_SUCCESS] = "Success";
            reasons[G_GEO_MISSING_ADDRESS] = "Saknar adress: Adressen saknas eller har inget värde.";
            reasons[G_GEO_UNKNOWN_ADDRESS] = "Okänd adress:  No corresponding geographic location could be found for the specified address.";
            reasons[G_GEO_UNAVAILABLE_ADDRESS] = "Unavailable Address:  The geocode for the given address cannot be returned due to legal or contractual reasons.";
            reasons[G_GEO_BAD_KEY] = "Bad Key: The API key is either invalid or does not match the domain for which it was given";
            reasons[G_GEO_TOO_MANY_QUERIES] = "Too Many Queries: The daily geocoding quota for this site has been exceeded.";
            reasons[G_GEO_SERVER_ERROR] = "Server error: The geocoding request could not be successfully processed.";
            reasons[G_GEO_BAD_REQUEST] = "A directions request could not be successfully parsed.";
            reasons[G_GEO_MISSING_QUERY] = "No query was specified in the input.";
            reasons[G_GEO_UNKNOWN_DIRECTIONS] = "The GDirections object could not compute directions between the points.";

            // === catch Directions errors ===
            GEvent.addListener(gdir, "error", function() {
                var code = gdir.getStatus().code;
                var reason = "Code " + code;
                if (reasons[code]) {
                    reason = reasons[code]
                }

                alert("Lyckades inte hämta vägbeskrivning, " + reason);
            });
        },

        getDirections: function() {
            var faddr = document.getElementById("txtFromAddress").value + ', Sverige';
            var taddr = document.getElementById("txtToAddress").value

            gdir.load("from: " + faddr + " to: " + taddr, { locale: "sv" });
        },

        setMarkers: function(activeRetailers, activeGarages, showEBU) {
            var zoom = map.getZoom();
            var bounds = map.getBounds();
            if (activeRetailers.length > 0 || activeGarages.length > 0 || showEBU == true) {

                if (!$("#road_guide_arrow").hasClass('expanded')) {
                    sidebarHandler.expandSearchResult();
                }
            }
            else {
                sidebarHandler.expandSearchHelp();
            }

            // Loop through all jason-objects
            for (var i = 0, len = mapDataDealers.length; i < len; i++) {
                var currMarker = mapDataDealers[i];

                // Check activeRetailers
                for (var r = 0, rLen = activeRetailers.length; r < rLen; r++) {
                    var currentRetailer = activeRetailers[r];
                    if (currMarker.brnd == currentRetailer && currMarker.type == "ÅF") {
                        if (zoom == 17) {
                            point = new GLatLng(parseFloat(currMarker.lat), parseFloat(currMarker.lng));
                            if (bounds.containsLatLng(point)) {
                                unsortedBrandMarkers.push(currMarker);
                            }
                        }
                        pushCompanyMarker(currMarker);
                    }
                }

                // Check activeGarages
                for (var g = 0, gLen = activeGarages.length; g < gLen; g++) {
                    var currentGarage = activeGarages[g];
                    if (currMarker.brnd == currentGarage && currMarker.type == 'VERKSTAD') {
                        if (zoom == 17) {
                            point = new GLatLng(parseFloat(currMarker.lat), parseFloat(currMarker.lng));
                            if (bounds.containsLatLng(point)) {
                                unsortedBrandMarkers.push(currMarker);
                            }
                        }
                        pushCompanyMarker(currMarker);
                    }
                }

                // Check rentals
                if (showEBU) {
                    if (currMarker.brnd == 'EBU') {
                        if (zoom == 17) {
                            point = new GLatLng(parseFloat(currMarker.lat), parseFloat(currMarker.lng));
                            if (bounds.containsLatLng(point)) {
                                unsortedBrandMarkers.push(currMarker);
                            }
                        }
                        pushCompanyMarker(currMarker);
                    }
                }

            }

            unsortedBrandMarkers.sort(sortBrandMarkers);
            for (var j = 0, uLen = unsortedBrandMarkers.length; j < uLen; j++) {
                var sortedMarker = unsortedBrandMarkers[j];
                pushBrandMarker(sortedMarker, j);
            }

            mgr.addMarkers(brandMarkers, 17);
            mgr.addMarkers(companyMarkers, 5, 16);
            mgr.refresh();
        },

        /* Get html information for markers */
        getMarkerInfo: function() {
            var zoom = map.getZoom();
            if (zoom < 17) {
                return side_bar_html;
            }
            else {
                return side_bar_html_brands;
            }
        },

        markerClick: function(i) {
            //GEvent.trigger(companyMarkers[i], "click");
            var currMarker = companyMarkers[i];
            sidebarHandler.setToAddress(currMarker.my_name + '@' + currMarker.lat + ',' + currMarker.lng);

            var newLat = parseFloat(currMarker.lat);
            newLat = newLat + (0.00025);
            newLat = newLat.toFixed(7);
            var point = new GLatLng(parseFloat(newLat), currMarker.lng);
            map.setCenter(point, 17);
        },

        markerHover: function(i) {
            companyMarkers[i].setImage(iconPath + 'marker_norm/red.png');
            document.getElementById('link' + i).style.background = hlcolor;
        },

        markerOut: function(i) {
            //GEvent.trigger(companyMarkers[i], "mouseover");
            companyMarkers[i].setImage(iconPath + 'marker_norm/image.png');
            document.getElementById('link' + i).style.background = bgcolor;
        },

        brandMarkerClick: function(i) {
            var currMarker = brandMarkers[i];
            sidebarHandler.setToAddress(currMarker.my_name + '@' + currMarker.lat + ',' + currMarker.lng);
            GEvent.trigger(brandMarkers[i], "click");
        },

        setCenter: function(lat, lng) {
            //map.setCenter(new GLatLng(lat, lng), 11);
            var activeRetailers = selectorHandler.getActiveRetailers;
            var activeGarages = selectorHandler.getActiveGarages;
            var showEBU = selectorHandler.getRentState()
            var centerLoc = new GLatLng(lat, lng);
            var distances = [];
            for (var i = 0, len = mapDataDealers.length; i < len; i++) {
                var currMarker = mapDataDealers[i];
                // Check activeRetailers
                for (var r = 0, rLen = activeRetailers.length; r < rLen; r++) {
                    var currentRetailer = activeRetailers[r];
                    if (currMarker.brnd == currentRetailer && currMarker.type == "ÅF") {
                        var poiLoc = new GLatLng(parseFloat(currMarker.lat), parseFloat(currMarker.lng));
                        var dist = poiLoc.distanceFrom(centerLoc);
                        distances.push({ point: poiLoc, dist: dist });
                    }
                }

                // Check activeGarages
                for (var g = 0, gLen = activeGarages.length; g < gLen; g++) {
                    var currentGarage = activeGarages[g];
                    if (currMarker.brnd == currentGarage && currMarker.type == 'VERKSTAD') {
                        var poiLoc = new GLatLng(parseFloat(currMarker.lat), parseFloat(currMarker.lng));
                        var dist = poiLoc.distanceFrom(centerLoc);
                        distances.push({ point: poiLoc, dist: dist });
                    }
                }

                // Check rentals
                if (showEBU) {
                    if (currMarker.brnd == 'EBU') {
                        var poiLoc = new GLatLng(parseFloat(currMarker.lat), parseFloat(currMarker.lng));
                        var dist = poiLoc.distanceFrom(centerLoc);
                        distances.push({ point: poiLoc, dist: dist });
                    }
                }

            }
            distances.sort(function(a, b) { return (a.dist - b.dist) });

            map.setCenter(new GLatLng(lat, lng), 11);
            var bounds = map.getBounds();
            for (var j = 0, distLen = distances.length; j < distLen; j++) {
                if (!bounds.containsLatLng(distances[j].point)) {
                    bounds.extend(distances[j].point);
                }
                if (j == 1) {
                    break;
                }
            }
            var zoom = map.getBoundsZoomLevel(bounds);
            map.setCenter(new GLatLng(lat, lng), zoom - 1);
        },

        /* Reset current markers and handlers */
        reset: function() {
            for (var i = 0; i < companyMarkers.length; i++) {
                resetMarker(companyMarkers[i]);
            }

            for (var j = 0; j < brandMarkers.length; j++) {
                resetMarker(brandMarkers[j]);
            }

            companyMarkers = [];
            brandMarkers = [];
            unsortedBrandMarkers = [];

            mgr.clearMarkers();
            mgr.refresh();
            side_bar_html = '';
            side_bar_html_brands = '';
            lastlinkid = '';
        }
    }
})();

/*-----------------------------*/
/*------ Sidebar Handler ------*/
/*-----------------------------*/
var sidebarHandler = (function() {
    return {
        toggleSearchHelp: function() {
            if ($("#search_help_arrow").hasClass('expanded')) {
                $("#search_help_arrow").removeClass('expanded');
                $("#search_help").hide('slow');
            }
            else {
                if ($("#side_bar_arrow").hasClass('expanded')) {
                    $("#side_bar_arrow").removeClass('expanded');
                    $("#side_bar").hide('slow');
                }
                if ($("#road_guide_arrow").hasClass('expanded')) {
                    $("#road_guide_arrow").removeClass('expanded');
                    $("#road_guide").hide('slow');
                }
                $("#search_help_arrow").addClass('expanded');
                $("#search_help").show('slow');
            }
        },

        expandSearchHelp: function() {
            if (!$("#search_help_arrow").hasClass('expanded')) {
                if ($("#side_bar_arrow").hasClass('expanded')) {
                    $("#side_bar_arrow").removeClass('expanded');
                    $("#side_bar").hide('slow');
                }
                if ($("#road_guide_arrow").hasClass('expanded')) {
                    $("#road_guide_arrow").removeClass('expanded');
                    $("#road_guide").hide('slow');
                }
                $("#search_help_arrow").addClass('expanded');
                $("#search_help").show('slow');
            }
        },

        toggleSearchResult: function() {
            if ($("#side_bar_arrow").hasClass('expanded')) {
                $("#side_bar_arrow").removeClass('expanded');
                $("#side_bar").hide('slow');
            }
            else {
                if ($("#search_help_arrow").hasClass('expanded')) {
                    $("#search_help_arrow").removeClass('expanded');
                    $("#search_help").hide('slow');
                }
                if ($("#road_guide_arrow").hasClass('expanded')) {
                    $("#road_guide_arrow").removeClass('expanded');
                    $("#road_guide").hide('slow');
                }
                $("#side_bar_arrow").addClass('expanded');
                $("#side_bar").show('slow');
            }
        },

        expandSearchResult: function() {
            if (!$("#side_bar_arrow").hasClass('expanded')) {
                if ($("#search_help_arrow").hasClass('expanded')) {
                    $("#search_help_arrow").removeClass('expanded');
                    $("#search_help").hide('slow');
                }
                if ($("#road_guide_arrow").hasClass('expanded')) {
                    $("#road_guide_arrow").removeClass('expanded');
                    $("#road_guide").hide('slow');
                }
                $("#side_bar_arrow").addClass('expanded');
                $("#side_bar").show('slow');
            }
        },

        toggleRoadGuide: function() {
            if ($("#road_guide_arrow").hasClass('expanded')) {
                $("#road_guide_arrow").removeClass('expanded');
                $("#road_guide").hide('slow');
            }
            else {
                if ($("#search_help_arrow").hasClass('expanded')) {
                    $("#search_help_arrow").removeClass('expanded');
                    $("#search_help").hide('slow');
                }
                if ($("#side_bar_arrow").hasClass('expanded')) {
                    $("#side_bar_arrow").removeClass('expanded');
                    $("#side_bar").hide('slow');
                }
                $("#road_guide_arrow").addClass('expanded');
                $("#road_guide").show('slow');
            }
        },

        setSidebarInfo: function(sidebarHtml) {
            $("#side_bar").html(sidebarHtml);
        },

        setDirectionsResult: function(resultHtml) {
            $("#directions_search_result").html(resultHtml);
        },

        setToAddress: function(toAddress) {
            $("#txtToAddress").val(toAddress);
        },

        setFromAddress: function(fromAddress) {
            $("#txtFromAddress").val(fromAddress);
            $("#directions_search_result").text('');
        },

        dynamicScroll: function dynamicScroll(linkid) {
            if ($('#side_bar ' + linkid + '').offset() != null) {
                var divOffset = $('#side_bar').offset().top;
                var pOffset = $('#side_bar ' + linkid + '').offset().top;
                var pScroll = pOffset - divOffset;
                $('#side_bar').animate({ scrollTop: '+=' + pScroll + 'px' }, 0);
            }
        }

    }
})();

/*------------------------------*/
/*------ Selector Handler ------*/
/*------------------------------*/
var selectorHandler = (function() {
    var activeRetailers = [];
    var activeGarages = [];
    var gcoder;
    var greasons = [];

    return {
        /* Initialization of GeoCoder */
        initGeocoder: function() {
            gcoder = new GClientGeocoder();

            greasons[G_GEO_SUCCESS] = "Success";
            greasons[G_GEO_MISSING_ADDRESS] = "Missing Address: The address was either missing or had no value.";
            greasons[G_GEO_UNKNOWN_ADDRESS] = "Unknown Address:  No corresponding geographic location could be found for the specified address.";
            greasons[G_GEO_UNAVAILABLE_ADDRESS] = "Unavailable Address:  The geocode for the given address cannot be returned due to legal or contractual greasons.";
            greasons[G_GEO_BAD_KEY] = "Bad Key: The API key is either invalid or does not match the domain for which it was given";
            greasons[G_GEO_TOO_MANY_QUERIES] = "Too Many Queries: The daily geocoding quota for this site has been exceeded.";
            greasons[G_GEO_SERVER_ERROR] = "Server error: The geocoding request could not be successfully processed.";

            $("#filter_text").val("Ange ort");
        },

        doSearch: function(searchString) {
            if (searchString != "Ange ort") {
                var search = searchString + ', Sverige';
                var searchResultHTML = '';
                // ====== Perform the Geocoding ======
                gcoder.getLocations(search, function(result) {
                    // If that was successful
                    if (result.Status.code == G_GEO_SUCCESS) {
                        var resultPos = 0;
                        // How many resuts were found
                        if (result.Placemark.length == 0) {
                            searchResultHTML = "Hittade inga orter";
                        }
                        else if (result.Placemark.length == 1) {
                            searchResultHTML = "Hittade " + result.Placemark.length + " ort";
                        }
                        else {
                            searchResultHTML = "Hittade " + result.Placemark.length + " orter";
                        }

                        // Loop through the results, placing markers
                        if (result.Placemark.length == 1) {
                            var p = result.Placemark[0].Point.coordinates;
                            mapHandler.setCenter(p[1], p[0]);
                        }
                        else {
                            for (var i = 0; i < result.Placemark.length; i++) {
                                //                        if (result.Placemark[i].AddressDetails.Country != null) {
                                //                            if (result.Placemark[i].AddressDetails.Country.CountryNameCode == 'SE') {
                                //                                resultPos = i;
                                //                                break;
                                //                            }
                                //                        }
                                var p = result.Placemark[i].Point.coordinates;
                                //var marker = new GMarker(new GLatLng(p[1], p[0]));
                                searchResultHTML += '<br>' + (i + 1) + ': <a href="javascript:mapHandler.setCenter(' + p[1] + ',' + p[0] + ')">' + result.Placemark[i].address.replace("Sweden", "Sverige").replace("Municipality", "kommun") + '</a>';
                                //map.addOverlay(marker);
                            }
                            sidebarHandler.setSidebarInfo(searchResultHTML);

                        }
                        sidebarHandler.expandSearchResult();

                    }
                    // ====== Decode the error status ======
                    else {
                        var reason = "Code " + result.Status.code;
                        if (greasons[result.Status.code]) {
                            reason = greasons[result.Status.code]
                        }
                        alert('Could not find "' + search + '" ' + reason);
                    }
                });
            }
        },

        doDirectionSearch: function(searchString) {
            var search = searchString + ', Sverige';
            var searchResultHTML = '';
            // ====== Perform the Geocoding ======
            gcoder.getLocations(search, function(result) {
                // If that was successful
                if (result.Status.code == G_GEO_SUCCESS) {
                    var resultPos = 0;
                    // How many resuts were found
                    if (result.Placemark.length == 0) {
                        searchResultHTML = "Hittade inga platser";
                    }
                    else if (result.Placemark.length == 1) {
                        searchResultHTML = "Hittade " + result.Placemark.length + " plats";
                    }
                    else {
                        searchResultHTML = "Hittade " + result.Placemark.length + " platser";
                    }

                    // Loop through the results, placing markers
                    for (var i = 0; i < result.Placemark.length; i++) {
                        var p = result.Placemark[i].Point.coordinates;
                        var searchString = '';
                        searchString = result.Placemark[i].address.replace("Sweden", "Sverige").replace("Municipality", "");
                        searchResultHTML += "<br /><a href=\"javascript:sidebarHandler.setFromAddress('" + searchString + "')\">" + searchString + "</a>"; //"<br>" + (i + 1) + ": <a href=javascript:sidebarHandler.setFromAddress('" + searchString + "')>" + searchString + "</a>";
                    }
                    sidebarHandler.setDirectionsResult(searchResultHTML);
                    //sidebarHandler.expandSearchResult();

                }
                // ====== Decode the error status ======
                else {
                    var reason = "Code " + result.Status.code;
                    if (greasons[result.Status.code]) {
                        reason = greasons[result.Status.code]
                    }
                    alert('Could not find "' + search + '" ' + reason);
                }
            });
        },

        toggleSelector: function(visible) {
            if (visible == false) {
                $("#selector").hide('slow');
                $("#show").show('slow');
            }
            else {
                $("#selector").show('slow');
                $("#show").hide('slow');
            }
        },

        setActiveRetailers: function(sender, brandCode) {
            if ($(sender).hasClass('active')) {
                var retailIndex;
                for (var i = 0, j = activeRetailers.length; i < j; i++) {
                    if (activeRetailers[i] == brandCode) { retailIndex = i; }
                }
                activeRetailers.splice(retailIndex, 1);
                $(sender).removeClass('active');
                if (!$('#' + brandCode.toString().toLowerCase() + '_gar').hasClass('active')) {
                    $('#' + brandCode.toString().toLowerCase() + '_logo').removeClass('active');
                }
            }
            else {
                $(sender).addClass('active');
                if (!$('#' + brandCode.toString().toLowerCase() + '_gar').hasClass('active')) {
                    $('#' + brandCode.toString().toLowerCase() + '_logo').addClass('active');
                }
                activeRetailers.push(brandCode);
            }
        },

        setActiveGarages: function(sender, brandCode) {
            if ($(sender).hasClass('active')) {
                var garageIndex;
                for (var i = 0, j = activeGarages.length; i < j; i++) {
                    if (activeGarages[i] == brandCode) { garageIndex = i; }
                }
                activeGarages.splice(garageIndex, 1);
                $(sender).removeClass('active');
                if (!$('#' + brandCode.toString().toLowerCase() + '_ret').hasClass('active')) {
                    $('#' + brandCode.toString().toLowerCase() + '_logo').removeClass('active');
                }
            }
            else {
                $(sender).addClass('active');
                if (!$('#' + brandCode.toString().toLowerCase() + '_ret').hasClass('active')) {
                    $('#' + brandCode.toString().toLowerCase() + '_logo').addClass('active');
                }
                activeGarages.push(brandCode);
            }
        },

        setRentState: function() {
            if ($("#rent").hasClass('active')) {
                $("#rent").removeClass('active');
                $("#rent_logo").removeClass('active');
            }
            else {
                $("#rent").addClass('active');
                $("#rent_logo").addClass('active');
            }
        },

        getRentState: function() {
            if ($("#rent").hasClass('active')) {
                return true;
            }
            else {
                return false;
            }
        },
        getActiveRetailers: activeRetailers
        ,
        getActiveGarages: activeGarages
    }
})();
