{"version":3,"file":"ProductFilters5.min.js","sources":["ProductFilters5.js"],"sourcesContent":["(function (w, $, _) {\n 'use strict';\n\n const assetId = '~/Parts/Views/Product/ProductFilters/ProductFilters5.min.js';\n\n if (!w.umwAssets || !w.umwAssets[assetId]) {\n console.error('No context found for ' + assetId);\n return;\n }\n\n for (var ctx of w.umwAssets[assetId]) {\n\n var controlId = ctx.controlId;\n var productListControlId = ctx.productListControlId;\n var productListPageControlID = ctx.productListPageControlID;\n var filtersTemplateContent = ctx.filtersTemplateContent;\n var labels = ctx.labels;\n var currencyCode = ctx.currencyCode;\n var enableImmediateFiltering = ctx.enableImmediateFiltering;\n var rememberChoiceFor = ctx.rememberChoiceFor;\n var slideFilteringFor = ctx.slideFilteringFor;\n var enableFiltersURLSupport = ctx.enableFiltersURLSupport;\n\n var handlerUrl = w.R + 'Handlers/Public/ProductData.ashx';\n \n var pubSub = w.PubSub;\n var filtersChannelPrefix = 'frontend.productlist.filters.' + (productListPageControlID || productListControlId);\n var staticfilterChannelPrefix = 'frontend.productlist.staticfilter.' + (productListPageControlID || productListControlId);\n var refreshChannelPrefix = 'frontend.productlist.refresh.' + (productListPageControlID || productListControlId);\n var listReadyChannelPrefix = 'frontend.productlist.ready.' + (productListPageControlID || productListControlId);\n var showOnlyInStock = false;\n var precompiledTemplate;\n\n var $filters, excludedItemsMap = {}, allItems, appliedFilters = {};\n var $mainPanel, $filtersContainer, $buttonsContainer, $resetButton, $closeButton;\n\n var savedFiltersLocalStorageKey = controlId + '_saved_filters';\n\n var classes = {\n noFiltersAvailable: 'NoFiltersAvailable',\n template: 'js-uc' + controlId + '-template',\n filtersContainer: 'js-uc' + controlId + '-filters-container',\n buttonsContainer: 'js-uc' + controlId + '-buttons-container',\n filter: 'js-uc' + controlId + '-filter',\n checkboxFilter: 'js-uc' + controlId + '-checkbox-filter',\n sliderFilter: 'js-uc' + controlId + '-slider-filter',\n sliderContainer: 'js-uc' + controlId + '-slider-container',\n minValue: 'js-uc' + controlId + '-min-value',\n maxValue: 'js-uc' + controlId + '-max-value',\n itemsCount: 'js-uc' + controlId + '-items-count',\n resetBtn: 'js-uc' + controlId + '-reset-btn',\n closeBtn: 'js-uc' + controlId + '-close-btn'\n };\n\n var domReady = false;\n var filtersData = null;\n var preAppliedFilterState = null;\n\n function onApplyButtonClick() {\n applyFilters();\n }\n\n function onResetButtonClick(evt) {\n evt.preventDefault();\n\n w.removeFromLocalStorage(savedFiltersLocalStorageKey);\n\n resetAllFilters();\n applyFilters();\n }\n\n function loadFilters() {\n var query = $.extend($.getUrlParamsObj(location.search), {\n action: 'GetFilters',\n controlId: controlId,\n pageId: w.BasePageID,\n showOnlyInStock: showOnlyInStock\n });\n\n if (domReady) {\n blockUI();\n }\n\n $.get(handlerUrl, query)\n .done(function (responseData) {\n\n if (domReady) {\n showFilters(responseData);\n } else {\n filtersData = responseData;\n }\n\n })\n .fail(function (errResp) {\n var message;\n if (typeof (errResp) === 'object') {\n // Extract error message\n var responseObj = JSON.parse(errResp.responseText);\n message = responseObj.Message ? responseObj.Message : errResp.statusText;\n } else {\n message = errResp;\n }\n notify(labels.failedToLoadFilters + '
' + message, 'error');\n })\n .always(function () {\n if (domReady) {\n unblockUI();\n }\n });\n }\n\n function showFilters(data) {\n var filters = data.filters;\n allItems = data.allItemIDs;\n\n if (!filters || !filters.length) {\n $mainPanel.hide();\n pubSub.publish(filtersChannelPrefix + '.empty');\n } else {\n if (typeof (precompiledTemplate) === 'undefined') {\n precompiledTemplate = _.template(filtersTemplateContent);\n }\n\n if (w.siteScripts) {\n filters = w.siteScripts.converters.apply('ProductFilters', filters);\n }\n\n _.each(filters, function (filter, filterIdx) {\n filter.clientId = ['filter', filter.FilterType, filterIdx].join('_');\n filter.slideble = slideFilteringFor.indexOf(filter.Name) > -1;\n _.each(filter.Criterias, function (criteria, criteriaIdx) {\n criteria.clientId = [filter.clientId, 'criteria', criteriaIdx].join('_');\n if (filter.slideble) {\n filter.slideble = extractNumberFromString(criteria.Name) !== null;\n }\n });\n });\n\n var filtersHtml = precompiledTemplate({\n controlId: controlId,\n filters: filters,\n labels: labels,\n currencyCode: currencyCode,\n enableImmediateFiltering: enableImmediateFiltering\n });\n\n $filtersContainer.html(filtersHtml);\n runTemplateLocalScript(filters);\n\n if (filters.length) {\n $filters = $mainPanel.find('.' + classes.filter);\n initFilters(filters);\n\n // Restore filters state from the url or local storage\n // Url values should always override the local storage ones\n try {\n var preAppliedFilters;\n\n var filterHash = location.href.split('#')[1] || '{}'; // Why not just location.hash? See http://stackoverflow.com/a/1704842/1855879\n\n var filtersFromUrl = enableFiltersURLSupport\n ? filterHash.startsWith('{')\n ? JSON.parse(decodeURIComponent(filterHash))\n : getFiltersFromFriendlyUrl(filterHash)\n : {};\n\n if (!_.isEmpty(filtersFromUrl)) {\n preAppliedFilters = filtersFromUrl;\n } else {\n // Grab saved filters from the local storage\n var savedFiltersFromLocalStorageJSON = w.getFromLocalStorage(savedFiltersLocalStorageKey);\n preAppliedFilters = typeof (savedFiltersFromLocalStorageJSON) !== 'undefined' ? JSON.parse(savedFiltersFromLocalStorageJSON) : null;\n }\n\n if (!_.isEmpty(preAppliedFilters)) {\n setAppliedFilters(preAppliedFilters); // restore filters state\n applyFilters(true); // reload product list\n }\n } catch (e) {\n console.error('%s - Failed to restore filters: %s', controlId, e.message || e);\n }\n\n $filtersContainer.removeClass(classes.noFiltersAvailable);\n $buttonsContainer.css({'display': 'flex'});\n pubSub.publish(filtersChannelPrefix + '.load', filters);\n } else {\n $filtersContainer.addClass(classes.noFiltersAvailable);\n $buttonsContainer.hide();\n }\n }\n\n updateCounterSelectedCriteria();\n\n function getFiltersFromFriendlyUrl(filterHash) {\n filterHash = decodeURIComponent(filterHash);\n var filterParts = filterHash.split('/').splice(1);\n var foundFilter = null;\n var prevFoundFilter = null;\n var filtersFromUrl = {};\n\n _.each(filterParts, function (filterOrCriteriaName) {\n if (foundFilter) {\n findAndAddCriteria(foundFilter, filterOrCriteriaName);\n prevFoundFilter = foundFilter;\n foundFilter = null;\n } else {\n foundFilter = findByName(filters, filterOrCriteriaName);\n //if no filter found, then current name may belong to one of criterias from previously found filter\n if (!foundFilter) {\n if (prevFoundFilter) {\n findAndAddCriteria(prevFoundFilter, filterOrCriteriaName);\n } else {\n throw 'No filter found by name: ' + filterOrCriteriaName;\n }\n }\n }\n });\n\n return filtersFromUrl;\n\n function findAndAddCriteria(foundFilter, urlItem) {\n var filterValue;\n if (foundFilter.slideble)\n filterValue = parseFloat(urlItem.replace(/-/g, '.'));\n else {\n var foundCriteria = findByName(foundFilter.Criterias, urlItem);\n if (!foundCriteria) {\n throw 'No criteria found by name: ' + urlItem;\n }\n filterValue = foundCriteria.Name;\n }\n\n if (filtersFromUrl[foundFilter.Name]) {\n filtersFromUrl[foundFilter.Name].push(filterValue);\n } else {\n filtersFromUrl[foundFilter.Name] = [filterValue];\n }\n }\n\n function findByName(filtersOrCriterias, name) {\n return _.find(filtersOrCriterias, function (item) {\n var preparedName = item.Name.toLowerCase();\n //replace invalid chars with dash\n preparedName = preparedName.replace(/[^a-z0-9æøå-]/g, '-');\n //replace sequences of dashes with a single dash\n preparedName = preparedName.replace(/-+/g, '-');\n return preparedName === name;\n });\n }\n }\n\n function initFilters(filtersData) {\n $filters.each(function () {\n var $filter = $(this);\n var filterData = _.find(filtersData, function (filter) { return filter.clientId == $filter.attr('id'); });\n $filter.data('item', filterData);\n\n if ($filter.hasClass(classes.checkboxFilter)) {\n filterData.slideble = false;\n $filter.change(onCheckboxFilterChange);\n } else if ($filter.hasClass(classes.sliderFilter)) {\n filterData.slideble = true;\n var numericCriterias = getNumericCriterias(filterData.Criterias);\n var minValue = _.min(numericCriterias);\n var maxValue = _.max(numericCriterias);\n var sliderValues = [minValue, maxValue];\n var templateName = $('.' + classes.template).val();\n var $mobileCloseBtn = $('.' + classes.closeBtn);\n // Init slider\n $filter.find('.' + classes.sliderContainer).slider({\n range: true,\n min: minValue,\n max: maxValue,\n step: isFloat(minValue) || isFloat(maxValue) ? 0.01 : 1,\n values: sliderValues,\n slide: onSliderFilterChange,\n change: function (event) {\n // Do not process change events fired by programmatic changes\n if ((enableImmediateFiltering || templateName === 'horizontal5') && typeof (event.originalEvent) !== 'undefined') {\n switch (templateName) {\n case 'horizontal5':\n if($mobileCloseBtn.is(\":hidden\")){\n applyFilters();\n }\n break;\n default:\n applyFilters();\n }\n }\n }\n });\n\n // Set initial values\n updateSliderInfo($filter, sliderValues);\n }\n });\n\n function onCheckboxFilterChange() {\n // Get all filtered by the current filter items and store them into the map, independently from the other filters.\n // Later, all the items from the filtered items map will be joined to the resulted set\n var $filter = $(this);\n var filterData = $filter.data('item');\n\n var $selectedCriterias = $filter.find('input:checkbox:checked');\n if ($selectedCriterias.length > 0) {\n // Filter is applied\n var selectedCriteriaIds = $selectedCriterias.map(function () { return this.id; }).get();\n var selectedCriterias = getSelectedCheckboxCriterias(filterData.Criterias, selectedCriteriaIds);\n excludedItemsMap[filterData.clientId] = _.difference(allItems, getCriteriasItems(selectedCriterias));\n appliedFilters[filterData.Name] = _.pluck(selectedCriterias, 'Name');\n } else {\n // Filter is not applied\n delete excludedItemsMap[filterData.clientId];\n delete appliedFilters[filterData.Name];\n }\n\n updateOtherFilters($filter);\n\n if (enableImmediateFiltering) {\n applyFilters();\n }\n }\n\n function onSliderFilterChange(event, ui) {\n var $slider = $(ui.handle);\n var $filter = $slider.closest('.' + classes.sliderFilter);\n var filterData = $filter.data('item');\n\n var selectedCriterias = getSelectedSliderCriterias(filterData.Criterias, ui.values[0], ui.values[1]);\n var selectedCriteriasItems = getCriteriasItems(selectedCriterias);\n\n excludedItemsMap[filterData.clientId] = _.difference(allItems, selectedCriteriasItems);\n appliedFilters[filterData.Name] = ui.values;\n\n updateSliderInfo($filter, ui.values);\n\n updateOtherFilters($filter);\n }\n }\n }\n\n function updateOtherFilters($appliedFilter) {\n // When some filter criterias are applied, the criterias of the other filters should be updated with the new total items values according to the newly applied criterias.\n $filters.not($appliedFilter).each(function () {\n var $filter = $(this);\n var filterData = $filter.data('item');\n var availableItems = [];\n var allItemsExcludedByOtherFilters = getAllItemsExcludedByOtherFilters(filterData.clientId);\n\n if ($filter.hasClass(classes.checkboxFilter)) {\n _.each(filterData.Criterias, function (criteria) {\n var $criteriaCheckbox = $filter.find('#' + criteria.clientId);\n var $criteriaCheckboxCounter = $filter.find('label[for=\"' + criteria.clientId + '\"] .' + classes.itemsCount);\n availableItems = _.difference(criteria.Items, allItemsExcludedByOtherFilters);\n $criteriaCheckboxCounter.text(availableItems.length);\n $criteriaCheckbox.prop('disabled', availableItems.length === 0);\n });\n\n } else if ($filter.hasClass(classes.sliderFilter)) {\n var $currentSlider = $filter.find('.' + classes.sliderContainer);\n var onlyIncludedItems = _.difference(allItems, getAllExcludedItems());\n var numericCriterias = getNumericCriterias(filterData.Criterias, onlyIncludedItems);\n\n if (numericCriterias && numericCriterias.length) {\n var sliderValues = [\n _.min(numericCriterias),\n _.max(numericCriterias)\n ];\n $currentSlider.slider('values', sliderValues);\n updateSliderInfo($filter, sliderValues);\n }\n }\n });\n pubSub.publish(filtersChannelPrefix + '.update');\n };\n\n function getNumericCriterias(allCriterias, onlyIncludedItems) {\n var result = [];\n _.each(allCriterias, function (criteria) {\n if (criteria.Items !== undefined &&\n onlyIncludedItems !== undefined &&\n !_.intersection(criteria.Items, onlyIncludedItems).length) {\n return;\n }\n var number = extractNumberFromString(criteria.Name);\n result = _.union(result, [parseFloat(number)]);\n });\n return result;\n }\n\n //#region Helpers\n\n function isFloat(n) {\n return Number(n) === n && n % 1 !== 0;\n };\n\n function extractNumberFromString(inpurString) {\n var regex = /[+-]?\\d+(?:\\.\\d+)?/g;\n var isMatch = inpurString.match(regex);\n\n return isMatch ? isMatch[0] : null;\n }\n\n function updateSliderInfo($filter, sliderValues) {\n\n var $minValueContainer = $filter.find('.' + classes.minValue);\n var $maxValueContainer = $filter.find('.' + classes.maxValue);\n var $itemsCountContainer = $filter.find('.' + classes.itemsCount);\n\n var minValue = _.min(sliderValues);\n $minValueContainer.text(minValue);\n var maxValue = _.max(sliderValues);\n $maxValueContainer.text(maxValue);\n\n var newTotal = _.difference(allItems, getAllExcludedItems()).length;\n $itemsCountContainer.text(newTotal);\n pubSub.publish(filtersChannelPrefix + '.update');\n }\n\n function getCriteriasItems(criterias) {\n // optimized function only for simple types. UMWC-2830\n function itemsUnion(x, y) {\n var result = [];\n for (var xi = 0; xi < x.length; ++xi) {\n result.push(x[xi]);\n }\n for (var yi = 0; yi < y.length; ++yi) {\n var item = y[yi];\n var exists = false;\n for (var j = 0; j < result.length; ++j)\n if (result[j] === item) {\n exists = true;\n break;\n }\n if (!exists)\n result.push(item);\n }\n return result;\n }\n return _.reduce(criterias, function (memo, criteria) {\n return itemsUnion(memo, criteria.Items);\n }, []);\n }\n\n function getSelectedCheckboxCriterias(allCriterias, selectedCriteriaIds) {\n return _.filter(allCriterias, function (criteria) {\n return _.contains(selectedCriteriaIds, criteria.clientId) && _.some(criteria.Items);\n });\n }\n\n function getSelectedSliderCriterias(allCriterias, selectedMin, selectedMax) {\n return _.filter(allCriterias,\n function (criteria) {\n var number = extractNumberFromString(criteria.Name);\n var numericCriteria = parseFloat(number);\n return (numericCriteria >= selectedMin && numericCriteria <= selectedMax) && _.some(criteria.Items);\n });\n }\n\n function getAllExcludedItems() {\n return _.reduce(excludedItemsMap, function (allExcludedItems, excludedMapItem) {\n return _.union(allExcludedItems, excludedMapItem);\n }, []);\n }\n\n function getAllItemsExcludedByOtherFilters(currentFilterName) {\n return _.reduce(excludedItemsMap,\n function (allExcludedItems, excludedMapItem, excludedByFilterName) {\n return currentFilterName !== excludedByFilterName\n ? _.union(allExcludedItems, excludedMapItem)\n : allExcludedItems;\n },\n []);\n }\n\n function getAllFilterIncludedItems(clientId) {\n var excludedItems = excludedItemsMap[clientId];\n return _.difference(allItems, excludedItems);\n }\n\n function setAppliedFilters(filtersToApply) {\n // Reset current filters first\n excludedItemsMap = {};\n appliedFilters = filtersToApply || {};\n\n $filters.each(function () {\n var $filter = $(this);\n var filterData = $filter.data('item');\n var filterId = filterData.clientId;\n var filteredValues = appliedFilters[filterData.Name];\n var selectedCriterias = [];\n\n if ($filter.hasClass(classes.checkboxFilter)) {\n // Clear previous values\n $filter.find('input:checkbox').prop('checked', false);\n\n if (filteredValues && filteredValues.length) {\n _.each(filterData.Criterias, function (criteria) {\n if (_.contains(filteredValues, criteria.Name)) {\n $filter.find('#' + criteria.clientId).prop('checked', true);\n selectedCriterias.push(criteria);\n excludedItemsMap[filterId] = _.difference(allItems, getCriteriasItems(selectedCriterias));\n }\n });\n }\n } else if ($filter.hasClass(classes.sliderFilter)) {\n var sliderValues = filteredValues;\n var $currentSlider = $filter.find('.' + classes.sliderContainer);\n if (sliderValues && sliderValues.length == 2 && sliderValues[0] <= sliderValues[1]) {\n selectedCriterias = getSelectedSliderCriterias(filterData.Criterias, sliderValues[0], sliderValues[1]);\n excludedItemsMap[filterId] = _.difference(allItems, getCriteriasItems(selectedCriterias));\n } else {\n // Reset slider\n var minRangeValue = $currentSlider.slider('option', 'min');\n var maxRangeValue = $currentSlider.slider('option', 'max');\n sliderValues = [minRangeValue, maxRangeValue];\n }\n\n $currentSlider.slider('values', sliderValues);\n updateSliderInfo($filter, sliderValues);\n }\n\n updateOtherFilters($filter);\n });\n };\n\n function resetAllFilters() {\n excludedItemsMap = {};\n appliedFilters = {};\n\n $filters.each(function () {\n var $filter = $(this);\n var filterData = $filter.data('item');\n\n if ($filter.hasClass(classes.checkboxFilter)) {\n _.each(filterData.Criterias, function (criteria) {\n var $criteriaCheckbox = $filter.find('#' + criteria.clientId);\n $criteriaCheckbox.prop('checked', false);\n $criteriaCheckbox.prop('disabled', false);\n var $criteriaCheckboxCounter = $filter.find('label[for=\"' + criteria.clientId + '\"] .' + classes.itemsCount);\n $criteriaCheckboxCounter.text(criteria.Items.length);\n });\n } else if ($filter.hasClass(classes.sliderFilter)) {\n var $filterSlider = $filter.find('.' + classes.sliderContainer);\n var numericCriterias = getNumericCriterias(filterData.Criterias);\n var minValue = _.min(numericCriterias);\n var maxValue = _.max(numericCriterias);\n\n var sliderValues = [minValue, maxValue];\n $filterSlider.slider('values', sliderValues);\n\n updateSliderInfo($filter, sliderValues);\n }\n });\n };\n\n function setFiltersToFriendlyUrl(appliedFilters) {\n //join all filters and their criterias in a single string, separated by slash\n //replace slash in filter and criteria names, because slash is used as a separator when restoring filters from URL\n var filterUrl = _.reduce(appliedFilters,\n function (memo, criterias, filterName) {\n return memo + '/' + filterName.replace(/\\//g, '-') +\n _.reduce(criterias, function (memo2, criteriaName) { return memo2 + '/' + (criteriaName.replace ? criteriaName.replace(/\\//g, '-') : criteriaName); }, '');\n }, '');\n filterUrl = filterUrl.toLowerCase();\n //replace invalid chars with dash\n filterUrl = filterUrl.replace(/[^a-z0-9æøå\\/-]/g, '-');\n //replace sequences of dashes with a single dash\n filterUrl = filterUrl.replace(/-+/g, '-');\n\n return filterUrl;\n }\n\n function applyFilters(isRestoring, isHistoryPopEvent) {\n var excludedItems = getAllExcludedItems();\n var allIncludedItems = excludedItems.length > 0 ? _.difference(allItems, excludedItems) : null;\n\n var filtersUrl = '';\n if (enableFiltersURLSupport) {\n filtersUrl = setFiltersToFriendlyUrl(appliedFilters);\n }\n\n var filterState = {\n filteredItemIds: allIncludedItems,\n allItemsCount: allItems.length,\n appliedFilters: appliedFilters,\n filtersUrl: filtersUrl,\n isRestoring: isRestoring === true,\n isHistoryPopEvent: isHistoryPopEvent === true\n };\n\n if (isRestoring && !preAppliedFilterState) {\n filterState.isPreApplied = true;\n preAppliedFilterState = filterState;\n }\n\n pubSub.publish(filtersChannelPrefix + '.apply', filterState);\n\n if (rememberChoiceFor.length > 0) {\n var appliedFiltersToRemember = {};\n if (!_.isEmpty(appliedFilters)) {\n appliedFiltersToRemember = _.pick(appliedFilters, rememberChoiceFor);\n }\n\n w.saveToLocalStorage(savedFiltersLocalStorageKey, JSON.stringify(appliedFiltersToRemember));\n } else if (w.getFromLocalStorage(savedFiltersLocalStorageKey)) {\n w.removeFromLocalStorage(savedFiltersLocalStorageKey);\n }\n }\n function applySelectedCheckboxesFilter(filter) {\n // Get all filtered by the current filter items and store them into the map, independently from the other filters.\n // Later, all the items from the filtered items map will be joined to the resulted set\n var $filter = filter;\n var filterData = $filter.data('item');\n\n var $selectedCriterias = $filter.find('input:checkbox:checked');\n if ($selectedCriterias.length > 0) {\n // Filter is applied\n var selectedCriteriaIds = $selectedCriterias.map(function () { return this.id; }).get();\n var selectedCriterias = getSelectedCheckboxCriterias(filterData.Criterias, selectedCriteriaIds);\n excludedItemsMap[filterData.clientId] = _.difference(allItems, getCriteriasItems(selectedCriterias));\n appliedFilters[filterData.Name] = _.pluck(selectedCriterias, 'Name');\n } else {\n // Filter is not applied\n delete excludedItemsMap[filterData.clientId];\n delete appliedFilters[filterData.Name];\n }\n\n updateOtherFilters($filter);\n\n applyFilters();\n }\n function notify(message, type) {\n var notificationChannel = typeof (type) === 'string' && type ? 'notification.' + type : 'notification';\n pubSub.publish(notificationChannel, message);\n }\n function blockUI() {\n if (typeof ($.blockUI) === 'function') {\n $mainPanel.block({ message: null });\n }\n }\n function unblockUI() {\n if (typeof ($.unblockUI) === 'function') {\n $mainPanel.unblock();\n }\n }\n //#endregion\n\n function runTemplateLocalScript(filters) {\n var templateName = $('.' + classes.template).val();\n\n var Template = templateName;\n var UC = 'uc' + controlId;\n var UCTemplated = UC + '-' + Template;\n\n var selectedCriteriaTemplate = '';\n var precompiledSelectedCriteriaTemplate = _.template(selectedCriteriaTemplate);\n\n var sectionSelectedCriteriaTemplate = '<%- criteriaLabel %>';\n var sectionPrecompiledSelectedCriteriaTemplate = _.template(sectionSelectedCriteriaTemplate);\n\n // Specific template classes\n var templateClasses = {\n noAppliedFilters: 'no-applied-filters',\n hasAppliedFilters: 'has-applied-filters',\n openAfterFilterApplied: 'open-after-filter-applied',\n\n // Specific dropdown ctiterias\n sectionSelectedCriterias: 'js-' + UCTemplated + '-section-selected-criterias',\n sectionApplyCriteriasBtn: 'js-' + UCTemplated + '-section-apply-criterias',\n\n sectionSelectedCriteriaCount: 'js-' + UCTemplated + '-selected-criteria-count',\n\n // All selected criterias from all dropdowns\n selectedCriterias: 'js-' + UCTemplated + '-selected-criterias',\n selectedCriteria: 'js-' + UCTemplated + '-selected-criteria',\n clearSelectedCriterias: 'js-' + UCTemplated + '-clear-selected-criterias',\n\n // Dropdown representing a filter\n dropdownItem: 'js-' + UCTemplated + '-dropdown-item',\n dropdownItemClosed: 'is-closed',\n dropdownItemOpened: 'is-opened',\n dropdownItemDisabled: 'is-disabled',\n dropdownBtn: 'js-' + UCTemplated + '-dropdown-btn',\n dropdownTitleBtn: 'js-' + UCTemplated + '-dropdown-title-btn',\n\n // Checkbox Filter \n checkboxFilter: 'js-' + UC + '-checkbox-filter',\n\n // Filter item - wrapper for criteria\n filterItem: 'js-' + UCTemplated + '-filter-item',\n filterItemDisabled: 'is-disabled',\n filterItemIsHidden: 'is-mobile-hidden',\n criteriaCheckbox: 'js-' + UCTemplated + '-filter-item-checkbox',\n criteriaLabel: 'js-' + UCTemplated + '-filter-item-label',\n\n // Close Button\n closeBtn: 'js-' + UC + '-close-btn',\n };\n\n // UI Elements selected by template classes\n var $selectedCriterias = $('.' + templateClasses.selectedCriterias, $mainPanel);\n var $allSectionsSelectedCriterias = $('.' + templateClasses.sectionSelectedCriterias);\n var $clearSelectedCriterias = $('.' + templateClasses.clearSelectedCriterias, $mainPanel);\n var $dropdownItem = $('.' + templateClasses.dropdownItem, $mainPanel);\n var $dropdownBtn = $('.' + templateClasses.dropdownBtn, $mainPanel);\n var $dropdownTitleBtn = $('.' + templateClasses.dropdownTitleBtn, $mainPanel);\n var $filterItem = $('.' + templateClasses.filterItem, $mainPanel);\n var $filterItemLabel = $('.' + templateClasses.criteriaLabel, $mainPanel);\n var $sectionApplyCriteriasBtn = $('.' + templateClasses.sectionApplyCriteriasBtn, $mainPanel);\n var initialNumberOfSelectedCheckboxes = 0;\n //var $selectedCriteria = $('.' + templateClasses.selectedCriteria, $mainPanel);\n \n // 🤘 time\n\n $mainPanel.addClass(UCTemplated);\n\n // Delegate clicks from specific theme buttons to the UC195 Control buttons placed ousite the theme markup\n $clearSelectedCriterias.click(function (evt) {\n $filterItem.removeClass(templateClasses.filterItemDisabled);\n $dropdownItem.removeClass(templateClasses.dropdownItemDisabled);\n $resetButton.trigger('click');\n \n $('.' + templateClasses.selectedCriteria, $mainPanel).remove();\n });\n\n $sectionApplyCriteriasBtn.on('click', function () {\n onApplyButtonClick();\n });\n\n // click on dropdown button (to expand filter criterias on mobile devices)\n $dropdownItem.click(function(e){\n var index = $(this).index();\n\n var currentNumberOfSelectedCheckboxes = _.size($('.' + templateClasses.criteriaCheckbox + ':checked'));\n\n $(this).find('.' + templateClasses.filterItem + ':gt(2)').addClass(templateClasses.filterItemIsHidden);\n\n if ($(this).hasClass(templateClasses.dropdownItemOpened)) {\n $(this).removeClass(templateClasses.dropdownItemOpened).addClass(templateClasses.dropdownItemClosed);\n } else {\n $dropdownItem.removeClass(templateClasses.dropdownItemOpened).addClass(templateClasses.dropdownItemClosed).eq(index).removeClass(templateClasses.dropdownItemClosed).addClass(templateClasses.dropdownItemOpened);\n }\n\n if (initialNumberOfSelectedCheckboxes !== currentNumberOfSelectedCheckboxes) {\n onApplyButtonClick();\n initialNumberOfSelectedCheckboxes = currentNumberOfSelectedCheckboxes;\n }\n\n e.stopPropagation();\n });\n \n $('.' + templateClasses.checkboxFilter).click(function(e){\n e.stopPropagation();\n });\n\n $('.' + templateClasses.checkboxFilter + ' .' + templateClasses.closeBtn).on('click', function (e) {\n $('#collapsableProductFilters').collapse('toggle');\n onApplyButtonClick();\n updateCounterSelectedCriteria();\n });\n\n \n\n $(document).click(function(){\n var currentNumberOfSelectedCheckboxes = _.size($('.' + templateClasses.criteriaCheckbox + ':checked'));\n\n $dropdownItem.removeClass(templateClasses.dropdownItemOpened).addClass(templateClasses.dropdownItemClosed);\n\n if (initialNumberOfSelectedCheckboxes !== currentNumberOfSelectedCheckboxes) {\n onApplyButtonClick();\n initialNumberOfSelectedCheckboxes = currentNumberOfSelectedCheckboxes;\n }\n });\n\n // click on dropdown button (to expand filter criterias on mobile devices)\n $dropdownTitleBtn.on('click', function () {\n onApplyButtonClick();\n\n var currentNumberOfSelectedCheckboxes = _.size($('.' + templateClasses.criteriaCheckbox + ':checked'));\n\n $dropdownItem.find('.' + templateClasses.filterItem + ':gt(2)').addClass(templateClasses.filterItemIsHidden);\n\n if ($dropdownItem.hasClass(templateClasses.dropdownItemOpened)) {\n $dropdownItem.removeClass(templateClasses.dropdownItemOpened).addClass(templateClasses.dropdownItemClosed);\n } else {\n if (initialNumberOfSelectedCheckboxes === currentNumberOfSelectedCheckboxes) {\n $dropdownItem.removeClass(templateClasses.dropdownItemClosed).addClass(templateClasses.dropdownItemOpened);\n } else {\n $dropdownItem.addClass(templateClasses.openAfterFilterApplied);\n }\n }\n\n if (initialNumberOfSelectedCheckboxes !== currentNumberOfSelectedCheckboxes) {\n onApplyButtonClick();\n initialNumberOfSelectedCheckboxes = currentNumberOfSelectedCheckboxes;\n }\n\n var $mainPanelTopBox = $('.TopBox', $mainPanel);\n \n $mainPanelTopBox.find('.' + templateClasses.selectedCriteria).remove();\n\n if(currentNumberOfSelectedCheckboxes>0){\n $mainPanelTopBox.append('' + currentNumberOfSelectedCheckboxes + '');\n }\n \n });\n\n // handle click on selected criteria\n $($selectedCriterias).on('click', '.' + templateClasses.selectedCriteria, function (evt) {\n var criteriaID = $(evt.currentTarget).data('criteria-id');\n var $criteriaCheckbox = $('.' + templateClasses.criteriaCheckbox).filter('[id=' + criteriaID + ']');\n var $filter = $criteriaCheckbox.closest('.' + classes.filter);\n\n $criteriaCheckbox.attr('checked', false);\n applySelectedCheckboxesFilter($filter);\n $(this).remove();\n });\n\n // use pubSub.subscribe instead of change event\n // because this is dynamic filter and checking one criteria can cause changes for another criterias\n pubSub.subscribe(filtersChannelPrefix + '.apply', function (ignore, filterState) {\n // handle selected criterias\n $selectedCriterias.add($allSectionsSelectedCriterias).empty();\n $('.' + templateClasses.sectionSelectedCriterias).remove();\n\n var filter, criteria;\n\n $.each(filterState.appliedFilters, function (appliedFilter, appliedCriterias) {\n filter = _.find(filters, function (filter) {\n return filter.Name === appliedFilter;\n });\n // skip price filter and slideble filters\n if (!filter || filter.slideble) {\n return true; // continue .each loop\n }\n var $sectionCriteriasContainer = $('
');\n var $dropdown = $('#' + filter.clientId);\n var $templateFilterItem = $dropdown.closest($('.' + templateClasses.dropdownItem));\n var $dropdownBtn = $templateFilterItem.find($('.' + templateClasses.dropdownBtn));\n var $embdedSectionCriteriasContainer = $templateFilterItem.find('.' + templateClasses.sectionSelectedCriterias);\n $embdedSectionCriteriasContainer.empty();\n\n $.each(appliedCriterias, function (index, appliedCriteria) {\n criteria = _.find(filter.Criterias, function (criteria) {\n return criteria.Name === appliedCriteria;\n });\n if (!criteria) {\n return true; // continue .each loop\n }\n\n $sectionCriteriasContainer.append(sectionPrecompiledSelectedCriteriaTemplate({\n criteriaLabel: appliedCriteria\n }));\n\n $selectedCriterias.append(precompiledSelectedCriteriaTemplate({\n criteriaID: criteria.clientId,\n appliedFilter: appliedFilter,\n appliedCriteria: appliedCriteria\n }));\n });\n\n if ($embdedSectionCriteriasContainer.length === 0) {\n $dropdownBtn.append($sectionCriteriasContainer);\n } else {\n $embdedSectionCriteriasContainer.replaceWith($sectionCriteriasContainer);\n }\n\n });\n\n if (_.size(filterState.appliedFilters)) {\n $mainPanel.addClass(templateClasses.hasAppliedFilters).removeClass(templateClasses.noAppliedFilters);\n } else {\n $mainPanel.removeClass(templateClasses.hasAppliedFilters).addClass(templateClasses.noAppliedFilters);\n }\n\n $dropdownItem.each(function () {\n if ($(this).hasClass(templateClasses.openAfterFilterApplied)) {\n $(this).removeClass(templateClasses.openAfterFilterApplied)\n $(this).removeClass(templateClasses.dropdownItemClosed).addClass(templateClasses.dropdownItemOpened);\n } else {\n $(this).removeClass(templateClasses.dropdownItemOpened).addClass(templateClasses.dropdownItemClosed);\n $(this).find('.' + templateClasses.filterItem + ':gt(2)').addClass(templateClasses.filterItemIsHidden);\n }\n });\n });\n\n // catch filter changes\n // but these changes not applied yet, .apply fires after Apply button click if enableImmediateFiltering is false\n pubSub.subscribe(filtersChannelPrefix + '.update', function (ignore) {\n // go through all checkboxes to mark disabled criterias\n $filters.each(function () {\n var $filter = $(this);\n var $filterItemTemp;\n var $dropdownItem = $filter.closest('.' + templateClasses.dropdownItem);\n //var $embdedSectionCriteriasContainer = $dropdownItem.find('.' + templateClasses.sectionSelectedCriterias);\n if (!$filter.hasClass(classes.checkboxFilter)) {\n return true; // continue .each loop\n }\n // checkboxes already has disabled/enabled states from previous step\n // so just check this state and mark filter item if needed\n $filter.find('.' + templateClasses.criteriaCheckbox).each(function () {\n $filterItemTemp = $(this).closest('.' + templateClasses.filterItem);\n if ($(this).is(':disabled')) {\n $filterItemTemp.addClass(templateClasses.filterItemDisabled);\n } else {\n $filterItemTemp.removeClass(templateClasses.filterItemDisabled);\n }\n });\n // if all criterias are disabled - mark dropdown item as disabled too\n if ($filter.find('.' + templateClasses.filterItem).length === $filter.find('.' + templateClasses.filterItemDisabled).length) {\n $dropdownItem.addClass(templateClasses.dropdownItemDisabled);\n } else {\n $dropdownItem.removeClass(templateClasses.dropdownItemDisabled);\n }\n });\n if (_.size(appliedFilters)) {\n $mainPanel.addClass(templateClasses.hasAppliedFilters).removeClass(templateClasses.noAppliedFilters);\n } else {\n $mainPanel.removeClass(templateClasses.hasAppliedFilters).addClass(templateClasses.noAppliedFilters);\n }\n });\n\n pubSub.subscribe(filtersChannelPrefix + '.load', function (ignore, filters) {\n initialNumberOfSelectedCheckboxes = _.size($('.' + templateClasses.criteriaCheckbox + ':checked'))\n $dropdownItem.each(function () {\n $(this).find('.' + templateClasses.filterItem + ':gt(2)').addClass(templateClasses.filterItemIsHidden);\n });\n\n if (_.size(appliedFilters)) {\n $mainPanel.addClass(templateClasses.hasAppliedFilters).removeClass(templateClasses.noAppliedFilters);\n } else {\n $mainPanel.removeClass(templateClasses.hasAppliedFilters).addClass(templateClasses.noAppliedFilters);\n }\n });\n }\n\n function updateCounterSelectedCriteria() {\n const templateName = $('.js-uc' + controlId + '-template').val();\n const classRoot = 'uc' + controlId + '-' + templateName;\n\n // Specific template classes\n var templateClasses = {\n selectedCriteria: 'js-' + classRoot + '-selected-criteria',\n\n // Filter item - wrapper for criteria\n filterItem: 'js-' + classRoot + '-filter-item',\n filterItemIsHidden: 'is-mobile-hidden',\n criteriaCheckbox: 'js-' + classRoot + '-filter-item-checkbox',\n };\n\n var currentNumberOfSelectedCheckboxes = _.size($('.' + templateClasses.criteriaCheckbox + ':checked'));\n\n var $mainPanelTopBox = $('.TopBox', $mainPanel);\n\n $mainPanelTopBox.find('.' + templateClasses.selectedCriteria).remove();\n\n if(currentNumberOfSelectedCheckboxes>0) {\n $mainPanelTopBox.find(\"button\").append(' (' + currentNumberOfSelectedCheckboxes + ')');\n }\n }\n\n (function startLoadingFilters() {\n var urlParams = location.href.split('#')[0];\n showOnlyInStock = $.getQueryStringParam(urlParams, 'instockonly_' + productListControlId) === \"true\";\n\n loadFilters(); \n })();\n\n $(function () {\n domReady = true;\n\n $mainPanel = $('#' + ctx.mainPanelId);\n $filtersContainer = $('.' + classes.filtersContainer, $mainPanel);\n $buttonsContainer = $('.' + classes.buttonsContainer, $mainPanel);\n $resetButton = $('.' + classes.resetBtn, $buttonsContainer);\n $closeButton = $('.' + classes.closeBtn, $mainPanel);\n\n if (filtersData) {\n showFilters(filtersData);\n }\n\n $resetButton.on('click', function (e) {\n onResetButtonClick(e);\n updateCounterSelectedCriteria();\n });\n\n $closeButton.on('click', function (e) {\n onApplyButtonClick();\n updateCounterSelectedCriteria();\n });\n\n // Subscribe to popstate event\n $(w).on('popstate', onHistoryPopState);\n\n function onHistoryPopState(evt) {\n var state = evt.originalEvent.state;\n if (state && state.controlId === productListControlId) {\n // Update filters states only, product list is already refreshed from state\n setAppliedFilters(typeof (state.appliedFilters) !== 'undefined' ? state.appliedFilters : {});\n applyFilters(true, true);\n }\n }\n\n pubSub.subscribe(staticfilterChannelPrefix + '.apply', function (topic, itemsCount) {\n loadFilters();\n });\n\n pubSub.subscribe(staticfilterChannelPrefix + '.reset', function (topic) {\n w.removeFromLocalStorage(savedFiltersLocalStorageKey);\n\n setAppliedFilters();\n applyFilters();\n });\n\n pubSub.subscribe(refreshChannelPrefix,\n function (topic, refreshData) {\n if (refreshData &&\n typeof refreshData.showOnlyInStock === 'boolean' &&\n showOnlyInStock !== refreshData.showOnlyInStock) {\n showOnlyInStock = refreshData.showOnlyInStock;\n loadFilters();\n }\n });\n\n pubSub.subscribe(listReadyChannelPrefix,\n function () {\n if (preAppliedFilterState)\n pubSub.publish(filtersChannelPrefix + '.apply', preAppliedFilterState);\n });\n }); \n }\n})(window, jQuery, _);\n"],"names":["w","$","_","assetId","umwAssets","ctx","precompiledTemplate","$filters","allItems","$mainPanel","$filtersContainer","$buttonsContainer","$resetButton","$closeButton","controlId","productListControlId","productListPageControlID","filtersTemplateContent","labels","currencyCode","enableImmediateFiltering","rememberChoiceFor","slideFilteringFor","enableFiltersURLSupport","handlerUrl","R","pubSub","PubSub","filtersChannelPrefix","staticfilterChannelPrefix","refreshChannelPrefix","listReadyChannelPrefix","showOnlyInStock","excludedItemsMap","appliedFilters","savedFiltersLocalStorageKey","classes","noFiltersAvailable","template","filtersContainer","buttonsContainer","filter","checkboxFilter","sliderFilter","sliderContainer","minValue","maxValue","itemsCount","resetBtn","closeBtn","domReady","filtersData","preAppliedFilterState","onApplyButtonClick","applyFilters","onResetButtonClick","evt","preventDefault","removeFromLocalStorage","each","$filterSlider","$filter","this","filterData","data","hasClass","Criterias","criteria","$criteriaCheckbox","find","clientId","prop","text","Items","length","numericCriterias","getNumericCriterias","sliderValues","min","max","slider","updateSliderInfo","loadFilters","query","extend","getUrlParamsObj","location","search","action","pageId","BasePageID","block","message","get","done","responseData","showFilters","fail","errResp","JSON","parse","responseText","Message","statusText","failedToLoadFilters","type","notificationChannel","publish","always","unblock","filterHash","foundFilter","prevFoundFilter","filtersFromUrl","filters","allItemIDs","siteScripts","converters","apply","filterIdx","FilterType","join","slideble","indexOf","Name","criteriaIdx","extractNumberFromString","filtersHtml","html","templateName","val","UC","UCTemplated","selectedCriteriaTemplate","precompiledSelectedCriteriaTemplate","sectionPrecompiledSelectedCriteriaTemplate","templateClasses","$selectedCriterias","$allSectionsSelectedCriterias","$clearSelectedCriterias","$dropdownItem","$dropdownTitleBtn","$filterItem","$sectionApplyCriteriasBtn","initialNumberOfSelectedCheckboxes","addClass","click","removeClass","trigger","remove","on","e","index","currentNumberOfSelectedCheckboxes","size","eq","stopPropagation","collapse","updateCounterSelectedCriteria","document","$mainPanelTopBox","append","criteriaID","currentTarget","closest","attr","selectedCriteriaIds","map","id","selectedCriterias","getSelectedCheckboxCriterias","difference","getCriteriasItems","pluck","updateOtherFilters","subscribe","ignore","filterState","add","empty","appliedFilter","appliedCriterias","$sectionCriteriasContainer","$templateFilterItem","$dropdownBtn","$embdedSectionCriteriasContainer","appliedCriteria","criteriaLabel","replaceWith","$filterItemTemp","is","runTemplateLocalScript","$mobileCloseBtn","change","onCheckboxFilterChange","range","step","isFloat","values","slide","onSliderFilterChange","event","savedFiltersFromLocalStorageJSON","preAppliedFilters","href","split","startsWith","decodeURIComponent","filterParts","splice","filterOrCriteriaName","findAndAddCriteria","findByName","isEmpty","getFromLocalStorage","setAppliedFilters","console","error","css","display","hide","urlItem","filterValue","parseFloat","replace","foundCriteria","push","filtersOrCriterias","name","item","preparedName","toLowerCase","ui","handle","selectedCriteriasItems","getSelectedSliderCriterias","$appliedFilter","not","availableItems","currentFilterName","$currentSlider","allItemsExcludedByOtherFilters","reduce","allExcludedItems","excludedMapItem","excludedByFilterName","union","$criteriaCheckboxCounter","onlyIncludedItems","getAllExcludedItems","allCriterias","result","undefined","intersection","number","n","Number","inpurString","isMatch","match","$minValueContainer","$maxValueContainer","$itemsCountContainer","newTotal","criterias","memo","itemsUnion","x","y","xi","yi","exists","j","contains","some","selectedMin","selectedMax","numericCriteria","filtersToApply","filterId","filteredValues","isRestoring","isHistoryPopEvent","excludedItems","allIncludedItems","filtersUrl","filterUrl","filterName","memo2","criteriaName","filteredItemIds","allItemsCount","isPreApplied","appliedFiltersToRemember","pick","saveToLocalStorage","stringify","classRoot","urlParams","getQueryStringParam","mainPanelId","state","originalEvent","topic","refreshData","window","jQuery"],"mappings":"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"}