var cal_current_text = null, cal_current_div = null;

if (document.getElementById) {
	document.write("<link rel=\"stylesheet\" type=\"text/css\" href=\"../css/calendar.css\">");
}

function cal_Show(objText) {
	cal_Destroy();

	var objDiv, strContents, objIFrame;

	cal_current_text = objText;

	objDiv = document.createElement("div");
	objDiv._text_object = objText;
	objDiv.className = "calendar";

	objDiv.innerHTML = cal_Generate_Date(objText.value);

	cal_current_div = objText.parentNode.insertBefore(objDiv, objText);

	objIFrame = document.createElement("iframe");
	objIFrame.className = "calendar";

	objText.parentNode.insertBefore(objIFrame, objText);

	cal_Move();

	cal_AttachEvent(window, "resize", cal_Move);

	cal_AttachEvent(document, "click", cal_Destroy);
	cal_AttachEvent(cal_current_div, "click", cal_CancelEvent);
	cal_AttachEvent(cal_current_text, "click", cal_CancelEvent);
	cal_AttachEvent(cal_current_text, "keydown", cal_TextKeyPress);
}

function cal_TextKeyPress(evt) {
	if (window.event) {
		k = evt.keyCode;
	}
	else if (evt.which) {
		k = evt.which;
	}

	if (k == 9) {
		cal_Destroy(evt);
		cal_CancelEvent(evt);
	}
}

function cal_CancelEvent(evt) {
	if (evt.stopPropagation)
		evt.stopPropagation();
	else if (document.all)
		evt.cancelBubble = true;
}

function cal_Move(evt) {
	var aryIFrame = cal_current_div.parentNode.getElementsByTagName("iframe")
	cal_current_div.style.top = (position_from_parent(cal_current_text, "offsetTop") + cal_current_text.offsetHeight) + "px";
	cal_current_div.style.left = position_from_parent(cal_current_text, "offsetLeft") + "px";

/*	if (parseInt(cal_current_div.style.top) + cal_current_div.offsetHeight > document.body.offsetHeight)
		cal_current_div.style.top = (position_from_parent(cal_current_text, "offsetTop") - cal_current_div.offsetHeight) + "px";
*/
	for (var i = 0; i < aryIFrame.length; ++i) {
		if (aryIFrame[i].className == "calendar") {
			aryIFrame[i].style.top = cal_current_div.style.top;
			aryIFrame[i].style.left = cal_current_div.style.left;
			aryIFrame[i].style.height = cal_current_div.offsetHeight;
			aryIFrame[i].style.width = cal_current_div.offsetWidth;
		}
	}
}

function cal_AttachEvent(elm, evt, f) {
	if (elm.addEventListener)
		elm.addEventListener(evt, f, false);
	else if (elm.attachEvent)
		elm.attachEvent("on" + evt, f);
	else
		eval("elm.on" + evt + " = f;");
}

function cal_DetachEvent(elm, evt, f) {
	if (elm.removeEventListener)
		elm.removeEventListener(evt, f, false);
	else if (elm.detachEvent)
		elm.detachEvent("on" + evt, f);
	else
		eval("elm.on" + evt + " = f;");
}


function DaysInMonth(intMonth, intYear) {
	switch(intMonth) {
		case 4:
		case 6:
		case 9:
		case 11:
			return 30;
			break;
		case 2:
			if (intYear % 400 == 0 || (intYear % 100 != 0 && intYear % 4 == 0))
				return 29;
			else
				return 28;
			break;
		default:
			return 31;
	}
}

