var firstday = null;
var daysInMonth = null;
var cal = new Calendar();
// 图片路径 可以在具体调用的页面里重新赋值
var images_path = "images/calendar/";
var iLength = 0;

function Calendar()
{
	var today = new Date();
	this.year = (document.layers||today.getYear()<100) ? today.getYear() + 1900 : today.getYear();
	// netscape's year is from 1900;
	this.month = today.getMonth() + 1;
	this.day = today.getDate();
	this.hour = today.getHours();
	this.minute = today.getMinutes();
	this.second = today.getSeconds();
	
	this.callbackOnChange = null;
	this.encoding = "gb2312";
	this.abbrev = 1;
	
	this.setDate = calendarSetDate;
	this.getDaysInMonth = calendarGetDaysInMonth;
	this.getFirstDayInMonth = calendarGetFirstDayInMonth;
	this.display = calendarDisplay;
	this.displayHeader = calendarDisplayHeader;
	this.displayBody = calendarDisplayBody;
	this.displayCell = calendarDisplayCell;
	this.displayTime = calendarDisplayTime;
}

function calendarSetDate()
{
	var today = new Date();
	var argc = calendarSetDate.arguments;
	iLength = argc.length;

	if ( argc.length == 1 )
	{
		today.setSeconds(0);
		today.setMinutes(0);
		today.setHours(0);
		today.setDate(1);
		today.setMonth(0);
		today.setYear(argc[0]);
	}
	else if ( argc.length == 2 )
	{
		today.setSeconds(0);
		today.setMinutes(0);
		today.setHours(0);
		today.setDate(1);
		today.setMonth(argc[1]-1);
		today.setYear(argc[0]);
	}
	else if ( argc.length == 3 )
	{
		today.setSeconds(0);
		today.setMinutes(0);
		today.setHours(0);
		today.setDate(argc[2]);
		today.setMonth(argc[1]-1);
		today.setYear(argc[0]);
	}
	else if ( argc.length == 4 )
	{
		today.setSeconds(0);
		today.setMinutes(0);
		today.setHours(argc[3]);
		today.setDate(argc[2]);
		today.setMonth(argc[1]-1);
		today.setYear(argc[0]);
	}
	else if ( argc.length == 5 )
	{
		today.setSeconds(0);
		today.setMinutes(argc[4]);
		today.setHours(argc[3]);
		today.setDate(argc[2]);
		today.setMonth(argc[1]-1);
		today.setYear(argc[0]);
	}
	else if ( argc.length == 6 )
	{
		today.setSeconds(argc[5]);
		today.setMinutes(argc[4]);
		today.setHours(argc[3]);
		today.setDate(argc[2]);
		today.setMonth(argc[1]-1);
		today.setYear(argc[0]);
	}


	this.year = (document.layers||today.getYear()<100) ? today.getYear() + 1900 : today.getYear();
	this.month = today.getMonth() + 1;
	this.day = today.getDate();
	this.hour = today.getHours();
	this.minute = today.getMinutes();
	this.second = today.getSeconds();
}

function calendarGetFirstDayInMonth(year, month)
{
	var d = new Date();
	d.setDate(1);
	d.setMonth(month - 1);
	d.setYear(year);
	return d.getDay();
}

function calendarGetDaysInMonth(year, month)
{
	var year2 = year;
	var month2 = month + 1;
	if ( month2 > 12 )
	{
		year2 = year + 1;
		month2 = 1;
	}
	
	var msec = Date.UTC(year2, month2 - 1, 1) - Date.UTC(year, month - 1, 1);
	return Math.floor(msec / 1000 / 60 / 60 / 24);
}

function calendarDisplay()
{
	var html = ""
	+"<table width=\"100%\" border=\"0\" cellspacing=\"1\" cellpadding=\"0\" bgcolor=\"#31309C\" align=\"center\">\n<tr>\n<td bgcolor=\"#FFFFFF\">"
	+ this.displayHeader()
	+ "<div id=\"calendar_body\" callback=\"" + this.callbackOnChange + "\" encoding=\"" + this.encoding + "\" abbrev=\"" + this.abbrev + "\">"
	+ this.displayBody()
	+ "</div>"
	+ "</td>\n</tr>\n</table>"
	+ "";
	return html;
}

