{"version":3,"file":"ProductFilters5.min.js","sources":["ProductFilters5.js"],"sourcesContent":["(function (w, $, _) {\r\n 'use strict';\r\n\r\n const assetId = '~/Parts/Views/Product/ProductFilters/ProductFilters5.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\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 refreshChannelPrefix = 'frontend.productlist.refresh.' + (productListPageControlID || productListControlId);\r\n var listReadyChannelPrefix = 'frontend.productlist.ready.' + (productListPageControlID || productListControlId);\r\n var showOnlyInStock = false;\r\n var precompiledTemplate;\r\n\r\n var $filters, excludedItemsMap = {}, allItems, appliedFilters = {};\r\n var $mainPanel, $filtersContainer, $buttonsContainer, $resetButton, $closeButton;\r\n\r\n var savedFiltersLocalStorageKey = controlId + '_saved_filters';\r\n\r\n var classes = {\r\n noFiltersAvailable: 'NoFiltersAvailable',\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 };\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() {\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\r\n if (domReady) {\r\n showFilters(responseData);\r\n } else {\r\n filtersData = responseData;\r\n }\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) {\r\n var filters = data.filters;\r\n allItems = data.allItemIDs;\r\n\r\n if (!filters || !filters.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 });\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 // 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 $filtersContainer.removeClass(classes.noFiltersAvailable);\r\n $buttonsContainer.css({'display': 'flex'});\r\n pubSub.publish(filtersChannelPrefix + '.load', filters);\r\n } else {\r\n $filtersContainer.addClass(classes.noFiltersAvailable);\r\n $buttonsContainer.hide();\r\n }\r\n }\r\n\r\n updateCounterSelectedCriteria();\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 } 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 === 'horizontal5') && typeof (event.originalEvent) !== 'undefined') {\r\n switch (templateName) {\r\n case 'horizontal5':\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 horizontal5 template and applyFilters on every checkbox change\r\n if (enableImmediateFiltering || templateName === 'horizontal5') {\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 getAllFilterIncludedItems(clientId) {\r\n var excludedItems = excludedItemsMap[clientId];\r\n return _.difference(allItems, excludedItems);\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 };\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 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 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 sectionApplyCriteriasBtn: 'js-' + UCTemplated + '-section-apply-criterias',\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\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 $sectionApplyCriteriasBtn = $('.' + templateClasses.sectionApplyCriteriasBtn, $mainPanel);\r\n var initialNumberOfSelectedCheckboxes = 0;\r\n //var $selectedCriteria = $('.' + templateClasses.selectedCriteria, $mainPanel);\r\n \r\n // 🤘 time\r\n\r\n $mainPanel.addClass(UCTemplated);\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\r\n $sectionApplyCriteriasBtn.on('click', function () {\r\n applyFilters();\r\n });\r\n\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 $('.' + templateClasses.checkboxFilter).click(function(e){\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 $(document).click(function(){\r\n $dropdownItem.removeClass(templateClasses.dropdownItemOpened).addClass(templateClasses.dropdownItemClosed);\r\n });\r\n\r\n // click on dropdown button (to expand filter criterias on mobile devices)\r\n $dropdownTitleBtn.on('click', function () {\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 });\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\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 }\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 };\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\r\n if(currentNumberOfSelectedCheckboxes>0) {\r\n $mainPanelTopBox.find(\"button\").append(' (' + currentNumberOfSelectedCheckboxes + ')');\r\n }\r\n }\r\n\r\n (function startLoadingFilters() {\r\n var urlParams = location.href.split('#')[0];\r\n showOnlyInStock = $.getQueryStringParam(urlParams, 'instockonly_' + productListControlId) === \"true\";\r\n\r\n loadFilters(); \r\n })();\r\n\r\n $(function () {\r\n domReady = true;\r\n\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\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 setAppliedFilters(typeof (state.appliedFilters) !== 'undefined' ? state.appliedFilters : {});\r\n applyFilters(true, true);\r\n }\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(refreshChannelPrefix,\r\n function (topic, refreshData) {\r\n if (refreshData &&\r\n typeof refreshData.showOnlyInStock === 'boolean' &&\r\n showOnlyInStock !== refreshData.showOnlyInStock) {\r\n showOnlyInStock = refreshData.showOnlyInStock;\r\n loadFilters();\r\n }\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 }\r\n})(window, jQuery, _);\r\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","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","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","runTemplateLocalScript","templateName","val","UC","UCTemplated","selectedCriteriaTemplate","precompiledSelectedCriteriaTemplate","sectionPrecompiledSelectedCriteriaTemplate","templateClasses","$selectedCriterias","$allSectionsSelectedCriterias","$clearSelectedCriterias","$dropdownItem","$dropdownTitleBtn","$filterItem","$sectionApplyCriteriasBtn","initialNumberOfSelectedCheckboxes","addClass","click","removeClass","trigger","remove","on","e","index","eq","stopPropagation","collapse","document","currentNumberOfSelectedCheckboxes","size","$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","$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","updateCounterSelectedCriteria","$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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"}