'use strict'; var OR = '|'; var RANGE_DELIMITER = '-'; var PRICE_FACET_ID; $(document).ready(function () { $.ajaxSetup({ cache: false, async: true }); PRICE_FACET_ID = $('#priceFacetId').val(); var priceRange = $('#priceRange').val(); var selectedPriceRange = $('#selectedPriceRange').val(); var minPrice, maxPrice = 0; if (priceRange) { minPrice = parseFloat(priceRange.split(RANGE_DELIMITER)[0]); maxPrice = parseFloat(priceRange.split(RANGE_DELIMITER)[1]); } var selectedMinPrice, selectedMaxPrice = 0; if (typeof selectedPriceRange !== "undefined") { selectedMinPrice = parseFloat(selectedPriceRange.split(RANGE_DELIMITER)[0]); selectedMaxPrice = parseFloat(selectedPriceRange.split(RANGE_DELIMITER)[1]); } else { selectedMinPrice = minPrice; selectedMaxPrice = maxPrice; } var slider = $("#price-range-slider"); slider.slider({ range: true, min: minPrice, max: maxPrice, values: [selectedMinPrice, selectedMaxPrice], change: function (event, ui) { if (event.originalEvent) { formatPriceRangeOnUI(); submitPriceFacet(); } }, start: function (event, ui) { slider.leftValueChanging = ui.value == ui.values[0]; }, slide: function () { formatPriceRangeOnUI(); }, stop: function () { if (slider.leftValueChanging) { var leftPrice = slider.slider("values", 0); slider.slider('values', 0, slider.roundPrice(leftPrice)); } else { var rightPrice = slider.slider("values", 1); slider.slider('values', 1, slider.roundPrice(rightPrice)); } } }); slider.roundPrice = function (price) { var priceBounds = getPriceBounds(); var leftPriceBound = priceBounds[0]; var rightPriceBound = priceBounds[1]; var roundTo = 5; var modulo = price % roundTo; if (modulo >= roundTo / 2) { price += roundTo - modulo; if (price > rightPriceBound) price = rightPriceBound; } else { price -= modulo; if (price < leftPriceBound) price = leftPriceBound; } return price; }; var getPriceBounds = function () { var priceRange = $('#priceRange').val(); var minPrice = parseFloat(priceRange.split(RANGE_DELIMITER)[0]); var maxPrice = parseFloat(priceRange.split(RANGE_DELIMITER)[1]); return [minPrice, maxPrice]; }; var resetPriceFacet = function () { var priceBounds = getPriceBounds(); var slider = $('#price-range-slider'); slider.slider('values', 0, priceBounds[0]); slider.slider('values', 1, priceBounds[1]); formatPriceRangeOnUI(); }; var formatPriceRangeOnUI = function () { $('#minPrice').html(slider.slider("values", 0)); $('#maxPrice').html(slider.slider("values", 1)); }; var submitPriceFacet = function () { var url = $('#PriceFacetURL').val(); var newUrl = url; // replace encoded elements url=url.replace(/%253A/g,":"); url=url.replace(/%257C/g,"|"); // get start of our price facet var startInd = url.indexOf(PRICE_FACET_ID); var ind=url.indexOf(":",startInd); // get end of our price facet var endInd=url.indexOf(":",ind+1); if (endInd<0) { var endInd=url.indexOf("&",ind+1); } var priceSlider = $("#price-range-slider"); var minVal = priceSlider.slider('option', 'min'); var maxVal = priceSlider.slider('option', 'max'); var selectedMinVal = priceSlider.slider('values', 0); var selectedMaxVal = priceSlider.slider('values', 1); if (selectedMinVal != minVal || selectedMaxVal != maxVal) { var priceTrail = PRICE_FACET_ID + ':' + selectedMinVal + RANGE_DELIMITER + selectedMaxVal; if (selectedMaxVal == maxVal){ priceTrail= priceTrail + "|LAST"; } newUrl=url.substring(0,startInd)+priceTrail; if (endInd>0){ newUrl=newUrl+url.substring(endInd); } } location.href=newUrl; }; var getTimeFromDatepicker = function ($datepicker, isInclusive) { isInclusive = typeof isInclusive !== 'undefined' ? isInclusive : false; var dateSplit = $datepicker.val().split('-'); return new Date(dateSplit[2], dateSplit[1] - 1, parseInt(dateSplit[0], 10) + (isInclusive ? 1 : 0)).getTime(); }; var composeURL = function () { var url = new URL(); url.setParam('trail', FacetTrail.composeTrail('').toString()); var $sort = $('#sort').val(); if ($sort) { var sortOptions = $sort.split('-'); if (sortOptions.length == 3) { url.setParam('sort', sortOptions[0]); url.setParam('order', sortOptions[1]); url.setParam('sortType', sortOptions[2]); } } var $sortAccessories = $('#sortAccessories').val(); if ($sortAccessories) { var sortOptions = $sortAccessories.split('-'); if (sortOptions.length == 3) { url.setParam('sort', sortOptions[0]); url.setParam('order', sortOptions[1]); url.setParam('sortType', sortOptions[2]); } } var articleTypes = getSelectedArticleTypes(); if (articleTypes.length != 0) { url.setParam('articleTypes', articleTypes); } var $dpStart = $('#dpStart'); var $dpEnd = $('#dpEnd'); if ($dpStart.val() && $dpEnd.val()) { url.setParam('startTime', getTimeFromDatepicker($dpStart)); url.setParam('endTime', getTimeFromDatepicker($dpEnd, true)); } var currentPage = $('.selectedPage').html(); if (!currentPage) { currentPage = 1; } url.setParam('page', currentPage); url.setParam('cats', getSelectedFAQFilters()); url.setParam('tab', $('#search-tabs').find('li.active').data('name')); return url; }; var handleFacetsSelectionChanged = function () { var url = composeURL(); url.setParam('page', 1); $.get(url.toString(), handlePageRefresh).done(function () { $('#listingRange').trigger('pageChange', []); }); updateFacetsCounters(); }; var handlePageRefresh = function (data) { var activeTab = $('#search-tabs').find('li.active').data('name'); var $data = $(data); if (activeTab == 'articles') { $('#articleSearchResults').html($data.find('#articleSearchResults').html()); $('#articlesPagination').html($data.find('#articlesPagination').html()); var $articleSearchResults = $('#articleSearchResults').show(); if ($('#articles-listing li').size() == 0) { $articleSearchResults.hide(); } } else if (activeTab == 'faq') { $('#faqs-listing').html($data.find('#faqs-listing').html()); $('#faqsPagination').html($data.find('#faqsPagination').html()); hideFAQCategoryFilterIfNeeded(); } else { $('.listing-footer:eq(0)').html($data.find('.listing-footer:eq(0)').html()); $('#listing').html($data.find('#listing').html()); var selectedFacetsList = $data.find('#selectedFacets').find('ul').html(); if (selectedFacetsList) { if (selectedFacetsList.trim()) { $('#selectedFacets').html($data.find('#selectedFacets').html()).show(); } else { $('#selectedFacets').hide(); } } if ($(data).find('#listingRange').length > 0) { $('#listingRange').html($data.find('#listingRange').html()); } else { $('#listingRange').empty(); } } // adding new facets if (isSearchResultsPage()) { var $facets = $('ul#facets'); $data.find("li.filters-box").each(function() { var $incomingFacetBox = $(this); var incomingFacetId = $incomingFacetBox.find("ul.filters-values-list").prop("id"); // check if that facet already present // do not append 'Product' magic facet if (incomingFacetId && incomingFacetId != "13110") { var $existedFacet = $facets.find("#" + incomingFacetId); var isPresent = $existedFacet.length > 0; // appending new facet to facets list if (!isPresent) { $facets.append($incomingFacetBox); } } }); //$("ul#facets").html($data.find("ul#facets").html()); //initPriceSlider(); } pushFacetsToHisotry(); $.scrollTo("#search-tabs", {duration: 200}); }; var URL = function () { this.url = window.location.href.replace('#', ''); this.setURL = function (newURL) { this.url = newURL; }; this.setParam = function (paramName, paramValue) { var params = this.url.split('?')[1]; if (!params) { params = paramName + '=' + paramValue; } else { var paramExist = false; var pairs = params.split('&'); for (var i = 0; i < pairs.length; i++) { var name = pairs[i].split('=')[0]; if (name == paramName) { paramExist = true; pairs[i] = name + '=' + paramValue; } } if (!paramExist) { pairs.push(paramName + '=' + paramValue); } params = pairs.join('&'); } this.url = this.url.split('?')[0] + '?' + params; }; this.removeParam = function (paramName) { var params = this.url.split('?')[1]; if (params) { var pairs = params.split('&'); for (var i = 0; i < pairs.length; i++) { var name = pairs[i].split('=')[0]; if (name == paramName) pairs.splice(i, 1); } params = pairs.join('&'); this.url = this.url.split('?')[0] + '?' + params; } }; this.getParamValue = function (paramName) { var result; var params = this.url.split('?')[1]; if (params) { var pairs = params.split('&'); for (var i = 0; i < pairs.length; i++) { var split = pairs[i].split('='); if (split[0] == paramName) { result = decodeURIComponent(split[1]); break; } } } return result; }; this.toString = function () { return this.url; }; }; var FacetTrail = function () { this.trail = ''; this.addToTrail = function (trailToAdd) { if (!this.trail) { this.trail = trailToAdd; return; } var tokens = this.trail.split(':'); var addId = trailToAdd.split(':')[0]; var addValue = trailToAdd.split(':')[1]; var facetAlreadyInTrail = false; for (var i = 0; i < tokens.length; i += 2) { if (tokens[i] == addId) { facetAlreadyInTrail = true; tokens[i + 1] += OR + addValue; break; } } if (!facetAlreadyInTrail) { this.trail += ':' + trailToAdd; } else { this.trail = tokens.join(':'); } }; this.toString = function () { return this.trail; } }; FacetTrail.composeTrail = function (skipFacetId) { var facetTrail = new FacetTrail(); $('.filters-values-list').each(function () { if (this.id != skipFacetId) { $(this).find('.facet-checkbox').each(function () { if ($(this).is(':checked')) { facetTrail.addToTrail($(this).attr('data-trail')); } }); } }); var priceSlider = $("#price-range-slider"); var minVal = priceSlider.slider('option', 'min'); var maxVal = priceSlider.slider('option', 'max'); var selectedMinVal = priceSlider.slider('values', 0); var selectedMaxVal = priceSlider.slider('values', 1); if (selectedMinVal != minVal || selectedMaxVal != maxVal) { var priceTrail = PRICE_FACET_ID + ':' + selectedMinVal + RANGE_DELIMITER + selectedMaxVal + "|LAST"; facetTrail.addToTrail(priceTrail); } return facetTrail; }; var resetFacet = function (facetId) { if (facetId == PRICE_FACET_ID) { resetPriceFacet(); } $('#' + facetId).find('.facet-checkbox').each(function () { $(this).prop('checked', false); }); handleFacetsSelectionChanged(); }; var goToPage = function (pageLink) { var page = $(pageLink).data('page'); var activeTab = $('#search-tabs').find('li.active').data('name'); if (page) { if (activeTab == 'articles' || activeTab == 'faq'){ var url = composeURL(); url.setParam('page', page); $.get(url.toString(), handlePageRefresh).done(function () { $('#listingRange').trigger('pageChange', []); $('html, body').animate({scrollTop: $('.section-title').position().top}, 400); }); } else { var oldUrl = $('#PriceFacetURL').val(); var newUrl = new URL(oldUrl); newUrl.setParam('page',page); location.href=newUrl; } } }; /* $(document).on('click', '#resetAllFacets', function () { if ($('#price-range-slider').length) { resetPriceFacet(); } $('.facet-checkbox').each(function () { $(this).prop('checked', false); }); handleFacetsSelectionChanged(); }); $(document).on('click', '.delete, .delete-facet', function () { resetFacet($(this).attr('data-facet-id')); }); $(document).on('click', '.facet-checkbox', function () { if ($(this).data('category-facet')) { var thisChecked = $(this).prop('checked'); $('[data-category-facet="true"]').each(function () { $(this).prop('checked', false); }); $(this).prop('checked', thisChecked); } handleFacetsSelectionChanged(); }); */ $(document).on('click', '.pagination a', function (event) { event.preventDefault(); goToPage(this); }); $('.pagination a').on('click', function () { goToPage(this); }); $('.sort').click(function(){ sort($(this).data("value")); }); $('#sort').change(function () { sort($(this).val()); }); function sort($sort) { var oldUrl = $('#URLForSorting').val(); var newUrl = new URL(oldUrl); if ($sort) { var sortOptions = $sort.split('-'); if (sortOptions.length == 3) { newUrl.setParam('sort', sortOptions[0]); newUrl.setParam('order', sortOptions[1]); newUrl.setParam('sortType', sortOptions[2]); } } else { newUrl.removeParam('sort'); newUrl.removeParam('order'); newUrl.removeParam('sortType'); } location.href=newUrl; } function setSortValue (){ var $sort = document.getElementById('sort'); var $sortVal = $('#sortVal').val(); if ($sortVal){ var $orderVal = $('#orderVal').val(); var $sortTypeVal = $('#sortTypeVal').val(); var value = $sortVal+"-"+$orderVal+"-"+$sortTypeVal; $sort.value=$sortVal+"-"+$orderVal+"-"+$sortTypeVal; } } setSortValue(); var handleAccessoriesPageRefresh = function (data) { $('#list').html($(data).find('#list').html()); } $('#sortAccessories').change(function () { $.get(composeURL().toString(), handleAccessoriesPageRefresh).done(function () { }); }); var updateFacetsCounters = function () { $('.filters-values-list').each(function () { var url = new URL(); url.setURL('/blocks/search/getFacets.jsp'); url.setParam('startCategory', $('#startCategory').val()); url.setParam('q', $('#q').val()); url.setParam('facetToUpdateId', this.id); url.setParam('trail', FacetTrail.composeTrail(this.id)); $.get(url.toString(), function (data) { var json = $.parseJSON(data); var facetId = json.facetId; $('#' + facetId).find('.facet-checkbox').each(function () { if (!$(this).data('category-facet')) { $(this).prop('disabled', true); $(this).next('.facet-count').html(0); } }); for (var i = 0; i < json.values.length; i += 2) { var facetValue = json.values[i]; var facetCount = json.values[i + 1]; var trailForCurrentFacet = facetId + ':' + facetValue; var checkBox = $('[data-trail="' + trailForCurrentFacet + '"]'); checkBox.next('.facet-count').html(facetCount); checkBox.prop('disabled', false); } disableEmptyFacets(); } ); }); }; var disableEmptyFacets = function () { var $facets = $('#facets'); $facets.find('.filters-box').each(function () { var $this = $(this); if ($this.find('#priceFacetId').size() == 0) { $this.removeClass('disabled'); if ($this.find('.facet-checkbox').size() == $this.find('.facet-checkbox[disabled]').size()) { $this.addClass('disabled'); } } }); if (!isSearchResultsPage()) { $facets.find('.filters-box:eq(0) li').each(function () { var count = $(this).find('.facet-count').text(); count == 0 ? $(this).hide() : $(this).show(); }); } }; var SearchResultsTab = function (labelSelector, contentSelector) { this.$label = $(labelSelector); this.$content = $(contentSelector); this.isActive = false; this.$label.on('click', function (e) { e.preventDefault(); $(this).tab("show"); }); this.isEmpty = function () { return this.$content.find('div.tvItem').length == 0 && this.$content.find('li').length == 0; }; this.disable = function () { return this.$label.parent().addClass('disabled'); }; this.show = function () { this.isActive = true; this.$label.parent().removeClass('disabled'); this.$label.tab("show"); }; }; var productsTab = new SearchResultsTab('#search-tabs a:eq(0)', '#listing'); var faqTab = new SearchResultsTab('#search-tabs a:eq(1)', '#faqs-listing'); var articlesTab = new SearchResultsTab('#search-tabs a:eq(2)', '#articles-listing'); var tabs = [productsTab, faqTab, articlesTab]; function openTabWithResults() { if (!productsTab.isEmpty()) { productsTab.show(); } else if (!faqTab.isEmpty()) { faqTab.show(); } else if (!articlesTab.isEmpty()) { articlesTab.show(); } else { showNoSearchResults(); } } function disableEmptyTabs() { if (productsTab.isEmpty()) productsTab.disable(); if (articlesTab.isEmpty()) articlesTab.disable(); if (faqTab.isEmpty()) faqTab.disable(); } function showNoSearchResults() { var $noResults = $('#search-no-results'); $noResults.removeClass('hidden') $noResults.parent().removeClass('span9'); $noResults.find('.box-stacked').removeClass('row-fluid').css('border', '1px solid white').css('box-shadow', 'none').css('-webkit-box-shadow', 'none'); $('#products').find('aside').remove(); productsTab.show(); } disableEmptyTabs(); openTabWithResults(); var getSelectedArticleTypes = function () { var checkedInputs = $('#articleTypeSelector').find('input:checked'); return $.map(checkedInputs, function (label) { return $(label).val(); }); }; //Article's filters related stuff here $('#resetArticleType').on('click', function () { var $typeSelector = $('#articleTypeSelector'); var selectedLength = getSelectedArticleTypes(); if (selectedLength != 0) { $typeSelector.find('input:checked').prop('checked', false); $typeSelector.trigger('change'); } }); $('#resetArticleDates').on('click', function () { $('#dpStart').val($('#startDate').val()); $('#dpEnd').val($('#endDate').val()); $('#dpEnd').trigger({type: 'changeDate', date: new Date(getTimeFromDatepicker($('#endDate')))}); }); $('#articleTypeSelector').on('change', function () { var url = composeURL(); url.setParam('page', '1'); $.get(url.toString(), handlePageRefresh); }); var nowTemp = new Date(); var now = new Date(nowTemp.getFullYear(), nowTemp.getMonth(), nowTemp.getDate(), 0, 0, 0, 0); var datepickerStart = $('#dpStart').datepicker({ format: 'dd-mm-yyyy', onRender: function (date) { return date.getTime() >= getTimeFromDatepicker($('#startDate')) && date.getTime() <= getTimeFromDatepicker($('#endDate'), true) ? '' : 'disabled'; } }).on('changeDate',function (event) { var url = composeURL(); url.setParam('page', '1'); url.setParam('startTime', event.date.getTime()); url.setParam('endTime', getTimeFromDatepicker($('#dpEnd'), true)); $.get(url.toString(), handlePageRefresh); datepickerStart.hide(); datepickerEnd.show(); return $('#dpEnd')[0].focus(); }).data("datepicker"); var datepickerEnd = $('#dpEnd').datepicker({ format: 'dd-mm-yyyy', onRender: function (date) { return date.getTime() > getTimeFromDatepicker($('#startDate')) && date.getTime() < getTimeFromDatepicker($('#endDate'), true) ? '' : 'disabled'; } }).on('changeDate',function (event) { var url = composeURL(); var date = new Date(event.date.getFullYear(), event.date.getMonth(), event.date.getDate() + 1); url.setParam('page', '1'); url.setParam('startTime', getTimeFromDatepicker($('#dpStart'))); url.setParam('endTime', date.getTime()); $.get(url.toString(), handlePageRefresh); datepickerEnd.hide(); }).data('datepicker'); $('#dpStart').bind('click keydown cut copy paste', function (e) { e.preventDefault(); }); $('#dpEnd').bind('click keydown cut copy paste', function (e) { e.preventDefault(); }); //FAQ's filter related stuff here $(document).on('change', '#faq-filter input', function () { handleFAQFilterChange() }); $('#faq-filter-reset').click(function () { var $checkedInputs = $('#faq-filter').find('input:checked'); if ($checkedInputs.size() > 0) { $checkedInputs.prop('checked', false); handleFAQFilterChange() } }); function getSelectedFAQFilters() { var selectedCats = $('#faq-filter').find('input:checked').parent().map(function (i, v) { return $.trim($(v).text()); }); return $.makeArray(selectedCats).join(','); } function handleFAQFilterChange() { var url = composeURL(); url.setParam('cats', getSelectedFAQFilters()); url.setParam('page', '1'); $.get(url.toString(), handlePageRefresh); } function hideFAQCategoryFilterIfNeeded() { var $faqFilter = $('aside:eq(1)'); var $filterInputs = $faqFilter.find('input'); var $faqListing = $('#faqs-listing'); if ($filterInputs.size() == 1) { var singleCat = $filterInputs.parent().text(); $('

' + singleCat + '

').insertBefore($faqListing); $faqListing.parent().parent().removeClass('span9').addClass('span12'); $faqFilter.remove(); } else { $faqFilter.show(); $faqListing.siblings().remove(); $faqListing.find('li:eq(0)').css('border-top', 'none'); } } hideFAQCategoryFilterIfNeeded(); //****************************** // historyJS related stuff here //****************************** var FACETS_PARAM = 'f'; var FACETS_DELIMETER = ';'; var FACET_NAME_DELIMETER = ':'; var FACET_VAL_DELIMETER = '|'; var PRICE_FACET_NAME = 'Price'; function pushFacetsToHisotry() { if (!History.enabled) return; var facets = getSelectedFacetsAsString(); var url = new URL(); if (facets) { url.setParam(FACETS_PARAM, facets); } else { url.removeParam(FACETS_PARAM); } var title = $(document).find("title").text(); History.replaceState(null, title, url.toString()); } var Facet = function (name, selectedValues) { this.name = name; this.selectedValues = selectedValues; this.toString = function () { return this.name + FACET_NAME_DELIMETER + this.selectedValues.join(FACET_VAL_DELIMETER); }; }; Facet.parseFromString = function (toParse) { var split = toParse.split(FACET_NAME_DELIMETER); var name = split[0]; var selectedValues = split[1].split(FACET_VAL_DELIMETER); return new this(name, selectedValues); }; function getSelectedFacetsAsString() { var facets = []; var $selectedFactes = $('#selectedFacets'); if ($selectedFactes.is(':visible')) { $selectedFactes.find('p').each(function () { var splitted = $(this).text().split(':'); var facetName = $.trim(splitted[0]); var selectedVals = []; $.each(splitted[1].split(','), function () { selectedVals.push($.trim(this)); }); facets.push(new Facet(facetName, selectedVals)); }); } return facets.join(FACETS_DELIMETER); } function parseSelectedFacetsParam() { var url = new URL(); var facetsParam = url.getParamValue(FACETS_PARAM); var facets = []; if (facetsParam) { var split = facetsParam.split(FACETS_DELIMETER); $.each(split, function () { facets.push(Facet.parseFromString(this)); }); } return facets; } function selectFacets(facets) { $.each(facets, function () { var isPirceFacet = this.name == PRICE_FACET_NAME; var $facetHeader = $('.filters-box').find('h5:contains(' + this.name + ')'); if ($facetHeader) { var $facetContainer = $facetHeader.parent().parent(); $.each(this.selectedValues, function () { if (isPirceFacet) { var split = this.split('-'); var slider = $('#price-range-slider'); slider.slider('values', 0, split[0]); slider.slider('values', 1, split[1]); $('#minPrice').html(split[0]); $('#maxPrice').html(split[1]); } else { var $inputToSelect = $facetContainer.find('label:contains(' + this + ')').find('input'); if ($inputToSelect) { $inputToSelect.prop('checked', true); } } }); } }); handleFacetsSelectionChanged(); } /* var url = new URL(); if (!url.getParamValue(FACETS_PARAM)) { $('.facet-checkbox').each(function () { if ($(this).hasClass('checkedCategory')) { handleFacetsSelectionChanged(); } else { $(this).prop('checked', false); $(this).prop('disabled', false); } }); } else { $('.facet-checkbox').each(function () { $(this).prop('checked', false); $(this).prop('disabled', false); }); } var facetsToSelect = parseSelectedFacetsParam(); selectFacets(facetsToSelect); */ //offers category on search results $('#showOffersFacet').click(function(){ $('#showOffersFacet').parent().toggleClass('checked',this.checked); $("#sorting").toggle(!this.checked); $('#listing').toggle(!this.checked); $('.offers-list:first').css('margin-top','10px') $('.offers-list').toggle(this.checked); }); //find the id of the tab pane that should be activated var selectedTabPane = $('ul.nav-tabs li.active a').attr('href'); if (selectedTabPane) { //remove the class "active" from all tab panes $('div.tab-pane').removeClass("active"); //set as active only one tab pane $(selectedTabPane).addClass("active"); } }); function isSearchResultsPage() { return window.location.href.indexOf("search") != -1; }