GNU/skin/board/daemon_day_upbit/write/write.script.php
<script>
window.addEventListener('load', function() {
    const loader = document.getElementById('CYBER_LOADER');
    setTimeout(() => {
        loader.style.opacity = '0';
        setTimeout(() => {
            if (loader) loader.style.visibility = 'hidden';
        }, 500);
    }, 800);
    normalizeAllDaySelection();
    initAdditionalOptionPack();
    updateAmountHint();
    updateLiveDisplay();
});

function getAllDayFields() {
    return document.querySelectorAll('input[name="x2_all_day_1"], input[name="x2_all_day_2"], input[name="x2_all_day_3"], input[name="x2_all_day_4"], input[name="x2_all_day_5"], input[name="x2_all_day_6"], input[name="x2_all_day_7"], input[name="x2_all_day_8"]');
}

function initAdditionalOptionPack() {
    const btn = document.getElementById('btnOptionPack');
    const rows = document.querySelectorAll('.additional-option-row');
    if (!btn || !rows.length) return;

    const openByDefault = btn.getAttribute('data-open') === '1';
    const setVisible = function(visible, useAnimation) {
        rows.forEach(function(row) {
            if (visible) {
                if (useAnimation && window.jQuery) {
                    jQuery(row).stop(true, true).slideDown(180);
                } else {
                    row.style.display = 'table-row';
                }
            } else {
                if (useAnimation && window.jQuery) {
                    jQuery(row).stop(true, true).slideUp(160);
                } else {
                    row.style.display = 'none';
                }
            }
        });
        btn.classList.toggle('active', visible);
        btn.setAttribute('data-open', visible ? '1' : '0');
    };

    setVisible(openByDefault, false);

    btn.addEventListener('click', function() {
        const isOpen = btn.getAttribute('data-open') === '1';
        setVisible(!isOpen, true);
    });
}

function updateLiveDisplay() {
    const f = document.fwrite;
    if (!f) return;

    let ca2 = f.x2_ca2.value || "미지정";
    let ca3 = f.x2_ca3.value || "미지정";

    const yoilArr = ["일", "월", "화", "수", "목", "금", "토"];
    let yoilText = (f.x2_week.value !== "") ? yoilArr[f.x2_week.value] + "요일" : "";

    let month = (f.x2_month && f.x2_month.checked) ? "매월" : "";
    let day = f.x2_day.value ? f.x2_day.value + "일" : "";
    let hour = f.x2_hour.value ? f.x2_hour.value + "시" : "";
    let min = f.x2_min.value ? f.x2_min.value + "분" : "";

    let coinSelect = f.x2_coin;
    let coin = (coinSelect && coinSelect.value) ? coinSelect.options[coinSelect.selectedIndex].text : "미선택";

    let ver = f.x2_ver.value ? "Ver." + f.x2_ver.value : "";
    let status = (f.x2_run && f.x2_run.checked)
        ? "<b class='status-running'>[RUNNING]</b>"
        : "<b class='status-stopped'>[STOPPED]</b>";

    const allDayModes = [
        { check: f.x2_all_day_1, interval: f.x2_interval, label: "시간 단위" },
        { check: f.x2_all_day_2, interval: f.x2_interval_2, label: "하락 조건" },
        { check: f.x2_all_day_3, interval: f.x2_interval_3, label: "금액 조건" },
        { check: f.x2_all_day_4, interval: f.x2_interval_4, label: "손실 조건" },
        { check: f.x2_all_day_5, interval: f.x2_interval_5, label: "수익 구간" },
        { check: f.x2_all_day_6, interval: f.x2_interval_6, label: "수익 비율" },
        { check: f.x2_all_day_7, interval: f.x2_interval_7, label: "손실 비율" },
        { check: f.x2_all_day_8, interval: f.x2_interval_8, label: "매도 비중" }
    ];

    let selectedAllDay = allDayModes.find((mode) => mode.check && mode.check.checked);
    let allDay = selectedAllDay ? "<span class='all-day-badge'>[ALL-DAY:" + selectedAllDay.label + "]</span>" : "";
    let interval = (selectedAllDay && selectedAllDay.interval && selectedAllDay.interval.value)
        ? selectedAllDay.interval.value + "분"
        : "";

    let timeInfo = [month, yoilText, day, hour, min].filter(Boolean).join(" ");
    if (allDay) timeInfo = allDay + " " + interval + " 간격";

    let tradeMode = (f.x2_sell && f.x2_sell.checked) ? "매도" : "매수";

    let html =
        status + " &nbsp; " +
        "<span>TRADE:</span> <b>" + tradeMode + "</b> &nbsp; " +
        "<span>TYPE:</span> <b>" + ca2 + "</b> &nbsp; " +
        "<span>PERIOD:</span> <b>" + ca3 + "</b> &nbsp; " +
        "<span>TIME:</span> <b>" + (timeInfo || "미정") + "</b> &nbsp; " +
        "<span>COIN:</span> <b>" + coin + "</b> &nbsp; " +
        "<span>VER:</span> <b>" + ver + "</b>";

    const liveDisp = document.getElementById('LIVE_DISPLAY');
    if (liveDisp) liveDisp.innerHTML = html;
}

