/*
	日历类。
	第一个参数是一个参数数组。
	数组元素有：
	--------------------------
		DOM对像：
			Container
				包含“日历”的DOM对像。
	--------------------------
		样式：
			CalendarTable-Class
				日历整个Table的样式。
			PreviousMonthArrow-Class
				“上一月”的双箭头样式。
			YearLabel-Class
				“年份”字体样式。
			YearSelect-Class
				“年份”下拉框样式。
			MonthLabel-Class
				“月份”字体样式。
			MonthSelect-Class
				“月份”下拉框样式。
			NextMonthArrow-Class
				“下一月”双箭头样式。
			WeekendTd-Class
				“周末星期”样式。
			DayOfWeekTd-Class
				“非周末星期”样式。
	---------------------------
		函数句柄：
			CustomDay-Event	
				定制每一个具体日期单元格。
					参数说明：
						td				单元格DOM对像
						days			这个单元格内显示的日期数字，空格为&nbsp;
						c					当前单元格是星期几列
						r         当前单元格在第几行
						rowCount	日历在当前月一共有几行。
						year			当前年值。
						month			当前月值。
*/
	function Calendar(parameters){
		//成员变量。
		this._parameters=parameters;
		this._columnIndices=new Array(0,2,3,4,5,6,7,1);
		this._dayCountOfMonthArray=new Array(0,31,28,31,30,31,30,31,31,30,31,30,31);
		this._today=new Date();
		this._year=null;//年选择下拉框。
		this._month=null;//月选择下拉框。
		this._calendarTable=document.createElement("TABLE");//日历Table。
		this._operatorTbody=document.createElement("TBODY");//控制面板Tbody。		
		this._dayOfWeekTbody=document.createElement("TBODY");//星期几标题Tbody。
		this._daysTbody=document.createElement("TBODY");//日期Tbody。
		this.initOperator();//初始化各个Tbody面板。
		this.initDayOfWeek();//初始化星期几标题Tbody面板。
		this.initTable();//初始化Table。
		this.freshDaysTbody();
	}
	/*
		初始化Table。
	*/
	Calendar.prototype.initTable=function(){
		this._calendarTable.align="center";
		this._calendarTable.cellSpacing=0;
		this._calendarTable.cellPadding=0;
		this._calendarTable.border=0;
		this._calendarTable.className=this._parameters["CalendarTable-Class"];
		this._parameters["Container"].appendChild(this._calendarTable);//在页面上显示。
	}
	/*
		初始化选择条件Tbody面板。
	*/
	Calendar.prototype.initOperator=function(){
		var operatorTr=document.createElement("TR");
		//上一个月。
		var previousMonthTd=document.createElement("TD");
		previousMonthTd.align="left";
		previousMonthTd.vAlign="middle";
		previousMonthTd.className=this._parameters["PreviousMonthArrowTd-Class"];
		var previousMonthA=document.createElement("A");
		previousMonthA.innerHTML="&lt;&lt;";
		previousMonthA.myLord=this;
		previousMonthA.className=this._parameters["PreviousMonthArrow-Class"];
		previousMonthA.href="#";
		previousMonthA.onclick=this.leftArrowOnClick;		
		previousMonthTd.appendChild(previousMonthA);
		operatorTr.appendChild(previousMonthTd);
		//选择。
		var selectTd=document.createElement("TD");
		selectTd.colSpan=5;
		selectTd.align="center";
		selectTd.vAlign="middle";
		selectTd.className=this._parameters["SelectTd-Class"];
		//年签。
		var yearLabel=document.createElement("LABEL");
		yearLabel.innerHTML="年份：";
		yearLabel.className=this._parameters["YearLabel-Class"];
		selectTd.appendChild(yearLabel);
		//年下拉框。
		var yearSelect=document.createElement("SELECT");
		for(var i=1975;i<=2075;i++)
		{
			var yearOption=document.createElement("OPTION");
			yearOption.innerHTML=i;
			yearOption.value=i;
			yearSelect.appendChild(yearOption);
		}
		yearSelect.className=this._parameters["YearSelect-Class"];
		yearSelect.value=this._today.getYear();
		selectTd.appendChild(yearSelect);
		this._year=yearSelect;
		this._year.myLord=this;
		this._year.onchange=function(event2){
			var e=event||event2;
			var target=e.srcElement||e.target;
			target.myLord.freshDaysTbody()
		};
		//空格。
		var whiteLabel=document.createElement("LABEL");
		whiteLabel.innerHTML="&nbsp;";
		selectTd.appendChild(whiteLabel);
		//月签。
		var monthLabel=document.createElement("LABEL");
		monthLabel.innerHTML="月份：";
		monthLabel.className=this._parameters["MonthLabel-Class"];
		selectTd.appendChild(monthLabel);
		//月下拉框。
		var monthSelect=document.createElement("SELECT");
		for(var i=1;i<=12;i++)
		{
			var monthOption=document.createElement("OPTION");
			monthOption.innerHTML=i;
			monthOption.value=i;
			monthSelect.appendChild(monthOption);
		}		
		monthSelect.className=this._parameters["MonthSelect-Class"];
		monthSelect.value=this._today.getMonth()+1;
		selectTd.appendChild(monthSelect);
		this._month=monthSelect;
		this._month.myLord=this;
		this._month.onchange=function(event2){
			var e=event||event2;
			var target=e.srcElement||e.target;
			target.myLord.freshDaysTbody()
		};
		operatorTr.appendChild(selectTd);
		//下一个月。
		var nextMonthTd=document.createElement("TD");
		nextMonthTd.align="right";
		nextMonthTd.vAlign="middle";
		nextMonthTd.className=this._parameters["NextMonthArrowTd-Class"];
		var nextMonthA=document.createElement("A");
		nextMonthA.innerHTML="&gt;&gt;";
		nextMonthA.myLord=this;
		nextMonthA.className=this._parameters["NextMonthArrow-Class"];
		nextMonthA.href="#";
		nextMonthA.onclick=this.rightArrowOnClick;		
		nextMonthTd.appendChild(nextMonthA);
		operatorTr.appendChild(nextMonthTd);
		//安装到Tbody和Table。
		this._operatorTbody.appendChild(operatorTr);
		this._calendarTable.appendChild(this._operatorTbody);
	}
	/*
		初始化星期几标题Tbody面板。
	*/
	Calendar.prototype.initDayOfWeek=function(){
		var dayOfWeekTr=document.createElement("TR");
		dayOfWeekTr.className=this._parameters["DayOfWeekTr-Class"];
		for(var i=1;i<=7;i++)
		{
			var dayOfWeekTd=document.createElement("TD");
			dayOfWeekTd.align="center";
			dayOfWeekTd.vAlign="middle";
			switch(i)
			{
				case 1:
					dayOfWeekTd.className=this._parameters["WeekendTd-Class"];
					dayOfWeekTd.innerHTML="日";
					break;
				case 2:
					dayOfWeekTd.className=this._parameters["DayOfWeekTd-Class"];
					dayOfWeekTd.innerHTML="一";
					break;
				case 3:
					dayOfWeekTd.className=this._parameters["DayOfWeekTd-Class"];
					dayOfWeekTd.innerHTML="二";
					break;
				case 4:
					dayOfWeekTd.className=this._parameters["DayOfWeekTd-Class"];
					dayOfWeekTd.innerHTML="三";
					break;
				case 5:
					dayOfWeekTd.className=this._parameters["DayOfWeekTd-Class"];
					dayOfWeekTd.innerHTML="四";
					break;
				case 6:
					dayOfWeekTd.className=this._parameters["DayOfWeekTd-Class"];
					dayOfWeekTd.innerHTML="五";
					break;
				case 7:
					dayOfWeekTd.className=this._parameters["WeekendTd-Class"];
					dayOfWeekTd.innerHTML="六";
					break;
			}
			dayOfWeekTr.appendChild(dayOfWeekTd);
		}
		this._dayOfWeekTbody.appendChild(dayOfWeekTr);
		this._calendarTable.appendChild(this._dayOfWeekTbody);
	}
	/*
		刷新当前月日历。
	*/
	Calendar.prototype.freshDaysTbody=function(){
		this.clearDaysTbody();
		this.printDaysTbody();
	}
	/*
		清空所有的日期。
	*/
	Calendar.prototype.clearDaysTbody=function(){
		var trs=this._daysTbody.getElementsByTagName("TR");
		for(var i=trs.length-1;i>=0;i--)
			trs[i].parentNode.removeChild(trs[i]);
	}
	/*
		打印当前月日历。
	*/
	Calendar.prototype.printDaysTbody=function(){
		try
		{
			if(this._year==null||this._month==null)
				throw "年份与月份不能为空！";
			var dayCount=null;
			if(this._month.value==2)
				dayCount=(this._year.value%400==0||(this._year.value%4==0&&this._year.value%100!=0))?28:29;
			else
	      dayCount=this._dayCountOfMonthArray[this._month.value];
			var firstDayOfMonth=new Date(this._year.value,this._month.value-1,1);
			var zeroX=this._columnIndices[firstDayOfMonth.getDay()];
			var rowCount=Math.ceil((dayCount+zeroX-1)/7);
			var days=0;
			for(var r=1;r<=rowCount;r++)
			{
				var tr=document.createElement("TR");
				for(var c=1;c<=7;c++)
				{
					var td=document.createElement("TD");
					td.align="center";
					td.vAlign="middle";
					if((r==1&&c<zeroX)||(++days>dayCount))
					{
						if(this._parameters["CustomDay-Event"]!=null)
							this._parameters["CustomDay-Event"](td,"&nbsp;",c-1==0?7:c-1,r,rowCount,this._year.value,this._month.value);
						else
							td.innerHTML="&nbsp;";
					}
					else
					{
						if(this._parameters["CustomDay-Event"]!=null)
							this._parameters["CustomDay-Event"](td,days,c-1==0?7:c-1,r,rowCount,this._year.value,this._month.value);
						else
							td.innerHTML=days;
					}
					tr.appendChild(td);
				}
				this._daysTbody.appendChild(tr);
			}
			this._calendarTable.appendChild(this._daysTbody);
		}
		catch(e)
		{
			alert("Error:"+e);
		}
	}
	/*
		上一个月箭头单击事件。
	*/
	Calendar.prototype.leftArrowOnClick=function(event2){
		var e=event||event2;
		var target=e.srcElement||e.target;
		target.myLord._month.value=parseInt(target.myLord._month.value)-1;
		if(target.myLord._month.value=="")
		{
			target.myLord._month.value=12;
			target.myLord._year.value=parseInt(target.myLord._year.value)-1;
		}
		target.myLord.freshDaysTbody();
		target.blur();
		return false;
	}
	/*
		下一个月箭头单击事件。
	*/
	Calendar.prototype.rightArrowOnClick=function(event2){
		var e=event||event2;
		var target=e.srcElement||e.target;
		target.myLord._month.value=parseInt(target.myLord._month.value)+1;
		if(target.myLord._month.value=="")
		{
			target.myLord._month.value=1;
			target.myLord._year.value=parseInt(target.myLord._year.value)+1;
		}
		target.myLord.freshDaysTbody();
		target.blur();
		return false;
	}