function calendarDisplayHeader()  // you can set more encodings for more languages
{
	var vecMonthName = new Array();
	if ( this.encoding == "gb2312" || this.encoding == "GBK" )
	{
		vecMonthName[0] = "01";
		vecMonthName[1] = "02";
		vecMonthName[2] = "03";
		vecMonthName[3] = "04";
		vecMonthName[4] = "05";
		vecMonthName[5] = "06";
		vecMonthName[6] = "07";
		vecMonthName[7] = "08";
		vecMonthName[8] = "09";
		vecMonthName[9] = "10";
		vecMonthName[10] = "11";
		vecMonthName[11] = "12";
	}
	else
	{
		vecMonthName[0] = (this.abbrev == 1) ? "Jan" : "January";
		vecMonthName[1] = (this.abbrev == 1) ? "Feb" : "Febrary";
		vecMonthName[2] = (this.abbrev == 1) ? "Mar" : "March";
		vecMonthName[3] = (this.abbrev == 1) ? "Apr" : "April";
		vecMonthName[4] = (this.abbrev == 1) ? "May" : "May";
		vecMonthName[5] = (this.abbrev == 1) ? "Jun" : "June";
		vecMonthName[6] = (this.abbrev == 1) ? "Jul" : "July";
		vecMonthName[7] = (this.abbrev == 1) ? "Aug" : "August";
		vecMonthName[8] = (this.abbrev == 1) ? "Sep" : "September";
		vecMonthName[9] = (this.abbrev == 1) ? "Oct" : "October";
		vecMonthName[10] = (this.abbrev == 1) ? "Nov" : "November";
		vecMonthName[11] = (this.abbrev == 1) ? "Dec" : "December";
	}
 
	var html = "";
	
	html += "<table width=\"100%\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n";
	html += "<form name=\"calendar\" onsubmit=\"calendarOnChangeMonth(); return false;\">\n";
	html += "<tr bgcolor=\"#31309C\">\n";
	html += "<td width=\"100\" align=\"left\" nowrap>\n";
if(document.all)
{
	html += "<input type=\"image\" border=\"0\" name=\"btn_prev_year\" src=\""+images_path+"arrow_r.gif\" onclick=\"calendarOnPrevYear(); return false;\">\n";
	html += "<input type=\"text\" class=\"white\" name=\"txt_year\" value=\"" + this.year + "\" size=\"4\" maxlength=\"4\" onchange=\"calendarOnEditYear();\">\n";
	html += "<input type=\"image\" border=\"0\" name=\"btn_next_year\" src=\""+images_path+"arrow_l.gif\" onclick=\"calendarOnNextYear(); return false;\">\n";
}
else if (document.layers)
{
	html += "<a href=\"#\" onclick=\"calendarOnPrevYear(); return false;\"><img src=\""+images_path+"arrow_r.gif\" width=\"13\" height=\"13\" border=\"0\"></a>\n";
	html += "<input type=\"text\" class=\"white\" name=\"txt_year\" value=\"" + this.year + "\" size=\"4\" maxlength=\"4\" onchange=\"calendarOnEditYear();\">\n";
	html += "<a href=\"#\" onclick=\"calendarOnNextYear(); return false;\"><img src=\""+images_path+"arrow_l.gif\" width=\"13\" height=\"13\" border=\"0\"></a>\n";
}
	html += "</td>\n";
	html += "<td width=\"110\" align=\"left\">\n";
	html += "<select class=\"list\" name=\"sel_month\" onchange=\"calendarOnChangeMonth();\">\n";
	for (i=0; i<12; i++)
	{
		html += "<option value=\"" + (i+1) + "\" " + ( (this.month == i+1) ? "selected" : "" ) + ">" + vecMonthName[i] + "</option>\n";
	}
	html += "</select>\n";
	html += "</td>\n";
	html += "<td width=\"20\" align=\"center\" nowrap>\n";
	html += "<a href=\"javascript:lostFocus()\"><img src=\""+images_path+"minimize.gif\" width=\"15\" height=\"15\" border=\"0\"></a>\n";
	html += "</td>\n";
	html += "<td width=\"20\" align=\"center\" nowrap>\n";
	html += "<a href=\"javascript:clearValue()\"><img src=\""+images_path+"close.gif\" width=\"15\" height=\"15\" border=\"0\"></a>\n";
	html += "</td>\n";
	html += "</tr>\n";
	html += "<tr>\n";
if(iLength>3)
{
	html += "<td height=\"25\" colspan=\"4\" bgcolor=\"#BAC4DC\" align=\"right\">\n" + this.displayTime() + "</td>\n";
}
else
{
	html += "<td onclick=\"lostFocus()\" height=\"25\" colspan=\"4\" bgcolor=\"#BAC4DC\" align=\"center\">\n点击选择日期\n</td>\n";
}
	html += "</tr>\n";
	html += "</form>\n";
	html += "</table>\n";

	return html;
}

