var help_available = 1;
var table_id = getUrlVars()['table'];
// закрытие напоминаний, включая плавное исчезновение и фоновое обновление данных (ajax)
var eOpacity = 1;
var interval = false;
var update_tip_ajax = new XMLHTTP("update_tip.php");
var edit_form_submits = new Array();
var table_padding = 32;
var buttons_h = 37;
var table_header_h = 0;
var right_white;
var left_white;
var top_header_div;
var fields_content_table;
var window_width;
var window_height;
var fields_buttons_table;
var old_offs_x = -1;
var old_offs_y = -1;
var old_new_h = -1;
var scroll_orientir = -1;
var header_orientir = -1;
var visible_popup = 0;
var table_div;
var page_loaded = 0;
var cellPadding = 5;
var paddingExternal = 32;
var biz_proc;
var allow_out_bizproc;
$.ui.menu.prototype._isDivider = function(){return false}; // переопределяем для ui от jq поля для связи, чтобы он не считал тире символом разделения строк
init_biz_proc();

function on_load_biz_proc(xhr) {
  if (!xhr) {
    return
  }

    biz_proc = JSON.parse(xhr);
    if (biz_proc) {
        allow_out_bizproc = 0;
        $(window).bind("beforeunload", function () {
            if (!allow_out_bizproc) return lang.bizproc_out_alert;
        });
        var step = (biz_proc['autostep']) ? +biz_proc['num'] + 1 : biz_proc['num'] + '&done';
        biz_proc_link = '&bizproc=' + biz_proc['proc_id'] + '&step=' + step
    } else if (bizproc_done) {
        $(function () {
            jinfo('<div align=center>' + lang.Business_process_ended + '!</div>', lang.Business_process, 350);
        });
    }

    $.widget("ui.dialog", $.extend({}, $.ui.dialog.prototype, {
        _title: function (title) {
            if (!this.options.title) {
                title.html("&#160;");
            } else {
                title.html(this.options.title);
            }
        }
    }));
}

$(document).ready(function() {
    page_loaded = 1;

    if (incorrect_crypt_key && typeof incorrect_crypt_key != "undefined") {
        jalert(lang.Incorrect_crypt_pass);
    }

    show_block_account();
    checkHelpButtonsOnCurrentPage();

    if (document.querySelector('.hidden_cat_tables')) {
        initHeaderHiddenMenuItems()
    }

});

$(document).scroll(function() {
    $('.header__category-item.hover').removeClass('hover')
});

/**
 * Функция, проверяющая поле на уникальность, если включена настройка
 * @param {object} params
 * @param {string|number} params.fieldId 
 * @param {string|number} params.lineId 
 * @param {string|number} params.tableId 
 * @param {string|number} params.value 
 * @returns {boolean}
 */
