목차

커스텀 일자 달력 가이드

이 화면은 사용자 정의 달력을 개발하기 위한 샘플화면이다.

예시

템플릿 위치: /HTML5/UTIL/CALENDAR/calendar_tableview_cell

템플릿 파일

화면 스크립트

var CALENDAR_UTIL = {
	objSelectDay: null,						 // 현재 선택된 날짜 버튼
	nSelectDay: "01",						   // 현재 선택된 일

	arrSaturDayForeColor: [0, 142, 185],		// 토요일 전경색
	arrHolidayDayForeColor: [206, 0, 0],		// 일요일, 공유일의 전경색
	arrWorkDayForeColor: [120, 120, 120],   	// 토요일, 일요일, 공휴일을 제외한 날짜의 전경색
	arrInvalidDayForeColor: [195, 195, 195],    // 현재달이 아닌 날짜의 전경색
	arrSelectDayForeColor: [255, 255, 255],	 // 선택일 전경색
	arrSelectDayBackColor: [96, 154, 185],	  // 선택일 배경색
	bShowOnlyThisMonth: false,				  // 선택월 날짜만 보여줄지 여부
	strFontName: "맑은 고딕",

	// 요일에 따라 스타일 적용
	setDayStyle: function(objBtnDay, strYYYYMMDD, nDayOfWeek) {
		var objUserData;

		if (nDayOfWeek === undefined) {
			objUserData = objBtnDay.getuserdata();
			nDayOfWeek = objUserData.nDayOfWeek;
		}

		switch (nDayOfWeek) {
			case 0: this.setHolidayDayStyle(objBtnDay); break;
			case 6: this.setSaturDayStyle(objBtnDay); break;
			default: this.setWorkDayStyle(objBtnDay); break;
		}

		if (strYYYYMMDD !== undefined) {
			objBtnDay.setuserdata({ strMonthType: "THIS_MONTH", strYYYYMMDD: strYYYYMMDD, nDayOfWeek: nDayOfWeek });
		}
	},

	// 토요일 스타일 적용
	setSaturDayStyle: function(objBtnDay) {
		objBtnDay.setforecolor(this.arrSaturDayForeColor[0], this.arrSaturDayForeColor[1], this.arrSaturDayForeColor[2]);
		objBtnDay.setbackcolor(255,255,255);
		objBtnDay.setfont(this.strFontName, 8, false, false, false);
		objBtnDay.settooltiptext("");
		objBtnDay.setvisible(true);
		objBtnDay.setenable(true);
	},

	// 일요일/휴일 스타일 적용
	setHolidayDayStyle: function(objBtnDay, strTooltip) {
		objBtnDay.setforecolor(this.arrHolidayDayForeColor[0], this.arrHolidayDayForeColor[1], this.arrHolidayDayForeColor[2]);
		objBtnDay.setbackcolor(255,255,255);
		objBtnDay.setfont(this.strFontName, 8, false, false, false);
		if (strTooltip === undefined) { objBtnDay.settooltiptext(""); }
		else { objBtnDay.settooltiptext(strTooltip); }
		objBtnDay.setvisible(true);
		objBtnDay.setenable(true);
	},

	// 주중 스타일 적용
	setWorkDayStyle: function(objBtnDay) {
		objBtnDay.setforecolor(this.arrWorkDayForeColor[0], this.arrWorkDayForeColor[1], this.arrWorkDayForeColor[2]);
		objBtnDay.setbackcolor(255,255,255);
		objBtnDay.setfont(this.strFontName, 8, false, false, false);
		objBtnDay.settooltiptext("");
		objBtnDay.setvisible(true);
		objBtnDay.setenable(true);
	},

	// 이전달/다음달 스타일 적용
	setInvalidDayStyle: function(objBtnDay, strYYYYMMDD, strMonthType) {
		objBtnDay.setforecolor(this.arrInvalidDayForeColor[0], this.arrInvalidDayForeColor[1], this.arrInvalidDayForeColor[2]);
		objBtnDay.setbackcolor(255,255,255);
		objBtnDay.setfont(this.strFontName, 8, false, false, false);
		objBtnDay.settooltiptext("");
		objBtnDay.setvisible(true);
		objBtnDay.setenable(true);

		objBtnDay.setuserdata({ strMonthType: strMonthType, strYYYYMMDD: strYYYYMMDD });
	},

	// 선택한 날짜 스타일 적용
	setSelectDayStyle: function(objBtnDay, strYYYYMMDD, nDayOfWeek) {
		// 현재 선택되어 있는 일자에 대한 칼라를 원상태로 복귀
		if (this.objSelectDay) { this.setDayStyle(this.objSelectDay); }

		objBtnDay.setforecolor(this.arrSelectDayForeColor[0], this.arrSelectDayForeColor[1], this.arrSelectDayForeColor[2]);
		objBtnDay.setbackcolor(this.arrSelectDayBackColor[0], this.arrSelectDayBackColor[1], this.arrSelectDayBackColor[2]);
		objBtnDay.setfont(this.strFontName, 8, true, false, true);
		objBtnDay.settooltiptext("선택일");
		objBtnDay.setvisible(true);
		objBtnDay.setenable(true);

		if (strYYYYMMDD !== undefined) {
			objBtnDay.setuserdata({ strMonthType: "THIS_MONTH", strYYYYMMDD: strYYYYMMDD, nDayOfWeek: nDayOfWeek });
		}

		this.objSelectDay = objBtnDay;
	}
};

