Greasy Fork is available in English.

Webgame aliance / zebricek - lupa, rozvojky, detaily valek

Lupa

このスクリプトの質問や評価の投稿はこちら通報はこちらへお寄せください。
// ==UserScript==
// @name         Webgame aliance / zebricek - lupa, rozvojky, detaily valek
// @version      2024-06-17
// @description  Lupa
// @author       yS
// @match        *://*.webgame.cz/wg/index.php?p=najit&s=najittag&*
// @match        *://*.webgame.cz/wg/index.php?p=zebricek&s=zebricek*
// @match        *://*.webgame.cz/wg/index.php?p=zebricek
// @match        *://*.webgame.cz/wg/index.php?p=zebricek&limit=*
// @match        *://*.webgame.cz/wg/index.php?p=dotace&s=hhelp
// @match        *://*.webgame.cz/wg/index.php?p=aliance
// @match        *://*.webgame.cz/wg/index.php?p=aliance&s=aliance
// @match        *://*.webgame.cz/wg/index.php?p=aliance&s=asmlouvy
// @match        *://*.webgame.cz/wg/index.php?p=najit&s=najittag*
// @match        *://*.webgame.cz/wg/index.php?p=spojenectvi&s=watchlist
// @match        *://*.webgame.cz/wg/index.php?p=valka&s=strike
// @grant        GM_setValue
// @grant        GM_getValue
// @icon         https://www.google.com/s2/favicons?sz=64&domain=webgame.cz
// @namespace https://greasyfork.org/users/1005892
// ==/UserScript==

"use strict";

const MAX_ACCEPTED_DEVIATION = 0.2;
const INFO_TOO_OLD = 24 * 60 * 60;
const COLUMN_PRESTIGE = 4;
const DATA_SEPARATOR = "<br>";
const HUMKA_LINK = "index.php?p=dotace&s=hhelp";
const ALI_VALKY = "index.php?p=konflikty&s=awarstat&getali=";
const ZOBRAZENE_PREVIEW_INFILTRACE = "show_info_preview";
const PREVIEW_INFILTRACE_TYPE = "info_preview_type"; // 1 = preview next to the members table, 2 = in tooltip

let is_humka = document.location.href.indexOf("hhelp") != -1;
let is_watchlist = document.location.href.indexOf("s=watchlist") != -1;
let is_zebricek = document.location.href.indexOf("zebricek") != -1;
let is_ali = document.location.href.indexOf("aliance") != -1;
let is_smlouvy = document.location.href.indexOf("smlouvy") != -1;
let is_any_ali_detail = document.location.href.indexOf("s=najittag") != -1;
let is_strike = document.location.href.indexOf("index.php?p=valka&s=strike") != -1;

let last_preview_id = null;

let ali_player_count = null;

if (is_humka == true) {
    prepareHumka();
    return;
}

if (is_watchlist) {
    modifyWatchlist();
    return;
}

if (is_strike) {
    modifyStrike();
    return;
}

let ali_tag = null,
    wars_table_id = null;

if (is_ali == true) {
    if (is_smlouvy == true) {
        let element = document.getElementsByName("ali")[0];
        if (element == null) return;
        ali_tag = element.value;

        element = document.querySelector(".infotext strong");
        if (element == null) return;
        ali_player_count = parseInt(element.innerText);

        wars_table_id = "vis_tbl";
    } else {
        getAliDetailPlayerCount();
        rozvojBeerAli();
        ali_tag = getAliTag();
        wars_table_id = "alliance-treaties-wars";
    }
} else {
    const is_info_preview_visible = getSetting(ZOBRAZENE_PREVIEW_INFILTRACE, false);
    const info_preview_type = getSetting(PREVIEW_INFILTRACE_TYPE, 1);

    let table = is_zebricek ? document.getElementById("zebricek") : document.getElementById("alliance-members");

    modifyInfiltrace(table, is_zebricek || info_preview_type == 2);
    rozvojBeer();

    if (is_any_ali_detail == true) {
        getAliPlayerCount();
        addInfiltrationPreviewToggle();

        if (is_info_preview_visible) {
            switch (info_preview_type) {
                case 1:
                    addInfoPreview();
                    break;
                case 2:
                    addInfoPreviewInTooltip(table, false, 660);
                    break;
            }
        }

        let header = document.getElementsByClassName("rdatar")[0];
        ali_tag = header.innerText.split("]")[0].split("[")[1];
        wars_table_id = "find-treaties-wars";

        let smlouva_elements = document.getElementsByClassName("smlouva");
        if (smlouva_elements.length > 0) {
            for (let i = 0; i < smlouva_elements.length; i++) {
                smlouva_elements[i].classList.add("l");
            }
        }
    }
    if (is_zebricek === true) {
        addInfoPreviewInTooltip(table);

        let elements = document.getElementsByClassName("top10separator");
        if (elements.length === 0) {
            return;
        }
        elements[0].colSpan = 100;
    }
}

if (ali_tag != null) {
    let wars_map;
    if (is_smlouvy == true) {
        wars_map = getAktivniValkyInSmlouvy(wars_table_id, ali_tag);
    } else {
        wars_map = getAktivniValky(wars_table_id, ali_tag);
    }
    if (wars_map != null) {
        httpGetAsync(ALI_VALKY + ali_tag, editWarTable, wars_map, ali_tag);
    }
}

//////////////////////////////////////////
//              FUNCTIONS               //
//////////////////////////////////////////

function setSetting(setting_name, value) {
    // eslint-disable-next-line no-undef
    GM_setValue(setting_name, value);
}

function getSetting(setting_name, default_value) {
    // eslint-disable-next-line no-undef
    return GM_getValue(setting_name, default_value);
}

async function modifyStrike() {
    const table = document.getElementById("war-attack-confirm");

    prepareStrike(table);

    let element = table.querySelector("a");
    let parts = element.href.split("=");
    let country_id = parts[parts.length - 1];

    const cloned_nodes = await fetchCountryData(country_id, null);
    if (cloned_nodes == null) {
        return;
    }

    const link = cloned_nodes[0].href;
    const preview_id = link.split("target=")[1];
    last_preview_id = preview_id;

    fetchInfiltrationTable(link, preview_id, 0).then((result) => {
        placeInfiltrationTableNextToTable(result, table);
    });
}