function fast_edit_uniq_check({ 
  fieldId,
  lineId,
  tableId,
  value
}) {
    let result = true;
    const elementFastEdit = document.querySelector('#view_cell_' + fieldId) || document.querySelector('#fast_edit_span_' + fieldId + '_' + lineId) || document.querySelector('[id^="view_value' + fieldId + '"]') || document.querySelector('#view_all_' + fieldId);
    const isSubtableField = typeof cur_subtable !== 'undefined' && cur_subtable.table_fields && cur_subtable.table_fields[fieldId];
    if (uniq_fields && uniq_fields[fieldId] || isSubtableField && cur_subtable.table_fields[fieldId].uniq_field == 1) {
        $.ajax({
            url: 'view_line2.php?ajax_uniq_search',
            data: {
                table: tableId,
                line: lineId,
                field: fieldId,
                value,
            },
            async: false,
            success: function(data) {
                if (data.found == 1) {
                    $('#field_view' + fieldId + ' b').css('color', 'red');
                    if (elementFastEdit) elementFastEdit.classList.add('bg_err');
                    if (data.addit_fields) {
                        let name_list = ($('#field_view' + fieldId + ' b').html() ?? $('#header_' + fieldId + '_div a').html() ?? $('.f' + fieldId + ' span').html() ?? '').trim();
                        data.addit_fields.forEach(function(additFieldId) {
                            $('#field_view' + additFieldId + ' b').css('color', 'red');
                            let elementFastEditAddit = document.querySelector('#view_cell_' + additFieldId) || document.querySelector('#fast_edit_span_' + additFieldId + '_' + lineId) || document.querySelector('[id^="fast_edit_span_' + additFieldId + '_' + lineId + '_"]') || document.querySelector('[id^="view_value' + additFieldId + '"]') || document.querySelector('#view_all_' + additFieldId);
                            if (elementFastEditAddit) elementFastEditAddit.classList.add('bg_err');
                            name_list += ' + ' + ($('#field_view' + additFieldId + ' b').html() ?? $('#header_' + additFieldId + '_div a').html() ?? $('.f' + additFieldId + ' span').html() ?? '').trim();
                        });
                        displayNotification(lang.ajax_dbl_adv_msg1 + name_list + lang.ajax_dbl_adv_msg2 + '<br><br>' + lang.ajax_dbl_adv_msg3 + ' <a href="view_line2.php?table=' + tableId + '&line=' + data.id + '" target=_blank>' + lang.ajax_dbl_msg4, 2);
                    } else {
                        displayNotification(lang.ajax_dbl_msg5 + '<br><br>' + lang.ajax_dbl_msg6 + ' <a href="view_line2.php?table=' + table_id + '&line=' + data.id + '" target=_blank>' + lang.ajax_dbl_msg4, 2)
                    }
                    result = false;
                } else {
                    $("#field_view" + fieldId + " b").css("color", "black");
                    if (elementFastEdit) elementFastEdit.classList.remove('bg_err');
                    if (data.addit_fields) {
                        data.addit_fields.forEach(function(additFieldId) {
                        $("#field_view" + additFieldId + " b").css("color", "black");
                            let elementFastEditAddit = document.querySelector('#view_cell_' + additFieldId) || document.querySelector('#fast_edit_span_' + additFieldId + '_' + lineId) || document.querySelector('[id^="fast_edit_span_' + additFieldId + '_' + lineId + '_"]') || document.querySelector('[id^="view_value' + additFieldId + '"]') || document.querySelector('#view_all_' + additFieldId);
                            if (elementFastEditAddit) elementFastEditAddit.classList.remove('bg_err');
                        });
                    }
                }
            },
            dataType: 'json',
        });
    }

    return result;
}

/**
 * Метод, проверяющий валидацию html кода
 * @param code {string}
 * @returns {boolean}
 */
function isValidHtmlCode (code) {
    var result = true;
    var openHtmlTags = {};
    /**
     * Одиночные теги
     * @type {Array}
     */
    var SELF_TAGS = [
        'area',
        'base',
        'basefont',
        'bgsound',
        'br',
        'col',
        'command',
        'embed',
        'hr',
        'img',
        'input',
        'isindex',
        'link',
        'meta',
        'param',
        'source',
        'track',
        'wbr'
    ];

    // Удаляем все содержимое внутри тега
    var codeWithoutTags = code.replace(/<[^>]+>/g, '');
    if (codeWithoutTags.indexOf('<') !== -1 || codeWithoutTags.indexOf('>') !== -1) {
        result = false;
    }

    if (result) {
        var tagsArray = code.match(/<\/?[a-z][a-z0-9]*[^<>]*>/gi);
        if (!tagsArray) {
            result = true;
        } else {
            tagsArray.forEach(function (tag) {
                var tagWithAttr = tag.split(' ');
                var tagName = tagWithAttr[0].replace(/[<\/>]/g, '');
                var isSelfTag = SELF_TAGS.includes(tagName.replace(/\//g, ''));

                if (!isSelfTag) {
                    if (tag[1] === '/') { // closing tag
                        var closeTag = tagName.replace(/\//g, '');
                        if (openHtmlTags[closeTag] && openHtmlTags[closeTag] > 0) {
                            openHtmlTags[closeTag]--;
                        } else {
                            result = false;
                        }
                    } else { // opening tag
                        if (!openHtmlTags[tagName]) {
                            openHtmlTags[tagName] = 1;
                        } else {
                            openHtmlTags[tagName]++;
                        }
                    }
                }
            });
            if (result) {
                for (var tag in openHtmlTags) {
                    if (openHtmlTags[tag] !== 0) {
                        result = false;
                        break;
                    }
                }
            }
        }
    }

    return result;
}

/**
 * Метод для получение значения атрибутов из параметров ссылки
 * @returns
 */
function getUrlVars() {
    var vars = {};
    var parts = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m,key,value) {
        vars[key] = value;
    });
    return vars;
}

function getAttrVars(str) {
    var vars = {};
    var parts = str.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m,key,value) {
        vars[key] = value;
    });
    return vars;
}

