// 설문 관리 관리자 JavaScript document.addEventListener('DOMContentLoaded', function() { // 확인 대화상자 const confirmButtons = document.querySelectorAll('[onclick*="confirm"]'); confirmButtons.forEach(button => { button.addEventListener('click', function(e) { const message = this.getAttribute('onclick').match(/confirm\('([^']+)'\)/); if (message && !confirm(message[1])) { e.preventDefault(); return false; } }); }); // 툴팁 초기화 const tooltips = document.querySelectorAll('[title]'); tooltips.forEach(element => { element.addEventListener('mouseenter', function() { const title = this.getAttribute('title'); if (title) { this.setAttribute('data-original-title', title); this.removeAttribute('title'); const tooltip = document.createElement('div'); tooltip.className = 'tooltip'; tooltip.textContent = title; tooltip.style.cssText = ` position: absolute; background: #333; color: white; padding: 5px 10px; border-radius: 4px; font-size: 12px; z-index: 1000; pointer-events: none; `; document.body.appendChild(tooltip); const rect = this.getBoundingClientRect(); tooltip.style.left = rect.left + (rect.width / 2) - (tooltip.offsetWidth / 2) + 'px'; tooltip.style.top = rect.top - tooltip.offsetHeight - 5 + 'px'; this._tooltip = tooltip; } }); element.addEventListener('mouseleave', function() { if (this._tooltip) { document.body.removeChild(this._tooltip); this._tooltip = null; } const originalTitle = this.getAttribute('data-original-title'); if (originalTitle) { this.setAttribute('title', originalTitle); this.removeAttribute('data-original-title'); } }); }); // 자동 저장 기능 (폼이 있는 경우) const forms = document.querySelectorAll('form'); forms.forEach(form => { const inputs = form.querySelectorAll('input, textarea, select'); inputs.forEach(input => { input.addEventListener('change', function() { // 자동 저장 로직 (필요시 구현) console.log('Form data changed:', this.name, this.value); }); }); }); }); // 유틸리티 함수들 window.SurveyAdmin = window.SurveyAdmin || { // 숫자 포맷팅 formatNumber: function(num) { return new Intl.NumberFormat('ko-KR').format(num); }, // 날짜 포맷팅 formatDate: function(dateString) { const date = new Date(dateString); return date.toLocaleDateString('ko-KR'); }, // 시간 포맷팅 formatDateTime: function(dateString) { const date = new Date(dateString); return date.toLocaleString('ko-KR'); }, // AJAX 요청 ajax: function(url, data, callback) { const xhr = new XMLHttpRequest(); xhr.open('POST', url, true); xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); xhr.onreadystatechange = function() { if (xhr.readyState === 4) { if (xhr.status === 200) { try { const response = JSON.parse(xhr.responseText); callback(null, response); } catch (e) { callback(null, xhr.responseText); } } else { callback(new Error('Request failed: ' + xhr.status)); } } }; const params = new URLSearchParams(data).toString(); xhr.send(params); }, // 알림 표시 showAlert: function(message, type = 'info') { const alert = document.createElement('div'); alert.className = `alert alert-${type}`; alert.textContent = message; alert.style.cssText = ` position: fixed; top: 20px; right: 20px; z-index: 9999; min-width: 300px; animation: slideInRight 0.3s ease; `; document.body.appendChild(alert); setTimeout(() => { alert.style.animation = 'slideOutRight 0.3s ease'; setTimeout(() => { if (alert.parentNode) { alert.parentNode.removeChild(alert); } }, 300); }, 3000); }, // 로딩 표시 showLoading: function(show = true) { let loading = document.getElementById('loading-overlay'); if (show) { if (!loading) { loading = document.createElement('div'); loading.id = 'loading-overlay'; loading.innerHTML = `
처리 중...
`; document.body.appendChild(loading); } } else { if (loading) { loading.parentNode.removeChild(loading); } } } }; // CSS 애니메이션 추가 const style = document.createElement('style'); style.textContent = ` @keyframes slideInRight { from { transform: translateX(100%); opacity: 0; } to { transform: translateX(0); opacity: 1; } } @keyframes slideOutRight { from { transform: translateX(0); opacity: 1; } to { transform: translateX(100%); opacity: 0; } } @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } `; document.head.appendChild(style);