Код:
<!--HTML--> <style> .earn-button { margin: 0 3px; background: var(--cl4); color: #e0e0e0; border: none; cursor: pointer; padding: 4px 8px; font-size: 11px; transition: all 0.2s ease; border-radius: 4px; font-weight: bold; min-width: 24px; text-align: center; } .earn-button:hover { background: var(--cl44); transform: scale(1.05); box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); } .modal { display: none; position: fixed; z-index: 1000; left: 0; top: 0; width: 100%; height: 100%; background-color: rgba(0, 0, 0, 0.5); } .modal-content { background-color: #cccccc; border: 1px solid #aaaaaa; margin: 5% auto; padding: 25px; border-radius: 12px; width: 80%; max-width: 600px; max-height: 80vh; overflow-y: auto; color: #e0e0e0; box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3); overflow: hidden; } .close { color: #212121; float: right; font-size: 28px; font-weight: bold; cursor: pointer; } .close:hover { color: #000000; } .modal h3, .preview-header, .preview-total, .preview-total-balance, .submit-btn, .finish-btn { color: var(--cl4); font-family: "Quicksand", "Helvetica Neue", sans-serif; } .modal-title { font-size: 20px !important; color: var(--cl4) !important; margin-bottom: 5px !important; margin-left: 0 !important; margin-right: 0 !important; background: transparent !important; padding: 0 !important; } .modal-content .modal-title { padding: 0 !important; } .modal-content.spend-modal .modal-title { color: var(--cl44) !important; padding: 0 !important; } .modal-content.spend-modal .info-text { border-left-color: var(--cl44); } .modal-content.spend-modal .submit-btn { background: var(--cl44); } .modal-content.spend-modal .submit-btn:hover { background: var(--cl4); transform: translateY(-1px); box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); } .modal-content.spend-modal .add-field-btn { background: var(--cl44); } .modal-content.spend-modal .add-field-btn:hover { background: var(--cl4); } .form-group label { display: block; margin-bottom: 5px; font-weight: bold; color: #505050; } .form-group input, .form-group textarea { width: 100%; padding: 10px; border: 1px solid #aaaaaa; border-radius: 6px; background-color: #bbbbbb; color: #e0e0e0; font-family: "Quicksand", "Helvetica Neue", sans-serif; box-sizing: border-box; transition: all 0.2s ease; } .form-group input:focus, .form-group textarea:focus { outline: none; border-color: var(--cl4); box-shadow: 0 0 0 2px rgba(136, 163, 172, 0.2); background-color: #c0c0c0; } .add-field-btn, .remove-field-btn { background: var(--cl4); color: #e0e0e0; border: none; border-radius: 4px; width: 30px; height: 28px; font-size: 18px; font-weight: bold; display: flex; align-items: center; justify-content: center; cursor: pointer; transition: all 0.2s ease; } .add-field-btn:hover { background: var(--cl44); } .remove-field-btn { background: #dc3545; } .remove-field-btn:hover { background: #c82333; } .submit-btn, .finish-btn { background: var(--cl4); color: #e0e0e0; border: none; padding: 12px 24px; border-radius: 6px; cursor: pointer; font-size: 14px; font-weight: bold; transition: all 0.2s ease; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); width: fit-content; } .submit-btn:hover, .finish-btn:hover { background: var(--cl44); transform: translateY(-1px); box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); } .info-text { background: #d8d8d8; padding: 15px; border-left: 4px solid var(--cl4); margin: 10px 0; max-width: 96%; color: #7e7e7e; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05); } #selected-items-preview { background: rgb(255 255 255 / 20%); border: none; border-radius: 0; padding: 20px 15px 15px; margin: 35px 0 20px; max-height: 400px; box-shadow: none; position: relative; } .preview-empty { color: #c7c7c7; text-align: center; font-style: italic; padding: 20px; font-size: 12px; } .preview-header { font-weight: bold; color: #fff; background-color: var(--cl4); font-size: 12px; text-align: center; width: fit-content; border-radius: 11px; text-transform: lowercase; padding: 4px 9px 5px; position: absolute; top: -11px; left: 15px; margin: 0; } .preview-section-title { font-weight: bold; margin: 15px 0 8px 0; font-size: 12px; text-transform: uppercase; letter-spacing: 0.5px; padding-bottom: 3px; border-bottom: 1px solid rgba(136, 163, 172, 0.3); } .preview-item { background: rgba(255, 255, 255, 0.05); border-radius: 4px; border-left: 2px solid transparent; padding: 4px; margin-bottom: 2px; transition: all 0.2s ease; position: relative; } .preview-item:hover { background: rgba(136, 163, 172, 0.1); transform: translateX(1px); } .preview-item-header { display: grid; grid-template-columns: 20px 1fr 60px 30px; align-items: center; gap: 7px; margin-bottom: 0; } .preview-item-number { color: var(--cl4); font-weight: bold; font-size: 12px; } .preview-item-name { color: #6f6f6f; font-weight: normal; font-size: 12px; } .preview-item-amount { text-align: right; color: var(--cl4); font-weight: bold; font-size: 12px; padding: 0; border-radius: 0; background: none; } .preview-item-amount[style*="color: var(--cl4)"] { color: var(--cl4) !important; } .preview-item-amount[style*="color: var(--cl44)"] { color: var(--cl44) !important; } .preview-item-actions { display: flex; justify-content: center; } .preview-item-actions button { background: rgba(220, 53, 69, 0.2); border: 1px solid rgba(220, 53, 69, 0.3); color: #dc3545; font-size: 10px; cursor: pointer; padding: 2px 4px; border-radius: 3px; transition: all 0.2s ease; min-width: 20px; height: 20px; display: flex; align-items: center; justify-content: center; } .preview-item-actions button:hover { background: rgba(220, 53, 69, 0.3); border-color: rgba(220, 53, 69, 0.5); transform: scale(1.05); } .preview-total, .preview-total-balance { background: rgba(255, 255, 255, 0.05); padding: 4px; margin: 2px 0; font-size: 12px; color: #6f6f6f; transition: all 0.2s ease; } .preview-total strong, .preview-total-balance strong { color: var(--cl4); font-size: 12px; } .preview-total.negative strong, .preview-total-balance.negative strong { color: var(--cl44); } .preview-item.spend-item .preview-item-amount { color: var(--cl44); } .preview-item.spend-item .preview-item-number { color: var(--cl44); } /* Розовая линия под заголовком "Траты:" */ .preview-section-title.spend-section { border-bottom-color: rgba(187, 171, 181, 0.3); } .bk-main-all { display: flex; gap: 20px; margin-top: 20px; } .bk-main-all-left, .bk-main-all-right { flex: 1; background: rgb(255 255 255 / 20%); padding: 20px 15px 15px; position: relative; } .bk-main-all-left-tit { font-weight: bold; color: #fff; background-color: var(--cl4); font-size: 12px; text-align: center; width: fit-content; border-radius: 11px; text-transform: lowercase; padding: 4px 9px 5px; position: absolute; top: -11px; } .bk-main-all-right .bk-main-all-left-tit { background-color: var(--cl44); } .bk-main-all-right .earn-button { background: var(--cl44); } .bk-main-all-right .earn-button:hover { background: var(--cl4); transform: scale(1.05); box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); } .bk-main-all-right .bk-main-all-line p span { color: var(--cl44); } .bk-main-all-line p { display: grid !important; grid-template-columns: 1fr 60px 30px !important; align-items: center !important; gap: 7px !important; margin: 2px 0 !important; padding: 4px !important; background: rgba(255, 255, 255, 0.05); border-radius: 4px; border-left: 2px solid transparent; transition: all 0.2s ease; } .bk-main-all-line p:hover { background: rgba(136, 163, 172, 0.1); transform: translateX(1px); } .bk-main-all-right .bk-main-all-line p:hover { background: rgba(187, 171, 181, 0.15); transform: translateX(1px); } .free-change { grid-column: 2 / 4; text-align: right; color: #e0e0e0; font-style: italic; } .bk-main-all-line p span { text-align: right; color: var(--cl4); font-weight: bold; font-size: 14px; } .modalContent h3 { margin: 0 !important; } .field-row { display: flex; align-items: center; gap: 10px; margin-bottom: 10px; } .earnForm, #earnForm { display: flex; flex-direction: column; gap: 10px; } /* Стили для модальных окон "потратить" с розовыми тонами */ .spend-modal .modal-title { color: var(--cl44) !important; padding: 0 !important; } #modal-title { padding: 0 !important; } .spend-modal .submit-btn, .spend-modal .finish-btn { background: var(--cl44); } .spend-modal .submit-btn:hover, .spend-modal .finish-btn:hover { background: #a89aa4; transform: translateY(-1px); box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); } .spend-modal .add-field-btn { background: var(--cl44); } .spend-modal .add-field-btn:hover { background: #a89aa4; } .spend-modal .form-group input:focus, .spend-modal .form-group textarea:focus { border-color: var(--cl44); box-shadow: 0 0 0 2px rgba(187, 171, 181, 0.2); } .spend-modal .info-text { border-left: 4px solid var(--cl44); } </style> <!-- Основной контент банка --> <div class="fon"> <div class="bac"> <div class="namet"> <div class="bacname">банк</div> </div> </div> </div> <!-- Основной контент банка --> <div class="bk-main-all"> <div class="bk-main-all-left"> <div class="bk-main-all-left-tit">заработать</div> <div class="bk-main-all-line"> <p>100 сообщений <span>50</span><button class="earn-button" data-type="messages-100">+</button></p> <p>100 позитива <span>20</span><button class="earn-button" data-type="positivity-100">+</button></p> <p>100 репутации <span>20</span><button class="earn-button" data-type="reputation-100">+</button></p> <p>заявка в нужные <span>50</span><button class="earn-button" data-type="application-needed">+</button></p> <p> заявка в хочу видеть <span>25</span><button class="earn-button" data-type="application-want">+</button> </p> <p> забрать игрока из «хочу к вам» <span>15</span ><button class="earn-button" data-type="take-player">+</button> </p> <p> привести на форум друга <span>45</span><button class="earn-button" data-type="bring-friend">+</button> </p> <p> прийти по заявке <span>20</span><button class="earn-button" data-type="come-by-application">+</button> </p> <p>1 реклама <span>5</span><button class="earn-button" data-type="advertisement">+</button></p> <p>50 реклам <span>350</span><button class="earn-button" data-type="advertisement-50">+</button></p> <p>заполненная анкета <span>75</span><button class="earn-button" data-type="filled-profile">+</button></p> <p>игровой пост <span>50</span><button class="earn-button" data-type="game-post">+</button></p> <p> 5 часов непрерывного онлайна [скрин] <span>70</span ><button class="earn-button" data-type="online-5hours">+</button> </p> <p>создали тему флуда <span>10</span><button class="earn-button" data-type="flood-topic">+</button></p> <p> участие в конкурсе <span>20</span ><button class="earn-button" data-type="contest-participation">+</button> </p> </div> </div> <div class="bk-main-all-right"> <div class="bk-main-all-left-tit">потратить</div> <div class="bk-main-all-line"> <p> выкупить внешность «нужного» на 2 недели <span>300</span ><button class="earn-button" data-type="buyout-needed-appearance">+</button> </p> <p> выкупить внешность для себя на 2 недели <span>400</span ><button class="earn-button" data-type="buyout-self-appearance">+</button> </p> <p> реклама с нужным до конца теста + неделя после <span>350</span ><button class="earn-button" data-type="needed-advertisement">+</button> </p> <p> гифка в стиле форума от амс <span>100</span><button class="earn-button" data-type="forum-gif">+</button> </p> <p> аватар от амс в цвет чистовика <span>1000</span ><button class="earn-button" data-type="custom-avatar">+</button> </p> </div> </div> </div> <!-- Модальное окно --> <div id="earnModal" class="modal"> <div class="modal-content"> <span class="close">×</span> <div id="modalContent"></div> </div> </div> <!-- Предварительный просмотр выбранных пунктов --> <div id="selected-items-preview"> <div class="preview-empty">Выберите пункты для заработка</div> </div> <!-- Кнопка "Закончить" --> <div style="text-align: center; margin: 30px 0"> <button id="finishBtn" class="finish-btn" style="display: none">Закончить</button> </div> <script> document.addEventListener("DOMContentLoaded", function () { console.log("DOMContentLoaded"); console.log(0); // Данные для модальных окон const modalData = { "messages-100": { title: "100 сообщений", description: "Укажите количество раз, когда вы достигли 100 сообщений", fields: [ { name: "count", label: "Количество раз (например: 2 для 200 сообщений)", type: "number", required: true } ] }, "positivity-100": { title: "100 позитива", description: "Укажите количество раз, когда вы достигли 100 позитива", fields: [ { name: "count", label: "Количество раз (например: 2 для 200 позитива)", type: "number", required: true } ] }, "reputation-100": { title: "100 репутации", description: "Укажите количество раз, когда вы достигли 100 репутации", fields: [ { name: "count", label: "Количество раз (например: 2 для 200 репутации)", type: "number", required: true } ] }, "application-needed": { title: "Заявка в нужные", description: "Укажите ссылку на заявку (можно добавить несколько)", fields: [{ name: "application_link", label: "Ссылка на заявку", type: "text", required: true }] }, "application-want": { title: "Заявка в хочу видеть", description: "Укажите ссылку на заявку (можно добавить несколько)", fields: [{ name: "application_link", label: "Ссылка на заявку", type: "text", required: true }] }, "take-player": { title: "Забрать игрока из «хочу к вам»", description: "Укажите ссылку на ваше сообщение из темы (можно добавить несколько)", fields: [{ name: "message_link", label: "Ссылка на сообщение", type: "text", required: true }] }, "bring-friend": { title: "Привести на форум друга", description: "Укажите имя друга и подтверждение (можно добавить несколько имен)", fields: [{ name: "friend_name", label: "Имя друга", type: "text", required: true }] }, "come-by-application": { title: "Прийти по заявке", description: "Укажите ссылку на заявку", fields: [{ name: "application_link", label: "Ссылка на заявку", type: "text", required: true }] }, advertisement: { title: "1 реклама", description: "Укажите количество оставленных реклам", fields: [{ name: "count", label: "Количество реклам", type: "number", required: true }] }, "advertisement-50": { title: "50 реклам", description: "Никаких дополнительных данных не требуется", fields: [] }, "filled-profile": { title: "Заполненная анкета", description: "Укажите ссылку на анкету (можно добавить несколько)", fields: [{ name: "profile_link", label: "Ссылка на анкету", type: "text", required: true }] }, "game-post": { title: "Игровой пост", description: "Укажите ссылку на пост (можно добавить несколько)", fields: [{ name: "post_link", label: "Ссылка на пост", type: "text", required: true }] }, "online-5hours": { title: "5 часов непрерывного онлайна", description: "Приложите скриншот онлайна", fields: [{ name: "screenshot_link", label: "Ссылка на скриншот", type: "text", required: true }] }, "flood-topic": { title: "Создали тему флуда", description: "Укажите ссылку на тему (можно добавить несколько)", fields: [{ name: "topic_link", label: "Ссылка на тему", type: "text", required: true }] }, "contest-participation": { title: "Участие в конкурсе", description: "Укажите ссылку на участие в конкурсе (можно добавить несколько)", fields: [{ name: "contest_link", label: "Ссылка на участие", type: "text", required: true }] }, // Данные для раздела "потратить" "buyout-needed-appearance": { title: "Выкупить внешность «нужного» на 2 недели", description: "Укажите конкретную внешность из нужных", fields: [{ name: "appearance_name", label: "Имя внешности", type: "text", required: true }] }, "buyout-self-appearance": { title: "Выкупить внешность для себя на 2 недели", description: "Укажите конкретную внешность", fields: [{ name: "appearance_name", label: "Имя внешности", type: "text", required: true }] }, "needed-advertisement": { title: "Реклама с нужным до конца теста + неделя после", description: "Укажите описание и ссылку на заявку нужного", fields: [ { name: "description", label: "Описание", type: "textarea", required: true }, { name: "application_link", label: "Ссылка на заявку нужного", type: "text", required: true } ] }, "forum-gif": { title: "Гифка в стиле форума от амс", description: "Укажите описание желаемой гифки", fields: [{ name: "gif_description", label: "Описание гифки", type: "textarea", required: true }] }, "custom-avatar": { title: "Аватар от амс в цвет чистовика", description: "Укажите описание желаемого аватара и цветовые предпочтения", fields: [ { name: "avatar_description", label: "Описание аватара и цвета", type: "textarea", required: true } ] } }; console.log("modalData", modalData); // Переменные для отслеживания выбранных пунктов let selectedItems = []; let currentBalance = 0; let initialBalance = 0; // Функция для получения начального баланса из UserFld3 function getInitialBalance() { try { // Пытаемся получить значение UserFld3 if (typeof UserFld3 !== "undefined" && UserFld3) { // Убираем пробелы и преобразуем в число const cleanValue = UserFld3.toString().replace(/\s/g, ""); const balance = parseInt(cleanValue); return isNaN(balance) ? 0 : balance; } } catch (e) { console.log("UserFld3 не доступна:", e); } return 0; } // Функция для получения суммы по типу function getAmountForType(type) { const amounts = { "messages-100": 50, "positivity-100": 20, "reputation-100": 20, "application-needed": 50, "application-want": 25, "take-player": 15, "bring-friend": 45, "come-by-application": 20, advertisement: 5, "advertisement-50": 350, "filled-profile": 75, "game-post": 50, "online-5hours": 70, "flood-topic": 10, "contest-participation": 20, // Суммы для раздела "потратить" "buyout-needed-appearance": -300, "buyout-self-appearance": -400, "needed-advertisement": -350, "forum-gif": -100, "custom-avatar": -1000 }; return amounts[type] || 0; } console.log(1); // Функция для добавления пункта в список function addItem(type, details = "") { console.log("type", type); console.log("details", details); const data = modalData[type]; console.log("data", data); if (!data) return; // Находим базовую сумму для этого пункта const baseAmount = getAmountForType(type); console.log("baseAmount", baseAmount); // Проверяем, есть ли количество в details let amount = baseAmount; let displayName = data.title; // Ищем количество в details для определенных типов const quantityTypes = ["advertisement", "messages-100", "positivity-100", "reputation-100"]; if (quantityTypes.includes(type) && details) { const countMatch = details.match(/:\s*(\d+)$/i); console.log("countMatch", countMatch); if (countMatch) { const count = parseInt(countMatch[1]); console.log("count", count); if (count > 0) { amount = baseAmount * count; displayName = data.title + " (x" + count + ")"; console.log("amount", amount); console.log("displayName", displayName); } } } // Обработка множественных значений для остальных типов const multipleValueTypes = [ "application-needed", "application-want", "take-player", "bring-friend", "come-by-application", "filled-profile", "game-post", "online-5hours", "flood-topic", "contest-participation" ]; if (multipleValueTypes.includes(type) && details) { // Ищем количество значений в details const fieldMatch = details.match(/:\s*([^,]+(?:,\s*[^,]+)*)/); if (fieldMatch) { const values = fieldMatch[1] .split(",") .map((item) => item.trim()) .filter((item) => item.length > 0); if (values.length > 0) { amount = baseAmount * values.length; displayName = data.title + " (x" + values.length + ")"; } } } selectedItems.push({ name: displayName, amount: amount, details: details }); currentBalance += amount; updatePreview(); } console.log(2); // Функция для добавления нового поля function addField(fieldName) { var container = document.getElementById(fieldName + "_container"); var fieldCount = container.children.length; var newFieldRow = document.createElement("div"); newFieldRow.className = "field-row"; var input = document.createElement("input"); input.type = "text"; input.id = fieldName + "_" + fieldCount; input.name = fieldName; var removeBtn = document.createElement("button"); removeBtn.type = "button"; removeBtn.className = "remove-field-btn"; removeBtn.innerHTML = "-"; removeBtn.onclick = function () { container.removeChild(newFieldRow); }; newFieldRow.appendChild(input); newFieldRow.appendChild(removeBtn); container.appendChild(newFieldRow); } // Функция для удаления пункта function removeItem(index) { if (index >= 0 && index < selectedItems.length) { currentBalance -= selectedItems[index].amount; selectedItems.splice(index, 1); updatePreview(); } } // Функция для обновления предварительного просмотра function updatePreview() { const previewContainer = document.getElementById("selected-items-preview"); const finishBtn = document.getElementById("finishBtn"); if (!previewContainer) return; if (selectedItems.length === 0) { previewContainer.innerHTML = '<div class="preview-empty">Выберите пункты для заработка</div>'; previewContainer.style.display = "none"; if (finishBtn) finishBtn.style.display = "none"; return; } previewContainer.style.display = "block"; if (finishBtn) finishBtn.style.display = "inline-block"; // Разделяем пункты на заработки и траты const earnings = selectedItems.filter((item) => item.amount > 0); const expenses = selectedItems.filter((item) => item.amount < 0); let previewHTML = '<div class="preview-header">выбранные пункты</div>'; let totalAmount = 0; // Отображаем заработки if (earnings.length > 0) { previewHTML += '<div class="preview-section-title" style="color: var(--cl4);">Заработки:</div>'; earnings.forEach(function (item, index) { totalAmount += item.amount; previewHTML += '<div class="preview-item">'; previewHTML += '<div class="preview-item-header">'; previewHTML += '<span class="preview-item-number">' + (index + 1) + ".</span>"; previewHTML += '<span class="preview-item-name">' + item.name + "</span>"; previewHTML += '<span class="preview-item-amount" style="color: var(--cl4);">+' + item.amount + "</span>"; previewHTML += '<div class="preview-item-actions">'; previewHTML += '<button type="button" class="remove-item-btn" data-index="' + selectedItems.indexOf(item) + '">❌</button>'; previewHTML += "</div>"; previewHTML += "</div>"; previewHTML += "</div>"; }); } // Отображаем траты if (expenses.length > 0) { if (earnings.length > 0) { previewHTML += '<div style="margin: 10px 0;"></div>'; } previewHTML += '<div class="preview-section-title spend-section" style="color: var(--cl44);">Траты:</div>'; expenses.forEach(function (item, index) { totalAmount += item.amount; previewHTML += '<div class="preview-item spend-item">'; previewHTML += '<div class="preview-item-header">'; previewHTML += '<span class="preview-item-number">' + (earnings.length + index + 1) + ".</span>"; previewHTML += '<span class="preview-item-name">' + item.name + "</span>"; previewHTML += '<span class="preview-item-amount" style="color: var(--cl44);">' + item.amount + "</span>"; previewHTML += '<div class="preview-item-actions">'; previewHTML += '<button type="button" class="remove-item-btn" data-index="' + selectedItems.indexOf(item) + '">❌</button>'; previewHTML += "</div>"; previewHTML += "</div>"; previewHTML += "</div>"; }); } const totalBalance = initialBalance + totalAmount; // Определяем классы для итоговых строк в зависимости от знака const totalClass = totalAmount < 0 ? ' class="preview-total negative"' : ' class="preview-total"'; const balanceClass = totalBalance < 0 ? ' class="preview-total-balance negative"' : ' class="preview-total-balance"'; previewHTML += "<div" + totalClass + ">Итого: <strong>" + totalAmount + "</strong></div>"; previewHTML += "<div" + balanceClass + ">Общий баланс: <strong>" + totalBalance + "</strong></div>"; previewContainer.innerHTML = previewHTML; } // Функция для обновления шаблона в textarea function updateTemplate() { const textarea = document.getElementById("main-reply"); if (!textarea) return; // Если ничего не выбрано, не заполняем textarea if (selectedItems.length === 0) { textarea.value = ""; return; } // Разделяем пункты на заработки и траты const earnings = selectedItems.filter((item) => item.amount > 0); const expenses = selectedItems.filter((item) => item.amount < 0); let template = ""; // Добавляем секцию заработков, если есть if (earnings.length > 0) { template += "[b]1. за что + доказательства[/b]\n"; earnings.forEach(function (item, index) { template += index + 1 + ". " + item.name + " - " + item.amount + "\n"; if (item.details) { template += " " + item.details + "\n"; } template += "\n"; }); } // Добавляем секцию трат, если есть if (expenses.length > 0) { if (earnings.length > 0) { template += "\n"; } template += "[b]2. на что потратить[/b]\n"; expenses.forEach(function (item, index) { template += index + 1 + ". " + item.name + " - " + Math.abs(item.amount) + "\n"; if (item.details) { template += " " + item.details + "\n"; } template += "\n"; }); } template += "[b]3. расчет[/b]\n"; const totalBalance = initialBalance + currentBalance; template += initialBalance + " + " + currentBalance + " = [b]" + totalBalance + "[/b]"; textarea.value = template; } console.log(3); // Функция для завершения заполнения function finishTemplate() { const textarea = document.getElementById("main-reply"); if (!textarea) return; // Генерируем полный шаблон updateTemplate(); // Разделяем пункты на заработки и траты const earnings = selectedItems.filter((item) => item.amount > 0); const expenses = selectedItems.filter((item) => item.amount < 0); // Добавляем финальную информацию let finalTemplate = textarea.value; const totalBalance = initialBalance + currentBalance; if (earnings.length > 0) { const totalEarnings = earnings.reduce((sum, item) => sum + item.amount, 0); finalTemplate += "\n\n[b]Итого заработано: " + totalEarnings + "[/b]"; } if (expenses.length > 0) { const totalExpenses = Math.abs(expenses.reduce((sum, item) => sum + item.amount, 0)); finalTemplate += "\n[b]Итого потрачено: " + totalExpenses + "[/b]"; } finalTemplate += "\n[b]Общий баланс: " + totalBalance + "[/b]"; textarea.value = finalTemplate; // Скроллим к textarea textarea.scrollIntoView({ behavior: "smooth", block: "center" }); // Фокусируемся на textarea textarea.focus(); // Очищаем список выбранных пунктов selectedItems = []; currentBalance = 0; // Очищаем предварительный просмотр (это также скроет кнопку) updatePreview(); } console.log(4); // Функция закрытия модального окна function closeModal() { const modal = document.getElementById("earnModal"); const modalContentElement = modal.querySelector(".modal-content"); modalContentElement.classList.remove("spend-modal"); modal.style.display = "none"; } console.log(5); // Функция открытия модального окна function openModal(type) { const modal = document.getElementById("earnModal"); const modalContent = document.getElementById("modalContent"); const data = modalData[type]; if (!data) return; // Определяем, является ли это пунктом "потратить" const isSpendItem = getAmountForType(type) < 0; const modalContentElement = modal.querySelector(".modal-content"); if (isSpendItem) { modalContentElement.classList.add("spend-modal"); } else { modalContentElement.classList.remove("spend-modal"); } var fieldsHTML = ""; if (data.fields.length !== 0) { fieldsHTML = data.fields .map(function (field) { var fieldHTML = '<div class="form-group">'; fieldHTML += '<label for="' + field.name + '">' + field.label + ":</label>"; if (field.type === "textarea") { fieldHTML += '<textarea id="' + field.name + '" name="' + field.name + '"'; if (field.required) fieldHTML += " required"; fieldHTML += "></textarea>"; } else { // Проверяем, является ли это полем количества const isQuantityField = field.name === "count" || field.name === "positivity_count" || field.name === "reputation_count"; if (isQuantityField) { // Для полей количества используем обычный input без кнопок fieldHTML += '<input type="' + field.type + '" id="' + field.name + '" name="' + field.name + '"'; if (field.required) fieldHTML += " required"; fieldHTML += ">"; } else { // Создаем контейнер для динамических полей fieldHTML += '<div id="' + field.name + '_container">'; fieldHTML += '<div class="field-row">'; fieldHTML += '<input type="' + field.type + '" id="' + field.name + '_0" name="' + field.name + '"'; if (field.required) fieldHTML += " required"; fieldHTML += ">"; fieldHTML += '<button type="button" class="add-field-btn" data-field="' + field.name + '">+</button>'; fieldHTML += "</div>"; fieldHTML += "</div>"; } } fieldHTML += "</div>"; return fieldHTML; }) .join(""); } modalContent.innerHTML = "<h3 id='modal-title' class='modal-title'>" + data.title + "</h3>" + '<div class="info-text">' + data.description + "</div>" + '<form id="earnForm">' + fieldsHTML + '<button type="submit" class="submit-btn">Добавить</button>' + "</form>"; modal.style.display = "block"; // Обработчик отправки формы document.getElementById("earnForm").addEventListener("submit", function (e) { e.preventDefault(); // Собираем данные из формы let details = ""; if (data.fields.length !== 0) { const fieldValues = []; data.fields.forEach(function (field) { if (field.type === "textarea") { const value = document.getElementById(field.name).value; if (value) { fieldValues.push(field.label + ": " + value); } } else { // Проверяем, является ли это полем количества const isQuantityField = field.name === "count" || field.name === "positivity_count" || field.name === "reputation_count"; if (isQuantityField) { // Для полей количества берем значение напрямую const value = document.getElementById(field.name).value; if (value) { fieldValues.push(field.label + ": " + value); } } else { // Собираем все значения из динамических полей const container = document.getElementById(field.name + "_container"); const inputs = container.querySelectorAll('input[name="' + field.name + '"]'); const values = []; inputs.forEach(function (input) { if (input.value.trim()) { values.push(input.value.trim()); } }); if (values.length > 0) { fieldValues.push(field.label + ": " + values.join(", ")); } } } }); details = fieldValues.join(", "); } // Добавляем пункт в список addItem(type, details); // Показываем кнопку "Закончил" const finishBtn = document.getElementById("finishBtn"); if (finishBtn) { finishBtn.style.display = "inline-block"; } closeModal(); }); } console.log(6); // Инициализация при загрузке страницы console.log("object 1234"); // Добавляем обработчики событий для всех кнопок const earnButtons = document.querySelectorAll(".earn-button"); console.log("earnButtons", earnButtons); earnButtons.forEach(function (button) { console.log("button", button); button.addEventListener("click", function () { const type = this.getAttribute("data-type"); console.log("type", type); if (type) { openModal(type); } }); }); // Добавляем обработчик для кнопки закрытия модального окна const closeButton = document.querySelector(".close"); console.log("closeButton", closeButton); if (closeButton) { closeButton.addEventListener("click", closeModal); } // Закрытие модального окна при клике вне его window.addEventListener("click", function (event) { const modal = document.getElementById("earnModal"); if (event.target === modal) { closeModal(); } }); // Добавляем обработчик для кнопки "Закончил" const finishBtn = document.getElementById("finishBtn"); console.log("finishBtn", finishBtn); if (finishBtn) { finishBtn.addEventListener("click", finishTemplate); } // Добавляем делегирование событий для кнопок добавления полей document.addEventListener("click", function (event) { if (event.target.classList.contains("add-field-btn")) { const fieldName = event.target.getAttribute("data-field"); if (fieldName) { addField(fieldName); } } // Обработка кнопки удаления пунктов if (event.target.classList.contains("remove-item-btn")) { const index = parseInt(event.target.getAttribute("data-index")); removeItem(index); } }); // Инициализируем начальный баланс initialBalance = getInitialBalance(); // Инициализируем предварительный просмотр (скроет элементы если ничего не выбрано) updatePreview(); }); </script>
[hideprofile]