{"version":3,"sources":["Map.js"],"names":["$","w","THF","Interface","Map","args","allLocations","currentAction","defaults","data","isMobile","country","resultListChunks","resultListSize","toggleState","locations","markers","length","templates","loadingTemplate","infoWindowTemplate","html","ProviderName","fullAddress","join","Latitude","Longitude","listTemplate","currentState","i","location","State","Id","Phone","Fax","Email","map","apiKey","view","geocoder","infoWindow","clusterManager","countryBounds","minZoom","window","width","maxZoom","placeID","defaultMarkerImage","SiteSettings","id","defaultCustomMarkerImage","clusterIcons","textColor","url","height","settings","zoom","center","disableDefaultUI","zoomControl","scrollwheel","styles","featureType","elementType","stylers","color","visibility","saturation","lightness","el","wrap","mapSearchSection","findAddress","address","loading","resultsList","results","toggle","showMoreBtn","filter","mobileMenu","storeName","extend","$wrap","$el","selector","setupMap","google","maps","Geocoder","InfoWindow","LatLng","defaultMarker","size","Size","scaledSize","defaultCustomMarker","getLocations","callback","response","removeClass","fitBoundsToMarkers","setLoadingState","ajax","type","success","onLocationLoad","call","error","event","addListener","onMapClick","onCheckZoom","onUpdateResults","addDomListener","setCenter","init","on","e","lat","this","attr","lng","storeID","showInfoWindow","getZoom","setZoom","animate","scrollTop","offset","top","preventDefault","onAddressSubmit","onAddressFocus","onAddressKeyup","filterState","resize","updateFixedMenu","loadMore","target","parent","val","change","addClass","fitToAddress","geocode","componentRestrictions","status","address_components","short_name","_","isUndefined","place_id","apply","arguments","bind","distance","closest","closestMarker","each","marker","dlat","Math","abs","position","dlng","d","sqrt","pow","bounds","LatLngBounds","getPosition","fitBounds","geometry","loadList","StreetAddress","split","concat","Suburb","Postcode","template","chain","find","value","push","anchor","zoomed","locationsPage","content","sortBy","slice","markup","currentstate","locationsPageLength","locationsLength","show","hide","resetListResults","state","buildMarkers","options","parseFloat","model","icon","labelClass","optimized","Marker","onMarkerClick","groups","inArray","group","append","selectpicker","markerOrID","console","log","isObject","close","setContent","open","getVisible","getCenter","ids","reduce","list","visible","getMap","getBounds","contains","item","match","setMap","setVisible","css","currentScroll","document","outerHeight","menuHeight","retailerHeight","mobile","_gmapsReady","MapReady","onMapReady","setTimeout","getScript","setLocations","jQuery"],"mappings":"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","file":"map.min.js","sourcesContent":["(function ($, w, d, undefined) {\r\n 'use strict';\r\n\r\n var Map = function (args) {\r\n var allLocations = [];\r\n var filteredLocations = [];\r\n var currentAction = null;\r\n var defaults = {\r\n data: [],\r\n isMobile: false,\r\n country: 'Australia', // Used as the default country to display.\r\n resultListChunks: 10,\r\n resultListSize: 10,\r\n toggleState: 'full',\r\n locations: {\r\n markers: [],\r\n length: 0\r\n },\r\n templates: {\r\n loadingTemplate: '
Loading
',\r\n infoWindowTemplate: function(data) {\r\n var html = '
';\r\n html += '

'+data.ProviderName+'

';\r\n html += '

'+ data.fullAddress.join(', ') +'

';\r\n html += 'Get Directions ';\r\n html += '
';\r\n return html;\r\n },\r\n listTemplate: function(data) {\r\n var html = '';\r\n \r\n var currentState = '';\r\n for(var i = 0; i < data.locations.length; i++) {\r\n var location = data.locations[i];\r\n if(location.State !== currentState) {\r\n html += '
'+location.State+'
';\r\n currentState = location.State;\r\n }\r\n\r\n html += '
';\r\n html += '

' + location.ProviderName + '

';\r\n html += '

' + location.fullAddress + '

';\r\n\r\n if(typeof location.Phone !== 'undefined' && location.Phone !== null && location.Phone !== '') {\r\n html += '

Phone: ' + location.Phone + '

';\r\n }\r\n\r\n if(typeof location.Fax !== 'undefined' && location.Fax !== null && location.Fax !== '') {\r\n html += '

Fax: ' + location.Fax + '

';\r\n }\r\n\r\n if(typeof location.Email !== 'undefined' && location.Email !== null && location.Email !== '') {\r\n html += '

' + location.Email + '

';\r\n }\r\n\r\n html += '

Get Directions

';\r\n html += '
';\r\n }\r\n return html;\r\n },\r\n // listTemplate: _.template([\r\n // '<% _.each(locations, function(location) { %>',\r\n // '<% if (location.State !== currentstate) { %>',\r\n // '
<%= location.State %>
',\r\n // '<% currentstate = location.State %>',\r\n // '<% } %>',\r\n // '
',\r\n // '

\" data-store-lng=\"<%= location.Longitude %>\" data-store-id=\"<%= location.Id %>\"><%= location.ProviderName %>

',\r\n // '

<%= location.fullAddress %>

',\r\n // '<% if (location.Phone) { %>

Phone: \"><%= location.Phone %>

<% } %>',\r\n // '<% if (location.Fax) { %>

Fax: <%= location.Fax %>

<% } %>',\r\n // '<% if (location.Email) { %>

\"><%= location.Email %>

<% } %>',\r\n // '

,<%= location.Longitude %>\" target=\"_blank\" data-ga=\"cta|click|Directions - <%= location.fullAddress %> \">Get Directions

',\r\n // '
',\r\n // '<% }) %>'\r\n // ].join(\"\\n\")),\r\n },\r\n map: {\r\n apiKey: 'AIzaSyATo7PXvDg1crsATFEjzvvg4HjaF7NPmDI',\r\n view: {},\r\n geocoder: {},\r\n infoWindow: {},\r\n clusterManager: {},\r\n countryBounds: false,\r\n minZoom: $(window).width() < 768 ? 2 : 3,\r\n maxZoom: 13,\r\n placeID: 0,\r\n defaultMarkerImage: '/static/img/'+THF.SiteSettings.id+'/map/ui-googlemaps-pin.png',\r\n defaultCustomMarkerImage: '/static/img/'+THF.SiteSettings.id+'/map/ui-googlemaps-pin.svg',\r\n clusterIcons: [{\r\n textColor: 'white',\r\n url: '/static/img/common/map/cluster-icon.png',\r\n height: 60,\r\n width: 60\r\n }],\r\n settings: {\r\n zoom: 5,\r\n center: {},\r\n disableDefaultUI: true,\r\n zoomControl: true,\r\n scrollwheel: false,\r\n styles: [\r\n {\r\n \"featureType\": \"administrative\",\r\n \"elementType\": \"labels.text.fill\",\r\n \"stylers\": [{\"color\": \"#444444\"}]\r\n },\r\n {\r\n \"featureType\": \"administrative\",\r\n \"elementType\": \"geometry.fill\",\r\n \"stylers\": [{\"visibility\": \"off\"}]\r\n },\r\n {\"featureType\": \"landscape\", \"elementType\": \"all\", \"stylers\": [{\"color\": \"#f7f7f7\"}]},\r\n {\"featureType\": \"poi\", \"elementType\": \"all\", \"stylers\": [{\"visibility\": \"off\"}]},\r\n {\r\n \"featureType\": \"road\",\r\n \"elementType\": \"all\",\r\n \"stylers\": [{\"saturation\": -100}, {\"lightness\": 45}]\r\n },\r\n {\r\n \"featureType\": \"road.highway\",\r\n \"elementType\": \"all\",\r\n \"stylers\": [{\"visibility\": \"simplified\"}]\r\n },\r\n {\r\n \"featureType\": \"road.arterial\",\r\n \"elementType\": \"labels.icon\",\r\n \"stylers\": [{\"visibility\": \"off\"}]\r\n },\r\n {\"featureType\": \"transit\", \"elementType\": \"all\", \"stylers\": [{\"visibility\": \"off\"}]},\r\n {\r\n \"featureType\": \"water\",\r\n \"elementType\": \"all\",\r\n \"stylers\": [{\"color\": \"#e6e6e6\"}, {\"visibility\": \"on\"}]\r\n }\r\n ]\r\n }\r\n },\r\n el: {\r\n wrap: '',\r\n map: '.map',\r\n mapSearchSection: '.map-search',\r\n findAddress: '.map-search__address-form',\r\n address: '.map-search__address',\r\n loading: '.google-map__loading',\r\n resultsList: '.location-results .map__results-list',\r\n results: '.location-results',\r\n toggle: '.maptoggle a',\r\n showMoreBtn: '.show-more',\r\n filter: '.filter select',\r\n mobileMenu: '.map-mobile-menu',\r\n storeName: '.store-name'\r\n }\r\n };\r\n var settings = $.extend(true, {}, defaults, args);\r\n\r\n function __construct() {\r\n // We only want to load the map api once.\r\n if (typeof w._gmapsReady === 'function') {\r\n // Loader for any subsequent calls.\r\n\r\n if (w.THF.Interface.MapReady) {\r\n init();\r\n }\r\n else {\r\n onMapReady();\r\n }\r\n }\r\n else {\r\n // First to load.\r\n w._gmapsReady = function () {\r\n w.THF.Interface.MapReady = true;\r\n init();\r\n };\r\n $.getScript('https://maps.google.com.au/maps/api/js?v=3.exp&key=' + settings.map.apiKey + '&callback=_gmapsReady®ion=AU&language=en-au');\r\n }\r\n }\r\n\r\n var $wrap = $(settings.el.wrap);\r\n\r\n function el(selector) {\r\n return settings.el.wrap + ' ' + selector;\r\n }\r\n\r\n function $el(selector) {\r\n return $(selector, $wrap);\r\n }\r\n\r\n function onMapReady() {\r\n setTimeout(function () {\r\n if (!w.THF.Interface.MapReady) {\r\n onMapReady();\r\n }\r\n else {\r\n init();\r\n }\r\n }, 200);\r\n }\r\n\r\n function setupMap() {\r\n settings.map.geocoder = new google.maps.Geocoder();\r\n settings.map.infoWindow = new google.maps.InfoWindow();\r\n settings.map.settings.center = new google.maps.LatLng(-33.9, 151.2);\r\n settings.map.defaultMarker = {\r\n url: settings.map.defaultMarkerImage,\r\n size: new google.maps.Size(30, 40),\r\n scaledSize: new google.maps.Size(30, 35)\r\n };\r\n settings.map.defaultCustomMarker = {\r\n url: settings.map.defaultCustomMarkerImage,\r\n size: new google.maps.Size(24,32),\r\n scaledSize: new google.maps.Size(24, 32)\r\n };\r\n settings.map.view = new google.maps.Map($el(settings.el.map)[0], settings.map.settings);\r\n\r\n getLocations(function (response) {\r\n // Hide loading state\r\n $el(settings.el.loading).removeClass('is-visible');\r\n fitBoundsToMarkers();\r\n });\r\n\r\n initMapListeners();\r\n }\r\n\r\n function init() {\r\n settings.isMobile = isMobile();\r\n setupMap();\r\n\r\n $el(settings.el.resultsList).on('click', settings.el.storeName, function (e) {\r\n var lat = $(this).attr('data-store-lat');\r\n var lng = $(this).attr('data-store-lng');\r\n var storeID = $(this).attr('data-store-id');\r\n\r\n showLocation(lat, lng, storeID);\r\n $('html,body').animate({scrollTop: $el(settings.el.mapSearchSection).offset().top}, 300);\r\n e.preventDefault();\r\n });\r\n\r\n $el(settings.el.findAddress)\r\n .on('submit', onAddressSubmit)\r\n .on('focusin', '.is-invalid input', onAddressFocus);\r\n $el(settings.el.address).on('keyup', onAddressKeyup);\r\n\r\n $el(settings.el.toggle).on('click', toggle);\r\n $el(settings.el.filter).on('change', filterState);\r\n\r\n $(window).on('resize', resize);\r\n $(window).on('scroll', updateFixedMenu);\r\n $(settings.el.showMoreBtn).on('click', loadMore);\r\n\r\n }\r\n\r\n function onAddressFocus(e) {\r\n $(e.target).parent().removeClass('is-invalid');\r\n }\r\n\r\n /**\r\n * @function onAddressSearch\r\n * @param e (Event)\r\n * Reverse geocodes the address\r\n */\r\n function onAddressSubmit(e) {\r\n e.preventDefault();\r\n currentAction = 'address_submit';\r\n $el(settings.el.filter).val('ALL').change();\r\n\r\n var address = $el(settings.el.address).val();\r\n\r\n // IF ONLY ACCEPT POSTCODE\r\n // if (!address || isNaN(address) || address.toString().length !== 4) {\r\n // $el(settings.el.address).parent().addClass('is-invalid');\r\n // fitBoundsToMarkers();\r\n // return;\r\n // }\r\n\r\n // ACCEPT ALL ENTRIES - IF NONE, RESET VIEW\r\n if (!address) {\r\n currentAction = null;\r\n return fitBoundsToMarkers();\r\n }\r\n\r\n // $el(settings.el.address).parent().removeClass('is-invalid');\r\n\r\n $el(settings.el.loading).addClass('is-visible');\r\n\r\n fitToAddress(address, function (results, status) {\r\n\r\n $el(settings.el.loading).removeClass('is-visible');\r\n\r\n if (status !== \"OK\") return;\r\n\r\n // Find the closest marker and center on it\r\n findClosestMarker(results[0].geometry.location.lat(), results[0].geometry.location.lng());\r\n\r\n }.bind(this));\r\n currentAction = null;\r\n }\r\n\r\n /**\r\n * @function onAddressKeyup\r\n * Key up even for the address field\r\n */\r\n function onAddressKeyup() {\r\n if ($el(settings.el.address).val()) $el(settings.el.address).removeClass('is-invalid');\r\n }\r\n\r\n function isMobile() {\r\n return $(w).width() < 768;\r\n }\r\n\r\n function calculateCenter() {\r\n settings.center = settings.map.view.getCenter();\r\n }\r\n\r\n function setLocations(data) {\r\n settings.data = data;\r\n }\r\n\r\n function getLocations(callback) {\r\n /**\r\n * @function getLocations\r\n * @param callback (Function)\r\n * Gets locations from the API\r\n */\r\n setLoadingState(true);\r\n\r\n if (typeof settings.data === 'string') {\r\n $.ajax({\r\n type: \"GET\",\r\n url: settings.data,\r\n success: function (response) {\r\n setLoadingState(false);\r\n allLocations = response;\r\n onLocationLoad(response);\r\n if (typeof callback === 'function') {\r\n callback.call(null, response);\r\n }\r\n },\r\n error: function () {\r\n // TODO\r\n // console.log(\"Error loading map JSON\");\r\n }\r\n })\r\n }\r\n else {\r\n if (typeof callback === 'function') {\r\n allLocations = settings.data;\r\n onLocationLoad(allLocations);\r\n callback.call(null, allLocations);\r\n }\r\n }\r\n setLoadingState(false);\r\n }\r\n\r\n /**\r\n * @function list\r\n * @param response (Object)\r\n */\r\n function loadList(response) {\r\n response = response || [];\r\n\r\n var locations = [], markup = '';\r\n\r\n _.each(response, function (location) {\r\n location.fullAddress = location.StreetAddress.split(\",\").concat(\" \" + location.Suburb + \" \" + location.Postcode);\r\n\r\n // Render the template\r\n location.template = settings.templates.infoWindowTemplate(location);\r\n\r\n var marker = _.chain(settings.locations.markers).find(function (marker) {\r\n return marker.data.Id === location.Id;\r\n }).value();\r\n\r\n if (marker) {\r\n _.extend(marker.data, location);\r\n // Save the marker\r\n locations.push(marker.data);\r\n }\r\n\r\n }, this);\r\n\r\n var marker = settings.map.infoWindow.anchor,\r\n zoomed = settings.map.view.getZoom() >= 9;\r\n\r\n // check if info window has a marker, and using loading template\r\n if (marker && settings.map.infoWindow.content === settings.templates.loadingTemplate) {\r\n showInfoWindow(marker.data.Id);\r\n }\r\n\r\n // Don't show results below a certain zoom level\r\n locations = _.sortBy(locations, 'State');\r\n\r\n // Set DOM data attributes\r\n $el(settings.el.results).attr('data-results', locations.length).attr('data-zoomed', zoomed);\r\n\r\n // Reduce the resultSet down to a manageable amount\r\n\r\n var locationsPage = locations.slice(0, settings.resultListSize);\r\n\r\n // Build the template\r\n markup = settings.templates.listTemplate({locations: locationsPage, currentstate: ''});\r\n $el(settings.el.resultsList).html(markup);\r\n\r\n\r\n loadMoreButtonState(locationsPage.length, locations.length);\r\n }\r\n\r\n function loadMoreButtonState(locationsPageLength, locationsLength) {\r\n if (locationsPageLength < locationsLength) {\r\n $el(settings.el.showMoreBtn).show();\r\n }\r\n else {\r\n $el(settings.el.showMoreBtn).hide();\r\n }\r\n }\r\n\r\n function resetListResults() {\r\n settings.resultListSize = 0;\r\n loadMore();\r\n }\r\n\r\n function loadMore() {\r\n onUpdateResults(settings.resultListSize + settings.resultListChunks);\r\n\r\n /*var newResults = settings.showing + 2;\r\n\r\n for (settings.showing; settings.showing < newResults; settings.showing++) {\r\n if (settings.showing >= $el(settings.el.resultsList).children().length - 1) {\r\n $el(settings.el.showMoreBtn).addClass('hide');\r\n }\r\n if ($el(settings.el.resultsList).children().eq(settings.showing).hasClass('state')) {\r\n newResults = newResults + 1;\r\n }\r\n $el(settings.el.resultsList).children().eq(settings.showing).attr('data-loaded', 'loaded');\r\n }\r\n\r\n updateFixedMenu();\r\n */\r\n }\r\n\r\n function setLoadingState(state) {\r\n var results = $el(settings.el.results);\r\n\r\n if (state === true) {\r\n results.addClass('loading');\r\n } else {\r\n results.removeClass('loading');\r\n }\r\n }\r\n\r\n function fitToAddress(address, callback) {\r\n\r\n // Set the map bounds to Australia\r\n settings.map.geocoder.geocode({\r\n address: address,\r\n componentRestrictions: {\r\n country: settings.country\r\n }\r\n }, function (results, status) {\r\n\r\n // zoom out to country if no results found\r\n if (status !== \"OK\") {\r\n return fitToAddress('Australia', callback);\r\n }\r\n\r\n if (results[0].address_components[0].short_name === settings.country) {\r\n status = \"DEFAULT\";\r\n settings.map.view.setZoom(5);\r\n }\r\n\r\n // Fit the map to the bounds\r\n if (_.isUndefined(results[0].place_id) || settings.map.placeID !== results[0].place_id) {\r\n settings.map.placeID = results[0].place_id;\r\n }\r\n if (typeof callback === \"function\") callback.apply(this, arguments);\r\n\r\n }.bind(this));\r\n }\r\n\r\n function onLocationLoad(response) {\r\n // Update the UI\r\n buildMarkers({\r\n locations: response\r\n });\r\n\r\n // Get all existing groups (ie NSW, QLD, Overseas)\r\n var groups = [];\r\n _.each(response, function (location) {\r\n if ($.inArray(location.State, groups) === -1) groups.push(location.State);\r\n });\r\n\r\n // Create filter using existing groups\r\n _.each(groups, function (group) {\r\n $el(settings.el.filter).append('')\r\n });\r\n $el(settings.el.filter).selectpicker('refresh');\r\n }\r\n\r\n /**\r\n * @function initMapListeners\r\n * Initialises listeners on for Google Maps\r\n */\r\n function initMapListeners() {\r\n // Google Maps Events\r\n google.maps.event.addListener(settings.map.view, 'click', onMapClick);\r\n google.maps.event.addListener(settings.map.view, 'zoom_changed', onCheckZoom);\r\n google.maps.event.addListener(settings.map.view, 'idle', onUpdateResults);\r\n google.maps.event.addDomListener(window, 'resize', function () {\r\n settings.map.view.setCenter(settings.center);\r\n });\r\n }\r\n\r\n /**\r\n * @function buildMarkers\r\n * @param options (Object)\r\n * Loops through the model and creates markers\r\n */\r\n function buildMarkers(options) {\r\n // Remove all markers\r\n settings.locations.markers = [];\r\n\r\n // Using actual marker objects\r\n if (typeof options.markers !== \"undefined\") {\r\n settings.locations.markers = options.markers;\r\n }\r\n // Using locations from the API\r\n else if (typeof options.locations !== \"undefined\") {\r\n\r\n if (!options.locations.length) return;\r\n\r\n _.each(options.locations, function (location) {\r\n\r\n // If there is a lat/long for this location\r\n if (parseFloat(location.Latitude) && parseFloat(location.Longitude)) {\r\n\r\n // Add the marker to the map\r\n addMarker({\r\n model: 'locations',\r\n position: {\r\n lat: parseFloat(location.Latitude),\r\n lng: parseFloat(location.Longitude)\r\n },\r\n icon: settings.map.defaultCustomMarker,\r\n data: location,\r\n labelClass: \"boomtown\",\r\n optimized: false\r\n });\r\n }\r\n\r\n }, this);\r\n }\r\n\r\n // Hide loading state\r\n $el(settings.el.loading).removeClass('is-visible');\r\n\r\n if (!settings.locations.markers.length) return;\r\n\r\n // Fit the map to the bounds of the markers\r\n // fn.fitBoundsToMarkers();\r\n\r\n }\r\n\r\n function addMarker(options) {\r\n /**\r\n * @function addMarker\r\n * Adds a marker to the googleMap\r\n */\r\n if (!options) return;\r\n\r\n var marker = new google.maps.Marker(_.extend({\r\n map: settings.map.view\r\n }, options));\r\n\r\n\r\n // Save the marker\r\n settings.locations.markers.push(marker);\r\n\r\n // Marker events\r\n google.maps.event.addListener(marker, 'click', onMarkerClick);\r\n\r\n }\r\n\r\n /**\r\n * @function markerClick\r\n * @param e (Event)\r\n * @param marker (Object)\r\n */\r\n function onMarkerClick(e, marker) {\r\n showInfoWindow(this);\r\n }\r\n\r\n /**\r\n * @function showInfoWindow\r\n * @param markerOrID (Object or Number)\r\n */\r\n function showInfoWindow(markerOrID) {\r\n console.log(markerOrID);\r\n var marker = _.isObject(markerOrID) ? markerOrID : _.find(settings.locations.markers, function (marker) {\r\n return marker.data.Id == markerOrID;\r\n });\r\n\r\n // var id = marker.data.Id;\r\n\r\n if (settings.map.view.getZoom() < settings.map.maxZoom) {\r\n settings.map.view.setZoom(settings.map.maxZoom);\r\n }\r\n\r\n settings.map.view.setCenter(marker.getPosition());\r\n\r\n // Close the info window\r\n settings.map.infoWindow.close();\r\n\r\n var markup = marker.data.template || settings.templates.loadingTemplate;\r\n\r\n settings.map.infoWindow.setContent(markup);\r\n settings.map.infoWindow.open(settings.map.view, marker);\r\n }\r\n\r\n function fitBoundsToMarkers() {\r\n /**\r\n * @function fitBoundsToMarkers\r\n * Resizes the bounds to fit all visible markers\r\n */\r\n var bounds = new google.maps.LatLngBounds();\r\n\r\n // Loop through all markers\r\n _.each(settings.locations.markers, function (marker) {\r\n // Extend the bounds to the markers bounds\r\n if (marker.getVisible()) bounds.extend(marker.getPosition());\r\n });\r\n\r\n // Fit the map to the bounds\r\n settings.map.view.fitBounds(bounds);\r\n\r\n // Don't zoom in too far\r\n var zoom = settings.map.view.getZoom();\r\n settings.map.view.setZoom(zoom > settings.map.maxZoom ? settings.map.maxZoom : zoom);\r\n }\r\n\r\n function findClosestMarker(lat, lng) {\r\n /**\r\n * @function findClosestMarker\r\n * @param lat (Number)\r\n * @param lng (Number)\r\n * Finds the closest marker to lat lng\r\n */\r\n var distance = false,\r\n closest = -1;\r\n\r\n _.each(settings.locations.markers, function (marker, i) {\r\n\r\n var dlat = Math.abs(marker.position.lat() - lat),\r\n dlng = Math.abs(marker.position.lng() - lng),\r\n d = Math.sqrt(Math.pow(dlat, 2) + Math.pow(dlng, 2));\r\n\r\n if (distance && d >= distance) return;\r\n\r\n distance = d;\r\n closest = i;\r\n\r\n }, this);\r\n\r\n // Set the map center to the closest marker\r\n var closestMarker = settings.locations.markers[closest],\r\n bounds = new google.maps.LatLngBounds(),\r\n location = new google.maps.LatLng(lat, lng);\r\n\r\n bounds.extend(location);\r\n bounds.extend(closestMarker.getPosition());\r\n\r\n settings.map.view.fitBounds(bounds);\r\n\r\n if (settings.map.view.getZoom() > settings.map.maxZoom) {\r\n settings.map.view.setZoom(settings.map.maxZoom);\r\n }\r\n }\r\n\r\n /**\r\n * @function onMapClick\r\n * Fired when the google map is clicked\r\n */\r\n function onMapClick() {\r\n settings.map.infoWindow.close();\r\n }\r\n\r\n /**\r\n * @function onCheckZoom\r\n * Checks the bounds of the map and prevents the user from leaving the country\r\n */\r\n function onCheckZoom() {\r\n if (settings.map.view.getZoom() < settings.map.minZoom) {\r\n settings.map.view.setZoom(settings.map.minZoom);\r\n }\r\n\r\n resetListResults();\r\n }\r\n\r\n /**\r\n * @function clusterinEnd\r\n * Fired when the map has finished clustering markers\r\n */\r\n function onUpdateResults(resultListSize) {\r\n settings.resultListSize = resultListSize || settings.resultListChunks;\r\n calculateCenter();\r\n\r\n // Get IDs of visible (unloaded) markers\r\n var ids = _.reduce(settings.locations.markers, function (list, marker) {\r\n var visible = marker.getMap() && settings.map.view.getBounds().contains(marker.getPosition()),\r\n loaded = !!marker.data.ProviderName;\r\n return visible ? list.concat(marker.data.Id) : list;\r\n }, [], this);\r\n\r\n // No results\r\n if (!ids.length) {\r\n $el(settings.el.resultsList).html('').removeClass('is-visible');\r\n return loadList(allLocations);\r\n }\r\n\r\n filteredLocations = _.filter(allLocations, function (item) {\r\n var match = false;\r\n _.each(ids, function (id) {\r\n if (item.Id === id) match = true;\r\n });\r\n return match;\r\n });\r\n loadList(filteredLocations);\r\n\r\n setLoadingState(false);\r\n }\r\n\r\n /**\r\n * @function showLocation\r\n * @param lat (number)\r\n * @param lng (number)\r\n * Focus selected location on map, at provided lat + long coords\r\n */\r\n function showLocation(lat, lng, id) {\r\n settings.map.view.setCenter(new google.maps.LatLng(lat, lng));\r\n\r\n showInfoWindow(id);\r\n\r\n if (settings.map.view.getZoom() < settings.map.maxZoom) {\r\n settings.map.view.setZoom(settings.map.maxZoom);\r\n }\r\n }\r\n\r\n function toggle(e) {\r\n e.preventDefault();\r\n\r\n settings.toggleState = $wrap.attr('data-state') === 'map' ? 'list' : 'map';\r\n $wrap.attr('data-state', settings.toggleState);\r\n\r\n $('html,body').animate({scrollTop: $el(settings.el.mapSearchSection).offset().top}, 300);\r\n\r\n // init events\r\n fitBoundsToMarkers();\r\n resetListResults();\r\n }\r\n\r\n function filterState() {\r\n var value = $el(settings.el.filter).val();\r\n // Clear the find address\r\n if (currentAction !== 'address_submit') {\r\n $el(settings.el.address).val('');\r\n }\r\n\r\n currentAction = 'filter_state';\r\n\r\n\r\n // show all markers and return\r\n if (value === 'ALL') {\r\n $.each(settings.locations.markers, function () {\r\n this.setMap(settings.map.view);\r\n this.setVisible(true);\r\n });\r\n } else {\r\n // show filtered markers\r\n $.each(settings.locations.markers, function () {\r\n if (value !== this.data.State) {\r\n this.setMap(null);\r\n this.setVisible(false);\r\n } else {\r\n this.setMap(settings.map.view);\r\n this.setVisible(true);\r\n }\r\n });\r\n }\r\n\r\n onUpdateResults();\r\n fitBoundsToMarkers();\r\n currentAction = null;\r\n }\r\n\r\n function updateFixedMenu() {\r\n if (!isMobile()) {\r\n return $el(settings.el.mobileMenu).css({position: \"relative\", \"top\": \"initial\"});\r\n }\r\n\r\n var currentScroll = $(document).scrollTop(),\r\n offset = $el(settings.el.mapSearchSection).offset().top + $el(settings.el.mapSearchSection).outerHeight(),\r\n menuHeight = $el(settings.el.mobileMenu).outerHeight(),\r\n retailerHeight = $wrap.outerHeight();\r\n\r\n var length;\r\n if (settings.toggleState === 'map') {\r\n length = $el(settings.el.map).outerHeight();\r\n }\r\n else length = $el(settings.el.results).outerHeight();\r\n\r\n if (currentScroll >= (offset + length - menuHeight)) {\r\n var top = retailerHeight - menuHeight;\r\n $el(settings.el.mobileMenu).css({position: \"absolute\", \"top\": top});\r\n } else if (currentScroll >= offset) {\r\n $el(settings.el.mobileMenu).css({position: \"fixed\", \"top\": \"0\"});\r\n } else {\r\n $el(settings.el.mobileMenu).css({position: \"absolute\", \"top\": \"initial\"});\r\n }\r\n }\r\n\r\n function resize() {\r\n var mobile = isMobile();\r\n\r\n updateFixedMenu();\r\n\r\n if (mobile === settings.mobile) {\r\n return;\r\n }\r\n else {\r\n settings.mobile = mobile;\r\n }\r\n\r\n onUpdateResults();\r\n }\r\n\r\n __construct();\r\n return {\r\n 'setLocations': setLocations\r\n };\r\n };\r\n\r\n w.THF = w.THF || {};\r\n w.THF.Interface = w.THF.Interface || {};\r\n w.THF.Interface.Map = Map;\r\n w.THF.Interface.MapReady = false;\r\n})(jQuery, window, document);"]}