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");
}
}