async function modifyWatchlist() {
    let tables = document.getElementsByClassName("vis_tbl");
    let table;

    if (tables.length == 0) {
        return;
    }

    for (let index = 0; index < tables.length; index++) {
        table = tables[index];

        if (table.rows[0].cells.length > 6) {
            break;
        }
    }

    let th = document.createElement("th");
    th.textContent = "Infiltrace";
    table.rows[0].appendChild(th);

    let player_ids = new Set();
    let country_data = new Map();

    for (let index = 1; index < table.rows.length; index++) {
        const row = table.rows[index];
        row.insertCell();

        if (row.cells[3].textContent === "-") {
            continue;
        }

        const country_id = row.cells[1].textContent.split("(#")[1].split(")")[0];

        const player_id = Number(row.cells[2].textContent);
        player_ids.add(player_id);
        country_data.set(country_id, row);

        // cell
    }

    let promises = [];

    for (const player_id of player_ids) {
        promises.push(fetchPlayerData(player_id, country_data));
    }

    Promise.all(promises).then(() => {
        modifyInfiltrace(table, true, 1, false);
        addInfoPreviewInTooltip(table, true, 660, 1);
    });
}

function fetchCountryData(country_id, country_data) {
    let url = "index.php?p=najit&s=najitzem&hid=" + country_id;

    return fetchData(url, country_data);
}

function fetchPlayerData(player_id, country_data) {
    let url = "index.php?p=najit&s=najitzem&hpid=" + player_id;

    return fetchData(url, country_data);
}

function fetchData(url, country_data) {
    return new Promise((resolve) => {
        let xmlHttp = new XMLHttpRequest();
        xmlHttp.onreadystatechange = function () {
            if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
                const cloned_nodes = fetchPlayerInfiltrace(xmlHttp, country_data);
                resolve(cloned_nodes);
            }
        };
        xmlHttp.open("GET", url, true); // true for asynchronous
        xmlHttp.send(null);

        // httpGetAsync(url, fetchPlayerInfiltrace, country_data);
    });
}

function fetchPlayerInfiltrace(req, country_data) {
    let parser = new DOMParser();
    let doc = parser.parseFromString(req.response, "text/html");

    let infiltration_elements = doc.querySelectorAll("img[alt=Infiltrace]");
    if (infiltration_elements.length == 0) {
        return;
    }

    let row,
        cloned_nodes = [];

    for (let i = 0; i < infiltration_elements.length; i++) {
        const link = infiltration_elements[i].parentElement;
        const url_parts = link.href.split("=");
        const country_id = url_parts[url_parts.length - 1];

        let cloned_node = link.cloneNode(true);
        if (country_data !== null) {
            row = country_data.get(country_id);
            row.cells[row.cells.length - 1].appendChild(cloned_node);
        }
        cloned_nodes.push(cloned_node);
    }
    return cloned_nodes;
}

function prepareHumka() {
    let id_zeme = localStorage.getItem("humka");
    if (id_zeme == null) {
        return;
    }
    localStorage.removeItem("humka");
    let input = document.querySelector("input.subnormal");
    if (input != null) {
        input.value = id_zeme;
    }
}

function rozvojBeerAli() {
    let rozvoj_elements = document.querySelectorAll("td span:not(.on, .off, .onoff)");

    for (let i = 0; i < rozvoj_elements.length; i++) {
        if (rozvoj_elements[i].innerText != "Rozv") {
            continue;
        }

        let row = rozvoj_elements[i].parentElement.parentElement;
        let id_zeme = row.children[2].children[1].href.split("=");
        id_zeme = parseInt(id_zeme[id_zeme.length - 1]);

        let button = createRozvojBeerButton(id_zeme);
        let link = createRozvojBeerLink();
        const button_text = "Rozv ";

        let rozvoj_text = document.createElement("span");
        rozvoj_text.innerText = button_text;
        rozvoj_text.style.fontWeight = "bold";
        rozvoj_elements[i].innerHTML = "";
        rozvoj_elements[i].append(link);

        button.insertBefore(rozvoj_text, button.children[0]);
        link.appendChild(button);
    }
}

function rozvojBeer() {
    let select_query;
    let zeme_name;
    if (is_zebricek) {
        select_query = ".prot.c";
        zeme_name = 5;
    } else {
        select_query = "td.pakt, td.red, .prot";
        zeme_name = 1;
    }

    let rozvoj_elements = document.querySelectorAll(select_query);

    for (let i = 0; i < rozvoj_elements.length; i++) {
        if (rozvoj_elements[i].innerText.indexOf("Rozv") === -1) {
            continue;
        }

        let row = rozvoj_elements[i].parentElement.children[2];
        let id_zeme = row.children[zeme_name].href.split("=");
        id_zeme = parseInt(id_zeme[id_zeme.length - 1]);

        let button = createRozvojBeerButton(id_zeme);
        let link = createRozvojBeerLink();
        const button_text = is_zebricek ? "Rozv " : "(Rozv.) ";

        let rozvoj_text;
        if (is_zebricek && rozvoj_elements[i].children.length > 0) {
            rozvoj_text = rozvoj_elements[i].children[0];
            rozvoj_text.innerText = rozvoj_text.innerText + " ";
            rozvoj_text.classList.add("pakt");
            rozvoj_elements[i].replaceChild(link, rozvoj_text);
        } else {
            rozvoj_text = document.createElement("span");
            rozvoj_text.innerText = button_text;
            rozvoj_text.style.fontWeight = "bold";
            rozvoj_elements[i].innerHTML = "";
            rozvoj_elements[i].append(link);
        }

        button.insertBefore(rozvoj_text, button.children[0]);
        link.appendChild(button);
    }
}

function createRozvojBeerButton(id_zeme) {
    let button = document.createElement("button");
    button.type = "button";
    button.style.backgroundColor = "transparent";
    button.style.cursor = "unset";
    button.style.fontFamily = "unset";
    button.style.color = "unset";
    button.addEventListener("click", () => {
        localStorage.setItem("humka", id_zeme);
    });

    let beer = document.createElement("img");
    beer.src = "img/smiles/icon_beer.gif";
    beer.alt = "Humka";

    button.appendChild(beer);
    return button;
}

function createRozvojBeerLink() {
    let link = document.createElement("a");
    link.style.color = "unset";
    link.href = HUMKA_LINK;
    link.title = "Poslat humanitární pomoc";
    return link;
}

