(function () { function parseNum(v) { var n = parseFloat(v); return isNaN(n) ? null : n; } function calcPnl(direction, entry, target, lots) { if (!entry || !target || !lots) return ''; if (direction === 'long') return ((target - entry) * lots).toFixed(2); if (direction === 'short') return ((entry - target) * lots).toFixed(2); return ''; } function calcDuration(openVal, closeVal) { if (!openVal || !closeVal) return ''; var o = new Date(openVal); var c = new Date(closeVal); var secs = Math.floor((c - o) / 1000); if (secs < 0) return ''; var h = Math.floor(secs / 3600); var m = Math.floor((secs % 3600) / 60); return h ? h + '小时' + m + '分钟' : m + '分钟'; } function recalc() { var form = document.getElementById('review-form'); if (!form) return; var dir = form.querySelector('[name="direction"]').value; var entry = parseNum(form.querySelector('[name="entry_price"]').value); var sl = parseNum(form.querySelector('[name="stop_loss"]').value); var tp = parseNum(form.querySelector('[name="take_profit"]').value); var close = parseNum(form.querySelector('[name="close_price"]').value); var lots = parseNum(form.querySelector('[name="lots"]').value) || 1; var openT = form.querySelector('[name="open_time"]').value; var closeT = form.querySelector('[name="close_time"]').value; var hold = document.getElementById('holding_duration'); var initP = document.getElementById('initial_pnl'); var actP = document.getElementById('actual_pnl'); if (hold) hold.value = calcDuration(openT, closeT); if (initP) initP.value = calcPnl(dir, entry, tp, lots); if (actP) actP.value = calcPnl(dir, entry, close, lots); } function bindForm() { var form = document.getElementById('review-form'); if (!form) return; form.querySelectorAll('input, select').forEach(function (el) { el.addEventListener('input', recalc); el.addEventListener('change', recalc); }); } function showModal(data) { var mask = document.getElementById('review-modal'); var body = document.getElementById('review-modal-body'); if (!mask || !body) return; var html = ''; if (data.screenshot) { html += '
'; } body.innerHTML = html; mask.classList.add('show'); } function bindModal() { var mask = document.getElementById('review-modal'); if (!mask) return; mask.querySelector('.modal-close').addEventListener('click', function () { mask.classList.remove('show'); }); mask.addEventListener('click', function (e) { if (e.target === mask) mask.classList.remove('show'); }); document.querySelectorAll('.review-view-btn').forEach(function (btn) { btn.addEventListener('click', function () { try { showModal(JSON.parse(btn.getAttribute('data-review'))); } catch (e) { /* ignore */ } }); }); } document.addEventListener('DOMContentLoaded', function () { bindForm(); bindModal(); recalc(); }); })();