{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./cartridges/app_where_to_buy/cartridge/client/default/js/storeLocator.js","webpack:///./cartridges/app_where_to_buy/cartridge/client/default/js/storeLocator/storeLocator.js","webpack:///./sfra/cartridges/app_storefront_base/cartridge/client/default/js/util.js"],"names":[],"mappings":";QAAA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;;QAEA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;;;QAGA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;QACA,0CAA0C,gCAAgC;QAC1E;QACA;;QAEA;QACA;QACA;QACA,wDAAwD,kBAAkB;QAC1E;QACA,iDAAiD,cAAc;QAC/D;;QAEA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA,yCAAyC,iCAAiC;QAC1E,gHAAgH,mBAAmB,EAAE;QACrI;QACA;;QAEA;QACA;QACA;QACA,2BAA2B,0BAA0B,EAAE;QACvD,iCAAiC,eAAe;QAChD;QACA;QACA;;QAEA;QACA,sDAAsD,+DAA+D;;QAErH;QACA;;;QAGA;QACA;;;;;;;;;;;;;AClFa;;AAEb,qBAAqB,mBAAO,CAAC,4FAAW;;AAExC;AACA,mBAAmB,mBAAO,CAAC,2HAA6B;AACxD,CAAC;;;;;;;;;;;;;ACND;;AAEa;;AAEb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;;AAEA;AACA,KAAK;AACL;;AAEA;AACA;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D,gBAAgB;AAC3E,KAAK;AACL;;AAEA;AACA;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,0F;AACA,SAAS;AACT;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,0F;AACA,SAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe,OAAO;AACtB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe,OAAO;AACtB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,iBAAiB;;AAEjB;AACA;AACA;AACA,iBAAiB;;AAEjB;AACA;AACA;;AAEA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,aAAa;;AAEb;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;;AAET;;AAEA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB;AACA;AACA;;AAEA;AACA;AACA,0BAA0B,4CAA4C;AACtE;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB;AACA;AACA;;AAEA;AACA;AACA,0BAA0B,iBAAiB;AAC3C;AACA;AACA,mCAAmC,0CAA0C;AAC7E;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA,WAAW,YAAY;AACvB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;;AAErB,0DAA0D;;AAE1D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;;;;;;;;;;;;ACtxBa;;AAEb;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,SAAS;AACT;AACA","file":"default/js/storeLocator.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 = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./cartridges/app_where_to_buy/cartridge/client/default/js/storeLocator.js\");\n","'use strict';\n\nvar processInclude = require('base/util');\n\n$(document).ready(function () {\n processInclude(require('./storeLocator/storeLocator'));\n});\n","/* globals google */\n\n'use strict';\n\nvar features = JSON.parse(document.querySelector('body').dataset.features);\nvar storeLocatorViewportCenterString = features.storeLocatorViewportCenter;\nvar storeLocatorUnitTranslation = features.storeLocatorUnitTranslation ? features.storeLocatorUnitTranslation : null;\nvar $storeLocator = $('#store-locator');\n// default US lat and long\nvar map;\nvar markers = [];\nvar defaultLat = 37.09024;\nvar defaultLong = -95.712891;\nvar latlng;\nvar distanceUnit = $storeLocator.data('distanceunit');\n\n/**\n * Check if string is json\n * @param {string} str - string to check\n * @returns {boolean} if it's a string or no\n */\nfunction isJsonString(str) {\n try {\n JSON.parse(str);\n } catch (e) {\n return false;\n }\n return true;\n}\n\nif (isJsonString(storeLocatorViewportCenterString)) {\n var storeLocatorViewportCenterJson = JSON.parse(storeLocatorViewportCenterString);\n try {\n if (storeLocatorViewportCenterJson.lat && storeLocatorViewportCenterJson.long) {\n defaultLat = parseFloat(JSON.parse(storeLocatorViewportCenterString).lat);\n defaultLong = parseFloat(JSON.parse(storeLocatorViewportCenterString).long);\n }\n } catch (e) {\n console.error('check the default lat and long preference values, make sure they can be parsed to a float value')\n }\n}\n\nvar mapOptions = {\n gestureHandling: 'cooperative',\n zoom: 9\n};\n\n/**\n * appends params to a url\n * @param {string} url - Original url\n * @param {Object} params - Parameters to append\n * @returns {string} result url with appended parameters\n */\nfunction appendToUrl(url, params) {\n var newUrl = url;\n newUrl += (newUrl.indexOf('?') !== -1 ? '&' : '?') + Object.keys(params).map(function (key) {\n return key + '=' + encodeURIComponent(params[key]);\n }).join('&');\n\n return newUrl;\n}\n\n/**\n * Inits events for code rendered after the ajax\n */\nfunction initControls() {\n var $storeCard = $storeLocator.find('.store-locator-container .results-panel .store-card');\n\n $storeLocator.find('.update-location-btn').on('click', function () {\n $storeLocator.find('.results-panel').removeClass('js-show').addClass('js-hide');\n $storeLocator.find('.search-form').removeClass('js-hide').addClass('js-show');\n $storeLocator.find('.results-only, .map-footer').removeClass('js-active');\n });\n\n $storeLocator.find('.btn-map-view').on('click', function () {\n if ($(this).is('.js-off')) {\n $storeLocator.find('.btn-list-view').addClass('js-off');\n $(this).removeClass('js-off');\n $storeLocator.find('.map-canvas').addClass('js-show');\n drawMap();\n }\n });\n\n $storeLocator.find('.btn-list-view').on('click', function () {\n if ($(this).is('.js-off')) {\n $storeLocator.find('.btn-map-view').addClass('js-off');\n $(this).removeClass('js-off');\n $storeLocator.find('.map-canvas').removeClass('js-show');\n }\n });\n\n $storeLocator.find('.info-trigger').each(function () {\n $(this).find('.store-info-trigger').on('click', function (event) {\n event.preventDefault();\n if ($(this).parents('.store-card').find('.store-info').is('.js-active')) {\n $(this).removeClass('js-active');\n $(this).parents('.store-card').find('.store-info').removeClass('js-active');\n } else {\n $(this).addClass('js-active');\n $(this).parents('.store-card').find('.store-info').addClass('js-active');\n }\n });\n });\n\n $storeCard.find('.map-marker, .store-details-l1').on('click', (function () {\n var $storeCardParent = $(this).parents('.store-card');\n var storeIndex = $storeCardParent.data('storeindex') - 1;\n\n google.maps.event.trigger(markers[storeIndex], 'click');\n }));\n}\n\n/**\n * Renders the results of the search and updates the map\n * @param {Object} data - Response from the server\n */\nfunction updateStoresResults(data) {\n var $resultsDiv = $('.results');\n var $mapDiv = $('.map-canvas');\n var hasResults = data.stores.length > 0;\n\n if (!hasResults) {\n $('.store-locator-no-results').show();\n } else {\n $('.store-locator-no-results').hide();\n }\n\n $resultsDiv.empty()\n .data('has-results', hasResults)\n .data('radius', data.radius)\n .data('search-key', data.searchKey);\n\n $mapDiv.attr('data-locations', data.locations);\n\n $storeLocator.find('.results-panel').addClass('js-show').removeClass('js-hide');\n $storeLocator.find('.search-form').addClass('js-hide').removeClass('js-show');\n\n if (data.storesResultsHtml) {\n $resultsDiv.append(data.storesResultsHtml);\n $storeLocator.find('.map-showing-note .store-count').html(data.stores.length);\n $storeLocator.find('.locator-radius .radius').val(data.radius);\n $storeLocator.find('.locator-radius .radius option[value=\"' + data.radius + '\"]').prop('selected', true);\n }\n\n if ($mapDiv.data('has-google-api')) {\n drawMap(data);\n } else {\n $('.store-locator-no-apiKey').show();\n }\n\n initControls();\n trackGtmStoreResults(hasResults, data.stores.length);\n}\n\n/**\n * \n * @param {boolean} hasResults \n * @param {number} numberOfResults \n */\nfunction trackGtmStoreResults(hasResults, numberOfResults) {\n //interacting with Store locator widget\n var dataLayer = window.dataLayer || [];\n dataLayer.push({\n 'event': 'find_a_nearby_store',\n 'num_search_results': numberOfResults,\n 'location_search_keyword': \"\",\n 'page_name': $('title').html(),\n 'page_location': window.location.href,\n 'hit_timetamp': new Date().toLocaleTimeString([], { hour12: false })\n });\n}\n\n/**\n * Enables user to search a map area after dragging the map and changing the center\n * @param {Object} latLng - map center data from Google Maps API\n */\nfunction searchAfterDrag(latLng) {\n var radius = $storeLocator.find('.radius').val();\n var url = $storeLocator.find('.radius').data('action-url');\n var urlParams = {\n radius: radius,\n lat: latLng.lat(),\n long: latLng.lng()\n };\n\n url = appendToUrl(url, urlParams);\n var dialog = $(this).closest('.in-store-inventory-dialog');\n var spinner = dialog.length ? dialog.spinner() : $.spinner();\n spinner.start();\n $.ajax({\n url: url,\n type: 'get',\n dataType: 'json',\n success: function (data) {\n spinner.stop();\n updateStoresResults(data);\n $('.select-store').prop('disabled', true);\n }\n });\n}\n\n/**\n * Destroys button for updating markers based on new map center\n */\nfunction destroyMapUpdateBtn() {\n $('.map-canvas-outer .search-area-btn').remove();\n}\n\n/**\n * Creates button for updating markers based on new map center\n * @param {Object} latLng - map center data from Google Maps API\n */\nfunction createMapUpdateBtn(latLng) {\n var $mapCanvas = $storeLocator.find('.map-canvas');\n var btnText = $mapCanvas.data('searchthisarea');\n\n $mapCanvas.parents('.map-canvas-outer').append('');\n\n $('.map-canvas-outer .search-area-btn').on('click', function () {\n searchAfterDrag(latLng);\n destroyMapUpdateBtn();\n });\n}\n\n/**\n * Uses google maps api to render a map\n * @param {Object} latLng - latLng object from Google Maps API\n * @param {string} postalCode - postal code\n * @param {Object} data - search data\n */\nfunction buildMap(latLng, postalCode, data) {\n var marker;\n var activeMarker;\n var activeVal;\n var $results = $('.results');\n var latLngOrg = latLng;\n mapOptions.center = latLng;\n map = new google.maps.Map($storeLocator.find('.map-canvas')[0], mapOptions);\n var infowindow = new google.maps.InfoWindow();\n var searchKey = data.searchKey;\n\n if (postalCode) {\n $storeLocator.find('.showing-postalcode').html(postalCode);\n if(data.stores && data.stores.length>0){\n $storeLocator.find('.map-showing-note .store-count').html(data.stores.length); \n }else{\n $storeLocator.find('.map-showing-note .store-count').html(0);\n }\n $storeLocator.find('.results-only, .map-footer').addClass('js-active');\n }else{\n $storeLocator.find('.showing-postalcode').html(searchKey.cityName);\n if(data.stores && data.stores.length>0){\n $storeLocator.find('.map-showing-note .store-count').html(data.stores.length); \n }else{\n $storeLocator.find('.map-showing-note .store-count').html(0);\n }\n $storeLocator.find('.results-radius-refine .locator-radius').addClass('d-none');\n }\n\n var mapdiv = $storeLocator.find('.map-canvas').attr('data-locations');\n mapdiv = JSON.parse(mapdiv);\n\n var bounds = new google.maps.LatLngBounds();\n\n var maxZindex = google.maps.Marker.MAX_ZINDEX;\n\n // Customized google map marker icon with svg format\n var markerDefault = {\n path: google.maps.SymbolPath.CIRCLE,\n fillColor: '#ffffff',\n fillOpacity: 1,\n scale: 17,\n strokeColor: '#004987',\n strokeWeight: 1.3,\n labelOrigin: new google.maps.Point(0, 0)\n };\n\n var markerActive = {\n path: google.maps.SymbolPath.CIRCLE,\n fillColor: '#004987',\n fillOpacity: 1,\n scale: 17,\n strokeColor: '#004987',\n strokeWeight: 1.3,\n labelOrigin: new google.maps.Point(0, 0)\n };\n\n /**\n * Settings for default marker label\n * @param {string} labelVal - label value\n * @returns {Object} settings and their values\n */\n function labelDefault(labelVal) {\n return {\n text: labelVal.toString(),\n color: '#004987',\n fontSize: '16px'\n };\n }\n\n /**\n * Settings for active marker label\n * @param {string} labelVal - label value\n * @returns {Object} settings and their values\n */\n function labelActive(labelVal) {\n return {\n text: labelVal.toString(),\n color: '#ffffff',\n fontSize: '16px'\n };\n }\n\n if (mapdiv && mapdiv.length !== 0) {\n Object.keys(mapdiv).forEach(function (key) {\n var item = mapdiv[key];\n var label = parseInt(key, 10) + 1;\n var storeLocation = new google.maps.LatLng(item.latitude, item.longitude);\n var storeID = item.ID;\n var $resultItem = $('.results #' + storeID);\n var resultsPos = $resultItem.position().top;\n\n marker = new google.maps.Marker({\n position: storeLocation,\n map: map,\n title: item.name,\n icon: markerDefault,\n label: labelDefault(label)\n });\n\n marker.addListener('click', function () {\n if (activeMarker && activeVal) {\n activeMarker.setIcon(markerDefault);\n activeMarker.setLabel(labelDefault(activeVal));\n activeMarker.setZIndex(1);\n }\n\n this.setIcon(markerActive);\n this.setLabel(labelActive(label));\n this.setZIndex(5);\n\n // update the value of activeMarker\n activeMarker = this;\n activeVal = label;\n\n infowindow.setOptions({\n content: item.infoWindowHtml\n });\n\n infowindow.open({\n anchor: this,\n map\n });\n\n destroyMapUpdateBtn();\n $results.find('.store-card').removeClass('js-active');\n $resultItem.addClass('js-active');\n\n $('.results').animate(\n {\n scrollTop: resultsPos\n },\n 'slow'\n );\n });\n\n markers.push(marker);\n\n // Create a minimum bound based on a set of storeLocations\n bounds.extend(marker.position);\n\n var mapCenter = map.getCenter();\n var markerLatLng = marker.getPosition();\n if(postalCode){\n var distance = google.maps.geometry.spherical.computeDistanceBetween(mapCenter, markerLatLng);\n }\n var distanceKMeters = (distance / 1000).toFixed(1);\n var distanceMiles = (distance * 0.000621371).toFixed(1);\n var distanceUnitTranslation;\n var distanceFrom;\n if (storeLocatorUnitTranslation) {\n distanceUnitTranslation = storeLocatorUnitTranslation;\n if (distanceUnit === 'km') {\n distanceFrom = distanceKMeters + ' ' + distanceUnitTranslation;\n }\n if (distanceUnit === 'mi') {\n distanceFrom = distanceMiles + ' ' + distanceUnitTranslation;\n }\n } else {\n if (distanceUnit === 'km' && postalCode) {\n distanceUnitTranslation = 'Kilometers';\n distanceFrom = distanceKMeters + ' ' + distanceUnitTranslation;\n }\n if (distanceUnit === 'mi' && postalCode) {\n distanceUnitTranslation = 'Miles';\n distanceFrom = distanceMiles + ' ' + distanceUnitTranslation;\n }\n }\n\n $('[data-store-id=\"' + storeID + '\"]').find('.distance').html(distanceFrom);\n });\n\n // watch for zoom change and prevent auto zooming in too close when there is only a few results that are near to each other\n google.maps.event.addListener(map, 'zoom_changed', function () {\n var maxZoom = 13;\n var zoomChangeBoundsListener = google.maps.event.addListener(map, 'bounds_changed', function (event) {\n if (this.getZoom() > maxZoom && this.initialZoom == true) {\n this.setZoom(maxZoom);\n this.initialZoom = false;\n }\n google.maps.event.removeListener(zoomChangeBoundsListener);\n });\n });\n\n map.initialZoom = true;\n\n // Fit the all the store marks in the center of a minimum bounds when any store has been found.\n map.fitBounds(bounds);\n } else {\n // No Results, so center map on original search and set zoom on empty map\n if (!latLngOrg) {\n latLngOrg = new google.maps.LatLng(defaultLat, defaultLong)\n }\n map.setCenter(latLngOrg);\n map.setZoom(11);\n }\n\n google.maps.event.addListener(map, 'idle', function () {\n if (!this.get('dragging') && this.get('oldCenter') && this.get('oldCenter') !== this.getCenter()) {\n var newCenter = this.getCenter();\n createMapUpdateBtn(newCenter);\n }\n\n if (!this.get('dragging')) {\n this.set('oldCenter', this.getCenter());\n }\n });\n\n google.maps.event.addListener(map, 'dragstart', function () {\n this.set('dragging', true);\n destroyMapUpdateBtn();\n });\n\n google.maps.event.addListener(map, 'dragend', function () {\n this.set('dragging', false);\n });\n\n google.maps.event.addListener(map, 'zoom_changed', function () {\n destroyMapUpdateBtn();\n });\n}\n\n/**\n * Convert postal code to lat/long using Google Geocoder\n * @param {string} postalCode - postal code\n * @param {Object} data - search data\n */\nfunction postalCodeSearch(postalCode, data) {\n var latLng = null;\n\n if (postalCode) {\n var geocoder = new google.maps.Geocoder();\n geocoder.geocode({ address: postalCode + \", \" + data.country }, function (results, status) {\n if (status == google.maps.GeocoderStatus.OK) {\n var latitude = results[0].geometry.location.lat();\n var longitude = results[0].geometry.location.lng();\n latLng = new google.maps.LatLng(latitude, longitude);\n } else {\n console.error('Geocoder failed due to: ' + status);\n }\n\n buildMap(latLng, postalCode, data);\n });\n }\n}\n\n/**\n * Convert lat/long using to postal code using Google Geocoder\n * @param {Object} latLng - latLng object from Google Maps API\n * @param {Object} data - search data\n */\nfunction latLongSearch(latLng, data) {\n var postalCode = null;\n\n if (latLng) {\n var geocoder = new google.maps.Geocoder();\n geocoder.geocode({ latLng: latLng }, function (results, status) {\n if (status == google.maps.GeocoderStatus.OK) {\n if (results[0]) {\n for (var j = 0; j < results[0].address_components.length; j++) {\n if (results[0].address_components[j].types[0] == 'postal_code') {\n postalCode = results[0].address_components[j].short_name;\n }\n }\n }\n } else {\n console.error('Geocoder failed due to: ' + status);\n }\n\n buildMap(latLng, postalCode, data);\n });\n }\n}\n\n/**\n * Draws default map, if there is no GeoLocation Data\n */\nfunction drawNoGeolocation() {\n $.spinner().start();\n // Init U.S. Map in the center of the viewport\n latlng = new google.maps.LatLng(defaultLat, defaultLong);\n mapOptions.center = latlng;\n mapOptions.zoom = 4;\n\n map = new google.maps.Map($storeLocator.find('.map-canvas')[0], mapOptions);\n $.spinner().stop();\n}\n\n/**\n * Checks for Geolocation Error\n * @param {Object} error - string to check\n */\nfunction showError(error) {\n switch (error.code) {\n case error.PERMISSION_DENIED:\n $.spinner().stop();\n console.warn('User denied the request for Geolocation.');\n $storeLocator.find('.detect-location').prop('disabled', true);\n $storeLocator.find('.detect-location-label').text($storeLocator.find('.detect-location-label').data('disabledmsg'));\n break;\n case error.POSITION_UNAVAILABLE:\n $.spinner().stop();\n console.warn('Location information is unavailable.');\n break;\n case error.TIMEOUT:\n $.spinner().stop();\n console.warn('The request to get user location timed out.');\n break;\n default:\n case error.UNKNOWN_ERROR:\n $.spinner().stop();\n console.warn('An unknown geolocation error occurred.');\n break;\n }\n\n drawNoGeolocation();\n}\n\n/**\n * Uses google maps api to render a map for page load\n */\nfunction mapStart() {\n drawNoGeolocation();\n if (navigator.geolocation) {\n // Init Map in the center of current geolocation\n navigator.geolocation.getCurrentPosition(function (position) {\n $.spinner().start();\n defaultLat = position.coords.latitude;\n defaultLong = position.coords.longitude;\n\n latlng = new google.maps.LatLng(defaultLat, defaultLong);\n mapOptions.center = latlng;\n\n map = new google.maps.Map($storeLocator.find('.map-canvas')[0], mapOptions);\n $.spinner().stop();\n }, showError);\n }\n}\n\n/**\n * Sets up map render based on search key type\n * @param {Object} data - data returned from call to controller\n */\nfunction drawMap(data) {\n var $results = $('.results');\n $results.find('.store-card').removeClass('js-active');\n var searchKey = data.searchKey;\n var postalCode;\n\n if (searchKey && searchKey.postalCode) {\n postalCode = searchKey.postalCode;\n postalCodeSearch(postalCode, data);\n } else if (searchKey && searchKey.lat && searchKey.long) {\n latlng = new google.maps.LatLng(searchKey.lat, searchKey.long);\n latLongSearch(latlng, data);\n } else {\n buildMap(latlng, postalCode, data);\n }\n}\n\n/**\n * Search for stores with new zip code\n * @param {HTMLElement} element - the target html element\n * @returns {boolean} false to prevent default event\n */\nfunction search(element) {\n var dialog = element.closest('.in-store-inventory-dialog');\n var spinner = dialog.length ? dialog.spinner() : $.spinner();\n spinner.start();\n var $form = element.closest('.store-locator');\n var radius = $('.results').data('radius');\n var url = $form.attr('action');\n var urlParams = { radius: radius};\n\n var payload = $form.is('form') ? $form.serialize() : { postalCode: $form.find('[name=\"locations\"]').val() };\n\n url = appendToUrl(url, urlParams);\n\n $.ajax({\n url: url,\n type: $form.attr('method'),\n data: payload,\n dataType: 'json',\n success: function (data) {\n spinner.stop();\n updateStoresResults(data);\n $('.select-store').prop('disabled', true);\n }\n });\n return false;\n}\n\n/**\n * Scrolls to the #store-locator section if it exists in the URL hash.\n * This function should be called when the DOM is fully loaded.\n */\n\nwindow.onload = function () {\n scrollToStoreLocator();\n handleStoreLocatorFieldError();\n};\n\nfunction scrollToStoreLocator() {\n if (window.location.hash === '#store-locator') {\n var storeLocatorElement = $('#store-locator');\n if (storeLocatorElement.length > 0) {\n window.scrollTo({\n top: storeLocatorElement.offset().top,\n behavior: 'smooth'\n });\n }\n }\n}\n\nfunction handleStoreLocatorFieldError() {\n var container = $('.store-locator-container');\n var invalidFeedbackStoreLocator = container.find('.invalid-feedback-storeLocator');\n var invalidFeedback = container.find('.invalid-feedback');\n\n // Target the button by its type and class attributes\n var button = container.find('button[type=\"submit\"].btn-storelocator-search');\n\n // Add a click event listener to the button\n button.on('click', function () {\n // Show the store locator feedback and hide the general invalid feedback\n invalidFeedbackStoreLocator.removeClass('d-none').addClass('d-block');\n invalidFeedback.removeClass('d-block').addClass('d-none');\n });\n}\n\nmodule.exports = {\n init: function () {\n if ($storeLocator.find('.map-canvas').data('has-google-api')) {\n mapStart();\n } else {\n $storeLocator.find('.store-locator-no-apiKey').show();\n }\n\n if (!$storeLocator.find('.results').data('has-results')) {\n $storeLocator.find('.store-locator-no-results').show();\n }\n\n initControls();\n },\n\n detectLocation: function () {\n // clicking on detect location.\n $('.detect-location').on('click', function () {\n $.spinner().start();\n if (!navigator.geolocation) {\n $.spinner().stop();\n return;\n }\n\n navigator.geolocation.getCurrentPosition(function (position) {\n var $detectLocationButton = $('.detect-location');\n var url = $detectLocationButton.data('action');\n var radius = $('.results').data('radius');\n var urlParams = {\n radius: radius,\n lat: position.coords.latitude,\n long: position.coords.longitude\n };\n\n url = appendToUrl(url, urlParams);\n $.ajax({\n url: url,\n type: 'get',\n dataType: 'json',\n success: function (data) {\n $.spinner().stop();\n updateStoresResults(data);\n $('.select-store').prop('disabled', true);\n }\n });\n }, showError);\n });\n },\n\n search: function () {\n $storeLocator.find('.store-locator-container form.store-locator').on('submit', function (e) {\n e.preventDefault();\n search($(this));\n });\n $storeLocator.find('.store-locator-container .btn-storelocator-search[type=\"button\"]').on('click', function (e) {\n e.preventDefault();\n search($(this));\n });\n },\n\n changeRadius: function () {\n $storeLocator.find('.radius').change(function () {\n var radius = $(this).val();\n var searchKeys = $('.results').data('search-key');\n var url = $(this).data('action-url');\n var urlParams = {};\n\n if (searchKeys.postalCode) {\n urlParams = {\n radius: radius,\n locations: searchKeys.postalCode\n };\n } else if (searchKeys.lat && searchKeys.long) {\n urlParams = {\n radius: radius,\n lat: searchKeys.lat,\n long: searchKeys.long\n };\n }\n\n url = appendToUrl(url, urlParams);\n var dialog = $(this).closest('.in-store-inventory-dialog');\n var spinner = dialog.length ? dialog.spinner() : $.spinner();\n spinner.start();\n $.ajax({\n url: url,\n type: 'get',\n dataType: 'json',\n success: function (data) {\n destroyMapUpdateBtn();\n spinner.stop();\n updateStoresResults(data);\n if (searchKeys.lat && searchKeys.long) {\n map.setCenter(new google.maps.LatLng(searchKeys.lat, searchKeys.long));\n }\n $('.select-store').prop('disabled', true);\n }\n });\n });\n },\n\n selectStore: function () {\n $('.store-locator-container').on('click', '.select-store', (function (e) {\n e.preventDefault();\n var selectedStore = $(':checked', '.results-panel .results');\n var data = {\n storeID: selectedStore.val(),\n searchRadius: $('#radius').val(),\n searchPostalCode: $('.results').data('search-key').postalCode,\n storeDetailsHtml: selectedStore.siblings('label').find('.store-details').html(),\n event: e\n };\n\n $('body').trigger('store:selected', data);\n }));\n },\n\n updateSelectStoreButton: function () {\n $('body').on('change', '.select-store-input', (function () {\n $('.select-store').prop('disabled', false);\n }));\n },\n\n resize: function () {\n $(window).smartresize(function () {\n if ($storeLocator.find('.results-panel').is('.js-show')) {\n drawMap();\n }\n });\n }\n};\n","'use strict';\n\nmodule.exports = function (include) {\n if (typeof include === 'function') {\n include();\n } else if (typeof include === 'object') {\n Object.keys(include).forEach(function (key) {\n if (typeof include[key] === 'function') {\n include[key]();\n }\n });\n }\n};\n"],"sourceRoot":""}