{"version":3,"file":"search.js","sources":["webpack:///webpack/bootstrap","webpack:///./app_lre/cartridge/client/default/js/product/wishlistHeart.js","webpack:///./app_lre/cartridge/client/default/js/search.js","webpack:///./app_lre/cartridge/client/default/js/search/search.js","webpack:///./storefront-reference-architecture/cartridges/app_storefront_base/cartridge/client/default/js/components/focus.js","webpack:///./storefront-reference-architecture/cartridges/app_storefront_base/cartridge/client/default/js/product/base.js","webpack:///./storefront-reference-architecture/cartridges/app_storefront_base/cartridge/client/default/js/product/quickView.js","webpack:///./storefront-reference-architecture/cartridges/app_storefront_base/cartridge/client/default/js/search/search.js","webpack:///./storefront-reference-architecture/cartridges/app_storefront_base/cartridge/client/default/js/util.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 = \"./app_lre/cartridge/client/default/js/search.js\");\n","'use strict';\n\n/**\n * appends params to a url\n * @param {Object} $elementAppendTo - data returned from the server's ajax call\n * @param {string} msg - icon that was clicked to add a product to the wishlist\n*/\nfunction displayErrorMessage($elementAppendTo, msg) {\n if ($('.remove-from-wishlist-messages').length === 0) {\n $elementAppendTo.append(\n '
'\n );\n }\n $('.remove-from-wishlist-messages')\n .append('
' + msg + '
');\n\n setTimeout(function () {\n $('.remove-from-wishlist-messages').remove();\n }, 3000);\n}\n\n/**\n * renders the list up to a given page number\n * @param {number} pageNumber - current page number\n * @param {boolean} spinner - if the spinner has already started\n * @param {string} focusElementSelector - selector of the element to focus on\n */\nfunction renderNewPageOfItems(pageNumber, spinner, focusElementSelector) {\n var publicView = $('.wishlistItemCardsData').data('public-view');\n var listUUID = $('.wishlistItemCardsData').data('uuid');\n var url = $('.wishlistItemCardsData').data('href');\n if (spinner) {\n $.spinner().start();\n }\n var scrollPosition = document.documentElement.scrollTop;\n var newPageNumber = pageNumber;\n $.ajax({\n url: url,\n method: 'get',\n data: {\n pageNumber: ++newPageNumber,\n publicView: publicView,\n id: listUUID\n }\n }).done(function (data) {\n $('.wishlistItemCards').empty();\n $('body .wishlistItemCards').append(data);\n\n if (focusElementSelector) {\n $(focusElementSelector).focus();\n } else {\n document.documentElement.scrollTop = scrollPosition;\n }\n }).fail(function () {\n $('.more-wl-items').remove();\n });\n $.spinner().stop();\n}\n\n/**\n * appends params to a url\n * @param {string} data - data returned from the server's ajax call\n * @param {Object} icon - icon that was clicked to add a product to the wishlist\n */\nfunction displayMessageAndChangeIcon(data, icon) {\n $.spinner().stop();\n /**\n var status;\n if (data.success) {\n status = 'alert-success';\n // if (icon.hasClass('fa-heart-o')) {\n // icon.removeClass('fa-heart-o').addClass('fa-heart');\n // }\n } else {\n status = 'alert-danger';\n }\n\n if ($('.add-to-wishlist-messages').length === 0) {\n $('body').append(\n '
'\n );\n }\n $('.add-to-wishlist-messages')\n .append('
' + data.msg + '
');\n\n setTimeout(function () {\n $('.add-to-wishlist-messages').remove();\n }, 5000);\n */\n}\n\n/**\n * Add an item to a localStorage() array\n * @param {String} name The localStorage() key\n * @param {String} value The localStorage() value\n */\n\nfunction addToLocalWishlist(name, value) {\n var existing = localStorage.getItem(name);\n existing = existing ? existing.split(',') : [];\n existing.push(value);\n localStorage.setItem(name, existing.toString());\n}\n\nfunction removeFromLocalWishlist(name, value) {\n var existing = localStorage.getItem(name);\n existing = existing ? existing.split(',') : [];\n var eIndex = existing.indexOf(value);\n existing.splice(eIndex, 1);\n localStorage.setItem(name, existing.toString());\n}\n\n// 78210\n// 86401\n$(document).ready(function () {\n var userAuth = $('.search-results').data('iscustomerauthenticated');\n if (userAuth) {\n var datapiwl = $('.search-results').data('prodsinwishlist');\n if (datapiwl !== '') {\n datapiwl = datapiwl ? datapiwl.split(',') : [];\n localStorage.setItem('prodsinwishlist', datapiwl.toString());\n for (var i = 0; i < datapiwl.length; i++) {\n $('[data-pid=' + datapiwl[i] + '] .wishlistTile').removeClass(\"addToWishlist\").addClass(\"removeFromWishlist wishlist-product-isadded\");\n }\n } else {\n localStorage.removeItem('prodsinwishlist');\n }\n }\n});\n\n\nfunction loadauthAccountModel(name, value) {\n $('#authAccountModal').modal({\n backdrop: 'static',\n keyboard: false\n });\n $('#authAccountModal').attr(\"data-pid\", value);\n $('#authAccountClose').attr(\"data-url\", name);\n $('#authAccountClose').attr(\"data-test\", \"name\");\n}\n\n// 45260\n\nmodule.exports = {\n addToWishlist: function () {\n $('body').on('click', '.addToWishlist', function (e) {\n e.preventDefault();\n var icon = $(this).find($('i'));\n var url = $(this).attr('href');\n var dataurl = $(this).data('url');\n var pid = $(this).closest('.product').data('pid');\n var optionId = $(this).closest('.product-detail').find('.product-option').attr('data-option-id');\n var optionVal = $(this).closest('.product-detail').find('.options-select option:selected').attr('data-value-id');\n var wishListIcon = $(this);\n var userAuth = $(this).closest('.search-results').data('iscustomerauthenticated');\n optionId = optionId || null;\n optionVal = optionVal || null;\n if (!url || !pid) {\n return;\n }\n $.spinner().start();\n $.ajax({\n url: url,\n type: 'post',\n dataType: 'json',\n data: {\n pid: pid,\n optionId: optionId,\n optionVal: optionVal\n },\n success: function (data) {\n if (!userAuth) {\n loadauthAccountModel(dataurl, pid);\n } else {\n wishListIcon.removeClass(\"addToWishlist\");\n wishListIcon.addClass(\"removeFromWishlist wishlist-product-isadded\");\n addToLocalWishlist('prodsinwishlist', pid);\n }\n displayMessageAndChangeIcon(data, icon);\n },\n error: function (err) {\n displayMessageAndChangeIcon(err, icon);\n }\n });\n });\n },\n removeFromWishlist: function () {\n $('body').on('click', '.removeFromWishlist', function (e) {\n e.preventDefault();\n var url = $(this).attr('data-url');\n var pid = $(this).closest('.product').attr('data-pid');\n var elMyAccount = $('.account-wishlist-item').length;\n // var wishListIcon = $(this);\n // If user is in my account page, call removeWishlistAccount() end point, re-render wishlist cards\n if (elMyAccount > 0) {\n $('.wishlist-account-card').spinner().start();\n $.ajax({\n url: url,\n type: 'get',\n dataType: 'html',\n data: {},\n success: function (html) {\n $('[data-pid=' + pid + ']').find('.wishlistTile').removeClass(\"removeFromWishlist\").addClass(\"addToWishlist\");\n $('.wishlist-account-card>.card').remove();\n $('.wishlist-account-card').append(html);\n $('.wishlist-account-card').spinner().stop();\n if (pid !== \"\") {\n removeFromLocalWishlist('prodsinwishlist', pid);\n }\n },\n error: function () {\n var $elToAppend = $('.wishlist-account-card');\n $elToAppend.spinner().stop();\n var msg = $elToAppend.data('error-msg');\n displayErrorMessage($elToAppend, msg);\n }\n });\n // else user is in wishlist landing page, call removeProduct() end point, then remove this card\n } else {\n $.spinner().start();\n $.ajax({\n url: url,\n type: 'get',\n dataType: 'json',\n data: {},\n success: function () {\n // wishListIcon.removeClass(\"removeFromWishlist\");\n // wishListIcon.addClass(\"addToWishlist\");\n $('[data-pid=' + pid + ']').find('.wishlistTile').removeClass(\"removeFromWishlist\").addClass(\"addToWishlist\");\n var pageNumber = $('.wishlistItemCardsData').data('page-number') - 1;\n renderNewPageOfItems(pageNumber, false);\n if (pid !== \"\") {\n removeFromLocalWishlist('prodsinwishlist', pid);\n }\n },\n error: function () {\n $.spinner().stop();\n var $elToAppendWL = $('.wishlistItemCards');\n var msg = $elToAppendWL.data('error-msg');\n displayErrorMessage($elToAppendWL, msg);\n }\n });\n }\n });\n }\n};\n","'use strict';\nvar processInclude = require('base/util');\n$(document).ready(function () {\n processInclude(require('./search/search'));\n processInclude(require('base/product/quickView'));\n // PMangalore - Wishlist\n // Is there a better way to selectively reference certain files? This could cause conflicts\n processInclude(require('./product/wishlistHeart'));\n});\n","'use strict';\nvar base = require('base/product/base');\nvar searchBase = require('base/search/search');\nvar searchExport = {};\n// 78079\n// 165827\nvar userAuth = $('.search-results').data('iscustomerauthenticated');\n\n[searchBase].forEach(function (library) {\n Object.keys(library).forEach(function (item) {\n if (typeof library[item] === 'object') {\n searchExport[item] = $.extend({}, base[item], library[item]);\n } else {\n searchExport[item] = library[item];\n }\n });\n});\n\nsearchExport.clickToPdp = function () {\n $('.container').off('click', 'form button.product-tile-btn');\n $('.container').on('click', 'form button.product-tile-btn', function (e) {\n e.preventDefault();\n window.location.href = $(this).attr('formaction');\n });\n};\n\nfunction updateSortOptions(response) {\n var $tempDom = $('
').append($(response));\n var sortOptions = $tempDom.find('.grid-footer').data('sort-options').options;\n sortOptions.forEach(function (option) {\n $('option.' + option.id).val(option.url);\n });\n}\n\nfunction updateDom($results, selector) {\n var $updates = $results.find(selector);\n $(selector).empty().html($updates.html());\n}\n\nfunction handleRefinements($results) {\n $('.refinement.active').each(function () {\n $(this).removeClass('active');\n var activeDiv = $results.find('.' + $(this)[0].className.replace(/ /g, '.'));\n activeDiv.addClass('active');\n activeDiv.find('button.title').attr('aria-expanded', 'true');\n });\n\n updateDom($results, '.refinements');\n}\n// 26723 Change Start\n/* Parse the response and replace only selected classes */\nfunction parseResults(response) {\n var $results = $(response);\n var specialHandlers = {\n '.refinements': handleRefinements\n };\n\n // Update DOM elements that do not require special handling\n [\n '.grid-header',\n '.header-bar',\n '.header.page-title',\n '.product-grid',\n '.show-more',\n '.filter-bar',\n '.tile-count',\n '#filterSubCategory'\n ].forEach(function (selector) {\n updateDom($results, selector);\n });\n\n Object.keys(specialHandlers).forEach(function (selector) {\n specialHandlers[selector]($results);\n });\n $('.lre-attributes').each(function (key, value) {\n var filterId = '#' + value.id;\n if (value.id !== 'filterproducttype') {\n updateDom($results, filterId);\n }\n });\n}\nfunction parseResponse(response) {\n var $results = $(response);\n var specialHandlers = {\n '.refinements': handleRefinements\n };\n\n // Update DOM elements that do not require special handling\n [\n '.grid-header',\n '.header-bar',\n '.header.page-title',\n '.product-grid',\n '.show-more',\n '.filter-bar',\n '.tile-count'\n ].forEach(function (selector) {\n updateDom($results, selector);\n });\n Object.keys(specialHandlers).forEach(function (selector) {\n specialHandlers[selector]($results);\n });\n}\n// Reset all the filters when there are no filters applied\nfunction resetFilters(response) {\n var $results = $(response);\n var specialHandlers = {\n '.refinements': handleRefinements\n };\n\n // Update DOM elements that do not require special handling\n [\n '.grid-header',\n '.header-bar',\n '.header.page-title',\n '.product-grid',\n '.show-more',\n '.filter-bar',\n '.tile-count',\n '#filterSubCategory'\n ].forEach(function (selector) {\n updateDom($results, selector);\n });\n\n Object.keys(specialHandlers).forEach(function (selector) {\n specialHandlers[selector]($results);\n });\n /* Story ID - 26254 Change Start Refresh the refinements when all the filters are cleared */\n $('.lre-attributes').each(function (key, value) {\n var filterId = '#' + value.id;\n updateDom($results, filterId);\n });\n /* Story ID - 26254 Change End*/\n}\n// 26723 Change End\n// 86401\nfunction updateFromLocalStorage() {\n var datapiwl = localStorage.getItem('prodsinwishlist');\n if (datapiwl !== '') {\n datapiwl = datapiwl ? datapiwl.split(',') : [];\n for (var i = 0; i < datapiwl.length; i++) {\n $('[data-pid=' + datapiwl[i] + '] .wishlistTile').removeClass(\"addToWishlist\").addClass(\"removeFromWishlist wishlist-product-isadded\");\n }\n }\n}\n\nsearchExport.initialize = function () {\n function getDocHeight() {\n var D = document;\n return Math.max(\n D.body.scrollHeight, D.documentElement.scrollHeight,\n D.body.offsetHeight, D.documentElement.offsetHeight,\n D.body.clientHeight, D.documentElement.clientHeight\n );\n }\n\n $(document).ready(function () {\n // 59035 Mobile Filter Start\n var mobileFilterFlag = false;\n function setApplyBtnDisabled() {\n if (mobileFilterFlag === false) {\n $('#applyFiltersMobile').attr('disabled', true);\n } else {\n $('#applyFiltersMobile').attr('disabled', false);\n }\n }\n // 59035 Mobile Filter Start\n var lastScrollTop = 0;\n function scrollFunction() {\n var st = $(this).scrollTop();\n if (st > lastScrollTop) {\n var footerHeight = $('#footercontent').outerHeight();\n if ($(window).scrollTop() + $(window).height() > getDocHeight() - footerHeight) {\n $(window).unbind(\"scroll\");\n var showMoreUrl = $('div.infinite-scroll').data('url');\n var currentPage = $('div.infinite-scroll').data('currentpage');\n var maxPage = $('div.infinite-scroll').data('maxpage');\n if (currentPage < maxPage) {\n $('.inline-loader').show();\n $('.inline-loader span').focus();\n $.ajax({\n url: showMoreUrl,\n data: { selectedUrl: showMoreUrl },\n method: 'GET',\n success: function (response) {\n $('.grid-footer').replaceWith(response);\n updateSortOptions(response);\n $('.inline-loader').hide();\n // 90066\n if (userAuth) {\n updateFromLocalStorage();\n }\n $(window).scroll(scrollFunction);\n },\n error: function () {\n $('.inline-loader').hide();\n }\n });\n }\n }\n }\n lastScrollTop = st;\n // 22196 Start\n $(window).scroll(function () {\n if ($(window).scrollTop() > 0) {\n $('body').addClass('nav-sticky');\n // $('.header-top-banner').slideUp(); Story#60324\n $('.back-to-top').fadeIn();\n } else {\n $('body').removeClass('nav-sticky');\n // $('.header-top-banner').slideDown(); Story#60324\n $('.back-to-top').fadeOut();\n }\n });\n // 22196 End\n }\n var frmlen = document.forms.length;\n for (var i = 0; i < frmlen; i++) {\n document.forms[i].reset();\n }\n $('.product-tiles__list').slick({\n dots: false,\n arrows: true,\n slidesToShow: 3,\n infinite: true,\n responsive: [\n {\n breakpoint: 780,\n settings: {\n arrows: true,\n slidesToShow: 2,\n infinite: true\n }\n }\n ]\n });\n $(document).on('afterChange', '.product-tiles__list', function (slick) {\n // 25291 start\n setTimeout(() => {\n $(this).find('.slick-current').find('a').eq(0)\n .focus();\n }, 300);\n // 25291 end\n });\n\n /** *************************** Filter Section ****************************** **/\n var list = [];\n var filterStatus = false;\n // 26723 Change Start\n // To hide the filters box when they are empty\n function hideEmptyFilters() {\n $('.c-filter__content').each(function () {\n if ($(this).find('.c-filter__option').length === 0) {\n $('#' + $(this).attr('id') + 'Button').parent('li').hide();\n } else {\n $('#' + $(this).attr('id') + 'Button').parent('li').show();\n }\n });\n }\n // 26723 Change End\n /* On click of CLOSE BUTTON on the selected filter */\n $(document).on('click', '.c-filter__unselect', function () {\n $.spinner().start();\n $(this).parents('.c-filter__selected-item').remove();\n $(\"#\" + $(this).attr('data-targeinput')).prop('checked', false);\n $(\"#\" + $(this).attr('data-targeinput')).trigger('change');\n if (list === undefined || list.length === 0) {\n var url = $('.c-filter__clear button').attr('data-href');\n $.ajax({\n url: url,\n data: {\n page: $('.grid-footer').data('page-number'),\n selectedUrl: $(this).data('href')\n },\n method: 'GET',\n success: function (response) {\n // 26723 Change Start\n resetFilters(response); // Reset All the filters if there is no filter selection\n hideEmptyFilters();\n // 26723 Change End\n $('.c-filter__options-list input:checked').trigger('change');\n // 90066\n if (userAuth) {\n updateFromLocalStorage();\n }\n $.spinner().stop();\n $(window).scroll(scrollFunction);\n },\n error: function () {\n $.spinner().stop();\n }\n });\n } else {\n // 24623 - Change Start - Setting timer to display the spinner during the filter removal\n setTimeout(function () {\n $.spinner().stop();\n }, 5000);\n // 24623 - Change End\n }\n });\n\n $(document).on('keyup', '.c-filter__unselect', function (e) {\n e.preventDefault();\n if (e.keyCode === 13) {\n $(this).parents('.c-filter__selected-item').remove();\n $(\"#\" + $(this).attr('data-targeinput')).prop('checked', false);\n $(\"#\" + $(this).attr('data-targeinput')).trigger('change');\n }\n });\n /* On click of CLEAR ALL FILTERS */\n $(document).on('click', '.c-filter__clear button', function (e) {\n e.preventDefault();\n e.stopPropagation();\n $.spinner().start();\n $(this).parent().prev('.c-filter__selected-list').find('.c-filter__selected-item')\n .remove();\n $('.c-filter__selected').hide();\n $('.c-filter__item button').removeClass('selected');\n $('.c-filter__options-list input').prop('checked', false); // 90066 .trigger('change');\n $.ajax({\n url: $(this).data('href'),\n data: {\n page: $('.grid-footer').data('page-number'),\n selectedUrl: $(this).data('href')\n },\n method: 'GET',\n success: function (response) {\n // 26723 - Change Start\n resetFilters(response); // Reset All the filters if there is no filter selection\n hideEmptyFilters();\n // 26723 Change End\n $('.c-filter__options-list input:checked').trigger('change');\n $('.c-filter__content').collapse('hide');\n $('.tile-count span:visible').focus();\n // 90066\n if (userAuth) {\n updateFromLocalStorage();\n }\n $.spinner().stop();\n $(window).scroll(scrollFunction);\n },\n error: function () {\n $.spinner().stop();\n }\n });\n });\n /* Disable the APPLY button if there is no selected filter */\n /* Disables only after the Apply button is clicked atleast once */\n function disableApplyBtn() {\n if ($('.c-filter__selected-list .c-filter__selected-item').length === 0) {\n if (filterStatus === true) {\n $('.apply').prop('disabled', false);\n } else {\n $('.apply').prop('disabled', true);\n }\n } else {\n $('.apply').prop('disabled', false);\n }\n }\n function populateFilters() {\n $('.c-filter__selected-list').html('');\n list = [];\n $('.c-filter__options-list input').each(function () {\n if ($(this).is(':checked') === true) {\n list.push($(this).attr('data-href'));\n $('#' + $(this).data('parentfilter')).addClass('selected');\n $('.c-filter__selected').show();\n $('.c-filter__selected-list')\n .append(`
  • \n
    ` + $(this).next('label').text() + `\n \n
    \n
  • `);\n }\n });\n\n // 59035\n var contentId;\n var contentLength;\n var contentSelector;\n $('.c-filter__content').each(function () {\n contentId = $(this).attr('id');\n contentSelector = '#' + contentId + 'ButtonMobile span';\n contentLength = $(this).find('input:checked').length;\n if (contentLength > 0) {\n if (contentLength === 1) {\n $(contentSelector).removeAttr('aria-hidden').attr('aria-label', contentLength + ' Filter Selected').html(contentLength);\n } else {\n $(contentSelector).removeAttr('aria-hidden').attr('aria-label', contentLength + ' Filters Selected').html(contentLength);\n }\n } else {\n $(contentSelector).attr({ 'aria-hidden': true }).removeAttr('aria-label').html('');\n }\n });\n // 59035\n // 64851\n if ($('#filterCategoryButton').is(':visible') || $('#filterCategoryButtonMobile').is(':visible')) {\n if ($('#filterCategory').find('input:checked').length === 0) {\n /* Story ID - 26254 Change Start Remove Sub Category selection when the category is cleared */\n $('.sub-categories-options-list input:checked').prop('checked', false).trigger('change');\n /* Story ID - 26254 Change End */\n $('.sub-category-box').hide();\n }\n }\n /* Story ID - 25266 Change Start */\n /* Hiding the Sub Category Box when navigated to PLP from Navigation Menu of any Hidden Category */\n /* Hides the sub category filter when the category box is not visible AND sub category box is empty */\n if (!($('#filterCategoryButton').is(':visible')) && !($('#filterCategoryButtonMobile').is(':visible')) && $('.sub-categories-options-list').find('.c-filter__option').length === 0) {\n // $('#filterSubCategory').hide();\n $('.sub-category-box').hide();\n }\n /* Story ID - 25266 Change Start */\n hideEmptyFilters(); // 22196 - hide empty filters if it doesn't have any value\n disableApplyBtn();\n }\n populateFilters();\n function getCategoryParameterForUrl() {\n var categoryParameterForUrl = '';\n var selectedCategory = $('.c-filter__items').attr('data-selectedcategory');\n if ($('.sub-categories-options-list').find('input:checked').length !== 0) {\n selectedCategory = $('.sub-categories-options-list').find('input:checked').attr('data-refinement-value');\n } else if ($('.categories-options-list').find('input:checked').length !== 0) {\n selectedCategory = $('.categories-options-list').find('input:checked').attr('data-refinement-value');\n }\n // Assign only if the category is not null\n if (selectedCategory !== 'null') {\n categoryParameterForUrl = 'cgid=' + selectedCategory;\n }\n return categoryParameterForUrl;\n }\n function getAttributeParametersForUrl() {\n var attributeParametersForUrl = '';\n var filterid;\n var prefn = 'prefn';\n var prefv = 'prefv';\n var selectedLreAttributesCount = 1;\n $('.lre-attributes').each(function (key, value) {\n var $filter = $('#' + value.id);\n if ($filter.find('input:checked').length > 0) {\n filterid = $filter.find('input:checked').attr('data-refinement-id');\n attributeParametersForUrl += '&' + prefn + selectedLreAttributesCount + '=' + filterid;\n attributeParametersForUrl += '&' + prefv + selectedLreAttributesCount + '=';\n $filter.find('input:checked').each(function (index, element) {\n if (index === 0) {\n attributeParametersForUrl += $(this).attr('data-refinement-value');\n } else {\n attributeParametersForUrl += '|' + $(this).attr('data-refinement-value');\n }\n });\n selectedLreAttributesCount += 1;\n }\n });\n return attributeParametersForUrl;\n }\n /*\n * Function to include the search keywords into the url.\n * This function gets called when Apply button is clicked and checked it there are any searched words.\n * If yes, it will append in the URL. If no search words, it will return null.\n */\n function getSearchParametersForUrl() {\n var searchKeywords = $('#product-search-results').attr('data-searchkeywords');\n var searchParameterForUrl = '';\n if (searchKeywords !== 'null') {\n searchParameterForUrl = '&q=' + searchKeywords;\n }\n return searchParameterForUrl;\n }\n // 26723 - Change Start\n // Clear the selection of the box when there are no input fields selected in that filter is not selected\n function clearSelectedFilters() {\n $('.c-filter__items .c-filter__content').each(function () {\n var siblingFilters = $(this).find('.c-filter__options-list input').attr('data-parentfilter');\n if ($('input[data-parentfilter=\"' + siblingFilters + '\"]:checked').length === 0) {\n $(\"#\" + siblingFilters).removeClass('selected');\n }\n\n if ($('.c-filter__selected-list').find('li').length === 0) {\n $('.c-filter__selected').hide();\n }\n });\n }\n // 26723 Change End\n // 24623 - Change Start - Commenting this code related to apply button\n /* On click of APPLY button */\n /* $(document).on('click', '.apply', function (e) {\n e.preventDefault();\n e.stopPropagation();\n $.spinner().start();\n var url = $('.c-filter__items').attr('data-url');\n var newUrl = url + '?';\n var categoryParameterForUrl = getCategoryParameterForUrl();\n var attributeParametersForUrl = getAttributeParametersForUrl();\n // Append the search word as parameters in the URL.\n var searchParametersForUrl = getSearchParametersForUrl();\n if (searchParametersForUrl !== '' && categoryParameterForUrl === '') {\n newUrl = newUrl + searchParametersForUrl + attributeParametersForUrl;\n } else {\n newUrl = newUrl + categoryParameterForUrl + attributeParametersForUrl;\n }\n $.ajax({\n url: newUrl,\n data: {\n page: $('.grid-footer').data('page-number'),\n selectedUrl: $(this).data('href')\n },\n method: 'GET',\n success: function (response) {\n // 26723 Change Start Filters Fix- Reset the filters only if there are product tiles in the response\n var $results = $(response);\n var tileCount = $results.find('.tile-count').length;\n if (tileCount > 0) {\n parseResults(response);\n } else {\n parseResponse(response);\n }\n // 26723 Change End\n hideEmptyFilters(); // Hide the empty filter boxes if there don't have any values.\n populateFilters();\n clearSelectedFilters(); // Clear the filter box selextion, if no input values are selected in that filter\n filterStatus = true;\n $('.c-filter__content').collapse('hide');\n $('.tile-count span:visible').focus();\n $.spinner().stop();\n $('.common-product-grid .prod-description, .common-product-grid .tile-date, .common-product-grid .price .value').attr('tabindex', '0');\n $(window).scroll(scrollFunction);\n },\n error: function () {\n $.spinner().stop();\n }\n });\n }); */\n // 24623 - Change End\n $(document).on('change', '.c-filter__options-list input', function (e) {\n e.preventDefault();\n e.stopPropagation();\n $.spinner().start();\n populateFilters();\n mobileFilterFlag = true;\n setApplyBtnDisabled();\n var siblingFilters = $(this).attr('data-parentfilter');\n\n if ($('input[data-parentfilter=\"' + siblingFilters + '\"]:checked').length === 0) {\n $(\"#\" + siblingFilters).removeClass('selected');\n }\n\n if ($('.c-filter__selected-list').find('li').length === 0) {\n $('.c-filter__selected').hide();\n }\n // 24623 - Change Start - On change of filter options, the filters should get automatically applied based on selection\n var url = $('.c-filter__items').attr('data-url');\n var newUrl = url + '?';\n var categoryParameterForUrl = getCategoryParameterForUrl();\n var attributeParametersForUrl = getAttributeParametersForUrl();\n // Append the search word as parameters in the URL.\n var searchParametersForUrl = getSearchParametersForUrl();\n if (searchParametersForUrl !== '' && categoryParameterForUrl === '') {\n newUrl = newUrl + searchParametersForUrl + attributeParametersForUrl;\n } else {\n newUrl = newUrl + categoryParameterForUrl + attributeParametersForUrl;\n }\n $.ajax({\n url: newUrl,\n data: {\n page: $('.grid-footer').data('page-number'),\n selectedUrl: $(this).data('href')\n },\n method: 'GET',\n success: function (response) {\n parseResponse(response);\n hideEmptyFilters(); // Hide the empty filter boxes if there don't have any values.\n populateFilters();\n clearSelectedFilters(); // Clear the filter box selection, if no input values are selected in that filter\n filterStatus = true;\n // 59035 Hide on desktop only\n if ($('.c-filter__mobile').is(':visible') !== true) {\n $('.c-filter__content').collapse('hide');\n }\n // 59035\n $('.tile-count span:visible').focus();\n // 90066\n if (userAuth) {\n updateFromLocalStorage();\n }\n $.spinner().stop();\n $(window).scroll(scrollFunction);\n },\n error: function () {\n $.spinner().stop();\n }\n });\n // 24623 - Change End\n });\n /*\n * 24623 - On click of category filter, the subcategory box should load\n */\n function showSubCategoryFilter(response) {\n var $results = $(response);\n var specialHandlers = {\n '.refinements': handleRefinements\n };\n\n // Update DOM elements that do not require special handling\n [\n '.grid-header',\n '.header-bar',\n '.header.page-title',\n '.product-grid',\n '.show-more',\n '.filter-bar',\n '.tile-count',\n '#filterSubCategory'\n ].forEach(function (selector) {\n updateDom($results, selector);\n });\n Object.keys(specialHandlers).forEach(function (selector) {\n specialHandlers[selector]($results);\n });\n }\n // 24623 - Change End\n /* Ajax call to populate the Sub Category box on selection of category */\n $(document).on('change', '.categories-options-list input', function (e) {\n if ($('body').find('#filterCategoryButton').length !== 0 || $('body').find('#filterCategoryButtonMobile').length !== 0) {\n if ($('.categories-options-list').find('input:checked').length !== 0) {\n $('.sub-category-box').show();\n var url = $('.c-filter__items').attr('data-url');\n var newUrl = url + '?';\n // 26723 change start - Dynamically construct URL based on the filters selected.\n // Here only the Category is fetched because this is on Category change\n var selectedCategory;\n if ($('.categories-options-list').find('input:checked').length !== 0) {\n selectedCategory = $('.categories-options-list').find('input:checked').attr('data-refinement-value');\n }\n var attributeParametersForUrl = getAttributeParametersForUrl();\n newUrl = newUrl + 'cgid=' + selectedCategory + attributeParametersForUrl;\n // 26723 Change End\n $.spinner().start();\n $.ajax({\n url: newUrl,\n success: function (response) {\n // 24623 - Change Start\n var $results = $(response);\n var tileCount = $results.find('.tile-count').length;\n if (tileCount > 0) {\n parseResults(response); // if tile count is greater than 0, then change the filters.\n } else {\n showSubCategoryFilter(response); // if no products present, only load the sub category box and not change the rest filters\n }\n // 24623 - Change End\n populateFilters();\n hideEmptyFilters();\n // 59035 Hide on desktop only\n if ($('.c-filter__mobile').is(':visible') !== true) {\n $('.c-filter__content').collapse('hide');\n }\n // 59035\n // 90066\n if (userAuth) {\n updateFromLocalStorage();\n }\n $.spinner().stop();\n },\n error: function () {\n $.spinner().stop();\n }\n });\n } else {\n $('.sub-category-box').hide();\n $('.sub-categories-options-list').find('input:checked').prop('checked', false).trigger('change');\n $('.sub-category-box').next('.c-filter__content').html('');\n }\n }\n });\n /** *************************** Filter Section ****************************** **/\n // 64851\n // 59041 Mobile Sort Start\n if ($('body').find('#customSorting select').length !== 0) {\n var native = $('#customSorting select');\n var sortNav = $('.mobile-sort .mobile-sort__body .nav');\n var optionText;\n var optionId;\n\n // get and create custom link options\n native.children('option').each(function () {\n optionText = $(this).text();\n optionId = $(this).data('id');\n // Identify the \"sort by\" option and ignore\"\n if (optionText.toLowerCase().replace(/\\s/g, \"\") !== \"sortby\") {\n // append option as a link\n if ($(this).is(':selected') === true) {\n // get and set selected option\n sortNav.append('' + optionText.trim() + '');\n } else {\n sortNav.append('' + optionText.trim() + '');\n }\n }\n });\n }\n\n // Open custom mobile sort by click on sort button\n $('.c-btn__sort').on('click', function (e) {\n e.preventDefault();\n $('body').addClass('hide-sroller');\n $(this).addClass('active').attr('aria-expanded', true);\n $('#mobileSort').addClass('active');\n $('.custom-sort__link.active').focus();\n });\n\n // Close the sort by click on close button, sort backdrop, and sort item\n $('.btn-sort__close, .mobile-sort__backdrop').on('click', function (e) {\n e.preventDefault();\n $('body').removeClass('hide-sroller');\n $('.c-btn__sort').removeClass('active').attr('aria-expanded', false).focus();\n $('#mobileSort').removeClass('active');\n });\n $('.custom-sort__link').on('click', function (e) {\n e.preventDefault();\n $('body').removeClass('hide-sroller');\n $('.c-btn__sort').removeClass('active').attr('aria-expanded', false).focus();\n $('#mobileSort').removeClass('active');\n });\n\n // Loop sort\n $('.loop-sort').on('focus', function () {\n $('.btn-sort__close').focus();\n });\n // Update select value on click\n $('.custom-sort__link').on('click', function () {\n var thisLink = $(this);\n var thisId = $(this).data('id');\n $('.custom-sort__link').not(thisLink).removeAttr('aria-selected').removeClass('active');\n $(this).addClass('active').attr('aria-selected', true);\n $('#customSorting select option').prop('selected', false).removeAttr('selected');\n $('#customSorting select option[data-id=\"' + thisId + '\"]').prop('selected', true);\n $('#customSorting select').trigger('change');\n });\n\n // 59041 Mobile Sort Ends\n\n // 59035 Mobile Filter Start\n // Open custom mobile Filters by click on sort button\n $('.c-btn__filter').on('click', function (e) {\n e.preventDefault();\n $('body').addClass('hide-sroller');\n $(this).addClass('active').attr('aria-expanded', true);\n $('#mobileFilter').addClass('active');\n $('.c-filter__items').find('.btn-filter__mobile')[0].focus();\n mobileFilterFlag = false;\n setApplyBtnDisabled();\n $('#mobileFilter .c-filter__items .c-filter__content').each(function () {\n if ($(this).html().trim().length === 0) {\n $(this).html($(this).html().trim());\n $(this).prev('.btn-filter__mobile').hide();\n $(this).prev('.sub-category-box').hide();\n }\n });\n });\n\n // Close the filter by click on close button an apply filter button\n $('.btn-filter__close, #applyFiltersMobile').on('click', function (e) {\n e.preventDefault();\n $('body').removeClass('hide-sroller');\n $('.c-filter__content').collapse('hide');\n $('.c-btn__filter').removeClass('active').attr('aria-expanded', false).focus();\n $('#mobileFilter').removeClass('active');\n $(\".c-filter__selected__mobile\").html('');\n $(\".c-filter__selected .c-filter__selected-list\").clone().appendTo(\".c-filter__selected__mobile\");\n mobileFilterFlag = false;\n setApplyBtnDisabled();\n });\n\n // Clear filters\n $('#clearFiltersMobile').on('click', function () {\n $('.c-filter__clear button').trigger('click');\n setTimeout(function () {\n $('body').removeClass('hide-sroller');\n $('.c-btn__filter').removeClass('active').attr('aria-expanded', false).focus();\n $('#mobileFilter').removeClass('active');\n }, 1500);\n mobileFilterFlag = false;\n // 90066\n populateFilters();\n setApplyBtnDisabled();\n });\n // Loop sort\n $('.loop-filter').on('focus', function () {\n $('.btn-filter__close').focus();\n });\n // 59035 Mobile Filter Ends\n // 90066\n $(window).scroll(scrollFunction);\n });\n\n $(window).on('load', function () {\n $('.slick-arrow').each(function () {\n $(this).attr('title', $(this).attr('aria-label'));\n });\n });\n // 86401\n};\n\nsearchExport.sort = function () {\n // Handle sort order menu selection\n $('.container').on('change', '[name=sort-order]', function (e) {\n e.preventDefault();\n\n $.spinner().start();\n $(this).trigger('search:sort', this.value);\n $.ajax({\n url: this.value,\n data: { selectedUrl: this.value },\n method: 'GET',\n success: function (response) {\n $('.product-grid').empty().html(response);\n if (userAuth) {\n updateFromLocalStorage();\n }\n $.spinner().stop();\n },\n error: function () {\n $.spinner().stop();\n }\n });\n });\n};\n\nmodule.exports = searchExport;\n","'use strict';\n\nmodule.exports = {\n setTabNextFocus: function (focusParams) {\n var KEYCODE_TAB = 9;\n var isTabPressed = (focusParams.event.key === 'Tab' || focusParams.event.keyCode === KEYCODE_TAB);\n\n if (!isTabPressed) {\n return;\n }\n\n var firstFocusableEl = $(focusParams.containerSelector + ' ' + focusParams.firstElementSelector);\n var lastFocusableEl = $(focusParams.containerSelector + ' ' + focusParams.lastElementSelector);\n\n if ($(focusParams.containerSelector + ' ' + focusParams.lastElementSelector).is(':disabled')) {\n lastFocusableEl = $(focusParams.containerSelector + ' ' + focusParams.nextToLastElementSelector);\n if ($('.product-quickview.product-set').length > 0) {\n var linkElements = $(focusParams.containerSelector + ' a#fa-link.share-icons');\n lastFocusableEl = linkElements[linkElements.length - 1];\n }\n }\n\n if (focusParams.event.shiftKey) /* shift + tab */ {\n if ($(':focus').is(firstFocusableEl)) {\n lastFocusableEl.focus();\n focusParams.event.preventDefault();\n }\n } else /* tab */ {\n if ($(':focus').is(lastFocusableEl)) { // eslint-disable-line\n firstFocusableEl.focus();\n focusParams.event.preventDefault();\n }\n }\n }\n};\n","'use strict';\nvar focusHelper = require('../components/focus');\n\n/**\n * Retrieves the relevant pid value\n * @param {jquery} $el - DOM container for a given add to cart button\n * @return {string} - value to be used when adding product to cart\n */\nfunction getPidValue($el) {\n var pid;\n\n if ($('#quickViewModal').hasClass('show') && !$('.product-set').length) {\n pid = $($el).closest('.modal-content').find('.product-quickview').data('pid');\n } else if ($('.product-set-detail').length || $('.product-set').length) {\n pid = $($el).closest('.product-detail').find('.product-id').text();\n } else {\n pid = $('.product-detail:not(\".bundle-item\")').data('pid');\n }\n\n return pid;\n}\n\n/**\n * Retrieve contextual quantity selector\n * @param {jquery} $el - DOM container for the relevant quantity\n * @return {jquery} - quantity selector DOM container\n */\nfunction getQuantitySelector($el) {\n return $el && $('.set-items').length\n ? $($el).closest('.product-detail').find('.quantity-select')\n : $('.quantity-select');\n}\n\n/**\n * Retrieves the value associated with the Quantity pull-down menu\n * @param {jquery} $el - DOM container for the relevant quantity\n * @return {string} - value found in the quantity input\n */\nfunction getQuantitySelected($el) {\n return getQuantitySelector($el).val();\n}\n\n/**\n * Process the attribute values for an attribute that has image swatches\n *\n * @param {Object} attr - Attribute\n * @param {string} attr.id - Attribute ID\n * @param {Object[]} attr.values - Array of attribute value objects\n * @param {string} attr.values.value - Attribute coded value\n * @param {string} attr.values.url - URL to de/select an attribute value of the product\n * @param {boolean} attr.values.isSelectable - Flag as to whether an attribute value can be\n * selected. If there is no variant that corresponds to a specific combination of attribute\n * values, an attribute may be disabled in the Product Detail Page\n * @param {jQuery} $productContainer - DOM container for a given product\n * @param {Object} msgs - object containing resource messages\n */\nfunction processSwatchValues(attr, $productContainer, msgs) {\n attr.values.forEach(function (attrValue) {\n var $attrValue = $productContainer.find('[data-attr=\"' + attr.id + '\"] [data-attr-value=\"' +\n attrValue.value + '\"]');\n var $swatchButton = $attrValue.parent();\n\n if (attrValue.selected) {\n $attrValue.addClass('selected');\n $attrValue.siblings('.selected-assistive-text').text(msgs.assistiveSelectedText);\n } else {\n $attrValue.removeClass('selected');\n $attrValue.siblings('.selected-assistive-text').empty();\n }\n\n if (attrValue.url) {\n $swatchButton.attr('data-url', attrValue.url);\n } else {\n $swatchButton.removeAttr('data-url');\n }\n\n // Disable if not selectable\n $attrValue.removeClass('selectable unselectable');\n\n $attrValue.addClass(attrValue.selectable ? 'selectable' : 'unselectable');\n });\n}\n\n/**\n * Process attribute values associated with an attribute that does not have image swatches\n *\n * @param {Object} attr - Attribute\n * @param {string} attr.id - Attribute ID\n * @param {Object[]} attr.values - Array of attribute value objects\n * @param {string} attr.values.value - Attribute coded value\n * @param {string} attr.values.url - URL to de/select an attribute value of the product\n * @param {boolean} attr.values.isSelectable - Flag as to whether an attribute value can be\n * selected. If there is no variant that corresponds to a specific combination of attribute\n * values, an attribute may be disabled in the Product Detail Page\n * @param {jQuery} $productContainer - DOM container for a given product\n */\nfunction processNonSwatchValues(attr, $productContainer) {\n var $attr = '[data-attr=\"' + attr.id + '\"]';\n var $defaultOption = $productContainer.find($attr + ' .select-' + attr.id + ' option:first');\n $defaultOption.attr('value', attr.resetUrl);\n\n attr.values.forEach(function (attrValue) {\n var $attrValue = $productContainer\n .find($attr + ' [data-attr-value=\"' + attrValue.value + '\"]');\n $attrValue.attr('value', attrValue.url)\n .removeAttr('disabled');\n\n if (!attrValue.selectable) {\n $attrValue.attr('disabled', true);\n }\n });\n}\n\n/**\n * Routes the handling of attribute processing depending on whether the attribute has image\n * swatches or not\n *\n * @param {Object} attrs - Attribute\n * @param {string} attr.id - Attribute ID\n * @param {jQuery} $productContainer - DOM element for a given product\n * @param {Object} msgs - object containing resource messages\n */\nfunction updateAttrs(attrs, $productContainer, msgs) {\n // Currently, the only attribute type that has image swatches is Color.\n var attrsWithSwatches = ['color'];\n\n attrs.forEach(function (attr) {\n if (attrsWithSwatches.indexOf(attr.id) > -1) {\n processSwatchValues(attr, $productContainer, msgs);\n } else {\n processNonSwatchValues(attr, $productContainer);\n }\n });\n}\n\n/**\n * Updates the availability status in the Product Detail Page\n *\n * @param {Object} response - Ajax response object after an\n * attribute value has been [de]selected\n * @param {jQuery} $productContainer - DOM element for a given product\n */\nfunction updateAvailability(response, $productContainer) {\n var availabilityValue = '';\n var availabilityMessages = response.product.availability.messages;\n if (!response.product.readyToOrder) {\n availabilityValue = '
  • ' + response.resources.info_selectforstock + '
  • ';\n } else {\n availabilityMessages.forEach(function (message) {\n availabilityValue += '
  • ' + message + '
  • ';\n });\n }\n\n $($productContainer).trigger('product:updateAvailability', {\n product: response.product,\n $productContainer: $productContainer,\n message: availabilityValue,\n resources: response.resources\n });\n}\n\n/**\n * Generates html for product attributes section\n *\n * @param {array} attributes - list of attributes\n * @return {string} - Compiled HTML\n */\nfunction getAttributesHtml(attributes) {\n if (!attributes) {\n return '';\n }\n\n var html = '';\n\n attributes.forEach(function (attributeGroup) {\n if (attributeGroup.ID === 'mainAttributes') {\n attributeGroup.attributes.forEach(function (attribute) {\n html += '
    ' + attribute.label + ': '\n + attribute.value + '
    ';\n });\n }\n });\n\n return html;\n}\n\n/**\n * @typedef UpdatedOptionValue\n * @type Object\n * @property {string} id - Option value ID for look up\n * @property {string} url - Updated option value selection URL\n */\n\n/**\n * @typedef OptionSelectionResponse\n * @type Object\n * @property {string} priceHtml - Updated price HTML code\n * @property {Object} options - Updated Options\n * @property {string} options.id - Option ID\n * @property {UpdatedOptionValue[]} options.values - Option values\n */\n\n/**\n * Updates DOM using post-option selection Ajax response\n *\n * @param {OptionSelectionResponse} optionsHtml - Ajax response optionsHtml from selecting a product option\n * @param {jQuery} $productContainer - DOM element for current product\n */\nfunction updateOptions(optionsHtml, $productContainer) {\n\t// Update options\n $productContainer.find('.product-options').empty().html(optionsHtml);\n}\n\n/**\n * Dynamically creates Bootstrap carousel from response containing images\n * @param {Object[]} imgs - Array of large product images,along with related information\n * @param {jQuery} $productContainer - DOM element for a given product\n */\nfunction createCarousel(imgs, $productContainer) {\n var carousel = $productContainer.find('.carousel');\n $(carousel).carousel('dispose');\n var carouselId = $(carousel).attr('id');\n $(carousel).empty().append('
      ' + $(carousel).data('prev') + '' + $(carousel).data('next') + '');\n for (var i = 0; i < imgs.length; i++) {\n $('
      \"'
      ').appendTo($(carousel).find('.carousel-inner'));\n $('
    1. ').appendTo($(carousel).find('.carousel-indicators'));\n }\n $($(carousel).find('.carousel-item')).first().addClass('active');\n $($(carousel).find('.carousel-indicators > li')).first().addClass('active');\n if (imgs.length === 1) {\n $($(carousel).find('.carousel-indicators, a[class^=\"carousel-control-\"]')).detach();\n }\n $(carousel).carousel();\n $($(carousel).find('.carousel-indicators')).attr('aria-hidden', true);\n}\n\n/**\n * Parses JSON from Ajax call made whenever an attribute value is [de]selected\n * @param {Object} response - response from Ajax call\n * @param {Object} response.product - Product object\n * @param {string} response.product.id - Product ID\n * @param {Object[]} response.product.variationAttributes - Product attributes\n * @param {Object[]} response.product.images - Product images\n * @param {boolean} response.product.hasRequiredAttrsSelected - Flag as to whether all required\n * attributes have been selected. Used partially to\n * determine whether the Add to Cart button can be enabled\n * @param {jQuery} $productContainer - DOM element for a given product.\n */\nfunction handleVariantResponse(response, $productContainer) {\n var isChoiceOfBonusProducts =\n $productContainer.parents('.choose-bonus-product-dialog').length > 0;\n var isVaraint;\n if (response.product.variationAttributes) {\n updateAttrs(response.product.variationAttributes, $productContainer, response.resources);\n isVaraint = response.product.productType === 'variant';\n if (isChoiceOfBonusProducts && isVaraint) {\n $productContainer.parent('.bonus-product-item')\n .data('pid', response.product.id);\n\n $productContainer.parent('.bonus-product-item')\n .data('ready-to-order', response.product.readyToOrder);\n }\n }\n\n // Update primary images\n var primaryImageUrls = response.product.images.large;\n createCarousel(primaryImageUrls, $productContainer);\n\n // Update pricing\n if (!isChoiceOfBonusProducts) {\n var $priceSelector = $('.prices .price', $productContainer).length\n ? $('.prices .price', $productContainer)\n : $('.prices .price');\n $priceSelector.replaceWith(response.product.price.html);\n }\n\n // Update promotions\n $productContainer.find('.promotions').empty().html(response.product.promotionsHtml);\n\n updateAvailability(response, $productContainer);\n\n if (isChoiceOfBonusProducts) {\n var $selectButton = $productContainer.find('.select-bonus-product');\n $selectButton.trigger('bonusproduct:updateSelectButton', {\n product: response.product, $productContainer: $productContainer\n });\n } else {\n // Enable \"Add to Cart\" button if all required attributes have been selected\n $('button.add-to-cart, button.add-to-cart-global, button.update-cart-product-global').trigger('product:updateAddToCart', {\n product: response.product, $productContainer: $productContainer\n }).trigger('product:statusUpdate', response.product);\n }\n\n // Update attributes\n $productContainer.find('.main-attributes').empty()\n .html(getAttributesHtml(response.product.attributes));\n}\n\n/**\n * @typespec UpdatedQuantity\n * @type Object\n * @property {boolean} selected - Whether the quantity has been selected\n * @property {string} value - The number of products to purchase\n * @property {string} url - Compiled URL that specifies variation attributes, product ID, options,\n * etc.\n */\n\n/**\n * Updates the quantity DOM elements post Ajax call\n * @param {UpdatedQuantity[]} quantities -\n * @param {jQuery} $productContainer - DOM container for a given product\n */\nfunction updateQuantities(quantities, $productContainer) {\n if (!($productContainer.parent('.bonus-product-item').length > 0)) {\n var optionsHtml = quantities.map(function (quantity) {\n var selected = quantity.selected ? ' selected ' : '';\n return '';\n }).join('');\n getQuantitySelector($productContainer).empty().html(optionsHtml);\n }\n}\n\n/**\n * updates the product view when a product attribute is selected or deselected or when\n * changing quantity\n * @param {string} selectedValueUrl - the Url for the selected variation value\n * @param {jQuery} $productContainer - DOM element for current product\n */\nfunction attributeSelect(selectedValueUrl, $productContainer) {\n if (selectedValueUrl) {\n $('body').trigger('product:beforeAttributeSelect',\n { url: selectedValueUrl, container: $productContainer });\n\n $.ajax({\n url: selectedValueUrl,\n method: 'GET',\n success: function (data) {\n handleVariantResponse(data, $productContainer);\n updateOptions(data.product.optionsHtml, $productContainer);\n updateQuantities(data.product.quantities, $productContainer);\n $('body').trigger('product:afterAttributeSelect',\n { data: data, container: $productContainer });\n $.spinner().stop();\n },\n error: function () {\n $.spinner().stop();\n }\n });\n }\n}\n\n/**\n * Retrieves url to use when adding a product to the cart\n *\n * @return {string} - The provided URL to use when adding a product to the cart\n */\nfunction getAddToCartUrl() {\n return $('.add-to-cart-url').val();\n}\n\n/**\n * Parses the html for a modal window\n * @param {string} html - representing the body and footer of the modal window\n *\n * @return {Object} - Object with properties body and footer.\n */\nfunction parseHtml(html) {\n var $html = $('
      ').append($.parseHTML(html));\n\n var body = $html.find('.choice-of-bonus-product');\n var footer = $html.find('.modal-footer').children();\n\n return { body: body, footer: footer };\n}\n\n/**\n * Retrieves url to use when adding a product to the cart\n *\n * @param {Object} data - data object used to fill in dynamic portions of the html\n */\nfunction chooseBonusProducts(data) {\n $('.modal-body').spinner().start();\n\n if ($('#chooseBonusProductModal').length !== 0) {\n $('#chooseBonusProductModal').remove();\n }\n var bonusUrl;\n if (data.bonusChoiceRuleBased) {\n bonusUrl = data.showProductsUrlRuleBased;\n } else {\n bonusUrl = data.showProductsUrlListBased;\n }\n\n var htmlString = ''\n + '
      '\n + ''\n + '
      '\n + ''\n + '
      '\n + '
      '\n + ' ' + data.labels.selectprods + ''\n + ' '\n + '
      '\n + '
      '\n + '
      '\n + '
      '\n + '
      '\n + '
      ';\n $('body').append(htmlString);\n $('.modal-body').spinner().start();\n\n $.ajax({\n url: bonusUrl,\n method: 'GET',\n dataType: 'json',\n success: function (response) {\n var parsedHtml = parseHtml(response.renderedTemplate);\n $('#chooseBonusProductModal .modal-body').empty();\n $('#chooseBonusProductModal .enter-message').text(response.enterDialogMessage);\n $('#chooseBonusProductModal .modal-header .close .sr-only').text(response.closeButtonText);\n $('#chooseBonusProductModal .modal-body').html(parsedHtml.body);\n $('#chooseBonusProductModal .modal-footer').html(parsedHtml.footer);\n $('#chooseBonusProductModal').modal('show');\n $.spinner().stop();\n },\n error: function () {\n $.spinner().stop();\n }\n });\n}\n\n/**\n * Updates the Mini-Cart quantity value after the customer has pressed the \"Add to Cart\" button\n * @param {string} response - ajax response from clicking the add to cart button\n */\nfunction handlePostCartAdd(response) {\n $('.minicart').trigger('count:update', response);\n var messageType = response.error ? 'alert-danger' : 'alert-success';\n // show add to cart toast\n if (response.newBonusDiscountLineItem\n && Object.keys(response.newBonusDiscountLineItem).length !== 0) {\n chooseBonusProducts(response.newBonusDiscountLineItem);\n } else {\n if ($('.add-to-cart-messages').length === 0) {\n $('body').append(\n '
      '\n );\n }\n\n $('.add-to-cart-messages').append(\n '
      '\n + response.message\n + '
      '\n );\n\n setTimeout(function () {\n $('.add-to-basket-alert').remove();\n }, 5000);\n }\n}\n\n/**\n * Retrieves the bundle product item ID's for the Controller to replace bundle master product\n * items with their selected variants\n *\n * @return {string[]} - List of selected bundle product item ID's\n */\nfunction getChildProducts() {\n var childProducts = [];\n $('.bundle-item').each(function () {\n childProducts.push({\n pid: $(this).find('.product-id').text(),\n quantity: parseInt($(this).find('label.quantity').data('quantity'), 10)\n });\n });\n\n return childProducts.length ? JSON.stringify(childProducts) : [];\n}\n\n/**\n * Retrieve product options\n *\n * @param {jQuery} $productContainer - DOM element for current product\n * @return {string} - Product options and their selected values\n */\nfunction getOptions($productContainer) {\n var options = $productContainer\n .find('.product-option')\n .map(function () {\n var $elOption = $(this).find('.options-select');\n var urlValue = $elOption.val();\n var selectedValueId = $elOption.find('option[value=\"' + urlValue + '\"]')\n .data('value-id');\n return {\n optionId: $(this).data('option-id'),\n selectedValueId: selectedValueId\n };\n }).toArray();\n\n return JSON.stringify(options);\n}\n\n/**\n * Makes a call to the server to report the event of adding an item to the cart\n *\n * @param {string | boolean} url - a string representing the end point to hit so that the event can be recorded, or false\n */\nfunction miniCartReportingUrl(url) {\n if (url) {\n $.ajax({\n url: url,\n method: 'GET',\n success: function () {\n // reporting urls hit on the server\n },\n error: function () {\n // no reporting urls hit on the server\n }\n });\n }\n}\n\nmodule.exports = {\n attributeSelect: attributeSelect,\n methods: {\n editBonusProducts: function (data) {\n chooseBonusProducts(data);\n }\n },\n\n focusChooseBonusProductModal: function () {\n $('body').on('shown.bs.modal', '#chooseBonusProductModal', function () {\n $('#chooseBonusProductModal').siblings().attr('aria-hidden', 'true');\n $('#chooseBonusProductModal .close').focus();\n });\n },\n\n onClosingChooseBonusProductModal: function () {\n $('body').on('hidden.bs.modal', '#chooseBonusProductModal', function () {\n $('#chooseBonusProductModal').siblings().attr('aria-hidden', 'false');\n });\n },\n\n trapChooseBonusProductModalFocus: function () {\n $('body').on('keydown', '#chooseBonusProductModal', function (e) {\n var focusParams = {\n event: e,\n containerSelector: '#chooseBonusProductModal',\n firstElementSelector: '.close',\n lastElementSelector: '.add-bonus-products'\n };\n focusHelper.setTabNextFocus(focusParams);\n });\n },\n\n colorAttribute: function () {\n $(document).on('click', '[data-attr=\"color\"] button', function (e) {\n e.preventDefault();\n\n if ($(this).attr('disabled')) {\n return;\n }\n var $productContainer = $(this).closest('.set-item');\n if (!$productContainer.length) {\n $productContainer = $(this).closest('.product-detail');\n }\n\n attributeSelect($(this).attr('data-url'), $productContainer);\n });\n },\n\n selectAttribute: function () {\n $(document).on('change', 'select[class*=\"select-\"], .options-select', function (e) {\n e.preventDefault();\n\n var $productContainer = $(this).closest('.set-item');\n if (!$productContainer.length) {\n $productContainer = $(this).closest('.product-detail');\n }\n attributeSelect(e.currentTarget.value, $productContainer);\n });\n },\n\n availability: function () {\n $(document).on('change', '.quantity-select', function (e) {\n e.preventDefault();\n\n var $productContainer = $(this).closest('.product-detail');\n if (!$productContainer.length) {\n $productContainer = $(this).closest('.modal-content').find('.product-quickview');\n }\n\n if ($('.bundle-items', $productContainer).length === 0) {\n attributeSelect($(e.currentTarget).find('option:selected').data('url'),\n $productContainer);\n }\n });\n },\n\n addToCart: function () {\n $(document).on('click', 'button.add-to-cart, button.add-to-cart-global', function () {\n var addToCartUrl;\n var pid;\n var pidsObj;\n var setPids;\n\n $('body').trigger('product:beforeAddToCart', this);\n\n if ($('.set-items').length && $(this).hasClass('add-to-cart-global')) {\n setPids = [];\n\n $('.product-detail').each(function () {\n if (!$(this).hasClass('product-set-detail')) {\n setPids.push({\n pid: $(this).find('.product-id').text(),\n qty: $(this).find('.quantity-select').val(),\n options: getOptions($(this))\n });\n }\n });\n pidsObj = JSON.stringify(setPids);\n }\n\n pid = getPidValue($(this));\n\n var $productContainer = $(this).closest('.product-detail');\n if (!$productContainer.length) {\n $productContainer = $(this).closest('.quick-view-dialog').find('.product-detail');\n }\n\n addToCartUrl = getAddToCartUrl();\n\n var form = {\n pid: pid,\n pidsObj: pidsObj,\n childProducts: getChildProducts(),\n quantity: getQuantitySelected($(this))\n };\n\n if (!$('.bundle-item').length) {\n form.options = getOptions($productContainer);\n }\n\n $(this).trigger('updateAddToCartFormData', form);\n if (addToCartUrl) {\n $.ajax({\n url: addToCartUrl,\n method: 'POST',\n data: form,\n success: function (data) {\n handlePostCartAdd(data);\n $('body').trigger('product:afterAddToCart', data);\n $.spinner().stop();\n miniCartReportingUrl(data.reportingURL);\n },\n error: function () {\n $.spinner().stop();\n }\n });\n }\n });\n },\n selectBonusProduct: function () {\n $(document).on('click', '.select-bonus-product', function () {\n var $choiceOfBonusProduct = $(this).parents('.choice-of-bonus-product');\n var pid = $(this).data('pid');\n var maxPids = $('.choose-bonus-product-dialog').data('total-qty');\n var submittedQty = parseInt($choiceOfBonusProduct.find('.bonus-quantity-select').val(), 10);\n var totalQty = 0;\n $.each($('#chooseBonusProductModal .selected-bonus-products .selected-pid'), function () {\n totalQty += $(this).data('qty');\n });\n totalQty += submittedQty;\n var optionID = $choiceOfBonusProduct.find('.product-option').data('option-id');\n var valueId = $choiceOfBonusProduct.find('.options-select option:selected').data('valueId');\n if (totalQty <= maxPids) {\n var selectedBonusProductHtml = ''\n + '
      '\n + '
      '\n + $choiceOfBonusProduct.find('.product-name').html()\n + '
      '\n + '
      '\n + '
      '\n ;\n $('#chooseBonusProductModal .selected-bonus-products').append(selectedBonusProductHtml);\n $('.pre-cart-products').html(totalQty);\n $('.selected-bonus-products .bonus-summary').removeClass('alert-danger');\n } else {\n $('.selected-bonus-products .bonus-summary').addClass('alert-danger');\n }\n });\n },\n removeBonusProduct: function () {\n $(document).on('click', '.selected-pid', function () {\n $(this).remove();\n var $selected = $('#chooseBonusProductModal .selected-bonus-products .selected-pid');\n var count = 0;\n if ($selected.length) {\n $selected.each(function () {\n count += parseInt($(this).data('qty'), 10);\n });\n }\n\n $('.pre-cart-products').html(count);\n $('.selected-bonus-products .bonus-summary').removeClass('alert-danger');\n });\n },\n enableBonusProductSelection: function () {\n $('body').on('bonusproduct:updateSelectButton', function (e, response) {\n $('button.select-bonus-product', response.$productContainer).attr('disabled',\n (!response.product.readyToOrder || !response.product.available));\n var pid = response.product.id;\n $('button.select-bonus-product', response.$productContainer).data('pid', pid);\n });\n },\n showMoreBonusProducts: function () {\n $(document).on('click', '.show-more-bonus-products', function () {\n var url = $(this).data('url');\n $('.modal-content').spinner().start();\n $.ajax({\n url: url,\n method: 'GET',\n success: function (html) {\n var parsedHtml = parseHtml(html);\n $('.modal-body').append(parsedHtml.body);\n $('.show-more-bonus-products:first').remove();\n $('.modal-content').spinner().stop();\n },\n error: function () {\n $('.modal-content').spinner().stop();\n }\n });\n });\n },\n addBonusProductsToCart: function () {\n $(document).on('click', '.add-bonus-products', function () {\n var $readyToOrderBonusProducts = $('.choose-bonus-product-dialog .selected-pid');\n var queryString = '?pids=';\n var url = $('.choose-bonus-product-dialog').data('addtocarturl');\n var pidsObject = {\n bonusProducts: []\n };\n\n $.each($readyToOrderBonusProducts, function () {\n var qtyOption =\n parseInt($(this)\n .data('qty'), 10);\n\n var option = null;\n if (qtyOption > 0) {\n if ($(this).data('optionid') && $(this).data('option-selected-value')) {\n option = {};\n option.optionId = $(this).data('optionid');\n option.productId = $(this).data('pid');\n option.selectedValueId = $(this).data('option-selected-value');\n }\n pidsObject.bonusProducts.push({\n pid: $(this).data('pid'),\n qty: qtyOption,\n options: [option]\n });\n pidsObject.totalQty = parseInt($('.pre-cart-products').html(), 10);\n }\n });\n queryString += JSON.stringify(pidsObject);\n queryString = queryString + '&uuid=' + $('.choose-bonus-product-dialog').data('uuid');\n queryString = queryString + '&pliuuid=' + $('.choose-bonus-product-dialog').data('pliuuid');\n $.spinner().start();\n $.ajax({\n url: url + queryString,\n method: 'POST',\n success: function (data) {\n $.spinner().stop();\n if (data.error) {\n $('#chooseBonusProductModal').modal('hide');\n if ($('.add-to-cart-messages').length === 0) {\n $('body').append('
      ');\n }\n $('.add-to-cart-messages').append(\n '
      '\n + data.errorMessage + '
      '\n );\n setTimeout(function () {\n $('.add-to-basket-alert').remove();\n }, 3000);\n } else {\n $('.configure-bonus-product-attributes').html(data);\n $('.bonus-products-step2').removeClass('hidden-xl-down');\n $('#chooseBonusProductModal').modal('hide');\n\n if ($('.add-to-cart-messages').length === 0) {\n $('body').append('
      ');\n }\n $('.minicart-quantity').html(data.totalQty);\n $('.add-to-cart-messages').append(\n '
      '\n + data.msgSuccess + '
      '\n );\n setTimeout(function () {\n $('.add-to-basket-alert').remove();\n if ($('.cart-page').length) {\n location.reload();\n }\n }, 1500);\n }\n },\n error: function () {\n $.spinner().stop();\n }\n });\n });\n },\n\n getPidValue: getPidValue,\n getQuantitySelected: getQuantitySelected,\n miniCartReportingUrl: miniCartReportingUrl\n};\n","'use strict';\nvar base = require('./base');\nvar focusHelper = require('../components/focus');\n\n/**\n * Generates the modal window on the first call.\n *\n */\nfunction getModalHtmlElement() {\n if ($('#quickViewModal').length !== 0) {\n $('#quickViewModal').remove();\n }\n var htmlString = ''\n + '
      '\n + ''\n + '
      '\n + ''\n + '
      '\n + '
      '\n + ' '\n + ' '\n + '
      '\n + '
      '\n + '
      '\n + '
      '\n + '
      '\n + '
      ';\n $('body').append(htmlString);\n}\n\n/**\n * @typedef {Object} QuickViewHtml\n * @property {string} body - Main Quick View body\n * @property {string} footer - Quick View footer content\n */\n\n/**\n * Parse HTML code in Ajax response\n *\n * @param {string} html - Rendered HTML from quickview template\n * @return {QuickViewHtml} - QuickView content components\n */\nfunction parseHtml(html) {\n var $html = $('
      ').append($.parseHTML(html));\n\n var body = $html.find('.product-quickview');\n var footer = $html.find('.modal-footer').children();\n\n return { body: body, footer: footer };\n}\n\n/**\n * replaces the content in the modal window on for the selected product variation.\n * @param {string} selectedValueUrl - url to be used to retrieve a new product model\n */\nfunction fillModalElement(selectedValueUrl) {\n $('.modal-body').spinner().start();\n $.ajax({\n url: selectedValueUrl,\n method: 'GET',\n dataType: 'json',\n success: function (data) {\n var parsedHtml = parseHtml(data.renderedTemplate);\n\n $('.modal-body').empty();\n $('.modal-body').html(parsedHtml.body);\n $('.modal-footer').html(parsedHtml.footer);\n $('.full-pdp-link').text(data.quickViewFullDetailMsg);\n $('#quickViewModal .full-pdp-link').attr('href', data.productUrl);\n $('#quickViewModal .size-chart').attr('href', data.productUrl);\n $('#quickViewModal .modal-header .close .sr-only').text(data.closeButtonText);\n $('#quickViewModal .enter-message').text(data.enterDialogMessage);\n $('#quickViewModal').modal('show');\n\n $.spinner().stop();\n },\n error: function () {\n $.spinner().stop();\n }\n });\n}\n\nmodule.exports = {\n showQuickview: function () {\n $('body').on('click', '.quickview', function (e) {\n e.preventDefault();\n var selectedValueUrl = $(this).closest('a.quickview').attr('href');\n $(e.target).trigger('quickview:show');\n getModalHtmlElement();\n fillModalElement(selectedValueUrl);\n });\n },\n focusQuickview: function () {\n $('body').on('shown.bs.modal', '#quickViewModal', function () {\n $('#quickViewModal .close').focus();\n });\n },\n trapQuickviewFocus: function () {\n $('body').on('keydown', '#quickViewModal', function (e) {\n var focusParams = {\n event: e,\n containerSelector: '#quickViewModal',\n firstElementSelector: '.full-pdp-link',\n lastElementSelector: '.add-to-cart-global',\n nextToLastElementSelector: '.modal-footer .quantity-select'\n };\n focusHelper.setTabNextFocus(focusParams);\n });\n },\n availability: base.availability,\n addToCart: base.addToCart,\n showSpinner: function () {\n $('body').on('product:beforeAddToCart', function (e, data) {\n $(data).closest('.modal-content').spinner().start();\n });\n },\n hideDialog: function () {\n $('body').on('product:afterAddToCart', function () {\n $('#quickViewModal').modal('hide');\n });\n },\n beforeUpdateAttribute: function () {\n $('body').on('product:beforeAttributeSelect', function () {\n $('.modal.show .modal-content').spinner().start();\n });\n },\n updateAttribute: function () {\n $('body').on('product:afterAttributeSelect', function (e, response) {\n if ($('.modal.show .product-quickview>.bundle-items').length) {\n $('.modal.show').find(response.container).data('pid', response.data.product.id);\n $('.modal.show').find(response.container)\n .find('.product-id').text(response.data.product.id);\n } else if ($('.set-items').length) {\n response.container.find('.product-id').text(response.data.product.id);\n } else {\n $('.modal.show .product-quickview').data('pid', response.data.product.id);\n $('.modal.show .full-pdp-link')\n .attr('href', response.data.product.selectedProductUrl);\n }\n });\n },\n updateAddToCart: function () {\n $('body').on('product:updateAddToCart', function (e, response) {\n // update local add to cart (for sets)\n $('button.add-to-cart', response.$productContainer).attr('disabled',\n (!response.product.readyToOrder || !response.product.available));\n\n // update global add to cart (single products, bundles)\n var dialog = $(response.$productContainer)\n .closest('.quick-view-dialog');\n\n $('.add-to-cart-global', dialog).attr('disabled',\n !$('.global-availability', dialog).data('ready-to-order')\n || !$('.global-availability', dialog).data('available')\n );\n });\n },\n updateAvailability: function () {\n $('body').on('product:updateAvailability', function (e, response) {\n // bundle individual products\n $('.product-availability', response.$productContainer)\n .data('ready-to-order', response.product.readyToOrder)\n .data('available', response.product.available)\n .find('.availability-msg')\n .empty()\n .html(response.message);\n\n\n var dialog = $(response.$productContainer)\n .closest('.quick-view-dialog');\n\n if ($('.product-availability', dialog).length) {\n // bundle all products\n var allAvailable = $('.product-availability', dialog).toArray()\n .every(function (item) { return $(item).data('available'); });\n\n var allReady = $('.product-availability', dialog).toArray()\n .every(function (item) { return $(item).data('ready-to-order'); });\n\n $('.global-availability', dialog)\n .data('ready-to-order', allReady)\n .data('available', allAvailable);\n\n $('.global-availability .availability-msg', dialog).empty()\n .html(allReady ? response.message : response.resources.info_selectforstock);\n } else {\n // single product\n $('.global-availability', dialog)\n .data('ready-to-order', response.product.readyToOrder)\n .data('available', response.product.available)\n .find('.availability-msg')\n .empty()\n .html(response.message);\n }\n });\n }\n};\n","'use strict';\n\n/**\n * Update DOM elements with Ajax results\n *\n * @param {Object} $results - jQuery DOM element\n * @param {string} selector - DOM element to look up in the $results\n * @return {undefined}\n */\nfunction updateDom($results, selector) {\n var $updates = $results.find(selector);\n $(selector).empty().html($updates.html());\n}\n\n/**\n * Keep refinement panes expanded/collapsed after Ajax refresh\n *\n * @param {Object} $results - jQuery DOM element\n * @return {undefined}\n */\nfunction handleRefinements($results) {\n $('.refinement.active').each(function () {\n $(this).removeClass('active');\n var activeDiv = $results.find('.' + $(this)[0].className.replace(/ /g, '.'));\n activeDiv.addClass('active');\n activeDiv.find('button.title').attr('aria-expanded', 'true');\n });\n\n updateDom($results, '.refinements');\n}\n\n/**\n * Parse Ajax results and updated select DOM elements\n *\n * @param {string} response - Ajax response HTML code\n * @return {undefined}\n */\nfunction parseResults(response) {\n var $results = $(response);\n var specialHandlers = {\n '.refinements': handleRefinements\n };\n\n // Update DOM elements that do not require special handling\n [\n '.grid-header',\n '.header-bar',\n '.header.page-title',\n '.product-grid',\n '.show-more',\n '.filter-bar'\n ].forEach(function (selector) {\n updateDom($results, selector);\n });\n\n Object.keys(specialHandlers).forEach(function (selector) {\n specialHandlers[selector]($results);\n });\n}\n\n/**\n * This function retrieves another page of content to display in the content search grid\n * @param {JQuery} $element - the jquery element that has the click event attached\n * @param {JQuery} $target - the jquery element that will receive the response\n * @return {undefined}\n */\nfunction getContent($element, $target) {\n var showMoreUrl = $element.data('url');\n $.spinner().start();\n $.ajax({\n url: showMoreUrl,\n method: 'GET',\n success: function (response) {\n $target.append(response);\n $.spinner().stop();\n },\n error: function () {\n $.spinner().stop();\n }\n });\n}\n\n/**\n * Update sort option URLs from Ajax response\n *\n * @param {string} response - Ajax response HTML code\n * @return {undefined}\n */\nfunction updateSortOptions(response) {\n var $tempDom = $('
      ').append($(response));\n var sortOptions = $tempDom.find('.grid-footer').data('sort-options').options;\n sortOptions.forEach(function (option) {\n $('option.' + option.id).val(option.url);\n });\n}\n\nmodule.exports = {\n filter: function () {\n // Display refinements bar when Menu icon clicked\n $('.container').on('click', 'button.filter-results', function () {\n $('.refinement-bar, .modal-background').show();\n $('.refinement-bar').siblings().attr('aria-hidden', true);\n $('.refinement-bar').closest('.row').siblings().attr('aria-hidden', true);\n $('.refinement-bar').closest('.tab-pane.active').siblings().attr('aria-hidden', true);\n $('.refinement-bar').closest('.container.search-results').siblings().attr('aria-hidden', true);\n $('.refinement-bar .close').focus();\n });\n },\n\n closeRefinements: function () {\n // Refinements close button\n $('.container').on('click', '.refinement-bar button.close, .modal-background', function () {\n $('.refinement-bar, .modal-background').hide();\n $('.refinement-bar').siblings().attr('aria-hidden', false);\n $('.refinement-bar').closest('.row').siblings().attr('aria-hidden', false);\n $('.refinement-bar').closest('.tab-pane.active').siblings().attr('aria-hidden', false);\n $('.refinement-bar').closest('.container.search-results').siblings().attr('aria-hidden', false);\n $('.btn.filter-results').focus();\n });\n },\n\n resize: function () {\n // Close refinement bar and hide modal background if user resizes browser\n $(window).resize(function () {\n $('.refinement-bar, .modal-background').hide();\n $('.refinement-bar').siblings().attr('aria-hidden', false);\n $('.refinement-bar').closest('.row').siblings().attr('aria-hidden', false);\n $('.refinement-bar').closest('.tab-pane.active').siblings().attr('aria-hidden', false);\n $('.refinement-bar').closest('.container.search-results').siblings().attr('aria-hidden', false);\n });\n },\n\n sort: function () {\n // Handle sort order menu selection\n $('.container').on('change', '[name=sort-order]', function (e) {\n e.preventDefault();\n\n $.spinner().start();\n $(this).trigger('search:sort', this.value);\n $.ajax({\n url: this.value,\n data: { selectedUrl: this.value },\n method: 'GET',\n success: function (response) {\n $('.product-grid').empty().html(response);\n $.spinner().stop();\n },\n error: function () {\n $.spinner().stop();\n }\n });\n });\n },\n\n showMore: function () {\n // Show more products\n $('.container').on('click', '.show-more button', function (e) {\n e.stopPropagation();\n var showMoreUrl = $(this).data('url');\n\n e.preventDefault();\n\n $.spinner().start();\n $(this).trigger('search:showMore', e);\n $.ajax({\n url: showMoreUrl,\n data: { selectedUrl: showMoreUrl },\n method: 'GET',\n success: function (response) {\n $('.grid-footer').replaceWith(response);\n updateSortOptions(response);\n $.spinner().stop();\n },\n error: function () {\n $.spinner().stop();\n }\n });\n });\n },\n\n applyFilter: function () {\n // Handle refinement value selection and reset click\n $('.container').on(\n 'click',\n '.refinements li button, .refinement-bar button.reset, .filter-value button, .swatch-filter button',\n function (e) {\n e.preventDefault();\n e.stopPropagation();\n\n $.spinner().start();\n $(this).trigger('search:filter', e);\n $.ajax({\n url: $(this).data('href'),\n data: {\n page: $('.grid-footer').data('page-number'),\n selectedUrl: $(this).data('href')\n },\n method: 'GET',\n success: function (response) {\n parseResults(response);\n $.spinner().stop();\n },\n error: function () {\n $.spinner().stop();\n }\n });\n });\n },\n\n showContentTab: function () {\n // Display content results from the search\n $('.container').on('click', '.content-search', function () {\n if ($('#content-search-results').html() === '') {\n getContent($(this), $('#content-search-results'));\n }\n });\n\n // Display the next page of content results from the search\n $('.container').on('click', '.show-more-content button', function () {\n getContent($(this), $('#content-search-results'));\n $('.show-more-content').remove();\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"],"mappings":";AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;AClFA;AAEA;;;;;;AAKA;AACA;AACA;AAGA;AACA;AAAA;AAGA;AACA;AACA;AACA;AAEA;;;;;;;;AAMA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAHA;AAHA;AASA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;;;;;;;AAKA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;AAuBA;AAEA;;;;;;;AAMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AADA;AACA;AACA;AAAA;AACA;AACA;AAAA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAFA;AAIA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAHA;AAKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AArBA;AAuBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAnBA;AAsBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AApBA;AAsBA;AACA;AACA;AArGA;;;;;;;;;;;;AC/IA;AACA;AAAA;AACA;AAAA;AACA;AACA;AAEA;AACA;AAAA;AACA;;;;;;;;;;;;ACRA;AACA;;;AAAA;AACA;AAAA;AACA;AAAA;AAEA;AACA;AAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AADA;AACA;AACA;AACA;AADA;AACA;AAIA;AAUA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AADA;AACA;AAIA;AASA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AADA;AACA;AAIA;AAUA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AADA;AACA;AACA;AAAA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAKA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AAAA;AACA;AACA;AAAA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AAhBA;AAkBA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAAA;AACA;AAAA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAHA;AAFA;AANA;AAgBA;AAAA;AACA;AAAA;AACA;AACA;AAEA;AAEA;AAEA;AACA;AAAA;AACA;AAEA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AADA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAFA;AAIA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AAtBA;AAwBA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AAFA;AAIA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AAxBA;AA0BA;AACA;AACA;AAAA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAMA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AAEA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AAAA;AACA;AAAA;AACA;AACA;AADA;AACA;AACA;AACA;AACA;AACA;AACA;AADA;AACA;AAAA;AACA;AACA;AAAA;AACA;AAAA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAAA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AAKA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAAA;AACA;AAEA;AACA;AACA;AADA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAAA;AACA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+CA;AACA;AACA;AADA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AAFA;AAIA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AA5BA;AA+BA;AACA;;;;AAGA;AACA;AACA;AACA;AADA;AACA;AAIA;AAUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AADA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAAA;AACA;AAAA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AADA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AA3BA;AA6BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAIA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAAA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AAbA;AAeA;AACA;AACA;AACA;;;;;;;;;;;;ACzzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AA/BA;;;;;;;;;;;;ACFA;AACA;AAAA;AAEA;;;;;;;AAKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;;;;;;;AAKA;AACA;AAGA;AAEA;;;;;;;AAKA;AACA;AACA;AAEA;;;;;;;;;;;;;;;;AAcA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;;;;;;;;;;;;;;;AAaA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;;;;;;;;;;;AASA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;;;;;;;;;AAOA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAJA;AAMA;AAEA;;;;;;;;AAMA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;;;;;;;AAOA;;;;;;;;;AASA;;;;;;;;AAMA;AACA;AACA;AACA;AAEA;;;;;;;AAKA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AAAA;AACA;AACA;AACA;AAAA;AACA;AACA;AAEA;;;;;;;;;;;;;;AAYA;AACA;AAEA;AACA;AAAA;AACA;AACA;AACA;AAAA;AACA;AAGA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAGA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAAA;AADA;AAGA;AACA;AACA;AACA;AAAA;AADA;AAGA;AACA;AACA;AACA;AAEA;AAEA;;;;;;;;;AASA;;;;;;;AAKA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;;;;;;;;AAMA;AACA;AACA;AACA;AAAA;AAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AAbA;AAeA;AACA;AAEA;;;;;;;AAKA;AACA;AACA;AAEA;;;;;;;;AAMA;AACA;AAEA;AACA;AAEA;AAAA;AAAA;AAAA;AACA;AAEA;;;;;;;AAKA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AA0BA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAhBA;AAkBA;AAEA;;;;;;AAIA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAGA;AACA;AACA;AAMA;AACA;AACA;AACA;AACA;AAEA;;;;;;;;AAMA;AACA;AACA;AACA;AACA;AACA;AAFA;AAIA;AAEA;AACA;AAEA;;;;;;;;AAMA;AACA;AAGA;AACA;AACA;AAEA;AACA;AACA;AAFA;AAIA;AAEA;AACA;AAEA;;;;;;;AAKA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AARA;AAUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAHA;AAMA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAJA;AAMA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAAA;AACA;AACA;AACA;AAAA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAHA;AAKA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAJA;AACA;AAMA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAZA;AAcA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AAaA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAXA;AAaA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AADA;AAIA;AACA;AAIA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAHA;AAKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AAAA;AACA;AACA;AACA;AAAA;AAKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AAKA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AA1CA;AA4CA;AACA;AAEA;AACA;AACA;AA5SA;;;;;;;;;;;;ACthBA;AACA;AAAA;AACA;AAAA;AAEA;;;;;;AAIA;AACA;AACA;AACA;AACA;AAAA;AAkBA;AACA;AAEA;;;;;;AAMA;;;;;;;;AAMA;AACA;AAEA;AACA;AAEA;AAAA;AAAA;AAAA;AACA;AAEA;;;;;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AArBA;AAuBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AALA;AAOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AAGA;AAIA;AACA;AACA;AACA;AACA;AACA;AAQA;AACA;AAEA;AACA;AACA;AACA;AAAA;AAEA;AACA;AAAA;AAEA;AAIA;AAEA;AACA;AACA;AAMA;AACA;AACA;AAjHA;;;;;;;;;;;;ACrFA;AAEA;;;;;;;;AAOA;AACA;AACA;AACA;AAEA;;;;;;;;AAMA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;;;;;;;;AAMA;AACA;AACA;AACA;AADA;AACA;AAIA;AAQA;AACA;AAEA;AACA;AACA;AACA;AAEA;;;;;;;;AAMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AATA;AAWA;AAEA;;;;;;;;AAMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAVA;AAYA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAXA;AAaA;AACA;AAEA;AACA;AACA;AAIA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAFA;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAbA;AAeA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AA9HA;;;;;;;;;;;;AChGA;AACA;;;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;A","sourceRoot":""}