{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///../b2c-commerce-toolkit-for-grocery/fs-grocery-project-code/cartridges/plugin_shoppingthestore/cartridge/client/default/js/storeLocator/storePopup.js","webpack:///../b2c-commerce-toolkit-for-grocery/salesforce-storefront-reference-architecture/cartridges/app_storefront_base/cartridge/client/default/js/util.js","webpack:///./cartridges/plugin_time_slots_checkout/cartridge/client/default/js/storeLocator.js","webpack:///./cartridges/plugin_time_slots_checkout/cartridge/client/default/js/storeLocator/storeLocator.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;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,IAAI,WAAW,QAAQ;;AAEpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;;;;;;;;;;;;AC5Ba;;AAEb;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;;;;;;;;;;;ACZA,uBAAuB,mBAAO,CAAC,sKAAW;;AAE1C;AACA,mBAAmB,mBAAO,CAAC,qIAA6B;AACxD,CAAC;;;;;;;;;;;;ACJD;;AAEA,mBAAmB,mBAAO,CAAC,iMAAoC;;AAE/D;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,aAAa,OAAO;AACpB;AACA;AACA;AACA,6FAA6F,IAAI,GAAG,gCAAgC;;AAEpI;AACA;;AAEA;AACA;AACA,aAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,SAAS;AACT,KAAK;AACL;;AAEA;AACA;AACA,WAAW,OAAO;AAClB;AACA;AACA,sDAAsD,QAAQ;AAC9D,qDAAqD,QAAQ;AAC7D,uDAAuD,QAAQ;AAC/D,sDAAsD,QAAQ;AAC9D;;AAEA;AACA;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,EAAE;AACb;AACA;AACA;AACA;AACA,iDAAiD,IAAI;;AAErD;AACA,oDAAoD,IAAI;AACxD;AACA,KAAK;AACL,oDAAoD,IAAI;AACxD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,mBAAmB,kBAAkB;AACrC;;AAEA;AACA;AACA;AACA;AACA,sCAAsC,4BAA4B,KAAK,+BAA+B;AACtG,wBAAwB,SAAS;AACjC,wBAAwB,SAAS;;AAEjC;AACA;;AAEA,0BAA0B,iDAAiD;AAC3E;AACA,8BAA8B;AAC9B;AACA,wCAAwC,EAAE,mBAAmB,yDAAyD,SAAS,GAAG,mBAAmB;AACrJ,gFAAgF,SAAS,GAAG,mBAAmB;AAC/G;AACA,iBAAiB;AACjB;AACA,iBAAiB;AACjB;AACA;AACA;;AAEA,6DAA6D,mBAAmB;AAChF,4BAA4B,SAAS,GAAG,mBAAmB;AAC3D;AACA;AACA;AACA;;AAEA,oBAAoB,SAAS;AAC7B,oBAAoB,SAAS;AAC7B;;AAEA,oCAAoC,iBAAiB,EAAE;AACvD;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA,WAAW,EAAE;AACb,WAAW,EAAE;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,qCAAqC,SAAS;AAC9C,qCAAqC,SAAS;AAC9C;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,EAAE;AACb;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;;AAEA;AACA;AACA;AACA,WAAW,EAAE;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,mBAAmB,KAAK,gCAAgC,KAAK;AAC7D,mBAAmB,KAAK,iCAAiC,KAAK;AAC9D;AACA,mBAAmB,KAAK,mCAAmC,KAAK;AAChE,mBAAmB,KAAK,oCAAoC,KAAK;;AAEjE;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA,2BAA2B,KAAK,gCAAgC,KAAK;AACrE;AACA,2BAA2B,KAAK,mCAAmC,KAAK;AACxE,SAAS;AACT,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA,wCAAwC,4BAA4B,EAAE;AACtE,yCAAyC,mBAAmB,EAAE;AAC9D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,EAAE;AACb;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,EAAE;AACb;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,EAAE;AACb;AACA;AACA,oEAAoE,KAAK;AACzE,qEAAqE,KAAK;AAC1E;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,EAAE;AACb,WAAW,QAAQ;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa,IAAI,MAAM,QAAQ;;AAE/B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,qBAAqB,IAAI,WAAW,KAAK,eAAe,KAAK;;AAE7D;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;;AAEb;;AAEA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;;AAEA;AACA;AACA,WAAW,EAAE;AACb;AACA;AACA;AACA;;AAEA;AACA,aAAa,IAAI,MAAM,QAAQ;;AAE/B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,qDAAqD,UAAU;;AAE/D;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,iFAAiF,gBAAgB;AACjG,iDAAiD,EAAE;AACnD;AACA,aAAa;AACb;;AAEA;AACA,SAAS;AACT,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA,yCAAyC,+BAA+B,EAAE;AAC1E;;AAEA;AACA;AACA,WAAW,EAAE;AACb;AACA;AACA;AACA;AACA,aAAa,IAAI,WAAW,QAAQ;;AAEpC;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,SAAS;AACT,KAAK;;AAEL;;AAEA;AACA,gBAAgB,IAAI,WAAW,QAAQ;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ,QAAQ;AACR;;AAEA;AACA;AACA;AACA;AACA,kEAAkE,4BAA4B,EAAE;AAChG,wDAAwD,4BAA4B,EAAE;AACtF;;AAEA;AACA;AACA;AACA,UAAU,gBAAgB;AAC1B,UAAU,yBAAyB;AACnC,WAAW,OAAO;AAClB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,6BAA6B,kBAAkB;AAC/C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,2DAA2D;AAClF,SAAS;;AAET;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;;AAET;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,QAAQ;;AAEnC;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA,yCAAyC;AACzC;AACA,iBAAiB;;AAEjB,yFAAyF,QAAQ;AACjG,0FAA0F,QAAQ;AAClG,aAAa;AACb,SAAS;AACT,KAAK;AACL;;AAEA;AACA;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,YAAY;AACvB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,4DAA4D;;AAE5D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,8CAA8C,gBAAgB,EAAE;AAChE,qDAAqD,WAAW,EAAE;;AAElE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,WAAW,EAAE;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,WAAW,EAAE;AAC7D;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB,aAAa;AACb,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL","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/plugin_time_slots_checkout/cartridge/client/default/js/storeLocator.js\");\n","/**\n * setNextAvailableSlot asyncronous\n */\nfunction setNextAvailableSlot() {\n let url = $('.nextAvailableSlot').data('action');\n const storeId = $('#selectStoreHeader').data('preferredstoreid');\n url = `${url}?storeid=${storeId}`;\n\n $.ajax({\n url,\n type: 'get',\n dataType: 'html',\n success(response) {\n $('.nextAvailableSlot').empty();\n $('.nextAvailableSlot').append(response);\n },\n });\n}\n\nmodule.exports = {\n setNextAvailableSlot() {\n /**\n * update next available slot if store selected but no slot selected\n */\n if ($('.nextAvailableSlot').length > 0) {\n setNextAvailableSlot(this);\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","const processInclude = require('base/util');\n\n$(document).ready(() => {\n processInclude(require('./storeLocator/storeLocator'));\n});\n","/* globals google */\n\nconst storePopup = require('base_store/storeLocator/storePopup');\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 let newUrl = url;\n newUrl += (newUrl.indexOf('?') !== -1 ? '&' : '?') + Object.keys(params).map((key) => `${key}=${encodeURIComponent(params[key])}`).join('&');\n\n return newUrl;\n}\n\n/**\n * get preferred store id from header\n * @returns {string} preferred store id\n */\nfunction getPreferredStoreId() {\n return $('#selectStoreHeader').data('preferredstoreid');\n}\n\n/**\n * removeNotAvailableItemsFromBasket\n * call service to remove not available items from basket\n */\nfunction removeNotAvailableItemsFromBasket() {\n const url = $('#changeStoreModal').data('removenotavailableitemsaction');\n $.ajax({\n url,\n type: 'post',\n dataType: 'json',\n success(basketModelPlus) {\n /* todo delete line items in result data from basket popup */\n\n $('.minicart-quantity').first().html(basketModelPlus.basket.numItems);\n },\n });\n}\n\n/**\n * update store result list buttons\n * @param {string} storeId - id of the new store\n */\nfunction showCorrectStoreResultButtons(storeId) {\n $('.infobox').find(`.selectstore[data-storeid!='${storeId}']`).removeClass('d-none');\n $('.infobox').find(`.selectstore[data-storeid='${storeId}']`).addClass('d-none');\n $('.infobox').find(`.list-mystore[data-storeid!='${storeId}']`).addClass('d-none');\n $('.infobox').find(`.list-mystore[data-storeid='${storeId}']`).removeClass('d-none');\n}\n\n/**\n * slideUpSearchForm\n * @param {string} visibleButtonId button to be shown\n */\nfunction slideUpSearchForm(visibleButtonId) {\n $('.closebuttons').addClass('d-none');\n $(visibleButtonId).removeClass('d-none');\n $('#searchform').slideUp();\n $('#closecard').slideDown();\n}\n\n/**\n * drawSlots\n * Draw the slot selection list when a day is chosen\n * @param {*} dayElement - element containing data-day: date of the slots, e.g. 2020-06-29\n */\nfunction drawSlots(dayElement) {\n const day = $(dayElement).data('day');\n /* Slots for other days invisible */\n $('#slotsarea').find(`.dayslots[data-day!='${day}']`).removeClass('d-block').addClass('d-none');\n\n /* If day has slots, show them else show no-slots-message */\n if ($('#slotsarea').find(`.dayslots[data-day='${day}']`).length === 0) {\n $('.noslot').removeClass('d-none').addClass('d-block');\n } else {\n $('#slotsarea').find(`.dayslots[data-day='${day}']`).removeClass('d-none').addClass('d-block');\n }\n}\n\n/**\n * drawPicker\n * Draw the new picker headline like 'Jun 28 - Jul 4'\n * Draw two views of radio controls for the days:\n * 7 Controls for big screens\n * 3 Controls for mobile\n *\n * */\nfunction drawPicker() {\n const days = $('#daycontainer').data('days');\n const views = [3, 7];\n\n for (let i = 0; i < views.length; i += 1) {\n const daysFormatted = $('#daycontainer').data('formatteddays');\n\n let lastDay = (days + views[i]) - 1;\n if (lastDay >= daysFormatted.length) {\n lastDay = daysFormatted.length - 1;\n }\n const htmlStringHeadline = `${daysFormatted[days].format0} - ${daysFormatted[lastDay].format0}`;\n $(`#dayswitch-${views[i]}`).empty();\n $(`#dayswitch-${views[i]}`).append(htmlStringHeadline);\n\n let htmlStringPickers = '' +\n '';\n\n for (let j = days; j < days + views[i] && j < daysFormatted.length; j += 1) {\n const dateformat = daysFormatted[j];\n const column = `${'';\n htmlStringPickers += column;\n\n if ($('#slotsarea').find(`.dayslots[data-day!='${dateformat.datekey}']`).length === 0) {\n $(`#radio-${views[i]}-${dateformat.datekey}`).attr('disabled', true);\n }\n }\n htmlStringPickers += '' +\n '
' +\n '
' +\n ' ` +\n ` ` +\n '
' +\n '
';\n\n $(`#table-${views[i]}`).empty();\n $(`#table-${views[i]}`).append(htmlStringPickers);\n }\n\n $('.radio').change(function () { drawSlots(this); });\n if ($('#daycontainer').hasClass('mondaysDisable')) {\n $('.radio').change(function () {\n //check if is Monday - show mondayDisableSlotsModal\n if (new Date($(this).data('day')).getDay() === 1) {\n $('#mondayDisableSlotsModal').modal();\n }\n });\n }\n}\n\n/**\n * setFirstShownDate\n * @param {*} newStartDate newDays\n * @param {*} step step\n */\nfunction setFirstShownDate(newStartDate, step) {\n let newDays = newStartDate;\n const maxDays = parseInt($('#daycontainer').data('maxdays'), 10);\n\n /* Prevent new days from getting negative */\n if (newDays <= 0) {\n newDays = 0;\n $('.reduceWeek').addClass('d-none');\n } else {\n $('.reduceWeek').removeClass('d-none');\n }\n\n /* Prevent new days from exceeding mayDays */\n if (newDays + step >= maxDays) {\n newDays = (maxDays - step);\n }\n\n if (newDays + 3 >= maxDays) {\n $('.increaseWeek').addClass('d-none');\n } else {\n $('.increaseWeek').removeClass('d-none');\n }\n\n /* Update currentDays */\n $('#daycontainer').data('days', newDays);\n drawPicker();\n}\n\n/**\n * Draw Picker with preselected date\n */\nfunction drawPickerSetDate() {\n const slotDate = $('#pickupdate').data('date') || $('#slotsarea').data('firstavailableslotdate');\n\n if (slotDate && slotDate !== 'undefined') {\n const focusDate = new Date(slotDate).setHours(0, 0, 0, 0);\n const daystogo = Math.round((focusDate - new Date().setHours(0, 0, 0, 0)) / (1000 * 60 * 60 * 24));\n setFirstShownDate(daystogo, 3);\n\n const dayslot3 = `#radio-3-${slotDate}`;\n const dayslot7 = `#radio-7-${slotDate}`;\n $(dayslot3).attr('checked', 'checked');\n $(dayslot7).attr('checked', 'checked');\n drawSlots($(dayslot7));\n } else {\n drawPicker();\n }\n}\n\n/**\n * updateFirstShownDate\n *\n * @param {*} changeDateButton - element containing the current Day, day step and max days\n */\nfunction updateFirstShownDate(changeDateButton) {\n const currentDays = parseInt($('#daycontainer').data('days'), 10);\n const step = parseInt($(changeDateButton).data('step'), 10);\n\n const newDays = currentDays + step;\n\n setFirstShownDate(newDays, step);\n}\n\n/**\n * updateHeader\n */\nfunction updateHeader() {\n const url = $('#mystore').data('url');\n\n $.ajax({\n url,\n type: 'get',\n dataType: 'html',\n success(response) {\n $('#mystore').empty();\n $('#mystore').append(response);\n storePopup.setNextAvailableSlot();\n },\n });\n}\n\n/**\n * softreserve\n * call service with storeId, date and time to reserve a slot\n * @param {*} reserveButton - Element containing actionUrl, storeId, date and time to be reserved\n */\nfunction softreserve(reserveButton) {\n const date = $(reserveButton).data('date');\n const year = date.slice(0,4);\n const month = date.slice(5,7);\n const day = date.slice(8,10);\n const time = $(reserveButton).data('time');\n const timeEnd = Number(time.slice(0,2))+1;\n const id = $(reserveButton).data('storeid');\n const slotID = $(reserveButton).data('slotid');\n\n /* Mark only the new slot as selected */\n $(`#dayslots-${date}`).find(`.yourslot[data-time='${time}']`).removeClass('d-none');\n $(`#dayslots-${date}`).find(`.yourslot[data-time!='${time}']`).addClass('d-none');\n /* Show only select button for not selected slots */\n $(`#dayslots-${date}`).find(`.softreserve[data-time='${time}']`).addClass('d-none');\n $(`#dayslots-${date}`).find(`.softreserve[data-time!='${time}']`).removeClass('d-none');\n\n /* Update Slot in Store info */\n $('.store-info-flush').find('.slotinfocard').removeClass('d-none');\n\n let url = $('#slotsarea').data('confirmslot');\n const urlParams = {\n id, slotID,\n };\n url = appendToUrl(url, urlParams);\n\n $.spinner().start();\n\n $.ajax({\n url,\n type: 'get',\n dataType: 'html',\n success(response) {\n $('#flushmodal').empty();\n $('#flushmodal').append(response);\n $('#confirmSlot').modal('show');\n $('#slotPickerMessageShipment').empty().text(day + \"/\" + month + \"/\" + year + \" - \" + time + \" a \" + timeEnd + \":00\");\n $('#slotPickerMessagePayment').empty().text(day + \"/\" + month + \"/\" + year + \" - \" + time + \" a \" + timeEnd + \":00\");\n $.spinner().stop();\n updateHeader();\n },\n error() {\n $('#reserveFailed').modal('show');\n $.spinner().stop();\n\n /* Mark new slot as not selected */\n $(`#dayslots-${date}`).find(`.yourslot[data-time='${time}']`).addClass('d-none');\n /* Show all select buttons */\n $(`#dayslots-${date}`).find(`.softreserve[data-time='${time}']`).removeClass('d-none');\n },\n });\n}\n\n/**\n * setPickerButtonEvents\n */\nfunction setPickerButtonEvents() {\n $('.changeWeek').click(function () { updateFirstShownDate(this); });\n $('.softreserve').click(function () { softreserve(this); });\n}\n\n/**\n * showSearchResults\n */\nfunction showSearchResults() {\n /* Make search results visible */\n $('.results-card .card-header').removeClass('d-none');\n $('.results-card .card-body').removeClass('d-none');\n}\n\n/**\n * Draw the picker window after the user selected a store\n * @param {*} data - webservice result object containing the right window\n */\nfunction drawPickerWindow(data) {\n /* replace google maps with calendar */\n $('#mapdiv').slideUp();\n $('#pickerdiv').empty();\n $('#pickerdiv').append(data);\n\n setPickerButtonEvents();\n drawPickerSetDate();\n}\n\n/**\n * removeStoreInfo\n */\nfunction removeStoreInfo() {\n $('.card-header').removeClass('d-none');\n $('.card-body').removeClass('d-none');\n $('.store-info-flush').empty();\n}\n\n/**\n * backToSearch\n */\nfunction backToSearch() {\n removeStoreInfo();\n showSearchResults();\n}\n\n/**\n * drawStoreInfo\n * @param {*} selectedStoreInfo - html with store info\n */\nfunction drawStoreInfo(selectedStoreInfo) {\n $('.store-info-flush').empty();\n $('.store-info-flush').append(selectedStoreInfo);\n $('.store-info-flush').find('.slotinfocard').addClass('d-none');\n}\n\n/**\n * moveProcessBar\n * @param {*} step step the bar schould be moved to\n */\nfunction moveProcessBar(step) {\n $('.dw-wizard').find(`.dw-wizard-progress-item[data-progress=\"${step}\"]`).addClass('is-active');\n $('.dw-wizard').find(`.dw-wizard-progress-item[data-progress!=\"${step}\"]`).removeClass('is-active');\n}\n\n/**\n * hideSearchResults\n */\nfunction hideSearchResults() {\n $('.results-card .card-header').addClass('d-none');\n $('.results-card .card-body').addClass('d-none');\n}\n\n/**\n * selectStore\n * Select a new store and remove basket elements if required\n * @param {*} element - calling element containing storeId and action url\n * @param {boolean} removeItems - true if items are to be removed\n */\nfunction selectStoreId(element, removeItems) {\n const storeId = element.getAttribute('data-storeid');\n\n moveProcessBar(3);\n slideUpSearchForm('#buttonshowMap');\n hideSearchResults();\n showCorrectStoreResultButtons(storeId);\n\n /* draw slot picker */\n $.spinner().start();\n let url = element.getAttribute('data-action');\n url = `${url}?id=${storeId}`;\n\n $.ajax({\n url,\n type: 'get',\n dataType: 'html',\n success(response) {\n updateHeader();\n $.spinner().stop();\n\n // drawPickerWindow(response);\n\n url = $('#mystore').data('url');\n url = `${url}?noPopup=${true}&hideButtons=${true}`;\n\n $.ajax({\n url,\n type: 'get',\n dataType: 'html',\n success(storeInfo) {\n drawStoreInfo(storeInfo);\n },\n });\n\n $('.storepopover').removeClass('d-none');\n\n if (removeItems) {\n removeNotAvailableItemsFromBasket();\n }\n },\n });\n}\n\n/**\n * checkBasketAvailability\n * @param {*} element element with storeid\n */\nfunction checkBasketAvailability(element) {\n const storeId = $(element).data('storeid');\n let url = $('#changeStoreModal').data('getnotavailableitemsaction');\n\n $.spinner().start();\n url = `${url}?id=${storeId}`;\n\n $.ajax({\n url,\n type: 'get',\n dataType: 'json',\n success(data) {\n $.spinner().stop();\n\n if (data.notAvailableItems.quantity > 0) {\n /* update modal text with items and store name */\n const storeName = $(element).data('storename');\n $('#nbItemsToBeRemoved').text(data.notAvailableItems.quantity);\n $('#storeNameToBeChangedTo').text(`${storeName}.`);\n\n const minicartQuantity = parseInt($('.minicart-quantity .text').text().trim(), 10);\n const updatedQuantity = minicartQuantity - data.notAvailableItems.quantity;\n\n if (updatedQuantity == 0 ) {\n // Show line acording to the cart estate\n $('#divCartFull').removeClass('d-flex');\n $('#divCartFull').addClass('d-none');\n $('#divCartEmpty').removeClass('d-none');\n $('#divCartEmpty').addClass('d-flex');\n } else {\n $('#divCartEmpty').removeClass('d-flex');\n $('#divCartEmpty').addClass('d-none');\n $('#divCartFull').removeClass('d-none');\n $('#divCartFull').addClass('d-flex');\n }\n\n $('#btn-continue-box').unbind('click');\n $('#btn-continue-box').click(() => {\n $('.minicart-quantity').empty().append(`${updatedQuantity}`);\n selectStoreId(element, true); });\n $('#changeStoreModal').modal();\n } else {\n selectStoreId(element, false);\n\n }\n },\n });\n}\n\n/**\n * setSelectStoreEvents\n */\nfunction setSelectStoreEvents() {\n $('.selectstore').click(function () { checkBasketAvailability(this); });\n}\n\n/**\n *\n * @param {*} element - element containing preferredStoreId\n */\nfunction drawStoreProfilePage(element) {\n const storeId = $(element).data('storeid');\n let url = $(element).data('action');\n url = `${url}?storeId=${storeId}`;\n\n $.spinner().start();\n\n $.ajax({\n url,\n type: 'get',\n dataType: 'json',\n success(data) {\n $.spinner().stop();\n\n slideUpSearchForm('#buttonshowMap');\n hideSearchResults();\n drawStoreInfo(data.selectedStoreInfo);\n showCorrectStoreResultButtons();\n\n setSelectStoreEvents();\n },\n });\n\n //This request renders a page designer page in the place of map container (maybe a future feature to implements)\n\n // url = $(element).data('profileurl');\n // url = `${url}?storeId=${storeId}`;\n\n // $.ajax({\n // url,\n // type: 'get',\n // dataType: 'html',\n // success(response) {\n // $('#mapdiv').slideUp();\n // $('#pickerdiv').empty();\n // $('#pickerdiv').append(response);\n // },\n // });\n}\n\n/**\n * setProfilePageEvents\n */\nfunction setProfilePageEvents() {\n $('.list-group-flush .store-profile-link').click(function () { drawStoreProfilePage(this); });\n $('#mapdiv .store-profile-link').click(function () { drawStoreProfilePage(this); });\n}\n\n/**\n* Returns the zoom level at which the given rectangular region fits in the map view.\n* The zoom level is computed for the currently selected map type.\n* @param {google.maps.Map} map\n* @param {google.maps.LatLngBounds} bounds\n* @return {Number} zoom level\n**/\nfunction getZoomByBounds( map, bounds ){\n var MAX_ZOOM = map.mapTypes.get( map.getMapTypeId() ).maxZoom || 21 ;\n var MIN_ZOOM = map.mapTypes.get( map.getMapTypeId() ).minZoom || 0 ;\n\n var ne= map.getProjection().fromLatLngToPoint( bounds.getNorthEast() );\n var sw= map.getProjection().fromLatLngToPoint( bounds.getSouthWest() );\n\n var worldCoordWidth = Math.abs(ne.x-sw.x);\n var worldCoordHeight = Math.abs(ne.y-sw.y);\n\n //Fit padding in pixels\n var FIT_PAD = 40;\n\n for( var zoom = MAX_ZOOM; zoom >= MIN_ZOOM; --zoom ){\n if( worldCoordWidth*(1< {\n const item = mapdiv[key];\n const lable = parseInt(key, 10) + 1;\n const storeLocation = new google.maps.LatLng(item.latitude, item.longitude);\n const marker = new google.maps.Marker({\n position: storeLocation,\n map,\n title: item.name,\n icon: pinImg,\n // icon: markerImg,\n // label: { text: lable.toString(), color: \"white\", fontSize: \"16px\" },\n });\n\n marker.addListener('click', () => {\n infowindow.setOptions({\n content: item.infoWindowHtml,\n });\n infowindow.open(map, marker);\n\n google.maps.event.addListener(infowindow, 'domready', () => {\n /* add events for google maps info window */\n setSelectStoreEvents();\n setProfilePageEvents();\n showCorrectStoreResultButtons(getPreferredStoreId());\n });\n });\n\n // Create a minimum bound based on a set of storeLocations\n bounds.extend(marker.position);\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 if (mapdiv.length === 1) {\n var listener = google.maps.event.addListener(map, \"idle\", function() {\n map.setZoom(16);\n google.maps.event.removeListener(listener);\n });\n }\n }\n}\n\n/**\n * setNextAvailableSlots for all list elements\n */\nfunction setNextAvailableSlots() {\n $('.storelist-desktop .list-group-flush .store-profile-link').each(function () {\n const storeId = $(this).data('storeid');\n let url = $(this).data('availableslot');\n url += `?storeid=${storeId}`;\n\n $.ajax({\n url,\n type: 'get',\n dataType: 'html',\n success(response) {\n const htmlSnippet = `${'
' +\n '' +\n ''}${\n response\n }
`;\n\n $('.storelist-mobile').find(`.storeListNextAvailableSlot[data-storeid='${storeId}']`).append(htmlSnippet);\n $('.storelist-desktop').find(`.storeListNextAvailableSlot[data-storeid='${storeId}']`).append(htmlSnippet);\n },\n });\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 const hasResults = data.stores.length > 0;\n const $resultsDiv = $('.results');\n const $mapDiv = $('.map-canvas');\n if (hasResults) {\n moveProcessBar(2);\n document.getElementById('mapdiv').scrollIntoView(true);\n $('.store-locator-no-results').hide();\n } else {\n const msgNoSearchResults = $('#buttoncard input').data('msgnoresult');\n $('#buttoncard input').addClass('is-invalid');\n $('#buttoncard .invalid-feedback').html(msgNoSearchResults);\n $('.store-locator-no-results').show();\n }\n\n if (data.radiusExtended) {\n $('#radius').val($('#radius option:first').val());\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 if ($mapDiv.data('has-google-api')) {\n maps();\n }\n\n if (data.storesResultsHtml) {\n $resultsDiv.append(data.storesResultsHtml);\n setNextAvailableSlots();\n }\n\n setSelectStoreEvents();\n setProfilePageEvents();\n showCorrectStoreResultButtons(getPreferredStoreId());\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 const dialog = element.closest('.in-store-inventory-dialog');\n const spinner = dialog.length ? dialog.spinner() : $.spinner();\n spinner.start();\n const $form = element.closest('.store-locator');\n const radius = $('.results').data('radius');\n let url = $form.attr('action');\n\n const extendRadiusWhenSearchEmpty = $('#radius').attr('data-changedbycustomer') !== 'true';\n const lat = $('#radius').data('lat');\n const long = $('#radius').data('long');\n const urlParams = {\n radius, extendRadiusWhenSearchEmpty, lat, long,\n };\n\n const inputElement = $form.find('#store-postal-code');\n const inputName = inputElement.attr('name');\n const inputValue = inputElement.val();\n\n const payload = $form.is('form') ? $form.serialize() : { [inputName]: inputValue };\n \n url = appendToUrl(url, urlParams);\n\n $.ajax({\n url,\n type: $form.attr('method'),\n data: payload,\n dataType: 'json',\n success(data) {\n spinner.stop();\n\n updateStoresResults(data);\n $('.select-store').prop('disabled', true);\n },\n });\n return false;\n}\n\n/**\n * showMap\n */\nfunction showMap() {\n moveProcessBar(1);\n backToSearch();\n\n /* Get Back the Map */\n $('#mapdiv').slideDown();\n if ($('.map-canvas').data('has-google-api')) {\n maps();\n }\n\n /* Delete the picker window */\n $('#pickerdiv').empty();\n}\n\nmodule.exports = {\n init() {\n if ($('.map-canvas').data('has-google-api')) {\n maps();\n }\n\n if (!$('.results').first().data('has-results')) {\n $('.store-locator-no-results').show();\n } else {\n $('.store-locator-no-results').hide();\n }\n\n setNextAvailableSlots();\n\n /* Set global button events */\n $('.slideUpSearchForm').click(() => {\n $('#searchform').slideDown();\n $('#closecard').slideUp();\n $('.store-info-flush').empty();\n });\n setProfilePageEvents();\n setSelectStoreEvents();\n showCorrectStoreResultButtons(getPreferredStoreId());\n $('#closeSearchResults').click(() => { backToSearch(); });\n $('#closeSearchResultsShowMap').click(() => { showMap(); });\n\n /* Show picker instead of Map */\n if ($('#mapdiv').data('hideafterinit')) {\n moveProcessBar(3);\n slideUpSearchForm('#buttonshowMap');\n hideSearchResults();\n // drawPickerSetDate();\n // setPickerButtonEvents();\n $('#mapdiv').hide();\n $('#buttonshowMap').click(() => { showMap(); });\n }\n /* Show picker instead of Map */\n if ($('#pickerdiv').data('hideafterinit')) {\n // slideUpSearchForm('#buttonshowMap');\n // hideSearchResults();\n drawPickerSetDate();\n setPickerButtonEvents();\n // $('#mapdiv').hide();\n // $('#buttonshowMap').click(() => { showMap(); });\n }\n },\n\n detectLocation() {\n // clicking on detect location.\n $('.detect-location').on('click', () => {\n $.spinner().start();\n if (!navigator.geolocation) {\n $.spinner().stop();\n return;\n }\n\n setTimeout(() => {\n $.spinner().stop();\n }, 3000);\n\n navigator.geolocation.getCurrentPosition((position) => {\n const $detectLocationButton = $('.detect-location');\n let url = $detectLocationButton.data('action');\n let radius = $('.results').data('radius');\n\n $('#radius').data('lat', position.coords.latitude);\n $('#radius').data('long', position.coords.longitude);\n\n const extendRadiusWhenSearchEmpty = $('#radius').attr('data-changedbycustomer') !== 'true';\n if (extendRadiusWhenSearchEmpty) {\n $('#radius').val($('#radius option:eq(1)').val());\n radius = $('#radius option:eq(1)').val();\n }\n const urlParams = {\n radius,\n lat: position.coords.latitude,\n long: position.coords.longitude,\n extendRadiusWhenSearchEmpty,\n };\n\n url = appendToUrl(url, urlParams);\n $.ajax({\n url,\n type: 'get',\n dataType: 'json',\n success(data) {\n $.spinner().stop();\n updateStoresResults(data);\n $('.select-store').prop('disabled', true);\n },\n });\n });\n });\n },\n\n search() {\n $('.store-locator-container form.store-locator').submit(function (e) {\n e.preventDefault();\n search($(this));\n });\n // Input for postalCode verification (numeric-postalCode or text-city)\n $('#store-postal-code').on('focusout', function () {\n const inputValue = $(this).val().trim();\n if (/^\\d+$/.test(inputValue)) {\n $(this).attr('name', 'postalCode');\n } else if (/^[a-zA-Z\\s]+$/.test(inputValue)) {\n $(this).attr('name', 'city');\n }\n });\n $('.store-locator-container .btn-storelocator-search[type=\"button\"]').click(function (e) {\n e.preventDefault();\n search($(this));\n });\n },\n\n changeRadius() {\n $('.store-locator-container .radius').change(function () {\n const radius = $(this).val();\n const searchKeys = $('.results').data('search-key');\n let url = $(this).data('action-url');\n const extendRadiusWhenSearchEmpty = false;\n const lat = $('#radius').data('lat') || searchKeys.lat;\n const long = $('#radius').data('long') || searchKeys.long;\n const urlParams = {\n radius,\n extendRadiusWhenSearchEmpty,\n lat,\n long,\n };\n\n if (searchKeys.postalCode) {\n urlParams.postalCode = searchKeys.postalCode;\n }\n\n $('#radius').attr('data-changedbycustomer', !extendRadiusWhenSearchEmpty);\n $('#radius').data('changedbycustomer', !extendRadiusWhenSearchEmpty);\n url = appendToUrl(url, urlParams);\n\n const dialog = $(this).closest('.in-store-inventory-dialog');\n const spinner = dialog.length ? dialog.spinner() : $.spinner();\n spinner.start();\n $.ajax({\n url,\n type: 'get',\n dataType: 'json',\n success(data) {\n spinner.stop();\n updateStoresResults(data);\n $('.select-store').prop('disabled', true);\n },\n });\n });\n },\n selectStore() {\n $('.store-locator-container').on('click', '.select-store', ((e) => {\n e.preventDefault();\n const selectedStore = $(':checked', '.results-card .results');\n const 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 updateSelectStoreButton() {\n $('body').on('change', '.select-store-input', (() => {\n $('.select-store').prop('disabled', false);\n }));\n },\n};\n"],"sourceRoot":""}