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

Материал из Revera Wiki
Нет описания правки
Нет описания правки
 
(не показаны 32 промежуточные версии этой же участницы)
Строка 1: Строка 1:
/* Размещённый здесь код JavaScript будет загружаться пользователям при обращении к каждой странице */
$(document).ready(function() {
$(document).ready(function() {
    // Найти панель навигации (можно заменить на другую панель, если нужно)
    let sidebar = document.getElementById("p-navigation");


     // Если боковая панель существует, добавляем контейнер для даты
     function getReverinDate(dateDiv) {
    if (sidebar) {
         const now = new Date();
         let portletBody = sidebar.querySelector(".body") || sidebar;
         const startOfYear = new Date(now.getFullYear(), 0, 1);
          
         const dayOfYear = Math.floor((now - startOfYear) / (1000 * 60 * 60 * 24)) + 1;
        let dateDiv = document.createElement("div");
         const D_offset = 49;
         dateDiv.id = "reverinDateWidget";
         const D_r = ((dayOfYear - D_offset + 365) % 365) + 1;
        dateDiv.style.padding = "10px";
         dateDiv.style.borderTop = "1px solid #ccc";
         dateDiv.style.marginTop = "10px";
        dateDiv.style.fontWeight = "bold";
        dateDiv.innerText = "Загрузка реверинской даты...";


         portletBody.appendChild(dateDiv);
         const monthLengths = [30, 31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 29];


         // Функция для вычисления реверинской даты
         const monthNames = [
         function isLeap(year) {
            "Любимца",
             return ((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0);
            "Жреца",
            "Хранителя",
            "Правителя",
            "Воителя",
            "Хозяина",
            "Купца",
            "Творца",
            "Плута",
            "Колдуна",
            "Отшельника",
            "Наставника"
         ];
 
        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++;
         }
         }


         function getReverinDate() {
         const monthName = monthNames[monthIndex];
            const now = new Date();
            const earthYear = now.getFullYear();
            const earthTotalDays = isLeap(earthYear) ? 366 : 365;
            const startOfYear = new Date(earthYear, 0, 1);
            const D_z = Math.floor((now - startOfYear) / (1000 * 60 * 60 * 24)) + 1;
            const D_offset = 49; // 18 февраля - 49-й день


             const reverinYear = (D_z >= D_offset ? earthYear : earthYear - 1);
        while (dateDiv.firstChild) {
            const D_r = ((D_z - D_offset + earthTotalDays) % earthTotalDays) + 1;
             dateDiv.removeChild(dateDiv.firstChild);
        }
 
        let firstRow = document.createElement("div");
        firstRow.classList.add("row");
        firstRow.appendChild(document.createTextNode(`${reverinWeekDay}, ${dayCount} ${monthName}`));


            // Длины лун (месяцев)
        dateDiv.appendChild(firstRow);
            const monthLengths = [30, 31, 31, 31, 31, 31, 31, 30, 30, 30, 30, (isLeap(reverinYear) ? 30 : 29)];
    }
            const monthNames = ["Любимец", "Жрец", "Хранитель", "Правитель", "Воитель",
                                "Хозяин", "Купец", "Творец", "Плут", "Колдун", "Отшельник", "Наставник"];


            // Дни недели в реверинском календаре
    function insertReverinDate() {
            const weekDays = ["Вивидис", "Аспирис", "Альтис", "Эквилис", "Либерис", "Реновис", "Мистерис"];
        let sidebar = document.getElementById("p-navigation") || document.getElementById("p-tb");


             // Определяем месяц и день
        if (sidebar) {
             let dayCount = D_r;
            let dateDiv = document.createElement("div");
             let monthIndex = 0;
            dateDiv.id = "reverinDateWidget";
             while (monthIndex < monthLengths.length && dayCount > monthLengths[monthIndex]) {
            dateDiv.style.padding = "10px";
                dayCount -= monthLengths[monthIndex];
            dateDiv.style.borderTop = "1px solid #ccc";
                monthIndex++;
             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 = {
             const weekDayIndex = (D_r - 1) % 7;
             la: 15126, // г.л. = г.а. + 15126
             const reverinWeekDay = weekDays[weekDayIndex];
             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 dateText = `${reverinWeekDay}\n${dayCount} ${monthNames[monthIndex]}, {{Текущий_год_Альдморры}}`;
        const fields = [
/* const dateText = `${reverinWeekDay}\n${dayCount} ${monthNames[monthIndex]}, ${reverinYear}`; */
            { key: "la", label: "г.л." },
             // Выводим дату в боковую панель
            { key: "da", label: "г.д." },
            dateDiv.innerText = dateText;
            { key: "fa", label: "г.ф." },
         }
             { key: "aa", label: "г.а." }
         ];


         // Вызываем функцию для отображения даты
         let inputs = {};
        getReverinDate();
         let isUpdating = false;
    }
});
$(document).ready(function() {
    function fetchReverinYear(callback) {
        $.getJSON("/api.php?action=parse&page=Шаблон:Текущий_год_Альдморры&prop=text&format=json", function(data) {
            if (data.parse && data.parse.text) {
                let parser = new DOMParser();
                let doc = parser.parseFromString(data.parse.text["*"], "text/html");
                let reverinYearText = doc.body.textContent.trim();
                let reverinYear = parseInt(reverinYearText, 10);
               
                if (!isNaN(reverinYear)) {
                    callback(reverinYear);
                } else {
                    console.error("Ошибка: не удалось получить корректный год.");
                    callback(null);
                }
            }
        }).fail(function() {
            console.error("Ошибка запроса к API MediaWiki.");
            callback(null);
         });
    }


    function isLeap(year) {
        fields.forEach(function(field) {
        return ((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0);
            let row = document.createElement("div");
    }
            row.style.display = "flex";
            row.style.alignItems = "center";
            row.style.gap = "6px";
            row.style.marginBottom = "4px";


    function getReverinDate(reverinYear) {
            let label = document.createElement("label");
        const now = new Date();
            label.textContent = field.label;
        const earthYear = now.getFullYear();
            label.style.width = "35px";
        const earthTotalDays = isLeap(earthYear) ? 366 : 365;
        const startOfYear = new Date(earthYear, 0, 1);
        const D_z = Math.floor((now - startOfYear) / (1000 * 60 * 60 * 24)) + 1;
        const D_offset = 49; // 18 февраля - 49-й день


        const D_r = ((D_z - D_offset + earthTotalDays) % earthTotalDays) + 1;
            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;
        const monthLengths = [30, 31, 31, 31, 31, 31, 31, 30, 30, 30, 30, (isLeap(reverinYear) ? 30 : 29)];
        const monthNames = ["Любимец", "Жрец", "Хранитель", "Правитель", "Воитель",
                            "Хозяин", "Купец", "Творец", "Плут", "Колдун", "Отшельник", "Наставник"];


        // Дни недели в реверинском календаре
            row.appendChild(label);
         const weekDays = ["Вивидис", "Аспирис", "Альтис", "Эквилис", "Либерис", "Реновис", "Мистерис"];
            row.appendChild(input);
            wrapper.appendChild(row);
         });


         // Определяем месяц и день
         function clearOtherFields(sourceKey) {
        let dayCount = D_r;
            Object.keys(inputs).forEach(function(key) {
        let monthIndex = 0;
                if (key !== sourceKey) {
        while (monthIndex < monthLengths.length && dayCount > monthLengths[monthIndex]) {
                    inputs[key].value = "";
            dayCount -= monthLengths[monthIndex];
                }
             monthIndex++;
             });
         }
         }


         // Определяем день недели
         function recalculateFrom(sourceKey) {
        const weekDayIndex = (D_r - 1) % 7;
            if (isUpdating) return;
        const reverinWeekDay = weekDays[weekDayIndex];


        // Формируем строку даты
            let sourceInput = inputs[sourceKey];
        return `${reverinWeekDay},\n${dayCount} ${monthNames[monthIndex]}, ${reverinYear}`;
            let sourceValue = sourceInput.value.trim();
    }


    function insertReverinDate() {
            if (sourceValue === "") {
        let sidebar = document.getElementById("p-navigation") || document.getElementById("p-tb");
                clearOtherFields(sourceKey);
                return;
            }


        if (sidebar) {
            let yearValue = Number(sourceValue);
             let portletBody = sidebar.querySelector(".body") || sidebar;
             if (!Number.isFinite(yearValue)) return;


             let dateDiv = document.createElement("div");
             isUpdating = true;
            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"; // Делает \n видимым
            dateDiv.innerText = "Загрузка...";


             portletBody.appendChild(dateDiv);
             let aldYear = yearValue - YEAR_OFFSETS[sourceKey];


             fetchReverinYear(function(reverinYear) {
             Object.keys(inputs).forEach(function(key) {
                 if (reverinYear) {
                 if (key !== sourceKey) {
                    dateDiv.innerText = getReverinDate(reverinYear);
                     inputs[key].value = aldYear + YEAR_OFFSETS[key];
                } else {
                     dateDiv.innerText = "Ошибка загрузки даты";
                 }
                 }
             });
             });
            isUpdating = false;
         }
         }
        Object.keys(inputs).forEach(function(key) {
            inputs[key].addEventListener("input", function() {
                recalculateFrom(key);
            });
        });
        sidebar.appendChild(wrapper);
     }
     }


     insertReverinDate();
     insertReverinDate();
    insertReverinYearConverter();
});
});

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

});