var oObjDate = null;
var oObjForm = null;
var oPopup = window.createPopup(); // 팝업 윈도우를 선언한다.
var chkHoli = false;
var monDays = "31;28;31;30;31;30;31;31;30;31;30;31;".split(";");
// 입력된 일자 Data의 형식을 검사한다.
function appCheckData( arg ) {
var date = arg.split("-");
if( arg == "" ) {
return true;
} else if( arg.indexOf(" ") != -1 || date.length != 3 ) { // 년.월.일 형식이 맞는지 검사
alert("YYYY-MM-DD 형식으로 넣어주세요");
oObjDate.focus();
return false;
} else {
// year check
if( date[0].length != 4 ) {
alert("연도 정보가 잘못 입력되었습니다.");
oObjDate.focus();
return false;
}
// month check
if( date[1].length != 2 || new Number(date[1]) > 12 || new Number(date[1]) < 1 ) {
alert("월 정보가 잘못 입력되었습니다.");
oObjDate.focus();
return false;
}
// day check
var lastDay;
// 월별 마지막 날짜를 얻는다.
if( date[1] == "02" )
lastDay = getFebLength( date[0] );
else
lastDay = parseInt(monDays[ date[0] - 1 ]);
// 일자가 마지막 날짜를 넘었는지 확인한다.
if( date[2].length != 2 || new Number(date[2]) > lastDay ) {
alert("일 정보가 잘 못 되었습니다.");
oObjDate.focus();
return false;
}
return true;
}
}
// 윤달 여부를 계산한다.
function getFebLength(theYear) {
theYear = (theYear < 1900) ? theYear + 1900 : theYear;
if( ( theYear % 4 == 0 && theYear % 100 != 0 ) || theYear % 400 == 0 ) {
return 29;
}
return 28;
}
// 해당 연도의 첫째 요일을 구한다.
function getFirstDay(theYear){
var firstDate = new Date(theYear,this.offset,1);
return firstDate.getDay();
}
// 월, 일 정보가 한자리인경우 앞에 '0'을 붙인다.
function setCalendarZero(sVal) {
sVal = sVal.toString();
if( sVal.length == 1 ) {
return sVal = "0" + sVal;
} else {
return sVal = sVal;
}
}
// 달력을 그려 준다.
function reDrawCalendar(sDate) {
var tDate = sDate;
var nLoop = 0;
var oObj = tblDayList.rows;
var nLastDay = parseInt(monDays[ sDate.substring(4,6) - 1 ]);
if( sDate.substring(4, 6) == "02" ) {
nLastDay = getFebLength(sDate.substring(0,4));
}
nowYear.innerHTML = sDate.substring(0,4);
nowMonth.innerHTML = sDate.substring(4,6);
var anchorDay = new Date(sDate.substring(0,4) + "/" + sDate.substring(4,6) + "/01");
var firstDay = anchorDay.getDay();
var nRoop = 0; // 주 정보
var nCoop = 0; // 요일 정보
var nChk = parseInt(sDate.substring(6,8)); // 현재 일자
var sTblList = "
";
var activeHeight = "24px";
var loopCount = 5;
///////////////////////////////////////////////////////
// 요일에 따라 Loop의 회수를 구한다.
///////////////////////////////////////////////////////
if( ( firstDay > 4 && nLastDay > 30 ) || ( firstDay > 5 && nLastDay > 29 ) ) {
activeHeight = "20px";
loopCount = 6;
}
for ( nRoop = 0; nRoop < loopCount; nRoop++ ) {
sTblList = sTblList + "";
for( nCoop = 0; nCoop < 7; nCoop++ ) {
absDay = nRoop * 7 + nCoop;
// 첫주의 이전달이거나 마지막주의 다음달 정보인 경우
if( ( absDay < firstDay ) || ( absDay >= ( nLastDay + firstDay ) ) ) {
if( nCoop == 0 ) {
sTblList = sTblList + "| | ";
} else if( nCoop == 6 ) {
sTblList = sTblList + " | ";
} else {
sTblList = sTblList + " | ";
}
} else { // 일자 정보 출력
prnDay = absDay - firstDay + 1;
if( nChk == prnDay ) { // 선택된 일자인 경우
if( nCoop == 0 ) {
sTblList = sTblList + "" + prnDay + " | ";
} else if( nCoop == 6 ) {
sTblList = sTblList + "" + prnDay + " | ";
} else {
sTblList = sTblList + "" + prnDay + " | ";
}
} else {
if( nCoop == 0 ) {
sTblList = sTblList + "" + prnDay + " | ";
} else if( nCoop == 6 ) {
sTblList = sTblList + "" + prnDay + " | ";
} else {
sTblList = sTblList + "" + prnDay + " | ";
}
}
}
}
sTblList = sTblList + "
";
}
divDayList.innerHTML = sTblList + "
";
}
// 월 정보가 바뀌는 경우 달력을 다시 그린다.
function resetMonth(oYear, oMonth, odivDay, nMonth) {
var anchorDay = new Date(oYear.innerHTML + "/" + oMonth.innerHTML + "/01");
anchorDay.setMonth(anchorDay.getMonth() + nMonth);
var sDate = anchorDay.getFullYear() + setCalendarZero(anchorDay.getMonth() + 1) + setCalendarZero(anchorDay.getDate());
var nLastDay = parseInt(monDays[ sDate.substring(4,6) - 1 ]);
if( sDate.substring(4, 6) == "02" ) {
nLastDay = getFebLength(sDate.substring(0,4));
}
oYear.innerHTML = sDate.substring(0,4);
oMonth.innerHTML = sDate.substring(4,6);
var anchorDay = new Date(sDate.substring(0,4) + "/" + sDate.substring(4,6) + "/01");
var firstDay = anchorDay.getDay();
var nRoop = 0;
var nCoop = 0;
var nChk = parseInt(oObjDate.value.substring(8, 10));
if( nChk > nLastDay )
nChk = nLastDay;
var sTmp = sDate.substring(0,4) + "-" + sDate.substring(4,6) + "-" + nChk;
if( sTmp.length == 9 )
sTmp = oYear.innerHTML + "-" + oMonth.innerHTML + "-" + "0" + nChk;
//oObjDate.value = sTmp;
var sTblList = "";
var activeHeight = "24px";
var loopCount = 5;
if( ( firstDay > 4 && nLastDay > 30 ) || ( firstDay > 5 && nLastDay > 29 ) ) {
activeHeight = "20px";
loopCount = 6;
}
for( nRoop = 0; nRoop < loopCount; nRoop++ ) {
sTblList = sTblList + "";
for( nCoop = 0; nCoop < 7; nCoop++ ) {
absDay = nRoop * 7 + nCoop;
if( ( absDay < firstDay ) || ( absDay >= ( nLastDay + firstDay ) ) ) {
if( nCoop == 0 ) {
sTblList = sTblList + "| | ";
} else if( nCoop == 6 ) {
sTblList = sTblList + " | ";
} else {
sTblList = sTblList + " | ";
}
} else {
prnDay = absDay - firstDay + 1;
if( nChk == prnDay ) {
if( nCoop == 0 ) {
sTblList = sTblList + "" + prnDay + " | ";
} else if( nCoop == 6 ) {
sTblList = sTblList + "" + prnDay + " | ";
} else {
sTblList = sTblList + "" + prnDay + " | ";
}
} else {
if( nCoop == 0 ) {
sTblList = sTblList + "" + prnDay + " | ";
} else if( nCoop == 6 ) {
sTblList = sTblList + "" + prnDay + " | ";
} else {
sTblList = sTblList + "" + prnDay + " | ";
}
}
}
}
sTblList = sTblList + "
";
}
odivDay.innerHTML = sTblList + "
";
}
//오늘날짜
function toDate(){
var now = new Date();
var year = now.getYear();
var month = now.getMonth()+ 1;
var day = now.getDate();
if(month < 10){
month = "0" + month;
}
if(day < 10){
day = "0" + day;
}
return year +"-"+ month +"-"+ day;
}
// 화면에 달력을 출력한다.
function showCalendar(oMyform, oDate, oObj, nX, nY) {
var objDate = null;
if(document.getElementById(oDate)!=null) {
objDate = document.getElementById(oDate);
} else {
objDate = eval(oDate);
}
var curCalDate = "";
oObjDate = objDate;
if( appCheckData(objDate.value) == false ) // Date 정보를 검사한다.
return;
var oPopupBody = oPopup.document.body; // 팝업 윈도우의 body객체
if( objDate.value == "") {
curCalDate = toDate();
//objDate.value = curCalDate ;
}else {
curCalDate = objDate.value;
}
var date = curCalDate.split("-");
reDrawCalendar(date[0] + date[1] + date[2]); // 달력을 그린다.
oPopupBody.innerHTML = divCalendar.innerHTML; // 그려진 달력을 팝업 윈도우에 삽입한다.
oPopup.show(nX - 156, nY + 9, 169, 167, oObj); // 팝업 윈도우를 화면에 출력한다.
}
function selDay(oYear, oMon, sDay) {
// 년,월,일 정보를 yyyy.mm.dd 포멧으로 변경한다.
var sTmp = oYear.innerHTML + "-" + oMon.innerHTML + "-" + sDay;
if( sTmp.length == 9 )
sTmp = oYear.innerHTML + "-" + oMon.innerHTML + "-" + "0" + sDay
oObjDate.value = sTmp; // 선택된 일 정보를 해당 일자 필드에 적용한다.
oObjDate.focus();
oPopup.hide(); // 달력을 숨긴다.
}
function dtDataChk( frmDate, chk ) {
var dtObj
if( (dtObj = eval("frm." + frmDate) ) != null ) {
sVal = dtObj.value;
if (sVal.length < 8) {
alert('날짜확인');
window.event.cancelBubble = true;
dtObj.focus();
return false;
}
if (sVal.substr(4, 1) != '-') {
sVal = sVal.substr(0, 4) + '-' + sVal.substr(4, sVal.length)
}
if (sVal.substr(7, 1) != '-') {
sVal = sVal.substr(0, 7) + '-' + sVal.substr(sVal.length - 2, 2)
}
if (sVal.length != 10) {
alert('날짜확인');
window.event.cancelBubble = true;
dtObj.focus();
return false;
}
if( sVal.substr(5, 2) < 1 || sVal.substr(5, 2) > 12 ) {
alert('월 정보를 잘 못 입력하셨습니다.');
window.event.cancelBubble = true;
dtObj.focus();
return false;
}
if( sVal.substr(8, 2) < 1 || sVal.substr(8, 2) > 31 ) {
alert('일 정보를 잘 못 입력하셨습니다.');
window.event.cancelBubble = true;
dtObj.focus();
return false;
}
for (nLoc = 0; nLoc < sVal.length ;nLoc++ ) {
if (sVal.substr(nLoc, 1) == '-') {
if (!((nLoc == 4) || (nLoc == 7))) {
alert("날짜확인");
window.event.cancelBubble = true;
dtObj.focus();
return false;
}
}
}
// day check
var lastDay;
var dayValue = sVal.substr(8, 2);
var monValue = sVal.substr(5, 2);
var yearValue = sVal.substr(0, 4);
// 월별 마지막 날짜를 얻는다.
if( monValue == "02" )
lastDay = getFebLength( yearValue );
else
lastDay = parseInt(monDays[ yearValue - 1 ]);
// 일자가 마지막 날짜를 넘었는지 확인한다.
if( dayValue.length != 2 || new Number(dayValue) > lastDay ) {
//alert("일 정보가 잘 못 되었습니다.");
dtObj.focus();
return false;
}
dtObj.value = sVal;
if( chk != true ) {
var dateObj = eval("frm." + chk);
if( !chkFromTo( dtObj, dateObj ) ) {
//alert("시작일과 종료일이 잘 못 설정되었습니다");
return false;
}
}
return true;
}
return false;
}
function callCalendar(frmDate) {
var dtObj = null;
if( (dtObj = frmDate ) != null ) {
showCalendar(frm, dtObj, document.body, event.x, event.y );
}
}
// 기간인 경우 From - To의 일자가 바뀌는것을 확인한다.
function chkFromTo( date1, date2 ) {
var fDate = date1.value.split("-");
var tDate = date2.value.split("-");
var date11 = fDate[0] + fDate[1] + fDate[2];
var date22 = tDate[0] + tDate[1] + tDate[2];
if( eval(date22 - date11) < 0 ) {
date2.focus();
return false;
}
return true;
}
///////////////////////////////////////////////////////////////////////////////
// 함수명 : SubtractDate(strBaseDate, interval)
// 내 용 : 기준일(strBaseDate)로 부터 n(interval)일 이전의 날짜 추출
// strBaseDate Format : YYYYMMDD
// Return Value Format : YYYYMMDD
function SubtractDate(strBaseDate, interval) {
var year = strBaseDate.substring( 0, 4 );
var month = parseInt(strBaseDate.substring( 4, 6 )) - 1;
var day = strBaseDate.substring( 6, 8 );
var todate = new Date(year,month,day);
var date = new Date();
date.setTime(todate.getTime() - (1000 * 60 * 60 * 24 * interval));
yyyy = date.getFullYear().toString();
mm = (parseInt(date.getMonth()) + 1).toString();
dd = date.getDate().toString();
yyyy = (yyyy.length ==1) ? '0'+yyyy : yyyy;
mm = (mm.length == 1) ? '0'+mm : mm;
dd = (dd.length == 1) ? '0'+dd : dd;
return yyyy+mm+dd;
}
///////////////////////////////////////////////////////////////////////////////
// 함수명 : CheckInterval(strBaseDate, interval)
// 내 용 : strBaseDate가 현재 시점부터 n(interval)일 사이에 존재하는가를 검사
// strBaseDate Format : YYYYMMDD
// Return Value Format : YYYYMMDD
// n일 이내에 있으면 true
// n일을 벗어나 있으면 false
function CheckInterval(strBaseDate, interval) {
var year = parseInt(strBaseDate.substring( 0, 4 ));
var month = parseInt(strBaseDate.substring( 4, 6 )) - 1;
var day = parseInt(strBaseDate.substring( 6, 8 ));
var baseDate = new Date(year,month,day);
var nowDate = new Date();
var days_interval = nowDate.getTime() - baseDate.getTime();
var days = Math.floor(days_interval / (1000 * 60 * 60 * 24));
if (days > interval) {
return false;
} else {
return true;
}
}