Код:
<!--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]


