MediaWiki:Common.js: различия между версиями

Материал из Revera Wiki
Отмена версии 4300, сделанной Luciana (обсуждение)
Метки: отмена отменено
Нет описания правки
 
(не показана 21 промежуточная версия этой же участницы)
Строка 1: Строка 1:
mw.loader.load("https://revera.world/js/reverin-date.js");
$(document).ready(function() {


document.addEventListener("DOMContentLoaded", function() {
    function getReverinDate(dateDiv) {
    let sidebar = document.getElementById("p-navigation") || document.getElementById("p-tb");
        const now = new Date();
        const startOfYear = new Date(now.getFullYear(), 0, 1);
        const dayOfYear = Math.floor((now - startOfYear) / (1000 * 60 * 60 * 24)) + 1;
        const D_offset = 49;
        const D_r = ((dayOfYear - D_offset + 365) % 365) + 1;


     function ensureReverinDateWidget() {
        const monthLengths = [30, 31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 29];
         if (sidebar && !document.getElementById("reverinDateWidget")) {
 
        const monthNames = [
            "Любимца",
            "Жреца",
            "Хранителя",
            "Правителя",
            "Воителя",
            "Хозяина",
            "Купца",
            "Творца",
            "Плута",
            "Колдуна",
            "Отшельника",
            "Наставника"
        ];
 
        const earthToReveraWeekDays = {
            "Monday": "Вивидис",
            "Tuesday": "Аспирис",
            "Wednesday": "Альтис",
            "Thursday": "Эквилис",
            "Friday": "Либерис",
            "Saturday": "Реновис",
            "Sunday": "Мистерис"
        };
 
        const earthDayOfWeek = new Date().toLocaleDateString("en-US", { weekday: "long" });
        const reverinWeekDay = earthToReveraWeekDays[earthDayOfWeek] || "Неизвестный день";
 
        let dayCount = D_r;
        let monthIndex = 0;
 
        while (dayCount > monthLengths[monthIndex]) {
            dayCount -= monthLengths[monthIndex];
            monthIndex++;
        }
 
        const monthName = monthNames[monthIndex];
 
        while (dateDiv.firstChild) {
            dateDiv.removeChild(dateDiv.firstChild);
        }
 
        let firstRow = document.createElement("div");
        firstRow.classList.add("row");
        firstRow.appendChild(document.createTextNode(`${reverinWeekDay}, ${dayCount} ${monthName}`));
 
        dateDiv.appendChild(firstRow);
    }
 
     function insertReverinDate() {
         let sidebar = document.getElementById("p-navigation") || document.getElementById("p-tb");
 
        if (sidebar) {
             let dateDiv = document.createElement("div");
             let dateDiv = document.createElement("div");
             dateDiv.id = "reverinDateWidget";
             dateDiv.id = "reverinDateWidget";
Строка 13: Строка 70:
             dateDiv.style.fontWeight = "bold";
             dateDiv.style.fontWeight = "bold";
             dateDiv.style.whiteSpace = "pre-line";
             dateDiv.style.whiteSpace = "pre-line";
             dateDiv.innerText = "Загрузка реверинской даты...";
             dateDiv.appendChild(document.createTextNode("Загрузка..."));


             sidebar.appendChild(dateDiv);
             sidebar.appendChild(dateDiv);
             console.log("`#reverinDateWidget` вставлен в сайтбар!");
 
             getReverinDate(dateDiv);
         }
         }
     }
     }


     function waitForReverinScript(callback) {
     function insertReverinYearConverter() {
         let attempts = 0;
         let sidebar = document.getElementById("p-navigation") || document.getElementById("p-tb");
         let checkInterval = setInterval(function() {
        if (!sidebar) return;
             if (typeof window.loadReverinDate === "function") {
 
                clearInterval(checkInterval);
        /*
                console.log("Скрипт `reverin-date.js` загружен, запускаем!");
            Базовая шкала — альдморрское летоисчисление, г.а.
                window.loadReverinDate();
 
                callback();
            0 г.а. = 1489 г.д.
             } else if (attempts >= 20) {
            значит:
                 clearInterval(checkInterval);
            г.д. = г.а. + 1489
                console.error("Ошибка: `reverin-date.js` не загрузился!");
 
            4556 г.ф. = 0 г.д.
            0 г.д. = -1489 г.а.
            значит:
            г.ф. = г.а. + 6045
 
            0 г.л. = -15126 г.а.
            значит:
            г.л. = г.а. + 15126
        */
 
        const YEAR_OFFSETS = {
            la: 15126, // г.л. = г.а. + 15126
            da: 1489,  // г.д. = г.а. + 1489
            fa: 6045,  // г.ф. = г.а. + 6045
            aa: 0      // г.а.
        };
 
         let wrapper = document.createElement("div");
        wrapper.id = "reverinYearConverter";
        wrapper.style.padding = "10px";
        wrapper.style.borderTop = "1px solid #ccc";
        wrapper.style.marginTop = "10px";
        wrapper.style.fontWeight = "bold";
 
        let title = document.createElement("div");
        title.textContent = "Пересчёт лет";
        title.style.marginBottom = "6px";
        wrapper.appendChild(title);
 
        const fields = [
            { key: "la", label: "г.л." },
            { key: "da", label: "г.д." },
            { key: "fa", label: "г.ф." },
            { key: "aa", label: "г.а." }
        ];
 
        let inputs = {};
        let isUpdating = false;
 
        fields.forEach(function(field) {
             let row = document.createElement("div");
            row.style.display = "flex";
            row.style.alignItems = "center";
            row.style.gap = "6px";
            row.style.marginBottom = "4px";
 
            let label = document.createElement("label");
            label.textContent = field.label;
            label.style.width = "35px";
 
            let input = document.createElement("input");
            input.type = "number";
            input.dataset.yearType = field.key;
            input.style.width = "90px";
            input.style.boxSizing = "border-box";
 
            inputs[field.key] = input;
 
            row.appendChild(label);
            row.appendChild(input);
            wrapper.appendChild(row);
        });
 
        function clearOtherFields(sourceKey) {
             Object.keys(inputs).forEach(function(key) {
                if (key !== sourceKey) {
                    inputs[key].value = "";
                 }
            });
        }
 
        function recalculateFrom(sourceKey) {
            if (isUpdating) return;
 
            let sourceInput = inputs[sourceKey];
            let sourceValue = sourceInput.value.trim();
 
            if (sourceValue === "") {
                clearOtherFields(sourceKey);
                return;
             }
             }
             attempts++;
 
         }, 250);
            let yearValue = Number(sourceValue);
            if (!Number.isFinite(yearValue)) return;
 
            isUpdating = true;
 
            let aldYear = yearValue - YEAR_OFFSETS[sourceKey];
 
             Object.keys(inputs).forEach(function(key) {
                if (key !== sourceKey) {
                    inputs[key].value = aldYear + YEAR_OFFSETS[key];
                }
            });
 
            isUpdating = false;
         }
 
        Object.keys(inputs).forEach(function(key) {
            inputs[key].addEventListener("input", function() {
                recalculateFrom(key);
            });
        });
 
        sidebar.appendChild(wrapper);
     }
     }


     function waitForTooltips() {
     insertReverinDate();
        let attempts = 0;
    insertReverinYearConverter();
        let checkInterval = setInterval(function() {
            if (typeof window.addTooltipHandlers === "function") {
                clearInterval(checkInterval);
                console.log("Подсказки загружены, запускаем!");
                window.addTooltipHandlers();
            } else if (attempts >= 20) {
                clearInterval(checkInterval);
                console.error("Ошибка: `addTooltipHandlers` не загрузился!");
            }
            attempts++;
        }, 250);
    }


    ensureReverinDateWidget();
    waitForReverinScript(waitForTooltips);
});
});