// 달력 날짜 표시
function showCalendarButton(nYear, nMonth, nDay)
{
	var i, j, strBtnIndex, objBtnDay, nTempDay, nDayOfWeekTemp;
	var strCurrYYYYMMDD, strCurrYYYYMM, strPrevYYYYMMDD, strPrevYYYYMM, strNextYYYYMMDD, strNextYYYYMM;

	nYear = parseInt(nYear, 10);
	nMonth = parseInt(nMonth, 10);

	// 년도 콤보 및 월 콤보에 값 설정
	this.fldYear.settext(nYear.toString(10));
	this.fldMonth.settext(nMonth.toString(10));

	strCurrYYYYMMDD = strSelectDate = factory.fillstring(this.fldYear.gettext(), "0", 4, true) +
		factory.fillstring(this.fldMonth.gettext(), "0", 2, true) + "01";
	strCurrYYYYMM = strCurrYYYYMMDD.substring(0, 6);

    // 달력 표시 년월의 마지막 일을 구함(28/29/30/31)
    nCurrLastDay = parseInt(factory.datelastdayofmonth(strCurrYYYYMMDD).substring(6), 10);

	// 달력 표시 년월의 한달전/한달후 날짜 오브젝트를 구함
	strPrevYYYYMMDD = factory.datefrom("month", -1, strCurrYYYYMMDD);
	strPrevYYYYMM = strPrevYYYYMMDD.substring(0, 6);
	strNextYYYYMMDD = factory.datefrom("month", 1, strCurrYYYYMMDD)
	strNextYYYYMM = strNextYYYYMMDD.substring(0, 6);

    // 달력 표시 년월의 이전달 마지막 일을 구함(28/29/30/31)
    nPrevLastDay = parseInt(factory.datelastdayofmonth(strPrevYYYYMMDD).substring(6), 10);

    nDayOfWeek = new Date(nYear, nMonth - 1, 1).getDay();

	// 이전월 날짜 표시
    for (i = 0; i < nDayOfWeek; i++) {
		// 버튼 인덱스를 기준으로 버튼 오브젝트를 구함
		strBtnIndex = factory.fillstring(i, "0", 2, true);
		objBtnDay = screen.getinstancebyname("btnDay" + strBtnIndex);

		nTempDay = (nPrevLastDay - nDayOfWeek) + (i + 1);

		if (CALENDAR_UTIL.bShowOnlyThisMonth) { objBtnDay.settext(""); }
		else { objBtnDay.settext(nTempDay); }

		// 이전월 또는 다음월의 날짜 버튼에 대한
		CALENDAR_UTIL.setInvalidDayStyle(objBtnDay, strPrevYYYYMM + factory.fillstring(nTempDay, "0", 2, true), "PREV_MONTH");
    }

	nTempDay = 1;
	for (i = nDayOfWeek; i < 42; i++) {
		// 버튼 인덱스를 기준으로 버튼 오브젝트를 구함
		strBtnIndex = factory.fillstring(i, "0", 2, true);
		objBtnDay = screen.getinstancebyname("btnDay" + strBtnIndex);

        // 선택한 달 정보
        if (nTempDay <= nCurrLastDay) {
			nDayOfWeekTemp = i % 7;
			objBtnDay.settext(nTempDay);

			// 버튼 텍스트가 현재 날짜와 동일한 경우, 폰트 설정
			if (nDay == nTempDay) {
				CALENDAR_UTIL.setSelectDayStyle(objBtnDay, strCurrYYYYMM +  + factory.fillstring(nTempDay, "0", 2, true), nDayOfWeekTemp);
			}
			else {
				CALENDAR_UTIL.setDayStyle(objBtnDay, strCurrYYYYMM +  + factory.fillstring(nTempDay, "0", 2, true), nDayOfWeekTemp);
			}
		}
        // 다음달 날짜 표시 정보 생성
        else {
			if (CALENDAR_UTIL.bShowOnlyThisMonth) { objBtnDay.settext(""); }
			else { objBtnDay.settext(nTempDay - nCurrLastDay); }

			CALENDAR_UTIL.setInvalidDayStyle(objBtnDay, strNextYYYYMM + factory.fillstring((nTempDay - nCurrLastDay), "0", 2, true), "NEXT_MONTH");
		}

		nTempDay++;
	}

	return;
}