function addInfiltrationPreviewToggle() {
    let table = document.getElementById("find-alliance-summary");
    const cell = table.rows[1].cells[2];

    const is_info_preview_visible = getSetting(ZOBRAZENE_PREVIEW_INFILTRACE, false);
    const info_preview_type = getSetting(PREVIEW_INFILTRACE_TYPE, 1);

    let a = document.createElement("a");
    a.style.marginLeft = "2rem";
    a.title = "Náhled infiltrace zobrazí nejnovější infiltraci vlády pro danou zemi (musí se najet na lupu, nevyžaduje klik)";
    a.textContent = is_info_preview_visible ? "Vypnout náhled infiltrace" : "Zapnout náhled infiltrace";
    a.href = "javascript:void(0)";
    a.addEventListener("click", () => {
        setSetting(ZOBRAZENE_PREVIEW_INFILTRACE, !is_info_preview_visible);
        location.reload();
    });
    cell.appendChild(a);

    a = document.createElement("a");
    a.textContent = info_preview_type === 1 ? "Zobrazit náhled infiltrace v tooltipu" : "Zobrazit náhled infiltrace vedle tabulky";
    a.href = "javascript:void(0)";
    a.style.marginLeft = "2rem";
    a.addEventListener("click", () => {
        setSetting(PREVIEW_INFILTRACE_TYPE, 3 - info_preview_type);
        location.reload();
    });
    cell.appendChild(a);
}

function modifyInfiltrace(table, remove_titles = false, prestige_offset = 0, add_header = !is_zebricek) {
    let lupa_elements = document.querySelectorAll("img[src='img/lupa.gif']");

    if (add_header) {
        let th = document.createElement("th");
        table.rows[0].appendChild(th);
    }
    table.rows[0].children[table.rows[0].children.length - 1].innerHTML = "Infiltrace";

    for (let i = 0; i < lupa_elements.length; i++) {
        let row = lupa_elements[i].parentElement.parentElement.parentElement;

        let columns = row.getElementsByTagName("td");
        let prestige = columns[COLUMN_PRESTIGE + prestige_offset].textContent;

        prestige = parseInt(prestige.replace(/\s/g, ""));

        if (is_zebricek == true) {
            prestige = prestige * 1000;
        }

        modifyMagnifyingGlass(prestige, lupa_elements[i], remove_titles);
    }
}

function getPrestigeDifference(current_prestige, info_prestige, round_to_thousands = false) {
    let prestige_difference = current_prestige - info_prestige;
    if (round_to_thousands) {
        prestige_difference = Math.round(prestige_difference / 1000);
    }
    if (prestige_difference > 0) {
        prestige_difference = "+" + prestige_difference;
    }

    return prestige_difference;
}

function modifyMagnifyingGlass(current_prestige, lupa_element, remove_titles = false) {
    // get image
    if (lupa_element.title == null) {
        return;
    }
    // get title from the image
    let title = lupa_element.title;
    let index = title.indexOf("Prestiž");
    if (index == -1) {
        return;
    }
    // get prestige from the title
    let prestiz = title.substr(index + 8);
    let mil_multiplier = prestiz.slice(-1) == "M" ? 1000 : 1;

    prestiz = parseFloat(prestiz.slice(0, -1) * mil_multiplier) * 1000;
    let prestige_difference = getPrestigeDifference(current_prestige, prestiz, true);
    let parent = lupa_element.parentElement;

    if (current_prestige > prestiz) {
        if (current_prestige - prestiz > prestiz * MAX_ACCEPTED_DEVIATION) {
            parent.parentElement.style = "background:#AA3333"; // current prestige is too high from before -> enemy played / bought
        }
    } else {
        if (prestiz - current_prestige > prestiz * MAX_ACCEPTED_DEVIATION) {
            parent.parentElement.style = "background:#AA3333"; // current prestige is too low from before -> enemy got attacked
        }
    }

    // get date from the title
    let index_start = title.indexOf("]") + 2;
    let index_end = title.indexOf(" |") - 1;
    let time = title.slice(index_start, index_end);

    let time_difference = processTime(time, parent);

    let span = document.createElement("span");
    span.innerText = " " + time_difference + " (" + prestige_difference + "k)";

    if (!remove_titles) {
        span.title = lupa_element.title;
    } else {
        lupa_element.title = "";
    }

    // show how old the info is
    parent.append(span);
}

function getAliDetailPlayerCount() {
    getPlayerCount(0);
}

function getAliPlayerCount() {
    getPlayerCount(1);
}

function getPlayerCount(table_index) {
    let table_elements = document.getElementsByClassName("vis_tbl");
    ali_player_count = table_elements[table_index].rows.length - 3;
}

// funkce valky info
function httpGetAsync(theUrl, callback, wars, ali_tag) {
    var xmlHttp = new XMLHttpRequest();
    xmlHttp.onreadystatechange = function () {
        if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
            callback(xmlHttp, wars, ali_tag);
        }
    };
    xmlHttp.open("GET", theUrl, true); // true for asynchronous
    xmlHttp.send(null);
}

function getAliTag() {
    let elements = document.getElementsByClassName("check-afflict");
    if (elements == null) {
        return;
    }

    let odejit_button = elements[0];
    return odejit_button.dataset.tag;
}

function getAktivniValky(table_id, ali_tag) {
    let table_element = document.getElementById(table_id);
    if (table_element == null) {
        return null;
    }

    table_element.style.textAlign = "center";
    let wars_map = new Map();
    for (let i = 1; i < table_element.rows.length; i++) {
        let row = table_element.rows[i];
        let column = row.children[0];
        if (column.colSpan == 3) {
            continue;
        }
        let enemy_index = 0;
        let enemy_ali = column.children[enemy_index].innerText;
        if (enemy_ali == ali_tag) {
            enemy_index = 1;
            enemy_ali = column.children[enemy_index].innerText;
        }
        wars_map.set(enemy_ali, [table_element.rows[i], enemy_index]);
    }
    return wars_map;
}

function getAktivniValkyInSmlouvy(class_name, ali_tag) {
    let table_element = document.getElementsByClassName(class_name);
    if (table_element == null || table_element.length == 0) {
        return null;
    }
    table_element = table_element[0];

    table_element.style.textAlign = "center";
    let wars_map = new Map();
    for (let i = 1; i < table_element.rows.length; i++) {
        let row = table_element.rows[i];

        let column = row.children[0];
        if (column.colSpan == 3 || column.rowSpan == 2) {
            continue;
        }

        column = row.children[1];
        if (column == null || column.innerText == "Pakt") {
            continue;
        }

        column = row.children[0];

        let enemy_index = 0;
        let enemy_ali = column.children[enemy_index].innerText;
        if (enemy_ali == ali_tag) {
            enemy_index = 1;
            enemy_ali = column.children[enemy_index].innerText;
        }
        wars_map.set(enemy_ali, [table_element.rows[i], enemy_index]);
    }
    return wars_map;
}

