{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///external \"jQuery\"","webpack:///./../SharedSiteCode/Scripts/locations.js"],"names":["$","setTimeout","allowAutoFetch","loadMapScript","newSize","navigator","pos","lat","position","lng","longitude","locWorker","operation","console","$map","setupMap","setupLocationSearch","loadMoreBtn","document","pageType","nextpage","parseInt","this","dataset","listHtml","resp","appendLocationsList","google","initMap","script","window","mapEl","mapInfoWindow","map","center","zoom","mapId","markersToShow","i","locationsObject","loc","latLng","markerElement","marker","title","centerAndZoom","minNumMarkersToShow","Math","bounds","markerPos","zipForm","zipInput","e","geocoder","geoQuery","address","componentRestrictions","country","status","results","stateName","ourStates","location","redirecting","midListP","$widgetArea","Foundation","index","clearLocationsList","$resultsHeading","$resultsErrHeading","isPartialLocationMatch","phoneNo","searchReady","name","market","nameMobile","stateCodes","titleHtml","phoneNumber","contactUrl","pictureInnerHtml","variants","urlSplits","extension","getImageMimeType","result","Worker","msg","locStr","phone","test","pageSetup","googleMapsReady","mobileContainer","containerRect","containerBottom","windowHeight"],"mappings":"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","file":"js/locations.min.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/css\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 60);\n","module.exports = jQuery;","var googleMapsReady = false;\r\nvar searchReady = false;\r\nvar geocoder = null;\r\nvar map;\r\nvar mapInfoWindow;\r\nvar markersToShow;\r\nlet allowAutoFetch = false; // init to false\r\nvar debug = false;\r\n\r\n// spawn worker to do some of the work off-thread\r\nlet locWorker = new Worker(\"/js/locations-worker.min.js\");\r\n\r\nlocWorker.onmessage = function (msg) {\r\n if (!msg.isTrusted) {\r\n console.log(\"Main thread received message from untrusted source.\");\r\n console.log(msg);\r\n return;\r\n }\r\n if (debug) {\r\n console.log(\"message from locWorker:\");\r\n console.log(msg.data);\r\n }\r\n\r\n switch (msg.data.operation) {\r\n case \"locParsed\":\r\n window.locationsObject = msg.data.locations;\r\n if ($(\"#view-map\").is(\":visible\")) {\r\n setupMap();\r\n }\r\n break;\r\n case \"locPageHtml\":\r\n if (msg.data.clearPrevious) {\r\n clearLocationsList();\r\n }\r\n appendLocationsList(msg.data.pageHtml);\r\n\r\n var loadMoreBtn = document.getElementById(\"load-more\");\r\n if (loadMoreBtn != null) {\r\n // update Load More button\r\n if (msg.data.hasMore) {\r\n loadMoreBtn.style.display = \"flex\";\r\n loadMoreBtn.dataset.nextPage = parseInt(loadMoreBtn.dataset.nextPage) + 1;\r\n } else {\r\n loadMoreBtn.style.display = \"none\";\r\n loadMoreBtn.dataset.nextPage = -1;\r\n }\r\n }\r\n break;\r\n\r\n default:\r\n appendLocationsList(null);\r\n console.log(\r\n \"Main thread received unknown operation from locations worker: \" +\r\n msg.data.operation\r\n );\r\n console.log(msg.data);\r\n }\r\n};\r\n\r\nfunction clearLocationsList(html) {\r\n $(\"#locations-list\").html(\"\");\r\n $(\"#locations-mobile-list\").html(\"\");\r\n}\r\nfunction appendLocationsList(html) {\r\n if (html) {\r\n $(\"#locations-list\").append(html);\r\n $(\"#locations-mobile-list\").append(html);\r\n }\r\n\r\n setTimeout(() => {\r\n allowAutoFetch = true;\r\n }, 100); //delay allow fetch until after content append scroll event to prevent trigger loop when at bottom of page\r\n}\r\n\r\n// parse json taking a surprising amount of time, so doing it off-thread\r\nlocWorker.postMessage({\r\n operation: \"init\",\r\n locStr: window.locationsJsonString,\r\n pageType: window.pageType,\r\n phone: document.querySelector(\"#top .phone-holder\").textContent.trim(),\r\n contactUrl:\r\n document.querySelector(\"title\").textContent.indexOf(\"Ugly\") == -1\r\n ? \"/contact/\"\r\n : \"/contact-us/\",\r\n});\r\n\r\nif (/complete|interactive|loaded/.test(document.readyState)) {\r\n // DOM is already ready\r\n pageSetup();\r\n} else {\r\n document.addEventListener(\"DOMContentLoaded\", pageSetup);\r\n}\r\n\r\nfunction pageSetup() {\r\n if ($(\"#view-map\").is(\":visible\")) {\r\n // load map script if on tablet or larger\r\n loadMapScript();\r\n } else {\r\n // prepare to load script if window is expanded to larger breakpoint\r\n $(window).on(\"changed.zf.mediaquery\", function (event, newSize, oldSize) {\r\n if (newSize == \"large\" || newSize == \"xlarge\") {\r\n loadMapScript();\r\n $(window).off(\"changed.zf.mediaquery\");\r\n }\r\n });\r\n }\r\n\r\n navigator.geolocation.getCurrentPosition(\r\n function (position) {\r\n var pos = {\r\n lat: position.coords.latitude,\r\n lng: position.coords.longitude,\r\n };\r\n\r\n // sort markets by distance from geolocated position\r\n if (debug)\r\n console.log(\r\n \"sorting locations by distance from \" +\r\n position.coords.latitude +\r\n \", \" +\r\n position.coords.longitude\r\n );\r\n\r\n locWorker.postMessage({ operation: \"sortLocations\", centerOn: pos });\r\n },\r\n function (error) {\r\n // geolocation error or denied\r\n console.log(\"Browser geolocation:\", error);\r\n }\r\n );\r\n\r\n $(\"#view-map\").on(\"click\", function () {\r\n var $map = $(\"#locations-map\");\r\n if (!$map.hasClass(\"initialized\")) setupMap();\r\n\r\n if ($map.hasClass(\"open\")) {\r\n $map.removeClass(\"open\");\r\n $(this).text(\"View Map\");\r\n $('.zip-container').removeClass('map-zip-container');\r\n } else {\r\n $map.addClass(\"open\");\r\n $(this).text(\"Hide Map\");\r\n $('.zip-container').addClass('map-zip-container');\r\n }\r\n });\r\n\r\n $('#zip-form input').one('focus', function () {\r\n loadMapScript(); // need the geolocator for the location search to work\r\n setupLocationSearch();\r\n });\r\n\r\n\r\n // load more button\r\n var loadMoreBtn = document.getElementById(\"load-more\");\r\n if (pageType == \"locations\") {\r\n loadMoreBtn.dataset.nextPage = 1;\r\n loadMoreBtn.addEventListener(\"click\", function () {\r\n var nextpage = parseInt(this.dataset.nextPage);\r\n var lat = loadMoreBtn.dataset.lat;\r\n var lng = loadMoreBtn.dataset.lng;\r\n\r\n if (typeof lat != 'undefined') {\r\n // ask server to sort locations based on counties\r\n $.get(`/market/?page=${nextpage}&lat=${lat}&lng=${lng}`, function (resp) {\r\n let listHtml = '';\r\n resp.pageOfMarkets.forEach(function (market) {\r\n listHtml += getMarketBlockHtml(market);\r\n });\r\n\r\n appendLocationsList(listHtml);\r\n\r\n // update Load More button\r\n if (resp.hasMore) {\r\n loadMoreBtn.dataset.nextPage = nextpage + 1;\r\n } else {\r\n loadMoreBtn.style.display = \"none\";\r\n loadMoreBtn.dataset.nextPage = -1;\r\n }\r\n }).fail(function (jqXHR, textStatus, errorThrown) {\r\n console.error(\"AJAX request failed:\", textStatus, errorThrown);\r\n appendLocationsList(null);\r\n });\r\n }\r\n else {\r\n // TODO: if we go full AJAX instead of location worker, \r\n // we'll want to get rid of this branch and always use the first one\r\n locWorker.postMessage({ operation: \"getLocPageHtml\", pageNum: nextpage });\r\n }\r\n });\r\n } else {\r\n if (loadMoreBtn != null) loadMoreBtn.style.display = \"none\";\r\n }\r\n}\r\n\r\n\r\nwindow.initMap = function () {\r\n googleMapsReady = true;\r\n setupMap();\r\n};\r\n\r\nfunction loadMapScript() {\r\n if (typeof google != 'undefined' && typeof google.maps != 'undefined') {\r\n // google maps already loaded\r\n initMap();\r\n }\r\n else {\r\n var script = document.createElement('script');\r\n script.src = `https://maps.googleapis.com/maps/api/js?key=${window.wbuh.mapKey}&libraries=places,marker&loading=async&callback=initMap`;\r\n script.async = true;\r\n document.head.appendChild(script);\r\n }\r\n}\r\n\r\nfunction setupMap() {\r\n var mapEl = document.getElementById(\"locations-map\");\r\n // already set up; we're done\r\n if (mapEl.classList.contains(\"initialized\")) return;\r\n\r\n // not ready to set up map; this will get called again when ready\r\n if (!googleMapsReady || typeof window.locationsObject == \"undefined\") return;\r\n\r\n if (pageType == \"locations\") {\r\n mapInfoWindow = new google.maps.InfoWindow();\r\n if (debug) console.log(\"initMap\");\r\n\r\n map = new google.maps.Map(mapEl, {\r\n center: { lat: 38.20365531807148, lng: -97.734375 },\r\n //zoom: defaultZoomLevel,\r\n zoom: 5,\r\n scrollwheel: false,\r\n mapTypeControl: false,\r\n mapId: \"WBUH_LOCATIONS\"\r\n });\r\n //locWorker.postMessage({ operation: 'googleMapsReady', map: map });\r\n\r\n if (debug)\r\n console.log(\"adding \" + locationsObject.length + \" markers to map\");\r\n\r\n // add markers to map; save them in an array for further operations\r\n markersToShow = setMarkers(map);\r\n\r\n // if we have a location from the browser, start there\r\n if (navigator.geolocation) {\r\n if (debug) console.log(\"getting location from brower\");\r\n\r\n navigator.geolocation.getCurrentPosition(function (position) {\r\n var pos = {\r\n lat: position.coords.latitude,\r\n lng: position.coords.longitude,\r\n };\r\n\r\n centerAndZoom(pos, map, markersToShow);\r\n });\r\n }\r\n\r\n mapEl.classList.add(\"initialized\");\r\n setupLocationSearch();\r\n }\r\n}\r\n\r\nfunction setMarkers(map) {\r\n var markersToShow = [];\r\n\r\n for (var i = 0; i < locationsObject.length; i++) {\r\n var loc = locationsObject[i];\r\n\r\n var latLng = new google.maps.LatLng(loc[\"lat\"], loc[\"lng\"]);\r\n\r\n // Create a marker element\r\n const markerElement = document.createElement('div');\r\n markerElement.innerHTML = ``;\r\n\r\n var marker = new google.maps.marker.AdvancedMarkerElement({\r\n map,\r\n position: latLng,\r\n content: markerElement,\r\n title: loc[\"name\"],\r\n });\r\n\r\n // Store additional data in the marker object\r\n marker.url = loc[\"link\"];\r\n\r\n marker.addListener(\"click\", showInfoWindow);\r\n\r\n markersToShow.push(marker);\r\n }\r\n\r\n return markersToShow;\r\n}\r\n\r\nfunction showInfoWindow() {\r\n mapInfoWindow.setContent(\r\n \"\" + this[\"title\"] + \" Details\"\r\n );\r\n mapInfoWindow.open(map, this);\r\n}\r\n\r\nfunction centerAndZoom(pos, map, markersToShow) {\r\n //$('#activeLat').val(pos.lat);\r\n //$('#activeLng').val(pos.lng);\r\n\r\n // the below process isn't perfect, but most of the time it will ensure that at least minNumMarkersToShow locations\r\n // are visible on the map, while keeping the input location centered\r\n\r\n // add the closest minNumMarkersToShow markers to a bounds object\r\n var minNumMarkersToShow = Math.min(minNumMarkersToShow, markersToShow.length);\r\n var bounds = new google.maps.LatLngBounds();\r\n for (var i = 0; i < minNumMarkersToShow; i++) {\r\n var loc = locationsObject[i];\r\n\r\n var markerPos;\r\n $.each(markersToShow, function () {\r\n markerPos = this.getPosition();\r\n if (\r\n markerPos.lat().toFixed(3) == loc.lat.toFixed(3) &&\r\n markerPos.lng().toFixed(3) == loc.lng.toFixed(3)\r\n ) {\r\n // toFixed allows for some approximation\r\n bounds.extend(markerPos);\r\n return false;\r\n }\r\n });\r\n }\r\n\r\n // make sure our center is in the bounds\r\n bounds.extend(pos);\r\n\r\n // after this, all points will be on map\r\n map.fitBounds(bounds);\r\n\r\n google.maps.event.addListenerOnce(map, \"bounds_changed\", function () {\r\n map.setCenter(pos);\r\n\r\n // treating defaultZoomLevel as the maximum zoom\r\n var defaultZoomLevel = 6;\r\n if (map.getZoom() > defaultZoomLevel) map.setZoom(defaultZoomLevel);\r\n });\r\n}\r\n\r\nfunction setupLocationSearch() {\r\n if (searchReady)\r\n return;\r\n\r\n // ZIP code search\r\n var zipForm = document.getElementById(\"zip-form\");\r\n var zipInput = document.getElementById(\"zip-code\");\r\n\r\n zipForm.addEventListener(\"submit\", function (e) {\r\n e.preventDefault();\r\n\r\n if (geocoder == null)\r\n geocoder = new google.maps.Geocoder();\r\n\r\n var geoQuery = {\r\n address: zipInput.value,\r\n componentRestrictions: {\r\n country: 'US'\r\n }\r\n };\r\n\r\n geocoder.geocode(geoQuery, function (results, status) {\r\n if (status == google.maps.GeocoderStatus.OK) {\r\n if (debug)\r\n console.log(\"got location from geolocated form submission\");\r\n\r\n // if user entered a state that we have a page for, redirect them to the state page\r\n if (results[0].types.includes('administrative_area_level_1')) { // google thinks the result is a state\r\n let redirecting = false;\r\n let stateName = results[0].address_components[0].long_name;\r\n let ourStates = $('footer .market-states a');\r\n ourStates.each(function () {\r\n if ($(this).text() == stateName) {\r\n location.href = $(this).attr('href');\r\n redirecting = true;\r\n return false;\r\n }\r\n });\r\n if (redirecting)\r\n return;\r\n }\r\n\r\n var pos = {\r\n lat: results[0].geometry.location.lat(),\r\n lng: results[0].geometry.location.lng(),\r\n };\r\n\r\n if (debug)\r\n console.log(\"sorting locations by distance from \" + pos.lat + \", \" + pos.long);\r\n\r\n // JS version working on center point of market\r\n //locWorker.postMessage({ operation: \"sortLocations\", centerOn: pos });\r\n\r\n\r\n // ask server to sort locations based on counties\r\n $.get(`/market/?page=1&lat=${pos.lat}&lng=${pos.lng}`, function (resp) {\r\n\r\n var midListP = '';\r\n if ($('#main-clone').length == 0) {\r\n var $widgetArea = $('#main');\r\n if (Foundation.mediaQuery.MediaQuery.atLeast('large'))\r\n $('#locations-list-wrapper').closest('.content').after($widgetArea.clone().attr('id', 'main-clone'));\r\n else\r\n midListP = '