function init_biz_proc() {
    var result = {};
    var bizproc_id = getUrlVars()['bizproc'];
    var bizproc_step = getUrlVars()['step'];

    if (bizproc_id && bizproc_step) {
        $.ajax({
            method: 'GET',
            url: 'get_value.php?biz_proc&table=' + table_id + '&bizproc=' + bizproc_id + '&step=' + bizproc_step,
            success: function (xhr) {
                on_load_biz_proc(xhr);
            },
            error: function() {
                console.log('Ошибка загрузки');
            }
        });
    }

    return result;
}

function hide_this_notif(obj) {
    $(obj).parent().slideUp(400, on_window_resize);
    return false;
}

function closeTip(user_id, tip_show_id, line_id) {
    slideOff('tip_block_' + tip_show_id);
    eOpacity = 1;

    update_tip_ajax.method = "POST";
    update_tip_ajax.call("tip_show_id=" + tip_show_id + "&csrf=" + csrf, function(){});
}

function slideOff(sElemId) {
    var delta = Math.floor(document.getElementById(sElemId).offsetHeight / 10);
    interval = window.setInterval("minus('" + sElemId + "', " + delta + ")", 50);
}

// Функция для добавления обработчика событий
// Сохраняем обработчки onsubmit для edit_form в отдельном массиве

function addHandler(object, event, handler, useCapture) {
    if (!object) return;
    if ((document.getElementById('edit_form')) && (object == document.getElementById('edit_form')) && (event == "onsubmit")) { // сохраняем события onsubmit формы edit_form
        edit_form_submits.push(handler);
    }

    if (object.addEventListener) {
        var t1;
        if (event.substr(0, 2).toLowerCase() == "on") t1 = event.substr(2, 1024); // убираем приставку on
        object.addEventListener(t1, handler, useCapture ? useCapture : false);
    } else if (object.attachEvent) {
        object.attachEvent(event, handler);
    } else jalert("Add handler is not supported");
}

function minus(sElemId, delta) {
    nHeight = document.getElementById(sElemId).offsetHeight;
    nHeight = parseInt(nHeight);
    nHeight = nHeight - delta;
    if (nHeight > 0) {
        eOpacity = eOpacity - 0.1;
        document.getElementById(sElemId).style.height = nHeight + "px";
        setElementOpacity(sElemId, eOpacity);
    }
    else {
        if (nHeight == '0') {
            document.getElementById(sElemId).style.display = "none";
            document.getElementById(sElemId).style.height = '1' + "px";
            window.clearInterval(interval);
        }
        else {
            minus(sElemId, delta - 1);
        }
    }
}

function ajax_get_favorites() {
    $.ajax({
        url: "get_favorites.php",
        //type: "GET",
        //async: false,
        success: function (resp) {
            if (resp == 'null') {
                if (document.querySelector('.favorites_not_found')) {
                  document.querySelector('.favorites_not_found').remove();
                }

                let not_found = document.createElement('div')
                not_found.classList.add('favorites_not_found')
                not_found.innerHTML = lang.favorites_not_found

                document.querySelector('.favorite_window_inner').append(not_found)
                return
            }

            if (document.querySelector('.favorites_not_found')) {
                document.querySelector('.favorites_not_found').remove()
            }

            let response = JSON.parse(resp);
            //console.log(response);

            document.querySelector('.favorite_window_table tbody').innerHTML = '';
            response.forEach((item) => {
                let table = document.querySelector('.favorite_window_table tbody');
                let tr = document.createElement('tr');

                let td_table_title = document.createElement('td');
                td_table_title.classList.add('favorite_td_table_title')
                let table_title = document.createElement('div');
                table_title.classList.add('favorite_table_title');
                table_title.innerHTML = item.table_name;
                td_table_title.append(table_title);


                let td_row_title = document.createElement('td');
                td_row_title.classList.add('favorite_td_row_title')
                let row_title = document.createElement('a');
                row_title.href = `view_line2.php?table=${item.table_id}&line=${item.line_id}`
                table_title.classList.add('favorite_table_row_title');
                row_title.classList.add('favorite_row_title')
                row_title.classList.add('favorite_row_title_fix')
                row_title.innerHTML = item.record_name;
                td_row_title.append(row_title);


                let td_notification_mode = document.createElement('td')
                td_notification_mode.classList.add('favorite_td_notification_mode')
                let notification_mode = document.createElement('button')
                notification_mode.setAttribute('table_id', item.table_id)
                notification_mode.setAttribute('line_id', item.line_id)
                notification_mode.classList.add('favorite_notification_mode')
                if (item.notify == '1') {
                    notification_mode.classList.add('active')
                    notification_mode.setAttribute('notify', '1')
                } else {
                    notification_mode.setAttribute('notify', '0')
                }
                notification_mode.addEventListener('click', (e) => {
                    changeFavoriteNotification(e.target)
                })
                td_notification_mode.append(notification_mode)


                let td_remove = document.createElement('td')
                td_remove.classList.add('favorite_td_remove')
                let remove = document.createElement('button')
                remove.setAttribute('table_id', item.table_id)
                remove.setAttribute('line_id', item.line_id)
                remove.classList.add('favorite_button_remove')
                remove.addEventListener('click', (e) => {

                    jconfirm(lang.remove_favorite_item, () => {
                        removeFavoriteItem(e.target)
                    })
                })
                td_remove.append(remove)


                tr.append(td_table_title);
                tr.append(td_row_title);
                tr.append(td_notification_mode)
                tr.append(td_remove)

                table.append(tr);
            })
        }
    });
}