function processWars(response, wars_map, ali_tag) {
    const parser = new DOMParser();
    const doc = parser.parseFromString(response.response, "text/html");
    let tables = doc.querySelectorAll(".container .vis_tbl");
    let keys = Array.from(wars_map.keys());

    // projit tabulky

    const wars_data = new Map();
    // ziskat nazev ali ve valce
    let offset = tables[0].rows[0].children[0].innerText == "Věk skončil" ? 1 : 0;

    for (let i = 1 + offset; i < tables.length; i++) {
        const table = tables[i];

        if (table.rows[1].children.length != 3) {
            continue;
        }

        let ali_1 = table.rows[2].cells[1].textContent; //vyhlasujici ali
        let ali_2 = table.rows[2].cells[2].textContent; //ali, na kterou bylo vyhlaseno

        let my = 2;
        let key = ali_1;
        if (ali_1 == ali_tag) {
            my = 1;
            key = ali_2;
        }
        if (keys.includes(key) == false) {
            continue;
        }

        // vytezit "neaktivni muze byt za ...."
        let neaktivni_za_element = table.rows[1].cells[2];

        // vytezit dobyte uzemi (my / oni)
        let dobyte_uzemi_1 = parseInt(table.rows[3].cells[my].innerText);
        let dobyte_uzemi_2 = parseInt(table.rows[3].cells[3 - my].innerText);

        // vytezit normalni utoky + celkove (jestli je splneno / porovnani vuci nam)
        let normalni_utoky_1 = parseInt(table.rows[8].cells[my].innerText);
        let normalni_utoky_2 = parseInt(table.rows[8].cells[3 - my].innerText);

        let celkem_utoky_1 = parseInt(table.rows[10].cells[my].innerText);
        let celkem_utoky_2 = parseInt(table.rows[10].cells[3 - my].innerText);

        let expy_1 = parseInt(table.rows[7].cells[my].textContent);
        let expy_2 = parseInt(table.rows[7].cells[3 - my].textContent);

        let zacatek_war = table.rows[1].children[0].children[0].innerText;

        let war = {
            dobyte_uzemi_my: dobyte_uzemi_1,
            dobyte_uzemi_oni: dobyte_uzemi_2,
            normalni_utoky_my: normalni_utoky_1,
            normalni_utoky_oni: normalni_utoky_2,
            celkem_utoky_my: celkem_utoky_1,
            celkem_utoky_oni: celkem_utoky_2,
            celkem_zkusenosti_my: expy_1,
            celkem_zkusenosti_oni: expy_2,
            neaktivni_element: neaktivni_za_element,
            nase_war: my == 1,
            zacatek_war: zacatek_war,
        };

        // vratit asi v mape, klic - ali, se kterou valcime, obsah = vytezene udaje
        wars_data.set(key, war);
        let index = keys.indexOf(key);
        keys.splice(index, 1);
        if (keys.length == 0) {
            break;
        }
    }
    return wars_data;
}

function editWarTable(response, wars_map, ali_tag) {
    const konflikty_url = "index.php?p=konflikty&hours_9=72&spec=9&alia_9=$ali_a$&alib_9=$ali_b$";
    let wars_data = processWars(response, wars_map, ali_tag);

    let keys = Array.from(wars_map.keys());
    for (let i = 0; i < keys.length; i++) {
        const key = keys[i];
        const tr = wars_map.get(key)[0];
        const war_data = wars_data.get(key);
        const enemy_index = wars_map.get(key)[1];

        let anchor = document.createElement("a");
        anchor.style.display = "block";
        anchor.style.width = "100%";
        anchor.style.height = "100%";
        anchor.href = konflikty_url.replace("$ali_a$", ali_tag).replace("$ali_b$", key);
        tr.cells[1].appendChild(anchor);

        const valka_text = anchor.previousElementSibling;
        valka_text.style.fontSize = "11px";
        anchor.appendChild(valka_text);

        let img = document.createElement("img");
        img.style.margin = "auto 0.3rem";
        img.src = "img/konflikty.gif";
        anchor.appendChild(img);

        addRow(tr, war_data, enemy_index);
    }
}

function addRow(tr, war_data, enemy_index) {
    let new_tr = document.createElement("tr");

    tr.parentElement.insertBefore(new_tr, tr.nextSibling);

    // probiha
    let time_difference = processTime(war_data.zacatek_war, null, true);
    if (is_smlouvy != true) {
        tr.children[2].innerText += " (Probíhá už " + time_difference + ")";
    } else {
        tr.previousElementSibling.children[0].innerText += "\n (Probíhá už " + time_difference + ")";
    }

    // COLUMN
    let td = document.createElement("td");

    let div = document.createElement("div");
    div.innerText = "Útoky celkem (normální):";
    td.append(div);
    if (is_smlouvy == true) {
        td.colSpan = 2;
    }

    let theirs_text = war_data.celkem_utoky_oni + " (" + war_data.normalni_utoky_oni + ")";
    let ours_text = war_data.celkem_utoky_my + " (" + war_data.normalni_utoky_my + ")";
    div = document.createElement("div");
    div.innerText = processText(ours_text, theirs_text, enemy_index == 0);
    td.append(div);

    if (war_data.nase_war == true) {
        if (war_data.celkem_utoky_my < ali_player_count * 5 || war_data.normalni_utoky_my < ali_player_count) {
            let total_attacks = Math.max(ali_player_count * 5 - war_data.celkem_utoky_my, 0);
            let total_normal_attacks = Math.max(ali_player_count - war_data.normalni_utoky_my, 0);
            let war_completed_text = "Nesplněno, chybí: " + total_attacks + " (" + total_normal_attacks + ")";

            div = document.createElement("div");
            div.style.color = "red";
            div.innerText = war_completed_text;
            td.append(div);
        }
    }

    new_tr.append(td);
    // COLUMN END

    // COLUMN
    td = document.createElement("td");

    let container = document.createElement("div");
    container.style.display = "inline-flex";
    container.style.justifyContent = "space-between";
    container.style.alignItems = "center";
    container.style.alignContent = "center";
    container.style.width = "70%";
    td.appendChild(container);

    let wrapper = document.createElement("div");
    container.appendChild(wrapper);

    div = document.createElement("div");
    div.innerText = "Dobyté území:";
    wrapper.append(div);

    div = document.createElement("div");
    div.innerText = processText(formatNumber(war_data.dobyte_uzemi_my) + "km²", formatNumber(war_data.dobyte_uzemi_oni) + "km²", enemy_index == 0);
    wrapper.append(div);

    wrapper = document.createElement("div");
    container.appendChild(wrapper);

    div = document.createElement("div");
    div.innerText = "Získané zkušenosti:";
    wrapper.append(div);

    div = document.createElement("div");
    div.innerText = processText(formatNumber(war_data.celkem_zkusenosti_my), formatNumber(war_data.celkem_zkusenosti_oni), enemy_index == 0);
    wrapper.append(div);

    new_tr.append(td);
    // COLUMN END

    new_tr.append(war_data.neaktivni_element);
}

