"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.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 && 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 _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 + ")");

                    }
                });
            });
        });
        if (is_woof_use_chosen) {
            try {
                jQuery("select.woof_select, select.woof_mselect").chosen('destroy').trigger("liszt:updated");
                jQuery("select.woof_select, select.woof_mselect").chosen(/*{disable_search_threshold: 10}*/);
                jQuery("select.woof_meta_select, select.woof_meta_mselect").chosen('destroy').trigger("liszt:updated");
                jQuery("select.woof_meta_select, select.woof_meta_mselect").chosen(/*{disable_search_threshold: 10}*/);
            } catch (e) {

            }
        }
    }
    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");
                }
                /*re-init chosen lib */
                if (is_woof_use_chosen) {
                    try {
                        jQuery(item.label).parent('select').chosen('destroy').trigger("liszt:updated");
                        jQuery(item.label).parent('select').chosen(/*{disable_search_threshold: 10}*/);
                    } 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;
        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 () {
                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());
        }

        jQuery.each(query, function (i, item) {
            
            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.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();
                    }
                }

            });
        });

        if (is_woof_use_chosen) {
            try {
                jQuery("select.woof_select, select.woof_mselect").chosen('destroy').trigger("liszt:updated");
                jQuery("select.woof_select, select.woof_mselect").chosen(/*{disable_search_threshold: 10}*/);
                jQuery("select.woof_meta_select, select.woof_meta_mselect").chosen('destroy').trigger("liszt:updated");
                jQuery("select.woof_meta_select, select.woof_meta_mselect").chosen(/*{disable_search_threshold: 10}*/);
            } catch (e) {

            }
        }


        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')
            };

            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();
                }

                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();


                //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 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 data = {
                                action: "woof_write_stat",
                                woof_current_values: woof_current_values
                            };
                            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 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 data = {
                                action: "woof_write_stat",
                                woof_current_values: woof_current_values
                            };
                            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 */
    }
}
