var weekend = [0,6];
var weekendColor = "#e0e0e0";
var fontface = "Verdana";
var fontsize = 2;

var gNow = new Date();
var ggWinCal;
isNav = (navigator.appName.indexOf("Netscape") != -1) ? true : false;
isIE = (navigator.appName.indexOf("Microsoft") != -1) ? true : false;

Calendar.Months = ["January", "February", "March", "April", "May", "June","July", "August", "September", "October", "November", "December"];

// Non-Leap year Month days..
Calendar.DOMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
// Leap year Month days..
Calendar.lDOMonth = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];

function Calendar(p_item, p_WinCal, p_month, p_year, p_format) {
	if ((p_month == null) && (p_year == null))	return;
	if (p_WinCal == null)	this.gWinCal = ggWinCal;
	else	this.gWinCal = p_WinCal;

	this.gMonthName = Calendar.get_month(p_month);
	this.gMonth = new Number(p_month);
	this.gYearly = false;

	this.gYear = p_year;
	this.gFormat = p_format;
	this.gBGColor = "white";
	this.gFGColor = "black";
	this.gTextColor = "black";
	this.gHeaderColor = "black";
	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;
}

// This is for compatibility with Navigator 3, we have to create and discard one object before the prototype object exists.
new Calendar();

Calendar.prototype.getMonthlyCalendarCode = function() {
	var vCode = "";
	var vHeader_Code = "";
	var vData_Code = "";
	
	// Begin Table Drawing code here..
	vCode = vCode + "<TABLE border=0 cellpadding=0 cellspacing=3>";
	
	//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 = "";
	
	this.gWinCal.document.open();

	// Setup the page...
	this.wwrite("<HTML>");
	this.wwrite("<HEAD><TITLE>Calendar</TITLE>");
	this.wwrite("</HEAD>");
 this.wwrite("<STYLE type=\"text/css\">*{padding:0;margin:0;} body{padding:0 0 0 10px;} table,tr,td{background-color:white;}"+
 ".currMonth { font-family:arial; font-size:11px; color:#000;display:block;}\n"+
 ".dayOfWeek { font-family:arial; font-size:10px; color:#000000 }\n"+
 "A.calDate { font-family:arial; font-size:10px; color:#FFFFFF; text-decoration:none; }\n"+
 "td.today {background-color:#C3B991;}\n"+
 "td.otherday {background-color:#A99676;}\n"+
 "</STYLE>")
	this.wwrite("<BODY>");
 this.wwrite("<TABLE class='calendar'>");
	/*CAL NAV*/ 	
 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.wwrite("<TR><TD>"+
 "<TABLE border=0 cellpadding=0 cellspacing=0><TR>"+
 "<TD width=27 height=22>"+
 "<A href=\"javascript:window.opener.Build('"+ this.gReturnItem +"','"+ prevMM +"','"+ prevYYYY +"','"+ this.gFormat + "')\">"+
 "<IMG src=\"images/left_arrow.gif\" width=27 height=22 border=0><\/A></TD>"+
 "<TD width=115 height='22' align=\"center\"><SPAN class=\"currMonth\" height='22'>"+
 this.gMonthName + " " + this.gYear+
 "</SPAN></TD>"+
 "<TD width=27 height=22>"+
 "<A href=\"javascript:window.opener.Build('"+ this.gReturnItem +"','"+ nextMM +"','"+ nextYYYY +"','"+ this.gFormat + "')\">"+
 "<IMG src=\"images/right_arrow.gif\" width=27 height=22 border=0><\/A></TD>"+
 "</TR></TABLE>"+
 "</TD></TR>");
 /*END NAV*/
 this.wwrite("<TR><TD><IMG src=\"images/trans.gif\" width=1 height=2></TD></TR>")
 
 /*START DAYS OF WEEK*/
 this.wwrite("<TR><TD background=\"images/rib_tile.gif\" align=\"center\">"+
 this.cal_header()+
 "</TD></TR>");
 /*END DAYS OF WEEK*/
 this.wwrite("<TR><TD><IMG src=\"images/trans.gif\" width=1 height=2></TD></TR>")
 /*START CALENDAR*/
 vCode = this.getMonthlyCalendarCode();
 this.wwrite("<TR><TD bgcolor=\"#fff\" align=\"center\">"+
 vCode+
 "</TD></TR>");
 //this.wwrite("<TR><TD><IMG src=\"img/\"</TD></TR>
 this.wwrite("<TR><TD><IMG src=\"images/trans.gif\" width=1 height=2></TD></TR>")
 this.wwrite("<TR><TD></TD></TR>")
  
 /*END CALENDAR*/
 this.wwrite("</TABLE>");
	this.wwrite("</BODY></HTML>");
	this.gWinCal.document.close();
}

