system.web.forms.Calendar = ___fnWFCalendar;

// ------------------------------------------------------------------ Calendard
function ___fnWFCalendar(dt) {
	// 成员
	
	
	// 属性
	this.name	= "calendard";
	
	this.dateReceiver		= null;
	this.timeReceiver		= null;
	this.datetimeReceiver	= null;
	this.popupWindow		= null;
	this.left			= 0;
	this.top			= 0;
	this.width			= 308;
	this.height			= 210;
	
	this.date;
	
	// 方法
	//this.popupWindow	= window.createPopup();
	this.popupWindow	= null;
	this.showDatePicker	= ___fnWFCldShowDatePicker;
	
	this.pickDay			= ___fnWFCldPickDate;
	this.pickDate			= ___fnWFCldPickDate;
	
	this.isLeapYear		= ___fnWFCldIsLeapYear;		// 判断是否闰年
	this.getMaxDay		= ___fnWFCldGetMaxDay;		// 获取某月份的最大天
	this.getDay			= ___fnWFCldGetDay;			// 获取某天是星期几
	this.addingDays		= ___fnWECldAddingDays;		
	
	this.validYear		= ___fnWECldValidYear;
	this.validMonth		= ___fnWECldValidMonth;
	
	this.dispose		= ___fnWFCldDispose;
	
	// 内部方法
	this.generateDay	= ___fnWFCldGenerateDay;
	
	
	// 外部事件
	this.daySelectionChanged;
	this.timeSelectionChanged;
	
	// 内部事件
	
	// 初始化实例
	if (dt == null || dt == "") {
		this.date = new Date();
	} else {
		if (typeof(dt) == "string") {
			this.date = new Date(dt.replace(/-/g, "/"));
		} else {
			this.date = dt;
		}
	}
	if (this.date == "NaN") {
		this.date = new Date();
	}
	
	if (system.web.forms.items.exists(this.name)) {
		system.web.forms.items.Remove(this.name);
	}
	system.web.forms.items.Add(this.name, this);
	
	window.event.cancelBubble = true;
}


