// sc_DTcalender.js 의 공휴일을 설정하는 부분 let sc_Holiday = []; window.addEventListener('DOMContentLoaded', load_holiday_data); function load_holiday_data(){ sc_Holiday = []; fetch(ADMIN_URL+ 'cfg/prog_holiday_set.dat') .then(res => res.text()) .then(text => { const lines = text.split('\n'); for(let line of lines){ line = line.trim().split(';')[0].trim(); if (line === '') continue; const [lunar, month, day, name, year] = line.split('|'); sc_Holiday.push({ lunar: parseInt(lunar), // 1: 음력, 0: 양력 month: parseInt(month), day: parseInt(day), name: name.trim(), year: year ? parseInt(year) : null }); } }) .catch(err => console.error("공휴일 파일 불러오기 실패:", err)); } function get_holiday_str(y, m, d, isLD, l_y, l_m, l_d, l_isLD, l_i) { const names = []; for(const h of sc_Holiday){ if(h.lunar=='0' && (h.year==null || h.year==y)){ if(h.month + ':' + h.day == m + ':' + d || (h.day=='-1' && isLD && h.month==m)){ names.push(h.name); } }else if(h.lunar=='1' && !l_i && (h.year==null || h.year==l_y)){ if(h.month + ':' + h.day == l_m + ':' + l_d || (h.day=='-1' && l_isLD && h.month==l_m)){ names.push(h.name); } } } return names.join(', '); } sc_DTcalender.onOverDay = function(o, day){ // 날짜 위에 마우스 올렸을때 var str = ''; var y = parseInt(o.sel_y); var m = parseInt(o.sel_m); var d = parseInt(day); var l_m = parseInt(o.Lunar.ssolar2lunar[day-1].month); var l_d = parseInt(o.Lunar.ssolar2lunar[day-1].day); var l_i = o.Lunar.ssolar2lunar[day-1].yoon; var l_y = parseInt(o.Lunar.ssolar2lunar[day-1].year); var isLD = o.Lunar.month_last[ m - 1] == d; var l_isLD = o.Lunar.ssolar2lunar[day-1].last == l_d; if(l_d==9 || l_d==10 || l_d==19 || l_d==20 || l_d==29 || l_d==30) str += '손없음 '; str += '음' + l_m + '.' + l_d + (l_i ? '윤' : ''); var t = get_holiday_str(y, m, d, isLD, l_y, l_m, l_d, l_isLD, l_i); if(t!='') str += '' + t + ''; return str; }; sc_DTcalender.drawOneDay = function(o, day){ // 1날짜를 표시할때 var y = parseInt(o.sel_y); var m = parseInt(o.sel_m); var d = parseInt(day); var l_m = parseInt(o.Lunar.ssolar2lunar[day-1].month); var l_d = parseInt(o.Lunar.ssolar2lunar[day-1].day); var l_i = o.Lunar.ssolar2lunar[day-1].yoon; var l_y = parseInt(o.Lunar.ssolar2lunar[day-1].year); var isLD = o.Lunar.month_last[ m - 1] == d; var l_isLD = o.Lunar.ssolar2lunar[day-1].last == l_d var t = get_holiday_str(y, m, d, isLD, l_y, l_m, l_d, l_isLD, l_i); if(t!='') day = ' ' + day + ''; if(l_d==9 || l_d==10 || l_d==19 || l_d==20 || l_d==29 || l_d==30) day = '*' + day + ''; return day; }; (function() { // data-min="0" data-max="60" 같은 항목 동작 // 1. 기존 함수 백업 (휴일 표시 로직 유지) var holiday_drawOneDay = sc_DTcalender.drawOneDay; var original_setDayClose = sc_DTcalender.setDayClose; // 2. 날짜 유효성 검사 함수 function check_valid_range(y, m, d) { var targetInput = sc_DTcalender.tarDate; // 대상이 없으면 제한 없음 if (!targetInput) return true; // 속성값 가져오기 (속성이 없으면 null 반환) var minAttr = targetInput.getAttribute('data-min'); var maxAttr = targetInput.getAttribute('data-max'); // 둘 다 없으면 무한대 (제한 없음) if (minAttr === null && maxAttr === null) { return true; } var current = new Date(y, m - 1, d); // 달력에 그려질 날짜 var today = new Date(); today.setHours(0, 0, 0, 0); // 시간 초기화 (오늘 0시 0분) // 1) 최소 날짜 제한 (data-min이 있는 경우만) if (minAttr !== null) { var minOffset = parseInt(minAttr); // 문자열을 숫자로 변환 var minDate = new Date(today); minDate.setDate(today.getDate() + minOffset); // 오늘 + min값 // 현재 날짜가 최소 날짜보다 작으면 선택 불가 if (current < minDate) return false; } // 2) 최대 날짜 제한 (data-max가 있는 경우만) if (maxAttr !== null) { var maxOffset = parseInt(maxAttr); var maxDate = new Date(today); maxDate.setDate(today.getDate() + maxOffset); // 오늘 + max값 // 현재 날짜가 최대 날짜보다 크면 선택 불가 if (current > maxDate) return false; } return true; } // 3. 화면 그리기 (오버라이딩) sc_DTcalender.drawOneDay = function(o, day) { var y = parseInt(o.sel_y); var m = parseInt(o.sel_m); var d = parseInt(day); // 유효하지 않은 날짜는 회색 처리 if (!check_valid_range(y, m, d)) { return '' + d + ''; } // 유효한 날짜는 기존 휴일 로직 실행 if (typeof holiday_drawOneDay === 'function') { return holiday_drawOneDay(o, day); } else { // 기존 함수가 없으면 그냥 날짜 숫자만 반환 (기본 동작) return day; } }; // 4. 클릭 동작 (오버라이딩) sc_DTcalender.setDayClose = function(day) { // 유효하지 않은 날짜 클릭 시 동작 안 함 if (!check_valid_range(this.sel_y, this.sel_m, day)) { return; } if (typeof original_setDayClose === 'function') { return original_setDayClose(day); } else { // 기존 함수가 없으면 그냥 날짜 숫자만 반환 (기본 동작) return day; } }; })();