function processText(ours_text, theirs_text, is_enemy_on_left) {
    if (is_enemy_on_left == false) {
        return ours_text + " x " + theirs_text;
    }
    return theirs_text + " x " + ours_text;
}

function processTime(time_text, parent, time_reversed = false) {
    let index = time_reversed ? 1 : 0;

    // get date from the title
    let separate_time = time_text.split(" ");
    let split_date = separate_time[1 - index].split(".");
    let split_hours = separate_time[index].split(":");

    let current_date = new Date();
    let info_date = new Date();

    info_date.setMonth(split_date[1] - 1, split_date[0]);
    info_date.setHours(split_hours[0], split_hours[1]);

    if (current_date.getMonth() == 0 && info_date.getMonth() == 11) {
        info_date.setFullYear(current_date.getFullYear() - 1);
    }

    // get time difference from the infiltration
    let time_difference = current_date.getTime() - info_date.getTime();
    time_difference = time_difference / 1000;
    if (parent != null && time_difference > INFO_TOO_OLD) {
        // info is too old
        parent.parentElement.style = "background:#AA3333";
    }

    let hour_difference = Math.floor(time_difference / 60 / 60);
    let minute_difference = Math.floor((time_difference / 60 / 60 - hour_difference) * 60);
    if (minute_difference < 10) {
        minute_difference = "0" + minute_difference;
    }
    return hour_difference + ":" + minute_difference;
}

function addInfoPreviewInTooltip(table, shift_to_left = true, tooltip_width = 600, prestige_offset = 0, show_info_difference = true) {
    const styles = `.tooltip { position: relative; }
        .tooltip .tooltiptext { visibility: hidden; width: ${tooltip_width}px; top: 100%; left: 50%; margin-left: -${
        shift_to_left ? tooltip_width * 0.9 : tooltip_width / 2
    }px; background-color: #363636; color: #fff; text-align: left; padding: 5px 5px; margin-top: 10px; border-radius: 6px; border: 1px solid white; position: absolute; z-index: 1; }
        .tooltip:hover .tooltiptext { visibility: visible; }
        .tooltip .tooltiptext::after { content: ' '; position: absolute; bottom: 100%; left: ${
            shift_to_left ? 95 : 50
        }%; margin-left: -5px; border-width: 5px; border-style: solid; border-color: transparent transparent white transparent; }
        .tooltiptext > div:last-child { font-weight: bold; }
        .form-item { display: block; width: 100%; height: 100%; padding: 6px 0; box-sizing: border-box; text-align: center; }`;
    addCss(styles);

    let images = table.querySelectorAll(`td a [alt=Infiltrace]`);

    images.forEach((image) => {
        const link = image.closest("a");
        // vzit funkci na fetchnuti + jeji vysledek, hodit mimo, zavolat na strance utoku, hodit to do tabulky vedle
        link.addEventListener("mouseenter", () => {
            const preview_id = link.href.split("target=")[1];

            last_preview_id = preview_id;

            const parent = link.parentElement;

            let tooltiptext = parent.querySelector(".tooltiptext");
            if (tooltiptext !== null) {
                return;
            }

            let original_prestige = 0;
            if (show_info_difference) {
                const row = link.closest("tr");
                original_prestige = row.cells[COLUMN_PRESTIGE + prestige_offset].textContent;
                original_prestige = original_prestige.replace(/\s/g, "").replace("k", "000");
                original_prestige = Number(original_prestige);
            }

            fetchInfiltrationTable(link.href, preview_id, original_prestige).then((result) => {
                wrapInfiltrationTableInTooltip(result, parent, show_info_difference);
            });
        });
    });
}

function wrapInfiltrationTableInTooltip(result, parent, show_info_difference = true) {
    const wrapper = wrapInfiltrationTableBase(result, show_info_difference);

    let container = document.createElement("div");
    container.classList.add("tooltiptext");
    container.appendChild(wrapper);

    parent.classList.add("tooltip");
    parent.appendChild(container);
}

function placeInfiltrationTableNextToTable(result, sibling_table, show_info_difference = false) {
    const new_table = wrapInfiltrationTableBase(result, show_info_difference);
    const wrapper = sibling_table.parentElement;

    wrapper.children[2].remove();
    wrapper.appendChild(new_table);

    new_table.style.margin = "5px 0";
}

function prepareStrike(table) {
    const wrapper = document.createElement("div");

    const empty_div = function () {
        let empty = document.createElement("div");
        empty.style.width = "1px";
        empty.style.height = "1px";
        return empty;
    };

    table.parentElement.insertBefore(wrapper, table);
    wrapper.appendChild(empty_div());
    wrapper.appendChild(table);
    wrapper.appendChild(empty_div());

    table.style.margin = "5px 0";
    table.style.height = "fit-content";

    wrapper.style.display = "grid";
    wrapper.style.gap = "1rem";
    wrapper.style.gridTemplateColumns = "4fr 3fr 4fr";
}

