fryecest / Sausage Mod

// ==UserScript==
// @name         Sausage Mod
// @version      1.4.0
// @description  Небольшие изменения в кодике пиксельных котиков.
// @author       fryecest
// @match        http*://*.catwar.net/*
// @license      MIT
// @copyright    2021-2024, Пирит, Золото Дураков ( catwar.su/cat115907 )
// @updateURL    https://openuserjs.org/meta/fryecest/Sausage_Mod.meta.js
// @downloadURL  https://openuserjs.org/install/fryecest/Sausage_Mod.user.js
// @require      https://code.jquery.com/jquery-3.6.0.min.js
// ==/UserScript==
// с днем говнокода
// хочу сыр косичку

$(function () {

    const version = "1.3.8"

    const MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver;
    const isFull = !$('meta[name=viewport]').length;

    let pageLocation = window.location.href; // открытая страница

    const settingsPage = (/^https?:\/\/\w?\.?catwar.net\/settings/.test(pageLocation)); // проверка на нахождение на странице настроек
    const cw3Page = (/^https?:\/\/\w?\.?catwar.net\/cw3/.test(pageLocation)); // проверка на нахождение на странице игровой
    const chatPage = (/^https?:\/\/\w?\.?catwar.net\/chat/.test(pageLocation)); // проверка на нахождение на странице чата
    const blogsPage = (/^https?:\/\/\w?\.?catwar.net\/blog/.test(pageLocation)); // проверка на нахождение на странице блогов
    const sniffPage = (/^https?:\/\/\w?\.?catwar.net\/sniff/.test(pageLocation)); // проверка на нахождение на странице ленты
    const aboutPage = (/^https?:\/\/\w?\.?catwar.net\/about/.test(pageLocation)); // проверка на нахождение на странице об игре
    const mainPage = (/^https?:\/\/\w?\.?catwar.net\/$/.test(pageLocation)); // проверка на нахождение на странице своего профиля
    const profilePage = (/^https?:\/\/\w?\.?catwar.net\/cat/.test(pageLocation)); // проверка на нахождение на странице чужого профиля
    const lsPage = (/^https?:\/\/\w?\.?catwar.net\/ls/.test(pageLocation)); // проверка на нахождение на странице ЛС
    let blogscreate = (/^https?:\/\/\w?\.?catwar.net\/blogs[?]creation/.test(pageLocation));
    let sniffcreate = (/^https?:\/\/\w?\.?catwar.net\/sniff[?]creation/.test(pageLocation));
    let lscreate = (/^https?:\/\/\w?\.?catwar.net\/ls[?]new/.test(pageLocation));
    const isUnauth = $("#menu_div").children().length == 4;

    let getbackopacity = (css) => { let elem = css.split(", "); if (elem.length == 4) return elem[3].slice(0, -1) }

    let getbranches = (css) => { let elem = css.split("\"), url(\""); elem[0] = elem[0].slice(5); elem[1] = elem[1].slice(0, -2); return elem; }

    let rgbToHex = (rgb) => { let elem = rgb.split(', ');
                             if (elem[0].indexOf("rgba") == -1) { elem[0] = elem[0].slice(4); elem[2] = elem[2].slice(0, -1); }
                             else { elem[0] = elem[0].slice(5); elem.pop(3); }
                             var result = elem.map(function (x) { x = parseFloat(x).toString(16); return (x.length == 1) ? "0" + x : x; });
                             return "#" + result.join(''); }

    let mightSkillUpdEvent = new Event('mouseover', { bubbles: true });
    let mightSkillHideEvent = new Event('mouseout', { bubbles: true });

    let mightDispatch = () => { let might = document.getElementById('might_table'); might.dispatchEvent(mightSkillUpdEvent); }
    let mightDispatchHide = () => { let might = document.getElementById('might_table'); might.dispatchEvent(mightSkillHideEvent); }

    let playshowerfix = () => {
        if ($('span.small').css('position') == 'fixed' && $('.other_cats_list').css('display') != 'none') {
            return true;
        }
        return false;
    };

    const defaults = {
        'shower_fix': false,
        'cages_nums': true,
        'cages_nums_color': '#ffffff',
        'cages_nums_opacity': 'AA',
        'cages_nums_shadow': '#000000',
        'count_exersizes': 0,
        'might_log_check': true,
        'count_drop': 0,
        'might_log_before_count': 0,
        'is_wound_warning_hidden': false, // основной сайт
        'is_ad_hidden': false,
        'is_wound_alert_hidden': false, // в игровой
        'might_roofs': [1, 4, 15, 30, 150, 300, 500, 2000, 7000],
        'color_pick': false,
        'notes': true,
        'cw3_shower_fix': true,
        'cw3_fast_sett': true
    }

    if (!cw3Page) {
        defaults['back_url'] = $("body").css("background-image");
        defaults['back_img'] = $("body").css("background-image").slice(5, -2);
        defaults['text_font'] = $("body").css("font-family");
        defaults['link_color'] = rgbToHex($("#footer a").css("color"));
        defaults['link_opacity'] = 255;
        defaults['text_color'] = rgbToHex($("body").css("color"));
        defaults['text_opacity'] = 255;
        defaults['back_color'] = rgbToHex($("#site_table").css("background-color"));
        defaults['back_opacity'] = getbackopacity($("#site_table").css("background-color")) * 256;
        defaults['text_size'] = $("body").css('font-size');
        if (isFull) {
            defaults['branch_left_img'] = getbranches($("#branch").css("background-image"))[0];
            defaults['branch_right_img'] = getbranches($("#branch").css("background-image"))[1];
            if ($("#logo").html() != undefined) {
                defaults['logo_url'] = $("#logo").css("background-image");
                defaults['logo_img'] = $("#logo").css("background-image").slice(5, -2);
            }
        }
    }
    else if (cw3Page) {
        defaults['is_shower_cw3'] = playshowerfix();
    }

    console.log(defaults);

    let currentSettings = {};
    var toBool = (value) => {
        if (value == 'false') return false;
        else if (value == 'true') return true;
        else return value;
    }

    let deftocur = (x) => {
        if (window.localStorage.getItem(x) == '' || window.localStorage.getItem(x) == null) { currentSettings[x] = toBool(defaults[x]) }
        else { currentSettings[x] = toBool(window.localStorage.getItem(x)) } }

    for (let x in defaults) deftocur(x);

    var mightOnload = () => {
        if (cw3Page) {
            setTimeout(function () {
                defaults['might_level'] = $('#might b').text();
                deftocur('might_level');
                mightDispatch();
                mightDispatchHide();
                let might_tiptip = document.getElementById('tiptip_content').innerHTML;
                let might_max = (might_tiptip.split('/'))[1].slice(0, -1);
                might_tiptip = (might_tiptip.split('/'))[0].slice(15);
                defaults['might_log'] = ('Дробь до тренировок: ' + might_tiptip + '/' + might_max + ' единиц</br>');
                defaults['might_log_before_count'] = might_tiptip; }, 500);
            deftocur('might_log');
            deftocur('might_log_before_count');
        }
    }

    mightOnload();

    console.log(currentSettings);

    var ifHexDoubleDigit = (number) => {
        if (number >= 0 && number < 16) return '0' + number;
        else return number
    }

    // функции замены элементов
    var logoReplace = (value) => { (value == '') ? $("#logo").css("background-image", ''): $("#logo").css("background-image", "url(" + value + ")"); }

    var backImgReplace = (value) => { (value == '') ? $("body").css("background-image", ''): $("body").css("background-image", "url(" + value + ")"); }

    var branchImgReplace = (left, right) => {
        (left == '') ? $("#branch").css("background", "url(" + defaults['branch_left_img'] + ") repeat-y left top,url(" + right + ") repeat-y right top"): (right == '') ? $("#branch").css("background", "url(" + left + ") repeat-y left top,url(" + defaults['branch_right_img'] + ") repeat-y right top") : $("#branch").css("background", "url(" + left + ") repeat-y left top,url(" + right + ") repeat-y right top");
    }
    var textFontReplace = (value) => { $("body").css("font-family", value); }

    var textColorReplace = (color, opacity) => { if (opacity == '') opacity = defaults['text_opacity'];
                                                $("#site_table, #footer, .other_cats_list, #redesign").css("color", color + ifHexDoubleDigit(parseInt(opacity).toString(16))); }

    var linkColorReplace = (color, opacity) => { if (opacity == '') opacity = defaults['link_opacity'];
                                                $("#site_table a, #footer a, #redesign a").css("color", color + ifHexDoubleDigit(parseInt(opacity).toString(16)));
                                                if (profilePage) $(".parsed a").css("color", '');
                                                $("#messList a, #top_div a").css("color", ''); }

    var backColorReplace = (color, opacity) => { if (opacity == '') opacity = defaults['back_opacity'];
                                                $("#site_table, #footer, #redesign").css("background-color", color + ifHexDoubleDigit(parseInt(opacity).toString(16))); }

    var showerCatsFix = (link_color, back_color, link_opacity, back_opacity) => { if (currentSettings['shower_fix']) {
        if (link_color != defaults['link_color'] && back_color != defaults['back_color']) {
            $(".other_cats_list").css("background-color", back_color + ifHexDoubleDigit(parseInt(back_opacity).toString(16)));
            $(".other_cats_list>a").css("color", link_color + ifHexDoubleDigit(parseInt(link_opacity).toString(16))); }
        else if (link_color == defaults['link_color'] && back_color != defaults['back_color']) {
            $(".other_cats_list").css("background-color", back_color + ifHexDoubleDigit(parseInt(back_opacity).toString(16)));
            $(".other_cats_list>a").css("color", link_color); }
        else if (back_color == defaults['back_color'] && link_color != defaults['link_color']) {
            $(".other_cats_list").css("background-color", back_color);
            $(".other_cats_list>a").css("color", link_color + ifHexDoubleDigit(parseInt(link_opacity).toString(16))); }
        else {
            $(".other_cats_list").css("background-color", back_color);
            $(".other_cats_list>a").css("color", link_color); } }
                                                                                 else {
                                                                                     $(".other_cats_list").css("background-color", '');
                                                                                     $(".other_cats_list>a").css("color", ''); } }

    var textSizeReplace = (value) => {
        if (value == '') $("body").css("font-size", defaults['text_size']);
        else { $("body").css("font-size", value + "px"); $("#clearTextSize").css("font-size", defaults['text_size'])}}

    var fullRedesign = () => {
        if (!isUnauth) {
            logoReplace(currentSettings['logo_img']);
            backImgReplace(currentSettings['back_img']);
            branchImgReplace(currentSettings["branch_left_img"], currentSettings['branch_right_img']);
            textFontReplace(currentSettings['text_font']);
            textColorReplace(currentSettings['text_color'], currentSettings['text_opacity']);
            linkColorReplace(currentSettings["link_color"], currentSettings["link_opacity"]);
            backColorReplace(currentSettings["back_color"], currentSettings["back_opacity"]);
            textSizeReplace(currentSettings['text_size']);
            showerCatsFix(currentSettings['link_color'], currentSettings['back_color'], currentSettings['link_opacity'], currentSettings["back_opacity"]);
            return;
        }
        return;
    }

    var cagesNumbers = () => {
        if (currentSettings['cages_nums']) {
            let cagesStyle = $('<style id="cages_nums"></style>').html(`#cages_div { position: relative; }
#cages>tbody>tr>td:before { position: absolute; z-index:0; margin-top: 3px; margin-left: 73px;
color: ` + currentSettings['cages_nums_color'] + currentSettings['cages_nums_opacity'] + `;
text-shadow: 1 1 30px ` + currentSettings['cages_nums_shadow'] + `;
text-align: right;
font-size: 20px;
font-family: Courier New;
font-weight: bold;
letter-spacing: -4px; }
#cages>tbody>tr:nth-child(1)>td:nth-child(1):before {content: '1';}
#cages>tbody>tr:nth-child(1)>td:nth-child(2):before {content: '2';}
#cages>tbody>tr:nth-child(1)>td:nth-child(3):before {content: '3';}
#cages>tbody>tr:nth-child(1)>td:nth-child(4):before {content: '4';}
#cages>tbody>tr:nth-child(1)>td:nth-child(5):before {content: '5';}
#cages>tbody>tr:nth-child(1)>td:nth-child(6):before {content: '6';}
#cages>tbody>tr:nth-child(1)>td:nth-child(7):before {content: '7';}
#cages>tbody>tr:nth-child(1)>td:nth-child(8):before {content: '8';}
#cages>tbody>tr:nth-child(1)>td:nth-child(9):before {content: '9';}
#cages>tbody>tr:nth-child(1)>td:nth-child(10):before {content: '10';}
#cages>tbody>tr:nth-child(2)>td:nth-child(1):before {content: '1';}
#cages>tbody>tr:nth-child(2)>td:nth-child(2):before {content: '2';}
#cages>tbody>tr:nth-child(2)>td:nth-child(3):before {content: '3';}
#cages>tbody>tr:nth-child(2)>td:nth-child(4):before {content: '4';}
#cages>tbody>tr:nth-child(2)>td:nth-child(5):before {content: '5';}
#cages>tbody>tr:nth-child(2)>td:nth-child(6):before {content: '6';}
#cages>tbody>tr:nth-child(2)>td:nth-child(7):before {content: '7';}
#cages>tbody>tr:nth-child(2)>td:nth-child(8):before {content: '8';}
#cages>tbody>tr:nth-child(2)>td:nth-child(9):before {content: '9';}
#cages>tbody>tr:nth-child(2)>td:nth-child(10):before {content: '10';}
#cages>tbody>tr:nth-child(3)>td:nth-child(1):before {content: '1';}
#cages>tbody>tr:nth-child(3)>td:nth-child(2):before {content: '2';}
#cages>tbody>tr:nth-child(3)>td:nth-child(3):before {content: '3';}
#cages>tbody>tr:nth-child(3)>td:nth-child(4):before {content: '4';}
#cages>tbody>tr:nth-child(3)>td:nth-child(5):before {content: '5';}
#cages>tbody>tr:nth-child(3)>td:nth-child(6):before {content: '6';}
#cages>tbody>tr:nth-child(3)>td:nth-child(7):before {content: '7';}
#cages>tbody>tr:nth-child(3)>td:nth-child(8):before {content: '8';}
#cages>tbody>tr:nth-child(3)>td:nth-child(9):before {content: '9';}
#cages>tbody>tr:nth-child(3)>td:nth-child(10):before {content: '10';}
#cages>tbody>tr:nth-child(4)>td:nth-child(1):before {content: '1';}
#cages>tbody>tr:nth-child(4)>td:nth-child(2):before {content: '2';}
#cages>tbody>tr:nth-child(4)>td:nth-child(3):before {content: '3';}
#cages>tbody>tr:nth-child(4)>td:nth-child(4):before {content: '4';}
#cages>tbody>tr:nth-child(4)>td:nth-child(5):before {content: '5';}
#cages>tbody>tr:nth-child(4)>td:nth-child(6):before {content: '6';}
#cages>tbody>tr:nth-child(4)>td:nth-child(7):before {content: '7';}
#cages>tbody>tr:nth-child(4)>td:nth-child(8):before {content: '8';}
#cages>tbody>tr:nth-child(4)>td:nth-child(9):before {content: '9';}
#cages>tbody>tr:nth-child(4)>td:nth-child(10):before {content: '10';}
#cages>tbody>tr:nth-child(5)>td:nth-child(1):before {content: '1';}
#cages>tbody>tr:nth-child(5)>td:nth-child(2):before {content: '2';}
#cages>tbody>tr:nth-child(5)>td:nth-child(3):before {content: '3';}
#cages>tbody>tr:nth-child(5)>td:nth-child(4):before {content: '4';}
#cages>tbody>tr:nth-child(5)>td:nth-child(5):before {content: '5';}
#cages>tbody>tr:nth-child(5)>td:nth-child(6):before {content: '6';}
#cages>tbody>tr:nth-child(5)>td:nth-child(7):before {content: '7';}
#cages>tbody>tr:nth-child(5)>td:nth-child(8):before {content: '8';}
#cages>tbody>tr:nth-child(5)>td:nth-child(9):before {content: '9';}
#cages>tbody>tr:nth-child(5)>td:nth-child(10):before {content: '10';}
#cages>tbody>tr:nth-child(6)>td:nth-child(1):before {content: '1';}
#cages>tbody>tr:nth-child(6)>td:nth-child(2):before {content: '2';}
#cages>tbody>tr:nth-child(6)>td:nth-child(3):before {content: '3';}
#cages>tbody>tr:nth-child(6)>td:nth-child(4):before {content: '4';}
#cages>tbody>tr:nth-child(6)>td:nth-child(5):before {content: '5';}
#cages>tbody>tr:nth-child(6)>td:nth-child(6):before {content: '6';}
#cages>tbody>tr:nth-child(6)>td:nth-child(7):before {content: '7';}
#cages>tbody>tr:nth-child(6)>td:nth-child(8):before {content: '8';}
#cages>tbody>tr:nth-child(6)>td:nth-child(9):before {content: '9';}
#cages>tbody>tr:nth-child(6)>td:nth-child(10):before {content: '10';}`)
            $("head").append(cagesStyle);
        }
    }

    var mightSkillUpd = () => {
        if (currentSettings['might_log_check']) {
            mightDispatch();
            mightDispatchHide();
            let might_tiptip = document.getElementById('tiptip_content').innerHTML;
            let might_max = parseInt((might_tiptip.split('/'))[1].slice(0, -1));
            might_tiptip = parseInt((might_tiptip.split('/'))[0].slice(15));
            currentSettings['count_drop'] = parseInt(currentSettings['count_drop']);
            if (currentSettings['might_level'] == 9) {
                currentSettings['might_log'] = 'Вы достигли максимального уровня боевых умений.<br>С этого момента лог тренировок не будет показывать количество полученных единиц.';
                $("#mightlog_count").html("Уровень боевых умений достиг максимума");
                return;
            }
            if (might_tiptip >= currentSettings['might_log_before_count']) currentSettings['count_drop'] = (might_tiptip - currentSettings['might_log_before_count']);
            else {
                let index = defaults['might_roofs'].indexOf(might_max);
                let prev = defaults['might_roofs'][index-1] - currentSettings['might_log_before_count'];
                currentSettings['count_drop'] = (might_tiptip + parseInt(prev));
            }
            currentSettings['count_exersizes'] = parseInt(currentSettings['count_exersizes']);
            currentSettings['might_log'] += ('Тренировка №' + (currentSettings['count_exersizes'] + 1) + ': ' + might_tiptip + '/' + might_max + ' единиц</br>');
            currentSettings['count_exersizes']++;
            window.localStorage.setItem('count_exersizes', currentSettings['count_exersizes']);
            window.localStorage.setItem('might_log', currentSettings['might_log']);
            window.localStorage.setItem('count_drop', currentSettings['count_drop']);
            $("#mightlog_txt").html(currentSettings["might_log"]);
            $("#mightlog_count").html("Всего выпало с последней очистки: "+currentSettings["count_drop"]);
        }
    }

    var woundAlertHide = () => {
        if (currentSettings['is_wound_alert_hidden']) {
            if ($('p#error').html().indexOf('пониженное здоровье') != -1) { $('p#error').css('display', 'none'); }} }

    var colorpickerflag = false;
    var colorPicker = () => {
        if (currentSettings['color_pick'] && !colorpickerflag) {
            let picker = $('<span id="color_picker"></span>').html('Выбрать цвет: <input type="color" id="color_picker_input"><span id="color_code"> </span>');
            $('head').append($('<style></style>').html(`
            #color_picker {
            padding-top: 3px;
            padding-bottom: 2px;
            }
            `));
            $("#color_and_notes").append(picker);
            $('#color_picker_input').on('change', function() { $("#color_code").text($('#color_picker_input').val())} );
        }
    }

    var notesflag = false;
    var notesfunc = () => {
        if (currentSettings['notes'] && !notesflag) {
            let notes_id = 'notes_';
            sniffPage ? notes_id += 'sniff' : mainPage ? notes_id += 'main' : blogsPage ? notes_id += 'blogs' : chatPage ? notes_id += 'chat' : lsPage ? notes_id += 'ls' : notes_id = '';
            if (notes_id == '') return;
            let textarea_size;
            isFull ? textarea_size = 'min-width: 500px; min-height: 300px;' : textarea_size = 'min-width: 350px; min-height: 350px;'
            let css = `
  #notes_wrap {
  position: fixed;
  left: 0;
  top: 0;
  z-index: 2;
    width: 100%;
  height: 100%;
  display: none;
  justify-content: center;
  align-items: center;
  background-color: rgba(0, 0, 0, 0.8);
}
#notes {
  display: grid;
  grid-gap: 0.5em;
  padding: 1em;
  background: ` + currentSettings['back_color']+`;
  color: ` + currentSettings['text_color']+currentSettings['text_opacity']+`;
  border: 1px solid #000000;
  border-radius: 15px;
  grid-template-areas: 'txt' 'switches' 'hide';
}

.notes_button:hover { text-decoration: none; color: #555555; }
.notes_button { display: none; text-align: center; color: #000000; text-decoration: underline; cursor: pointer; }
#notes_switches { grid-area: switches; }
#notes_hide { grid-area: hide; }
#notes_txt { grid-area: txt; padding-bottom: 5px; align-items: stretch;}
#notes_txt a { color: ` + currentSettings['link_color']+currentSettings['link_opacity']+`; }
#notes_hide { display: block; }
#notes_switches { text-align: center; color: #000000; }
.notes_textarea { ` + textarea_size + ` }
#notes_click, #notes_switches span { text-decoration: underline;  cursor: pointer; }
#notes_click:hover, #notes_switches span:hover { text-decoration: none; }`
            if (window.localStorage.getItem(notes_id) == null) window.localStorage.setItem(notes_id, '');

            let placeholdername = () => { let placeholder_name = '';
            notes_id == 'notes_main' ? placeholder_name = 'раздел - ОСебе' :
            notes_id == 'notes_chat' ? placeholder_name = 'раздел - чат' :
            notes_id == 'notes_ls' ? placeholder_name = 'раздел - ЛС' :
            notes_id == 'notes_blogs' ? placeholder_name = 'раздел - блоги' :
            notes_id == 'notes_sniff' ? placeholder_name = 'раздел - лента' :
            placeholder_name = '';
                                        return placeholder_name; }
            let noteshtml = `<textarea placeholder='Заметки сосисочного мода, `+ placeholdername() +`' class='notes_textarea' id=`+notes_id+`>`+window.localStorage.getItem(notes_id)+`</textarea>`
            $("body").append($("<div id='notes_wrap'></div>").html(`
        <div id="notes">
        <div id="notes_txt">` + noteshtml + `</div>
        <div id='notes_switches'>Переключиться:<br><span id="notes_main_switch">ОСебе</span> | <span id="notes_chat_switch">Чат</span> | <span id="notes_ls_switch">ЛС</span> | <span id="notes_blogs_switch">Блоги</span> | <span id="notes_sniff_switch">Лента</span></div>
        <div id="notes_hide" class="notes_button" onclick="$('#notes_wrap').hide()">Скрыть</div>
        </div>
        `));

            let notesSelection = (id) => {
                notes_id = 'notes_';
                id == 'notes_main_switch' ? notes_id += 'main' :
                id == 'notes_chat_switch' ? notes_id += 'chat' :
                id == 'notes_ls_switch' ? notes_id += 'ls' :
                id == 'notes_blogs_switch' ? notes_id += 'blogs' :
                id == 'notes_sniff_switch' ? notes_id += 'sniff' :
                notes_id = '';
                return notes_id;
            }

            let buttonstr = '';
            $(".notes_textarea").on('change', function() { window.localStorage.setItem(notes_id, $(this).val()) });
            currentSettings['color_pick'] ? buttonstr = ' | ' : buttonstr = '';
            let place = "#color_and_notes";
            $(place).prepend($("<span id='notes_click'></span>").html('Заметки'));
            if (currentSettings['color_pick']) $("#notes_click").after($("<span></span>").html(buttonstr));
            $("head").append($('<style id=notes_click_style></style>').html(css));
            $('#notes_main_switch, #notes_chat_switch, #notes_ls_switch, #notes_blogs_switch, #notes_sniff_switch').on('click', function ()
                                                                                                                       { notes_id = notesSelection($(this).prop('id'));
                                                                                                                        $('.notes_textarea').val(window.localStorage.getItem(notes_id));
                                                                                                                       $('.notes_textarea').prop('id', notes_id);
                                                                                                                       $('.notes_textarea').prop('placeholder', 'Заметки сосисочного мода, '+placeholdername())});
            $('#notes_click').on('click', function () { $('#notes_wrap').css('display', 'flex'); });
        }
    }

    let colornotes = () => {
        let place = '';
        (sniffPage || blogsPage) ? place = '#creation_div' : chatPage ? place = '#mess_form' : lsPage ? place = '#write_form' : place = '';
        if (!mainPage) $(place).before($("<div id='color_and_notes' style='display: none'></div>").html(''));
        else $($('textarea#text').parent()).before($("<div id='color_and_notes' style='display: none'></div>").html(''));
        colorPicker();
        notesfunc();
        if ($("#color_and_notes").html() != null) {
            notesflag = true;
            colorpickerflag = true;
        }
        if (currentSettings['notes'] || currentSettings['color_pick']) { $("#color_and_notes").css('display', 'block'); }
    }

    let stylishcat = () => { }

    var site_block = isFull ? '#branch' : '#site_table';

    let notesexport = () => {
        let mynotes = '';
        let notes_list = ['notes_main', 'notes_chat', 'notes_ls', 'notes_blogs', 'notes_sniff'];
        for (let x of notes_list) { mynotes += (' [sausage_mod_notes]: ' + window.localStorage.getItem(x)); }
        return mynotes;
    }

    let notessave = (exported) => {
        try {
        let notes_list = ['notes_main', 'notes_chat', 'notes_ls', 'notes_blogs', 'notes_sniff'];
        let notes_text = exported.split(' [sausage_mod_notes]: ');
        notes_text.shift();
        if (notes_text.length != 5) return 0;
        for (let x = 0; x < 5; x++) {
            window.localStorage.setItem(notes_list[x], notes_text[x]);
        }
            return 1; }
        catch {return 0; }
    }

            let settSave = (sett_id, value) => {
            currentSettings[sett_id] = value;
            window.localStorage.setItem(sett_id, value);
        }
        let settClear = (sett_color, sett_opacity) => {
            currentSettings[sett_color] = defaults[sett_color];
            currentSettings[sett_opacity] = defaults[sett_opacity];
            window.localStorage.setItem(sett_color, '');
            window.localStorage.setItem(sett_opacity, '');
        }

        let redesignClear = () => {
            var redesign = ['shower_fix', 'back_url', 'back_img', 'text_font', 'link_color', 'link_opacity', 'text_color', 'text_opacity', 'back_color', 'back_opacity', 'text_size']
            if (isFull) {
                var redesec = ['logo_url', 'logo_img', 'branch_left_img', 'branch_right_img'];
                redesign = redesign.concat(redesec);
            }
            for (let x = 0; x < redesign.length; x++) {
                currentSettings[redesign[x]] = defaults[redesign[x]];
                window.localStorage.setItem(redesign[x], '');
            }
        }

        let checkBoxLoad = (addr, value) => {
            $(addr).prop('checked', currentSettings[value]);
        }

    if (settingsPage) { // на странице настроек - загружаем настройки

        let redesignhtml = "Оставьте поле пустым, если хотите вернуть \"заводские\" настройки." +
            "</br><span title='Не будет работать в мобильной версии'>URL шапки: </span><input class='redesign' id='logo_img' type='url'>" +
            "</br>URL фона страницы: <input class='redesign' id='back_img' type='url'>" +
            "</br><span title='Не будет работать в мобильной версии'>URL левой боковой панели: </span><input class='redesign' id='branch_left_img' type='url'>" +
            "</br><span title='Не будет работать в мобильной версии'>URL правой боковой панели: </span><input class='redesign' id='branch_right_img' type='url' title='Для идентичности панелей впишите то же, что и вписано в URL левой панели'>" +
            "</br>Стиль шрифта текста: <input class='redesign' id='text_font'>" +
            "</br><span>Размер текста в пикселях (px)</span>: <input class='redesign' id='text_size' type='number' min='0' step='0.01' title='Дробные значения допустимы. Базовый размер шрифта: 0.9em'>" +
            "</br>Цвет текста: <input class='redesign' id='text_color' type='color' title='Базовый цвет текста дизайна: " + defaults['text_color'] +
            "'>. Прозрачность текста: <input class='redesign' id='text_opacity' type='number' min='0' max='255' step='0.01' title='Введите число от 0 до 255. Чем больше число, тем ниже будет прозрачность.'> <button id='design_textColorClear'>Сбросить настройки цвета текста</button>" +
            "</br>Цвет текста ссылок: <input class='redesign' id='link_color' type='color' title='Базовый цвет ссылок дизайна: " + defaults['link_color'] +
            "'>. Прозрачность ссылок: <input class='redesign' id='link_opacity' type='number' min='0' max='255' step='0.01' title='Введите число от 0 до 255. Чем больше число, тем ниже будет прозрачность.'> <button id='design_linkColorClear'>Сбросить настройки цвета ссылок</button>" +
            "</br>Цвет фона: <input class='redesign' id='back_color' type='color' title='Базовый цвет фона дизайна: " + defaults['back_color'] +
            "'>. Прозрачность фона: <input class='redesign' id='back_opacity' type='number' min='0' max='255' step='0.01' title='Введите число от 0 до 255. Чем больше число, тем ниже будет прозрачность.'> <button id='design_backColorClear'>Сбросить настройки цвета фона</button>" +
            "</br><label title='В случае, если пользовательские настройки для ссылок и фона не выставлены, будут использоваться цвета дизайна.'><input type='checkbox' class='checkboxes' id='shower_fix'>Принудительно заменять цвет ссылок и фона в блоке переключения между персонажами (независимо от настроек редизайнов)</label>" +
            "</br><button id='submitRedesign'>Применить настройки дизайнов</button> (полезно, если вы хотите увидеть результат здесь и сейчас) </br>или </br><button id='design_clear'>Сбросить все настройки дизайна</button> (вызывает обновление страницы)" +
            "<hr>"
        let css = `
  #redesign_wrap {
  position: fixed;
  left: 0;
  top: 0;
  z-index: 2;
  width: 100%;
  height: 100%;
  display: none;
  justify-content: center;
  align-items: center;
  background-color: rgba(0, 0, 0, 0.8);
}
#redesign {
  display: grid;
  grid-gap: 0.5em;
  width: auto;
  padding: 1em;
  background: ` + currentSettings['back_color']+`;
  color: ` + currentSettings['text_color']+currentSettings['text_opacity']+`;
  border: 1px solid #000000;
  border-radius: 15px;
  grid-template-areas: 'txt' 'hide';
}

.redesign_button:hover { text-decoration: none; color: #555555; }
.redesign_button { display: none; text-align: center; color: #000000; text-decoration: underline; cursor: pointer; }
#redesign_hide { grid-area: hide; }
#redesign_txt { grid-area: txt; padding-bottom: 5px; }
#redesign_txt a { color: ` + currentSettings['link_color']+currentSettings['link_opacity']+`; }
#redesign_hide { display: block; }
#redesign_click { text-decoration: underline;  cursor: pointer; }
#redesign_click:hover { text-decoration: none; }`

        $("head").append($('<style id=redesign_style></style>').html(css));

        $(site_block).append($('<div id="sausageSettings"></div>').html("<h2>Настройки мода-сосиски (версия " + version + ")</h2><a href='https://vk.com/rastite_sosiski' target='_blank'>Группа мода ВК</a>"));
        $("body").append($("<div id='redesign_wrap'></div>").html(`
        <div id="redesign">
        <div id="redesign_txt">` + redesignhtml + `</div>
        <div><span id="redesign_hide" class="redesign_button" onclick="$('#redesign_wrap').hide()">Скрыть</span></div>
        </div>
        `));
        $('div#sausageSettings').append($("<div id='redesign_click'></div>").html('<h3>Настройки редизайнов</h3>'));
        $('#redesign_click').on('click', function () {
            $('#redesign_wrap').css('display', 'flex');
        });
        $("div#sausageSettings").append($("<div id='site_modifications'></div>").html("<h3>Прочие настройки сайта</h3>"+
                                                                                      "<label><input type='checkbox' class='checkboxes' id='is_wound_warning_hidden'>Скрывать предупреждение о ранах (не рекомендуется)</label>"+
                                                                                      "</br><label><input type='checkbox' class='checkboxes' id='is_ad_hidden'>Скрывать рекламу в профиле</label>"+
                                                                                      "</br><label><input type='checkbox' class='checkboxes' id='color_pick'>Показывать окно выбора цвета для полей с bb-кодами</label>"+
                                                                                      "</br><label><input type='checkbox' class='checkboxes' id='notes'>Показывать заметки для полей с bb-кодами</label>"+
                                                                                      "</br></br>Экспортировать заметки: <textarea id='notes_export'>" + notesexport() + "</textarea> <button id='notes_export_copy'>Скопировать</button> <span id='copied_alert'></span>"+
                                                                                      "</br></br>Импортировать заметки: <textarea id='notes_import' placeholder='Импорт'></textarea> <button id='notes_import_save'>Сохранить</button> <span id='saved_alert'></span>"+
                                                                                      '<hr>'))
        css = `#notes_export, #notes_import { width: 200px; height: 30px; resize: none; }`
        $("head").append($('<style></style>').html(css));
        $(".redesign#logo_img").val(currentSettings["logo_img"]);
        $(".redesign#back_img").val(currentSettings["back_img"]);
        $(".redesign#branch_left_img").val(currentSettings["branch_left_img"]);
        $(".redesign#branch_right_img").val(currentSettings["branch_right_img"]);
        $(".redesign#text_font").val(currentSettings["text_font"]);
        $(".redesign#text_color").val(currentSettings["text_color"]);
        $(".redesign#link_color").val(currentSettings["link_color"]);
        $(".redesign#back_color").val(currentSettings["back_color"]);
        $(".redesign#text_opacity").val(currentSettings["text_opacity"]);
        $(".redesign#link_opacity").val(currentSettings["link_opacity"]);
        $(".redesign#back_opacity").val(currentSettings["back_opacity"]);
        $(".redesign#text_size").val(currentSettings["text_size"]);
        $("button#notes_export_copy").on("click", function () {
            $('#notes_export').prop('disabled', false);
            let notescopy = document.getElementById("notes_export");
            notescopy.select();
            notescopy.setSelectionRange(0, 99999);
            document.execCommand("copy");
            $('#notes_export').prop('disabled', true);
            $('#copied_alert').text("Скопировано!");
            setTimeout(function() { $('#copied_alert').text(""); }, 3000);
        });
        $("button#notes_import_save").on("click", function () {
            let flag = notessave($("#notes_import").val());
            if (flag) {
            $('#saved_alert').text("Сохранено!");
            }
            else {
                $('#saved_alert').text("Неизвестная ошибка");
            }
            setTimeout(function() { $('#saved_alert').text(""); }, 3000);
            });
        $("button#design_textColorClear").on("click", function () { settClear('text_color', 'text_opacity') });
        $("button#design_linkColorClear").on("click", function () { settClear('link_color', 'link_opacity') });
        $("button#design_backColorClear").on("click", function () { settClear('back_color', 'back_opacity') });
        $("button#design_clear").on("click", function () { redesignClear(); window.location.reload(true); })
        $("button#submitRedesign").on('click', function () { fullRedesign() });

        $("div#sausageSettings").append($("<div id='cw3_modifications'></div>").html("<h3>Дополнительные функции для Игровой</h3>" +
                                                                                     "<label><input type='checkbox' class='checkboxes' id='cages_nums'>Пронумеровать клетки в Игровой</label></br>" +
                                                                                     "Цвет цифр: <input class='sauscw3' id='cages_nums_color' type='color'></br>" +
                                                                                     "Цвет тени цифр: <input class='sauscw3' id='cages_nums_shadow' type='color'> (рекомендуется поставить контрастный)</br>" +
                                                                                     "<label><input type='checkbox' class='checkboxes' id='might_log_check'>Вести лог выпадения БУ с тренировок</label></br>"+
                                                                                     "<label><input type='checkbox' class='checkboxes' id='is_wound_alert_hidden'>Скрывать уведомление о пониженном здоровье при загрузке Игровой</label></br>"+
                                                                                     "<label><input type='checkbox' class='checkboxes' id='cw3_shower_fix'>Исправлять наложение компактной игровой на строку перехода на других персонажей (не всегда работает)</label></br>"));
        $("input#shower_fix").on("load", checkBoxLoad("input#shower_fix", 'shower_fix'));
        $("input#cw3_shower_fix").on("load", checkBoxLoad("input#cw3_shower_fix", 'cw3_shower_fix'));
        $("input#cages_nums").on("load", checkBoxLoad("input#cages_nums", 'cages_nums'));
        $("input#is_wound_warning_hidden").on("load", checkBoxLoad("input#is_wound_warning_hidden", 'is_wound_warning_hidden'));
        $("input#is_wound_alert_hidden").on("load", checkBoxLoad("input#is_wound_alert_hidden", 'is_wound_alert_hidden'));
        $("input#is_ad_hidden").on("load", checkBoxLoad("input#is_ad_hidden", 'is_ad_hidden'));
        $("input#might_log_check").on("load", checkBoxLoad("input#might_log_check", 'might_log_check'));
        $("input#color_pick").on("load", checkBoxLoad("input#color_pick", 'color_pick'));
        $("input#notes").on("load", checkBoxLoad("input#notes", 'notes'));
        $(".sauscw3#cages_nums_color").val(currentSettings["cages_nums_color"]);
        $(".sauscw3#cages_nums_shadow").val(currentSettings["cages_nums_shadow"]);
        $("input.redesign").on("change", function () { settSave($(this).attr('id'), $(this).val()) });
        $("input.sauscw3").on("change", function () { settSave($(this).attr('id'), $(this).val()) });
        $("input.checkboxes").on("click", function () { settSave($(this).attr('id'), toBool($(this).prop('checked'))) });

        $("#sausageSettings").append($("</br></br><hr><hr></br></br>"));

    }

    else if (cw3Page) {
        let mlchide = () => { if (currentSettings['might_log_check']) {
            if ($("#mightlogbutton").html() == '') { $('#parameter').append($('<div id="mightlogbutton"></div>').html('Лог тренировок')); }
            else { $("#mightlogbutton").css('display', 'block') }; }
                             else $("#mightlogbutton").css('display', 'none'); }

        let cagnumshide = () => { if (currentSettings['cages_nums']) {
            if ($("#cages_nums").html() == '') { cagesNumbers(); } }
                             else $("#cages_nums").remove() }

        let showfixchange = () => { if (currentSettings['cw3_shower_fix']) {
            if (currentSettings['is_shower_cw3']) { $('span.small').prepend($(".other_cats_list")) } }
            else $('#app').prepend($(".other_cats_list")) }

        if (currentSettings['cw3_fast_sett']) {
            $("#tr_mouth .title").before($("<div id='cw3_sausage_setts'></div>").html("<span>Быстрые настройки мода-сосиски</span><hr>"));
            $('#cw3_sausage_setts span').on('click', function () { $('#cw3saussetts_wrap').css('display', 'flex'); });
            let cw3saussetts_txt = "<label><input type='checkbox' class='checkboxes' id='cages_nums'>Пронумеровать клетки в Игровой</label></br>" +
                "Цвет цифр: <input class='sauscw3' id='cages_nums_color' type='color'></br>" +
                "Цвет тени цифр: <input class='sauscw3' id='cages_nums_shadow' type='color'> (рекомендуется поставить контрастный)</br>" +
                "<label><input type='checkbox' class='checkboxes' id='might_log_check'>Вести лог выпадения БУ с тренировок</label></br>"+
                "<label><input type='checkbox' class='checkboxes' id='is_wound_alert_hidden'>Скрывать уведомление о пониженном здоровье при загрузке Игровой</label></br>"+
                "<label><input type='checkbox' class='checkboxes' id='cw3_shower_fix'>Исправлять наложение компактной игровой на строку перехода на других персонажей (не всегда работает)</label></br>";
            let html = `
            <div id='cw3saussetts'>
            <div id='cw3saussetts_txt'> ` + cw3saussetts_txt + `</div>
            <div><span id='cw3saussetts_hide' class="cw3saussetts_button" onclick="$('#cw3saussetts_wrap').hide()">Закрыть</span></div>
            </div>
            `
            $('body').append($("<div id='cw3saussetts_wrap'></div>").html(html));
            $('head').append($("<style></style>").html(`
            #cw3_sausage_setts span {
            text-decoration: underline;
            font-weight: bold;
            font-size: 110%;
            padding: 10px;
            }
            #cw3_sausage_setts span:hover {
            text-decoration: none;
            cursor: pointer;
            }
              #cw3saussetts_wrap {
  position: fixed;
  left: 0;
  top: 0;
  z-index: 2;
  width: 100%;
  height: 100%;
  display: none;
  justify-content: center;
  align-items: center;
  background-color: rgba(0, 0, 0, 0.8);
}
#cw3saussetts {
  display: grid;
  grid-gap: 0.5em;
  width: auto;
  padding: 1em;
  background: #FFFFFF;
  color: #000000;
  border: 1px solid #000000;
  border-radius: 15px;
  grid-template-areas: 'txt' 'hide';
}

.cw3saussetts_button:hover { text-decoration: none; color: #555555; }
.cw3saussetts_button { display: none; text-align: center; color: #000000; text-decoration: underline; cursor: pointer; }
#cw3saussetts_hide { grid-area: hide; }
#cw3saussetts_txt { grid-area: txt; padding-bottom: 5px; }
#cw3saussetts_txt a { color: ` + currentSettings['link_color']+currentSettings['link_opacity']+`; }
#cw3saussetts_hide { display: block; }
            `));
            $("input#cw3_shower_fix").on("load", checkBoxLoad("input#cw3_shower_fix", 'cw3_shower_fix'));
        $("input#cages_nums").on("load", checkBoxLoad("input#cages_nums", 'cages_nums'));
        $("input#is_wound_alert_hidden").on("load", checkBoxLoad("input#is_wound_alert_hidden", 'is_wound_alert_hidden'));
        $("input#might_log_check").on("load", checkBoxLoad("input#might_log_check", 'might_log_check'));
        $(".sauscw3#cages_nums_color").val(currentSettings["cages_nums_color"]);
        $(".sauscw3#cages_nums_shadow").val(currentSettings["cages_nums_shadow"]);
        $("input.sauscw3").on("change", function () { settSave($(this).attr('id'), $(this).val());
                                                    });
        $("input.checkboxes").on("click", function () { settSave($(this).attr('id'), toBool($(this).prop('checked')));
                                                      if ($(this).attr('id') == 'might_log_check') mlchide();
                                                       else if ($(this).attr('id') == 'cages_nums') cagnumshide();
                                                       else if ($(this).attr('id') == 'cw3_shower_fix') showfixchange();});
        }

        if (currentSettings['might_log_check']) {
            let log_height = '';
            isFull ? log_height = 'max-height: 800px;' : log_height = 'max-height: 500px;'
            let css = `
  #mightlogwrap {
  position: fixed;
  left: 0;
  top: 0;
  z-index: 2;
  width: 100%;
  height: 100%;
  display: none;
  justify-content: center;
  align-items: center;
  background-color: rgba(0, 0, 0, 0.5);
}
#mightlog {
  display: grid;
  grid-gap: 0.5em;
  width: auto;
  padding: 1em;
  background: #FFFFFF;
  color: #000000;
  border: 1px solid #000000;
  border-radius: 15px;
  grid-template-areas: 'txt txt' 'count count' 'clear hide';
}

.mightlog_button:hover { text-decoration: none; color: #555555; }
.mightlog_button { display: none; text-align: center; color: #000000; text-decoration: underline; cursor: pointer; }
#mightlog_count {grid-area: count; }
#mightlog_clear { grid-area: clear; }
#mightlog_hide { grid-area: hide; }
#mightlog_txt { grid-area: txt; padding-bottom: 5px; text-align: center; ` + log_height + ` overflow: auto; }
#mightlog_clear, #mightlog_hide { display: block; }`
      $('body').append($('<div id="mightlogwrap"></div>').html(`
        <div id="mightlog">
        <div id="mightlog_txt">` + currentSettings['might_log'] + `</div>
        <div id="mightlog_count">Всего выпало с последней очистки: ` + currentSettings['count_drop'] +  `</div>
        <div id="mightlog_clear" class="mightlog_button">Очистить лог</div>
        <div id="mightlog_hide" class="mightlog_button" onclick="$('#mightlogwrap').hide()">Скрыть лог</div>
        </div>
        `));
            $("#mightlog_clear").on('click', function () {
                currentSettings['might_log'] = defaults['might_log'];
                window.localStorage.setItem('might_log', currentSettings['might_log']);
                currentSettings['count_exersizes'] = defaults['count_exersizes'];
                window.localStorage.setItem('count_exersizes', currentSettings['count_exersizes']);
                currentSettings['might_log_before_count'] = defaults['might_log_before_count'];
                window.localStorage.setItem('might_log_before_count', currentSettings['might_log_before_count']);
                currentSettings['count_drop'] = defaults['count_drop'];
                window.localStorage.setItem('count_drop', currentSettings['count_drop']);
                $("#mightlog_txt").html(currentSettings["might_log"]);
                $("#mightlog_count").html("Всего выпало с последней очистки: "+currentSettings["count_drop"]);
                $('#mightlogwrap').hide();
            });
            $("head").append($('<style id=mightlog_style></style>').html(css));
            $('#parameter').append($('<div id="mightlogbutton"></div>').html('Лог тренировок'));
            css = `
        #mightlogbutton { margin-left: 17px; text-decoration: underline;  cursor: pointer; }
        #mightlogbutton:hover { text-decoration: none; }
        `
      $("head").append($('<style id=mightlogbutton_style></style>').html(css));
            $('#mightlogbutton').on('click', function () {
                $('#mightlogwrap').css('display', 'flex');
            });
            setTimeout(function() { $("#mightlog_txt").html(currentSettings["might_log"]); $("#mightlog_count").html("Всего выпало с последней очистки: "+currentSettings["count_drop"]); }, 300);
        }
    }

    else if (sniffPage || mainPage || lscreate || chatPage || blogsPage) {
        colornotes();
    }
    else if (profilePage) {
        $("b:contains('О себе:')").append($("<span></span>").text(" "));
        $("b:contains('О себе:')").append($("<span class='about-hide-content' id='about-hide'></span>").text("свернуть"));
        $("b:contains('О себе:')").append($("<span class='about-hide-content' id='about-show' style='display:none;'></span>").text("развернуть"));
        $("head").append($("<style></style").html(`.about-hide-content { text-decoration:underline; font-weight: normal; }
                                                  .about-hide-content:hover { text-decoration:none; }
                                                  `));
        $("table[style*='width:100%']").attr("id", "about-table");
        $("#about-hide").on('click', function() {
            $("#about-table").css({"display":"none", 'width':'100%'});
            $("#about-show").css("display", "inline");
            $("#about-hide").css("display", "none");
        });
        $("#about-show").on('click', function() {
            $("#about-table").css({"display":"table", 'width':'100%'});
            $("#about-show").css("display", "none");
            $("#about-hide").css("display", "inline");
        });
    }

    var redesignUpdateObserver = new MutationObserver(function () {
        fullRedesign();
    });

    var colNotObserver = new MutationObserver(function () {
        if ($('div#write_div').html() == null) {
            notesflag = false;
            colorpickerflag = false; }
        else if (!notesflag && !colorpickerflag) {
            pageLocation = window.location.href;
            lscreate = (/^https?:\/\/\w?\.?catwar.net\/ls[?]new/.test(pageLocation));
            colornotes();
        }
    });

    var alertObserver = new MutationObserver(function () {
        woundAlertHide();
    });

    var cagesObserver = new MutationObserver(function() {

    });

    var redesignUpdateTarget = document.getElementById("site_table");
    var actTarget = document.getElementById("block_mess");
    var alertTarget = document.getElementById('error');
    var colNotTarget = document.getElementById(site_block.slice(1));
    var cagesTarget = document.getElementById('cages');

    var actObserver = new MutationObserver(function () {
        var actions = document.getElementById("block_mess");
        var timer = document.getElementById("sek");
        if (timer.innerHTML == '1 с') {
            setTimeout(function () { mightSkillUpd(); }, 2000);
        }
    });
    var timeout_observer = new MutationObserver(function () {
        var actions = document.getElementById("block_mess");
        var timer = document.getElementById("sek");
        if (actions.innerHTML.indexOf("Успокаиваться") != -1 && timer.innerHTML == '5 с') {
            actObserver.observe(actTarget, { childList: true, attributes: true, characterData: true, subtree: true });
        }
        if (timer.innerHTML == '1 с') {
        setTimeout(function () { actObserver.disconnect(); }, 3000);
        }
    });

    $(function () {
        if (!cw3Page) {
            fullRedesign();
            if (currentSettings['is_wound_warning_hidden']) { $('#warningAboutWound').css('display', 'none') }
            if (currentSettings['is_ad_hidden'] && mainPage) { $('#t').css('display', 'none') }
            if (chatPage || blogsPage || sniffPage || aboutPage) {
                redesignUpdateObserver.observe(redesignUpdateTarget, { childList: true, attributes: true, characterData: true, subtree: true });
            }
            if (lsPage) {
                colNotObserver.observe(colNotTarget, { childList: true, characterData: true, subtree: true });
            }

        }
        else if (cw3Page) {
            cagesNumbers();
            timeout_observer.observe(actTarget, { childList: true, attributes: true, characterData: true, subtree: true });
            alertObserver.observe(alertTarget, { childList: true, attributes: true, characterData: true, subtree: true });
            cagesObserver.observe(cagesTarget, { childList: true, characterData: true, subtree: true });
            if (currentSettings['is_shower_cw3'] && currentSettings['cw3_shower_fix']) { $('span.small').prepend($(".other_cats_list")) };
        };
    });
});