Текущая версия от 14:37, 15 мая 2026

$(document).ready(function() {

    function getReverinDate(dateDiv) {
        const now = new Date();
        const startOfYear = new Date(now.getFullYear(), 0, 1);
        const dayOfYear = Math.floor((now - startOfYear) / (1000 * 60 * 60 * 24)) + 1;
        const D_offset = 49;
        const D_r = ((dayOfYear - D_offset + 365) % 365) + 1;

        const monthLengths = [30, 31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 29];

        const monthNames = [
            "Любимца",
            "Жреца",
            "Хранителя",
            "Правителя",
            "Воителя",
            "Хозяина",
            "Купца",
            "Творца",
            "Плута",
            "Колдуна",
            "Отшельника",
            "Наставника"
        ];

        const earthToReveraWeekDays = {
            "Monday": "Вивидис",
            "Tuesday": "Аспирис",
            "Wednesday": "Альтис",
            "Thursday": "Эквилис",
            "Friday": "Либерис",
            "Saturday": "Реновис",
            "Sunday": "Мистерис"
        };

        const earthDayOfWeek = new Date().toLocaleDateString("en-US", { weekday: "long" });
        const reverinWeekDay = earthToReveraWeekDays[earthDayOfWeek] || "Неизвестный день";

        let dayCount = D_r;
        let monthIndex = 0;

        while (dayCount > monthLengths[monthIndex]) {
            dayCount -= monthLengths[monthIndex];
            monthIndex++;
        }

        const monthName = monthNames[monthIndex];

        while (dateDiv.firstChild) {
            dateDiv.removeChild(dateDiv.firstChild);
        }

        let firstRow = document.createElement("div");
        firstRow.classList.add("row");
        firstRow.appendChild(document.createTextNode(`${reverinWeekDay}, ${dayCount} ${monthName}`));

        dateDiv.appendChild(firstRow);
    }

    function insertReverinDate() {
        let sidebar = document.getElementById("p-navigation") || document.getElementById("p-tb");

        if (sidebar) {
            let dateDiv = document.createElement("div");
            dateDiv.id = "reverinDateWidget";
            dateDiv.style.padding = "10px";
            dateDiv.style.borderTop = "1px solid #ccc";
            dateDiv.style.marginTop = "10px";
            dateDiv.style.fontWeight = "bold";
            dateDiv.style.whiteSpace = "pre-line";
            dateDiv.appendChild(document.createTextNode("Загрузка..."));

            sidebar.appendChild(dateDiv);

            getReverinDate(dateDiv);
        }
    }

    function insertReverinYearConverter() {
        let sidebar = document.getElementById("p-navigation") || document.getElementById("p-tb");
        if (!sidebar) return;

        /*
            Базовая шкала — альдморрское летоисчисление, г.а.

            0 г.а. = 1489 г.д.
            значит:
            г.д. = г.а. + 1489

            4556 г.ф. = 0 г.д.
            0 г.д. = -1489 г.а.
            значит:
            г.ф. = г.а. + 6045

            0 г.л. = -15126 г.а.
            значит:
            г.л. = г.а. + 15126
        */

        const YEAR_OFFSETS = {
            la: 15126, // г.л. = г.а. + 15126
            da: 1489,  // г.д. = г.а. + 1489
            fa: 6045,  // г.ф. = г.а. + 6045
            aa: 0      // г.а.
        };

        let wrapper = document.createElement("div");
        wrapper.id = "reverinYearConverter";
        wrapper.style.padding = "10px";
        wrapper.style.borderTop = "1px solid #ccc";
        wrapper.style.marginTop = "10px";
        wrapper.style.fontWeight = "bold";

        let title = document.createElement("div");
        title.textContent = "Пересчёт лет";
        title.style.marginBottom = "6px";
        wrapper.appendChild(title);

        const fields = [
            { key: "la", label: "г.л." },
            { key: "da", label: "г.д." },
            { key: "fa", label: "г.ф." },
            { key: "aa", label: "г.а." }
        ];

        let inputs = {};
        let isUpdating = false;

        fields.forEach(function(field) {
            let row = document.createElement("div");
            row.style.display = "flex";
            row.style.alignItems = "center";
            row.style.gap = "6px";
            row.style.marginBottom = "4px";

            let label = document.createElement("label");
            label.textContent = field.label;
            label.style.width = "35px";

            let input = document.createElement("input");
            input.type = "number";
            input.dataset.yearType = field.key;
            input.style.width = "90px";
            input.style.boxSizing = "border-box";

            inputs[field.key] = input;

            row.appendChild(label);
            row.appendChild(input);
            wrapper.appendChild(row);
        });

        function clearOtherFields(sourceKey) {
            Object.keys(inputs).forEach(function(key) {
                if (key !== sourceKey) {
                    inputs[key].value = "";
                }
            });
        }

        function recalculateFrom(sourceKey) {
            if (isUpdating) return;

            let sourceInput = inputs[sourceKey];
            let sourceValue = sourceInput.value.trim();

            if (sourceValue === "") {
                clearOtherFields(sourceKey);
                return;
            }

            let yearValue = Number(sourceValue);
            if (!Number.isFinite(yearValue)) return;

            isUpdating = true;

            let aldYear = yearValue - YEAR_OFFSETS[sourceKey];

            Object.keys(inputs).forEach(function(key) {
                if (key !== sourceKey) {
                    inputs[key].value = aldYear + YEAR_OFFSETS[key];
                }
            });

            isUpdating = false;
        }

        Object.keys(inputs).forEach(function(key) {
            inputs[key].addEventListener("input", function() {
                recalculateFrom(key);
            });
        });

        sidebar.appendChild(wrapper);
    }

    insertReverinDate();
    insertReverinYearConverter();

});