function wrapInfiltrationTableBase(result, show_info_difference = true) {
    let wrapper = document.createElement("div");
    wrapper.style.width = "fit-content";
    wrapper.style.marginLeft = "auto";
    wrapper.style.marginRight = "auto";

    let time_parts = result.values.date.split(".");
    let time = time_parts[0] + "." + time_parts[1] + " " + time_parts[2];
    let time_difference = processTime(time, null, true);
    time_parts = time_difference.split(":");
    let time_difference_in_seconds = (Number(time_parts[0]) * 60 + Number(time_parts[1])) * 60;

    // prestige on the info
    let p = document.createElement("p");
    p.textContent = "Prestiž v infiltraci: \t" + formatNumber(result.values.prestige);
    wrapper.append(p);
    //

    // prestige difference
    if (show_info_difference) {
        let prestige_difference_percentage = Math.round(((result.values.original_prestige / result.values.prestige) * 100.0 - 100) * 10) / 10;
        if (prestige_difference_percentage > 0) prestige_difference_percentage = "+" + prestige_difference_percentage;
        p = document.createElement("p");
        p.textContent = "Rozdíl prestiže: " + formatNumber(getPrestigeDifference(result.values.original_prestige, result.values.prestige)) + " (" + prestige_difference_percentage + "%)";
        if (result.values.original_prestige > result.values.prestige) {
            if (result.values.original_prestige - result.values.prestige > result.values.prestige * MAX_ACCEPTED_DEVIATION) {
                p.classList.add("red"); // current prestige is too high from before -> enemy played / bought
            }
        } else {
            if (result.values.prestige - result.values.original_prestige > result.values.prestige * MAX_ACCEPTED_DEVIATION) {
                p.classList.add("red"); // current prestige is too low from before -> enemy got attacked
            }
        }
        wrapper.append(p);
    }

    // date of infiltration
    p = document.createElement("p");
    p.textContent = "Datum: " + time;
    wrapper.append(p);
    //

    //
    p = document.createElement("p");
    p.textContent = "Stáří: " + time_difference;

    if (time_difference_in_seconds > INFO_TOO_OLD) {
        p.classList.add("red");
    }
    wrapper.append(p);

    wrapper.append(result.table);

    return wrapper;
}

function fetchInfiltrationTable(url, preview_id, original_prestige) {
    let promise = fetchInfoTable(url, preview_id, original_prestige);
    return promise.then(
        (values) => {
            return {
                values: values,
                table: values.table.cloneNode(true),
            };
        },
        (reason) => {
            console.log("Rejected - " + reason);
        }
    );
}

function addInfoPreview() {
    const css =
        "#alliance-members { margin: 5px 0px; } " +
        "#alliance-members a { font-size: 11px; } " +
        "#tables_container { display: flex; align-items: flex-start; justify-content: space-between; width: 90%; margin: 0px auto; } " +
        "#info_preview_container { max-width: 550px; width: 100%; } " +
        "#info_preview p { font-weight: bold; margin-left: 5px; font-size: 14px; white-space: pre; } " +
        "#info_preview .minus { padding: unset; } ";
    addCss(css);

    let container = document.createElement("div");
    container.id = "tables_container";

    let members_table = document.getElementById("alliance-members");
    members_table.parentElement.insertBefore(container, members_table);
    container.appendChild(members_table);

    let links = members_table.querySelectorAll("tr td:last-of-type a");

    let info_preview_container = document.createElement("div");
    info_preview_container.id = "info_preview_container";
    container.appendChild(info_preview_container);

    let header = document.createElement("h2");
    header.textContent = "Náhled infiltrace:";
    info_preview_container.appendChild(header);

    let info_preview_wrapper = document.createElement("div");
    info_preview_wrapper.id = "info_preview";
    info_preview_container.appendChild(info_preview_wrapper);

    links.forEach((link) => {
        link.addEventListener("mouseenter", () => {
            const preview_id = link.href.split("target=")[1];

            if (last_preview_id !== preview_id) {
                last_preview_id = preview_id;
            } else {
                return;
            }

            let original_prestige = Number(link.parentElement.parentElement.cells[4].textContent);

            let promise = fetchInfoTable(link.href, preview_id, original_prestige);
            promise.then(
                (values) => {
                    if (preview_id === last_preview_id) {
                        let time_parts = values.date.split(".");
                        let time = time_parts[0] + "." + time_parts[1] + " " + time_parts[2];
                        let time_difference = processTime(time, null, true);
                        time_parts = time_difference.split(":");
                        let time_difference_in_seconds = (Number(time_parts[0]) * 60 + Number(time_parts[1])) * 60;
                        let prestige_difference_percentage = Math.round(((values.original_prestige / values.prestige) * 100.0 - 100) * 10) / 10;
                        if (prestige_difference_percentage > 0) prestige_difference_percentage = "+" + prestige_difference_percentage;

                        // copy infiltration table, parse it to the info_preview_wrapper (clear it before)
                        let info_preview_wrapper = document.getElementById("info_preview");
                        info_preview_wrapper.innerHTML = "";

                        // prestige on the info
                        let p = document.createElement("p");
                        p.textContent = "Prestiž v infiltraci: \t" + formatNumber(values.prestige);
                        info_preview_wrapper.append(p);
                        //

                        // prestige difference
                        p = document.createElement("p");
                        p.textContent = "Rozdíl prestiže: \t" + formatNumber(getPrestigeDifference(values.original_prestige, values.prestige)) + " (" + prestige_difference_percentage + "%)";
                        if (values.original_prestige > values.prestige) {
                            if (values.original_prestige - values.prestige > values.prestige * MAX_ACCEPTED_DEVIATION) {
                                p.classList.add("red"); // current prestige is too high from before -> enemy played / bought
                            }
                        } else {
                            if (values.prestige - values.original_prestige > values.prestige * MAX_ACCEPTED_DEVIATION) {
                                p.classList.add("red"); // current prestige is too low from before -> enemy got attacked
                            }
                        }
                        info_preview_wrapper.append(p);

                        // date of infiltration
                        p = document.createElement("p");
                        p.textContent = "Datum: \t\t\t" + time;
                        info_preview_wrapper.append(p);
                        //

                        //
                        p = document.createElement("p");
                        p.textContent = "Stáří: \t\t\t" + time_difference;

                        if (time_difference_in_seconds > INFO_TOO_OLD) {
                            p.classList.add("red");
                        }
                        info_preview_wrapper.append(p);
                        //

                        let copied_table = values.table.cloneNode(true);
                        info_preview_wrapper.append(copied_table);
                    }
                },
                (reason) => {
                    console.log("Rejected - " + reason);
                }
            );
        });
    });
}

