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

Материал из Revera Wiki
Нет описания правки
Нет описания правки
 
(не показано 35 промежуточных версий этой же участницы)
Строка 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++;
        }
 
        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";


        function getReverinDate() {
             let input = document.createElement("input");
             const now = new Date();
             input.type = "number";
             const earthYear = now.getFullYear();
             input.dataset.yearType = field.key;
             const earthTotalDays = isLeap(earthYear) ? 366 : 365;
             input.style.width = "90px";
             const startOfYear = new Date(earthYear, 0, 1);
             input.style.boxSizing = "border-box";
             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);
             inputs[field.key] = input;
            const D_r = ((D_z - D_offset + earthTotalDays) % earthTotalDays) + 1;


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


             // Дни недели в реверинском календаре
        function clearOtherFields(sourceKey) {
            const weekDays = ["Вивидис", "Аспирис", "Альтис", "Эквилис", "Либерис", "Реновис", "Мистерис"];
             Object.keys(inputs).forEach(function(key) {
                if (key !== sourceKey) {
                    inputs[key].value = "";
                }
            });
        }


             // Определяем месяц и день
        function recalculateFrom(sourceKey) {
             let dayCount = D_r;
             if (isUpdating) return;
             let monthIndex = 0;
 
             while (monthIndex < monthLengths.length && dayCount > monthLengths[monthIndex]) {
             let sourceInput = inputs[sourceKey];
                 dayCount -= monthLengths[monthIndex];
             let sourceValue = sourceInput.value.trim();
                 monthIndex++;
 
             if (sourceValue === "") {
                 clearOtherFields(sourceKey);
                 return;
             }
             }


             // Определяем день недели
             let yearValue = Number(sourceValue);
            const weekDayIndex = (D_r - 1) % 7;
             if (!Number.isFinite(yearValue)) return;
             const reverinWeekDay = weekDays[weekDayIndex];


      // Формируем строку даты
            isUpdating = true;
        const dateText = `<div class="reverin-weekday">${reverinWeekDay}</div>
                          <div class="reverin-date">${dayCount} ${monthNames[monthIndex]}, ${reverinYear}</div>`;


             // Выводим дату в боковую панель
             let aldYear = yearValue - YEAR_OFFSETS[sourceKey];
             dateDiv.innerText = dateText;
 
             Object.keys(inputs).forEach(function(key) {
                if (key !== sourceKey) {
                    inputs[key].value = aldYear + YEAR_OFFSETS[key];
                }
            });
 
            isUpdating = false;
         }
         }


         // Вызываем функцию для отображения даты
         Object.keys(inputs).forEach(function(key) {
         getReverinDate();
            inputs[key].addEventListener("input", function() {
                recalculateFrom(key);
            });
        });
 
         sidebar.appendChild(wrapper);
     }
     }
    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();

});