Calendar.prototype.wwrite = function(wtext) {
	this.gWinCal.document.writeln(wtext);
}

Calendar.prototype.wwriteA = function(wtext) {
	this.gWinCal.document.write(wtext);
}

Calendar.prototype.cal_header = function() {
	var vCode = "";
	vCode += "<TABLE border=0 cellpadding=0 cellspacing=3 background=\"#null\"><TR>";
	vCode += "<TD width=20 height=12 align=\"center\"><SPAN class=\"dayOfWeek\">S</SPAN></TD>";
	vCode += "<TD width=20 height=12 align=\"center\"><SPAN class=\"dayOfWeek\">M</SPAN></TD>";
	vCode += "<TD width=20 height=12 align=\"center\"><SPAN class=\"dayOfWeek\">T</SPAN></TD>";
	vCode += "<TD width=20 height=12 align=\"center\"><SPAN class=\"dayOfWeek\">W</SPAN></TD>";
	vCode += "<TD width=20 height=12 align=\"center\"><SPAN class=\"dayOfWeek\">T</SPAN></TD>";
	vCode += "<TD width=20 height=12 align=\"center\"><SPAN class=\"dayOfWeek\">F</SPAN></TD>";
	vCode += "<TD width=20 height=12 align=\"center\"><SPAN class=\"dayOfWeek\">S</SPAN></TD>";
	vCode += "</TR></TABLE>";
	return vCode;
}

Calendar.prototype.cellData = function(vday) {
	var vNowDay = gNow.getDate();
	var vNowMonth = gNow.getMonth();
	var vNowYear = gNow.getFullYear();

	if (vday == vNowDay && this.gMonth == vNowMonth && this.gYear == vNowYear)
		return ("<TD width=20 height=20 bgcolor=\"#C3B991\" class='today' align=\"center\">");
	else
		return ("<TD width=20 height=20 bgcolor=\"#A99676\" class='otherday' align=\"center\">");
}

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 += this.cellData(vDay) + "<A class=\"calDate\">&nbsp;</A>" + "</TD>"; //vCode += "<TD width=20 height=20 bgcolor=\"#427373\" align=\"center\"><A class=\"calDate\">&nbsp;</A></TD>";
	}

	// Write rest of the 1st week
	for (j=vFirstDay; j<7; j++) {
  vCode += this.cellData(vDay)
		vCode += "<A class=\"calDate\" href='#' " + 
				"onClick=\"self.opener.document." + this.gReturnItem + ".value='" + 
				this.format_data(vDay) + 
				"';window.close();\">" + 
				this.format_day(vDay) + 
			"</A>" + 
			"</TD>";
		vDay=vDay + 1;
	}
 
	vCode = vCode + "</TR>";

	// Write the rest of the weeks
	for (k=2; k<7; k++) {
		vCode = vCode + "<TR>";

		for (j=0; j<7; j++) {
    vCode += this.cellData(vDay)
  		vCode += "<A class=\"calDate\" href='#' " + 
				"onClick=\"self.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;
  
  vCode += "</TR>"
	}
	
 
	// 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 += this.cellData(vDay) + "<A class=\"calDate\">&nbsp;</A>" + "</TD>";
		//vCode = vCode + "<TD width=20 height=20 bgcolor=\"#427373\" align=\"center\"><A class=\"calDate\"></A></TD>";
	}
 
 vCode += "</TR>"
	
	return vCode;
}