function changeFavoriteNotification(el) {
    let table_id = el.getAttribute('table_id')
    let line_id = el.getAttribute('line_id')
    let notify = el.getAttribute('notify') == 1 ? 'off' : 'on'
    $.ajax({
        url: `set_favorites.php?table=${table_id}&line=${line_id}&notify=${notify}`,
        success: function (res) {
            console.log(res)
        }
    });

    if (notify == 'on') {
        el.classList.add('active')
        el.setAttribute('notify', '1')
    } else {
        el.classList.remove('active')
        el.setAttribute('notify', '0')
    }

}
function removeFavoriteItem(el) {
    let table_id = el.getAttribute('table_id')
    let line_id = el.getAttribute('line_id')
    $.ajax({
        url: `set_favorites.php?table=${table_id}&line=${line_id}&status=off`,
        success: function (res) {
            console.log(res)
            el.closest('tr').remove()
        }
    });
}

function getOpacityProperty() {
    if (typeof document.body.style.opacity == 'string') // CSS3 compliant (Moz 1.7+, Safari 1.2+, Opera 9)
        return 'opacity';
    else if (typeof document.body.style.MozOpacity == 'string') // Mozilla 1.6 и младше, Firefox 0.8
        return 'MozOpacity';
    else if (typeof document.body.style.KhtmlOpacity == 'string') // Konqueror 3.1, Safari 1.1
        return 'KhtmlOpacity';
    else if (document.body.filters && navigator.appVersion.match(/MSIE ([\d.]+);/)[1] >= 5.5) // Internet Exploder 5.5+
        return 'filter';

    return false; //нет прозрачности
}

function open_calc(params, text_len, only_read) {
    if (only_read === undefined) {
        only_read = 0;
    }
    if (text_len > 3000) { // Большие тексты открываем в окне на весь экран
        var left = 0;
        var top = 0;
        var width = screen.availWidth;
        var height = screen.availHeight;
        if (window.opera) { // чтобы окно открылось отдельной вкладкой
            width += 500;
            height += 500;
        }
    }
    else {
        var width = 800;
        var height = 600;
        var left = ( screen.width - width ) / 2;
        var top = ( screen.height - 600 ) / 2;
    }
    var t_v = window.open('edit_php.php?' + params + '&only_read=' + only_read, (params.replace(/&/g, "")).replace(/=/g, ""), 'top=' + top + ', left=' + left + ', menubar=0, resizable=1, scrollbars=0, status=0, toolbar=0, width=' + width + ', height=' + height);
    t_v.focus();
}

function setElementOpacity(sElemId, nOpacity) {
    var opacityProp = getOpacityProperty();
    var elem = document.getElementById(sElemId);

    if (!elem || !opacityProp) return; // Если не существует элемент с указанным id или браузер не поддерживает ни один из известных функции способов управления прозрачностью

    if (opacityProp == "filter")  // Internet Exploder 5.5+
    {
        nOpacity *= 100;

        // Если уже установлена прозрачность, то меняем её через коллекцию filters, иначе добавляем прозрачность через style.filter
        var oAlpha = elem.filters['DXImageTransform.Microsoft.alpha'] || elem.filters.alpha;
        if (oAlpha) oAlpha.opacity = nOpacity;
        else elem.style.filter += "progid:DXImageTransform.Microsoft.Alpha(opacity=" + nOpacity + ")"; // Для того чтобы не затереть другие фильтры используем "+="
    }
    else // Другие браузеры
        elem.style[opacityProp] = nOpacity;
}

