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