Calendar.prototype.format_day = function(vday) {
	var vNowDay = gNow.getDate();
	var vNowMonth = gNow.getMonth();
	var vNowYear = gNow.getFullYear();

	if (vday == vNowDay && this.gMonth == vNowMonth && this.gYear == vNowYear)
		return (vday);
	else
		return (vday);
}

Calendar.prototype.format_data = function(p_day) {
	var vData;
	var vMonth = 1 + this.gMonth;
	vMonth = (vMonth.toString().length < 2) ? "0" + vMonth : vMonth;
	var vMon = Calendar.get_month(this.gMonth).substr(0,3).toUpperCase();
	var vFMon = Calendar.get_month(this.gMonth).toUpperCase();
	var vY4 = new String(this.gYear);
	var vY2 = new String(this.gYear.substr(2,2));
	var vDD = (p_day.toString().length < 2) ? "0" + p_day : p_day;

	switch (this.gFormat) {
		case "MM\/DD\/YYYY" :
			vData = vMonth + "\/" + vDD + "\/" + vY4;
			break;
		case "MM\/DD\/YY" :
			vData = vMonth + "\/" + vDD + "\/" + vY2;
			break;
		case "MM-DD-YYYY" :
			vData = vMonth + "-" + vDD + "-" + vY4;
			break;
		case "MM-DD-YY" :
			vData = vMonth + "-" + vDD + "-" + vY2;
			break;

		case "DD\/MON\/YYYY" :
			vData = vDD + "\/" + vMon + "\/" + vY4;
			break;
		case "DD\/MON\/YY" :
			vData = vDD + "\/" + vMon + "\/" + vY2;
			break;
		case "DD-MON-YYYY" :
			vData = vDD + "-" + vMon + "-" + vY4;
			break;
		case "DD-MON-YY" :
			vData = vDD + "-" + vMon + "-" + vY2;
			break;

		case "DD\/MONTH\/YYYY" :
			vData = vDD + "\/" + vFMon + "\/" + vY4;
			break;
		case "DD\/MONTH\/YY" :
			vData = vDD + "\/" + vFMon + "\/" + vY2;
			break;
		case "DD-MONTH-YYYY" :
			vData = vDD + "-" + vFMon + "-" + vY4;
			break;
		case "DD-MONTH-YY" :
			vData = vDD + "-" + vFMon + "-" + vY2;
			break;

		case "DD\/MM\/YYYY" :
			vData = vDD + "\/" + vMonth + "\/" + vY4;
			break;
		case "DD\/MM\/YY" :
			vData = vDD + "\/" + vMonth + "\/" + vY2;
			break;
		case "DD-MM-YYYY" :
			vData = vDD + "-" + vMonth + "-" + vY4;
			break;
		case "DD-MM-YY" :
			vData = vDD + "-" + vMonth + "-" + vY2;
			break;

		default :
			vData = vDD + "\/" + vMonth + "\/" + vY4;
	}

	return vData;
}

function Build(p_item, p_month, p_year, p_format) {
	var p_WinCal = ggWinCal;
	gCal = new Calendar(p_item, p_WinCal, p_month, p_year, p_format);

	// Customize your Calendar here..
	gCal.gBGColor="white";
	gCal.gLinkColor="black";
	gCal.gTextColor="black";
	gCal.gHeaderColor="darkgreen";

	// Choose appropriate show function
	gCal.show();
}

function show_calendar() {
	/* 
		p_month : 0-11 for Jan-Dec; 12 for All Months.
		p_year	: 4-digit year
		p_format: Date format (mm/dd/yyyy, dd/mm/yy, ...)
		p_item	: Return Item.
	*/

	p_item = arguments[0];
	if (arguments[1] == null)
		p_month = new String(gNow.getMonth());
	else
		p_month = arguments[1];
	if (arguments[2] == "" || arguments[2] == null)
		p_year = new String(gNow.getFullYear().toString());
	else
		p_year = arguments[2];
	if (arguments[3] == null)
		p_format = "DD/MM/YYYY";
	else
		p_format = arguments[3];

	vWinCal = window.open("", "Calendar","width=200,height=200,status=no,resizable=no,top=200,left=200");
	vWinCal.opener = self;
	ggWinCal = vWinCal;

	Build(p_item, p_month, p_year, p_format);
}