async function fetchInfoTable(all_info_url, preview_id, original_prestige) {
    // create promise, request country's infiltration, get the most recent infiltration (typ = vlada)
    return new Promise(function (resolve, reject) {
        let req = new XMLHttpRequest();
        req.open("GET", all_info_url);
        req.onload = function () {
            if (req.readyState == 4 && req.status == 200) {
                let parser = new DOMParser();
                let doc = parser.parseFromString(req.response, "text/html");

                let result = getLastInfiltration(doc);
                result.original_prestige = original_prestige;

                if (result == null) {
                    reject("Země nemá infiltrovanou vládu");
                }

                resolve(result);
            } else {
                console.log("File not found");
            }
        };
        req.send();
        // request the most recent infiltration
    }).then(
        (result) => {
            return new Promise(function (resolve, reject) {
                if (preview_id !== last_preview_id) {
                    reject("Nejsou nadále relevantní data.");
                }

                let req = new XMLHttpRequest();
                req.open("GET", result.url);
                req.onload = function () {
                    if (req.readyState == 4 && req.status == 200) {
                        let parser = new DOMParser();
                        let doc = parser.parseFromString(req.response, "text/html");

                        // enhance the table
                        result.table = modifyTable(doc);

                        resolve(result);
                    } else {
                        console.log("File not found");
                    }
                };
                req.send();
                // request the most recent infiltration page
            });
        },
        (reason) => {
            return new Promise(function (reject) {
                reject(reason);
            });
        }
    );
}

function getLastInfiltration(doc) {
    const wanted_info_typ = "vláda";

    let rows = doc.querySelector("form table:not(#konfliktyup)").rows;
    let link,
        date,
        prestige,
        found = false;

    for (let i = 1; i < rows.length; i++) {
        const row = rows[i];
        if (row.cells[1].innerText == wanted_info_typ) {
            found = true;
            link = row.cells[4].children[0].href;
            date = row.cells[0].textContent;
            prestige = row.cells[3].textContent;
            break;
        }
    }

    if (found) {
        return {
            url: link,
            prestige: prestige,
            date: date,
        };
    }

    return null;
}

function modifyTable(doc = document, compact_mode = true) {
    let table_summary = doc.getElementById("spy-message-summary");
    let info_type = getInfoType(table_summary);
    if (info_type == null) {
        console.log("Nezměněný typ infiltrace");
        return;
    }

    let table_detail = doc.getElementById("spy-message-detail");

    let prestiz = getPrestiz(table_summary);
    let header_row = table_detail.children[0].children[0];
    let data_row = table_detail.children[0].children[1];

    addColumnInfo(doc, header_row, data_row, prestiz, info_type);
    if (info_type == 0) {
        // vlada
        addArmyData(data_row);

        if (compact_mode) {
            const element_to_edit = table_detail.children[0].children[1];
            element_to_edit.getElementsByTagName("sup")[0].remove(); // remove ^2 from km^2

            const values_to_replace = [
                "Obchodní zóny",
                "Zábavní střediska",
                "Vojenské základny",
                "Stavební firmy",
                "Nezastavěné území",
                "Rychlost stavby",
                "Hustota zalidnění",
                "Automatizace továren",
                "Cena na dom.trhu",
                "Protiraketová obrana",
                "Síla rozvědky",
                "Výzkum vesmíru",
            ];
            const replace_with_values = ["O. zóny", "Střediska", "Základny", "S. firmy", "Nezastavěno", "R. Stavby", "H. zalidnění", "A. továren", "Dom. trh", "SDI", "Rozvědka", "Vesmír"];

            let innerHTML = replaceBulk(element_to_edit.innerHTML, values_to_replace, replace_with_values);
            element_to_edit.innerHTML = innerHTML;
        }
    }

    return table_detail;
}

