{"version":3,"sources":["webpack:///webpack/bootstrap 4b14b2fe0d2f00fd3acc?6fbb*********************************************************","webpack:///./cartridges/app_bata_sfra/cartridge/client/default/js/storeLocator.js","webpack:///./cartridges/app_bata_sfra/cartridge/client/default/js/util.js?0ce9************************","webpack:///./cartridges/app_bata_sfra/cartridge/client/default/js/storeLocator/storeTemplates.js?428f**","webpack:///./cartridges/app_bata_sfra/cartridge/client/default/js/storeLocator/userPositionHelper.js?428e****","webpack:///./cartridges/app_bata_sfra/cartridge/client/default/js/storeLocator/storeLocator.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","id","loaded","modules","call","m","c","p","processInclude","$","document","ready","include","_typeof","Object","keys","forEach","key","buildCollectionPointHoursTemplate","openingHours","$daytemplate","dayOfWeek","$hoursTemplate","children","clone","result","createElement","i","length","find","html","day","combinedHours","hours","join","appendTo","fillStoreAddress","template","store","$address1","$address2","a2","a1","buildStoreMarkerPin","isClickAndCollect","isFilterByStoreBrands","controllerURL","hideStoreDetailsButton","type","typeDV","brand","brandDV","storeID","ID","storeDetailUrl","dist","dUnit","storePhone","phone","$storeInfo","data","attr","$storeNameSection","$phoneContainer","$phone","$storePCode","zipCodeForShipping","pCodePublic","name","distance","city","sCode","district","subdistrict","pCode","trim","removeClass","addClass","hoursTemplate","unescape","removeAttr","tileTemplateID","url","querySelector","content","getAttribute","$storeInfoButton","remove","storePinHtml","latitude","lat","longitude","long","storeBrand","infoWindowHtml","buildPickupPointCard","pickupPoint","$city","$distanceContainer","$storeAddress","$storeAddress2","$stateCode","codAllowed","outerHTML","showPickupPointCODAllowed","codNotAvailableMsg","setAttribute","textContent","codAllowedString","showStoresResults","stores","pins","storeList","markerTemplate","listTemplate","push","JSON","stringify","buildStoreCard","userPositionData","userGeolocation","userAddress","lastAvailableGeolocationKey","setUserPosition","navigator","permissions","coords","lng","isDefaultCenterLocation","localStorage","setItem","getUserPosition","isGeolocationSearch","getUserPositionIfAvailable","callback","success","position","query","then","state","geolocation","getCurrentPosition","parse","getItem","map","markerCluster","numberStoreToShow","storelocatorTemplateHelper","userPositionHelper","autocomplete","markers","storePins","isFilterByStoreTypes","updateStores","$storeButton","$loadMoreStoresButton","mapCanvas","mapdiv","storetypes","isAtLeastOneStoreTypeSelected","prop","isAtLeastOneMarkerVisible","clearMarkers","setMap","deleteMarkers","hasClass","infowindow","google","maps","InfoWindow","bounds","LatLngBounds","storeLocation","marker","item","LatLng","isTypeSelected","isBrandSelected","markerImageKey","Marker","title","icon","addListener","setOptions","open","extend","MarkerClusterer","imagePath","fitBounds","defaultLat","parseFloat","defaultLong","setCenter","each","child","this","numberStoresDisplayed","updateStoresResultsLabel","numberOfStores","$result","$error","queryParam","value","displayMessage","String","replace","toUpperCase","showErrorLabel","NeedToBeDisplayed","$queryError","$errorLabel","updateStoresResults","$resultsDiv","$mapDiv","hasResults","storeResult","empty","radius","searchKey","initSearch","$form","userPosition","payload","userPositionLat","userPositionLong","ajax","dataType","defaultLandingSearch","getSuggestionUser","predictions","Geocoder","geocode","placeId","place_id","results","geometry","location","getOtherAddress","userAddr","getElementById","service","places","AutocompleteService","geocodeRestriction","getPlacePredictions","input","componentRestrictions","country","geolocationInit","on","e","which","preventDefault","stopImmediatePropagation","$googleSuggestion","searchStore","options","zoom","parseInt","isGeoLocationSearch","setZoom","hasNoResult","fillInAddress","place","getPlace","getSuggestion","init","mapOptions","scrollwheel","center","zoomControl","fullscreenControl","streetViewControl","mapTypeControl","styles","featureType","elementType","stylers","saturation","Map","show","updateStoreType","initAutocomplete","placeTypes","Autocomplete","types","split","watchMap","click","$listButton","$storeList","$storeMap","changeMapVisualization","watchList","changeListVisualization","loadMoreStoresButton","numberStoresResult","itemTypeValue","itShouldBeDisplayed","loadMoreStores","geolocalizationButton","searchButton","defaultSearch","enterKey","keyup","trigger"],"mappings":"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","file":"storeLocator.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\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\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.loaded = 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// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 4b14b2fe0d2f00fd3acc","'use strict';\n\nvar processInclude = require('./util');\n\n$(document).ready(function () {\n processInclude(require('./storeLocator/storeLocator'));\n});\n\n\n\n// WEBPACK FOOTER //\n// ./cartridges/app_bata_sfra/cartridge/client/default/js/storeLocator.js","'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\n\n\n// WEBPACK FOOTER //\n// ./cartridges/app_bata_sfra/cartridge/client/default/js/util.js","'use strict';\n\n/**\n * create the opening hours template, based on the information available\n * @param {Array} openingHours - an array (usually with a length of 7), which rapresent the days of the week\n *\n * @return {html} the template populated with opening hours data\n */\nfunction buildCollectionPointHoursTemplate(openingHours) {\n var $hoursTemplate = $('#clickCollectHoursTemplate').children().clone(),\n $daytemplate,\n dayOfWeek,\n result = $(document.createElement(\"p\"));\n\n for (var i = 0; i < openingHours.length; i++) {\n dayOfWeek = openingHours[i];\n $daytemplate = $hoursTemplate.clone();\n $daytemplate.find('.js-day').html(dayOfWeek.day + ':');\n // Combine all hours into a single string, separated by commas\n var combinedHours = dayOfWeek.hours.join(', ');\n $daytemplate.find('.js-hour').html(combinedHours);\n\n // Append the modified day template to the result\n $daytemplate.appendTo(result);\n }\n return result;\n}\n\n\n/**\n * Set store address\n * @param {template} template Template\n * @param {Object} store Store data object\n * @param {Object} $address1 Store address1\n * @param {Object} $address2 Store address2\n */\nfunction fillStoreAddress(template, store, $address1, $address2) {\n // For Bata IT, MY: Store address is splitted in two lines\n if ($address2.length) {\n if (store.a2) { // store has address 2\n $address1.html(store.a1 + '
');\n $address2.html(store.a2 + '
');\n } else {\n $address1.html(store.a1 + '
');\n $address2.html('');\n }\n // For the other sites: Both addresses (if address2 exists) are displayed in one line\n } else {\n $address1.html(store.a2 ? store.a1 + ' ' + store.a2 + '
' : store.a1 + '
');\n }\n}\n\n/**\n * Show COD allowed/disallowed message on each store's frontend\n * @param {template} template Template\n * @param {Object} store Store data object\n */\nfunction showPickupPointCODAllowed(store, template) {\n var codNotAvailableMsg = store.codAllowed === false ? $('#storeListResults').attr('data-cod-not-allowed-message') : \"\";\n template.content.querySelector('.js-store-details-number').setAttribute('data-cod-allowed', store.codAllowed);\n template.content.querySelector('.js-cod-allowed').textContent = codNotAvailableMsg;\n\n var codAllowedString = store.codAllowed ? 'true' : 'false';\n template.content.querySelector('.js-goto-store').setAttribute('data-codallowed', codAllowedString);\n}\n\n/**\n * create the StoreLocator Tiles for Stores List view\n * @param {Object} store - a store object\n * @param {Element} template - the template to populate with stores's data\n * @param {Boolean} isClickAndCollect - true if it is the pin for clickAndCollect template\n * @param {Boolean} isFilterByStoreBrands - true if filtered by brand\n * @param {String} controllerURL - the controller to call if the user clicks on the pin\n * @param {Boolean} hideStoreDetailsButton - true if it is needed to hide the button to reach the store details\n * @return {String} the template populated with stores's data\n */\n// eslint-disable-next-line complexity\nfunction buildStoreMarkerPin(store, template, isClickAndCollect, isFilterByStoreBrands, controllerURL, hideStoreDetailsButton) {\n var storeID = store.ID,\n storeDetailUrl = controllerURL ? controllerURL + '?storeID=' + store.ID + '&distance=' + store.dist + '&distanceUnit=' + store.dUnit : '',\n storePhone = store.phone,\n type, typeDV,\n brand, brandDV;\n\n // set\n var $storeInfo = template.find('.js-storeId');\n $storeInfo.data('store-id', storeID);\n\n if (store.brand === 'f') {\n brand = 'flagship';\n brandDV = 'Flagship store';\n } else {\n brand = store.brand;\n brandDV = store.brandDV;\n }\n $storeInfo.data('storebrand', brand);\n\n if (store.type === 'o') {\n type = 'original';\n typeDV = 'Original store';\n } else {\n type = store.type;\n typeDV = store.typeDV;\n }\n $storeInfo.attr('type', type);\n\n var $storeNameSection = template.find('.js-storeName'),\n $phoneContainer = template.find('.js-phoneContainer'),\n $phone = $phoneContainer.find('.js-storePhone'),\n $storePCode = template.find('.js-postalCode'),\n // zipCodePublic is only for pickup points in CZ, it has to be setted in the shipping address, but it has not to be displayed\n zipCodeForShipping = store.pCodePublic,\n openingHours = store.hours,\n $address1 = template.find('.js-storeAddress'),\n $address2 = template.find('.js-storeAddress2');\n $storeNameSection.attr('href', storeDetailUrl);\n $storeNameSection.html(store.name);\n var distance = store.dist && store.dist !== 'null' ? store.dist + ' ' + store.dUnit : '';\n template.find('.js-storeDistance').html(distance);\n\n fillStoreAddress(template, store, $address1, $address2);\n\n template.find('.js-storeCity').html(store.city ? store.city + ',' : '');\n template.find('.js-storeStateCode').html(store.sCode ? store.sCode + ',' : '');\n template.find('.js-storeDistrict').html(store.district ? store.district + ',' : '');\n template.find('.js-storeSubdistrict').html(store.subdistrict ? store.subdistrict + ',' : '');\n $storePCode.html(store.pCode);\n $storePCode.attr('data-public-postal-code', zipCodeForShipping || '');\n if ($phone.length > 0) {\n if (storePhone && storePhone.trim() !== '') {\n $phoneContainer.removeClass('d-none');\n $phone.html(storePhone);\n $phone.attr('href', 'tel:' + storePhone);\n }\n else {\n // if a store doesn't have a phone, also the phone icon will be hidden\n $phoneContainer.addClass('d-none');\n }\n }\n // for Click & Collect the hours is a string field in the DB, for Pickup Points is an array of days\n if (typeof openingHours === 'string' || !openingHours) {\n template.find('.js-storeHours').html(unescape(openingHours || ''));\n } else {\n var hoursTemplate = buildCollectionPointHoursTemplate(openingHours);\n template.find('.js-storeHours').html(hoursTemplate);\n }\n if (!store.hours) {\n template.find('.cc-icon-hours').addClass('d-none');\n } else {\n template.find('.cc-icon-hours').removeClass('d-none');\n }\n if (hideStoreDetailsButton) {\n template.find('.storeDetails').addClass('d-none');\n }\n if (isClickAndCollect) {\n template.find('.js-storeDetails').removeAttr('href');\n var tileTemplateID = $('#queryStoreParam').data('template-tile');\n var url = document.querySelector('#' + tileTemplateID).content.querySelector('.js-select-clickcollect-store').getAttribute('data-url');\n var $storeInfoButton = template.find('.storeInfoButton');\n $storeInfoButton.addClass('js-select-clickcollect-store');\n $storeInfoButton.attr('data-url', url);\n $storeInfoButton.attr('data-storeid', storeID);\n $storeInfoButton.attr('data-title', store.name);\n template.find('.js-storelocator-message').remove();\n } else {\n if (isFilterByStoreBrands === true) {\n template.find('.js-storeTypeDisplayValue').html(brandDV);\n } else {\n template.find('.js-storeTypeDisplayValue').html(typeDV);\n }\n template.find('.js-storeDetails').attr('href', storeDetailUrl);\n\n // Remove the click & collect exclusive element since they are not meant to be in the storelocator\n template.find('.js-clickAndCollect-message').remove();\n }\n var storePinHtml = template.clone();\n var storePin = {\n name: store.name,\n latitude: store.lat,\n longitude: store.long,\n type: type,\n storeBrand: brand,\n infoWindowHtml: storePinHtml.html()\n };\n return storePin;\n}\n\n/**\n * create the StoreLocator Pin for Store\n * @param {Object} store - a store object\n * @param {Element} template - the template to populate with stores's data\n * @return {String} the template populated with stores's data\n */\nfunction buildStoreCard(store, template, isFilterByStoreBrands, controllerURL) {\n var storePhone = store.phone,\n storeDetailUrl = controllerURL + '?storeID=' + store.ID + '&distance=' + store.dist + '&distanceUnit=' + store.dUnit,\n storeID = store.ID,\n type, typeDV,\n brand, brandDV;\n // set\n template.find('.js-store-details-number').attr('object', JSON.stringify(store));\n template.find('.js-storeContainer').attr('id', storeID);\n var $phone = template.find('.js-storePhone'),\n $storePCode = template.find('.js-postalCode'),\n // pCodePublic is only for pickup points in CZ, it has to be setted in the shipping address, but it has not to be displayed\n zipCodeForShipping = store.pCodePublic;\n template.find('.js-storeId').data('store-id', storeID);\n\n if (store.brand === 'f') {\n brand = 'flagship';\n brandDV = 'Flagship store';\n } else {\n brand = store.brand;\n brandDV = store.brandDV;\n }\n template.find('.js-storeId').attr('storebrand', brand);\n\n if (store.type === 'o') {\n type = 'original';\n typeDV = 'Original store';\n } else {\n type = store.type;\n typeDV = store.typeDV;\n }\n template.find('.js-storeId').attr('type', type);\n var $storeNameSection = template.find('.js-storeName');\n $storeNameSection.attr('href', storeDetailUrl);\n $storeNameSection.html(store.name);\n if (isFilterByStoreBrands === true) {\n template.find('.js-storeTypeDisplayValue').html(brandDV);\n } else {\n template.find('.js-storeTypeDisplayValue').html(typeDV);\n }\n if (store.dist && store.dist !== 'null') {\n template.find('.js-storeDistance').html(store.dist + ' ' + store.dUnit);\n }\n\n var $address1 = template.find('.js-storeAddress');\n var $address2 = template.find('.js-storeAddress2');\n fillStoreAddress(template, store, $address1, $address2);\n\n template.find('.js-storeCity').html(store.city ? store.city + ',' : '');\n template.find('.js-storeStateCode').html(store.sCode ? store.sCode + ',' : '');\n template.find('.js-storeDistrict').html(store.district ? store.district + ',' : '');\n template.find('.js-storeSubdistrict').html(store.subdistrict ? store.subdistrict + ',' : '');\n $storePCode.html(store.pCode);\n $storePCode.attr('data-public-postal-code', zipCodeForShipping || '');\n if (storePhone && storePhone.length > 0) {\n $phone.html(storePhone);\n $phone.attr('href', 'tel:' + storePhone);\n $phone.removeClass('d-none');\n }\n else {\n $phone.addClass('d-none');\n }\n template.find('.js-storeHours').html(unescape(store.hours ? store.hours : ''));\n var storeTemplate = template.clone();\n\n return storeTemplate[0].outerHTML;\n}\n\n/**\n * Create pin and stores tile from Stores-Find response data\n * @param {Object} data - the response from Stores-FindStores\n * @return {Object} pins and store list templates\n */\nfunction showStoresResults(data, isFilterByStoreBrands) {\n var stores = data.stores,\n pins = [],\n storeList = '',\n markerTemplate = $($('#storeMarkerTemplate')[0].content.children[0]),\n listTemplate = $($('#storeTileTemplate')[0].content.children[0]),\n controllerURL = data.controllerURL;\n stores.forEach(function(store) {\n pins.push(buildStoreMarkerPin(store, markerTemplate, false, isFilterByStoreBrands, controllerURL));\n storeList += buildStoreCard(store, listTemplate, isFilterByStoreBrands, controllerURL);\n });\n return {\n pins: pins,\n storeList: storeList\n };\n}\n\n/**\n * Create a store tile from a collection point when the \"select\" button in checkout is selected\n * @param {Object} pickupPoint - the collection point object\n * @param {template} template -the template which will populated using the pickup point data\n */\nfunction buildPickupPointCard(pickupPoint, template) {\n var $storePCode = template.find('.js-postalCode'),\n $city = template.find('.js-storeCity'),\n $distanceContainer = template.find('.js-storeDistanceContainer'),\n $storeNameSection = template.find('.js-storeName'),\n $storeAddress = template.find('.js-storeAddress'),\n $storeAddress2 = template.find('.js-storeAddress2'),\n // Only some collections points have stateCode (InPost for IT)\n $stateCode = template.find('.js-storeStateCode'),\n // zipCodePublic is only for pickup points in CZ, it has to be setted in the shipping address, but it has not to be displayed\n zipCodeForShipping = pickupPoint.pCodePublic,\n openingHours = pickupPoint.hours;\n\n $storeNameSection.html(pickupPoint.name);\n if (pickupPoint.dist && pickupPoint.dist !== 'null') {\n $distanceContainer.removeClass('d-none');\n $distanceContainer.find('.js-storeDistance').html(pickupPoint.dist + ' ' + pickupPoint.dUnit);\n } else {\n $distanceContainer.addClass('d-none');\n }\n // only some pickup points have the id, check useParcelShopCode attribute inside the shipping method\n template.attr('data-store-id', pickupPoint.ID);\n template.attr('data-companyname', pickupPoint.name);\n template.attr('data-cod-allowed', pickupPoint.codAllowed);\n\n // Grabbing the codAllowed value of the closest \"store\" selected and setting it in the selected Card.\n var codAllowed = template.attr('data-cod-allowed');\n $('#selectedStore').attr('data-cod-allowed', codAllowed);\n // Value that passes the codAllowed into the backend\n $('.js-selected-store-container').attr('data-cod-allowed', codAllowed);\n\n // Address2 is not present in pickup points\n // It is added for future implementation\n fillStoreAddress(template, pickupPoint, $storeAddress, $storeAddress2);\n\n $city.html(pickupPoint.city ? pickupPoint.city + ',' : '');\n $city.attr('data-city', pickupPoint.city);\n $storePCode.html(pickupPoint.pCode);\n $storePCode.attr('data-public-postal-code', zipCodeForShipping || '');\n if ($stateCode.length) {\n $stateCode.html(pickupPoint.sCode || '');\n }\n if (typeof openingHours === 'string' || !openingHours) {\n template.find('.js-storeHours').html(unescape(openingHours || ''));\n } else {\n var hoursTemplate = buildCollectionPointHoursTemplate(openingHours, template.find('.js-storeHours'));\n template.find('.js-storeHours').html(hoursTemplate);\n }\n var pickupPointTemplate = template.clone();\n var result = pickupPointTemplate[0].outerHTML;\n\n return result;\n}\n\nmodule.exports = {\n buildCollectionPointHoursTemplate: buildCollectionPointHoursTemplate,\n buildPickupPointCard: buildPickupPointCard,\n showPickupPointCODAllowed: showPickupPointCODAllowed,\n buildStoreMarkerPin: buildStoreMarkerPin,\n showStoresResults: showStoresResults,\n fillStoreAddress: fillStoreAddress\n};\n\n\n\n// WEBPACK FOOTER //\n// ./cartridges/app_bata_sfra/cartridge/client/default/js/storeLocator/storeTemplates.js","// This file is used in storelocator, find in store, click & collect (+ collection point) page in order to manage the user position, wich is used to calculate the distances\n\nvar userPositionData = {\n userGeolocation: null,\n userAddress: null\n};\n\nvar lastAvailableGeolocationKey = 'lastAvailableGeolocation';\n\nfunction getUserPositionIfAvailable(callback) {\n var coords = {\n lat: null,\n lng: null,\n isDefaultCenterLocation: false\n };\n var success = function (position) {\n coords.lat = position.coords.latitude;\n coords.lng = position.coords.longitude;\n callback(coords);\n };\n if (navigator.permissions) {\n navigator.permissions.query({ name: 'geolocation' }).then((result) => {\n if (result.state === 'granted') {\n navigator.geolocation.getCurrentPosition(success);\n }\n });\n } else {\n callback(JSON.parse(localStorage.getItem(lastAvailableGeolocationKey)));\n }\n}\n\n/**\n * @description set the user's position, based on the type of it\n * @param {string} lat - the latitude to set\n * @param {string} long - the longitude to set\n * @param {string} type - 'userAddress' to set the user's Address, 'userGeolocation' to set user's geolocation position\n */\nfunction setUserPosition(lat, long, type) {\n if (lat && long) {\n userPositionData[type] = {\n lat: lat,\n long: long\n };\n }\n // if a browser does not support navigator permission -> save coords to localStorage\n if (type === 'userGeolocation' && !navigator.permissions && lat && long) {\n var coords = {\n lat: lat,\n lng: long,\n isDefaultCenterLocation: false\n };\n localStorage.setItem(lastAvailableGeolocationKey, JSON.stringify(coords));\n }\n}\n\n/**\n * @description get the user position, if available\n * @param {boolean} isGeolocationSearch - true if user's address needs to be retrieved, false only for geolocation position\n * @return {Object.lat} the user's latitude if available\n * @return {Object.long} the user's longitude if available\n */\nfunction getUserPosition(isGeolocationSearch) {\n var result = {\n lat: null,\n long: null\n };\n if (isGeolocationSearch && userPositionData.userAddress) {\n result.lat = userPositionData.userAddress.lat;\n result.long = userPositionData.userAddress.long;\n }\n if (userPositionData.userGeolocation) {\n result.lat = userPositionData.userGeolocation.lat;\n result.long = userPositionData.userGeolocation.long;\n }\n return result;\n}\n\nmodule.exports = {\n setUserPosition: setUserPosition,\n getUserPosition: getUserPosition,\n getUserPositionIfAvailable: getUserPositionIfAvailable\n};\n\n\n// WEBPACK FOOTER //\n// ./cartridges/app_bata_sfra/cartridge/client/default/js/storeLocator/userPositionHelper.js","/* globals google */\n'use strict';\nvar storelocatorTemplateHelper = require('./storeTemplates'),\n userPositionHelper = require('./userPositionHelper');\n\nlet autocomplete;\nlet markers = [];\nvar map,\n markerCluster,\n numberStoreToShow,\n storePins = [];\n\n/**\n * delete all the markers actually loaded on map\n */\nfunction deleteMarkers() {\n for (let i = 0; i < markers.length; i++) {\n markers[i].setMap(null);\n }\n markers = [];\n}\n\nvar isFilterByStoreBrands = $('.map-canvas').data('storelogic') === 'brands';\nvar isFilterByStoreTypes = $('.map-canvas').data('storelogic') === 'types';\n\n/**\n * update all the card and marker of Stores actually loaded on page\n */\nfunction updateStores() {\n var $storeButton = $('#button-map');\n var $loadMoreStoresButton = $('#button-loadStores');\n var mapCanvas = $('.map-canvas');\n var mapdiv = storePins;\n //Contains shop types if type logic is selected or shop brands if brand logic is selected\n var storetypes = mapCanvas.data('storetypes');\n\n // logic to control if there is at least one store type/brand selected in the checkbox group\n var isAtLeastOneStoreTypeSelected = false;\n for (let i = 0; i < storetypes.length; i++) {\n if ($('#' + storetypes[i] + '-type').prop('checked')) {\n isAtLeastOneStoreTypeSelected = true;\n break;\n }\n }\n\n var isAtLeastOneMarkerVisible = false;\n\n if (markerCluster) {\n markerCluster.clearMarkers();\n }\n if (markers.length > 0) {\n deleteMarkers();\n }\n if ($storeButton.hasClass(\"active\")) {\n var infowindow = new google.maps.InfoWindow();\n var bounds = new google.maps.LatLngBounds();\n\n Object.keys(mapdiv).forEach(function (key) {\n var item = mapdiv[key];\n var storeLocation;\n if (item.latitude && item.longitude) {\n storeLocation = new google.maps.LatLng(item.latitude, item.longitude);\n }\n var marker;\n\n // check if store has type selected in case of type logic\n var isTypeSelected = isFilterByStoreTypes && $('#' + item.type + '-type').prop('checked');\n // check if store has all selected brands in case of brand logic\n var isBrandSelected = isFilterByStoreBrands && $('#' + item.storeBrand + '-type').prop('checked');\n\n if (storeLocation && (isTypeSelected || isBrandSelected)) {\n let markerImageKey = isBrandSelected ? item.storeBrand : item.type;\n marker = new google.maps.Marker({\n position: storeLocation,\n title: item.name,\n icon: mapCanvas.data('markerimagepath')[markerImageKey]\n });\n marker.addListener('click', function () {\n infowindow.setOptions({\n content: item.infoWindowHtml\n });\n infowindow.open(map, marker);\n });\n // Create a minimum bound based on a set of storeLocations\n bounds.extend(marker.position);\n isAtLeastOneMarkerVisible = true;\n\n markers.push(marker);\n }\n });\n\n // if no store type selected go to default map center\n // else center map based on found stores\n if (!isAtLeastOneStoreTypeSelected || !isAtLeastOneMarkerVisible) {\n var defaultLat = parseFloat(mapCanvas.attr('defaultlat'));\n var defaultLong = parseFloat(mapCanvas.attr('defaultlong'));\n map.setCenter({\n lat: defaultLat,\n lng: defaultLong\n });\n } else {\n // eslint-disable-next-line no-undef\n markerCluster = new MarkerClusterer(map, markers, {\n imagePath: mapCanvas.attr('clusterimagepath')\n });\n // Fit the all the store marks in the center of a minimum bounds when any store has been found.\n if (mapdiv && mapdiv.length !== 0) {\n map.fitBounds(bounds);\n }\n }\n } else {\n $('.cc-store-list-card').each(function () {\n var child = $(this).find('.store-details')[0];\n var type = $(child).attr('type');\n var storeBrand = $(child).attr('storebrand');\n\n // check if store has type selected in case of type logic\n var isTypeSelected = isFilterByStoreTypes && $('#' + type + '-type').prop('checked');\n // check if store has all selected brands in case of brand logic\n var isBrandSelected = isFilterByStoreBrands && $('#' + storeBrand + '-type').prop('checked');\n\n if (isTypeSelected || isBrandSelected) {\n $(this).removeClass(\"d-none\");\n } else {\n $(this).addClass(\"d-none\");\n }\n });\n //display 8 stores\n numberStoreToShow = 8;\n var numberStoresDisplayed = 0;\n var isDisplayed = false;\n $('.cc-store-list-card').each(function () {\n isDisplayed = !($(this).hasClass(\"d-none\"));\n if (isDisplayed) {\n numberStoresDisplayed++;\n if (numberStoresDisplayed <= 8) {\n $(this).removeClass(\"d-none\");\n } else {\n $(this).addClass(\"d-none\");\n }\n }\n });\n if (!isAtLeastOneStoreTypeSelected || numberStoresDisplayed <= 8) {\n $loadMoreStoresButton.addClass(\"d-none\");\n } else {\n $loadMoreStoresButton.removeClass(\"d-none\");\n }\n }\n}\n\n/**\n * Render label under the query form\n*/\nfunction updateStoresResultsLabel(numberOfStores) {\n var $result = $('.result-stores-number');\n var $error = $('.result-stores-number-error');\n var queryParam = $('#queryStoreParam')[0].value;\n if (queryParam !== \"\") {\n var displayMessage = String($result.data('message'));\n displayMessage = displayMessage.replace(\"{0}\", numberOfStores);\n displayMessage = displayMessage.replace(\"{1}\", \"\\\"\" + queryParam.toUpperCase() + \"\\\"\");\n $result.removeClass('d-none');\n $error.addClass('d-none');\n $result.html(displayMessage);\n } else {\n $error.removeClass('d-none');\n $result.addClass('d-none');\n }\n}\n\n/**\n * Render label under the query form in case of 0 stores were found by query\n * @param {boolean} NeedToBeDisplayed - specify if the label needs to be displayed or not\n */\nfunction showErrorLabel(NeedToBeDisplayed) {\n var $queryError = $('#errorQuery');\n var $errorLabel = $('.result-stores-number-error');\n var queryParam = $('#queryStoreParam')[0].value;\n if (NeedToBeDisplayed) {\n $errorLabel.removeClass('d-none');\n $queryError[0].textContent = queryParam;\n } else {\n $errorLabel.addClass('d-none');\n }\n}\n\n/**\n * Uses google maps api to render a map\n */\nfunction maps() {\n var mapCanvas = $('.map-canvas');\n var defaultLat = mapCanvas.attr('defaultlat');\n var defaultLong = mapCanvas.attr('defaultlong');\n var defaultZoom = parseInt(mapCanvas.attr('defaultzoom'));\n\n var latlng = new google.maps.LatLng(defaultLat, defaultLong);\n var mapOptions = {\n scrollwheel: false,\n zoom: defaultZoom,\n center: latlng,\n zoomControl: true,\n fullscreenControl: false,\n streetViewControl: false,\n mapTypeControl: false,\n styles: [\n {\n featureType: 'all',\n elementType: 'all',\n stylers: [{\n saturation: -100\n }]\n }\n ]\n };\n\n map = new google.maps.Map($('.map-canvas')[0], mapOptions);\n}\n\n/**\n * Display 8 more stores\n */\nfunction loadMoreStores() {\n numberStoreToShow = numberStoreToShow + 8;\n var numberStoresResult = 0;\n var numberStoresDisplayed = 0;\n var $loadMoreStoresButton = $('#button-loadStores');\n\n $('.cc-store-list-card').each(function () {\n var child = $(this).find('.store-details')[0];\n var itemTypeValue = $(child).attr('type');\n var storeBrand = $(child).attr('storebrand');\n\n // check if store has type selected in case of type logic\n var isTypeSelected = isFilterByStoreTypes && $('#' + itemTypeValue + '-type').prop('checked');\n // check if store has all selected brands in case of brand logic\n var isBrandSelected = isFilterByStoreBrands && $('#' + storeBrand + '-type').prop('checked');\n var itShouldBeDisplayed = isTypeSelected || isBrandSelected;\n\n if (itShouldBeDisplayed) {\n numberStoresResult++;\n }\n //display the store only if it has a eligible brand or type (and the number of stores already displayed is < that the number expected)\n if (numberStoresResult <= numberStoreToShow && itShouldBeDisplayed) {\n $(this).removeClass(\"d-none\");\n numberStoresDisplayed++;\n } else {\n $(this).addClass(\"d-none\");\n }\n });\n if (numberStoresDisplayed === numberStoresResult) {\n $loadMoreStoresButton.addClass(\"d-none\");\n } else {\n $loadMoreStoresButton.removeClass(\"d-none\");\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 var storeResult = storelocatorTemplateHelper.showStoresResults(data, isFilterByStoreBrands);\n\n //update the pins data\n storePins = storeResult.pins;\n\n $resultsDiv.empty()\n .data('has-results', hasResults)\n .data('radius', data.radius)\n .data('search-key', data.searchKey);\n\n //create the new store list\n $resultsDiv.html(storeResult.storeList);\n\n if ($mapDiv.data('has-google-api')) {\n updateStores();\n }\n}\n\n/**\n * Renders the results of the search and updates the map without update the result label\n * @param {string} lat - latitude to use in the query\n * @param {string} long - longitude to use in the query\n * @param {string} radius - optional, specify the radius to use in the query\n */\nfunction initSearch(lat, long, radius) {\n var $form = $('#queryStoreParam');\n var url = $form.attr('action');\n var userPosition = userPositionHelper.getUserPosition(true);\n var payload =\n {\n lat: lat,\n long: long,\n radius: radius,\n userPositionLat: userPosition.lat,\n userPositionLong: userPosition.long\n };\n\n $.ajax({\n url: url,\n type: $form.attr('method'),\n data: payload,\n dataType: 'json',\n success: function (data) {\n updateStoresResults(data);\n $('.result-stores-number').addClass('d-none');\n showErrorLabel(false);\n }\n });\n}\n\n/**\n * Makes the suggestion box visible only if the user has inserted at least 2 characters into the input field\n */\nfunction noSuggestionBox() {\n $('#queryStoreParam').on('input change focus keydown keyup', function (e) {\n if ($('#queryStoreParam')[0].value.length < 2) {\n //block the normal behavior every time except if the user has pressed the \"enter\" key\n if (e.which !== 13 || e.type === 'keydown') {\n //stop scrolling the previous results if the user press the arrows keys\n if ($('.pac-item').length > 0 && (e.which === 40 || e.which === 38)) {\n e.preventDefault();\n }\n e.stopImmediatePropagation();\n }\n $('.pac-container').addClass('d-none');\n } else {\n var $googleSuggestion = $('.pac-container');\n $googleSuggestion.removeClass('pac-logo');\n $googleSuggestion.removeClass('d-none');\n }\n });\n}\n\nfunction defaultLandingSearch () {\n var mapCanvas = $('.map-canvas');\n var defaultLat = mapCanvas.attr('defaultlat'),\n defaultLong = mapCanvas.attr('defaultlong'),\n radius = mapCanvas.attr('defaultradius');\n initSearch(defaultLat, defaultLong, radius);\n}\n\n/**\n * Renders the results of the search and updates the map\n * @param {string} lat - latitude to use in the query\n * @param {string} long - longitude to use in the query\n * @param {string} radius - optional, specify the radius to use in the query\n */\nconst getSuggestionUser = function (predictions) {\n if (predictions) {\n let geocoder = new google.maps.Geocoder();\n geocoder.geocode({ placeId: predictions[0].place_id }, (results) => {\n var lat = results[0].geometry.location.lat(),\n long = results[0].geometry.location.lng();\n userPositionHelper.setUserPosition(lat, long, 'userAddress');\n var mapCanvas = $('.map-canvas');\n var radius = mapCanvas.attr('defaultradius');\n initSearch(lat, long, radius);\n });\n } else {\n //no address suggestion available for user's address go with the default search\n defaultLandingSearch();\n }\n};\n\n/**\n * Check if the user has an address, otherwise search all stores in the country\n */\nfunction getOtherAddress() {\n var userAddr = document.getElementById('user_addr').value;\n if (userAddr !== \"null\") {\n var service = new google.maps.places.AutocompleteService();\n var geocodeRestriction = $('#queryStoreParam').attr('geocoderestriction');\n service.getPlacePredictions(\n {\n input: userAddr,\n componentRestrictions: {\n country: geocodeRestriction\n }\n },\n getSuggestionUser\n );\n } else {\n var mapCanvas = $('.map-canvas');\n var lat = mapCanvas.attr('defaultlat'),\n long = mapCanvas.attr('defaultlong'),\n radius = mapCanvas.attr('defaultradius');\n initSearch(lat, long, radius);\n\n $('.welcomephrase').removeClass('d-none');\n }\n}\n\n/**\n* Ask the user if he wants to use his position to execute a search in his proximity\n*/\nfunction geolocationInit() {\n // Init listener on input field\n noSuggestionBox();\n if (navigator.geolocation) {\n navigator.geolocation.getCurrentPosition(function (position) {\n var lat = position.coords.latitude,\n long = position.coords.longitude;\n userPositionHelper.setUserPosition(lat, long, 'userGeolocation');\n defaultLandingSearch();\n\n map.setCenter({\n lat: lat,\n lng: long\n });\n }, getOtherAddress);\n }\n}\n\n/**\n * Renders the results of the search, updates the map and the results label\n * @param {string} lat - latitude to use in the query\n * @param {string} long - longitude to use in the query\n * @param {string} radius - optional, specify the radius to use in the query\n */\nfunction searchStore(lat, long, radius, options) {\n $('.welcomephrase').addClass('d-none');\n var $form = $('#queryStoreParam'),\n zoom = parseInt($('.map-canvas').attr('defaultzoom')),\n url = $form.attr('action');\n\n var userPosition = userPositionHelper.getUserPosition(options.isGeoLocationSearch);\n\n var payload =\n {\n lat: lat,\n long: long,\n radius: radius,\n userPositionLat: userPosition.lat || lat,\n userPositionLong: userPosition.long || long\n };\n\n $.ajax({\n url: url,\n type: $form.attr('method'),\n data: payload,\n dataType: 'json',\n success: function (data) {\n updateStoresResults(data);\n if ($('.js-storelocator-setcenter').data('storelocator-setcenter') === true) {\n map.setCenter({\n lat: lat,\n lng: long\n });\n map.setZoom(zoom);\n }\n if (data.hasNoResult) {\n updateStoresResultsLabel(0);\n showErrorLabel(true);\n } else {\n updateStoresResultsLabel(data.stores.length);\n showErrorLabel(false);\n }\n }\n });\n}\n\n/**\n * Dafault search for storelocator\n*/\nfunction defaultSearch() {\n var mapCanvas = $('.map-canvas');\n var lat = mapCanvas.attr('defaultlat'),\n long = mapCanvas.attr('defaultlong'),\n radius = mapCanvas.attr('defaultradius');\n searchStore(lat, long, radius, {isGeoLocationSearch: true});\n}\n\n/**\n * Get coordinates from the suggestion of google and execute a search\n */\nfunction fillInAddress() {\n const place = autocomplete.getPlace();\n if (place.geometry) {\n var lat = place.geometry.location.lat();\n var long = place.geometry.location.lng();\n searchStore(lat, long, false, {});\n }\n}\n\n/**\n * Renders the results of the search and updates the map\n * @param {Object} predictions - the predictions from Google Maps service\n */\nconst getSuggestion = function (predictions) {\n if (predictions) {\n let geocoder = new google.maps.Geocoder();\n geocoder.geocode({ placeId: predictions[0].place_id }, (results) => {\n\n var lat = results[0].geometry.location.lat(),\n long = results[0].geometry.location.lng();\n searchStore(lat, long, false, {});\n });\n } else {\n //no suggestion available for the query param, search stores by default lat and long, then show error messages\n var mapCanvas = $('.map-canvas');\n var lat = mapCanvas.attr('defaultlat'),\n long = mapCanvas.attr('defaultlong'),\n radius = mapCanvas.attr('defaultradius');\n searchStore(lat, long, radius, {isGeoLocationSearch: true});\n }\n};\n\n\nfunction changeMapVisualization() {\n\n var $storeButton = $('#button-map');\n var $listButton = $('#button-list');\n var $storeList = $('#storeList');\n var $storeMap = $('#storeMap');\n var $loadMoreStoresButton = $('#button-loadStores');\n\n $listButton.removeClass(\"active\");\n $storeButton.addClass(\"active\");\n $storeList.addClass(\"d-none\");\n $storeMap.removeClass(\"d-none\");\n $loadMoreStoresButton.addClass(\"d-none\");\n\n updateStores();\n}\n\nfunction changeListVisualization() {\n\n var $storeButton = $('#button-map');\n var $listButton = $('#button-list');\n var $storeList = $('#storeList');\n var $storeMap = $('#storeMap');\n var $loadMoreStoresButton = $('#button-loadStores');\n\n $storeButton.removeClass(\"active\");\n $listButton.addClass(\"active\");\n $storeMap.addClass(\"d-none\");\n $storeList.removeClass(\"d-none\");\n $loadMoreStoresButton.removeClass(\"d-none\");\n\n updateStores();\n}\n\n\nmodule.exports = {\n init: function () {\n geolocationInit();\n if ($('.map-canvas').data('has-google-api')) {\n maps();\n }\n if (!$('.results').data('has-results')) {\n $('.store-locator-no-results').show();\n }\n },\n\n updateStoreType: function () {\n $('body').on('change', '.checkboxTypeStore', (function () {\n updateStores();\n }));\n },\n\n initAutocomplete: function () {\n $(document).ready(function () {\n var geocodeRestriction = $('#queryStoreParam').attr('geocoderestriction');\n var placeTypes = $('#queryStoreParam').attr('data-place-types');\n autocomplete = new google.maps.places.Autocomplete((document.getElementById('queryStoreParam')), {\n types: placeTypes !== \"\" ? placeTypes.split(',') : [],\n componentRestrictions: {\n country: geocodeRestriction\n }\n });\n autocomplete.addListener(\"place_changed\", fillInAddress);\n });\n },\n\n watchMap: function () {\n $('#button-map').click(function () {\n changeMapVisualization();\n });\n },\n\n watchList: function () {\n $('#button-list').click(function () {\n changeListVisualization();\n });\n },\n\n loadMoreStoresButton: function () {\n $('#button-loadStores').click(function () {\n loadMoreStores();\n });\n },\n\n geolocalizationButton: function () {\n $('#storeLocationButton').click(function () {\n defaultLandingSearch();\n });\n },\n\n searchButton: function () {\n $('#searchStore').click(function () {\n var queryParam = $('#queryStoreParam')[0].value;\n if (queryParam !== \"\") {\n var geocodeRestriction = $('#queryStoreParam').attr('geocoderestriction');\n var placeTypes = $('#queryStoreParam').attr('data-place-types');\n var service = new google.maps.places.AutocompleteService();\n var options = {\n input: queryParam,\n types: placeTypes !== \"\" ? placeTypes.split(',') : [],\n componentRestrictions: {\n country: geocodeRestriction\n }\n };\n service.getPlacePredictions(options, getSuggestion);\n $('.welcomephrase').addClass('d-none');\n $('.result-stores-number').removeClass('d-none');\n } else {\n defaultSearch();\n $('.welcomephrase').removeClass('d-none');\n $('.result-stores-number').addClass('d-none');\n }\n });\n },\n\n enterKey: function () {\n $('#queryStoreParam').keyup(function (e) {\n //which = 13 -> enter key pressed\n if (e.which === 13) {\n $('#searchStore').trigger('click');\n }\n });\n }\n};\n\n\n\n// WEBPACK FOOTER //\n// ./cartridges/app_bata_sfra/cartridge/client/default/js/storeLocator/storeLocator.js"],"sourceRoot":""}