// ----------------------------------------------------------------------- 方法
function ___fnWFCldShowDatePicker() {
	try {
		var buf = "";
		
		var ifrmDatePicker = document.all("ifrmDatePicker");
		var ifdp;
		if (ifrmDatePicker == null) {
			buf += "<iframe id=\"ifrmDatePicker\" name=\"ifrmDatePicker\" frameborder=\"0\"";
			buf += " 	style=\"position:absolute;width:" + this.width + "px;height:" + this.height + "px;display:none;z-index:9998;\"></iframe>";
			document.body.insertAdjacentHTML("beforeEnd", buf);
			ifrmDatePicker = document.all("ifrmDatePicker");
		}
		ifdp = window.frames("ifrmDatePicker");
		if (ifdp.document.body != null) {
			ifdp.document.body.innerHTML = "";
		}
		
		buf = "";
		
		if (ifdp.document.body == null) {
			buf += "<body style=\"margin:0px\">\r\n";
		}
		buf += "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" onselectstart=\"return false;\""
			+ " style=\"width:" + (this.width - 2) + ";height:" + (this.height - 2) + ";border:1px solid #cccccc;"
			+ "font-size:12px;background-color: #fefefe;cursor:default;"
			+ "filter:progid:DXImageTransform.Microsoft.Shadow(color='#C2C2C2', Direction=135, Strength=2);\">\r\n"
		buf += "	<tr style=\"height:25;font-size:13px;font-weight:bold;background-color:#eeeeee\">\r\n";
		buf += "		<td>\r\n"
		buf += "			<span id=\"prevmonth\" onclick=\"parent.___fnWFCldPW_PrevPage_OnClick();\" title=\"上一月\" style=\"cursor:hand\">&nbsp;&lt;&nbsp;</span>\r\n";
		buf += "		</td>\r\n";
		buf += "		<td colspan=\"3\" align=\"right\">\r\n";
		buf += "			<span id=\"year\" onclick=\"parent.___fnWFCldPW_Year_OnClick();\">" + this.date.getFullYear() + "年</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
		buf += "		</td>\r\n";
		buf += "		<td colspan=\"2\" align=\"left\">\r\n";
		buf += "			<span id=\"month\" onclick=\"parent.___fnWFCldPW_Month_OnClick();\">" + (this.date.getMonth() + 1) + "月</span>\r\n";
		buf += "		</td>\r\n";
		buf += "		<td align=\"right\">\r\n";
		buf += "			<span id=\"nextmonth\" onclick=\"parent.___fnWFCldPW_NextPage_OnClick();\" title=\"下一月\" style=\"cursor:hand\">&nbsp;&gt;&nbsp;</span>\r\n";
		buf += "		</td>\r\n";
		buf += "	</tr>\r\n";
		
		buf += "	<tr style=\"height:20;color:#0066cc;\">\r\n";
		buf += "		<td>&nbsp;星期日</td>\r\n";
		buf += "		<td>星期一</td>\r\n";
		buf += "		<td>星期二</td>\r\n";
		buf += "		<td>星期三</td>\r\n";
		buf += "		<td>星期四</td>\r\n";
		buf += "		<td>星期五</td>\r\n";
		buf += "		<td>星期六</td>\r\n";
		buf += "	</tr>\r\n";
		buf += "	<tr>\r\n";
		buf += "		<td colspan=\"7\" align=\"center\" height=\"1\">\r\n";
		buf += "			<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#cccccc\" height=\"1\" width=\"95%\"><tr><td></td></tr></table>\r\n";
		buf += "		</td>\r\n";
		buf += "	</tr>\r\n";
		
		var cmfd	= this.getDay(this.date.getFullYear(), this.date.getMonth(), 1);	// 本月第一天星期数
		var cmld	= this.getDay(this.date.getFullYear(), this.date.getMonth()
				, this.getMaxDay(this.date.getFullYear(), this.date.getMonth()));		// 本月最后一天星期数
		
		var sdate	= new Date(this.date.getFullYear(), this.date.getMonth(), 1);
		var edate	= new Date(this.date.getFullYear(), this.date.getMonth(), this.getMaxDay(this.date.getFullYear(), this.date.getMonth()));
		
		sdate = this.addingDays(sdate, 0 - cmfd);
		edate = this.addingDays(edate, 6 - cmld);

		for (var i = 0;i < 6;i ++) {	
			buf += "	<tr style=\"height:18;\">\r\n";
			buf += this.generateDay(sdate);
			sdate = this.addingDays(sdate, 1);
			buf += this.generateDay(sdate);
			sdate = this.addingDays(sdate, 1);
			buf += this.generateDay(sdate);
			sdate = this.addingDays(sdate, 1);
			buf += this.generateDay(sdate);
			sdate = this.addingDays(sdate, 1);
			buf += this.generateDay(sdate);
			sdate = this.addingDays(sdate, 1);
			buf += this.generateDay(sdate);
			sdate = this.addingDays(sdate, 1);
			buf += this.generateDay(sdate);
			sdate = this.addingDays(sdate, 1);
			buf += "	</tr>\r\n";
			
			if (sdate.getMonth() > this.date.getMonth()) break;
		}
		
		buf += "	<tr><td height=\"100%\" colspan=\"7\"></td></tr>\r\n";
		
		var now = new Date();
		buf += "	<tr style=\"height:18;\">\r\n";
		buf += "		<td colspan=\"4\">\r\n";
		buf += "			<span id=\"today\" onclick=\"parent.___fnWFCldPW_Today_OnClick();\" style=\"color:#0066cc;cursor:hand;\" onclick=\";\">";
		buf += "				&nbsp;今天：" + now.getFullYear() + "-" + (now.getMonth() + 1) + "-" + now.getDate();
		buf += "			</span>\r\n";
		buf += "		</td>\r\n";
		buf += "		<td colspan=\"2\"></td>\r\n";
		buf += "		<td align=\"center\" style=\"color:#0066cc;cursor:hand;\">\r\n";
		buf += "			<span id=\"close\" onclick=\"parent.___fnWFCldPW_Close_OnClick();\" style=\"color:#0066cc;cursor:hand;\" onclick=\";\">关闭</span>\r\n";
		buf += "		</td>\r\n";
		buf += "	</tr>\r\n";
		buf += "</table>\r\n";
		if (ifdp.document.body == null) {
			buf += "</body>\r\n";
		}
		
		ifdp.document.write(buf);
		ifdp.document.body.style.margin = 0;
		ifdp.document.close();
		ifrmDatePicker.style.left = this.left;
		ifrmDatePicker.style.top = this.top;
		ifrmDatePicker.style.display = "block";
		
		this.popupWindow = ifdp;
	} catch (e) {
		e.description += " - ___fnWFCldShowDatePicker()";
		throw e;
	}	
}


function ___fnWFCldPickDate(rec, posref) {
	try {
		this.dateReceiver = rec;
		var pr = posref;
		
		if (pr == null) {
			pr = rec;
		}
		
		var left	= pr.offsetLeft;
		var top		= pr.offsetTop;
		var height	= pr.clientHeight;
		
		do {
			pr 		= pr.offsetParent
			top		+= pr.offsetTop;
			left	+= pr.offsetLeft;
		} while (pr.tagName.toUpperCase() != "BODY")

		this.left	= left;
		this.top	= top + height + 3;

		// 缺是否超出IE判断与调整!!!
		
		this.showDatePicker();
	} catch (e) {
		alert(e.description);
	}
}


