var weekend = [0,6];
var gNow = new Date();
var ggWinCal;

Calendar.Months=["January","February","March","April","May","June","July","August","September","October","November","December"];
Calendar.DOMonth=[31,28,31,30,31,30,31,31,30,31,30,31];
Calendar.lDOMonth=[31,29,31,30,31,30,31,31,30,31,30,31];

function Calendar(p_item, p_WinCal, p_month, p_year) {
	if ((p_month == null) && (p_year == null))	return;

	this.gWinCal=(p_WinCal==null) ? ggWinCal : p_WinCal;
	this.gMonthName = Calendar.get_month(p_month);
	this.gMonth = new Number(p_month);
	this.gYear = p_year;
	this.gReturnItem = p_item;
}

Calendar.get_month = Calendar_get_month;
Calendar.get_daysofmonth = Calendar_get_daysofmonth;
Calendar.calc_month_year = Calendar_calc_month_year;

function Calendar_get_month(monthNo) {
	return Calendar.Months[monthNo];
}

function Calendar_get_daysofmonth(monthNo, p_year) {
	if ((p_year % 4) == 0) {
		if ((p_year % 100) == 0 && (p_year % 400) != 0)
			return Calendar.DOMonth[monthNo];
	
		return Calendar.lDOMonth[monthNo];
	} else
		return Calendar.DOMonth[monthNo];
}

function Calendar_calc_month_year(p_Month, p_Year, incr) {
	var ret_arr = new Array();
	
	if (incr == -1) {
		if (p_Month == 0) {
			ret_arr[0] = 11;
			ret_arr[1] = parseInt(p_Year) - 1;
		}
		else {
			ret_arr[0] = parseInt(p_Month) - 1;
			ret_arr[1] = parseInt(p_Year);
		}
	} else if (incr == 1) {
		if (p_Month == 11) {
			ret_arr[0] = 0;
			ret_arr[1] = parseInt(p_Year) + 1;
		}
		else {
			ret_arr[0] = parseInt(p_Month) + 1;
			ret_arr[1] = parseInt(p_Year);
		}
	}
	
	return ret_arr;
}

Calendar.prototype.getMonthlyCalendarCode = function() {
	var vCode = "";
	var vHeader_Code = "";
	var vData_Code = "";
	
	vCode = vCode + "<table frame='box'>";
	
	vHeader_Code = this.cal_header();
	vData_Code = this.cal_data();
	vCode = vCode + vHeader_Code + vData_Code;
	
	vCode = vCode + "</table>";
	
	return vCode;
}

Calendar.prototype.show = function() {
	var vCode = "";
	var prevMMYYYY = Calendar.calc_month_year(this.gMonth, this.gYear, -1);
	var prevMM = prevMMYYYY[0];
	var prevYYYY = prevMMYYYY[1];
	var nextMMYYYY = Calendar.calc_month_year(this.gMonth, this.gYear, 1);
	var nextMM = nextMMYYYY[0];
	var nextYYYY = nextMMYYYY[1];
	
	this.gWinCal.document.open();

	// Setup the page...
	this.wwrite("<html>");
	this.wwrite("<head><title>Calendar</title>");
	this.wwrite("<style type='text/css'>");
	this.wwrite("<!-- ");
	this.wwrite(" BODY {font-family:Verdana,Geneva,Arial,Helvetica,sans-serif; background-color:white; font-size:8pt; font-weight:normal; font-style:normal; color:black;}");
	this.wwrite(" td {font-family:Verdana,Geneva,Arial,Helvetica,sans-serif; background-color:white; font-size:8pt; font-weight:normal; font-style:normal; color:black;}");
	this.wwrite(" .weekend {font-family:Verdana,Geneva,Arial,Helvetica,sans-serif; background-color:#E0E0E0; font-size:8pt; font-weight:normal; font-style:normal; color:black;}");
	this.wwrite(" .hdr {font-size:8pt; font-weight:bold; color:darkgreen; vertical-align:middle;}");
	this.wwrite(" a:link, a:visited, a:hover { color:black; text-decoration:none; }");
	this.wwrite(" -->");
	this.wwrite("</style>");
	this.wwrite("</head>");
	this.wwrite("<body>");
	this.wwrite("<table width='100%'><tr>");
	this.wwrite("<td align=left><input type='button' class='hdr' value='<' onClick=" + '"window.opener.Build(' + "'" + this.gReturnItem + "', '" + prevMM + "', '" + prevYYYY + "', '" + this.gFormat + "'" + ");" + '"></TD>');
	this.wwrite("<td align=center class='hdr'>" + this.gMonthName + " " + this.gYear + "</td>");
	this.wwrite("<td align=right><input type='button' class='hdr' value='>' onClick=" + '"window.opener.Build(' + "'" + this.gReturnItem + "', '" + nextMM + "', '" + nextYYYY + "', '" + this.gFormat + "'" + ");" + '"></TD>');
	this.wwrite("</tr></table>");

	// Get the complete calendar code for the month..
	vCode = this.getMonthlyCalendarCode();
	this.wwrite(vCode);

	this.wwrite("</body></html>");
	this.gWinCal.document.close();
}