function calendarDisplayBody()
{
	var vecDayName = new Array();
	if ( this.encoding == "gb2312" || this.encoding == "GBK" )
	{
	    vecDayName[0] = (this.abbrev == 1) ? "日" : "星期日";
	    vecDayName[1] = (this.abbrev == 1) ? "一" : "星期一";
	    vecDayName[2] = (this.abbrev == 1) ? "二" : "星期二";
	    vecDayName[3] = (this.abbrev == 1) ? "三" : "星期三";
	    vecDayName[4] = (this.abbrev == 1) ? "四" : "星期四";
	    vecDayName[5] = (this.abbrev == 1) ? "五" : "星期五";
	    vecDayName[6] = (this.abbrev == 1) ? "六" : "星期六";
	}
	else
	{
		vecDayName[0] = (this.abbrev == 1) ? "Sun" : "Sunday";
		vecDayName[1] = (this.abbrev == 1) ? "Mon" : "Monday";
		vecDayName[2] = (this.abbrev == 1) ? "Tue" : "Tuesday";
		vecDayName[3] = (this.abbrev == 1) ? "Wed" : "Wednesday";
		vecDayName[4] = (this.abbrev == 1) ? "Thu" : "Thursday";
		vecDayName[5] = (this.abbrev == 1) ? "Fri" : "Friday";
		vecDayName[6] = (this.abbrev == 1) ? "Sat" : "Saturday";
	}
  
	firstday = this.getFirstDayInMonth(this.year, this.month);
	daysInMonth = this.getDaysInMonth(this.year, this.month); 
	var weeks = Math.floor((firstday+daysInMonth)/7);		//mender by hoejohn
	if((firstday+daysInMonth)%7>=1)++weeks;				//mender by hoejohn

	var html = "";

	html += "<table width=\"100%\" border=\"0\" cellspacing=\"1\" cellpadding=\"0\" bgcolor=\"#FFFFFF\" onclick=\"lostFocus()\">\n";
	for (i=0; i<weeks; i++)
	{
		html += "<tr bgcolor=\"#E2E7F3\" align=\"center\">\n";
		for (j=0; j<7; j++)	html += this.displayCell(i, j);
		html += "</tr>\n";
	}
	
	html += "<tr bgcolor=\"#BAC4DC\" align=\"center\">\n";
	for (i=0; i<7; i++)
	{
		html += "<td nowrap>" + ( i==0||i==6 ? "<font color=\"#FF0000\">" : "" ) + vecDayName[i] + ( i==0 |i==6? "</font>" : "" ) + "</td>\n";
	}
	html += "</tr>\n";
	html += "</table>\n";
	
	return html;
}

function calendarDisplayCell(x, y)
{
	var day = x*7 + y - firstday + 1;

	var html = "";
	if ( day < 1 || day > daysInMonth )
	{
		html += "<td>&nbsp;</td>\n";
	}
	else
	{
		html += "<td" + ( day == this.day ? " bgcolor=\"#FFFFFF\"" : "" ) + " style=\"cursor:hand;font-family:Arial;color:" + (( y == 0 || y ==6 ) ? "#FF0000" : "#000000") + "\" onclick=\"onCalendarChange(" + day + ")\">\n";
		html += day;
		html += "</td>\n";
	}
	
	return html;
}

function calendarDisplayTime()
{
	var html = '';
	html += '<table border="0" cellspacing="0" cellpadding="0">';
	html += ' <tr>';
	html += '  <td rowspan="2">时:</td>';
	html += '  <td rowspan="2"><input class="NUMBER" maxlength="2" size="2" name="txt_hour" type="TEXT" value="'+ this.hour +'" onblur="calendarOnEditHour()"></td>';
	html += '  <td><font style="cursor:hand" color="#222222" face="Webdings" onclick="calendarOnNextHour()">5</font></td>';
if(iLength>4)
{
	html += '  <td rowspan="2">分：</td>';
	html += '  <td rowspan="2"><input class="NUMBER" maxlength="2" size="2" name="txt_minute" type="TEXT" value="'+ this.minute +'" onblur="calendarOnEditMinute()"></td>';
	html += '  <td><font style="cursor:hand" color="#222222" face="Webdings" onclick="calendarOnNextMinute()">5</font></td>';
}
if(iLength>5)
{
	html += '  <td rowspan="2">秒：</td>';
	html += '  <td rowspan="2"><input class="NUMBER" maxlength="2" size="2" name="txt_second" type="TEXT" value="'+ this.second +'" onblur="calendarOnEditSecond()"></td>';
	html += '  <td><font style="cursor:hand" color="#222222" face="Webdings" onclick="calendarOnNextSecond()">5</font></td>';
}
	html += ' </tr>';
	html += ' <tr>';
	html += '  <td><font style="cursor:hand" color="#222222" face="Webdings" onclick="calendarOnPrevHour()">6</font></td>';
if(iLength>4)
{
	html += '  <td><font style="cursor:hand" color="#222222" face="Webdings" onclick="calendarOnPrevMinute()">6</font></td>';
}
if(iLength>5)
{
	html += '  <td><font style="cursor:hand" color="#222222" face="Webdings" onclick="calendarOnPrevSecond()">6</font></td>';
}
	html += ' </tr>';
	html += '</table>';
	html += '';
	return html;
}

