/* * Mellow : Ce fichier a été modifié pour le rendre compatible avec le module Infine Ajax Scroll * * Le fichier original vient de la version 1.8.9 de la navigation à facettes (livré avec PS de 1.5.0.17 à 1.5.4.1) * et est identique à celui de la version 1.9.1 (livré avec PS1.4.9.0 et PS1.4.10.0) * * Vous pouvez donc utiliser directement ce fichier sur les versions de PS depuis 1.4.9.0 jusqu'à 1.5.4.1 * * Pour cela Il suffit de copier ce fichier dans le dossier /theme/votre-theme/js/modules/blocklayered/ * et d'activer le module avec la navigation à facettes. * * @author PrestaShop SA * @copyright 2007-2013 PrestaShop SA * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) * International Registred Trademark & Property of PrestaShop SA */ var ajaxQueries = new Array(); var ajaxLoaderOn = 0; var sliderList = new Array(); var slidersInit = false; $(document).ready(function() { cancelFilter(); openCloseFilter(); // Click on color $('#layered_form input[type=button], #layered_form label.layered_color').live('click', function() { if (!$('input[name='+$(this).attr('name')+'][type=hidden]').length) $('').attr('type', 'hidden').attr('name', $(this).attr('name')).val($(this).attr('rel')).appendTo('#layered_form'); else $('input[name='+$(this).attr('name')+'][type=hidden]').remove(); reloadContent(); }); // Click on checkbox $('#layered_form input[type=checkbox], #layered_form input[type=radio], #layered_form select').live('change', function() { reloadContent(); }); // Changing content of an input text $('#layered_form input.layered_input_range').live('keyup', function() { if ($(this).attr('timeout_id')) window.clearTimeout($(this).attr('timeout_id')); // IE Hack, setTimeout do not acept the third parameter var reference = this; $(this).attr('timeout_id', window.setTimeout(function(it) { if (!$(it).attr('id')) it = reference; var filter = $(it).attr('id').replace(/^layered_(.+)_range_.*$/, '$1'); var value_min = parseInt($('#layered_'+filter+'_range_min').val()); if (isNaN(value_min)) value_min = 0; $('#layered_'+filter+'_range_min').val(value_min); var value_max = parseInt($('#layered_'+filter+'_range_max').val()); if (isNaN(value_max)) value_max = 0; $('#layered_'+filter+'_range_max').val(value_max); if (value_max < value_min) { $('#layered_'+filter+'_range_max').val($(it).val()); $('#layered_'+filter+'_range_min').val($(it).val()); } reloadContent(); }, 500, this)); }); $('#layered_block_left .radio').live('click', function() { var name = $(this).attr('name'); $.each($(this).parent().parent().find('input[type=button]'), function (it, item) { if ($(item).hasClass('on') && $(item).attr('name') != name) { $(item).click(); } }); return true; }); // Click on label $('#layered_block_left label a').live({ click: function() { var disable = $(this).parent().parent().find('input').attr('disabled'); if (disable == '' || typeof(disable) == 'undefined' || disable == false) { $(this).parent().parent().find('input').click(); reloadContent(); } return false; } }); layered_hidden_list = {}; $('.hide-action').live('click', function() { if (typeof(layered_hidden_list[$(this).parent().find('ul').attr('id')]) == 'undefined' || layered_hidden_list[$(this).parent().find('ul').attr('id')] == false) { layered_hidden_list[$(this).parent().find('ul').attr('id')] = true; } else { layered_hidden_list[$(this).parent().find('ul').attr('id')] = false; } hideFilterValueAction(this); }); $('.hide-action').each(function() { hideFilterValueAction(this); }); // To be sure there is no other events attached to the selectPrductSort, change the ID var id = 1; while ($('#selectPrductSort').length) { // Because ids are duplicated // Unbind event change on #selectPrductSort $('#selectPrductSort').unbind('change'); $('#selectPrductSort').attr('onchange', ''); $('#selectPrductSort').addClass('selectProductSort'); $('#selectPrductSort').attr('id', 'selectPrductSort'+id); $('label[for=selectPrductSort]').attr('for', 'selectPrductSort'+id); id++; } // Since 1.5, event is add to .selectProductSort and not to #selectPrductSort setTimeout(function() { $('.selectProductSort').unbind('change'); }, 100); $('.selectProductSort').live('change', function(event) { $('.selectProductSort').val($(this).val()); reloadContent(); }); $('.js-nb_item').unbind('change').attr('onchange', ''); $('.js-nb_item').live('change', function(event) { $('.js-nb_item').val($(this).val()); reloadContent(); }); paginationButton(); initLayered(); }); function hideFilterValueAction(it) { if (typeof(layered_hidden_list[$(it).parent().find('ul').attr('id')]) == 'undefined' || layered_hidden_list[$(it).parent().find('ul').attr('id')] == false) { $(it).parent().find('.hiddable').hide(); $(it).parent().find('.hide-action.less').hide(); $(it).parent().find('.hide-action.more').show(); } else { $(it).parent().find('.hiddable').show(); $(it).parent().find('.hide-action.less').show(); $(it).parent().find('.hide-action.more').hide(); } } function addSlider(type, data, unit, format) { sliderList.push({ type: type, data: data, unit: unit, format: format }); } function initSliders() { $(sliderList).each(function(i, slider){ $('#layered_'+slider['type']+'_slider').slider(slider['data']); var from = ''; var to = ''; switch (slider['format']) { case 1: case 2: case 3: case 4: from = blocklayeredFormatCurrency($('#layered_'+slider['type']+'_slider').slider('values', 0), slider['format'], slider['unit']); to = blocklayeredFormatCurrency($('#layered_'+slider['type']+'_slider').slider('values', 1), slider['format'], slider['unit']); break; case 5: from = $('#layered_'+slider['type']+'_slider').slider('values', 0)+slider['unit'] to = $('#layered_'+slider['type']+'_slider').slider('values', 1)+slider['unit']; break; } $('#layered_'+slider['type']+'_range').html(from+' - '+to); }); } function initLayered() { initSliders(); /**** 1ere MODIF ****/ //=> Mellow : Si module IAS actif pas de surveillance des urls par blocklayered if (!jQuery.ias) initLocationChange(); //<= FIN Modif updateProductUrl(); if (window.location.href.split('#').length == 2 && window.location.href.split('#')[1] != '') { var params = window.location.href.split('#')[1]; reloadContent('&selected_filters='+params); } } function paginationButton() { $('div.pagination a').not(':hidden').each(function () { if ($(this).attr('href').search(/&|\?p=/) == -1) { var page = 1; } else { var page = $(this).attr('href').replace(/^.*[&|\?]p=(\d+).*$/, '$1'); } var location = window.location.href.replace(/#.*$/, ''); $(this).attr('href', location+current_friendly_url.replace(/\/page-(\d+)/, '')+'/page-'+page); }); $('div.pagination li').not('.current, .disabled').each(function () { var nbPage = 0; if ($(this).hasClass('pagination_next')) nbPage = parseInt($('div.pagination li.current').children().html())+ 1; else if ($(this).hasClass('pagination_previous')) nbPage = parseInt($('div.pagination li.current').children().html())- 1; $(this).children().click(function () { if (nbPage == 0) p = parseInt($(this).html()) + parseInt(nbPage); else p = nbPage; p = '&p='+ p; reloadContent(p); nbPage = 0; return false; }); }); } function cancelFilter() { $('#enabled_filters a').live('click', function(e) { if ($(this).attr('rel').search(/_slider$/) > 0) { if ($('#'+$(this).attr('rel')).length) { $('#'+$(this).attr('rel')).slider('values' , 0, $('#'+$(this).attr('rel')).slider('option' , 'min' )); $('#'+$(this).attr('rel')).slider('values' , 1, $('#'+$(this).attr('rel')).slider('option' , 'max' )); $('#'+$(this).attr('rel')).slider('option', 'slide')(0,{values:[$('#'+$(this).attr('rel')).slider( 'option' , 'min' ), $('#'+$(this).attr('rel')).slider( 'option' , 'max' )]}); } else if($('#'+$(this).attr('rel').replace(/_slider$/, '_range_min')).length) { $('#'+$(this).attr('rel').replace(/_slider$/, '_range_min')).val($('#'+$(this).attr('rel').replace(/_slider$/, '_range_min')).attr('limitValue')); $('#'+$(this).attr('rel').replace(/_slider$/, '_range_max')).val($('#'+$(this).attr('rel').replace(/_slider$/, '_range_max')).attr('limitValue')); } } else { if ($('option#'+$(this).attr('rel')).length) { $('#'+$(this).attr('rel')).parent().val(''); } else { $('#'+$(this).attr('rel')).attr('checked', false); $('.'+$(this).attr('rel')).attr('checked', false); $('#layered_form input[type=hidden][name='+$(this).attr('rel')+']').remove(); } } reloadContent(); e.preventDefault(); }); } function openCloseFilter() { $('#layered_form span.layered_close a').live('click', function(e) { if ($(this).html() == '<') { $('#'+$(this).attr('rel')).show(); $(this).html('v'); $(this).parent().removeClass('closed'); } else { $('#'+$(this).attr('rel')).hide(); $(this).html('<'); $(this).parent().addClass('closed'); } e.preventDefault(); }); } function stopAjaxQuery() { if (typeof(ajaxQueries) == 'undefined') ajaxQueries = new Array(); for(i = 0; i < ajaxQueries.length; i++) ajaxQueries[i].abort(); ajaxQueries = new Array(); } function reloadContent(params_plus) { stopAjaxQuery(); /**** 2eme SERIE DE MODIFS ****/ //=> Mellow : Modif gestion loader du blocklayered if (!ajaxLoaderOn && !$('#product_list').hasClass('isscrolling')) { $('#product_list').prepend('
'+$('#layered_ajax_loader').html()+'
'); $('#product_list').css('opacity', '0.7'); ajaxLoaderOn = 1; } //<= FIN MODIF data = $('#layered_form').serialize(); $('.layered_slider').each( function () { var sliderStart = $(this).slider('values', 0); var sliderStop = $(this).slider('values', 1); if (typeof(sliderStart) == 'number' && typeof(sliderStop) == 'number') data += '&'+$(this).attr('id')+'='+sliderStart+'_'+sliderStop; }); $(['price', 'weight']).each(function(it, sliderType) { if ($('#layered_'+sliderType+'_range_min').length) { data += '&layered_'+sliderType+'_slider='+$('#layered_'+sliderType+'_range_min').val()+'_'+$('#layered_'+sliderType+'_range_max').val(); } }); $('#layered_form .select option').each( function () { if($(this).attr('id') && $(this).parent().val() == $(this).val()) { data += '&'+$(this).attr('id') + '=' + $(this).val(); } }); if ($('.selectProductSort').length && $('.selectProductSort').val()) { if ($('.selectProductSort').val().search(/orderby=/) > 0) { // Old ordering working var splitData = [ $('.selectProductSort').val().match(/orderby=(\w*)/)[1], $('.selectProductSort').val().match(/orderway=(\w*)/)[1] ]; } else { // New working for default theme 1.4 and theme 1.5 var splitData = $('.selectProductSort').val().split(':'); } data += '&orderby='+splitData[0]+'&orderway='+splitData[1]; } if ($('.js-nb_item').length) { data += '&n='+$('.js-nb_item').val(); } var slideUp = true; if (params_plus == undefined) { params_plus = ''; slideUp = false; } //=> Mellow : Ajout retour a la premiere page si rechargement if (jQuery.ias && !$('#product_list').hasClass('isscrolling') && params_plus != '') { $.scrollTo(0); if (params_plus.indexOf("/page-") >= 0) params_plus = params_plus.split('/page-')[0]; } //<= FIN AJOUT // Get nb items per page var n = ''; $('div.pagination .js-nb_item').children().each(function(it, option) { if (option.selected) n = '&n='+option.value; }); ajaxQuery = $.ajax( { type: 'GET', url: baseDir + 'modules/blocklayered/blocklayered-ajax.php', data: data+params_plus+n, dataType: 'json', cache: false, // @todo see a way to use cache and to add a timestamps parameter to refresh cache each 10 minutes for example success: function(result) { //=> Mellow : Ajout arret surveillance du scroll par le module IAS si chargement page if (jQuery.ias && $.isFunction($.ias_stop_scroll)) $.ias_stop_scroll(); //<= FIN AJOUT $('#layered_block_left').replaceWith(utf8_decode(result.filtersBlock)); $('.category-product-count').html(result.categoryCount); //=> Mellow : Si la fonction a été déclenché par le module IAS, ajout des nouveaux produits à la suite if (jQuery.ias && $('#product_list').hasClass('isscrolling')) { if (result.productList) { var items = []; container = $(utf8_decode(result.productList)); container.find('.ajax_block_product').each(function() { items.push(this); }); $(items).hide(); $('#product_list').append(items); $(items).fadeIn( '400', $.ias.renderComplete.call(this, items)); } } else { // Sinon remplacement de la liste de produits if (result.productList) $('#product_list').replaceWith(utf8_decode(result.productList)); else $('#product_list').html(''); } //<= FIN MODIF $('#product_list').css('opacity', '1'); if ($.browser.msie) // Fix bug with IE8 and aliasing $('#product_list').css('filter', ''); if (result.pagination.search(/[^\s]/) >= 0) { if ($(result.pagination).find('ul.pagination').length) { $('div.pagination').show(); $('ul.pagination').each(function () { $(this).replaceWith($(result.pagination).find('ul.pagination')); }); } else if (!$('ul.pagination').length) { $('div.pagination').show(); $('div.pagination').each(function () { $(this).html($(result.pagination)); }); } else { $('ul.pagination').html(''); $('div.pagination').hide(); } } else { $('ul.pagination').html(''); $('div.pagination').hide(); } paginationButton(); ajaxLoaderOn = 0; //=> Mellow : Ajout reinitialisation paramettres blocklayered $('#theloader').remove(); // supression loader du blocklayered $('#product_list').removeClass('isscrolling'); if (jQuery.ias) $.ias_hidepage(); //<= FIN AJOUT // On submiting nb items form, relaod with the good nb of items $('div.pagination form').submit(function() { val = $('div.pagination .js-nb_item').val(); $('div.pagination .js-nb_item').children().each(function(it, option) { if (option.value == val) $(option).attr('selected', true); else $(option).removeAttr('selected'); }); // Reload products and pagination reloadContent(); return false; }); if (typeof(ajaxCart) != "undefined") ajaxCart.overrideButtonsInThePage(); if (typeof(reloadProductComparison) == 'function') reloadProductComparison(); initSliders(); // Currente page url if (typeof(current_friendly_url) == 'undefined') current_friendly_url = '#'; // Get all sliders value $(['price', 'weight']).each(function(it, sliderType) { if ($('#layered_'+sliderType+'_slider').length) { // Check if slider is enable & if slider is used if(typeof($('#layered_'+sliderType+'_slider').slider('values', 0)) != 'object') { if ($('#layered_'+sliderType+'_slider').slider('values', 0) != $('#layered_'+sliderType+'_slider').slider('option' , 'min') || $('#layered_'+sliderType+'_slider').slider('values', 1) != $('#layered_'+sliderType+'_slider').slider('option' , 'max')) current_friendly_url += '/'+sliderType+'-'+$('#layered_'+sliderType+'_slider').slider('values', 0)+'-'+$('#layered_'+sliderType+'_slider').slider('values', 1) } } else if ($('#layered_'+sliderType+'_range_min').length) { current_friendly_url += '/'+sliderType+'-'+$('#layered_'+sliderType+'_range_min').val()+'-'+$('#layered_'+sliderType+'_range_max').val(); } }); //=> Mellow : Modif gestion historique if (jQuery.ias) { if (current_friendly_url.indexOf("/page-") >= 0 && $('#product_list').hasClass('nohashes')) { current_friendly_url = current_friendly_url.replace(/\/page-(\d+)/, ''); lockLocationChecking = true; } if (current_friendly_url == '#') current_friendly_url = '#/'; if (current_friendly_url.indexOf("/page-") == -1) $.ias_init_pages(); if (window.location.hash.replace(/\/page-(\d+)/, '').replace(/^#\//, '').replace(/^#/, '') == current_friendly_url.replace(/\/page-(\d+)/, '').replace(/^#\//, '').replace(/^#/, '')) { window.location.replace(('' + window.location).split('#')[0] + current_friendly_url); slideUp = false; } else { window.location = current_friendly_url; $.ias_init_pages(); slideUp = true; } lockLocationChecking = true; } else { //code inital if (current_friendly_url == '#') current_friendly_url = '#/'; window.location = current_friendly_url; lockLocationChecking = true; if(slideUp) $.scrollTo('#product_list', 400); updateProductUrl(); } //<= FIN MODIF $('.hide-action').each(function() { hideFilterValueAction(this); }); }, //=> Mellow : Ajout fonction pour reinitialisation surveillance du scroll par le module IAS complete: function() { if (jQuery.ias) if(slideUp) $.scrollTo($('#product_list').offset().top-40, 400, function(){ $.ias_reset(); }); else $.ias_reset(); //if (jQuery.ias && $.isFunction($.ias_reset)) $.ias_reset(); } //<= FIN AJOUT /**** FIN TOUTES MODIFS ****/ }); ajaxQueries.push(ajaxQuery); } function initLocationChange(func, time) { if(!time) time = 500; var current_friendly_url = getUrlParams(); setInterval(function() { if(getUrlParams() != current_friendly_url && !lockLocationChecking) { // Don't reload page if current_friendly_url and real url match if (current_friendly_url.replace(/^#(\/)?/, '') == getUrlParams().replace(/^#(\/)?/, '')) return; lockLocationChecking = true; reloadContent('&selected_filters='+getUrlParams().replace(/^#/, '')); } else { lockLocationChecking = false; current_friendly_url = getUrlParams(); } }, time); } function getUrlParams() { var params = current_friendly_url; if(window.location.href.split('#').length == 2 && window.location.href.split('#')[1] != '') params = '#'+window.location.href.split('#')[1]; return params; } function updateProductUrl() { // Adding the filters to URL product if (typeof(param_product_url) != 'undefined' && param_product_url != '' && param_product_url !='#') { $.each($('ul#product_list li.ajax_block_product .product_img_link,'+ 'ul#product_list li.ajax_block_product h3 a,'+ 'ul#product_list li.ajax_block_product .product_desc a,'+ 'ul#product_list li.ajax_block_product .lnk_view'), function() { $(this).attr('href', $(this).attr('href') + param_product_url); }); } } /** * Copy of the php function utf8_decode() */ function utf8_decode (utfstr) { var res = ''; for (var i = 0; i < utfstr.length;) { var c = utfstr.charCodeAt(i); if (c < 128) { res += String.fromCharCode(c); i++; } else if((c > 191) && (c < 224)) { var c1 = utfstr.charCodeAt(i+1); res += String.fromCharCode(((c & 31) << 6) | (c1 & 63)); i += 2; } else { var c1 = utfstr.charCodeAt(i+1); var c2 = utfstr.charCodeAt(i+2); res += String.fromCharCode(((c & 15) << 12) | ((c1 & 63) << 6) | (c2 & 63)); i += 3; } } return res; } /** * Return a formatted price * Copy from tools.js */ function blocklayeredFormatCurrency(price, currencyFormat, currencySign, currencyBlank) { // if you modified this function, don't forget to modify the PHP function displayPrice (in the Tools.php class) blank = ''; price = parseFloat(price.toFixed(6)); price = ps_round(price, priceDisplayPrecision); if (currencyBlank > 0) blank = ' '; if (currencyFormat == 1) return currencySign + blank + blocklayeredFormatNumber(price, priceDisplayPrecision, ',', '.'); if (currencyFormat == 2) return (blocklayeredFormatNumber(price, priceDisplayPrecision, ' ', ',') + blank + currencySign); if (currencyFormat == 3) return (currencySign + blank + blocklayeredFormatNumber(price, priceDisplayPrecision, '.', ',')); if (currencyFormat == 4) return (blocklayeredFormatNumber(price, priceDisplayPrecision, ',', '.') + blank + currencySign); return price; } /** * Return a formatted number * Copy from tools.js */ function blocklayeredFormatNumber(value, numberOfDecimal, thousenSeparator, virgule) { value = value.toFixed(numberOfDecimal); var val_string = value+''; var tmp = val_string.split('.'); var abs_val_string = (tmp.length == 2) ? tmp[0] : val_string; var deci_string = ('0.' + (tmp.length == 2 ? tmp[1] : 0)).substr(2); var nb = abs_val_string.length; for (var i = 1 ; i < 4; i++) if (value >= Math.pow(10, (3 * i))) abs_val_string = abs_val_string.substring(0, nb - (3 * i)) + thousenSeparator + abs_val_string.substring(nb - (3 * i)); if (parseInt(numberOfDecimal) == 0) return abs_val_string; return abs_val_string + virgule + (deci_string > 0 ? deci_string : '00'); }