Calendar.prototype.wwrite = function(wtext) {
	this.gWinCal.document.writeln(wtext);
}

Calendar.prototype.cal_header = function() {
	var vCode = "";
	var h1 = "<td width='14%' class='hdr'>"
	var h2 = "</td>"
	
	vCode = "<tr>";
	vCode = vCode + h1 + "Sun" + h2;
	vCode = vCode + h1 + "Mon" + h2;
	vCode = vCode + h1 + "Tue" + h2;
	vCode = vCode + h1 + "Wed" + h2;
	vCode = vCode + h1 + "Thu" + h2;
	vCode = vCode + h1 + "Fri" + h2;
	vCode = vCode + h1 + "Sat" + h2;
	vCode = vCode + "</tr>";
	return vCode;
}

Calendar.prototype.cal_data = function() {
	var vDate = new Date();
	vDate.setDate(1);
	vDate.setMonth(this.gMonth);
	vDate.setFullYear(this.gYear);

	var vFirstDay=vDate.getDay();
	var vDay=1;
	var vLastDay=Calendar.get_daysofmonth(this.gMonth, this.gYear);
	var vOnLastDay=0;
	var vCode = "";

	vCode = vCode + "<tr>";
	for (i=0; i < vFirstDay; i++) {
		vCode = vCode + "<td width='14%'" + this.write_weekend_string(i) + "></td>";
	}

	for (j=vFirstDay; j<7; j++) {
		vCode = vCode + "<td width='14%'" + this.write_weekend_string(j) + "><a href=" + '"javascript:window.opener.document.' + this.gReturnItem + ".value='" + this.format_data(vDay) + "'; window.close();" + '">' + this.format_day(vDay) + "</a></td>";
		vDay=vDay + 1;
	}
	vCode = vCode + "</tr>";

	for (k=2; k<7; k++) {
		vCode = vCode + "<tr>";

		for (j=0; j<7; j++) {
			vCode = vCode + "<td width='14%'" + this.write_weekend_string(j) + "><a href=" + '"javascript:window.opener.document.' + this.gReturnItem + ".value='" + this.format_data(vDay) + "';window.close();" + '">' + this.format_day(vDay) + "</a></td>";
			vDay=vDay + 1;

			if (vDay > vLastDay) {
				vOnLastDay = 1;
				break;
			}
		}

		if (j == 6)
			vCode = vCode + "</tr>";
		if (vOnLastDay == 1)
			break;
	}
	
	// Fill up the rest of last week with proper blanks, so that we get proper square blocks
	for (m=1; m<(7-j); m++) {
		vCode = vCode + "<td width='14%'" + this.write_weekend_string(j+m) + "></td>";
	}
	
	return vCode;
}

Calendar.prototype.format_day = function(vday) {
	return (vday == gNow.getDate() && this.gMonth == gNow.getMonth() && this.gYear == gNow.getFullYear()) ? "<span style='color:red;'>" + vday + "</span>" : vday;
}

Calendar.prototype.write_weekend_string = function(vday) {
	for (var i=0; i < weekend.length; i++) {
		if (vday == weekend[i])
			return (" class='weekend'");
	}
	return "";
}

Calendar.prototype.format_data = function(p_day) {
	var vMonth = 1 + this.gMonth;
	vMonth = (vMonth.toString().length < 2) ? "0" + vMonth : vMonth;
	var vY2 = new String(this.gYear.substr(2,2));
	var vDD = (p_day.toString().length < 2) ? "0" + p_day : p_day;

	return vMonth + "/" + vDD + "/" + vY2;
}

function Build(p_item, p_month, p_year) {
	var p_WinCal = ggWinCal;
	gCal = new Calendar(p_item, p_WinCal, p_month, p_year);
	gCal.show();
}

function show_calendar() {
	p_item = arguments[0];	// return item
	p_month = (arguments[1] == null) ? new String(gNow.getMonth()) : arguments[1]; // 0-11 for Jan-Dec
	p_year = (arguments[2] == "" || arguments[2] == null) ? new String(gNow.getFullYear().toString()) : arguments[2]; // yyyy

	vWinCal = window.open("","Calendar","width=250,height=200"); // ,top=200,left=200
	vWinCal.opener = self;
	vWinCal.focus();
	ggWinCal = vWinCal;
	Build(p_item, p_month, p_year);
}