function ___fnWFCldIsLeapYear(year) {
	try {
		if (0 == year % 4 && ((year % 100 != 0) || (year % 400 == 0))) 
			return true;
		else 
			return false;
	} catch (e) {
		e.description += " - ___fnWFCldIsLeapYear()";
		throw e;
	}
}


function ___fnWFCldGetMaxDay(year, month) {
	var dc = 31;
	if (month == null) {
		this.isLeapYear(year) ? dc = 366 : dc = 365;
	} else {
		if (month == 1) {
			this.isLeapYear(year) ? dc = 29 : dc = 28;
		} else {
			if (month < 6)
				month % 2 == 0 ? dc = 31 : dc = 30;
			else
				if (month == 6) 
					dc = 31;
				else
					month % 2 == 1 ? dc = 31 : dc = 30;
		}
	}
	
	return dc;
}


function ___fnWFCldGetDay(year, month, day) {
	return (new Date(year, month, day)).getDay() % 7;
}


function ___fnWECldAddingDays(dt, days) {
	if (days == 0) return dt;
	
	var ds = days;
	if (days > 0) {
		while (ds != 0) {
			if (dt.getDate() < this.getMaxDay(dt.getFullYear(), dt.getMonth())) {
				dt.setDate(dt.getDate() + 1);
			} else {
				dt.setDate(1);
				if (dt.getMonth() < 11) {
					dt.setMonth(dt.getMonth() + 1);
				} else {
					dt.setMonth(0);
					dt.setFullYear(dt.getFullYear() + 1);
				}
			}
			ds --;	
		}
	} else {
		ds = Math.abs(ds);
		while (ds != 0) {
			if (dt.getDate() != 1) {
				dt.setDate(dt.getDate() - 1);
			} else {
				if (dt.getMonth() != 0) {
					dt.setMonth(dt.getMonth() - 1);
				} else {
					dt.setMonth(11);
					dt.setFullYear(dt.getFullYear() - 1);
				}
				dt.setDate(this.getMaxDay(dt.getFullYear(), dt.getMonth()));
			}
			ds --;	
		}
	}
	
	return dt;
}


function ___fnWECldValidYear(year) {
	if (isNaN(year)) return false;
	if (year < 1900) return false;
	return true;
}

function ___fnWECldValidMonth() {
	if (isNaN(year)) return false;
	return true;
}

function ___fnWFCldDispose() {
	//system.web.forms.items.Remove("calendard");
}


// ------------------------------------------------------------------- 内部事件
function ___fnWFCldPW_PrevPage_OnClick() {
	var cld = system.web.forms.items("calendard");
	if (cld.date.getMonth() != 0) {
		cld.date.setMonth(cld.date.getMonth() - 1);
	} else {
		cld.date.setFullYear(cld.date.getFullYear() - 1);
		cld.date.setMonth(11);
	}
	cld.showDatePicker();
}


function ___fnWFCldPW_NextPage_OnClick() {
	var cld = system.web.forms.items("calendard");
	if (cld.date.getMonth() != 11) {
		cld.date.setMonth(cld.date.getMonth() + 1);
	} else {
		cld.date.setFullYear(cld.date.getFullYear() + 1);
		cld.date.setMonth(0);
	}
	cld.showDatePicker();
}


function ___fnWFCldPW_Year_OnClick() {
	try {
		var cld = system.web.forms.items("calendard");
		var year = cld.popupWindow.document.all("year");
		var buf = "";
		
		buf += "<input type=\"text\" name=\"txtYear\" id=\"txtYear\" value=\"" 
			+ cld.date.getFullYear() + "\" size=\"2\"" 
			+ " onkeypress=\"parent.___fnWFCldPW_TxtYear_OnKeyPress();\""
			+ " onblur=\"parent.___fnWFCldPW_TxtYear_OnBlur();\" />";
		
		year.outerHTML = buf;
		cld.popupWindow.document.all("txtYear").focus();
	} catch (e) {
		alert(e.description);
	}
}


function ___fnWFCldPW_Month_OnClick() {
	try {
		var cld = system.web.forms.items("calendard");
		var month = cld.popupWindow.document.all("month");
		var buf = "";
	
		buf += "<select id=\"sltMonth\" onchange=\"parent.___fnWFCldPW_SltMonth_OnChange();\" onblur=\"parent.___fnWFCldPW_SltMonth_OnBlur();\">";
		for (var i = 0;i < 12;i ++) {
			if (i == cld.date.getMonth()) {
				buf += "<option value=\"" + i + "\" selected=\"true\">" + (i + 1) + "&nbsp;月</option>";
			} else {
				buf += "<option value=\"" + i + "\">" + (i + 1) + "&nbsp;月</option>";
			}
		}
		buf += "</select>";
		
		month.outerHTML = buf;
		cld.popupWindow.document.all("sltMonth").focus();
	} catch (e) {
		alert(e.description);
	}
}

