// 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;
}
};
})();