var dealerSiteL10N = "Dealer Website"; var enterAddressL10 = "Please enter an address!"; var noRouteFoundL10N = "Google could not find the route: "; var selectCountryL10N = "Please select a country."; var dealerNetworkService = { map: null, markers: [], bounds: null, infoWindow: null, isMapEnlarged: false, elementId: "map", mapHeight: 0, mapWidth: 0, directionsRenderer: null, directionsService: null, getRegions: function (country, productLineCsv, callback) { $.ajax({ url: "/umbraco/surface/dealernetworkajax/getregions?country=" + country + "&productLinesCsv=" + productLineCsv, success: function(data) { callback(data); } }); }, getDealers: function (country, region, productLineCsv, name, sales, service, address, distance, callback) { var url = "/umbraco/surface/dealernetworkajax/getdealers?country=" + country + "®ion=" + region + "&name=" + name + "&productLinesCsv=" + productLineCsv + "&sales=" + sales + "&service=" + service + "&address=" + address + "&distance=" + distance; $.ajax({ url: url, success: function (data) { dealerNetworkService.updateResultsHtml(data); callback(data); $("#enlarge-map").show(); } }); }, getIntDealers: function (productLineCsv, callback) { var url = "/umbraco/surface/dealernetworkajax/getintdealers?productLinesCsv=" + productLineCsv; $.ajax({ url: url, success: function (data) { dealerNetworkService.updateResultsHtml(data); callback(data); $("#enlarge-map").show(); } }); }, initMap: function(elementId) { if (elementId) { dealerNetworkService.elementId = elementId; } $("#enlarge-map").hide(); this.map = new google.maps.Map(document.getElementById(dealerNetworkService.elementId), { center: { lat: 50.71, lng: 6.14 }, zoom: 4, scrollwheel: false, navigationControl: false }); this.directionsRenderer = new google.maps.DirectionsRenderer(); this.directionsService = new google.maps.DirectionsService(); this.directionsRenderer.setMap(this.map); this.directionsRenderer.setPanel(document.getElementById("directionsPanel")); google.maps.event.addListener(this.map, "bounds_changed", function () { dealerNetworkService.handleBoundsChange(dealerNetworkService.map.getBounds()); }); }, addMarkers: function (dealers) { this.clearMarkers(); this.bounds = new google.maps.LatLngBounds(); var hasMarker = false; for (var i in dealers) { this.addMarker(dealers[i]); hasMarker = true; } if (hasMarker) { this.map.fitBounds(this.bounds); //limit how far zoomed in the map goes if (this.map.getZoom() > 10) { this.map.setZoom(6); } } }, addMarker: function(dealer) { var latLng = new google.maps.LatLng(dealer.Latitude, dealer.Longitude); var marker = new google.maps.Marker({ position: latLng, map: this.map, title: dealer.Name }); //add a reference to the dealer card marker.customerNumber = dealer.CustomerNumber; //infobox var html = "

" + dealer.Name + "

"; var address = []; if (dealer.Address1) { address.push(dealer.Address1); } if (dealer.Address2) { address.push(dealer.Address2); } if (dealer.City) { address.push(dealer.PostalCode + " " + dealer.City); } address.push(dealer.ServicePhone); html += "

" + address.join("
") + "

"; var list = []; if (dealer.ServiceEmail) { list.push("" + dealer.ServiceEmail + ""); } if (dealer.Website !== '') { list.push("" + dealerSiteL10N + ""); } if (list.length) { html += ""; } //html += '
'; //html += ' '; //html += ' '; //html += '
'; html = "
" + html + "
"; google.maps.event.addListener(marker, "click", function () { if (dealerNetworkService.infoWindow) { dealerNetworkService.infoWindow.close(); } dealerNetworkService.infoWindow = new google.maps.InfoWindow( { content: html, height: 200, maxHeight: 200, width: 400, disableAutoPan: true }); //change icons to normal for (var i in dealerNetworkService.markers) { var thisMarker = dealerNetworkService.markers[i]; thisMarker.setIcon("https://maps.google.com/mapfiles/ms/icons/red-dot.png"); } marker.setIcon("https://maps.google.com/mapfiles/ms/icons/green-dot.png"); if (!dealerNetworkService.isMapEnlarged) { dealerNetworkService.infoWindow.open(dealerNetworkService.map, marker); dealerNetworkService.highlightDealerCard(marker); } else { //center map on the clicked icon dealerNetworkService.map.setCenter({lat: marker.getPosition().lat(), lng: marker.getPosition().lng()}); dealerNetworkService.showDealerSidebar(marker); } //below code is not in use at present $("#route-button-info-window").click(function (e) { e.preventDefault(); var $button = $(this); var $address = $button.parent().find(".route-address"); if (!$address.val()) { alert(enterAddressL10); return; } var request = { origin: $address.val(), destination: latLng, travelMode: google.maps.DirectionsTravelMode.DRIVING }; dealerNetworkService.directionsService.route(request, function (response, status) { if (status == google.maps.DirectionsStatus.OK) { dealerNetworkService.directionsRenderer.setDirections(response); $("#directionsPanelContainer").show(); dealerNetworkService.scrollTop(); } else { alert(noRouteFoundL10N + status); } }); }); }); this.markers.push(marker); this.bounds.extend(latLng); }, setMapOnAll: function (map) { for (var i = 0; i < this.markers.length; i++) { this.markers[i].setMap(map); } }, clearMarkers: function () { this.setMapOnAll(null); }, deleteMarkers: function() { this.clearMarkers(); this.markers = []; }, showMarkers: function () { this.setMapOnAll(map); }, updateTotal: function () { var $resultsContainer = $("#results-container"); var itemCount = $resultsContainer.find(".dealer-result").length; var $resultCount = $("#result-count"); $resultCount.find(".filter-head__results-title").text(itemCount); if (itemCount != 1) { $resultCount.find(".filter-head__results-subtitle").text($resultCount.find(".filter-head__results-subtitle").data("resultsPlural")); } else { $resultCount.find(".filter-head__results-subtitle").text($resultCount.find(".filter-head__results-subtitle").data("resultsSingular")); } }, updateResultsHtml: function(data) { var $template = $("#result-template"); var $resultsContainer = $("#results-container"); //remove old entries $("#results-container .dealer-result").remove(); //add new entries for (var i in data) { var dealer = data[i]; var $newResult = $template.find(".dealer-result").clone(true); $newResult.attr("data-lat", dealer.Latitude); $newResult.attr("data-lng", dealer.Longitude); $newResult.attr("data-dealer-id", dealer.CustomerNumber); var $name = $newResult.find(".result-name"); $name.text(dealer.Name); if (dealer.Website !== '') { $name.attr("href", dealer.Website); } else { $name.removeAttr('href'); } var address = []; if (dealer.Address1) { address.push(dealer.Address1); } if (dealer.Address2) { address.push(dealer.Address2); } if (dealer.City) { address.push(dealer.PostalCode + " " + dealer.City); } $newResult.find(".result-address").closest("li").find("span").html(" " + address.join("
")); $newResult.find(".result-phone").closest("li").find("span").text(" " + dealer.ServicePhone); if (dealer.Website !== '') { $newResult.find(".result-website").attr("href", dealer.Website); } else { $newResult.find(".result-website").hide(); } $resultsContainer.append($newResult); } this.updateTotal(); }, closeFilters: function() { var $filter = $('.filter'); var $filterResults = $('.filter-results'); $filter.removeClass('filter--active'); $filterResults.removeClass('filter-results--active'); }, openFilters: function () { var $filter = $('.filter'); var $filterResults = $('.filter-results'); $filter.addClass('filter--active'); $filterResults.addClass('filter-results--active'); }, scrollTop: function () { //document.getElementById("map").scrollIntoView(); }, handleBoundsChange: function(bounds) { for (var i in this.markers) { var marker = this.markers[i]; var isInbounds = bounds.contains(marker.getPosition()); var $dealerCard = $("[data-dealer-id=" + marker.customerNumber + "]"); var $showContainer = $("#results-container"); var $hideContainer = $("#hidden-results-container"); if (isInbounds) { $dealerCard.appendTo($showContainer); } else { $dealerCard.appendTo($hideContainer); } } this.updateTotal(); }, highlightDealerCard: function (marker) { var highlightClass = "highlighted-dealer-card"; var $dealerCards = $(".dealer-result"); $dealerCards.removeClass(highlightClass); var $dealerCard = $("[data-dealer-id=" + marker.customerNumber + "]"); $dealerCard.addClass(highlightClass); }, showDealerSidebar: function (marker) { var $dealerCard = $("[data-dealer-id=" + marker.customerNumber + "]"); var dealerName = $dealerCard.find(".result-name").text(); var dealerAddress = $dealerCard.find(".result-address").siblings().html(); var dealerPhone = $dealerCard.find(".result-phone").siblings().text(); var dealerWebsite = $dealerCard.find(".result-website").attr("href"); var $sidebar = dealerNetworkService.getDealerSidebar(); $sidebar.find(".dealer-sidebar-header").text(dealerName); var $dealerAddressContainer = $sidebar.find(".dealer-sidebar-address"); if (dealerAddress) { $dealerAddressContainer.show().find('span').html(dealerAddress); } else { $dealerAddressContainer.hide(); } var $dealerPhoneContainer = $sidebar.find(".dealer-sidebar-phone"); if (dealerAddress) { $dealerPhoneContainer.show().find('span').text(dealerPhone); } else { $dealerPhoneContainer.hide(); } var $dealerWebsiteContainer = $sidebar.find(".dealer-sidebar-website"); if (dealerWebsite !== '#') { $dealerWebsiteContainer.show().attr("href", dealerWebsite); } else { $dealerWebsiteContainer.hide(); } $sidebar.show(); }, handleHoverDealerCard: function(id) { for (var i in this.markers) { var marker = this.markers[i]; if (marker.customerNumber === id) { marker.setIcon("https://maps.google.com/mapfiles/ms/icons/green-dot.png"); } else { marker.setIcon("https://maps.google.com/mapfiles/ms/icons/red-dot.png"); } } }, getMapElement: function() { return $("#" + dealerNetworkService.elementId); }, enlargeMap: function() { dealerNetworkService.isMapEnlarged = true; var $map = dealerNetworkService.getMapElement(); dealerNetworkService.mapHeight = $map.height(); dealerNetworkService.mapWidth = $map.width(); var $wrapper = $("#map-wrapper"); $wrapper.addClass("enlarged"); var windowHeight = $(window).height(); var windowWidth = $(window).width(); $wrapper.height(windowHeight); $wrapper.width(windowWidth); $map.height(windowHeight - 40); $map.width(windowWidth - 40); google.maps.event.trigger(dealerNetworkService.map, "resize"); dealerNetworkService.map.fitBounds(dealerNetworkService.bounds); $("#large-map-close").show(); }, shrinkMap: function () { dealerNetworkService.isMapEnlarged = false; var $map = dealerNetworkService.getMapElement(); var $wrapper = $("#map-wrapper"); $wrapper.removeClass("enlarged"); $map.height(dealerNetworkService.mapHeight); $map.width(dealerNetworkService.mapWidth); $wrapper.height(dealerNetworkService.mapHeight); $wrapper.width(dealerNetworkService.mapWidth); google.maps.event.trigger(dealerNetworkService.map, "resize"); dealerNetworkService.map.fitBounds(dealerNetworkService.bounds); $("#large-map-close").hide(); dealerNetworkService.getDealerSidebar().hide(); }, getDealerSidebar: function () { return $("#dealer-sidebar"); } }