function ___fnWFCldPW_TxtYear_OnKeyPress() {
	var cld = system.web.forms.items("calendard");
	var kc = cld.popupWindow.event.keyCode;
	if (kc == 13) {
		var year = cld.popupWindow.document.all("txtYear");
		if (cld.validYear(year.value)) {
			cld.date.setYear(year.value);
			cld.showDatePicker();
		} else {
			year.hadCancel = "true";
			alert("请输入合法年份!");
		}
	}
}

function ___fnWFCldPW_TxtYear_OnBlur() {
	try {
		var cld = system.web.forms.items("calendard");
		var year = cld.popupWindow.document.all("txtYear");
		
		if (year.hadCancel != "true") {
			if (cld.validYear(year.value)) {
				cld.date.setYear(year.value);
				cld.showDatePicker();
			} else {
				alert("请输入合法年份!");
			}
		}
	} catch (e) {
		alert(e.description);
	}
}


function ___fnWFCldPW_SltMonth_OnChange() {
	try {
		var cld = system.web.forms.items("calendard");
		cld.date.setMonth(cld.popupWindow.document.all("sltMonth").value);
		cld.showDatePicker();
	} catch (e) {
		alert(e.description);
	}
}


function ___fnWFCldPW_SltMonth_OnBlur() {
	try {
		var cld = system.web.forms.items("calendard");
		var month = cld.popupWindow.document.all("sltMonth");
		cld.date.setMonth(month.value);
		cld.showDatePicker();
	} catch (e) {
		alert(e.description);
	}
}


function ___fnWFCldPW_Today_OnClick() {
	try {
		var cld = system.web.forms.items("calendard");
		cld.date = new Date();
		//cld.showDatePicker();
		cld.dateReceiver.value = cld.date.getFullYear() + "-" + (cld.date.getMonth() + 1) + "-" + cld.date.getDate();
		___fnWFCldPW_Close();
	} catch (e) {
		alert(e.description);
	}
}


function ___fnWFCldPW_Close_OnClick() {
	try {
		if (document.all("ifrmDatePicker") != null) {
			if (window.event != null) {
				var cld = system.web.forms.items("calendard");
				
				if (event.srcElement != cld.dateReceiver) {
					___fnWFCldPW_Close();
				}
			} else {
				___fnWFCldPW_Close();
			}
		}
	} catch (e) {
		alert(e.description);
	}
}


function ___fnWFCldPW_Close() {
	try {
		document.all("ifrmDatePicker").style.display = "none";
	} catch (e) {
		throw new Error(e + "___fnWFCldPW_Close");
	}
}


function ___fnWFCldPW_Day_OnClick(y, m, d) {
	var cld = system.web.forms.items("calendard");
	if (cld.dateReceiver != null) {
		cld.dateReceiver.value = y + "-" + m + "-" + d;
	}
	___fnWFCldPW_Close();
}


// ------------------------------------------------------------------- 内部方法
function ___fnWFCldGenerateDay(dt) {
	var cld = system.web.forms.items("calendard");
	
	var now = new Date();
	
	var buf		= "";
	var style	= "height:16;width:20;cursor:hand;margin-bottom:2;"
			+ "padding-right:2px;padding-left:2px;"
			+ "padding-bottom:-1px;padding-top:1px;"
			+ "border:1px;";
	
	if (dt.getFullYear() == now.getFullYear() 
			&& dt.getMonth() == now.getMonth()
			&& dt.getDate() == now.getDate()) {			// 今天
		style += "border:1px solid #9999cc;background: #cedbff;";
	} else {
		if (dt.getMonth() != cld.date.getMonth()) {		// 非日历中当月
			style += "color:#aaaaaa;";
		}
	}
	
	buf += "		<td align=\"center\">\r\n";
	buf += "			<span id=\"day\" onclick=\"parent.___fnWFCldPW_Day_OnClick(";
	buf += dt.getFullYear() + "," + (dt.getMonth() + 1) + "," + dt.getDate() + ");\"";
	buf += " style=\"" + style + "\""
		+ " year=\"" + dt.getFullYear() + "\""
		+ " month=\"" + dt.getMonth() + "\""
		+ " day=\"" + dt.getDate() + "\">"
		+ dt.getDate() 
		+ "</span>\r\n";
	buf += "		</td>\r\n";
	
	return buf;
}


// ============================================================================
document.onclick = ___fnWFCldPW_Close_OnClick;