function calendarOnPrevYear()
{
	var obj_txt_year = document.calendar.txt_year;
	obj_txt_year.value = parseFloat(obj_txt_year.value) - 1;
	calendarOnChangeMonth();
}

function calendarOnEditYear()
{
	var obj_txt_year = document.calendar.txt_year;
	if ( isNaN(obj_txt_year.value) )
	{
		var now = new Date();
		obj_txt_year.value =  (document.layers||now.getYear()<100) ? now.getYear() + 1900 : now.getYear();
	}
	calendarOnChangeMonth();
}

function calendarOnNextYear()
{
	var obj_txt_year = document.calendar.txt_year;
	obj_txt_year.value = parseFloat(obj_txt_year.value) + 1;
	calendarOnChangeMonth();
}

function calendarOnPrevHour()
{
	var obj_txt_hour = document.calendar.txt_hour;
	if (parseFloat(obj_txt_hour.value)==0)
	{
		obj_txt_hour.value = 23;
	}
	else
	{
		obj_txt_hour.value = parseFloat(obj_txt_hour.value) - 1;
	}
}

function calendarOnEditHour()
{
	var obj_txt_hour = document.calendar.txt_hour;
	if ( isNaN(obj_txt_hour.value) || parseFloat(obj_txt_hour.value) < 0 || parseFloat(obj_txt_hour.value) > 23)
	{
		var now = new Date();
		obj_txt_hour.value = now.getHours();
	}
}

function calendarOnNextHour()
{
	var obj_txt_hour = document.calendar.txt_hour;
	if (parseFloat(obj_txt_hour.value)==23)
	{
		obj_txt_hour.value = 0;
	}
	else
	{
		obj_txt_hour.value = parseFloat(obj_txt_hour.value) + 1;
	}
}

function calendarOnPrevMinute()
{
	var obj_txt_minute = document.calendar.txt_minute;
	if (parseFloat(obj_txt_minute.value)==0)
	{
		obj_txt_minute.value = 59;
	}
	else
	{
		obj_txt_minute.value = parseFloat(obj_txt_minute.value) - 1;
	}
}

function calendarOnEditMinute()
{
	var obj_txt_minute = document.calendar.txt_minute;
	if ( isNaN(obj_txt_minute.value) || parseFloat(obj_txt_minute.value) <0 || parseFloat(obj_txt_minute.value) > 59)
	{
		var now = new Date();
		obj_txt_minute.value = now.getMinutes();
	}
}

function calendarOnNextMinute()
{
	var obj_txt_minute = document.calendar.txt_minute;
	if (parseFloat(obj_txt_minute.value)==59)
	{
		obj_txt_minute.value = 0;
	}
	else
	{
		obj_txt_minute.value = parseFloat(obj_txt_minute.value) + 1;
	}
}

function calendarOnPrevSecond()
{
	var obj_txt_second = document.calendar.txt_second;
	if (parseFloat(obj_txt_second.value)==0)
	{
		obj_txt_second.value = 59;
	}
	else
	{
		obj_txt_second.value = parseFloat(obj_txt_second.value) - 1;
	}
}

function calendarOnEditSecond()
{
	var obj_txt_second = document.calendar.txt_second;
	if ( isNaN(obj_txt_second.value) || parseFloat(obj_txt_second.value) <0 || parseFloat(obj_txt_second.value) > 59)
	{
		var now = new Date();
		obj_txt_second.value = now.getSeconds();
	}
}

function calendarOnNextSecond()
{
	var obj_txt_second = document.calendar.txt_second;
	if (parseFloat(obj_txt_second.value)==59)
	{
		obj_txt_second.value = 0;
	}
	else
	{
		obj_txt_second.value = parseFloat(obj_txt_second.value) + 1;
	}
}

function calendarOnChangeMonth()
{
	var obj_txt_year = document.calendar.txt_year;
	var obj_sel_month = document.calendar.sel_month;
	var year = parseFloat(obj_txt_year.value);
	var month = parseFloat(obj_sel_month.options[obj_sel_month.selectedIndex].value);
	cal.setDate(year, month);
	if(document.layers)
	{
		document.calendar_body.document.open();
		document.calendar_body.document.write(cal.displayBody());
		document.calendar_body.document.close();
	}
	else if(document.all)
	{	
		calendar_body.innerHTML = cal.displayBody();
	}
}