function MonthName(intMonth) {
	var ary = new Array("", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");
	return ary[intMonth];
}

function WeekdayMonthStartsOn(intMonth, intYear) {
	var dt = new Date();

	dt.setFullYear(intYear, intMonth - 1, 1);
	return dt.getDay();
}
function cal_Generate_Date(strDate) {
	var today = new Date(), re, str, intSlash1, intSlash2;

	intMonth = today.getMonth() + 1;
	intYear = today.getFullYear();
	intDay = today.getDate();

	re = /^((1[0-2])|(0?[1-9]))\/[0-3]?[0-9]\/[0-9]{1,4}/;

	str = strDate.match(re);
	if (str) {
		str = str[0];
		intSlash1 = str.indexOf("/");
		intSlash2 = str.indexOf("/", intSlash1 + 1);
		intMonth = parseInt(str.substring(0, intSlash1), 10);
		intDay = parseInt(str.substring(intSlash1 + 1, intSlash2), 10);
		intYear = parseInt(str.substring(intSlash2 + 1, str.length), 10);
		if (intYear < 100)
			intYear += 2000;
	}

	return cal_Generate(intMonth, intYear);
}
function cal_Generate(intMonth, intYear) {
	var str, today = new Date();

	intDayOfWeek = WeekdayMonthStartsOn(intMonth, intYear)
	intDaysInMonth = DaysInMonth(intMonth, intYear);

	str = ""
		+ "<table width=\"100%\">"
		+ "<tr>"
		+	"<td align=\"center\">"

	intMonthTemp = intMonth - 1;
	intYearTemp = intYear;

	if (intMonthTemp == 0) {
		intMonthTemp = 12;
		intYearTemp--;
	}

	if (intYearTemp * 100 + intMonthTemp >= 190001)
		str += "<a href=\"#\" style=\"text-decoration: none;\" onclick=\"cal_current_div.innerHTML=cal_Generate(" + intMonthTemp + ", " + intYearTemp + ");return false;\">" + MonthName(intMonthTemp).substring(0, 3) + "</a>"
//		str += "<a href=\"#\" style=\"text-decoration: none;\" onclick=\"cal_current_div.innerHTML=cal_Generate(" + intMonthTemp + ", " + intYearTemp + ");return false;\">&lt;&lt;</a>"

	str += ""
		+	"</td>"
		+	"<td align=\"center\" class=\"pageheader\">" + MonthName(intMonth) + "&nbsp;" + intYear + "</td>"
		+	"<td align=\"center\">";

	intMonthTemp = intMonth + 1;
	intYearTemp = intYear;

	if (intMonthTemp == 13) {
		intMonthTemp = 1;
		intYearTemp++;
	}
	if (intYearTemp * 100 + intMonthTemp <= 210012)
		str += "<a href=\"#\" style=\"text-decoration: none;\" onclick=\"cal_current_div.innerHTML=cal_Generate(" + intMonthTemp + ", " + intYearTemp + ");return false;\">" + MonthName(intMonthTemp).substring(0, 3) + "</a>"
//		str += "<a href=\"#\" style=\"text-decoration: none;\" onclick=\"cal_current_div.innerHTML=cal_Generate(" + intMonthTemp + ", " + intYearTemp + ");return false;\">&gt;&gt;</a>"

	str += ""
		+	"</td>"
		+ "</tr>"
		+ "</table>"
		+ "<table width=\"100%\">"
		+ "<tr class=\"section\">"
		+ 	"<td align=\"center\" class=\"section\">S</td>"
		+ 	"<td align=\"center\" class=\"section\">M</td>"
		+ 	"<td align=\"center\" class=\"section\">T</td>"
		+ 	"<td align=\"center\" class=\"section\">W</td>"
		+ 	"<td align=\"center\" class=\"section\">T</td>"
		+ 	"<td align=\"center\" class=\"section\">F</td>"
		+ 	"<td align=\"center\" class=\"section\">S</td>"
		+ "</tr>";
	if (intDayOfWeek != 0) {
		str += "<tr>";
		for (i = 0; i < intDayOfWeek; ++i)
			str += "<td class=\"smallheader calendar_empty\">&nbsp;</td>";
	}
	intWeeks = 0;
	intWeekday = intDayOfWeek + 1;
	for (intDay = 1; intDay <= intDaysInMonth; ++intDay) {
		if (intWeekday == 0)
			str += "<tr>";
		str += "<td class=\"smallheader calendar_day\" onclick=\"return cal_SetDate(" + intYear + ", " + intMonth + ", " + intDay + ");\">" + intDay + "</td>";
		if (intWeekday == 7) {
			intWeeks++;
			str += "</tr>";
			intWeekday = 0;
		}
		intWeekday = intWeekday + 1
	}
	if (intWeekday != 1) {
		for (; intWeekday <= 7; intWeekday++)
			str += "<td class=\"smallheader calendar_empty\">&nbsp;</td>";
		intWeeks++;
		str += "</tr>"
	}
	for (; intWeeks < 6; ++intWeeks) {
		str += "<tr>";
		for (intWeekday = 0; intWeekday < 7; ++intWeekday)
			str += "<td class=\"smallheader calendar_empty\">&nbsp;</td>";
		str += "</tr>";
	}

	str += ""
		+ "</table>";

	return str;
}
function cal_SetDate(intYear, intMonth, intDate) {
	cal_current_text.value = intMonth + "/" + intDate + "/" + intYear;
	cal_Destroy();
	return false;
}

function cal_Destroy(evt) {
	if (cal_current_div) {
		cal_DetachEvent(cal_current_text, "keydown", cal_TextKeyPress);
		cal_DetachEvent(cal_current_text, "click", cal_CancelEvent);
		cal_DetachEvent(cal_current_div, "click", cal_Destroy);
		cal_DetachEvent(document, "click", cal_Destroy);
		cal_DetachEvent(window, "resize", cal_Move);

		cal_element_Destroy("iframe");
		cal_element_Destroy("div");
	}

	cal_current_div = null;
	cal_current_text = null;

	return false;
}

function cal_element_Destroy(elm_type) {
	if (cal_current_text) {
		var aryElm = cal_current_text.parentNode.getElementsByTagName(elm_type);

		for (var i = 0; i < aryElm.length; ++i)
			if (aryElm[i].className == "calendar")
				cal_current_text.parentNode.removeChild(aryElm[i]);
	}
}

function position_from_parent(obj, str_attribute) {
	var parent_position = 0;
	while(obj) {
		parent_position += obj[str_attribute];
		obj = obj.offsetParent;
	}
	return parent_position;
}