// Привести к intval
function intval(mixed_var, base) {    // Get the integer value of a variable
    //
    // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    var tmp;

    if (typeof( mixed_var ) == 'string') {
        tmp = parseInt(mixed_var);
        if (isNaN(tmp)) {
            return 0;
        } else {
            return parseInt(tmp.toString(base || 10));
        }
    } else if (typeof( mixed_var ) == 'number') {
        return parseInt(Math.floor(mixed_var));
    } else {
        return 0;
    }
}

function show_block_account() {
    if (script_name == 'login.php') {
        if ($.cookie('excess_load_warning')) {
            jalert("<b>Уважаемый клиент!</b><br><br>Ваш <b>коэффициент допустимой нагрузки превышен!</b><br>В случае если <b>в течение 7 дней</b> он <b>не будет понижен</b>, Ваш <b>аккаунт будет заблокирован!</b><br><br>Просьба связаться со своим персональным менеджером по телефону: <b>8-800-1000-936</b><br>Также Вы можете произвести оплату аккаунта через личный кабинет.<br><br>С уважением,<br>Ваша «Клиентская база»");
            $.cookie('excess_load_warning', null);
        }
        if ($.cookie('excess_load_block_warning')) {
            jalert("<b>Уважаемый клиент!</b><br><br><b>Работа вашего аккаунта заблокирована!</b><br>Вами был превышен коэффициент допустимой нагрузки согласно выбранного тарифного плана!<br><br>Просьба связаться со своим персональным менеджером по телефону: <b>8-800-1000-936</b><br>Также Вы можете оплатить аккаунт через личный кабинет. " + ($.cookie('excess_load_rec_plan') ? ("Рекомендованный<br>тарифный план: \"" + $.cookie('excess_load_rec_plan') + "\". ") : "") + "После чего доступ в систему будет возобновлён.<br><br>С уважением,<br>Ваша «Клиентская база»");
            $.cookie('excess_load_block_warning', null);
        }
    }
}
/**
 * Устанавливает значение выпадающего списка на основе текста из поля автозаполнения.
 * 
 * Перебирает дочерние элементы контейнера `#wizard_set`, извлекает текст из 
 * соответствующего поля автозаполнения и ищет совпадения среди опций выпадающего списка.
 * 
 * @deprecated Используйте linkFieldsInCondition вместо этой функции.
 */
function link_fields_in_condition() {
    $('#wizard_set').children().each(function(i) {
        var condId = $('#wizard_set').children().eq(i).attr('id').replace('cond_','');
        $( "#cond_value_" + condId + " option").each(function( index ) {
            if ($("#cond_value_" + condId).next().find('.autocomplete__input')) {
                var a = $("#cond_value_" + condId).next().find('.autocomplete__input').val();
            } else {
                var a = null;
            }

            if(a === $(this).text()) {
                $("#cond_value_"+ condId).val($("#cond_value_" + condId +" option").eq(index).val())
            };
        });
    })
}
/**
 * Устанавливает значение выпадающего списка на основе текста из поля автозаполнения.
 * 
 * Перебирает дочерние элементы контейнера `#wizard_set`, извлекает текст из 
 * соответствующего поля автозаполнения и ищет совпадения среди опций выпадающего списка.
 */
function linkFieldsInCondition() {
    const wizardSet = document.getElementById('wizard_set');
    if (!wizardSet) return;
    const children = wizardSet.children;

    Array.from(children).forEach((child) => {
        const condId = child.id.replace('cond_', '');
        const condValueElement = document.getElementById(`cond_value_${condId}`);
        if (!condValueElement) return;

        const options = condValueElement.options;
        if (!options || options.length === 0) return;

        const autocompleteInput = condValueElement.nextElementSibling?.querySelector('.autocomplete__input');
        const autocompleteText = autocompleteInput ? autocompleteInput.value : null;
        if (autocompleteText === null) return;
        
        const lastMatchingOption = Array.from(options).reverse().find(option => option.text === autocompleteText);

        if (lastMatchingOption) {
            condValueElement.value = lastMatchingOption.value;
        }
    });
}


