'use strict';
//init global array file
var woof_turbo_mode_file = [];

var WoofTurboMode_obj = function (data) {
    this.file_link = data.link;
    this.preload = data.pre_load;
    this.products_data = [];
    this.filter_settings = data.settings;
    this.sale_ids = data.sale_ids;

    this.show_count = parseInt(data.show_count);
    this.dynamic_recount_val = parseInt(data.dynamic_recount);
    this.hide_empty_term = parseInt(data.hide_empty_term);
    this.hide_count = parseInt(data.hide_count);

    this.messenger_btn = {};

    this.curr_tax = {};
    if (typeof data.current_tax.tax !== undefined) {
        this.curr_tax = data.current_tax;
    }

    this.additional_tax = {};
    if (
        typeof data.additional_tax !== undefined &&
        data.additional_tax.length
    ) {
        this.additional_tax = data.additional_tax;
    }

    this.file_error_msg = '';
    if (
        typeof data.file_error_nitice !== undefined &&
        data.file_error_nitice.length
    ) {
        this.file_error_msg = data.file_error_nitice;
    }

    this.keys_array = function (data) {
        var array_keys = {};
        array_keys['taxonomies'] = [];

        jQuery.each(data.settings.excluded_terms, function (i, item) {
            var logic = 'OR';

            if (data.settings.comparison_logic[i] != undefined) {
                logic = data.settings.comparison_logic[i];
            }
            array_keys['taxonomies'][i] = logic;
        });
        array_keys['meta'] = [];
        if (typeof data.settings.meta_filter != 'undefined') {
            jQuery.each(data.settings.meta_filter, function (i, item) {
                var search_logic = 'OR';
                var checkbox_logic = '';
                var text_conditional = '';
                if (
                    data.settings[i] != undefined &&
                    data.settings[i]['search_logic'] != undefined &&
                    data.settings[i]['search_logic'] == 'AND'
                ) {
                    search_logic = 'AND';
                }
                if (data.settings[i] != undefined) {
                    if (
                        data.settings[i]['search_option'] != undefined &&
                        parseInt(data.settings[i]['search_option']) === 1
                    ) {
                        checkbox_logic = 'exist';
                    } else if (
                        data.settings[i]['search_option'] != undefined &&
                        data.settings[i]['search_value'] != undefined &&
                        data.settings[i]['search_option'] == 0
                    ) {
                        if (data.settings[i]['search_value'].length) {
                            checkbox_logic = data.settings[i]['search_value'];
                        } else {
                            checkbox_logic = 'exist';
                        }
                    }
                    if (data.settings[i]['text_conditional'] != undefined) {
                        checkbox_logic = data.settings[i]['text_conditional'];
                    }
                }
                item['search_logic'] = search_logic;
                item['checkbox_logic'] = checkbox_logic;
                item['text_conditional'] = checkbox_logic;
                array_keys['meta'][item['search_view'] + '_' + i] = item;
            });
        }
        var only = [
            'max_price',
            'woof_text',
            'min_rating',
            'woof_author',
            'woof_sku',
            'stock',
            'backorder',
            'onsales',
        ];
        array_keys['only'] = {};
        jQuery.each(only, function (i, item) {
            switch (item) {
                case 'woof_sku':
                    array_keys['only'][item] = {};
                    array_keys['only'][item]['logic'] = 'LIKE';
                    if (
                        typeof data.settings['by_sku'] != 'undefined' &&
                        data.settings['by_sku']['logic'] != undefined
                    ) {
                        array_keys['only'][item]['logic'] =
                            data.settings['by_sku']['logic'];
                    }
                    break;
                case 'onsales':
                    array_keys['only'][item] = {};
                    array_keys['only'][item]['ids'] = data.sale_ids;
                    break;
                case 'woof_text':
                    array_keys['only'][item] = {};
                    array_keys['only'][item]['search_by_full_word'] = 0;
                    if (
                        typeof data.settings['by_text'] != 'undefined' &&
                        data.settings['by_text']['search_by_full_word'] !=
                            undefined
                    ) {
                        array_keys['only'][item]['search_by_full_word'] =
                            data.settings['by_text']['search_by_full_word'];
                    }
                    break;
                default:
                    array_keys['only'][item] = {};
            }
        });
        return array_keys;
    };
    // init search key
    this.possible_terms = this.keys_array(data);

    this.init = function () {
        woof_is_ajax = 1;

        this.uploadFile();
    };
    this.do_after_upload = function (_this) {
        /*count after upload file*/
        if (_this.show_count) {
            jQuery(document).ready(function () {
                var filters = {};
                if (_this.dynamic_recount_val) {
                    filters = _this.dynamic_recount(woof_current_values);
                } else {
                    filters = _this.dynamic_recount({});
                }
                jQuery('.woof_turbo_mode_overlay').show();
                jQuery.each(filters, function (i, filter) {
                    var filter_count = 0;
                    jQuery.each(filter, function (ind, items) {
                        var count = 0;
                        var last = false;
                        if (Object.keys(items).length) {
                            filter_count = ind;
                        }
                        jQuery.each(items, function (indx, item) {
                            /* split streams */
                            setTimeout(function () {
                                last = false;
                                var res = {};
                                if (!item.current) {
                                    var recount = false;
                                    if (
                                        typeof item.key != 'undefined' &&
                                        typeof _this.possible_terms.taxonomies[
                                            item.key.replace('rev_', '')
                                        ] != 'undefined' &&
                                        _this.possible_terms.taxonomies[
                                            item.key.replace('rev_', '')
                                        ] == 'NOT IN'
                                    ) {
                                        recount = true;
                                    }
                                    res = _this.search(item.query, recount);
                                    //array unique
                                    res = res.filter(
                                        (v, i, a) => a.indexOf(v) === i
                                    );
                                } else {
                                    count++;
                                }
                                filters[i][ind][indx].count = res.length;
                                if (res.length > 0) {
                                    count++;
                                }
                                if (
                                    typeof filters[i][ind][+indx + 1] ==
                                    'undefined'
                                ) {
                                    last = true;
                                }

                                _this.draw_count_item(
                                    filters[i][ind][indx],
                                    count,
                                    last,
                                    _this
                                );
                                if (last && filter_count == ind) {
                                    jQuery('.woof_turbo_mode_overlay').hide();
                                }
                                last = false;
                            }, 1);
                        });
                    });
                    _this.check_messenger_btn(_this);
                    _this.check_save_query_btn(_this);
                });
            });
        } else {
            jQuery('.woof_turbo_mode_overlay').hide();
        }
    };

    this.draw_counts = function (filters) {
        /*not used*/
        jQuery.each(filters, function (i, filter) {
            jQuery.each(filter, function (ind, items) {
                jQuery.each(items, function (indx, item) {
                    if (item.type == 'radio' || item.type == 'checkbox') {
                        jQuery(item.label).find('.woof_turbo_count').remove();
                        jQuery(item.label).append(
                            "<span class='woof_turbo_count'>(" +
                                item.count +
                                ')</span>'
                        );
                    }
                    if (item.type == 'drop_down') {
                        jQuery(item.label).attr('data-count', item.count);
                        var txt = jQuery(item.label).text();
                        txt = txt.replace(/\(.*?\)/g, '');
                        txt = txt.replace(/\s*$/, '');
                        jQuery(item.label).text(txt + ' (' + item.count + ')');
                    }
                });
            });
        });

        woof_reinit_selects();
    };
    this.draw_count_item = function (item, count, last, _this) {
        var hide_empty_term = _this.hide_empty_term;
        var hide_count = _this.hide_count;

        if (item.type == 'radio' || item.type == 'checkbox') {
            jQuery(item.label).find('.woof_turbo_count').remove();
            if (!item.current && !hide_count) {
                jQuery(item.label).append(
                    "<span class='woof_turbo_count'>(" + item.count + ')</span>'
                );
            }

            if (item.count <= 0 && hide_empty_term) {
                jQuery(item.label).parent().addClass('woof_turbo_hide');
            } else {
                jQuery(item.label).parent().removeClass('woof_turbo_hide');
            }
            if (item.current) {
                jQuery(item.label).parent().removeClass('woof_turbo_hide');
            }

            if (last) {
                if (count == 0 && hide_empty_term) {
                    jQuery(item.label)
                        .parents('.woof_container')
                        .addClass('woof_turbo_hide');
                } else {
                    jQuery(item.label)
                        .parents('.woof_container')
                        .removeClass('woof_turbo_hide');
                }
                _this.check_show_more_less(_this, item.key);
            }
        }
        if (item.type == 'meta_checkbox') {
            jQuery(item.label).find('.woof_turbo_count').remove();

            if (!item.current && !hide_count) {
                jQuery(item.label).append(
                    "<span class='woof_turbo_count'>(" + item.count + ')</span>'
                );
            }

            if (item.count <= 0 && hide_empty_term) {
                jQuery(item.label).parent().addClass('woof_turbo_hide');
            } else {
                count++;
                jQuery(item.label).parent().removeClass('woof_turbo_hide');
            }
            if (item.current) {
                jQuery(item.label).parent().removeClass('woof_turbo_hide');
            }
            if (last) {
                if (count == 0 && hide_empty_term) {
                    jQuery(item.label)
                        .parents('.woof_container')
                        .addClass('woof_turbo_hide');
                } else {
                    jQuery(item.label)
                        .parents('.woof_container')
                        .removeClass('woof_turbo_hide');
                }
            }
        }
        if (item.type == 'meta_datepicker') {
            if (typeof woof_current_values[item.tax] == 'undefined') {
                if (item.count == 0 && hide_empty_term) {
                    jQuery(item.label).addClass('woof_turbo_hide');
                } else {
                    jQuery(item.label).removeClass('woof_turbo_hide');
                }
            } else {
                jQuery(item.label).removeClass('woof_turbo_hide');
            }
        }
        if (item.type == 'drop_down') {
            jQuery(item.label).attr('data-count', item.count);
            var txt = jQuery(item.label).text();
            txt = txt.replace(/\(.*?\)/g, '');
            txt = txt.replace(/\s*$/, '');

            if (!item.current && !hide_count) {
                jQuery(item.label).text(txt + ' (' + item.count + ')');
            } else {
                jQuery(item.label).text(txt);
            }

            if (item.count <= 0 && hide_empty_term) {
                jQuery(item.label).addClass('woof_turbo_hide');
            } else {
                jQuery(item.label).removeClass('woof_turbo_hide');
            }
            if (item.current) {
                jQuery(item.label).removeClass('woof_turbo_hide');
            }
            if (last) {
                if (count == 0 && hide_empty_term) {
                    jQuery(item.label)
                        .parents('.woof_container')
                        .addClass('woof_turbo_hide');
                } else {
                    jQuery(item.label)
                        .parents('.woof_container')
                        .removeClass('woof_turbo_hide');
                }

                if (woof_select_type == 'chosen') {
                    try {
                        jQuery(item.label)
                            .parent('select')
                            .chosen('destroy')
                            .trigger('liszt:updated');
                        jQuery(item.label)
                            .parent('select')
                            .chosen(/*{disable_search_threshold: 10}*/);
                    } catch (e) {}
                } else if (woof_select_type == 'selectwoo') {
                    try {
                        jQuery(item.label)
                            .parent('select')
                            .selectWoo('destroy');
                        jQuery(item.label).parent('select').selectWoo();
                    } catch (e) {}
                }
            }
        }
        if (item.type == 'slider') {
            if (woof_current_values[item.tax] == undefined) {
                if (item.count == 0 && hide_empty_term) {
                    jQuery(item.label)
                        .parents('.woof_container_slider')
                        .addClass('woof_turbo_hide');
                } else {
                    jQuery(item.label)
                        .parents('.woof_container_slider')
                        .removeClass('woof_turbo_hide');
                }
            } else {
                jQuery(item.label)
                    .parents('.woof_container_slider')
                    .removeClass('woof_turbo_hide');
            }
        }
        if (item.type == 'meta_slider') {
            if (woof_current_values[item.tax] == undefined) {
                if (item.count == 0 && hide_empty_term) {
                    jQuery(item.label)
                        .parents('.woof_meta_slider_container')
                        .addClass('woof_turbo_hide');
                } else {
                    jQuery(item.label)
                        .parents('.woof_meta_slider_container')
                        .removeClass('woof_turbo_hide');
                }
            } else {
                jQuery(item.label)
                    .parents('.woof_meta_slider_container')
                    .removeClass('woof_turbo_hide');
            }
        }
        if (item.type == 'color_image') {
            var item_label = jQuery(item.label)
                .parents('li')
                .find('.woof_tooltip_data');
            jQuery(item_label).find('.woof_turbo_count').remove();
            if (!item.current && !hide_count) {
                jQuery(item_label).append(
                    "<span class='woof_turbo_count'>(" + item.count + ')</span>'
                );
            }
            if (item.count <= 0 && hide_empty_term) {
                jQuery(item.label).parents('li').addClass('woof_turbo_hide');
            } else {
                jQuery(item.label).parents('li').removeClass('woof_turbo_hide');
            }
            if (item.current) {
                jQuery(item.label).parents('li').removeClass('woof_turbo_hide');
            }
            if (last) {
                if (count == 0 && hide_empty_term) {
                    jQuery(item.label)
                        .parents('.woof_container')
                        .addClass('woof_turbo_hide');
                } else {
                    jQuery(item.label)
                        .parents('.woof_container')
                        .removeClass('woof_turbo_hide');
                }
                _this.check_show_more_less(_this, item.key);
            }
        }
        if (item.type == 'label') {
            jQuery(item.label).find('.woof_label_count').remove();
            if (!item.current && !hide_count) {
                jQuery(item.label).prepend(
                    "<span class='woof_label_count'>" + item.count + '</span>'
                );
            }
            if (item.count <= 0 && hide_empty_term) {
                jQuery(item.label).addClass('woof_turbo_hide');
            } else {
                jQuery(item.label).removeClass('woof_turbo_hide');
            }
            if (item.current) {
                jQuery(item.label).removeClass('woof_turbo_hide');
            }
            if (last) {
                if (count == 0 && hide_empty_term) {
                    jQuery(item.label)
                        .parents('.woof_container')
                        .addClass('woof_turbo_hide');
                } else {
                    jQuery(item.label)
                        .parents('.woof_container')
                        .removeClass('woof_turbo_hide');
                }

                _this.check_show_more_less(_this, item.key);
            }
        }
    };
    this.uploadFile = function () {
        var do_after_upload = this.do_after_upload;
        let show_error_notice = this.show_error_notice;
        var _this = this;
        if (!woof_turbo_mode_file.length) {
            jQuery
                .getJSON(this.file_link, function (file_data) {})
                .done(function (file_data) {
                    woof_turbo_mode_file = file_data;
                    console.log('Turbo mode file downloaded!');
                    do_after_upload(_this);
                })
                .fail(function () {
                    //error_nitice
                    show_error_notice(_this.file_error_msg, _this);
                    console.log(
                        'I can not access files!  Please create data file OR  check  .htaccess  settings'
                    );
                });
        }
    };

    this.do_query = function (where) {
        var ids = alasql('SELECT COLUMN id FROM ? AS d WHERE ' + where, [
            woof_turbo_mode_file,
        ]);
        return ids;
    };
    this.get_query = function (query, possible_terms, inlude_var, recount) {
        var query_tmp = [];
        var tax_q = this.taxonomy_query;
        var meta_q = this.meta_query;
        var only_q = this.only_query;
        var visibility_q = this.get_visibility_tax;
        var variation_q = this.without_variation;

        /* to add  current  category */
        if (typeof this.curr_tax.tax != 'undefined') {
            query_tmp.push(
                tax_q(
                    this.curr_tax.tax,
                    this.curr_tax.slug,
                    possible_terms['taxonomies'][this.curr_tax.tax]
                )
            );
        }
        /* to add  additional tax */

        if (this.additional_tax.length) {
            jQuery.each(this.additional_tax, function (i, add_tax) {
                query_tmp.push(
                    tax_q(
                        add_tax.tax,
                        add_tax.terms,
                        possible_terms['taxonomies'][add_tax.tax]
                    )
                );
            });
        }

        if (typeof inlude_var == 'undefined' || !inlude_var) {
            query_tmp.push(variation_q());
        }

        var filter_slug = this.filter_settings.swoof_search_slug;

        jQuery.each(query, function (i, item) {
            if (filter_slug == i) {
                return true;
            }
            if (
                possible_terms['taxonomies'][i] != undefined ||
                possible_terms['taxonomies'][i.replace('rev_', '')] != undefined
            ) {
                i = i.replace('rev_', '');
                var logic = possible_terms['taxonomies'][i];

                if (
                    typeof recount != 'undefined' &&
                    recount == true &&
                    possible_terms['taxonomies'][i] == 'NOT IN'
                ) {
                    logic = 'OR';
                }
                query_tmp.push(tax_q(i, item, logic));
            } else if (possible_terms['meta'][i] != undefined) {
                query_tmp.push(meta_q(i, item, possible_terms['meta'][i]));
            } else if (possible_terms['only'][i] != undefined) {
                query_tmp.push(only_q(i, item, possible_terms['only'][i]));
            }
        });

        if (query_tmp.length > 0) {
            query_tmp.push(visibility_q(true));
        } else {
            query_tmp.push(visibility_q(false));
        }
        query_tmp = query_tmp.join(' AND ');
        if (query_tmp.length) {
            return query_tmp;
        }
        return ' 1 ';
    };

    /* generate queries */
    this.get_visibility_tax = function (search) {
        if (typeof search == 'undefined') {
            search = false;
        }
        return ' (get_visibility(taxonomies,' + search + ')= true) ';
    };
    this.show_error_notice = function (message, _this) {
        let div = document.createElement('div');
        div.classList.add('woof_tm_error_wrapper');
        let icon = document.createElement('span');
        icon.classList.add('dashicons');
        icon.classList.add('dashicons-warning');
        let prf = document.createElement('p');
        prf.innerHTML = message;
        div.appendChild(icon);
        div.appendChild(prf);

        let filters = document.querySelectorAll('.woof_redraw_zone');
        for (let i = 0; i < filters.length; i++) {
            filters[i].innerHTML = '';
            filters[i].appendChild(div.cloneNode(true));
        }
    };
    this.taxonomy_query = function (key, data, logic) {
        var query = [];
        data = data + '';
        var data_arr = data.split(',');
        if (logic == 'NOT IN') {
            jQuery.each(data_arr, function (i, item) {
                query.push(
                    " taxonomies->('" +
                        key +
                        "')->indexOf('" +
                        item +
                        "')== -1 "
                );
            });
            logic = 'AND';
        } else {
            jQuery.each(data_arr, function (i, item) {
                query.push(
                    " taxonomies->('" + key + "')->indexOf('" + item + "')> -1 "
                );
            });
        }

        return '( ' + query.join(logic) + ' )';
    };
    this.meta_query = function (key, data, settings) {
        var query = [];
        switch (settings['search_view']) {
            case 'select':
            case 'mselect':
                var data_arr = data.split(',');
                var options = settings['options'].split(',');
                jQuery.each(data_arr, function (i, item) {
                    var value = options[item - 1];
                    var test_text = value.split('^');
                    if (test_text[1] != undefined) {
                        value = test_text[1];
                    }
                    query.push(
                        " meta_data->('" +
                            settings['meta_key'] +
                            "') = '" +
                            value +
                            "'"
                    );
                });
                query =
                    '( ' +
                    query.join(' ' + settings['search_logic'] + ' ') +
                    ') ';
                break;
            case 'checkbox':
                if (settings['checkbox_logic'] == 'exist') {
                    query =
                        " meta_data->('" +
                        settings['meta_key'] +
                        "')!='undefined' ";
                } else {
                    query =
                        " meta_data->('" +
                        settings['meta_key'] +
                        "')='" +
                        settings['checkbox_logic'] +
                        "' ";
                }

                break;
            case 'textinput':
                if (settings['text_conditional'] == 'LIKE') {
                    query =
                        " meta_data->('" +
                        settings['meta_key'] +
                        "') LIKE '%" +
                        data +
                        "%'";
                } else {
                    query =
                        " meta_data->('" +
                        settings['meta_key'] +
                        "')='" +
                        data +
                        "' ";
                }

                break;
            case 'slider':
                var data_arr = data.split('^');
                if (data_arr.length > 1) {
                    query =
                        " (meta_data->('" +
                        settings['meta_key'] +
                        "') BETWEEN " +
                        data_arr[0] +
                        ' AND ' +
                        data_arr[1] +
                        ') ';
                } else {
                    query = '';
                }

                break;
            case 'datepicker':
                var data_arr = data.split('-');
                if (data_arr.length > 1) {
                    if (data_arr[0] != 'i' && data_arr[1] != 'i') {
                        query =
                            " (meta_data->('" +
                            settings['meta_key'] +
                            "') BETWEEN '" +
                            data_arr[0] +
                            "' AND '" +
                            data_arr[1] +
                            "') ";
                    } else if (
                        (data_arr[0] == 'i' && data_arr[1] != 'i') ||
                        (data_arr[0] != 'i' && data_arr[1] == 'i')
                    ) {
                        var compare = ' > ';
                        var val = data_arr[0];
                        if (data_arr[0] == 'i' && data_arr[1] != 'i') {
                            var compare = ' < ';
                            var val = data_arr[1];
                        }

                        query =
                            ' (' +
                            val +
                            compare +
                            " meta_data->('" +
                            settings['meta_key'] +
                            "')) ";
                    }
                } else {
                    query = '';
                }

                break;
        }
        return query;
    };
    this.only_query = function (key, data, settings) {
        var query = '';
        switch (key) {
            case 'woof_author':
                query = " author='" + data + "' ";
                break;
            case 'woof_sku':
                if (settings['logic'] == 'LIKE') {
                    query = " sku LIKE '%" + data + "%' ";
                } else {
                    query = " sku='" + data + "' ";
                }

                break;
            case 'stock':
                var is_simple = true;
                if (
                    typeof WoofTurboMode.filter_settings['by_instock'] !=
                        'undefined' &&
                    WoofTurboMode.filter_settings['by_instock']['use_for'] !=
                        'simple'
                ) {
                    is_simple = false;
                }
                if (is_simple) {
                    query = " (stock='instock')";
                } else {
                    var count_query_r = Object.assign({}, woof_current_values);
                    if (typeof count_query_r['stock'] != 'undefined') {
                        delete count_query_r['stock'];
                    }
                    var instock_g = WoofTurboMode.get_query(
                        count_query_r,
                        WoofTurboMode.possible_terms,
                        true
                    );

                    var res = alasql(
                        'SELECT COLUMN parent FROM ? AS d WHERE ' +
                            instock_g +
                            " AND (parent!='-1' AND stock='outofstock')",
                        [woof_turbo_mode_file]
                    );
                    res = res.filter((v, i, a) => a.indexOf(v) === i);
                    if (res.length) {
                        query =
                            "( (stock='instock' ) OR check_id(id," +
                            res +
                            ')=true )';
                    } else {
                        query = " (stock='instock')";
                    }
                }

                break;
            case 'onsales':
                query =
                    ' (id = ANY(' +
                    Object.values(settings.ids).join(',') +
                    ') )';
                break;
            case 'backorder':
                query = " (meta_data->_stock_status !='onbackorder') ";
                break;
            case 'min_rating':
                query =
                    "(meta_data->_wc_average_rating BETWEEN '" +
                    parseFloat(data) +
                    "' AND '" +
                    (parseFloat(data) + 1.1) +
                    "' )";
                break;
            case 'woof_text':
                data = data.replace(new RegExp('%20', 'g'), ' ');
                var text_array = data.split(' ');
                var text_query = [];

                if (settings['search_by_full_word']) {
                    jQuery.each(text_array, function (i, item) {
                        text_query.push(" title LIKE '%" + item + "%' ");
                    });
                } else {
                    jQuery.each(text_array, function (i, item) {
                        text_query.push(" title ='" + item + "' ");
                    });
                }
                query = ' (' + text_query.join(' OR ') + ') ';

                break;

            case 'max_price':
                var min_price = woof_current_values.min_price;
                if (min_price == undefined) {
                    min_price = 0;
                }
                query =
                    '( (get_min_price(d.price) BETWEEN ' +
                    min_price +
                    ' AND ' +
                    data +
                    ') OR (get_max_price(d.price) BETWEEN ' +
                    min_price +
                    ' AND ' +
                    data +
                    ')) ';
                break;
        }
        return query;
    };
    this.without_variation = function () {
        return '( parent=-1 )';
    };
    /* end generate queries */

    /* price */
    alasql.fn.get_max_price = function (_prices) {
        /*init function*/
        var price = WoofTurboMode.get_price_limits(_prices);
        return price['max'];
    };
    alasql.fn.get_min_price = function (_prices) {
        /*init function*/
        var price = WoofTurboMode.get_price_limits(_prices);
        return price['min'];
    };
    this.get_price_limits = function (prices) {
        var result = [];

        result['min'] = 0.0;
        result['max'] = 0.0;
        if (prices == undefined) {
            return result;
        }
        if (prices.length == 1) {
            if (
                prices[0]['sale'] != '' &&
                prices[0]['sale'] != null &&
                parseFloat(prices[0]['sale']) < parseFloat(prices[0]['regular'])
            ) {
                result['min'] = result['max'] = prices[0]['sale'];
            } else {
                result['min'] = result['max'] = prices[0]['regular'];
            }
        } else if (prices.length > 1) {
            var min = 0.0;
            var max = 0.0;
            max = min = prices[0]['regular'];
            jQuery.each(prices, function (key, val) {
                var curr_price = 0.0;
                if (
                    val['sale'] != '' &&
                    val['sale'] != null &&
                    parseFloat(val['sale']) < parseFloat(val['regular'])
                ) {
                    curr_price = parseFloat(val['sale']);
                } else {
                    curr_price = parseFloat(val['regular']);
                }
                if (curr_price < min) {
                    min = curr_price;
                }
                if (curr_price > max) {
                    max = curr_price;
                }
            });
            result['min'] = min;
            result['max'] = max;
        }
        return result;
    };
    /* end price */
    /* visibility */
    alasql.fn.get_visibility = function (_taxonomies, search) {
        /*init function*/
        var show = true;
        if (typeof _taxonomies['product_visibility'] != 'undefined') {
            if (
                jQuery.inArray(
                    'exclude-from-catalog',
                    _taxonomies['product_visibility']
                ) > -1 &&
                !search
            ) {
                show = false;
            }
            if (
                jQuery.inArray(
                    'exclude-from-search',
                    _taxonomies['product_visibility']
                ) > -1 &&
                search
            ) {
                show = false;
            }
        }
        return show;
    };
    /* In array for alasql */
    alasql.fn.check_id = function (id, ids) {
        /*init function*/
        var show = true;
        if (jQuery.inArray(id, ids) > -1) {
            show = false;
        }
        show = false;
        return show;
    };

    this.search = function (query, recount) {
        return this.do_query(
            this.get_query(query, this.possible_terms, false, recount)
        );
    };
    /* recount */
    this.add_query_recount = function (query, key, value) {
        if (query[key] != undefined) {
            return query[key] + ',' + value;
        } else {
            return (query[key] = value);
        }
    };

    this.dynamic_recount_special = function (query) {
        /* not used*/

        var filters = jQuery('.woof .woof_redraw_zone');

        var _this_obj = this;
        jQuery.each(filters, function (index, filter) {
            var items = jQuery(filter).find('.woof_container');
            var count = 0;
            jQuery.each(items, function (i, item) {
                /*radio and  checkbox*/
                if (
                    jQuery(item).hasClass('woof_container_radio') ||
                    jQuery(item).hasClass('woof_container_checkbox') ||
                    jQuery(item).hasClass('woof_container_select_radio_check')
                ) {
                    count = 0;
                    jQuery.each(
                        jQuery(item).find("input[type='radio']"),
                        function (i, input) {
                            var term = jQuery(input).data('slug');
                            var tax = jQuery(input).attr('name');

                            var count_query_r = {};
                            if (typeof woof_current_values == 'object') {
                                count_query_r = Object.assign(
                                    {},
                                    woof_current_values
                                );
                            } else {
                                count_query_r = Object.assign(
                                    {},
                                    JSON.parse(woof_current_values)
                                );
                            }

                            if (
                                woof_current_values[tax] != undefined &&
                                woof_current_values[tax] == term
                            ) {
                                return true;
                            }
                            count_query_r[tax] = term;
                            var res = _this_obj.search(count_query_r);

                            var parent_li = jQuery(input).closest('li');
                            var item_label =
                                jQuery(parent_li).find('.woof_radio_label')[0];

                            if (res.length <= 0) {
                                jQuery(item_label)
                                    .parent()
                                    .addClass('woof_turbo_hide');
                            } else {
                                count++;
                                jQuery(item_label)
                                    .parent()
                                    .removeClass('woof_turbo_hide');
                            }
                            jQuery(item_label)
                                .find('.woof_turbo_count')
                                .remove();
                            jQuery(item_label).append(
                                "<span class='woof_turbo_count'>(" +
                                    res.length +
                                    ')</span>'
                            );
                        }
                    );

                    jQuery.each(
                        jQuery(item).find("input[type='checkbox']"),
                        function (i, input) {
                            var tax = jQuery(input).data('tax');
                            var term = jQuery(input).attr('name');
                            if (woof_current_values[tax] != undefined) {
                                var arr_terms =
                                    woof_current_values[tax].split(',');
                                if (jQuery.inArray(term, arr_terms) != -1) {
                                    return true;
                                }
                            }

                            var count_query = {};
                            if (typeof woof_current_values == 'object') {
                                count_query = Object.assign(
                                    {},
                                    woof_current_values
                                );
                            } else {
                                count_query = Object.assign(
                                    {},
                                    JSON.parse(woof_current_values)
                                );
                            }

                            var logic = 'OR';
                            if (
                                _this_obj.filter_settings.comparison_logic[
                                    tax
                                ] != undefined
                            ) {
                                logic =
                                    _this_obj.filter_settings.comparison_logic[
                                        tax
                                    ];
                            }

                            if (
                                woof_current_values[tax] != undefined &&
                                logic == 'AND'
                            ) {
                                count_query[tax] =
                                    count_query[tax] + ',' + term;
                            } else {
                                count_query[tax] = term;
                            }

                            var res = _this_obj.search(count_query);

                            var parent_li = jQuery(input).closest('li');
                            var item_label = jQuery(parent_li).find(
                                '.woof_checkbox_label'
                            )[0];

                            if (res.length <= 0) {
                                jQuery(item_label)
                                    .parent()
                                    .addClass('woof_turbo_hide');
                            } else {
                                count++;
                                jQuery(item_label)
                                    .parent()
                                    .removeClass('woof_turbo_hide');
                            }
                            jQuery(item_label)
                                .find('.woof_turbo_count')
                                .remove();
                            jQuery(item_label).append(
                                "<span class='woof_turbo_count'>(" +
                                    res.length +
                                    ')</span>'
                            );
                        }
                    );
                    if (count == 0) {
                        jQuery(item).hide();
                    } else {
                        jQuery(item).show();
                    }
                }

                /*meta checkbox*/
                if (jQuery(item).hasClass('woof_meta_checkbox_container')) {
                    count = 0;
                    jQuery.each(
                        jQuery(item).find("input[type='checkbox']"),
                        function (i, input) {
                            var val = jQuery(input).val();
                            var meta = jQuery(input).attr('name');

                            var count_query = {};
                            if (typeof woof_current_values == 'object') {
                                count_query = Object.assign(
                                    {},
                                    woof_current_values
                                );
                            } else {
                                count_query = Object.assign(
                                    {},
                                    JSON.parse(woof_current_values)
                                );
                            }

                            if (
                                woof_current_values[meta] != undefined &&
                                woof_current_values[meta] == val
                            ) {
                                return true;
                            }
                            var logic = 'OR';
                            if (
                                _this_obj.filter_settings.comparison_logic[
                                    meta
                                ] != undefined
                            ) {
                                logic =
                                    _this_obj.filter_settings.comparison_logic[
                                        meta
                                    ];
                            }

                            if (
                                woof_current_values[meta] != undefined &&
                                logic == 'AND'
                            ) {
                                count_query[meta] =
                                    count_query[meta] + ',' + val;
                            } else {
                                count_query[meta] = val;
                            }
                            var res = _this_obj.search(count_query);

                            var item_label = jQuery(input)
                                .parents('.woof_container_inner')
                                .find('label');
                            if (res.length <= 0) {
                                jQuery(item_label)
                                    .parent()
                                    .addClass('woof_turbo_hide');
                            } else {
                                count++;
                                jQuery(item_label)
                                    .parent()
                                    .removeClass('woof_turbo_hide');
                            }
                            jQuery(item_label)
                                .find('.woof_turbo_count')
                                .remove();
                            jQuery(item_label).append(
                                "<span class='woof_turbo_count'>(" +
                                    res.length +
                                    ')</span>'
                            );
                        }
                    );
                    if (count == 0) {
                        jQuery(item).hide();
                    } else {
                        jQuery(item).show();
                    }
                }

                /*drop down*/
                if (
                    jQuery(item).hasClass('woof_container_select') ||
                    jQuery(item).hasClass('woof_container_mselect') ||
                    jQuery(item).hasClass('woof_meta_select_container') ||
                    jQuery(item).hasClass('woof_meta_mselect_container') ||
                    jQuery(item).hasClass('woof_author_search_container') ||
                    jQuery(item).hasClass('woof_by_rating_container')
                ) {
                    count = 0;
                    var choosen = jQuery(item)
                        .parent()
                        .find('.chosen-container');
                    var tax = jQuery(item).find('select').attr('name');

                    jQuery.each(
                        jQuery(item).find('select option'),
                        function (i, option) {
                            if (
                                i != 0 ||
                                jQuery(item).hasClass(
                                    'woof_meta_mselect_container'
                                )
                            ) {
                                var term = jQuery(option).val();
                                if (woof_current_values[tax] != undefined) {
                                    var arr_terms =
                                        woof_current_values[tax].split(',');
                                    if (jQuery.inArray(term, arr_terms) != -1) {
                                        return true;
                                    }
                                }

                                var count_query = {};
                                if (typeof woof_current_values == 'object') {
                                    count_query = Object.assign(
                                        {},
                                        woof_current_values
                                    );
                                } else {
                                    count_query = Object.assign(
                                        {},
                                        JSON.parse(woof_current_values)
                                    );
                                }

                                var logic = 'OR';
                                if (
                                    _this_obj.filter_settings.comparison_logic[
                                        tax
                                    ] != undefined
                                ) {
                                    logic =
                                        _this_obj.filter_settings
                                            .comparison_logic[tax];
                                }

                                if (
                                    count_query[tax] != undefined &&
                                    logic == 'AND'
                                ) {
                                    count_query[tax] =
                                        count_query[tax] + ',' + term;
                                } else {
                                    count_query[tax] = term;
                                }

                                //var res = _this_obj.search(count_query);
                                var res = [1, 2, 3];

                                var count_prev = jQuery(option).data('count');
                                jQuery(option).attr('data-count', res.length);
                                var txt = jQuery(option).text();
                                txt = txt.replace(/\(.*?\)/g, '');
                                txt = txt.replace(/\s*$/, '');

                                jQuery(option).text(
                                    txt + ' (' + res.length + ')'
                                );
                                if (res.length <= 0) {
                                    jQuery(option).addClass('woof_turbo_hide');
                                } else {
                                    count++;
                                    jQuery(option).removeClass(
                                        'woof_turbo_hide'
                                    );
                                }
                            }
                        }
                    );
                    if (count == 0) {
                        jQuery(item).hide();
                    } else {
                        jQuery(item).show();
                    }
                }
                /*slider*/
                if (jQuery(item).hasClass('woof_container_slider')) {
                    var item_slider = jQuery(item).find(
                        'input.woof_taxrange_slider'
                    );
                    var tax = jQuery(item_slider).data('tax');
                    if (woof_current_values[tax] == undefined) {
                        var terms = jQuery(item_slider)
                            .data('values')
                            .split(',');
                        count = 0;
                        jQuery.each(terms, function (i, item) {
                            var count_query = {};
                            if (typeof woof_current_values == 'object') {
                                count_query = Object.assign(
                                    {},
                                    woof_current_values
                                );
                            } else {
                                count_query = Object.assign(
                                    {},
                                    JSON.parse(woof_current_values)
                                );
                            }

                            count_query[tax] = item;
                            var res = _this_obj.search(count_query);
                            if (res.length != 0) {
                                count++;
                            }
                        });
                        if (count == 0) {
                            jQuery(item).addClass('woof_turbo_hide');
                        } else {
                            jQuery(item).removeClass('woof_turbo_hide');
                        }
                    } else {
                        jQuery(item).removeClass('woof_turbo_hide');
                    }
                }
                /*meta slider*/
                if (jQuery(item).hasClass('woof_meta_slider_container')) {
                    var item_slider = jQuery(item).find(
                        'input.woof_metarange_slider'
                    );
                    var meta = jQuery(item_slider).attr('name');
                    if (woof_current_values[meta] == undefined) {
                        var from = jQuery(item_slider).data('min');
                        var to = jQuery(item_slider).data('max');
                        var count_query = {};
                        if (typeof woof_current_values == 'object') {
                            count_query = Object.assign(
                                {},
                                woof_current_values
                            );
                        } else {
                            var count_query = Object.assign(
                                {},
                                JSON.parse(woof_current_values)
                            );
                        }

                        count_query[meta] = from + '-' + to;

                        var res = _this_obj.search(count_query);

                        if (res.length == 0) {
                            jQuery(item).addClass('woof_turbo_hide');
                        } else {
                            jQuery(item).removeClass('woof_turbo_hide');
                        }
                    } else {
                        jQuery(item).removeClass('woof_turbo_hide');
                    }
                }
                /*color and  image*/
                if (
                    jQuery(item).hasClass('woof_container_color') ||
                    jQuery(item).hasClass('woof_container_image')
                ) {
                    var terms = jQuery(item).find('input.woof_color_term');
                    if (!terms.length) {
                        terms = jQuery(item).find('input.woof_image_term');
                    }
                    count = 0;
                    jQuery.each(terms, function (i, input) {
                        var tax = jQuery(input).data('tax');
                        var val = jQuery(input).attr('name');

                        var count_query = {};
                        if (typeof woof_current_values == 'object') {
                            count_query = Object.assign(
                                {},
                                woof_current_values
                            );
                        } else {
                            count_query = Object.assign(
                                {},
                                JSON.parse(woof_current_values)
                            );
                        }

                        var logic = 'OR';
                        if (
                            _this_obj.filter_settings.comparison_logic[tax] !=
                            undefined
                        ) {
                            logic =
                                _this_obj.filter_settings.comparison_logic[tax];
                        }

                        if (count_query[tax] != undefined && logic == 'AND') {
                            count_query[tax] = count_query[tax] + ',' + val;
                        } else {
                            count_query[tax] = val;
                        }

                        var res = _this_obj.search(count_query);

                        var item_label = jQuery(input)
                            .parents('li')
                            .find('.woof_tooltip_data');

                        if (res.length <= 0) {
                            jQuery(input)
                                .parents('li')
                                .addClass('woof_turbo_hide');
                        } else {
                            count++;
                            jQuery(input)
                                .parents('li')
                                .removeClass('woof_turbo_hide');
                        }
                        jQuery(item_label).find('.woof_turbo_count').remove();
                        jQuery(item_label).append(
                            "<span class='woof_turbo_count'>(" +
                                res.length +
                                ')</span>'
                        );
                    });
                    if (count == 0) {
                        jQuery(item).hide();
                    } else {
                        jQuery(item).show();
                    }
                }
                /*label*/
                if (jQuery(item).hasClass('woof_container_label')) {
                    var terms = jQuery(item).find('input.woof_label_term');
                    count = 0;
                    jQuery.each(terms, function (i, input) {
                        var tax = jQuery(input).data('tax');
                        var val = jQuery(input).attr('name');
                        var count_query = {};
                        if (typeof woof_current_values == 'object') {
                            count_query = Object.assign(
                                {},
                                woof_current_values
                            );
                        } else {
                            count_query = Object.assign(
                                {},
                                JSON.parse(woof_current_values)
                            );
                        }

                        var logic = 'OR';
                        if (
                            _this_obj.filter_settings.comparison_logic[tax] !=
                            undefined
                        ) {
                            logic =
                                _this_obj.filter_settings.comparison_logic[tax];
                        }

                        if (count_query[tax] != undefined && logic == 'AND') {
                            count_query[tax] = count_query[tax] + ',' + val;
                        } else {
                            count_query[tax] = val;
                        }

                        var res = _this_obj.search(count_query);
                        var li_item = jQuery(input).parents('li');
                        if (res.length <= 0) {
                            jQuery(li_item).addClass('woof_turbo_hide');
                        } else {
                            count++;
                            jQuery(li_item).removeClass('woof_turbo_hide');
                        }
                        jQuery(li_item).find('.woof_label_count').remove();
                        jQuery(li_item).prepend(
                            "<span class='woof_label_count'>" +
                                res.length +
                                '</span>'
                        );
                    });
                    if (count == 0) {
                        jQuery(item).hide();
                    } else {
                        jQuery(item).show();
                    }
                }
            });
        });

        woof_reinit_selects();

        if (Object.keys(woof_current_values).length == 0) {
            jQuery('.woof_reset_search_form').hide();
        } else {
            jQuery('.woof_reset_search_form').show();
        }
        return;
    };
    this.dynamic_recount = function (query) {
        var filters = jQuery('.woof .woof_redraw_zone');
        var filters_data = {};
        var _this_obj = this;
        jQuery.each(filters, function (index, filter) {
            var items = jQuery(filter).find('.woof_container');
            var count = 0;
            filters_data[index] = {};
            jQuery.each(items, function (index_f, item) {
                filters_data[index][index_f] = {};
                /*radio and  checkbox*/
                if (
                    jQuery(item).hasClass('woof_container_radio') ||
                    jQuery(item).hasClass('woof_container_checkbox') ||
                    jQuery(item).hasClass('woof_container_select_radio_check')
                ) {
                    jQuery.each(
                        jQuery(item).find("input[type='radio']"),
                        function (i, input) {
                            var term = jQuery(input).data('slug');
                            var tax = jQuery(input).attr('name');
                            var current = false;
                            var count_query_r = {};
                            if (typeof query == 'object') {
                                count_query_r = Object.assign({}, query);
                            } else {
                                count_query_r = Object.assign(
                                    {},
                                    JSON.parse(query)
                                );
                            }

                            if (query[tax] != undefined && query[tax] == term) {
                                current = true;
                            }
                            count_query_r[tax] = term;

                            var parent_li = jQuery(input).closest('li');
                            var item_label =
                                jQuery(parent_li).find('.woof_radio_label')[0];
                            filters_data[index][index_f][i] = {};
                            filters_data[index][index_f][i] = {
                                key: tax,
                                val: term,
                                type: 'radio',
                                query: Object.assign({}, count_query_r),
                                label: item_label,
                                current: current,
                                count: 0,
                            };
                        }
                    );
                    jQuery.each(
                        jQuery(item).find("input[type='checkbox']"),
                        function (i, input) {
                            var tax = jQuery(input).data('tax');
                            var term = jQuery(input).attr('name');
                            var current = false;
                            if (query[tax] != undefined) {
                                var arr_terms = query[tax].split(',');
                                if (jQuery.inArray(term, arr_terms) != -1) {
                                    return true;
                                }
                            }

                            var count_query = {};
                            if (typeof query == 'object') {
                                count_query = Object.assign({}, query);
                            } else {
                                count_query = Object.assign(
                                    {},
                                    JSON.parse(query)
                                );
                            }

                            var logic = 'OR';
                            if (
                                _this_obj.filter_settings.comparison_logic[
                                    tax
                                ] != undefined
                            ) {
                                logic =
                                    _this_obj.filter_settings.comparison_logic[
                                        tax
                                    ];
                            }

                            if (query[tax] != undefined) {
                                var match = jQuery.inArray(
                                    term,
                                    count_query[tax].split(',')
                                );
                                if (match != -1) {
                                    current = true;
                                }
                            }

                            if (query[tax] != undefined && logic == 'AND') {
                                count_query[tax] =
                                    count_query[tax] + ',' + term;
                            } else {
                                count_query[tax] = term;
                            }
                            var parent_li = jQuery(input).closest('li');
                            var item_label = jQuery(parent_li).find(
                                '.woof_checkbox_label'
                            )[0];
                            filters_data[index][index_f][i] = {};
                            filters_data[index][index_f][i] = {
                                key: tax,
                                val: term,
                                type: 'checkbox',
                                query: Object.assign({}, count_query),
                                label: item_label,
                                current: current,
                                count: 0,
                            };
                        }
                    );
                }

                /*meta checkbox*/
                if (jQuery(item).hasClass('woof_meta_checkbox_container')) {
                    jQuery.each(
                        jQuery(item).find("input[type='checkbox']"),
                        function (i, input) {
                            var val = jQuery(input).val();
                            var meta = jQuery(input).attr('name');
                            var current = false;
                            var count_query = {};
                            if (typeof query == 'object') {
                                count_query = Object.assign({}, query);
                            } else {
                                count_query = Object.assign(
                                    {},
                                    JSON.parse(query)
                                );
                            }

                            if (
                                query[meta] != undefined &&
                                query[meta] == val
                            ) {
                                current = true;
                            }
                            var logic = 'OR';
                            if (
                                _this_obj.filter_settings.comparison_logic[
                                    meta
                                ] != undefined
                            ) {
                                logic =
                                    _this_obj.filter_settings.comparison_logic[
                                        meta
                                    ];
                            }

                            if (query[meta] != undefined && logic == 'AND') {
                                count_query[meta] =
                                    count_query[meta] + ',' + val;
                            } else {
                                count_query[meta] = val;
                            }

                            var item_label = jQuery(input)
                                .parents('.woof_container_inner')
                                .find('label');
                            filters_data[index][index_f][i] = {};
                            filters_data[index][index_f][i] = {
                                key: meta,
                                val: val,
                                type: 'meta_checkbox',
                                query: Object.assign({}, count_query),
                                label: item_label,
                                current: current,
                                count: 0,
                            };
                        }
                    );
                }
                /* meta datepicker */
                if (jQuery(item).hasClass('woof_meta_datepicker_container')) {
                    var val = 1;
                    var meta = jQuery(item)
                        .find('input.woof_calendar_from')
                        .data('meta-key');

                    var current = false;
                    var count_query = {};
                    if (typeof query == 'object') {
                        count_query = Object.assign({}, query);
                    } else {
                        count_query = Object.assign({}, JSON.parse(query));
                    }

                    if (query['datepicker_' + meta] != undefined) {
                        current = true;
                    }

                    if (query[meta] == undefined) {
                        count_query['datepicker_' + meta] =
                            '0-' + Number.MAX_VALUE;
                    }

                    filters_data[index][index_f][0] = {};
                    filters_data[index][index_f][0] = {
                        key: 'datepicker_' + meta,
                        val: val,
                        type: 'meta_datepicker',
                        query: Object.assign({}, count_query),
                        label: item,
                        current: current,
                        count: 0,
                    };
                }
                /*drop down*/
                if (
                    jQuery(item).hasClass('woof_container_select') ||
                    jQuery(item).hasClass('woof_container_mselect') ||
                    jQuery(item).hasClass('woof_meta_select_container') ||
                    jQuery(item).hasClass('woof_meta_mselect_container') ||
                    jQuery(item).hasClass('woof_author_search_container') ||
                    jQuery(item).hasClass('woof_by_rating_container')
                ) {
                    var choosen = jQuery(item)
                        .parent()
                        .find('.chosen-container');
                    var tax = jQuery(item).find('select').attr('name');
                    jQuery.each(
                        jQuery(item).find('select option'),
                        function (i, option) {
                            var current = false;
                            if (
                                i != 0 ||
                                jQuery(item).hasClass(
                                    'woof_meta_mselect_container'
                                )
                            ) {
                                var term = jQuery(option).val();
                                if (query[tax] != undefined) {
                                    var arr_terms = query[tax].split(',');
                                    if (jQuery.inArray(term, arr_terms) != -1) {
                                        //return true;
                                    }
                                }

                                var count_query = {};
                                if (typeof query == 'object') {
                                    count_query = Object.assign({}, query);
                                } else {
                                    count_query = Object.assign(
                                        {},
                                        JSON.parse(query)
                                    );
                                }

                                var logic = 'OR';
                                if (
                                    _this_obj.filter_settings.comparison_logic[
                                        tax
                                    ] != undefined
                                ) {
                                    logic =
                                        _this_obj.filter_settings
                                            .comparison_logic[tax];
                                }
                                if (count_query[tax] != undefined) {
                                    var match = jQuery.inArray(
                                        term,
                                        count_query[tax].split(',')
                                    );
                                    if (match != -1) {
                                        current = true;
                                    }
                                }
                                if (
                                    count_query[tax] != undefined &&
                                    logic == 'AND'
                                ) {
                                    count_query[tax] =
                                        count_query[tax] + ',' + term;
                                } else {
                                    count_query[tax] = term;
                                }
                                filters_data[index][index_f][i] = {};
                                filters_data[index][index_f][i] = {
                                    key: tax,
                                    val: term,
                                    type: 'drop_down',
                                    query: Object.assign({}, count_query),
                                    label: option,
                                    current: current,
                                    count: 0,
                                };
                            }
                        }
                    );
                }
                /*slider*/
                if (jQuery(item).hasClass('woof_container_slider')) {
                    var item_slider = jQuery(item).find(
                        'input.woof_taxrange_slider'
                    );
                    var tax = jQuery(item_slider).data('tax');
                    var current = false;
                    if (query[tax] != undefined) {
                        current = true;
                    }
                    var terms = jQuery(item_slider).data('values');
                    var count_query = {};
                    if (typeof query == 'object') {
                        count_query = Object.assign({}, query);
                    } else {
                        count_query = Object.assign({}, JSON.parse(query));
                    }
                    count_query[tax] = terms;
                    filters_data[index][index_f][0] = {};
                    filters_data[index][index_f][0] = {
                        key: tax,
                        val: terms,
                        type: 'slider',
                        query: Object.assign({}, count_query),
                        label: item_slider,
                        current: current,
                        count: 0,
                    };
                }
                /*meta slider*/
                if (jQuery(item).hasClass('woof_meta_slider_container')) {
                    var item_slider = jQuery(item).find(
                        'input.woof_metarange_slider'
                    );
                    var meta = jQuery(item_slider).attr('name');
                    var current = false;
                    if (query[meta] != undefined) {
                        current = true;
                    }

                    var from = jQuery(item_slider).data('min');
                    var to = jQuery(item_slider).data('max');
                    var count_query = {};
                    if (typeof query == 'object') {
                        count_query = Object.assign({}, query);
                    } else {
                        var count_query = Object.assign({}, JSON.parse(query));
                    }
                    count_query[meta] = from + '^' + to;

                    filters_data[index][index_f][0] = {};
                    filters_data[index][index_f][0] = {
                        key: meta,
                        val: from + '-' + to,
                        type: 'meta_slider',
                        query: Object.assign({}, count_query),
                        label: item_slider,
                        current: current,
                        count: 0,
                    };
                }
                /*color and  image*/
                if (
                    jQuery(item).hasClass('woof_container_color') ||
                    jQuery(item).hasClass('woof_container_image')
                ) {
                    var terms = jQuery(item).find('input.woof_color_term');

                    if (!terms.length) {
                        terms = jQuery(item).find('input.woof_image_term');
                    }
                    count = 0;
                    jQuery.each(terms, function (i, input) {
                        var tax = jQuery(input).data('tax');
                        var val = jQuery(input).attr('name');
                        var current = false;
                        var count_query = {};
                        if (typeof query == 'object') {
                            count_query = Object.assign({}, query);
                        } else {
                            count_query = Object.assign({}, JSON.parse(query));
                        }

                        var logic = 'OR';
                        if (
                            _this_obj.filter_settings.comparison_logic[tax] !=
                            undefined
                        ) {
                            logic =
                                _this_obj.filter_settings.comparison_logic[tax];
                        }
                        if (query[tax] != undefined) {
                            var match = jQuery.inArray(
                                val,
                                count_query[tax].split(',')
                            );
                            if (match != -1) {
                                current = true;
                            }
                        }
                        if (count_query[tax] != undefined && logic == 'AND') {
                            count_query[tax] = count_query[tax] + ',' + val;
                        } else {
                            count_query[tax] = val;
                        }

                        filters_data[index][index_f][i] = {};
                        filters_data[index][index_f][i] = {
                            key: tax,
                            val: val,
                            type: 'color_image',
                            query: Object.assign({}, count_query),
                            label: input,
                            current: current,
                            count: 0,
                        };
                    });
                }
                /*label*/
                if (jQuery(item).hasClass('woof_container_label')) {
                    var terms = jQuery(item).find('input.woof_label_term');
                    jQuery.each(terms, function (i, input) {
                        var current = false;
                        var tax = jQuery(input).data('tax');
                        var val = jQuery(input).attr('name');
                        var count_query = {};
                        if (typeof query == 'object') {
                            count_query = Object.assign({}, query);
                        } else {
                            count_query = Object.assign({}, JSON.parse(query));
                        }

                        var logic = 'OR';
                        if (
                            _this_obj.filter_settings.comparison_logic[tax] !=
                            undefined
                        ) {
                            logic =
                                _this_obj.filter_settings.comparison_logic[tax];
                        }

                        if (query[tax] != undefined) {
                            var match = jQuery.inArray(
                                val,
                                count_query[tax].split(',')
                            );
                            if (match != -1) {
                                current = true;
                            }
                        }

                        if (count_query[tax] != undefined && logic == 'AND') {
                            count_query[tax] = count_query[tax] + ',' + val;
                        } else {
                            count_query[tax] = val;
                        }
                        var li_item = jQuery(input).parents('li');

                        filters_data[index][index_f][i] = {};
                        filters_data[index][index_f][i] = {
                            key: tax,
                            val: val,
                            type: 'label',
                            query: Object.assign({}, count_query),
                            label: li_item,
                            current: current,
                            count: 0,
                        };
                    });
                }
            });
        });
        return filters_data;
    };
    /* end recount*/

    /* compatybility*/
    this.check_messenger_btn = function (_this) {
        if (
            typeof _this.filter_settings.products_messenger != 'undefined' &&
            _this.filter_settings.products_messenger.show_btn_subscr == '0'
        ) {
            if (
                Object.keys(woof_current_values).length != 0 &&
                (typeof woof_current_values.swoof != 'udefined' ||
                    typeof woof_current_values[
                        _this.filter_settings.swoof_search_slug
                    ] != 'udefined')
            ) {
                jQuery('#woof_add_subscr').show();
            } else {
                jQuery('#woof_add_subscr').hide();
            }
        }
    };
    this.check_save_query_btn = function (_this) {
        if (typeof _this.filter_settings.products_messenger != 'undefined') {
            if (
                Object.keys(woof_current_values).length != 0 &&
                (typeof woof_current_values.swoof != 'udefined' ||
                    typeof woof_current_values[
                        _this.filter_settings.swoof_search_slug
                    ] != 'udefined')
            ) {
                jQuery('.woof_add_query_count').show();
            } else {
                jQuery('.woof_add_query_count').hide();
            }
        }
    };
    this.check_show_more_less = function (_this, tax) {
        if (
            typeof _this.filter_settings.not_toggled_terms_count[tax] !=
                'undefined' &&
            parseInt(_this.filter_settings.not_toggled_terms_count[tax]) > 0
        ) {
            var count = parseInt(
                _this.filter_settings.not_toggled_terms_count[tax]
            );
            var items = jQuery(
                '.woof_container_' + tax + ' .woof_list'
            ).children('li');
            var state = jQuery('.woof_container_' + tax)
                .find('.woof_open_hidden_li_btn')
                .data('state');
            jQuery(items)
                .removeClass('woof_hidden_term')
                .removeClass('woof_hidden_term2');
            jQuery.each(items, function (i, item) {
                if (!jQuery(item).hasClass('woof_turbo_hide')) {
                    count--;
                }
                if (count < 0) {
                    if (state == 'closed') {
                        jQuery(item).addClass('woof_hidden_term');
                    } else {
                        jQuery(item).addClass('woof_hidden_term2');
                    }
                }
            });
            if (count >= -1) {
                jQuery('.woof_container_' + tax)
                    .find('.woof_open_hidden_li_btn')
                    .hide();
            } else {
                jQuery('.woof_container_' + tax)
                    .find('.woof_open_hidden_li_btn')
                    .show();
            }
        }
    };
    /* end  compatybility*/

    this.woof_submit_link = function (link) {
        if (!woof_turbo_mode_file.length) {
            /*If the file did not have time to load*/
            this.uploadFile();
            setTimeout("this.woof_submit_link('" + link + "')", 2000);
            return;
        }
        woof_submit_link_locked = true;

        if (!woof_ajax_redraw) {
            var res_array = this.search(woof_current_values, false);
            var res = res_array.join(',');
            if (res.length < 1) {
                res = -1;
            }

            var shortcode = jQuery('#woof_results_by_ajax').data('shortcode');
            if (typeof shortcode == 'undefined') {
                window.location = link;
                return false;
            }

            /****/
            woof_show_info_popup(woof_lang_loading);
            woof_ajax_first_done = true;
            var data = {
                action: 'woof_draw_products',
                link: link,
                turbo_mode_ids: res,
                page: woof_ajax_page_num,
                shortcode: shortcode,
                woof_shortcode: jQuery('div.woof').data('shortcode'),
                nonce_filter: woof_front_nonce,
            };

            jQuery.post(woof_ajaxurl, data, function (content) {
                content = JSON.parse(content);

                if (jQuery('.woof_results_by_ajax_shortcode').length) {
                    jQuery('#woof_results_by_ajax').replaceWith(
                        content.products
                    );
                } else {
                    jQuery('.woof_shortcode_output').replaceWith(
                        content.products
                    );
                }
                woof_hide_info_popup();
                if (woof_reset_btn_action) {
                    jQuery('div.woof_redraw_zone').replaceWith(
                        jQuery(content.form).find('.woof_redraw_zone')
                    );
                    woof_mass_reinit();
                }

                if (typeof content.additional_fields != 'undefined') {
                    jQuery.each(
                        content.additional_fields,
                        function (selector, html_data) {
                            if (
                                typeof woof_additional_fields[selector] ==
                                'undefined'
                            ) {
                                woof_additional_fields[selector] =
                                    jQuery(selector);
                            }
                            jQuery(selector).replaceWith(html_data);
                        }
                    );
                    //draw old  values
                    jQuery.each(
                        woof_additional_fields,
                        function (selector, html_data_old) {
                            if (
                                typeof content.additional_fields[selector] ==
                                'undefined'
                            ) {
                                jQuery(selector).replaceWith(html_data_old);
                            }
                        }
                    );
                }
                woof_draw_products_top_panel();

                woof_submit_link_locked = false;
                /*removing id woof_results_by_ajax - multi in ajax mode sometimes*/
                /*when uses shorcode woof_products in ajax and in settings try ajaxify shop is Yes*/
                jQuery.each(
                    jQuery('#woof_results_by_ajax'),
                    function (index, item) {
                        if (index == 0) {
                            return;
                        }
                        jQuery(item).removeAttr('id');
                    }
                );

                /* compatibility found products count*/
                var found_count = jQuery('.woof_found_count');
                jQuery(found_count).show();
                if (found_count.length > 0) {
                    var count_prod = jQuery('#woof_results_by_ajax').data(
                        'count'
                    );
                    if (typeof count_prod != 'undefined') {
                        jQuery(found_count).text(count_prod);
                    }
                }

                //infinite scroll
                woof_infinite();
                //*** script after ajax loading here
                woof_js_after_ajax_done();
                //***  change  link  in button "add to cart"
                woof_change_link_addtocart();
                /*tooltip*/
                woof_init_tooltip();

                jQuery('.woof').removeClass('woof_show_filter_for_mobile');

                //messenger    extension
                WoofTurboMode.check_messenger_btn(WoofTurboMode);

                //save query  extension
                WoofTurboMode.check_save_query_btn(WoofTurboMode);
                /*dynamic recount*/
                if (
                    (WoofTurboMode.show_count &&
                        WoofTurboMode.dynamic_recount_val) ||
                    (woof_reset_btn_action && WoofTurboMode.show_count)
                ) {
                    var filters =
                        WoofTurboMode.dynamic_recount(woof_current_values);

                    jQuery.each(filters, function (i, filter) {
                        jQuery('.woof_turbo_mode_overlay').show();
                        var filter_count = 0;
                        jQuery.each(filter, function (ind, items) {
                            var count = 0;
                            var last = false;
                            if (Object.keys(items).length) {
                                filter_count = ind;
                            }

                            jQuery.each(items, function (indx, item) {
                                /* split streams */
                                setTimeout(function () {
                                    last = false;
                                    var res = {};

                                    if (!item.current) {
                                        var recount = false;
                                        if (
                                            typeof item.key != 'undefined' &&
                                            typeof WoofTurboMode.possible_terms
                                                .taxonomies[
                                                item.key.replace('rev_', '')
                                            ] != 'undefined' &&
                                            WoofTurboMode.possible_terms
                                                .taxonomies[
                                                item.key.replace('rev_', '')
                                            ] == 'NOT IN'
                                        ) {
                                            recount = true;
                                        }
                                        res = WoofTurboMode.search(
                                            item.query,
                                            recount
                                        );
                                        //array unique
                                        res = res.filter(
                                            (v, i, a) => a.indexOf(v) === i
                                        );
                                    } else {
                                        count++;
                                    }
                                    filters[i][ind][indx].count = res.length;
                                    if (res.length > 0) {
                                        count++;
                                    }
                                    if (
                                        typeof filters[i][ind][+indx + 1] ==
                                        'undefined'
                                    ) {
                                        last = true;
                                    }
                                    WoofTurboMode.draw_count_item(
                                        filters[i][ind][indx],
                                        count,
                                        last,
                                        WoofTurboMode
                                    );
                                    if (last && filter_count == ind) {
                                        jQuery(
                                            '.woof_turbo_mode_overlay'
                                        ).hide();
                                    }
                                    last = false;
                                }, 1);
                            });
                        });
                        //stat collection
                        if (
                            woof_current_values.hasOwnProperty(
                                swoof_search_slug
                            )
                        ) {
                            var nonce = woof_front_nonce;
                            var data = {
                                action: 'woof_write_stat',
                                woof_current_values: woof_current_values,
                                nonce_filter: nonce,
                            };
                            jQuery.post(woof_ajaxurl, data, function () {
                                //***
                            });
                        }
                    });
                } else {
                    jQuery('.woof_turbo_mode_overlay').hide();
                }
                woof_reset_btn_action = false;
            });
        } else {
            if (woof_ajax_redraw) {
                /*dynamic recount*/
                if (
                    (WoofTurboMode.show_count &&
                        WoofTurboMode.dynamic_recount_val) ||
                    (woof_reset_btn_action && WoofTurboMode.show_count)
                ) {
                    var filters =
                        WoofTurboMode.dynamic_recount(woof_current_values);
                    jQuery.each(filters, function (i, filter) {
                        jQuery('.woof_turbo_mode_overlay').show();
                        var filter_count = 0;
                        jQuery.each(filter, function (ind, items) {
                            var count = 0;
                            var last = false;
                            if (Object.keys(items).length) {
                                filter_count = ind;
                            }
                            jQuery.each(items, function (indx, item) {
                                /* split streams */
                                setTimeout(function () {
                                    last = false;
                                    var res = {};
                                    if (!item.current) {
                                        var recount = false;
                                        if (
                                            typeof item.key != 'undefined' &&
                                            typeof WoofTurboMode.possible_terms
                                                .taxonomies[
                                                item.key.replace('rev_', '')
                                            ] != 'undefined' &&
                                            WoofTurboMode.possible_terms
                                                .taxonomies[
                                                item.key.replace('rev_', '')
                                            ] == 'NOT IN'
                                        ) {
                                            recount = true;
                                        }
                                        res = WoofTurboMode.search(
                                            item.query,
                                            recount
                                        );

                                        //array unique
                                        res = res.filter(
                                            (v, i, a) => a.indexOf(v) === i
                                        );
                                    } else {
                                        count++;
                                    }
                                    filters[i][ind][indx].count = res.length;
                                    if (res.length > 0) {
                                        count++;
                                    }
                                    if (
                                        typeof filters[i][ind][+indx + 1] ==
                                        'undefined'
                                    ) {
                                        last = true;
                                    }
                                    WoofTurboMode.draw_count_item(
                                        filters[i][ind][indx],
                                        count,
                                        last,
                                        WoofTurboMode
                                    );
                                    if (last && filter_count == ind) {
                                        jQuery(
                                            '.woof_turbo_mode_overlay'
                                        ).hide();
                                        if (
                                            typeof woof_step_filter_html_items ==
                                            'function'
                                        ) {
                                            woof_step_filter_html_items();
                                        }
                                    }
                                    last = false;
                                }, 1);
                            });
                        });

                        //stat collection
                        if (
                            woof_current_values.hasOwnProperty(
                                swoof_search_slug
                            )
                        ) {
                            var nonce = woof_front_nonce;

                            var data = {
                                action: 'woof_write_stat',
                                woof_current_values: woof_current_values,
                                nonce_filter: nonce,
                            };
                            jQuery.post(woof_ajaxurl, data, function () {
                                //***
                            });
                        }
                    });
                }
            }
        }
    };

    this.init();
};

/* INIT */
var WoofTurboMode = new WoofTurboMode_obj(woof_tm_data);

function woof_turbo_mode_sleep(sleepDuration) {
    var now = new Date().getTime();
    while (new Date().getTime() < now + sleepDuration) {
        /* do nothing */
    }
}