function btnShowCalendar_on_mouseup(objInst)
{
	this.updateCalendar();
}

function updateCalendar()
{
	var nYear, nMonth;

	// 변경된 콤보 박스의 년도 및 월을 구함
	nYear = parseInt(this.fldYear.gettext(), 10);
	nMonth = parseInt(this.fldMonth.gettext(), 10);

	this.showCalendarButton(nYear, nMonth, CALENDAR_UTIL.nSelectDay);
}

// 년도 및 월 이전, 이후 버튼 클릭 이벤트 처리
function handleYearMonthPrevNextButton(isYear, isNext)
{
	var nYear, nMonth;

	// 변경된 콤보 박스의 년도 및 월을 구함
	nYear = parseInt(this.fldYear.gettext(), 10);
	nMonth = parseInt(this.fldMonth.gettext(), 10);

	if (isYear) {
		if (isNext) { nYear = nYear + 1; }
		else { nYear = nYear - 1; }
	}
	else {
		if (isNext) {
			nMonth = nMonth + 1;
			if (nMonth > 12) {
				nMonth = 1;
				nYear += 1;
			}
		}
		else {
			nMonth = nMonth - 1;
			if (nMonth < 1) {
				nMonth = 12;
				nYear -= 1;
			}
		}
	}

	this.fldYear.settext(nYear);
	this.fldMonth.settext(nMonth);

	this.showCalendarButton(nYear, nMonth, CALENDAR_UTIL.nSelectDay);
}

/**
 * Event 처리 함수 시작
 */
function screen_on_load()
{
	var i, strCurrYYYYMMDD, nCurrentYear, nCurrentMonth, nCurrentDay;

	strCurrYYYYMMDD = factory.datetoday();

	// 변경된 콤보 박스의 년도 및 월을 구함
	nCurrentYear = parseInt(strCurrYYYYMMDD.substring(0, 4), 10);
	nCurrentMonth = parseInt(strCurrYYYYMMDD.substring(4, 6), 10);
	nCurrentDay = parseInt(strCurrYYYYMMDD.substring(6), 10);

	// 달력 표시
	this.showCalendarButton(nCurrentYear, nCurrentMonth, nCurrentDay);
}

// 다음달 버튼 클릭
function btnMonthNext_on_mouseup()
{
	this.handleYearMonthPrevNextButton(false, true);
}

// 이전달 버튼 클릭
function btnMonthBefore_on_mouseup()
{
	this.handleYearMonthPrevNextButton(false, false);
}

// 다음년도 버튼 클릭
function btnYearNext_on_mouseup()
{
	this.handleYearMonthPrevNextButton(true, true);
}

// 이전년도 버튼 클릭
function btnYearBefore_on_mouseup()
{
	this.handleYearMonthPrevNextButton(true, false);
}

// 날짜 버튼 클릭 이벤트
function btnDay_on_mouseup(objInst)
{
	var strSelectDate, strDay, objUserData;

	// 클릭된 버튼의 일자 및 정보를 구함
	strDay = objInst.gettext();
	if (strDay == "") { return; }

	objUserData = objInst.getuserdata();

	CALENDAR_UTIL.nSelectDay = strDay;

	// 이전달이거나, 다음달인 경우
	if (objUserData) {
		if (objUserData.strMonthType == "NEXT_MONTH") {
			this.btnMonthNext_on_mouseup();
			return;
		}
		else if (objUserData.strMonthType == "PREV_MONTH") {
			this.btnMonthBefore_on_mouseup();
			return;
		}
	}

	factory.consoleprint("strSelectDate = [" + objUserData.strYYYYMMDD + "]");

	CALENDAR_UTIL.setSelectDayStyle(objInst);
}