var Class = {
	create: function() {
		return function() {
			this.initialize.apply(this, arguments);
		}
	}
}
var sshCalendar = Class.create();
sshCalendar.prototype = {
	str_wday: ['ÀÏ','¿ù','È­','¼ö','¸ñ','±Ý','Åä'],
	now_date: new Date(),
	limit_st: null,
	limit_ed: null,
	defaultYear: null,
	defaultMonth: null,

	initialize: function(txtObj, calBtn) {
		var this_s = this;
		if (!txtObj) { alert("ERROR initialize()"); }
		else if (txtObj.nodeType!=1) { txtObj = document.getElementById(txtObj); }
		if (!txtObj) { alert("ERROR initialize()"); }
		this.txtObj = txtObj;
		var ifrmId = "sshCalIframe" + Math.floor(Math.random() * 1000000);
		var calFrame = document.createElement("iframe");
		this.calFrame = calFrame;
		with (calFrame) {
			id = ifrmId; frameBorder = "0"; /* IE */
		}
		with (calFrame.style) {
			width = "200px"; height = "180px"; position = "absolute"; zIndex = "1000"; border = "1px solid #939393";
		}
		txtObj.parentNode.insertBefore(calFrame,txtObj);

		var ifrmDoc = calFrame.contentWindow.document;
		ifrmDoc.open("text/html","replace");
		ifrmDoc.writeln("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">");
		ifrmDoc.writeln("<html>");
		ifrmDoc.writeln("<head>");
		ifrmDoc.writeln("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=euc-kr\" />");
		ifrmDoc.writeln("<title>sshCalendar</title>");
		ifrmDoc.writeln("<style>");

		// css
		var ifrmDocStyle = "";
		ifrmDocStyle += "*{margin:0; font-size:12px; }";
		ifrmDocStyle += "body{background:#F9F9F9; overflow:hidden;}";
		ifrmDocStyle += ".sshCalendarMenu {color:black; text-align:center; font-size:12px; padding:3px 0 1px 0}";
		ifrmDocStyle += "table{border:0; width:100%;}";
		ifrmDocStyle += "th{font-weight:normal; background:#618BB3; color:white; font-family:µ¸¿ò,dotum;}";
		ifrmDocStyle += "th,td{padding:3px;}";
		ifrmDocStyle += "td{background:#EFEFEF; text-align:center; cursor:pointer; font-family:arial;}";
		ifrmDocStyle += "td.sun{background:#F9EBE8; color:red;}";
		ifrmDocStyle += "td.day{background:#E3E3E3; color:black;}";
		ifrmDocStyle += "td.sat{background:#E9E9F8; color:blue;}";
		ifrmDocStyle += "td.theday{background:#FF8040; color:white;}";
		ifrmDocStyle += "td.today{background:#302497; color:white;}";
		ifrmDocStyle += "td.other{background:#EFEFEF; color:#C0C0C0;}";
		ifrmDocStyle += "td.disable{background:#EFEFEF; color:#C0C0C0; text-decoration:line-through; cursor:not-allowed;}";
		ifrmDocStyle += "td.over{background:black; color:white;}";
		ifrmDoc.writeln(ifrmDocStyle);

		ifrmDoc.writeln("</style>");
		ifrmDoc.writeln("</head>");
		ifrmDoc.writeln("<body onselectstart=\"return false\" ondragstart=\"return false\" onMouseDrag=\"false\" oncontextmenu=\"return false\">");
		ifrmDoc.writeln("</body>");
		ifrmDoc.writeln("</html>");
		ifrmDoc.close();
		this.ifrmDoc = ifrmDoc;
		this.make_menu();
		this.cal_date();
		this.remake_calendar(this.value_date["Y"], this.value_date["m"]);
		this.hide();
		calBtn.onclick = function () {
			this_s.toggle();
		}
	},
	make_menu: function() {
		var this_s = this;
		var calLayer = this.ifrmDoc.createElement("DIV");
		this.calLayer = calLayer;
		this.ifrmDoc.body.appendChild(calLayer);

		var calMenu = this.ifrmDoc.createElement("DIV");
		calMenu.className = "sshCalendarMenu";
		this.calMenu = calMenu;

		var calYear = this.ifrmDoc.createElement("select");
		var zCnt = 0;
		for (var z=1900; z<=2040; z++) {
			calYear.options[zCnt] = new Option(z,z);
			zCnt++;
		}
		calYear.onchange = function() {
			this_s.remake_calendar(parseInt(this.value), this_s.calMonth.value);
		}
		this.calYear = calYear;

		var calYearStr = this.ifrmDoc.createElement("span");
		calYearStr.innerHTML = "³â &nbsp;";

		var calMonth = this.ifrmDoc.createElement("select");
		var zCnt = 0;
		for (var z=1; z<=12; z++) {
			calMonth.options[zCnt] = new Option(z,z);
			zCnt++;
		}
		calMonth.onchange = function() {
			this_s.remake_calendar(this_s.calYear.value, this.value);
		}
		this.calMonth = calMonth;

		var calMonthStr = this.ifrmDoc.createElement("span");
		calMonthStr.innerHTML = "¿ù ";

		// ¿À´Ã ³¯Â¥·Î
		var now_date = this.now_date;
		var currYear = now_date.getFullYear();
		var currMonth = now_date.getMonth() + 1;
		var btnToday = this.ifrmDoc.createElement("input");
		with (btnToday) { type = "button"; width = "20"; height = "20"; value = "T"; title = "¿À´Ã ³¯Â¥·Î"; }
		with (btnToday.style) { border = "1px solid #000"; padding = "0"; margin = "1px"; cursor = "pointer"; }
		btnToday.onclick = function() {
			this_s.remake_calendar(currYear, currMonth);
		}
		this.btnToday = btnToday;

		// Áö¿ì±â
		var btnDel = this.ifrmDoc.createElement("input");
		with (btnDel) { type = "button"; width = "20"; height = "20"; value = "D"; title = "»èÁ¦"; }
		with (btnDel.style) { border = "1px solid #000"; padding = "0"; margin = "1px"; cursor = "pointer"; }
		btnDel.onclick = function() {
			this_s.txtObj.value = "";
		}
		this.btnDel = btnDel;

		// ´Ý±â
		var btnClose = this.ifrmDoc.createElement("input");
		with (btnClose) { type = "button"; width = "20"; height = "20"; value = "X"; title = "´Ý±â"; }
		with (btnClose.style) { border = "1px solid #000"; padding = "0"; margin = "1px"; cursor = "pointer"; }
		btnClose.onclick = function() {
			this_s.hide();
		}
		this.btnClose = btnClose;

		calMenu.appendChild(calYear);
		calMenu.appendChild(calYearStr);
		calMenu.appendChild(calMonth);
		calMenu.appendChild(calMonthStr);
		calMenu.appendChild(btnToday);
		calMenu.appendChild(btnDel);
		calMenu.appendChild(btnClose);
		calLayer.appendChild(calMenu);

		var calBody = this.ifrmDoc.createElement("DIV");
		calLayer.appendChild(calBody);
		this.calBody = calBody;
	},
	remake_menu: function(target) {
		var this_s = this;
		this.calMenu.innerHTML = '';
		var calYear = this.ifrmDoc.createElement("select");
		var zCnt = 0;

		var yearLimitStart = 1900;
		var yearLimitEnd = 2040;
		if (this.limit_st) {
			var stArr = this.limit_st.split("-");
			yearLimitStart = parseInt(stArr[0]);
		}
		if (this.limit_ed) {
			var edArr = this.limit_ed.split("-");
			yearLimitEnd = parseInt(edArr[0]);
		}
		for (var z=yearLimitStart; z<=yearLimitEnd; z++) {
			calYear.options[zCnt] = new Option(z,z);
			zCnt++;
		}
		calYear.onchange = function() {
			this_s.remake_calendar(parseInt(this.value), this_s.calMonth.value, 'Y');
		}
		this.calYear = calYear;

		var calYearStr = this.ifrmDoc.createElement("span");
		calYearStr.innerHTML = "³â &nbsp;";

		var calMonth = this.ifrmDoc.createElement("select");
		var zCnt = 0;
		for (var z=1; z<=12; z++) {
			calMonth.options[zCnt] = new Option(z,z);
			zCnt++;
		}
		calMonth.onchange = function() {
			this_s.remake_calendar(this_s.calYear.value, this.value, 'M');
		}
		this.calMonth = calMonth;

		var calMonthStr = this.ifrmDoc.createElement("span");
		calMonthStr.innerHTML = "¿ù ";

		// ¿À´Ã ³¯Â¥·Î
		var now_date = this.now_date;
		var currYear = now_date.getFullYear();
		var currMonth = now_date.getMonth() + 1;
		var btnToday = this.ifrmDoc.createElement("input");
		with (btnToday) { type = "button"; width = "20"; height = "20"; value = "T"; title = "¿À´Ã ³¯Â¥·Î"; }
		with (btnToday.style) { border = "1px solid #000"; padding = "0"; margin = "1px"; cursor = "pointer"; }
		btnToday.onclick = function() {
			this_s.remake_calendar(currYear, currMonth);
		}
		this.btnToday = btnToday;

		// Áö¿ì±â
		var btnDel = this.ifrmDoc.createElement("input");
		with (btnDel) { type = "button"; width = "20"; height = "20"; value = "D"; title = "»èÁ¦"; }
		with (btnDel.style) { border = "1px solid #000"; padding = "0"; margin = "1px"; cursor = "pointer"; }
		btnDel.onclick = function() {
			this_s.txtObj.value = "";
		}
		this.btnDel = btnDel;

		// ´Ý±â
		var btnClose = this.ifrmDoc.createElement("input");
		with (btnClose) { type = "button"; width = "20"; height = "20"; value = "X"; title = "´Ý±â"; }
		with (btnClose.style) { border = "1px solid #000"; padding = "0"; margin = "1px"; cursor = "pointer"; }
		btnClose.onclick = function() {
			this_s.hide();
		}
		this.btnClose = btnClose;

		this.calMenu.appendChild(calYear);
		this.calMenu.appendChild(calYearStr);
		this.calMenu.appendChild(calMonth);
		this.calMenu.appendChild(calMonthStr);
		this.calMenu.appendChild(btnToday);
		this.calMenu.appendChild(btnDel);
		this.calMenu.appendChild(btnClose);

		if (target == 'Y') calYear.focus();
		if (target == 'M') calMonth.focus();
	},
	cal_date: function() {
		var arr = null;
		var isb = true;
		if (this.txtObj.value.indexOf('-') != -1) arr = this.txtObj.value.split('-');
		else if (this.txtObj.value.indexOf('/') != -1) arr = this.txtObj.value.split('/');
		else if (this.txtObj.value.indexOf(' ') != -1) arr = this.txtObj.value.split(' ');
		else if (this.txtObj.value.indexOf(',') != -1) arr = this.txtObj.value.split(',');
		else if (this.txtObj.value.indexOf('.') != -1) arr = this.txtObj.value.split('.');

		if (arr && arr.length == 3) {
			arr[2] = arr[2].substr(0, 2);
		} else if (this.txtObj.value.length == 6) {
			var t = this.txtObj.value.substr(0, 2);
			t = (t < 50) ? "20" + t : "19" + t;
			arr = [t, this.txtObj.value.substr(2, 2), this.txtObj.value.substr(4, 2)];
		} else if (this.txtObj.value.length == 8) {
			arr = [this.txtObj.value.substr(0, 4), this.txtObj.value.substr(4, 2), this.txtObj.value.substr(6, 2)];
		} else {
			var date_now = new Date();

			var nowY = date_now.getFullYear();
			var nowM = date_now.getMonth() + 1;
			var defaultY = this.defaultYear;
			var defaultM = this.defaultMonth;

			if (defaultY != null && defaultM != null) {
				var theYear = defaultY;
				var theMonth = defaultM;
				var theDay = 1;
			} else if (defaultY != null && defaultM == null) {
				var theYear = defaultY;
				var theMonth = 1;
				var theDay = 1;
			} else if (defaultY == null && defaultM != null) {
				var theYear = nowY;
				var theMonth = defaultM;
				var theDay = 1;
			} else {
				var theYear = nowY;
				var theMonth = nowM;
				var theDay = date_now.getDate();
			}
			arr = [theYear, theMonth, theDay];

			date_now = null;
			isb = false;
		}
		arr[0] = parseInt(arr[0], 10);
		arr[1] = parseInt(arr[1], 10);
		arr[2] = parseInt(arr[2], 10);

		var date_temp = new Date(arr[0], (arr[1] - 1), arr[2], 0, 0, 0);
		if (isb)	var todate = this.date_todate(date_temp);
		else var todate = null;
		this.value_date = {
			"Y" : date_temp.getFullYear(),
			"y" : date_temp.getFullYear().toString().substr(2, 2),
			"m" : (date_temp.getMonth() + 1),
			"d" : date_temp.getDate(),
			"U" : date_temp.getTime(),
			"w" : date_temp.getDay(),
			"date" : todate
		};
	},
	remake_calendar: function(y, m, v) {
		if (this.limit_st || this.limit_ed) this.remake_menu(v);

		var this_s = this;
		var arr = ["0", "0", "0"];
		this.destroy();
		var value_date_date = this.value_date["date"];
		var t = new Date();
		var now_date_date = this.date_todate(t);
		t = null;
		var t = new Date(y, (m - 1), 1);
		var st_date_U = t.getTime() - (t.getDay() * 86400000);
		y = t.getFullYear();
		m = t.getMonth() + 1;
		t = null;
		var t = new Date(y, m, 1);
		var ed_date_U = t.getTime();
		t = null;
		this.calYear.value = y;
		this.calMonth.value = m;
		var ta = this.ifrmDoc.createElement("table");
		var tr0 = ta.insertRow(-1);
		tr0.className = "tr0";
		for (var i=0; i<7; i++) {
			var th = this.ifrmDoc.createElement("th");
			th.innerHTML = this.str_wday[i];
			tr0.appendChild(th);
		}
		var this_date = new Date(st_date_U);
		var tr_t = null;
		var ilimit = 60;
		var fn_select = function() {
			this_s.event_select_date(this);
		}
		while (st_date_U < ed_date_U && ilimit > 0) {
			tr_t = ta.insertRow(-1);
			for (var i=0; i<7; i++) {
				var td = tr_t.insertCell(i);
				if (i==0) td.className = "sun";
				else if (i==6) td.className = "sat";
				else td.className = "day";

				td.title = this.date_todate(this_date);
				td.innerHTML = this_date.getDate();

				//=== ³¯Â¥ Á¦ÇÑ
				var validDate = false;
				if (this.limit_st == null && this.limit_ed == null) validDate = true;
				else if (this.limit_st == null && td.title <= this.limit_ed) validDate = true;
				else if (this.limit_ed == null && td.title >= this.limit_st) validDate = true;
				else if (td.title >= this.limit_st && td.title <= this.limit_ed) validDate = true;
				else validDate = false;

				if ((this_date.getMonth() + 1) != m) {
					td.className = "other";
				} else {
					if (value_date_date == td.title) {
						td.className = "theday";
					} else if (now_date_date == td.title) {
						td.className = "today";
					}
				}
				if (validDate) {
					td.onclick = fn_select;
					td.onmouseover = function() {
						this.className += " over";
					}
					td.onmouseout = function() {
						this.className = this.className.replace(" over","");
					}
				} else {
					td.className = "disable";
				}

				ilimit--;
				st_date_U += 86400000;
				this_date.setTime(st_date_U);
			}
		}
		this.calBody.appendChild(ta);
		//this.onmouseevent(ta);
		this.calFrame.style.width = parseInt(this.calLayer.offsetWidth) + "px";
		this.calFrame.style.height = parseInt(this.calLayer.offsetHeight) + "px";
	},
	date_todate: function(date) {
		var arr = ["0", "0", "0"];
		arr[0] = date.getFullYear().toString();
		arr[1] = (date.getMonth() < 9) ? "0" + (date.getMonth() + 1).toString() : (date.getMonth() + 1).toString();
		arr[2] = (date.getDate() < 10) ? "0" + date.getDate().toString() : date.getDate().toString();
		return arr.join('-');
	},
	event_select_date: function(td) {
		if (td.title) {
			this.txtObj.value = td.title;
			this.hide();
			if (this.txtObj.onchange != null) { this.txtObj.onchange(); }
		}
	},
	toggle: function() {
		if (this.calFrame.style.display == "none") {
			this.show();
		} else {
			this.hide();
		}
		return this.calFrame;
	},
	show: function() {
		this.calFrame.style.display = "";
		this.cal_date();
		this.remake_calendar(this.value_date["Y"], this.value_date["m"]);
		this.calFrame.style.top = parseInt(this.getRealOffsetTop(this.txtObj)) + parseInt(this.txtObj.offsetHeight) + "px";
		this.calFrame.style.left = parseInt(this.getRealOffsetLeft(this.txtObj)) + "px";
		return this.calFrame;
	},
	hide: function() {
		this.calFrame.style.display = "none";
	},
	destroy: function() {
		this.calBody.innerHTML = "";
	},
	getRealOffsetTop: function (o) {
		return o ? o.offsetTop + this.getRealOffsetTop(o.offsetParent) : 0;
	},
	getRealOffsetLeft: function (o) {
		return o ? o.offsetLeft + this.getRealOffsetLeft(o.offsetParent) : 0;
	},
	set_limit: function(st,ed){	//´Þ·ÂÀÇ ¼±ÅÃ¹üÀ§ ¼³Á¤
		if (st != null) {
			this.limit_st = st;
		}
		if (ed != null) {
			this.limit_ed = ed;
		}
	},
	set_default: function(y,m){	//´Þ·ÂÀÇ ±âº» ³âµµ/¿ù ¼±ÅÃ
		this.defaultYear = y;
		this.defaultMonth = m;
	},
	unset_limit: function(){	//´Þ·ÂÀÇ ¼±ÅÃ¹üÀ§ ¼³Á¤ ÇØÁ¦
		this.limit_st = null;
		this.limit_ed = null;
	}
}

function calInit(className, imgSrc)
{
	var rows = document.getElementsByTagName('input');
	for (var i=0; i<rows.length; i++) {
		var obj = rows[i];
		if (obj.type != "text") continue;
		if (obj.calInitExec == true) continue;
		var elementClassName = obj.className;
		if (elementClassName.length == 0) continue;
		if (elementClassName != className && !elementClassName.match(new RegExp("(^|\\s)" + className + "(\\s|$)"))) continue;
		if (obj.maxLength > 255) obj.maxLength = 10;

		if (imgSrc) {
			var cBtn = document.createElement("img");
			cBtn.src = imgSrc;
			cBtn.align = "absmiddle";
			with (cBtn.style) { cursor = "pointer"; }
		} else {
			var cBtn = document.createElement("input");
			cBtn.value = "´Þ·Â";
			cBtn.type = "button";
			with (cBtn.style) {
				borderColor = "#b0b0b0";
				backgroundColor = "#3d3d3d";
				color = "#ffffff";
				height = "21px";
				fontFamily = "dotum";
				fontSize = "12px";
				cursor = "pointer";
			}
		}

		cBtn.txtObj = obj;
		cBtn.onmouseover = function() {
			var calObjLoaded = !!(this.txtObj.calObjLoaded);
			if (!calObjLoaded) {
				this.txtObj.calObj = new sshCalendar(this.txtObj, this);
				this.txtObj.calObjLoaded = true;
			}
			var onloadFunction = !!(this.txtObj.onloadFunction && typeof(this.txtObj.onloadFunction) == "function");
			var onloadFunctionExec = !!(onloadFunction && this.txtObj.onloadFunctionExec);
			if (onloadFunction && !onloadFunctionExec) {
				this.txtObj.onloadFunction();
				this.txtObj.onloadFunctionExec = true;
			}
		}
		if (obj.nextSibling) {
			obj.parentNode.insertBefore(cBtn, obj.nextSibling);
		} else {
			obj.parentNode.appendChild(cBtn);
		}
		obj.calInitExec = true;
	}
}

function loadCalendar() {
	calInit("calDate", "http://www.inforang.com/icon/calendar.gif");
}
if (window.addEventListener) {
	window.addEventListener('load', loadCalendar, false);
} else if (window.attachEvent) {
	window.attachEvent('onload', loadCalendar);
}

if (window.removeEventListener) {
	window.removeEventListener('unload', loadCalendar, false);
} else if (window.detachEvent) {
	try {
		window.detachEvent('onunload', loadCalendar);
	} catch (e) {}
}
