<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 + " " +
"<span>TRADE:</span> <b>" + tradeMode + "</b> " +
"<span>TYPE:</span> <b>" + ca2 + "</b> " +
"<span>PERIOD:</span> <b>" + ca3 + "</b> " +
"<span>TIME:</span> <b>" + (timeInfo || "미정") + "</b> " +
"<span>COIN:</span> <b>" + coin + "</b> " +
"<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>