document.querySelectorAll('[data-amount]').forEach(function (button) { button.addEventListener('click', function () { var input = button.closest('form').querySelector('input[name="amount"]'); if (input) input.value = button.dataset.amount; }); }); document.querySelectorAll('.alert').forEach(function (alert) { window.setTimeout(function () { alert.style.display = 'none'; }, 5000); }); document.querySelectorAll('.badge.rewarded').forEach(function (badge) { badge.classList.add('approved'); }); document.querySelectorAll('[data-copy]').forEach(function (button) { button.addEventListener('click', function () { var input = document.querySelector(button.dataset.copy); if (!input) return; var original = button.textContent; var copied = function () { button.textContent = '已复制'; window.setTimeout(function () { button.textContent = original; }, 1500); }; if (navigator.clipboard && window.isSecureContext) { navigator.clipboard.writeText(input.value).then(copied); return; } input.select(); document.execCommand('copy'); copied(); }); }); var adminNavigation = document.querySelector('.admin-side nav'); if (adminNavigation && !adminNavigation.querySelector('a[href="/admin/audits.php"]')) { var settingsLink = adminNavigation.querySelector('a[href*="view=settings"]'); var auditLink = document.createElement('a'); auditLink.href = '/admin/audits.php'; auditLink.textContent = '操作审计'; adminNavigation.insertBefore(auditLink, settingsLink || null); } var cardManager = document.querySelector('[data-card-manager]'); if (cardManager) { var cardStyles = document.createElement('link'); cardStyles.rel = 'stylesheet'; cardStyles.href = '/assets/cards-admin.css?v=20260722-2'; document.head.appendChild(cardStyles); var cardInputs = Array.prototype.slice.call(cardManager.querySelectorAll('.card-select:not(:disabled)')); var cardToggleAll = cardManager.querySelector('[data-card-toggle-all]'); var cardSelectAll = cardManager.querySelector('[data-card-select-all]'); var cardCopy = cardManager.querySelector('[data-card-copy]'); var cardExport = cardManager.querySelector('[data-card-export]'); var cardCount = cardManager.querySelector('[data-card-selected-count]'); function selectedCards() { return cardInputs.filter(function (input) { return input.checked; }); } function updateCardSelection() { var selected = selectedCards(); cardCount.textContent = '已选 ' + selected.length + ' 张'; cardCopy.disabled = selected.length === 0; cardExport.disabled = selected.length === 0; cardSelectAll.disabled = cardInputs.length === 0; cardSelectAll.textContent = selected.length === cardInputs.length && cardInputs.length ? '取消全选' : '全选可用卡'; cardToggleAll.disabled = cardInputs.length === 0; cardToggleAll.checked = selected.length === cardInputs.length && cardInputs.length > 0; cardToggleAll.indeterminate = selected.length > 0 && selected.length < cardInputs.length; } function setCardButtonFeedback(button, message) { var original = button.textContent; button.textContent = message; window.setTimeout(function () { button.textContent = original; }, 1500); } function fallbackCopy(text) { var textarea = document.createElement('textarea'); textarea.value = text; textarea.setAttribute('readonly', ''); textarea.style.position = 'fixed'; textarea.style.left = '-9999px'; document.body.appendChild(textarea); textarea.select(); document.execCommand('copy'); document.body.removeChild(textarea); } cardInputs.forEach(function (input) { input.addEventListener('change', updateCardSelection); }); cardSelectAll.addEventListener('click', function () { var shouldSelect = selectedCards().length !== cardInputs.length; cardInputs.forEach(function (input) { input.checked = shouldSelect; }); updateCardSelection(); }); cardToggleAll.addEventListener('change', function () { cardInputs.forEach(function (input) { input.checked = cardToggleAll.checked; }); updateCardSelection(); }); cardCopy.addEventListener('click', function () { var text = selectedCards().map(function (input) { return input.dataset.cardCode; }).join('\n'); if (!text) return; if (navigator.clipboard && window.isSecureContext) { navigator.clipboard.writeText(text).then(function () { setCardButtonFeedback(cardCopy, '已复制'); }, function () { fallbackCopy(text); setCardButtonFeedback(cardCopy, '已复制'); }); } else { fallbackCopy(text); setCardButtonFeedback(cardCopy, '已复制'); } }); cardExport.addEventListener('click', function () { var rows = [['卡号', '类型', '面额', '状态', '生成时间']]; selectedCards().forEach(function (input) { rows.push([input.dataset.cardCode, input.dataset.cardType, input.dataset.cardAmount, input.dataset.cardStatus, input.dataset.cardCreated]); }); if (rows.length === 1) return; var csv = rows.map(function (row) { return row.map(function (value) { return '"' + String(value).replace(/"/g, '""') + '"'; }).join(','); }).join('\r\n'); var url = URL.createObjectURL(new Blob(['\ufeff' + csv], {type: 'text/csv;charset=utf-8'})); var download = document.createElement('a'); var stamp = new Date().toISOString().replace(/[-:T]/g, '').slice(0, 14); download.href = url; download.download = 'recharge-cards-' + stamp + '.csv'; document.body.appendChild(download); download.click(); document.body.removeChild(download); URL.revokeObjectURL(url); setCardButtonFeedback(cardExport, '已导出'); }); updateCardSelection(); } var cardCreateForm = document.querySelector('[data-card-create-form]'); if (cardCreateForm) { var cardTypeInput = cardCreateForm.querySelector('[data-card-type]'); var cardCountInput = cardCreateForm.querySelector('[data-card-count]'); function updateCardCountInput() { if (cardTypeInput.value === 'shared') { cardCountInput.dataset.singleCount = cardCountInput.value; cardCountInput.value = '1'; cardCountInput.readOnly = true; } else { cardCountInput.readOnly = false; if (cardCountInput.value === '1' && cardCountInput.dataset.singleCount) cardCountInput.value = cardCountInput.dataset.singleCount; } } cardTypeInput.addEventListener('change', updateCardCountInput); updateCardCountInput(); } if (document.querySelector('.game-config')) { var gameAdminStyles = document.createElement('link'); gameAdminStyles.rel = 'stylesheet'; gameAdminStyles.href = '/assets/game-admin.css?v=20260721'; document.head.appendChild(gameAdminStyles); }