// Проверка поля "Связь" на наличие прав на импорт в связанном поле
// line_id - необязательный параметр, в запросе можно прописать line=any
function checkFieldImportRights(table_id, line_id, field_id, obj) {
    var import_right = true;
    $.ajax({
        url: "get_value.php?show_fields&table=" + table_id + "&line=" + line_id,
        type: "GET",
        async: false,
        success: function (response) {
            var all_fields = JSON.parse(response);
            var field_write_acc = (all_fields['fields'][field_id]['write'] || all_fields['fields'][field_id]['view_add']) && all_fields['table']['add'];

            if (field_write_acc == false || field_write_acc < 1) { import_right = false; }
            obj.attr('import', import_right);
        },
        error: function () {
            console.log('Поле не найдено');
            return true;
        }
    });
    return import_right;
}

// Проверка на то, что все знаки вопроса (help-ы) имеют описание
function checkHelpButtonsOnCurrentPage () {
    setTimeout(function() {
        $('span[h_id]').each(function(i, item) {
            $helper = $(item);

            let helpId = $helper.attr('h_id');
            let hsAttr = $helper.attr('h_s');
            let hssAtr = $helper.attr('h_ss');
            let isOnPage = false;

            let hLink = $('#check_help_btn a#help_' + helpId);
            if (hLink && hLink.length > 0) isOnPage = true;

            if (typeof (help_section) == 'undefined') help_section = '';
            if (hsAttr === undefined) hSection = help_section;
            else hSection = hsAttr;

            if (typeof (h_sub_section) == 'undefined') h_sub_section = '';
            if (hssAtr === undefined) section = h_sub_section;
            else section = hssAtr;

            let site = location.protocol + '//help.' + clientbase_domain + '/';
            let helpUrl = site + 'help_sys.php?section=1' + hSection + '&sub_section=' + section + '&sys_id=2' + helpId + '&lang=' + lang_full + '&short=1';

            if (!isOnPage) {
                let helpLink = $('<a>', {href: helpUrl, id: 'help_' + helpId, class: 'hidden', text: helpId });
                $('#check_help_btn').append(helpLink);
                $('#check_help_btn a#help_' + helpId).trigger('click');
                $helper.click();
                $('#s_tooltip').html('').hide();
            }
        });
    }, 1000);
}

// Метод для строк, заменяющий ВСЕ вхождения определенного символа/подстроки
String.prototype.replaceAll = function(search, replace) {
    if (search) return this.split(search).join(replace);
    else return this;
}

/*if ( configType === "SAAS" && online_consult ) {
    // Carrot Quest
    !function () {
        function t(t, e) {
            return function () {
                window.carrotquestasync.push(t, arguments)
            }
        }

        if ("undefined" == typeof carrotquest) {
            var e = document.createElement("script");
            e.type = "text/javascript", e.async = !0, e.src = "//cdn.carrotquest.io/api.min.js", document.getElementsByTagName("head")[0].appendChild(e), window.carrotquest = {}, window.carrotquestasync = [], carrotquest.settings = {};
            for (var n = ["connect", "track", "identify", "auth", "oth", "onReady", "addCallback", "removeCallback", "trackMessageInteraction"], a = 0; a < n.length; a++) carrotquest[n[a]] = t(n[a])
        }
    }(), carrotquest.connect("25347-6bc9e3c835d5379d573fa8f11d");
}*/



function checkHeaderSizeForTableMenu() {
  let header = document.querySelector('.header__top')
  let rect = header.getBoundingClientRect()

  //Создаём style для назначения top у выпадающего блока с таблицами
  let css = `.hidden_cat_tables {top: ${rect.height}px}`
  let style = document.createElement('style')
  style.id = 'dynamic_header_style';
  if (style.styleSheet){
    //for IE8 and below.
    style.styleSheet.cssText = css;
  } else {
    style.appendChild(document.createTextNode(css));
  }

  if (document.querySelector('#dynamic_header_style')) {
    document.querySelector('#dynamic_header_style').remove()
    document.body.prepend(style)
  } else {
    document.body.prepend(style)
  }
}

function initHeaderHiddenMenuItems() {
    let items = document.querySelectorAll('#mainmenu.header__categories .header__category-item')

    items.forEach( (item) => {
        item.addEventListener('mouseover', (e) => {
            let target_item
            if (!e.target.classList.contains('header__category-item')) {
                target_item = e.target.closest('.header__category-item')
            } else {
                target_item = e.target
            }
            target_item.classList.add('hover')
        })
        item.addEventListener('mouseleave', (e) => {
            let target_item
            if (!e.target.classList.contains('header__category-item')) {
                target_item = e.target.closest('.header__category-item')
            } else {
                target_item = e.target
            }
            target_item.classList.remove('hover')
        })
    })
}
