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

Материал из Revera Wiki
Нет описания правки
Нет описания правки
 
(не показано 11 промежуточных версий этой же участницы)
Строка 1: Строка 1:
$(document).ready(function() {
$(document).ready(function() {
     function fetchReverinYear(callback) {
 
         $.ajax({
     function getReverinDate(dateDiv) {
             url: "/wiki/index.php?title=Шаблон:Текущий_год_Альдморры&action=raw",
         const now = new Date();
             dataType: "text",
        const startOfYear = new Date(now.getFullYear(), 0, 1);
             success: function(data) {
        const dayOfYear = Math.floor((now - startOfYear) / (1000 * 60 * 60 * 24)) + 1;
                let reverinYear = parseInt(data.trim(), 10);
        const D_offset = 49;
                if (!isNaN(reverinYear)) {
        const D_r = ((dayOfYear - D_offset + 365) % 365) + 1;
                    console.log("Год Альдморры загружен:", reverinYear);
 
                    callback(reverinYear);
        const monthLengths = [30, 31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 29];
                } else {
 
                    console.error("Ошибка: невозможно прочитать год.");
        const monthNames = [
                    callback(null);
            "Любимца",
            "Жреца",
            "Хранителя",
            "Правителя",
            "Воителя",
            "Хозяина",
            "Купца",
            "Творца",
            "Плута",
            "Колдуна",
            "Отшельника",
            "Наставника"
        ];
 
        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 = "";
                 }
                 }
             },
             });
            error: function() {
        }
                console.error("Ошибка загрузки шаблона.");
 
                 callback(null);
        function recalculateFrom(sourceKey) {
            if (isUpdating) return;
 
            let sourceInput = inputs[sourceKey];
            let sourceValue = sourceInput.value.trim();
 
            if (sourceValue === "") {
                 clearOtherFields(sourceKey);
                return;
             }
             }
        });
    }


    function fetchGuardian(year, callback) {
            let yearValue = Number(sourceValue);
        $.ajax({
            if (!Number.isFinite(yearValue)) return;
             url: "/wiki/index.php?title=Шаблон:Хранители_лет&action=raw",
 
            dataType: "text",
             isUpdating = true;
             success: function(data) {
 
                let lines = data.split("\n");
             let aldYear = yearValue - YEAR_OFFSETS[sourceKey];
                let guardian = "Неизвестный Хранитель";


                for (let line of lines) {
            Object.keys(inputs).forEach(function(key) {
                    let parts = line.split("=");
                if (key !== sourceKey) {
                    if (parts.length === 2) {
                    inputs[key].value = aldYear + YEAR_OFFSETS[key];
                        let storedYear = parseInt(parts[0].trim(), 10);
                        if (storedYear === year) {
                            guardian = parts[1].trim();
                            break;
                        }
                    }
                 }
                 }
            });


                console.log(`Хранитель для ${year}: ${guardian}`);
            isUpdating = false;
                callback(guardian);
        }
            },
 
            error: function() {
        Object.keys(inputs).forEach(function(key) {
                console.error("Ошибка загрузки Хранителей лет.");
            inputs[key].addEventListener("input", function() {
                 callback("Неизвестный Хранитель");
                 recalculateFrom(key);
             }
             });
         });
         });
        sidebar.appendChild(wrapper);
     }
     }


     function isReverinLeap(year) {
     insertReverinDate();
        return [1, 5, 9, 13, 17, 22, 26, 30].includes(year % 33);
    insertReverinYearConverter();
    }


    function getReverinDate(reverinYear, guardian, 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;

Текущая версия от 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();

});