function replaceBulk(str, findArray, replaceArray) {
    var i,
        regex = [],
        map = {};
    for (i = 0; i < findArray.length; i++) {
        regex.push(findArray[i].replace(/([-[\]{}()*+?.\\^$|#,])/g, "\\$1"));
        map[findArray[i]] = replaceArray[i];
    }
    regex = regex.join("|");
    str = str.replace(new RegExp(regex, "g"), function (matched) {
        return map[matched];
    });
    return str;
}

function getInfoType(table_summary) {
    let text = table_summary.querySelector(".r").innerText;
    if (text.length < 1) {
        return null;
    }

    if (text.indexOf("infiltrovat vládu") != -1) {
        return 0;
    } else if (text.indexOf("infiltrovat generální štáb") != -1) {
        return 1;
    }

    return null;
}

function getPrestiz(table_summary) {
    let column = table_summary.rows[0].children[1];
    let index = 12;
    let prestiz, text;
    let pruchodu = 50;
    do {
        pruchodu--;
        text = column.childNodes[index++];
        if (text.nodeName != "#text") {
            continue;
        }
        prestiz = parseInt(text.textContent);
    } while ((isNaN(prestiz) || prestiz < 40000) && pruchodu > 0);
    return prestiz;
}

function addHeaderColumn(doc = document, row, column_name) {
    let header = doc.createElement("th");
    header.innerHTML = column_name;
    header.colSpan = 2;
    row.appendChild(header);
}

function createColumn(doc = document, class_name_1, class_name_2, text) {
    let column = doc.createElement("td");
    column.innerHTML = text;
    column.classList.add(class_name_1);
    column.classList.add(class_name_2);
    return column;
}

function addColumnInfo(doc = document, header_row, data_row, prestiz, info_type) {
    addHeaderColumn(doc, header_row, "Prestiž");

    let left_column_content = "";
    let right_column_content = "";

    let format = new Intl.NumberFormat();

    // ARMADA ZACATEK
    let army_data = data_row.children[1].innerHTML.split(DATA_SEPARATOR);
    let prestiz_per_unit = [1, 5, 3.5, 3.5, 2.7];
    let army_prestiz = 0;
    let mechy_podil = 0;
    for (let i = 0; i < 5; i++) {
        army_prestiz = army_prestiz + parseInt(army_data[i]) * prestiz_per_unit[i];
        if (i == 4) {
            mechy_podil = parseInt(army_data[i]) * prestiz_per_unit[i];
        }
    }
    left_column_content = left_column_content + "Armáda" + DATA_SEPARATOR + "Procent" + DATA_SEPARATOR + DATA_SEPARATOR;
    right_column_content = right_column_content + format.format(Math.round(army_prestiz)) + DATA_SEPARATOR + Math.round((army_prestiz / prestiz) * 1000) / 10 + "%" + DATA_SEPARATOR + DATA_SEPARATOR;
    // ARMADA KONEC

    // MECHY % ZACATEK
    left_column_content = left_column_content + "Mechy %" + DATA_SEPARATOR + DATA_SEPARATOR;
    right_column_content = right_column_content + Math.round((mechy_podil / army_prestiz) * 1000) / 10 + "%" + DATA_SEPARATOR + DATA_SEPARATOR;
    // MECHY % KONEC

    if (info_type == 0) {
        let uzemi_data = processUzemiInfo(data_row, army_data, left_column_content, right_column_content, format, prestiz);
        left_column_content = uzemi_data[0];
        right_column_content = uzemi_data[1];
        let uzemi_prestiz = uzemi_data[2];
        let uzemi = uzemi_data[3];

        let techy_data = processTechy(data_row, left_column_content, right_column_content, format, prestiz);
        left_column_content = techy_data[0];
        right_column_content = techy_data[1];
        let technologie_count = techy_data[2];
        let ukrast_na_operaci = techy_data[3];

        // MRTVA PRESTIZ ZACATEK
        let mrtva_prestiz = 0;
        mrtva_prestiz = prestiz - army_prestiz - uzemi_prestiz - technologie_count;
        left_column_content = left_column_content + "Mrtvá pres" + DATA_SEPARATOR + "Procent" + DATA_SEPARATOR + DATA_SEPARATOR;
        right_column_content =
            right_column_content + format.format(Math.round(mrtva_prestiz)) + DATA_SEPARATOR + Math.round((mrtva_prestiz / prestiz) * 1000) / 10 + "%" + DATA_SEPARATOR + DATA_SEPARATOR;

        let rozvedka_prestiz = ((uzemi + 2000) / 4) * 15;
        left_column_content = left_column_content + "Na [R]" + DATA_SEPARATOR + DATA_SEPARATOR;
        right_column_content = right_column_content + format.format(Math.round(rozvedka_prestiz)) + DATA_SEPARATOR + DATA_SEPARATOR;
        // MRTVA PRESTIZ KONEC

        // KRADEZ TECHU ZACATEK
        left_column_content = left_column_content + "Techy krádež" + DATA_SEPARATOR;
        right_column_content = right_column_content + format.format(Math.floor(ukrast_na_operaci)) + DATA_SEPARATOR;
        // KRADEZ TECHU KONEC
    }

    let column = createColumn(doc, "rname", "l", left_column_content);
    data_row.appendChild(column);
    column = createColumn(doc, "rdata", "r", right_column_content);
    data_row.appendChild(column);
}

/**
 * @param data_row
 * @param army_data
 * @param left_column_content
 * @param right_column_content
 * @param format
 * @param prestiz
 *
 * @return array [left_column_content, right_column_content, uzemi_prestiz, uzemi]
 */
function processUzemiInfo(data_row, army_data, left_column_content, right_column_content, format, prestiz) {
    let budovy_data = data_row.children[3].innerHTML.split(DATA_SEPARATOR);
    let uzemi = parseInt(army_data[9]);
    let uzemi_prestiz = uzemi * 15;
    uzemi_prestiz = uzemi_prestiz + (uzemi - parseInt(budovy_data[11]) - parseInt(budovy_data[12])) * 5; // budovy
    uzemi_prestiz = uzemi_prestiz + parseInt(budovy_data[12]) * 2; // ruiny

    left_column_content = left_column_content + "Území" + DATA_SEPARATOR + "Procent" + DATA_SEPARATOR + DATA_SEPARATOR;
    right_column_content = right_column_content + format.format(uzemi_prestiz) + DATA_SEPARATOR + Math.round((uzemi_prestiz / prestiz) * 1000) / 10 + "%" + DATA_SEPARATOR + DATA_SEPARATOR;

    return [left_column_content, right_column_content, uzemi_prestiz, uzemi];
}

/**
 * @param data_row
 * @param left_column_content
 * @param right_column_content
 * @param format
 * @param prestiz
 *
 * @return array [left_column_content, right_column_content, technologie_count, ukrast_na_operaci]
 */
function processTechy(data_row, left_column_content, right_column_content, format, prestiz) {
    let technologie_data = data_row.children[5].innerHTML.split(DATA_SEPARATOR);
    let technologie_count = 0;
    let pokryto_techu = 2 * parseInt(technologie_data[10]);
    let ukrast_na_operaci = 0;
    for (let i = 0; i < technologie_data.length; i++) {
        let technologie = parseInt(technologie_data[i]);
        technologie_count = technologie_count + technologie;
        if (technologie > pokryto_techu) {
            ukrast_na_operaci = ukrast_na_operaci + (technologie - pokryto_techu) * 0.05 + pokryto_techu * 0.002;
        } else {
            ukrast_na_operaci = ukrast_na_operaci + technologie * 0.002;
        }
    }
    left_column_content = left_column_content + "Technologie" + DATA_SEPARATOR + "Procent" + DATA_SEPARATOR + DATA_SEPARATOR;
    right_column_content = right_column_content + format.format(technologie_count) + DATA_SEPARATOR + Math.round((technologie_count / prestiz) * 1000) / 10 + "%" + DATA_SEPARATOR + DATA_SEPARATOR;

    return [left_column_content, right_column_content, technologie_count, ukrast_na_operaci];
}

function addArmyData(data_row) {
    let format = new Intl.NumberFormat();

    // ARMADA ZACATEK
    let army_data = data_row.children[1].innerHTML.split(DATA_SEPARATOR);
    let utok_per_unit = [1, 6, 6, 0, 2];
    let obrana_per_unit = [1, 4, 0, 6, 3];
    let utok_total = 0,
        obrana_total = 0;

    for (let i = 0; i < 5; i++) {
        utok_total = utok_total + parseInt(army_data[i]) * utok_per_unit[i];
        obrana_total = obrana_total + parseInt(army_data[i]) * obrana_per_unit[i];
    }
    // ARMADA KONEC

    data_row.children[0].innerHTML += DATA_SEPARATOR + DATA_SEPARATOR + "<b>Armáda</b>" + DATA_SEPARATOR + "U základ" + DATA_SEPARATOR + "O základ";
    data_row.children[1].innerHTML += DATA_SEPARATOR + DATA_SEPARATOR + DATA_SEPARATOR + format.format(utok_total) + DATA_SEPARATOR + format.format(obrana_total);
}

function formatNumber(number, pad_to_length = 0) {
    let formatted = number
        .toString()
        .replace(".", ",")
        .replace(/\B(?=(\d{3})+(?!\d))/g, ".");
    if (pad_to_length > 0) {
        formatted = formatted.padStart(pad_to_length, String.fromCharCode(160));
    }
    return formatted;
}

function addCss(css) {
    let style = document.createElement("style");
    if (style.styleSheet) {
        style.styleSheet.cssText = css;
    } else {
        style.appendChild(document.createTextNode(css));
    }

    document.getElementsByTagName("head")[0].appendChild(style);
}