$.fn.serializeObject = function() { var o = {}; var a = this.serializeArray(); $.each(a, function() { if (o[this.name] !== undefined) { if (!o[this.name].push) { o[this.name] = [o[this.name]]; } o[this.name].push(this.value || ''); } else { o[this.name] = this.value || ''; } }); return o; }; var etk_search_token = ''; var etk_search_total_results = 0; var etk_ajax_loading = false; var etk_specs_loading = false; var etk_specs_loaded_token = ''; var etk_specs_locked = false; var etk_specs_base_token = ''; var etk_specs_retry_count = 0; var etk_initial_filter_specs = null; var etk_merged_filter_specs = null; var etk_filter_seen_products = {}; var etk_filter_seen_fallback_nodes = 0; var f_last_page_url_update = 0; var etk_results_cache_prefix = 'etk_search_results_cache_v17:'; var etk_results_cache_ttl = 30 * 60 * 1000; var etk_results_scroll_restore = null; var etk_results_cache_restored = false; var etk_prefetch_loading = false; var etk_prefetch_data = null; var etk_prefetch_key = ''; var etk_prefetch_req = null; var etk_prefetch_consume_requested = false; var etk_prefetch_last_attempt = 0; var etk_infinite_preload_distance = 3200; var etk_infinite_load_distance = 800; var etk_filter_option_limit = 5; var etk_filter_default_open_category_limit = 5; var etk_filter_option_expanded = {}; var etk_filter_cat_open_state = {}; var etk_filter_cat_user_state = {}; var etk_filter_top_open_state = {}; var etk_filter_top_user_state = {}; function f_parse_etk_search_meta(data) { var m; if (!data) return; m = data.match(//); if (m && m[1]) { etk_search_token = m[1]; window.etk_search_token = etk_search_token; } m = data.match(//); if (m && m[1]) { etk_search_total_results = parseInt(m[1], 10) || 0; window.etk_search_total_results = etk_search_total_results; } } function f_build_ajax_request_url(load_page, page_start_override) { var url = get_url; var page_start = pages_loaded; if (typeof page_start_override != 'undefined') { page_start = page_start_override; } if (url.indexOf('?') == -1) { url += '?'; } else { url += '&'; } url += 'filters=' + encodeURIComponent($('#id_field_filters').val() || '') + '&page_start=' + encodeURIComponent(page_start) + '&page_count=' + encodeURIComponent(load_page); if (etk_search_token != '') { url += '&search_token=' + encodeURIComponent(etk_search_token); } return url; } function f_get_checked_filters_string() { var filters_string = ''; var filters_cats = ''; var filters_subs = ''; var check_name; var matches; $('#id_products_filters_form input:checked').each(function() { check_name = $(this).attr('name') || ''; if (check_name.indexOf('products_top_categories_id') != -1) { matches = check_name.match(/products_top_categories_id\[(\d+)\]/); if (matches && matches[1]) { filters_cats += (filters_cats == '' ? '' : ',') + matches[1]; } } if (check_name.indexOf('products_filters_id') != -1) { matches = check_name.match(/products_filters_id\[(\d+)\]\[(\d+)\]/); if (matches && matches[2]) { filters_subs += (filters_subs == '' ? '' : ',') + matches[2]; } } }); if ($('#id_products_filters_form input[name^=products_top_categories_id]').length == $('#id_products_filters_form input:checked[name^=products_top_categories_id]').length) { if ((filter_type == 0) && (filters_subs.length == 0)) { filters_cats = ''; } if ((filter_type == 1) && (filters_subs == '')) { filters_cats = ''; } } if ((filters_cats != '') || (filters_subs != '')) { filters_string = filters_cats + '-' + filters_subs; } return filters_string; } function f_set_page_url(action) { var setpage = 1; var scroll_top; var base_url; if (is_spider) return; if (!window.history || !window.history.replaceState) return; if (action == 'scroll') { var now = (new Date()).getTime(); if ((now - f_last_page_url_update) < 250) return; f_last_page_url_update = now; } scroll_top = $(window).scrollTop(); $('.ajax-page-header').each(function() { if ($(this).offset().top - scroll_top > 0) return false; setpage = $(this).attr('id').replace('id_page_', ''); }); base_url = browser_url; if ($('#id_field_filters').val() != '') { base_url += (base_url.indexOf('?') == -1 ? '?' : '&') + 'filters=' + encodeURIComponent($('#id_field_filters').val()); } window.history.replaceState({scrollpos: scroll_top, ajax_page: setpage, pages_loaded: pages_loaded}, $(document).find('title').text(), base_url); } function f_collect_shipping_filters() { var obj = {}; $('input[id^="id_shipping_filters_"]').each(function(){ obj = $.extend({}, obj, $(this).serializeObject()); }); return obj; } function f_show_loading_more() { if (!$('#etk_loading_more').length) { $('#id_ajax_filters').after(''); } $('#etk_loading_more').show(); } function f_hide_loading_more() { $('#etk_loading_more').hide(); } function f_build_results_request_data() { return $.extend({}, $('#id_filters_products_form').serializeObject(), $('#id_products_filters_form').serializeObject(), f_collect_shipping_filters(), possible_products); } function f_results_request_signature() { var sig = ''; try { sig += $('#id_filters_products_form').serialize(); } catch (e1) {} sig += '|'; try { sig += $('#id_products_filters_form').serialize(); } catch (e2) {} sig += '|'; try { sig += $('input[id^="id_shipping_filters_"]').serialize(); } catch (e3) {} sig += '|f=' + ($('#id_field_filters').val() || ''); sig += '|m=' + ($('#id_max_search_weight').val() || '0'); sig += '|t=' + (etk_search_token || window.etk_search_token || ''); return sig; } function f_results_prefetch_key(page_start, load_page) { return String(page_start) + '|' + String(load_page) + '|' + f_results_request_signature(); } function f_clear_results_prefetch(abort_request) { if (abort_request) { try { if (etk_prefetch_req) etk_prefetch_req.abort(); } catch (e) {} } etk_prefetch_loading = false; etk_prefetch_data = null; etk_prefetch_key = ''; etk_prefetch_req = null; etk_prefetch_consume_requested = false; } function f_results_show_more_distance() { var show_more = $('#id_ajax_filters_show_more'); if (!show_more.length || show_more.css('display') == 'none') return 999999; return show_more.offset().top - $(window).scrollTop() - $(window).height(); } function f_handle_loaded_results_data(data, load_page) { f_parse_etk_search_meta(data); if (data.indexOf('/); if (max_search_weight && max_search_weight[1]) $('#id_max_search_weight').val(max_search_weight[1]); } if (((data.indexOf('') > -1) || (data.indexOf('') > -1)) && (pages_loaded > 0)) { pages_loaded += load_page; $('#id_ajax_filters').append(data); } else { pages_loaded += load_page; $('#id_ajax_filters').stop(true, true).html(data).show(); } if ((data.indexOf('') == -1) && (data.indexOf('') == -1) && (data.indexOf('') == -1)) { $('#id_ajax_filters_show_more').css('opacity','').show(); } else { $('#id_ajax_filters_show_more').hide(); } f_load_filter_specs(false); f_set_page_url('load'); window.setTimeout(function(){ try { f_save_results_cache('load'); } catch (e3) {} }, 250); window.setTimeout(function(){ try { f_init_safe_filter_float(); } catch (e) {} try { f_maybe_start_results_prefetch(); } catch (e2) {} }, 120); } function f_use_results_prefetch() { var key = f_results_prefetch_key(pages_loaded, 1); var data; if (!etk_prefetch_data || etk_prefetch_key != key) return false; data = etk_prefetch_data; f_clear_results_prefetch(false); f_hide_loading_more(); f_handle_loaded_results_data(data, 1); return true; } function f_start_results_prefetch() { var key; var data_obj; var now; if (is_spider) return; if (!$('#id_ajax_filters_show_more').length) return; if ($('#id_ajax_filters_show_more').css('display') == 'none') return; if (pages_loaded < 1) return; if (etk_ajax_loading) return; key = f_results_prefetch_key(pages_loaded, 1); if (etk_prefetch_data && etk_prefetch_key == key) return; if (etk_prefetch_loading && etk_prefetch_key == key) return; now = (new Date()).getTime(); if ((now - etk_prefetch_last_attempt) < 500) return; etk_prefetch_last_attempt = now; if (etk_prefetch_loading) { f_clear_results_prefetch(true); } data_obj = f_build_results_request_data(); etk_prefetch_loading = true; etk_prefetch_data = null; etk_prefetch_key = key; etk_prefetch_req = $.ajax({ type: 'POST', url: f_build_ajax_request_url(1, pages_loaded), data: data_obj }).done(function(data) { if (etk_prefetch_key == key) { etk_prefetch_data = data; } }).fail(function() { if (etk_prefetch_key == key) { etk_prefetch_data = null; } }).always(function() { var should_consume = etk_prefetch_consume_requested; etk_prefetch_loading = false; etk_prefetch_req = null; if (should_consume) { etk_prefetch_consume_requested = false; if (!f_use_results_prefetch()) { f_clear_results_prefetch(false); f_filter_form_submit(false); } } }); } function f_maybe_start_results_prefetch() { var distance; if (etk_ajax_loading) return; distance = f_results_show_more_distance(); if (distance < etk_infinite_preload_distance) { f_start_results_prefetch(); } } function f_get_filter_scroll_box() { var box = $('#epi_search_deferred_filters').closest('table.infoBox'); if (box.length) return box; box = $('#c-modal__filter .c-sidebox').first(); return box; } function f_supports_results_cache() { try { if (!window.sessionStorage || !window.JSON) return false; sessionStorage.setItem('etk_cache_test', '1'); sessionStorage.removeItem('etk_cache_test'); return true; } catch (e) { return false; } } function f_results_cache_base_url() { var url = ''; if (window.location && window.location.href) { url = window.location.href; } else if (typeof browser_url != 'undefined') { url = browser_url; } if (url.indexOf('#') > -1) { url = url.split('#')[0]; } return url; } function f_results_cache_key() { return etk_results_cache_prefix + f_results_cache_base_url(); } function f_results_prune_cache() { var keys = []; var i; var k; var raw; var obj; if (!f_supports_results_cache()) return; try { for (i = 0; i < sessionStorage.length; i++) { k = sessionStorage.key(i); if (k && k.indexOf(etk_results_cache_prefix) == 0) { raw = sessionStorage.getItem(k); obj = null; try { obj = JSON.parse(raw); } catch (e1) { obj = null; } if (!obj || !obj.saved_at || (((new Date()).getTime() - parseInt(obj.saved_at, 10)) > etk_results_cache_ttl)) { sessionStorage.removeItem(k); i--; } else { keys.push({key:k, saved_at:parseInt(obj.saved_at, 10)}); } } } keys.sort(function(a,b){ return a.saved_at - b.saved_at; }); while (keys.length > 4) { sessionStorage.removeItem(keys[0].key); keys.shift(); } } catch (e2) {} } function f_save_results_cache(reason) { var list; var html; var cache; var key; var scroller; if (!f_supports_results_cache()) return; if (!$('#id_ajax_filters').length) return; if (typeof pages_loaded == 'undefined') return; if (pages_loaded < 1) return; list = $('#id_ajax_filters'); html = list.html() || ''; if (html == '' || html.indexOf('Please wait') > -1 || html.indexOf('Searching') > -1) return; scroller = f_get_filter_scroll_box(); cache = { saved_at: (new Date()).getTime(), reason: reason || '', html: html, pages_loaded: pages_loaded, search_token: etk_search_token || window.etk_search_token || '', total_results: etk_search_total_results || window.etk_search_total_results || 0, field_filters: $('#id_field_filters').val() || '', max_search_weight: $('#id_max_search_weight').val() || '0', show_more_visible: ($('#id_ajax_filters_show_more').length && $('#id_ajax_filters_show_more').css('display') != 'none') ? 1 : 0, scroll_top: $(window).scrollTop(), filter_scroll_top: scroller.length ? scroller.scrollTop() : 0, title: $(document).find('title').text() }; key = f_results_cache_key(); try { sessionStorage.setItem(key, JSON.stringify(cache)); f_results_prune_cache(); } catch (e) { f_results_prune_cache(); try { sessionStorage.setItem(key, JSON.stringify(cache)); } catch (e2) {} } } function f_restore_results_cache() { var key; var raw; var cache; var now; if (!f_supports_results_cache()) return false; if (!$('#id_ajax_filters').length) return false; key = f_results_cache_key(); raw = null; try { raw = sessionStorage.getItem(key); } catch (e) { raw = null; } if (!raw) return false; try { cache = JSON.parse(raw); } catch (e2) { cache = null; } if (!cache || !cache.html || !cache.saved_at) return false; now = (new Date()).getTime(); if ((now - parseInt(cache.saved_at, 10)) > etk_results_cache_ttl) { try { sessionStorage.removeItem(key); } catch (e3) {} return false; } $('#id_ajax_filters').stop(true, true).html(cache.html).show(); if ($('#id_field_filters').length) $('#id_field_filters').val(cache.field_filters || ''); if ($('#id_max_search_weight').length) $('#id_max_search_weight').val(cache.max_search_weight || '0'); if (cache.search_token) { etk_search_token = cache.search_token; window.etk_search_token = cache.search_token; } if (cache.total_results) { etk_search_total_results = parseInt(cache.total_results, 10) || 0; window.etk_search_total_results = etk_search_total_results; } pages_loaded = parseInt(cache.pages_loaded, 10) || 1; if (cache.show_more_visible) { $('#id_ajax_filters_show_more').css('opacity','').show(); } else { $('#id_ajax_filters_show_more').hide(); } f_parse_etk_search_meta(cache.html); f_load_filter_specs(false); f_style_filter_controls(); f_init_filter_groups(); etk_results_cache_restored = true; etk_results_scroll_restore = { scroll_top: parseInt(cache.scroll_top, 10) || 0, filter_scroll_top: parseInt(cache.filter_scroll_top, 10) || 0 }; setTimeout(function(){ var scroller; try { f_init_safe_filter_float(); } catch (e4) {} if (etk_results_scroll_restore) { $(window).scrollTop(etk_results_scroll_restore.scroll_top); scroller = f_get_filter_scroll_box(); if (scroller.length) scroller.scrollTop(etk_results_scroll_restore.filter_scroll_top); etk_results_scroll_restore = null; f_set_page_url('load'); } }, 120); return true; } function f_etk_html_escape(value) { if (value === null || value === undefined) return ''; return String(value).replace(/&/g, '&').replace(//g, '>').replace(/"/g, '"').replace(/'/g, '''); } function f_empty_filter_specs() { return {tops:{}, cats:{}, filters:{}, products:{}}; } function f_filter_specs_has_data(meta) { var top_id; if (!meta || !meta.tops) return false; for (top_id in meta.tops) { if (meta.tops.hasOwnProperty(top_id)) return true; } return false; } function f_find_filter_location(meta, filter_id) { var top_id; var cat_id; if (!meta || !meta.filters) return null; filter_id = String(filter_id); for (top_id in meta.filters) { if (meta.filters.hasOwnProperty(top_id)) { for (cat_id in meta.filters[top_id]) { if (meta.filters[top_id].hasOwnProperty(cat_id) && meta.filters[top_id][cat_id][filter_id]) { return {top_id: String(top_id), cat_id: String(cat_id)}; } } } } return null; } function f_merge_filter_specs_object(meta) { var changed = false; var top_id; var cat_id; var filter_id; var pid; var i; var loc; var filter; var seen_products_in_meta = false; if (!meta || !meta.tops || !meta.cats || !meta.filters) return false; if (!etk_merged_filter_specs) { etk_merged_filter_specs = f_empty_filter_specs(); } for (top_id in meta.tops) { if (meta.tops.hasOwnProperty(top_id)) { top_id = String(top_id); if (!etk_merged_filter_specs.tops[top_id]) { etk_merged_filter_specs.tops[top_id] = { id: meta.tops[top_id].id || top_id, name: meta.tops[top_id].name || 'Product Type', spec_count: 0 }; changed = true; } } } for (top_id in meta.cats) { if (meta.cats.hasOwnProperty(top_id)) { top_id = String(top_id); if (!etk_merged_filter_specs.cats[top_id]) etk_merged_filter_specs.cats[top_id] = {}; for (cat_id in meta.cats[top_id]) { if (meta.cats[top_id].hasOwnProperty(cat_id)) { cat_id = String(cat_id); if (!etk_merged_filter_specs.cats[top_id][cat_id]) { etk_merged_filter_specs.cats[top_id][cat_id] = { id: meta.cats[top_id][cat_id].id || cat_id, name: meta.cats[top_id][cat_id].name || 'Specification' }; changed = true; } } } } } for (top_id in meta.filters) { if (meta.filters.hasOwnProperty(top_id)) { top_id = String(top_id); if (!etk_merged_filter_specs.filters[top_id]) etk_merged_filter_specs.filters[top_id] = {}; if (!etk_merged_filter_specs.tops[top_id] && meta.tops[top_id]) { etk_merged_filter_specs.tops[top_id] = {id: top_id, name: meta.tops[top_id].name || 'Product Type', spec_count: 0}; } for (cat_id in meta.filters[top_id]) { if (meta.filters[top_id].hasOwnProperty(cat_id)) { cat_id = String(cat_id); if (!etk_merged_filter_specs.filters[top_id][cat_id]) etk_merged_filter_specs.filters[top_id][cat_id] = {}; for (filter_id in meta.filters[top_id][cat_id]) { if (meta.filters[top_id][cat_id].hasOwnProperty(filter_id)) { filter_id = String(filter_id); filter = meta.filters[top_id][cat_id][filter_id] || {}; if (!etk_merged_filter_specs.filters[top_id][cat_id][filter_id]) { etk_merged_filter_specs.filters[top_id][cat_id][filter_id] = { id: filter.id || filter_id, name: filter.name || '', count: 0 }; if (etk_merged_filter_specs.tops[top_id]) { etk_merged_filter_specs.tops[top_id].spec_count = (parseInt(etk_merged_filter_specs.tops[top_id].spec_count, 10) || 0) + 1; } changed = true; } } } } } } } if (meta.products) { for (pid in meta.products) { if (meta.products.hasOwnProperty(pid)) { seen_products_in_meta = true; pid = String(pid); if (etk_filter_seen_products[pid]) continue; etk_filter_seen_products[pid] = 1; if (!etk_merged_filter_specs.products) etk_merged_filter_specs.products = {}; etk_merged_filter_specs.products[pid] = meta.products[pid]; for (i = 0; i < meta.products[pid].length; i++) { filter_id = String(meta.products[pid][i]); loc = f_find_filter_location(meta, filter_id); if (loc && etk_merged_filter_specs.filters[loc.top_id] && etk_merged_filter_specs.filters[loc.top_id][loc.cat_id] && etk_merged_filter_specs.filters[loc.top_id][loc.cat_id][filter_id]) { etk_merged_filter_specs.filters[loc.top_id][loc.cat_id][filter_id].count = (parseInt(etk_merged_filter_specs.filters[loc.top_id][loc.cat_id][filter_id].count, 10) || 0) + 1; changed = true; } } } } } if (!seen_products_in_meta) { // Fallback for older metadata blocks that only contain aggregate counts. for (top_id in meta.filters) { if (meta.filters.hasOwnProperty(top_id)) { top_id = String(top_id); for (cat_id in meta.filters[top_id]) { if (meta.filters[top_id].hasOwnProperty(cat_id)) { cat_id = String(cat_id); for (filter_id in meta.filters[top_id][cat_id]) { if (meta.filters[top_id][cat_id].hasOwnProperty(filter_id)) { filter_id = String(filter_id); if (etk_merged_filter_specs.filters[top_id] && etk_merged_filter_specs.filters[top_id][cat_id] && etk_merged_filter_specs.filters[top_id][cat_id][filter_id]) { etk_merged_filter_specs.filters[top_id][cat_id][filter_id].count = (parseInt(etk_merged_filter_specs.filters[top_id][cat_id][filter_id].count, 10) || 0) + (parseInt(meta.filters[top_id][cat_id][filter_id].count, 10) || 0); changed = true; } } } } } } } } return changed; } function f_merge_filter_specs_from_dom() { var changed = false; var nodes = $('.etk_filter_specs_data, #etk_filter_specs_data'); nodes.each(function(){ var node = $(this); var txt; var obj = null; if (node.data('etkProcessed')) return; node.data('etkProcessed', true); txt = $.trim(node.text() || ''); if (txt == '') return; try { if ($.parseJSON) { obj = $.parseJSON(txt); } else if (window.JSON && window.JSON.parse) { obj = window.JSON.parse(txt); } } catch (e) { obj = null; } if (f_merge_filter_specs_object(obj)) { changed = true; } }); if (changed && etk_merged_filter_specs) { etk_initial_filter_specs = etk_merged_filter_specs; window.etk_initial_filter_specs = etk_merged_filter_specs; } return changed; } function f_collect_filter_check_state() { var state = {}; $('#id_products_filters_form input[name^="products_filters_id"],#id_products_filters_form input[name^="products_top_categories_id"],#id_products_filters_form input[name^="products_categories_id"]').each(function(){ var id = $(this).attr('id') || ''; if (id != '') state[id] = ($(this).prop('checked') ? 1 : 0); }); return state; } function f_restore_filter_check_state(state) { var id; if (!state) return; for (id in state) { if (state.hasOwnProperty(id)) { $('#' + id).prop('checked', state[id] ? true : false).attr('checked', state[id] ? 'checked' : false); } } } function f_get_initial_filter_specs_from_dom() { var holder; var txt; var obj; f_merge_filter_specs_from_dom(); if (etk_merged_filter_specs && f_filter_specs_has_data(etk_merged_filter_specs)) { return etk_merged_filter_specs; } if (etk_initial_filter_specs) return etk_initial_filter_specs; if (window.etk_initial_filter_specs) { etk_initial_filter_specs = window.etk_initial_filter_specs; f_merge_filter_specs_object(etk_initial_filter_specs); return etk_merged_filter_specs || etk_initial_filter_specs; } holder = $('#etk_filter_specs_data,.etk_filter_specs_data').first(); if (!holder.length) return null; txt = $.trim(holder.text() || ''); if (txt == '') return null; try { if ($.parseJSON) { obj = $.parseJSON(txt); } else if (window.JSON && window.JSON.parse) { obj = window.JSON.parse(txt); } } catch (e) { obj = null; } if (!obj || !obj.tops || !obj.cats || !obj.filters) return null; f_merge_filter_specs_object(obj); etk_initial_filter_specs = etk_merged_filter_specs || obj; window.etk_initial_filter_specs = etk_initial_filter_specs; return etk_initial_filter_specs; } function f_render_initial_filter_specs(meta) { var html = ''; var top_ids = []; var top_id; var cat_ids; var cat_id; var filter_ids; var filter_id; var top; var cat; var filter; var i; var j; var k; if (!meta || !meta.tops || !meta.cats || !meta.filters) return false; for (top_id in meta.tops) { if (meta.tops.hasOwnProperty(top_id)) top_ids.push(top_id); } if (top_ids.length < 1) return false; top_ids.sort(function(a, b){ var ta = meta.tops[a] || {}; var tb = meta.tops[b] || {}; var ca = parseInt(ta.spec_count, 10) || 0; var cb = parseInt(tb.spec_count, 10) || 0; if (cb != ca) return cb - ca; return (parseInt(a, 10) || 0) - (parseInt(b, 10) || 0); }); html += '
'; for (i = 0; i < top_ids.length; i++) { top_id = top_ids[i]; top = meta.tops[top_id] || {}; html += ''; html += '
'; cat_ids = []; if (meta.cats[top_id]) { for (cat_id in meta.cats[top_id]) { if (meta.cats[top_id].hasOwnProperty(cat_id)) cat_ids.push(cat_id); } } cat_ids.sort(function(a, b){ var ca = (meta.cats[top_id][a] || {}).name || ''; var cb = (meta.cats[top_id][b] || {}).name || ''; if (ca < cb) return -1; if (ca > cb) return 1; return 0; }); for (j = 0; j < cat_ids.length; j++) { cat_id = cat_ids[j]; cat = meta.cats[top_id][cat_id] || {}; html += ''; html += '
'; filter_ids = []; if (meta.filters[top_id] && meta.filters[top_id][cat_id]) { for (filter_id in meta.filters[top_id][cat_id]) { if (meta.filters[top_id][cat_id].hasOwnProperty(filter_id)) filter_ids.push(filter_id); } } filter_ids.sort(function(a, b){ var fa = meta.filters[top_id][cat_id][a] || {}; var fb = meta.filters[top_id][cat_id][b] || {}; var ca = parseInt(fa.count, 10) || 0; var cb = parseInt(fb.count, 10) || 0; if (cb != ca) return cb - ca; if ((fa.name || '') < (fb.name || '')) return -1; if ((fa.name || '') > (fb.name || '')) return 1; return 0; }); for (k = 0; k < filter_ids.length; k++) { filter_id = filter_ids[k]; filter = meta.filters[top_id][cat_id][filter_id] || {}; html += '
'; html += '
(' + f_etk_html_escape(filter.count || 0) + ')
'; html += '
'; } html += '
'; } html += '
'; } html += '
'; $('#epi_search_deferred_filters').html(html); return true; } function f_collect_visible_product_ids_for_specs() { var ids = []; var seen = {}; var href; var m; $('#id_ajax_filters a[href]').each(function(){ href = $(this).attr('href') || ''; m = href.match(/[?&]products_id=(\d+)/); if (m && m[1]) { if (!seen[m[1]]) { seen[m[1]] = 1; ids.push(m[1]); } } else { m = href.match(/-p-(\d+)\.html/i); if (m && m[1]) { if (!seen[m[1]]) { seen[m[1]] = 1; ids.push(m[1]); } } } }); return ids; } function f_load_filter_specs(force) { var token = etk_specs_base_token || etk_search_token || window.etk_search_token || ''; var data_obj; var visible_ids; if (!$('#epi_search_deferred_filters').length) return; /* Search filter specs are intentionally loaded once from the first full search result set. Do not recalculate this sidebar after users choose filters, or they lose the ability to undo a spec/category choice that disappears from a narrower filtered result set. */ if (etk_specs_locked) { var state_locked = f_collect_filter_check_state(); if (f_merge_filter_specs_from_dom()) { f_render_initial_filter_specs(etk_merged_filter_specs || etk_initial_filter_specs); f_restore_filter_check_state(state_locked); $('#epi_search_deferred_filters').data('etkGroupsInitialized', false); } f_style_filter_controls(); f_init_filter_groups(); return; } if (etk_specs_loading) return; if (token != '' && !force && etk_specs_loaded_token == token) return; if (f_render_initial_filter_specs(f_get_initial_filter_specs_from_dom())) { etk_specs_loaded_token = 'initial_dom'; etk_specs_locked = true; etk_specs_retry_count = 0; $('#epi_search_deferred_filters').data('etkGroupsInitialized', false); f_style_filter_controls(); f_init_filter_groups(); window.setTimeout(function(){ try { f_init_safe_filter_float(); } catch (e) {} }, 60); return; } if (token != '') { data_obj = {search_token: token}; etk_specs_base_token = token; } else { visible_ids = f_collect_visible_product_ids_for_specs(); if (visible_ids.length < 1) { etk_specs_retry_count++; if (etk_specs_retry_count < 40) { window.setTimeout(function(){ f_load_filter_specs(force); }, 250); } else { $('#epi_search_deferred_filters').html('
Filter specifications are unavailable for this result set.
'); } return; } data_obj = {product_ids: visible_ids.join(',')}; /* Fallback only. The preferred full-result path is the search token emitted by advanced_search_result_ajax_chunks.php. */ etk_specs_base_token = 'visible_' + visible_ids.join('_'); } etk_specs_loading = true; $('#epi_search_deferred_filters').html('
Loading filter specifications...
'); $.ajax({ type: 'POST', url: 'filter_specs_ajax.php', data: data_obj, timeout: 15000 }).done(function(html) { if ($.trim(html) != '') { $('#epi_search_deferred_filters').html(html); } else { $('#epi_search_deferred_filters').html('
Filter specifications are unavailable for this result set.
'); } $('#epi_search_deferred_filters').data('etkGroupsInitialized', false); etk_specs_loaded_token = etk_specs_base_token; etk_specs_locked = true; etk_specs_retry_count = 0; f_style_filter_controls(); f_init_filter_groups(); window.setTimeout(function(){ try { f_init_safe_filter_float(); } catch (e) {} }, 60); }).fail(function() { $('#epi_search_deferred_filters').html('
Filter specifications are temporarily unavailable.
'); }).always(function() { etk_specs_loading = false; }); } function f_init_mobile_filter_drawer() { var sidebar = $('#c-modal__filter'); var sidebox; var toggle; var overlay; var close_button; var min_desktop_width = 760; if (!sidebar.length) return; sidebox = sidebar.find('.c-sidebox').first(); if (!sidebox.length) sidebox = sidebar; sidebox.find('tr').each(function(){ var row = $(this); var row_text = $.trim(row.text()).replace(/\s+/g, ' '); if ((row_text == 'Refine Your Results' || row_text == 'Refine Results') && row.find('#id_products_filters_form,#epi_search_deferred_filters,input,select,textarea').length < 1) { row.addClass('etk-filter-original-title-row'); } }); if (!$('#etk_mobile_filter_style').length) { $('head').append(''); } if (!$('#etk_mobile_filter_overlay').length) { $('body').append('
'); } if (!$('#etk_mobile_filter_toggle').length) { $('body').append(''); } $('#etk_mobile_filter_title').remove(); sidebox.prepend('
Refine Results
'); if (!$('#etk_mobile_filter_close').length) { sidebox.prepend(''); } sidebar.addClass('etk-mobile-filter-ready'); toggle = $('#etk_mobile_filter_toggle'); overlay = $('#etk_mobile_filter_overlay'); close_button = $('#etk_mobile_filter_close'); function viewport_width() { if (window.innerWidth) return window.innerWidth; if (document.documentElement && document.documentElement.clientWidth) return document.documentElement.clientWidth; return 0; } function is_mobile() { return viewport_width() < min_desktop_width; } function selected_count() { var count = 0; $('#id_products_filters_form input[name^="products_filters_id"]:checked').each(function(){ count++; }); $('#id_products_filters_form input[name^="shipping_filters_id"]:checked').each(function(){ count++; }); return count; } function update_toggle() { var count = selected_count(); if (count > 0) { toggle.html('Filter Results (' + count + ')'); } else { toggle.html('Filter Results'); } if (is_mobile()) { toggle.show(); } else { toggle.hide(); close_drawer(); } } function open_drawer() { if (!is_mobile()) return; sidebar.addClass('etk-mobile-filter-open'); $('body').addClass('etk-mobile-filter-open'); toggle.attr('aria-expanded', 'true'); } function close_drawer() { sidebar.removeClass('etk-mobile-filter-open'); $('body').removeClass('etk-mobile-filter-open'); toggle.attr('aria-expanded', 'false'); } toggle.off('click.etkMobileFilter').on('click.etkMobileFilter', function(e){ e.preventDefault(); if (sidebar.hasClass('etk-mobile-filter-open')) { close_drawer(); } else { open_drawer(); } return false; }); overlay.off('click.etkMobileFilter').on('click.etkMobileFilter', function(){ close_drawer(); return false; }); close_button.off('click.etkMobileFilter').on('click.etkMobileFilter', function(e){ e.preventDefault(); close_drawer(); return false; }); $(document).off('keyup.etkMobileFilter').on('keyup.etkMobileFilter', function(e){ e = e || window.event; if ((e.keyCode || e.which) == 27) close_drawer(); }); $('#id_products_filters_form').off('change.etkMobileFilterBadge').on('change.etkMobileFilterBadge', 'input', function(){ window.setTimeout(update_toggle, 30); }); $(window).off('resize.etkMobileFilter').on('resize.etkMobileFilter', function(){ window.setTimeout(update_toggle, 80); window.setTimeout(function(){ try { f_sync_filter_widths(); } catch (e) {} }, 90); }); update_toggle(); } function f_sync_filter_widths() { var sidebar = $('#c-modal__filter'); var sidebox; var table; var is_mobile; var available; var edge_pad; var scrollbar_pad; var content_width; var bar_width; var option_width; var selectors; var body_selectors; var bar_selectors; var option_selectors; if (!sidebar.length) return; sidebox = sidebar.find('.c-sidebox').first(); if (!sidebox.length) sidebox = sidebar; table = sidebox.find('table.infoBox').first(); is_mobile = ($(window).width() < 760); if (!is_mobile) { available = 190; sidebox.css('width','190px').css('max-width','190px').css('box-sizing','border-box').css('padding-right','0'); if (table.length) { table.css('width','190px').css('max-width','190px').css('box-sizing','border-box').css('padding-right','0'); } } else { available = 0; if (table.length) available = table.innerWidth(); if (!available || available < 140) available = sidebox.innerWidth(); if (!available || available < 140) return; } edge_pad = is_mobile ? 0 : 4; scrollbar_pad = is_mobile ? 0 : 8; content_width = available - scrollbar_pad; if (content_width < 140) content_width = available; bar_width = content_width - (edge_pad * 2); option_width = content_width - (edge_pad * 2); if (bar_width < 120) bar_width = content_width; if (option_width < 120) option_width = content_width; selectors = '#id_products_filters_form,#filters_form,#epi_search_deferred_filters,.etk-filter-specs'; body_selectors = '.etk-filter-top-body,div[id^="id_sub_products_filters_top_categories_id_"],.etk-filter-cat-body,div[id^="id_sub_products_filters_categories_id_"]'; bar_selectors = '.epi-filter-top,label[for^="id_products_filters_top_categories_id_"],.epi-filter-cat,label[for^="id_products_filters_categories_id_"],label[for^="shipping_filters"]'; option_selectors = '.epi-filter-option,div[id^="id_div_products_filters_"],div[id^="id_div_shipping_filters_"],.etk-filter-show-more-row'; sidebar.find(selectors).css('display','block').css('width', available + 'px').css('max-width', available + 'px').css('box-sizing','border-box'); sidebar.find(body_selectors).css('width', available + 'px').css('max-width', available + 'px').css('box-sizing','border-box'); /* Category/product headers: extend the background bar, but stop before the scrollbar. */ sidebar.find(bar_selectors).css('display','block').css('width', bar_width + 'px').css('max-width', bar_width + 'px').css('box-sizing','border-box').css('margin-left', edge_pad + 'px').css('margin-right', edge_pad + 'px'); /* Option rows and count numbers: keep text/counts inside the readable area, away from the scrollbar. */ sidebar.find(option_selectors).css('display','block').css('width', option_width + 'px').css('max-width', option_width + 'px').css('box-sizing','border-box').css('margin-left', edge_pad + 'px').css('margin-right', edge_pad + 'px').css('padding-right','56px').css('position','relative'); sidebar.find(option_selectors).find('.c-filter__counter').css('right','16px').css('z-index','2'); if (!is_mobile) { sidebar.find('label[for^="shipping_filters"]').css('margin-top','3px').css('margin-bottom','2px'); sidebar.find('#shipping_filters_div').css('width', option_width + 'px').css('max-width', option_width + 'px').css('box-sizing','border-box').css('margin-left', edge_pad + 'px').css('margin-right', edge_pad + 'px').css('padding','4px 56px 8px 0').css('overflow','hidden'); /* Runtime desktop sizing must be !important because legacy osCommerce CSS and injected filter CSS can override normal inline values. */ $('#etk_filter_width_runtime').remove(); $('head').append(''); } } function f_normalize_shipping_filter_labels() { $('#shipping_filters_div label').each(function(){ $(this).contents().each(function(){ if (this.nodeType == 3 && this.nodeValue) { this.nodeValue = this.nodeValue.replace('2 Days', '3 Days').replace('2 days', '3 days'); } }); }); } function f_remove_legacy_shipping_filter_ui() { var shipping_label = $('label[for="shipping_filters"],label[for^="shipping_filters"]'); $('#shipping_filters_div').remove(); shipping_label.remove(); $('input[name="shipping_filters"],input[name^="shipping_filters_id"]').remove(); } function f_wrap_static_filter_specs() { var form; var holder; var first_filter; var nodes; if ($('#epi_search_deferred_filters').length) return; if ($('.etk-filter-static-specs').length) return; form = $('#id_products_filters_form'); if (!form.length) return; first_filter = form.children('label[for^="id_products_filters_top_categories_id_"],.epi-filter-top,label[for^="id_products_filters_categories_id_"],.epi-filter-cat,div[id^="id_sub_products_filters_top_categories_id_"],div[id^="id_sub_products_filters_categories_id_"],div[id^="id_div_products_filters_"],div[id^="id_sub_arr_products_filters_categories_id_"]').first(); if (!first_filter.length) return; holder = $('
'); holder.css({ 'padding':'6px 5px 10px 5px', 'font-size':'11px', 'line-height':'16px', 'color':'#555555' }); nodes = form.children().filter(function(){ var node = $(this); var tag = (this.tagName || '').toLowerCase(); var id = node.attr('id') || ''; var html_for = node.attr('for') || ''; if (tag == 'script') return false; if (tag == 'input' && (node.attr('type') || '').toLowerCase() == 'hidden') return false; if (id == 'etk_filter_specs_data' || node.hasClass('etk_filter_specs_data')) return false; if (html_for.indexOf('id_products_filters_top_categories_id_') == 0) return true; if (html_for.indexOf('id_products_filters_categories_id_') == 0) return true; if (id.indexOf('id_sub_products_filters_top_categories_id_') == 0) return true; if (id.indexOf('id_sub_products_filters_categories_id_') == 0) return true; if (id.indexOf('id_div_products_filters_') == 0) return true; if (id.indexOf('id_sub_arr_products_filters_categories_id_') == 0) return true; if (node.hasClass('epi-filter-top') || node.hasClass('epi-filter-cat') || node.hasClass('epi-filter-option')) return true; if (tag == 'div' && $.trim(node.text() || '') == '' && !node.children().length) return true; return false; }); if (!nodes.length) return; first_filter.before(holder); holder.append(nodes); } function f_style_filter_controls() { if (!$('#etk_filter_ui_style').length) { $('head').append(''); } if (!$('#etk_filter_clean_wrapper_style').length) { $('head').append(''); } if (!$('#etk_filter_collapse_style').length) { $('head').append(''); } if (!$('#etk_filter_option_limit_style').length) { $('head').append(''); } f_remove_legacy_shipping_filter_ui(); f_normalize_shipping_filter_labels(); f_wrap_static_filter_specs(); $('input[id^="id_products_filters_categories_id_"]').css('height','1px').css('width','0px').css('opacity','0'); $('div[id^="id_sub_arr_products_filters_categories_id_"]').css('display','none').css('cursor','pointer').css('height','18px').css('text-align','right').css('padding-right','10px').css('color','#777777'); $('label[for^="shipping_filters"]').css('display','block').css('padding-left','20px').css('font-size','11px').css('line-height','18px').css('font-weight','bold').css('background','#f2f6ee').css('margin-top','3px').css('margin-bottom','2px'); $('input[name^="products_filters_id"],input[name^="products_top_categories_id"]').css('position','relative').css('top','2px').css('background','none'); $('label[for^="id_products_filters_categories_id_"]').css('display','block').css('padding-left','20px').css('font-size','11px').css('line-height','18px').css('font-weight','bold').css('background','#f2f6ee'); $('.lfad').css('background-position', '5px 0px'); $('div[id^="id_div_products_filters_"]').css('position','relative'); $('div[id^="id_div_products_filters_"] div.c-filter__counter,.epi-filter-option div.c-filter__counter').css('position','absolute').css('right','16px').css('top','0px').css('color','#777777'); $('label[for^="id_products_filters_top_categories_id_"]').css('display','block').css('font-size','13px').css('line-height','18px').css('font-weight','bold').css('background','url(external/jscookmenu/themeie/gradient.gif) repeat-x top left #eaf0e3').css('padding','3px 4px'); $('.epi-filter-top').css('display','block').css('font-size','13px').css('line-height','18px').css('font-weight','bold').css('background','url(external/jscookmenu/themeie/gradient.gif) repeat-x top left #eaf0e3').css('padding','3px 4px').css('margin-top','4px'); $('.epi-filter-cat').css('display','block').css('padding-left','20px').css('font-size','11px').css('line-height','18px').css('font-weight','bold').css('background','#f2f6ee').css('margin-top','2px'); $('.epi-filter-option').css('position','relative').css('font-size','11px').css('line-height','18px').css('padding-right','56px'); $('.epi-filter-option input').css('position','relative').css('top','2px').css('background','none'); try { f_sync_filter_widths(); } catch (e) {} try { f_init_mobile_filter_drawer(); } catch (e) {} window.setTimeout(function(){ try { f_sync_filter_widths(); } catch (e) {} }, 80); } function f_get_filter_cat_id_from_body(body) { var id = body.attr('id') || ''; var m = id.match(/id_sub_products_filters_categories_id_(\d+)/); if (m && m[1]) return m[1]; return ''; } function f_set_filter_options_expanded(body, expanded) { var cat_id = f_get_filter_cat_id_from_body(body); if (cat_id != '') { etk_filter_option_expanded[cat_id] = expanded ? 1 : 0; } body.data('etkFilterOptionsExpanded', expanded ? true : false); } function f_init_filter_option_limits() { var limit = parseInt(etk_filter_option_limit, 10) || 5; $('div[id^="id_sub_products_filters_categories_id_"]').each(function(){ var body = $(this); var cat_id = f_get_filter_cat_id_from_body(body); var options; var total; var expanded; var hidden_count; var button_text; body.addClass('etk-filter-cat-body'); body.children('.etk-filter-show-more-row').remove(); options = body.children('div[id^="id_div_products_filters_"],.epi-filter-option'); total = options.length; options.each(function(){ $(this).find('label[for^="id_products_filters_"]').addClass('etk-filter-option-label'); }); if (total <= limit) { options.removeClass('etk-filter-option-extra-hidden'); return; } expanded = (body.data('etkFilterOptionsExpanded') === true || (cat_id != '' && etk_filter_option_expanded[cat_id] == 1)); hidden_count = total - limit; options.each(function(index){ if (expanded || index < limit) { $(this).removeClass('etk-filter-option-extra-hidden'); } else { $(this).addClass('etk-filter-option-extra-hidden'); } }); button_text = expanded ? 'Show fewer' : 'Show more'; if (expanded) { body.append(''); } else { body.append(''); } }); } function f_init_filter_groups() { var wrap = $('#epi_search_deferred_filters'); var groups = []; var max_index = -1; var max_count = -1; var i; if (!wrap.length) wrap = $('#id_products_filters_form'); if (!wrap.length) wrap = $('#filters_form'); if (!wrap.length) wrap = $('#c-modal__filter'); if (!wrap.length) return; if (wrap.data('etkGroupsInitialized') && wrap.find('.etk-filter-group-toggle').length && wrap.find('.etk-filter-cat-label').length) return; function schedule_filter_reflow() { window.setTimeout(function(){ try { f_init_safe_filter_float(); } catch (ignore) {} }, 50); window.setTimeout(function(){ try { f_sync_filter_widths(); } catch (ignore2) {} }, 60); } function get_top_id_from_label(label) { var input = label.find('input[name^="products_top_categories_id"]'); var id = ''; var m; if (!input.length) return ''; id = input.attr('id') || ''; m = id.match(/id_products_filters_top_categories_id_(\d+)/); if (!m || !m[1]) return ''; return m[1]; } function get_top_body_from_label(label) { var top_id = get_top_id_from_label(label); if (top_id == '') return $(); return $('#id_sub_products_filters_top_categories_id_' + top_id); } function set_top_open(label, body, open, user_action) { var top_id; if (!body.length) return; top_id = get_top_id_from_label(label); if (user_action && top_id != '') { etk_filter_top_open_state[top_id] = open ? 1 : 0; etk_filter_top_user_state[top_id] = 1; } if (open) { body.removeClass('etk-filter-body-collapsed').show(); label.removeClass('etk-filter-top-collapsed'); label.find('.etk-filter-group-toggle').text('-'); } else { body.addClass('etk-filter-body-collapsed').hide(); label.addClass('etk-filter-top-collapsed'); label.find('.etk-filter-group-toggle').text('+'); } } function get_cat_id_from_label(label) { var input = label.find('input[id^="id_products_filters_categories_id_"]'); var id = ''; var m; if (input.length) { id = input.attr('id') || ''; } else { id = label.attr('for') || ''; } m = id.match(/id_products_filters_categories_id_(\d+)/); if (!m || !m[1]) return ''; return m[1]; } function get_cat_body_from_label(label) { var cat_id = get_cat_id_from_label(label); if (cat_id == '') return $(); return $('#id_sub_products_filters_categories_id_' + cat_id); } function set_cat_open(label, body, open, user_action) { var cat_id; if (!body.length) return; cat_id = get_cat_id_from_label(label); if (user_action && cat_id != '') { etk_filter_cat_open_state[cat_id] = open ? 1 : 0; etk_filter_cat_user_state[cat_id] = 1; } if (open) { body.removeClass('etk-filter-body-collapsed').show(); label.removeClass('etk-filter-cat-collapsed').addClass('lfad'); } else { body.addClass('etk-filter-body-collapsed').hide(); label.addClass('etk-filter-cat-collapsed').removeClass('lfad'); } } function cat_has_selected_filters(body) { return (body.find('input[name^="products_filters_id"]:checked').length > 0); } function apply_default_open_category_limit() { var limit = parseInt(etk_filter_default_open_category_limit, 10) || 5; if (limit < 1) return; wrap.find('div[id^="id_sub_products_filters_top_categories_id_"]').each(function(){ var top_body = $(this); var open_items = []; var open_count = 0; var i2; if (top_body.data('etkDefaultCatLimitApplied')) return; top_body.children('label.etk-filter-cat-label').each(function(){ var cat_label = $(this); var cat_body = get_cat_body_from_label(cat_label); var cat_id = get_cat_id_from_label(cat_label); if (!cat_body.length) return; if (cat_body.css('display') != 'none' && !cat_body.hasClass('etk-filter-body-collapsed')) { open_items.push({ label: cat_label, body: cat_body, id: cat_id, active: cat_has_selected_filters(cat_body), user_state: (cat_id != '' && etk_filter_cat_user_state[cat_id] == 1), user_open: (cat_id != '' && etk_filter_cat_open_state[cat_id] == 1) }); } }); if (open_items.length > limit) { for (i2 = 0; i2 < open_items.length; i2++) { if (open_items[i2].user_state) { if (open_items[i2].user_open) { open_count++; } } else if (open_items[i2].active) { open_count++; } else if (open_count < limit) { open_count++; } else { set_cat_open(open_items[i2].label, open_items[i2].body, false, false); } } } top_body.data('etkDefaultCatLimitApplied', true); }); } wrap.find('label[for^="id_products_filters_top_categories_id_"]').each(function(){ var label = $(this); var input = label.find('input[name^="products_top_categories_id"]'); var body; var count; var active; if (!input.length) return; body = get_top_body_from_label(label); if (!body.length) return; label.addClass('etk-filter-top-label'); body.addClass('etk-filter-top-body'); count = parseInt(body.attr('data-etk-spec-count'), 10); if (isNaN(count) || count < 0) { count = body.find('input[name^="products_filters_id"]').length; } active = (body.find('input[name^="products_filters_id"]:checked').length > 0); groups.push({label: label, body: body, count: count, active: active}); if (count > max_count) { max_count = count; max_index = groups.length - 1; } }); if (groups.length) { for (i = 0; i < groups.length; i++) { if (!groups[i].label.find('.etk-filter-group-toggle').length) { groups[i].label.append('+'); } } for (i = 0; i < groups.length; i++) { var group_top_id = get_top_id_from_label(groups[i].label); if (group_top_id != '' && etk_filter_top_user_state[group_top_id] == 1) { set_top_open(groups[i].label, groups[i].body, etk_filter_top_open_state[group_top_id] == 1, false); } else if (groups[i].active || i == max_index) { set_top_open(groups[i].label, groups[i].body, true, false); } else { set_top_open(groups[i].label, groups[i].body, false, false); } } } wrap.find('label[for^="id_products_filters_categories_id_"], .epi-filter-cat').each(function(){ var label = $(this); var body = get_cat_body_from_label(label); var cat_id; if (!body.length) return; label.addClass('etk-filter-cat-label'); body.addClass('etk-filter-cat-body'); cat_id = get_cat_id_from_label(label); if (cat_id != '' && etk_filter_cat_user_state[cat_id] == 1) { set_cat_open(label, body, etk_filter_cat_open_state[cat_id] == 1, false); } else if (body.css('display') == 'none') { set_cat_open(label, body, false, false); } else { set_cat_open(label, body, true, false); } }); apply_default_open_category_limit(); f_init_filter_option_limits(); wrap.off('click.etkFilterGroup'); wrap.on('click.etkFilterGroup', '.etk-filter-group-toggle', function(e){ var label; var body; e.preventDefault(); e.stopPropagation(); label = $(this).closest('label'); body = get_top_body_from_label(label); if (!body.length) return false; set_top_open(label, body, body.css('display') == 'none', true); schedule_filter_reflow(); return false; }); wrap.on('click.etkFilterGroup', 'label.etk-filter-top-label', function(e){ var target = $(e.target); var body; if (target.is('input') || target.closest('input').length) return true; if (target.hasClass('etk-filter-group-toggle')) return false; e.preventDefault(); e.stopPropagation(); body = get_top_body_from_label($(this)); if (!body.length) return false; set_top_open($(this), body, body.css('display') == 'none', true); schedule_filter_reflow(); return false; }); wrap.on('click.etkFilterGroup', 'label.etk-filter-cat-label', function(e){ var target = $(e.target); var body; if (target.is('a') || target.closest('a').length) return true; e.preventDefault(); e.stopPropagation(); body = get_cat_body_from_label($(this)); if (!body.length) return false; set_cat_open($(this), body, body.css('display') == 'none', true); schedule_filter_reflow(); return false; }); wrap.on('click.etkFilterGroup', '.etk-filter-show-more-row', function(e){ var button = $(this); var body = button.closest('div[id^="id_sub_products_filters_categories_id_"]'); var expanded; e.preventDefault(); e.stopPropagation(); if (!body.length) return false; expanded = !(body.data('etkFilterOptionsExpanded') === true || etk_filter_option_expanded[f_get_filter_cat_id_from_body(body)] == 1); f_set_filter_options_expanded(body, expanded); f_init_filter_option_limits(); schedule_filter_reflow(); return false; }); wrap.data('etkGroupsInitialized', true); } function f_init_safe_filter_float() { var sidebar; var sidebox; var original_top = 0; var resize_timer = null; var scroll_timer = null; var filter_scroll_box = $(); var min_desktop_width = 760; var last_sticky_state = null; var last_spacer_height = -1; var last_header_height = -1; sidebar = document.getElementById('c-modal__filter'); if (!sidebar) return; sidebox = $('.c-sidebox', sidebar).first(); if (!sidebox.length) sidebox = $(sidebar); filter_scroll_box = $('#epi_search_deferred_filters').closest('table.infoBox'); if (!filter_scroll_box.length) filter_scroll_box = sidebox.find('table.infoBox').first(); if (!filter_scroll_box.length) filter_scroll_box = sidebox; /* This file is the only owner of desktop filter-follow behavior. Remove old template/CSS experiments so the live top value below is not overridden. */ $('#etk_filter_float_placeholder').remove(); $('#etk_filter_fixed_placeholder').remove(); $('#etk_filter_sticky_placeholder').remove(); $('#etk_filter_sticky_style').remove(); $('#etk_filter_follow_style').remove(); $('#etkColumnLeftStickyCss').remove(); $('#etkSearchResultStickyCss').remove(); $('#etk_filter_header_offset_override_style').remove(); $('head').append(''); function has_class(el, cls) { if (!el || !el.className) return false; return (' ' + el.className + ' ').indexOf(' ' + cls + ' ') > -1; } function viewport_width() { if (window.innerWidth) return window.innerWidth; if (document.documentElement && document.documentElement.clientWidth) return document.documentElement.clientWidth; return 0; } function page_y_offset() { if (typeof window.pageYOffset == 'number') return window.pageYOffset; if (document.documentElement && document.documentElement.scrollTop) return document.documentElement.scrollTop; if (document.body && document.body.scrollTop) return document.body.scrollTop; return 0; } function viewport_height() { if (window.innerHeight) return window.innerHeight; if (document.documentElement && document.documentElement.clientHeight) return document.documentElement.clientHeight; return 600; } function get_sticky_state() { return $('body').hasClass('etkHeaderStickyActive') ? 1 : 0; } function get_spacer_height() { var spacer = $('.etkHeaderTopBarSpacer').first(); return spacer.length ? (spacer.outerHeight() || 0) : 0; } function get_header_height() { var header = $('.etkHeaderTopBarShell.etkHeaderTopBarShellFixed').first(); if (!header.length) header = $('.etkHeaderTopBarShell').first(); return header.length ? (header.outerHeight() || 0) : 0; } function set_filter_style(name, value) { if (!sidebar || !sidebar.style) return; if (sidebar.style.setProperty) { sidebar.style.setProperty(name, value, 'important'); } else { sidebar.style[name] = value; } } function clear_filter_style(name) { if (!sidebar || !sidebar.style) return; if (sidebar.style.removeProperty) { sidebar.style.removeProperty(name); } else { sidebar.style[name] = ''; } } function get_header_offset() { var header_height = get_header_height(); var offset = 8; if (get_sticky_state()) { offset = header_height > 0 ? header_height + 12 : 150; if (offset < 150) offset = 150; } return offset; } function is_desktop() { if (viewport_width() < min_desktop_width) return false; if ($('#c-modal__filter').hasClass('l-notranslate')) return false; return true; } function get_footer_top() { var footer = $('table.footer:visible').first(); var off; if (!footer.length) footer = $('table.footer').first(); if (!footer.length) footer = $('.l-footer__mobile:visible').first(); if (footer.length) { off = footer.offset(); if (off && off.top) return off.top; } return $(document).height(); } function clear_follow() { $(sidebar).removeClass('etk-filter-following'); clear_filter_style('position'); clear_filter_style('top'); clear_filter_style('left'); clear_filter_style('right'); clear_filter_style('bottom'); clear_filter_style('inset'); clear_filter_style('-webkit-transform'); clear_filter_style('transform'); clear_filter_style('width'); clear_filter_style('max-height'); clear_filter_style('overflow-y'); clear_filter_style('overflow-x'); clear_filter_style('z-index'); clear_filter_style('background'); sidebox.css({'max-height':'','overflow-y':'','overflow-x':'','padding-right':'','overflow':''}); filter_scroll_box.css({'display':'','max-height':'','overflow-y':'','overflow-x':'','padding-right':''}); } function remember_measure_state() { last_sticky_state = get_sticky_state(); last_spacer_height = get_spacer_height(); last_header_height = get_header_height(); } function measure_state_changed() { var sticky_state = get_sticky_state(); var spacer_height = get_spacer_height(); var header_height = get_header_height(); if (last_sticky_state === null) return true; if (sticky_state != last_sticky_state) return true; if (Math.abs(spacer_height - last_spacer_height) > 1) return true; if (Math.abs(header_height - last_header_height) > 1) return true; return false; } function measure_original() { var rect; if (!is_desktop()) { clear_follow(); return; } $(sidebar).removeClass('etk-filter-following'); clear_filter_style('position'); clear_filter_style('top'); clear_filter_style('left'); clear_filter_style('right'); clear_filter_style('bottom'); clear_filter_style('inset'); clear_filter_style('-webkit-transform'); clear_filter_style('transform'); rect = sidebar.getBoundingClientRect ? sidebar.getBoundingClientRect() : null; if (rect) { original_top = page_y_offset() + rect.top; } if (!original_top) { original_top = $(sidebar).offset() ? $(sidebar).offset().top : 0; } remember_measure_state(); } function apply_position() { var scroll_top; var desired_top; var max_top; var footer_top; var sidebar_height; var max_height; var distance_to_footer; var offset; if (!is_desktop()) { clear_follow(); return; } if (!original_top || measure_state_changed()) { original_top = 0; measure_original(); if (!original_top) return; } scroll_top = page_y_offset(); offset = get_header_offset(); footer_top = get_footer_top(); sidebar_height = $(sidebar).outerHeight(true) || sidebox.outerHeight(true) || 1; desired_top = scroll_top + offset - original_top; if (desired_top < 0) desired_top = 0; max_top = footer_top - original_top - sidebar_height - 18; if (max_top < 0) max_top = 0; if (desired_top > max_top) desired_top = max_top; distance_to_footer = footer_top - scroll_top - offset - 18; max_height = viewport_height() - offset - 12; if (distance_to_footer > 0 && distance_to_footer < max_height) { max_height = distance_to_footer; } if (max_height < 220) max_height = 220; $(sidebar).addClass('etk-filter-following'); set_filter_style('position', 'relative'); set_filter_style('top', desired_top + 'px'); set_filter_style('left', 'auto'); set_filter_style('right', 'auto'); set_filter_style('bottom', 'auto'); clear_filter_style('inset'); set_filter_style('-webkit-transform', 'none'); set_filter_style('transform', 'none'); set_filter_style('z-index', '80'); set_filter_style('background', '#ffffff'); sidebox.css({'max-height':'', 'overflow':'visible', 'overflow-y':'visible', 'overflow-x':'visible', 'padding-right':'0'}); filter_scroll_box.css({'display':'block', 'max-height': Math.max(180, max_height - 20) + 'px', 'overflow-y':'auto', 'overflow-x':'hidden', 'padding-right':'5px'}); sidebar.style.marginLeft = ''; } function schedule_measure() { if (resize_timer) window.clearTimeout(resize_timer); resize_timer = window.setTimeout(function(){ original_top = 0; measure_original(); apply_position(); }, 80); } window.etkUpdateFilterFloat = apply_position; window.etkScheduleFilterFloatMeasure = schedule_measure; $(window).off('scroll.etkSafeFilterFloat').on('scroll.etkSafeFilterFloat', function(){ if (scroll_timer) return; scroll_timer = window.setTimeout(function(){ scroll_timer = null; apply_position(); }, 20); }); $(window).off('resize.etkSafeFilterFloat').on('resize.etkSafeFilterFloat', function(){ schedule_measure(); }); $(sidebar).data('etkFollowInitialized', true); measure_original(); apply_position(); window.setTimeout(apply_position, 80); window.setTimeout(schedule_measure, 350); window.setTimeout(schedule_measure, 900); window.setTimeout(schedule_measure, 1600); } function f_filter_form_submit(list_reset) { var load_page = 1; var data_obj; var prefetch_key; if (block_submit || is_spider || etk_ajax_loading) return; if (list_reset == true) { pages_loaded = 0; etk_search_token = ''; etk_search_total_results = 0; window.etk_search_token = ''; window.etk_search_total_results = 0; f_clear_results_prefetch(true); if (!etk_specs_locked) { etk_specs_loaded_token = ''; } $('#id_field_filters').val(f_get_checked_filters_string()); } else if (pages_loaded > 0) { if (f_use_results_prefetch()) { return; } prefetch_key = f_results_prefetch_key(pages_loaded, 1); if (etk_prefetch_loading && etk_prefetch_key == prefetch_key) { etk_prefetch_consume_requested = true; f_show_loading_more(); return; } } if (($('#id_subcats').length) && ($('#id_products_filters_form input:checked[name^=products_top_categories_id]').length == 0)) { $('#id_subcats').show(); $('#id_ajax_filters').hide(); $('#id_ajax_filters_show_more').hide(); return; } else { $('#id_subcats').hide(); } if ($('#id_ajax_filters').length) { etk_ajax_loading = true; $('#id_ajax_filters_show_more').hide(); if (pages_loaded == 0) { $('#id_ajax_filters').stop(true, true).html(' Please wait... Loading').show(); } else { f_show_loading_more(); } try { if (ajax_req) ajax_req.abort(); } catch (e) {} data_obj = f_build_results_request_data(); ajax_req = $.ajax({ type: 'POST', url: f_build_ajax_request_url(load_page), data: data_obj }).done(function(data) { f_handle_loaded_results_data(data, load_page); }).fail(function() { if (pages_loaded == 0) { $('#id_ajax_filters').html('
Search results could not be loaded. Please refresh and try again.
').show(); } }).always(function() { etk_ajax_loading = false; f_hide_loading_more(); window.setTimeout(function(){ try { f_maybe_start_results_prefetch(); } catch (e) {} }, 100); }); } } $(function() { f_style_filter_controls(); f_init_filter_groups(); $('#filters_form').show(); try { f_init_mobile_filter_drawer(); } catch (e) {} $('#id_ajax_filters_show_more').click(function() { f_filter_form_submit(false); return false; }); $(window).scroll(function() { var show_more = $('#id_ajax_filters_show_more'); var distance; if (show_more.length && show_more.css('display') != 'none' && !etk_ajax_loading) { distance = f_results_show_more_distance(); if (distance < etk_infinite_preload_distance) { f_start_results_prefetch(); } if (distance < etk_infinite_load_distance) { show_more.css('opacity', '0.01'); f_filter_form_submit(false); } } f_set_page_url('scroll'); }); $('#id_products_filters_form').on('change', 'input[name^="products_filters_id"]', function() { f_filter_form_submit(true); }); $('#id_products_filters_form').on('change', 'input[name^="products_top_categories_id"]', function() { var new_id = '#' + $(this).attr('id').replace('id_products', 'id_sub_products'); if ($(this).attr('checked') == 'checked' || $(this).prop('checked')) { $(new_id).show(); } else { $(new_id).hide(); $(new_id + ' input[name^="products_filters_id"]').attr('checked', false); } f_filter_form_submit(true); }); $('#id_products_filters_form').on('change', 'input[id^="id_products_filters_categories_id_"]', function() { var new_id = '#' + $(this).attr('id').replace('id_products', 'id_sub_products'); if ($(this).attr('checked') == 'checked' || $(this).prop('checked')) { $(this).parent().css('background-position','5px 0px'); $(new_id).show(); } else { $(this).parent().css('background-position','5px -18px'); $(new_id + ' input[name^="products_filters_id"]').attr('checked', false); $(new_id).hide(); } }); $('input[name="shipping_filters"]').change(function() { if(!$(this).prop('checked')) { $('#shipping_filters_div').hide(); } else { $('#shipping_filters_div').show(); } f_filter_form_submit(true); }); $('input[name^="shipping_filters_id"]').change(function() { f_filter_form_submit(true); }); $(document).on('mousedown click', '#id_ajax_filters a[href]', function() { var href = $(this).attr('href') || ''; if (href.indexOf('action=buy_now') == -1) { f_save_results_cache('link'); } }); if ('onpagehide' in window) { $(window).on('pagehide', function() { f_save_results_cache('pagehide'); }); } else { $(window).on('beforeunload', function() { f_save_results_cache('beforeunload'); }); } if (!f_restore_results_cache()) { f_filter_form_submit(true); } function etk_rebind_filter_float_after_sticky_header() { try { f_init_safe_filter_float(); } catch (e) {} } window.setTimeout(etk_rebind_filter_float_after_sticky_header, 250); window.setTimeout(etk_rebind_filter_float_after_sticky_header, 1000); window.setTimeout(etk_rebind_filter_float_after_sticky_header, 1800); });