jQuery(function ($){
if(typeof window.premo_shop_filter!=='undefined'){
return;
}
window.premo_shop_filter={
request_timer: null,
ajax_request: null,
_navigating: false,
init: function (){
var shop_filter=this;
$('.premo-sf-wrapper[data-premo-shop-filter="1"]').each(function (){
var $w=$(this);
if($w.attr('data-premo-initialized')==='1'){
return;
}
shop_filter.setup_wrapper($w);
});
},
setup_wrapper: function ($wrapper){
var state_json=$wrapper.find('.premo-sf-state').first().text();
var parsed_state={};
try {
parsed_state=JSON.parse(state_json||'{}');
} catch (error_object){
parsed_state={};}
var wrapper_state={
category_slug: parsed_state.category_slug||'',
category_term_name: parsed_state.category_term_name||'',
category_filter_key: parsed_state.category_filter_key||'',
posts_per_page: parseInt(parsed_state.posts_per_page||12, 10),
orderby: parsed_state.orderby||'date-desc',
price_default: parsed_state.price_default||{
min: parseInt(parsed_state.price_min||0, 10),
max: parseInt(parsed_state.price_max||0, 10)
},
price_min: parseInt(parsed_state.price_min||0, 10),
price_max: parseInt(parsed_state.price_max||0, 10),
price_touched: false,
current_page: 1
};
$wrapper.data('premo_state', wrapper_state);
this.bind_events($wrapper);
this.setup_external_chips($wrapper);
this.sync_archive_sort_forms();
this.update_price_ui($wrapper);
this.restore_from_url($wrapper);
$wrapper.attr('data-premo-initialized', '1');
},
bind_events: function ($wrapper){
var shop_filter=this;
$(document.body).on('click', '.gridlist-toggle a', function(e){
e.preventDefault();
var currentUrl=new URL(window.location.href);
if($(this).attr('id')==='list'){
currentUrl.searchParams.set('gridcookie', 'list');
}else if($(this).attr('id')==='grid'){
currentUrl.searchParams.set('gridcookie', 'grid');
}
window.location.href=currentUrl.toString();
});
$(document.body).on('change', 'form.woocommerce-ordering select.orderby, form.woocommerce-viewing select.count', function(e){
e.preventDefault();
e.stopPropagation();
e.stopImmediatePropagation();
var currentUrl=new URL(window.location.href);
var paramName=$(this).attr('name');
var paramValue=$(this).val();
if(paramValue){
currentUrl.searchParams.set(paramName, paramValue);
}
currentUrl.searchParams.delete('paged');
currentUrl.pathname=currentUrl.pathname.replace(/\/page\/\d+\/?$/i, '/');
shop_filter.set_loading($wrapper, true);
window.location.href=currentUrl.toString();
});
$wrapper.on('click', '[data-toggle-group]', function (){
var group_key=$(this).attr('data-toggle-group');
shop_filter.toggle_accordion($wrapper, group_key);
});
$wrapper.on('change', '.premo-sf-checkbox', function (){
});
$wrapper.on('input', '[data-filter-search]', function (){
var filter_key=$(this).attr('data-filter-search');
shop_filter.filter_list($wrapper, filter_key, $(this).val());
});
$wrapper.on('input change', '[data-price-range]', function (){
shop_filter.sync_price_from_range($wrapper, $(this).attr('data-price-range'));
});
$wrapper.on('change', '[data-price-input]', function (){
shop_filter.sync_price_from_input($wrapper, $(this).attr('data-price-input'));
});
$wrapper.on('click', '[data-apply-filters]', function (){
var wrapper_state=shop_filter.get_state($wrapper);
wrapper_state.current_page=1;
shop_filter.set_state($wrapper, wrapper_state);
shop_filter.render_chips($wrapper);
shop_filter.update_url($wrapper);
if(shop_filter.has_active_filters($wrapper)){
shop_filter.set_loading($wrapper, true);
shop_filter.apply_filters($wrapper);
}else{
shop_filter.set_loading($wrapper, true);
shop_filter.reload_original_page($wrapper);
}});
$wrapper.on('change', '[data-filter-sort]', function (){
var wrapper_state=shop_filter.get_state($wrapper);
wrapper_state.orderby=$(this).val()||'date-desc';
wrapper_state.current_page=1;
shop_filter.set_state($wrapper, wrapper_state);
shop_filter.set_loading($wrapper, true);
shop_filter.apply_filters($wrapper);
});
$wrapper.on('click', '[data-chip-remove]', function (){
var filter_key=$(this).attr('data-chip-remove');
var filter_value=$(this).attr('data-chip-value');
shop_filter.remove_chip($wrapper, filter_key, filter_value);
});
$wrapper.on('click', '[data-reset-filters]', function (){
shop_filter.reset_all($wrapper);
});
$wrapper.on('click', '.premo-sf-page-btn', function (){
var page_number=parseInt($(this).attr('data-page')||1, 10);
shop_filter.set_loading($wrapper, true);
shop_filter.handle_pagination($wrapper, page_number);
});
var pagination_capture_handler=function (e){
var $link=$(e.target).closest('.woocommerce-pagination a.page-numbers');
if(!$link.length){
return;
}
if(!shop_filter.has_active_filters($wrapper)){
return;
}
if($link.closest('.woocommerce-pagination').hasClass('load-more')){
return;
}
e.preventDefault();
e.stopPropagation();
e.stopImmediatePropagation();
var target_url=$link.attr('href');
if(target_url){
shop_filter._navigating=true;
shop_filter.set_loading($wrapper, true);
window.location.href=target_url;
}};
document.addEventListener('click', pagination_capture_handler, true);
$wrapper.data('premo_pagination_handler', pagination_capture_handler);
$wrapper.on('click', '[data-run-reindex]', function (){
shop_filter.run_reindex($wrapper, 1, $(this));
});
var wrapper_ns='.premo_sync_' + Date.now() + '_' + Math.floor(Math.random() * 1e6);
$wrapper.data('premo_body_ns', wrapper_ns);
$(document.body).on('porto_load_posts_end updated_wc_div' + wrapper_ns, function (){
if(!$.contains(document, $wrapper[0])){
$(document.body).off(wrapper_ns);
document.removeEventListener('click', $wrapper.data('premo_pagination_handler'), true);
return;
}
if(shop_filter._navigating){
return;
}
shop_filter.restore_from_url($wrapper);
shop_filter.setup_external_chips($wrapper);
shop_filter.render_chips($wrapper);
shop_filter.sync_archive_sort_forms();
});
},
get_state: function ($wrapper){
return $.extend(true, {}, $wrapper.data('premo_state')||{});
},
set_state: function ($wrapper, wrapper_state){
$wrapper.data('premo_state', wrapper_state);
},
has_active_filters: function ($wrapper){
var wrapper_state=this.get_state($wrapper);
var active_filters=this.collect_filters($wrapper);
var has_checkbox=false;
$.each(active_filters, function (filter_key, filter_values){
if(filter_values.length > 0){
has_checkbox=true;
return false;
}});
if(has_checkbox){
return true;
}
if(wrapper_state.price_touched){
var price_changed=parseInt(wrapper_state.price_min, 10) > parseInt(wrapper_state.price_default.min, 10) ||
parseInt(wrapper_state.price_max, 10) < parseInt(wrapper_state.price_default.max, 10);
if(price_changed){
return true;
}}
return false;
},
update_chips_and_url: function ($wrapper){
this.render_chips($wrapper);
this.update_url($wrapper);
},
setup_external_chips: function ($wrapper){
var $existing=$wrapper.data('$external_chip_bar');
if($existing&&$existing.length&&$.contains(document, $existing[0])){
return;
}
var labels=(window.premo_shop_filter_vars||{}).labels||{};
var $bar=$('<div class="premo-sf-chips-external" data-external-chip-bar hidden>' +
'<span class="premo-sf-external-title">' + (labels.active_filters_title||'Selected Filters') + '</span>' +
'<div class="premo-sf-chip-list" data-external-chip-list></div>' +
'<button type="button" class="premo-sf-clear-all" data-reset-filters="1">' + (labels.clear_all||'Clear All') + '</button>' +
'</div>');
var $slot=$('#premo-sf-chips-slot');
if($slot.length){
$slot.replaceWith($bar);
}else{
$('.premo-sf-chips-external[data-external-chip-bar]').remove();
var $archive=$('.main-content .archive-products, .col-lg-9 .archive-products, #main .archive-products, .archive-products').first();
if($archive.length){
$archive.before($bar);
}else{
return;
}}
$wrapper.data('$external_chip_bar', $bar);
$bar.on('click', '[data-chip-remove]', function (){
var filter_key=$(this).attr('data-chip-remove');
var filter_value=$(this).attr('data-chip-value');
window.premo_shop_filter.remove_chip($wrapper, filter_key, filter_value);
});
$bar.on('click', '[data-reset-filters]', function (){
window.premo_shop_filter.reset_all($wrapper);
});
},
sync_archive_sort_forms: function (){
var query_params=new URLSearchParams(window.location.search);
$('form.woocommerce-ordering, .woocommerce-ordering form').each(function (){
var $form=$(this);
$form.find('[data-premo-filter-hidden="1"]').remove();
query_params.forEach(function (param_value, param_key){
if(0!==param_key.indexOf('pf_')&&'min_price'!==param_key&&'max_price'!==param_key){
return;
}
$('<input type="hidden" data-premo-filter-hidden="1" />')
.attr('name', param_key)
.val(param_value)
.appendTo($form);
});
});
},
queue_filters: function ($wrapper, delay_ms, page_number){
var shop_filter=this;
var wrapper_state=shop_filter.get_state($wrapper);
wrapper_state.current_page=page_number||1;
shop_filter.set_state($wrapper, wrapper_state);
window.clearTimeout(shop_filter.request_timer);
shop_filter.request_timer=window.setTimeout(function (){
shop_filter.update_url($wrapper);
if(shop_filter.has_active_filters($wrapper)){
shop_filter.apply_filters($wrapper);
}else{
shop_filter.reload_original_page($wrapper);
}}, delay_ms||300);
},
get_external_products_container: function (){
var selectors=[
'.archive-products',
'ul.products',
'.woocommerce .products'
];
var $container=$();
for (var i=0; i < selectors.length; i++){
$container=$(selectors[i]).first();
if($container.length){
break;
}}
return $container;
},
get_external_pagination_container: function (){
var $container=$('.premo-sf-external-pagination').first();
if(!$container.length){
$container=$('.woocommerce-pagination').first();
}
if(!$container.length){
var $products_container=this.get_external_products_container();
if($products_container.length){
$container=$('<div class="premo-sf-external-pagination"></div>');
$products_container.after($container);
}}
return $container;
},
toggle_accordion: function ($wrapper, group_key){
var $group=$wrapper.find('[data-filter-group="' + group_key + '"]').first();
if($group.length){
$group.toggleClass('is-open');
}},
collect_filters: function ($wrapper){
var collected_filters={
hersteller: [],
massstab: [],
fahrzeugmarke: [],
highlights_offers: [],
zustand: [],
material: []
};
$wrapper.find('.premo-sf-checkbox:checked').each(function (){
var filter_key=$(this).attr('data-filter-key');
var filter_value=$(this).val();
if(typeof collected_filters[filter_key]==='undefined'){
collected_filters[filter_key]=[];
}
collected_filters[filter_key].push(filter_value);
});
return collected_filters;
},
sync_price_from_range: function ($wrapper, changed_key){
var wrapper_state=this.get_state($wrapper);
var $preis_group=$wrapper.find('[data-filter-group="preis"]');
var $min_range=$preis_group.find('[data-price-range="min"]').first();
var $max_range=$preis_group.find('[data-price-range="max"]').first();
var min_default=parseInt(wrapper_state.price_default.min, 10);
var max_default=parseInt(wrapper_state.price_default.max, 10);
var min_value=parseInt($min_range.val()||min_default, 10);
var max_value=parseInt($max_range.val()||max_default, 10);
if(max_default > min_default){
if('min'===changed_key&&min_value >=max_value){
min_value=max_value - 1;
$min_range.val(min_value);
}
if('max'===changed_key&&max_value <=min_value){
max_value=min_value + 1;
$max_range.val(max_value);
}}else{
min_value=min_default;
max_value=max_default;
$min_range.val(min_value);
$max_range.val(max_value);
}
wrapper_state.price_min=min_value;
wrapper_state.price_max=max_value;
wrapper_state.price_touched=true;
wrapper_state.current_page=1;
this.set_state($wrapper, wrapper_state);
this.update_price_ui($wrapper);
},
sync_price_from_input: function ($wrapper, changed_key){
var wrapper_state=this.get_state($wrapper);
var $preis_group=$wrapper.find('[data-filter-group="preis"]');
var $min_input=$preis_group.find('[data-price-input="min"]').first();
var $max_input=$preis_group.find('[data-price-input="max"]').first();
var min_value=parseInt($min_input.val()||wrapper_state.price_default.min, 10);
var max_value=parseInt($max_input.val()||wrapper_state.price_default.max, 10);
min_value=Math.max(wrapper_state.price_default.min, min_value);
max_value=Math.min(wrapper_state.price_default.max, max_value);
if(parseInt(wrapper_state.price_default.max, 10) > parseInt(wrapper_state.price_default.min, 10)){
if('min'===changed_key&&min_value >=max_value){
min_value=max_value - 1;
}
if('max'===changed_key&&max_value <=min_value){
max_value=min_value + 1;
}}else{
min_value=parseInt(wrapper_state.price_default.min, 10);
max_value=parseInt(wrapper_state.price_default.max, 10);
}
wrapper_state.price_min=min_value;
wrapper_state.price_max=max_value;
wrapper_state.price_touched=true;
wrapper_state.current_page=1;
this.set_state($wrapper, wrapper_state);
this.update_price_ui($wrapper);
},
update_price_ui: function ($wrapper){
var wrapper_state=this.get_state($wrapper);
var $preis_group=$wrapper.find('[data-filter-group="preis"]');
var min_default=parseInt(wrapper_state.price_default.min||0, 10);
var max_default=parseInt(wrapper_state.price_default.max||0, 10);
var min_value=parseInt(wrapper_state.price_min||min_default, 10);
var max_value=parseInt(wrapper_state.price_max||max_default, 10);
var min_percent;
var max_percent;
if(max_default > min_default){
var range_value=max_default - min_default;
min_percent=((min_value - min_default) / range_value) * 100;
max_percent=((max_value - min_default) / range_value) * 100;
}else{
min_percent=0;
max_percent=100;
}
$preis_group.find('[data-price-range="min"]').val(min_value);
$preis_group.find('[data-price-range="max"]').val(max_value);
$preis_group.find('[data-price-input="min"]').val(min_value);
$preis_group.find('[data-price-input="max"]').val(max_value);
$preis_group.find('.premo-sf-price-range').first().css({
left: min_percent + '%',
right: (100 - max_percent) + '%'
});
},
render_chips: function ($wrapper){
var wrapper_state=this.get_state($wrapper);
var active_filters=this.collect_filters($wrapper);
var category_filter_key=wrapper_state.category_filter_key||'';
var category_term_name=wrapper_state.category_term_name||'';
var $chip_bar=$wrapper.find('[data-chip-bar]').first();
var $chip_list=$wrapper.find('[data-chip-list]').first();
var chip_markup='';
var has_filters=false;
$.each(active_filters, function (filter_key, filter_values){
$.each(filter_values, function (index_number, filter_value){
if(category_filter_key&&filter_key===category_filter_key&&filter_value===category_term_name){
return;
}
has_filters=true;
var $cb=$wrapper.find('.premo-sf-checkbox[data-filter-key="' + filter_key + '"]').filter(function (){
return $(this).val()===filter_value;
}).first();
var display_label=$cb.length
? ($.trim($cb.closest('[data-filter-option-row]').find('.premo-sf-option-label').text())||filter_value)
: filter_value;
chip_markup +='<span class="premo-sf-chip">' +
$('<div>').text(display_label).html() +
'<button type="button" class="premo-sf-chip-remove" data-chip-remove="' + filter_key + '" data-chip-value="' + $('<div>').text(filter_value).html() + '">&times;</button>' +
'</span>';
});
});
if(wrapper_state.price_touched&&(parseInt(wrapper_state.price_min, 10) > parseInt(wrapper_state.price_default.min, 10)||parseInt(wrapper_state.price_max, 10) < parseInt(wrapper_state.price_default.max, 10))){
has_filters=true;
chip_markup +='<span class="premo-sf-chip">' +
'&euro;' + wrapper_state.price_min + ' - &euro;' + wrapper_state.price_max +
'<button type="button" class="premo-sf-chip-remove" data-chip-remove="preis" data-chip-value="preis">&times;</button>' +
'</span>';
}
$chip_list.html(chip_markup);
$chip_bar.prop('hidden', !has_filters);
var $external_bar=$wrapper.data('$external_chip_bar');
if($external_bar&&$external_bar.length){
$external_bar.find('[data-external-chip-list]').html(chip_markup);
$external_bar.prop('hidden', !has_filters);
}},
set_checkbox_value: function ($wrapper, filter_key, filter_value, checked_state){
$wrapper.find('.premo-sf-checkbox[data-filter-key="' + filter_key + '"]').each(function (){
if($(this).val()===filter_value){
$(this).prop('checked', checked_state);
}});
},
set_filter_option_value: function ($wrapper, filter_key, filter_value, checked_state){
this.set_checkbox_value($wrapper, filter_key, filter_value, checked_state);
},
remove_chip: function ($wrapper, filter_key, filter_value){
var wrapper_state=this.get_state($wrapper);
if('preis'===filter_key){
wrapper_state.price_min=parseInt(wrapper_state.price_default.min, 10);
wrapper_state.price_max=parseInt(wrapper_state.price_default.max, 10);
wrapper_state.price_touched=false;
wrapper_state.current_page=1;
this.set_state($wrapper, wrapper_state);
this.update_price_ui($wrapper);
}else{
this.set_filter_option_value($wrapper, filter_key, filter_value, false);
wrapper_state.current_page=1;
this.set_state($wrapper, wrapper_state);
}
this.render_chips($wrapper);
this.update_url($wrapper);
if(this.has_active_filters($wrapper)){
this.apply_filters($wrapper);
}else{
this.reload_original_page($wrapper);
}},
reset_all: function ($wrapper){
var wrapper_state=this.get_state($wrapper);
$wrapper.find('.premo-sf-checkbox').prop('checked', false);
$wrapper.find('[data-filter-search]').val('');
$wrapper.find('[data-filter-option-row]').show();
wrapper_state.price_min=parseInt(wrapper_state.price_default.min, 10);
wrapper_state.price_max=parseInt(wrapper_state.price_default.max, 10);
wrapper_state.price_touched=false;
wrapper_state.current_page=1;
wrapper_state.orderby='date-desc';
this.set_state($wrapper, wrapper_state);
$wrapper.find('[data-filter-sort]').val('date-desc');
this.update_price_ui($wrapper);
this.render_chips($wrapper);
this.update_url($wrapper);
this.reload_original_page($wrapper);
},
reload_original_page: function ($wrapper){
var params=new URLSearchParams(window.location.search);
var preserved=new URLSearchParams();
params.forEach(function(val, key){
if(key.indexOf('pf_')!==0&&key!=='min_price'&&key!=='max_price'){
preserved.set(key, val);
}});
var clean_pathname=window.location.pathname.replace(/\/page\/\d+\/?$/i, '/');
var clean_url=clean_pathname + (preserved.toString() ? '?' + preserved.toString():'');
window.history.replaceState({}, '', clean_url);
this._navigating=true;
window.location.href=clean_url;
},
filter_list: function ($wrapper, filter_key, search_value){
var normalized_value=$.trim(String(search_value||'')).toLowerCase();
$wrapper.find('[data-filter-option-row="' + filter_key + '"]').each(function (){
var option_text=$.trim($(this).find('.premo-sf-option-label').text()).toLowerCase();
$(this).toggle(''===normalized_value||option_text.indexOf(normalized_value)!==-1);
});
},
handle_pagination: function ($wrapper, page_number){
var wrapper_state=this.get_state($wrapper);
wrapper_state.current_page=Math.max(1, parseInt(page_number||1, 10));
this.set_state($wrapper, wrapper_state);
this.apply_filters($wrapper);
},
set_loading: function ($wrapper, is_loading){
$wrapper.find('[data-loading-overlay]').prop('hidden', !is_loading);
var $products_container=this.get_external_products_container();
$products_container.toggleClass('premo-sf-is-loading', is_loading);
if(is_loading){
$products_container.addClass('porto-ajax-loading');
if(!$products_container.children('.porto-loading-icon').length){
$products_container.append('<i class="porto-loading-icon"></i>');
}}else{
$products_container.removeClass('porto-ajax-loading');
$products_container.find('.porto-loading-icon').remove();
}},
apply_filters: function ($wrapper){
var next_url=this.get_next_url($wrapper);
this._navigating=true;
window.location.href=next_url;
},
get_next_url: function ($wrapper){
var wrapper_state=this.get_state($wrapper);
var active_filters=this.collect_filters($wrapper);
var query_params=new URLSearchParams(window.location.search);
$.each(active_filters, function (filter_key, filter_values){
var query_key='pf_' + filter_key;
if(filter_values.length){
query_params.set(query_key, filter_values.join(','));
}else{
query_params.delete(query_key);
}});
if(wrapper_state.price_touched&&parseInt(wrapper_state.price_min, 10) > parseInt(wrapper_state.price_default.min, 10)){
query_params.set('min_price', wrapper_state.price_min);
}else{
query_params.delete('min_price');
}
if(wrapper_state.price_touched&&parseInt(wrapper_state.price_max, 10) < parseInt(wrapper_state.price_default.max, 10)){
query_params.set('max_price', wrapper_state.price_max);
}else{
query_params.delete('max_price');
}
query_params.delete('pf_sort');
query_params.delete('paged');
var clean_pathname=window.location.pathname.replace(/\/page\/\d+\/?$/i, '/');
return clean_pathname + (query_params.toString() ? '?' + query_params.toString():'');
},
update_url: function ($wrapper){
var next_url=this.get_next_url($wrapper);
window.history.replaceState({}, '', next_url);
this.sync_archive_sort_forms();
},
restore_from_url: function ($wrapper){
var wrapper_state=this.get_state($wrapper);
var query_params=new URLSearchParams(window.location.search);
var filter_keys=['hersteller', 'massstab', 'fahrzeugmarke', 'highlights_offers', 'zustand', 'material'];
$.each(filter_keys, function (index_number, filter_key){
var query_key='pf_' + filter_key;
var query_value=query_params.get(query_key);
if(!query_value){
return;
}
$.each(query_value.split(','), function (value_index, raw_value){
var filter_value=$.trim(raw_value);
if(filter_value){
window.premo_shop_filter.set_filter_option_value($wrapper, filter_key, filter_value, true);
}});
});
if(query_params.get('min_price')){
wrapper_state.price_min=parseInt(query_params.get('min_price'), 10);
wrapper_state.price_touched=true;
}
if(query_params.get('max_price')){
wrapper_state.price_max=parseInt(query_params.get('max_price'), 10);
wrapper_state.price_touched=true;
}
this.set_state($wrapper, wrapper_state);
this.update_price_ui($wrapper);
this.render_chips($wrapper);
this.sync_archive_sort_forms();
this.apply_category_preselect($wrapper);
},
apply_category_preselect: function ($wrapper){
var wrapper_state=this.get_state($wrapper);
var category_term_name=wrapper_state.category_term_name||'';
var category_filter_key=wrapper_state.category_filter_key||'';
if(!category_term_name||!category_filter_key){
return;
}
var $group_options=$wrapper.find('[data-filter-options="' + category_filter_key + '"] [data-filter-option-row]'
);
$group_options.each(function (){
var $row=$(this);
var $checkbox=$row.find('.premo-sf-checkbox');
var option_value=$checkbox.val()||'';
if(option_value===category_term_name){
$checkbox.prop('checked', true).prop('disabled', true).attr('data-locked', '1');
$row.removeClass('is-out-of-scope').addClass('is-locked');
}else{
$row.removeClass('is-locked');
$row.addClass('is-out-of-scope');
}});
if(category_filter_key==='fahrzeugmarke'){
var $scroll_container=$wrapper.find('[data-filter-options="fahrzeugmarke"]');
var $locked_row=$scroll_container.find('.is-locked').first();
if($scroll_container.length&&$locked_row.length){
var container_height=$scroll_container.outerHeight();
var row_height=$locked_row.outerHeight();
var locked_pos=$locked_row.offset().top - $scroll_container.offset().top + $scroll_container.scrollTop();
$scroll_container.scrollTop(locked_pos - (container_height / 2) + (row_height / 2));
}}
},
run_reindex: function ($wrapper, page_number, $button){
var shop_filter=this;
var button_text=window.premo_shop_filter_vars&&window.premo_shop_filter_vars.labels ? window.premo_shop_filter_vars.labels.reindex_loading:'Loading...';
$button.prop('disabled', true).text(button_text);
$.post((window.premo_shop_filter_vars ? window.premo_shop_filter_vars.ajax_url:''), {
action: 'premo_reindex_filters',
nonce: window.premo_shop_filter_vars ? window.premo_shop_filter_vars.nonce:'',
page: page_number,
batch_size: 50
}).done(function (response_object){
if(!response_object||!response_object.success||!response_object.data){
$button.prop('disabled', false);
return;
}
if(response_object.data.completed){
window.location.reload();
return;
}
shop_filter.run_reindex($wrapper, parseInt(response_object.data.page||1, 10) + 1, $button);
}).fail(function (){
$button.prop('disabled', false);
});
}};
window.premo_shop_filter.init();
jQuery(document).on('elementor/frontend/init elementor-pro/ajax/render_widget/after elementor-pro/query-control/query/after',
function (){
if(typeof window.premo_shop_filter!=='undefined'){
window.premo_shop_filter.init();
}}
);
jQuery(document.body).on('porto_load_posts_end', function (){
if(typeof window.premo_shop_filter!=='undefined'){
window.premo_shop_filter.init();
}});
jQuery(window).on('porto_posts_updated', function (){
if(typeof window.premo_shop_filter!=='undefined'){
window.premo_shop_filter.init();
}});
});
(function ($){
'use strict';
if(typeof wp==='undefined'||!wp.customize||!wp.customize.Control){
return;
}
wp.customize.controlConstructor.premo_shop_filter_sidebar=wp.customize.Control.extend({
ready: function (){
var control=this;
var $container=control.container.find('.premo-sf-customizer-control');
if(!$container.length){
return;
}
var $hidden=$container.find('.premo-sf-customizer-json-input');
var $list=$container.find('.premo-sf-customizer-sortable');
var $master=$container.find('.premo-sf-customizer-select-all');
var $master_label=$container.find('.premo-sf-customizer-master-label');
var $warning=$container.find('.premo-sf-customizer-warning');
var l10n=window.premo_filter_customizer_l10n||{};
function collect_items(){
var items=[];
$list.find('.premo-sf-customizer-item').each(function (){
var $li=$(this);
var id=$li.attr('data-filter-id');
var visible=$li.find('.premo-sf-customizer-visibility').prop('checked');
var label=$.trim($li.find('.premo-sf-customizer-label-text').text());
items.push({ id: id, label: label, visible: visible });
});
return items;
}
function update_master_label(total, checked){
var text;
if(total > 0&&checked===total){
text=l10n.deselect_all||'Deselect all';
}else{
text=l10n.select_all||'Select all';
}
$master_label.text(text);
}
function sync(){
var items=collect_items();
var json=JSON.stringify(items);
$hidden.val(json);
if(control.setting.get()!==json){
control.setting.set(json);
}
$hidden.trigger('change');
var any_visible=items.some(function (item){
return item.visible;
});
$warning.prop('hidden', any_visible);
$list.find('.premo-sf-customizer-item').each(function (){
var $li=$(this);
var on=$li.find('.premo-sf-customizer-visibility').prop('checked');
$li.toggleClass('is-filter-hidden', !on);
});
var total=items.length;
var checked=items.filter(function (item){
return item.visible;
}).length;
$master.prop('checked', total > 0&&checked===total);
$master.prop('indeterminate', checked > 0&&checked < total);
update_master_label(total, checked);
}
if($.fn.sortable){
$list.sortable({
handle: '.premo-sf-customizer-handle',
axis: 'y',
update: function (){
sync();
}});
}
$container.on('change', '.premo-sf-customizer-visibility', function (){
sync();
});
$master.on('change', function (){
var checked=$(this).prop('checked');
$list.find('.premo-sf-customizer-visibility').prop('checked', checked);
sync();
});
sync();
}});
wp.customize.controlConstructor.premo_zustand_order=wp.customize.Control.extend({
ready: function (){
var control=this;
function bind_zustand_priority_control(){
var $container=control.container.find('.premo-sf-zustand-order-control');
if(!$container.length){
return;
}
var $hidden=$container.find('.premo-sf-zustand-json-input');
var $list=$container.find('.premo-sf-zustand-sortable');
if(!$list.length){
return;
}
function update_priority_option_disables(){
var $selects=$list.find('.premo-sf-zustand-priority');
$selects.each(function (){
var $own=$(this);
$own.find('option').each(function (){
var $opt=$(this);
var val=$opt.attr('value');
if(val===''||val===undefined){
return;
}
var is_selected_here=$own.val()===val;
var taken_elsewhere=false;
$selects.each(function (){
if(this===$own[0]){
return;
}
if($(this).val()===val){
taken_elsewhere=true;
}});
$opt.prop('disabled', taken_elsewhere&&!is_selected_here);
});
});
}
function apply_saved_order_to_selects(){
var order=[];
try {
order=JSON.parse($hidden.val()||'[]');
} catch (err){
order=[];
}
if(!Array.isArray(order)){
order=[];
}
var position_map={};
var i;
for (i=0; i < order.length; i++){
position_map[order[i]]=i + 1;
}
$list.find('.premo-sf-zustand-item').each(function (){
var $row=$(this);
var label=$.trim($row.find('.premo-sf-zustand-label').text());
var pri=position_map[label];
$row.find('.premo-sf-zustand-priority').val(pri ? String(pri):'');
});
update_priority_option_disables();
}
function collect_sorted_labels(){
var rows=[];
$list.find('.premo-sf-zustand-item').each(function (){
var $row=$(this);
var label=$.trim($row.find('.premo-sf-zustand-label').text());
var pri_raw=$row.find('.premo-sf-zustand-priority').val();
var num=pri_raw ? parseInt(pri_raw, 10):NaN;
rows.push({ label: label, num: num, idx: rows.length });
});
rows.sort(function (a, b){
var a_has = !isNaN(a.num);
var b_has = !isNaN(b.num);
if(a_has&&b_has&&a.num!==b.num){
return a.num - b.num;
}
if(a_has&&!b_has){
return -1;
}
if(!a_has&&b_has){
return 1;
}
return a.idx - b.idx;
});
return rows.map(function (r){
return r.label;
}).filter(function (l){
return l.length > 0;
});
}
function sync(){
var labels=collect_sorted_labels();
var json=JSON.stringify(labels);
var setting=control.setting||wp.customize(control.id);
if(!setting){
return;
}
$hidden.val(json);
setting.set(json);
$hidden.trigger('change');
}
$list.on('change', '.premo-sf-zustand-priority', function (){
var $changed=$(this);
var val=$changed.val();
if(val){
$list.find('.premo-sf-zustand-priority').not($changed).each(function (){
if($(this).val()===val){
$(this).val('');
}});
}
update_priority_option_disables();
sync();
});
apply_saved_order_to_selects();
}
if(control.container.find('.premo-sf-zustand-order-control').length){
bind_zustand_priority_control();
}else{
control.deferred.embedded.done(bind_zustand_priority_control);
}}
});
}(jQuery));