{"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('<button class=\"search-area-btn btn btn-primary\">' + btnText + '</button>');\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":""}