function normalizeAllDaySelection() {
    const fields = getAllDayFields();
    let foundChecked = false;

    fields.forEach((field) => {
        if (field.checked) {
            if (foundChecked) {
                field.checked = false;
            } else {
                foundChecked = true;
            }
        }
    });
}

function setExclusiveAllDay(currentField) {
    const fields = getAllDayFields();

    if (currentField && currentField.checked) {
        fields.forEach((field) => {
            if (field !== currentField) {
                field.checked = false;
            }
        });
    }

    updateLiveDisplay();
}

function updateAmountHint() {
    // 타격 금액 메세지 (기존 로직 그대로)
    var val = parseInt($('[name="wr_subject"]').val().replace(/,/g, '')) || 0;
    var msg = $('#subject_live_msg');
    if (val >= 5001) {
        msg.text('✔ 주문 가능').css('color', '#00ff99');
    } else if (val > 0) {
        msg.text('✘ 최소 5,001원 이상').css('color', '#ff4466');
    } else {
        msg.text('');
    }

    // 매수금 단위 메세지 (추가)
    var basicVal = parseInt($('[name="wr_subject_basic"]').val().replace(/,/g, '')) || 0;
    var basicMsg = $('#subject_basic_live_msg');
    if (basicVal >= 5001) {
        basicMsg.text('✔ 주문 가능').css('color', '#00ff99');
    } else if (basicVal > 0) {
        basicMsg.text('✘ 최소 5,001원 이상').css('color', '#ff4466');
    } else {
        basicMsg.text('');
    }

    // 매도금 단위 메세지 (추가)
    var sellVal = parseInt($('[name="wr_subject_basic_2"]').val().replace(/,/g, '')) || 0;
    var sellMsg = $('#subject_basic_2_live_msg');
    if (sellVal >= 5001) {
        sellMsg.text('✔ 주문 가능').css('color', '#00ff99');
    } else if (sellVal > 0) {
        sellMsg.text('✘ 최소 5,001원 이상').css('color', '#ff4466');
    } else {
        sellMsg.text('');
    }
}

const canvas = document.getElementById('space-canvas');
if (canvas) {
    const ctx = canvas.getContext('2d');
    let stars = [];
    function initSpace() {
        canvas.width = window.innerWidth;
        canvas.height = window.innerHeight;
        stars = [];
        for (let i = 0; i < 100; i++) {
            stars.push({
                x: Math.random() * canvas.width,
                y: Math.random() * canvas.height,
                size: Math.random() * 1.1,
                speed: Math.random() * 0.1
            });
        }
    }
    function animateSpace() {
        ctx.clearRect(0, 0, canvas.width, canvas.height);
        ctx.fillStyle = "rgba(255, 255, 255, 0.2)";
        stars.forEach((star) => {
            ctx.beginPath();
            ctx.arc(star.x, star.y, star.size, 0, Math.PI * 2);
            ctx.fill();
            star.y += star.speed;
            if (star.y > canvas.height) star.y = 0;
        });
        requestAnimationFrame(animateSpace);
    }
    window.addEventListener('resize', initSpace);
    initSpace();
    animateSpace();
}

function updateFileName(input, index) {
    const fileName = input.files[0] ? input.files[0].name : "파일이 선택되지 않음";
    const display = document.getElementById('file_name_' + index);
    if (display) {
        display.innerText = fileName;
        display.classList.add('file-name-picked');
    }
}

function file_add() {
    var rows = document.querySelectorAll('.file-row:not(.active)');
    if (rows.length > 0) rows[0].classList.add('active');
}

function fwrite_submit(f) {
    <?php echo $editor_js; ?>

    if (!f.x2_coin.value) {
        alert("매수할 코인 종목을 선택해주세요.");
        f.x2_coin.focus();
        return false;
    }

    var priceVal = f.wr_subject.value.replace(/[^0-9]/g, "");
    var priceNum = parseInt(priceVal, 10);

    if (priceVal === "" || priceNum <= 0) {
        alert("매수 금액을 숫자로 입력해주세요.\n(예: 10000)");
        f.wr_subject.focus();
        return false;
    }

    if (priceNum < 5001) {
        alert("업비트 최소 주문 금액 기준으로 5,001원 이상 입력해주세요.");
        f.wr_subject.focus();
        return false;
    }

    const btn = document.getElementById('btn_submit');
    if (btn) {
        btn.disabled = true;
        btn.innerText = "저장 처리 중...";
    }

    return true;
}
</script>