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"];

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 defaultDate() {
	d = new Date();

	monthNum = d.getMonth() + 1;
	if(monthNum.toString().length < 2) monthNum = '0' + monthNum;

	dayNum = d.getDate();
	if(dayNum.toString().length < 2) dayNum = '0' + dayNum;

	return d.getYear() + '-' + monthNum + '-' + dayNum;
}

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.gTime = p_time;

	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;
Calendar.print = Calendar_print;

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;
}

function Calendar_print() {
	ggWinCal.print();
}

new Calendar();

Calendar.prototype.getMonthlyCalendarCode = function() {
	var vCode = "";
	var vHeader_Code = "";
	var vData_Code = "";

	vCode += "<TABLE BORDER='1' CELLSPACING='0' CELLPADDING='2' BGCOLOR='" + this.gBGColor + "' STYLE='border-collapse: collapse'>";

	vHeader_Code = this.cal_header();
	vData_Code = this.cal_data();
	vCode += vHeader_Code + vData_Code;

	vCode += "</TABLE>";

	return vCode;
}

Calendar.prototype.show = function() {
	var vCode = "";

	this.gWinCal.document.open();

	this.wwrite("<HTML><HEAD><TITLE>Calendar</TITLE><STYLE>a {text-decoration: none;}</STYLE></HEAD>");

	this.wwrite("<BODY " +
		"link=\"" + this.gLinkColor + "\" " + "vlink=\"" + this.gLinkColor + "\" " + "alink=\"" + this.gLinkColor + "\" " +
		"text=\"" + this.gTextColor + "\">");
	this.wwriteA("<FONT FACE='" + fontface + "' SIZE='2'><B>");
	this.wwriteA(this.gMonthName + " " + this.gYear);
	this.wwriteA("</B><BR>");

	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("<TABLE WIDTH='100%' BORDER='1' STYLE='border-collapse: collapse; font-size:11px;' CELLSPACING='0' CELLPADDING='2'  BGCOLOR='#e0e0e0'><TR><TD ALIGN='center' TITLE='Prev decade'>");

	this.wwrite("<A HREF=\"javascript:window.opener.Build(" +
		"'" + this.gReturnItem + "', '" + this.gMonth + "', '" + (parseInt(this.gYear)-10) + "', '" + this.gFormat + "');" +
		"\"><<<<\/A></TD><TD ALIGN='center' TITLE='Prev year'>");

	this.wwrite("<A HREF=\"javascript:window.opener.Build(" +
		"'" + this.gReturnItem + "', '" + this.gMonth + "', '" + (parseInt(this.gYear)-1) + "', '" + this.gFormat + "');" +
		"\"><<<\/A></TD><TD ALIGN='center' TITLE='Prev month'>");

	this.wwrite("<A HREF=\"javascript:window.opener.Build(" +
		"'" + this.gReturnItem + "', '" + prevMM + "', '" + prevYYYY + "', '" + this.gFormat + "');" +
		"\"><<\/A></TD><TD ALIGN='center'>");

	this.wwrite("<A HREF=\"javascript:window.print();\">Print</A></TD><TD ALIGN='center' title='Next month'>");

	this.wwrite("<A HREF=\"javascript:window.opener.Build(" +
		"'" + this.gReturnItem + "', '" + nextMM + "', '" + nextYYYY + "', '" + this.gFormat + "');" +
		"\">><\/A></TD><TD ALIGN='center' TITLE='Next year'>");

	this.wwrite("<A HREF=\"javascript:window.opener.Build(" +
		"'" + this.gReturnItem + "', '" + this.gMonth + "', '" + (parseInt(this.gYear)+1) + "', '" + this.gFormat + "');" +
		"\">>><\/A><TD align='center' TITLE='Next decade'>");

	this.wwrite("<A HREF=\"javascript:window.opener.Build(" +
		"'" + this.gReturnItem + "', '" + this.gMonth + "', '" + (parseInt(this.gYear)+10) + "', '" + this.gFormat + "');" +
		"\">>>><\/A></TD></TR></TABLE><BR>");

	vCode = this.getMonthlyCalendarCode();
	this.wwrite(vCode);

	this.wwrite("<BR/><INPUT type='button' onclick='document.getElementById(\"hrs\").selectedIndex=0;document.getElementById(\"mins\").selectedIndex=0;document.getElementById(\"secs\").selectedIndex=0;' value='0'/>&nbsp;");

	var timeStr = this.gTime.split(":");

	this.wwrite("<SELECT ID='hrs' NAME='hrs'>");
    for(i = 0; i < 24; i++) {
        if(i.toString().length == 1) i = '0' + i;

		if(parseInt(timeStr[0], 10) == i) sel = ' selected';
        else sel = '';

        this.wwrite("<OPTION VALUE='" + i + "'" + sel + ">" + i + "</OPTION>");
    }
    this.wwrite("</SELECT>:");

	this.wwrite("<SELECT ID='mins' NAME='mins'>");
    for(i = 0; i < 60; i++) {
        if(i.toString().length == 1) i = '0' + i;

        if(parseInt(timeStr[1], 10) == i) sel = ' selected';
        else sel = '';

        this.wwrite("<OPTION VALUE='" + i + "'" + sel + ">" + i + "</OPTION>");
    }
    this.wwrite("</SELECT>:");

	this.wwrite("<SELECT ID='secs' NAME='secs'>");
    for(i = 0; i < 60; i++) {
        if(i.toString().length == 1) i = '0' + i;

        if(parseInt(timeStr[2], 10) == i) sel = ' selected';
        else sel = '';

        this.wwrite("<OPTION VALUE='" + i + "'" + sel + ">" + i + "</OPTION>");
    }
    this.wwrite("</SELECT>");

	this.wwrite("<INPUT type='button' onclick='now=new Date();hour=now.getHours();minute=now.getMinutes();second=now.getSeconds();document.getElementById(\"hrs\").selectedIndex=hour;document.getElementById(\"mins\").selectedIndex=minute;document.getElementById(\"secs\").selectedIndex=second;' value='!'>&nbsp;");

	this.wwrite("<BR><BR>");

    this.wwrite("<CENTER><A STYLE='color: brown; border: brown 1px solid; padding: 3px;' HREF='#' onClick=\"self.opener.document." +
        this.gReturnItem + ".value='';window.close();\"><B>Clear Field</B><\/A></CENTER>");

	this.wwrite("</FONT></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 += "<TR>";
	vCode += "<TD WIDTH='14%'><FONT SIZE='2' FACE='" + fontface + "' COLOR='" + "'818080'" + "'><B>Sun</B></FONT></TD>";
	vCode += "<TD WIDTH='14%'><FONT SIZE='2' FACE='" + fontface + "' COLOR='" + "'818080'" + "'><B>Mon</B></FONT></TD>";
	vCode += "<TD WIDTH='14%'><FONT SIZE='2' FACE='" + fontface + "' COLOR='" + "'818080'" + "'><B>Tue</B></FONT></TD>";
	vCode += "<TD WIDTH='14%'><FONT SIZE='2' FACE='" + fontface + "' COLOR='" + "'818080'" + "'><B>Wed</B></FONT></TD>";
	vCode += "<TD WIDTH='14%'><FONT SIZE='2' FACE='" + fontface + "' COLOR='" + "'818080'" + "'><B>Thu</B></FONT></TD>";
	vCode += "<TD WIDTH='14%'><FONT SIZE='2' FACE='" + fontface + "' COLOR='" + "'818080'" + "'><B>Fri</B></FONT></TD>";
	vCode += "<TD WIDTH='16%'><FONT SIZE='2' FACE='" + fontface + "' COLOR='" + "'818080'" + "'><B>Sat</B></FONT></TD>";
	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 += "<TR>";
	for(i = 0; i < vFirstDay; i++) {
		vCode += "<TD WIDTH='14%'" + this.write_weekend_string(i) + "><FONT SIZE='2' FACE='" + fontface + "'>&nbsp;</FONT></TD>";
	}

	for(j = vFirstDay; j < 7; j++) {
		vCode += "<TD WIDTH='14%'" + this.write_weekend_string(j) + "><FONT SIZE='2' FACE='" + fontface + "'>" +
			"<A HREF='#' onClick=\"obj=self.opener.document." + this.gReturnItem +
            "; if(obj.className.indexOf(' date')>=0) timeVal=''; else timeVal=' ' + document.getElementById('hrs').value + ':' + document.getElementById('mins').value + ':' +  document.getElementById('secs').value; obj.value='" +
            this.format_data(vDay) + "'+timeVal;window.close();\">" + this.format_day(vDay) + "</A></FONT></TD>";
		vDay++;
	}
	vCode += "</TR>";

	for(k = 2; k < 7; k++) {
		vCode += "<TR>";

		for(j = 0; j < 7; j++) {
			vCode += "<TD WIDTH='14%'" + this.write_weekend_string(j) + "><FONT SIZE='2' FACE='" + fontface + "'>" +
				"<A HREF='#' onClick=\"obj=self.opener.document." + this.gReturnItem +
                "; if(obj.className.indexOf(' date')>=0) timeVal=''; else timeVal=' ' + document.getElementById('hrs').value + ':' + document.getElementById('mins').value + ':' +  document.getElementById('secs').value; obj.value='" +
                this.format_data(vDay) + "'+timeVal;window.close();\">" + this.format_day(vDay) + "</A></FONT></TD>";
			vDay++;

			if(vDay > vLastDay) {
				vOnLastDay = 1;
				break;
			}
		}

		if(j == 6) vCode += "</TR>";
		if(vOnLastDay == 1) break;
	}

	for(m = 1; m < (7 - j); m++) {
        vCode += "<TD WIDTH='14%'" + this.write_weekend_string(j + m) +
        "><FONT SIZE='2' FACE='" + fontface + "' COLOR='gray'>" + m + "</FONT></TD>";
	}

	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 ("<FONT COLOR='RED'><B>" + vday + "</B></FONT>");
	else return (vday);
}

Calendar.prototype.write_weekend_string = function(vday) {
	var i;

	for(i = 0; i < weekend.length; i++) {
		if(vday == weekend[i]) return (" BGCOLOR='" + weekendColor + "'");
	}

	return "";
}

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;

		case "YYYY\/MM\/DD":
			vData = vY4 + "\/" + vMonth + "\/" + vDD;
			break;
		case "YYYY-MM-DD":
			vData = vY4 + "-" + vMonth + "-" + vDD;
			break;

		case "YYYY-MM":
			vData = vY4 + "-" + vMonth;
			break;

		default:
			vData = vMonth + "\/" + vDD + "\/" + 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);

	gCal.gBGColor = "white";
	gCal.gLinkColor = "black";
	gCal.gTextColor = "black";
	gCal.gHeaderColor = "darkgreen";

	gCal.show();
}

function show_calendar() {
	p_item = arguments[0];

	if(arguments[1] == "" || arguments[1] == null || arguments[1].match(/\d\d/) == null) p_month = new String(gNow.getMonth());
	else p_month = parseInt(arguments[1], 10) - 1;

	if(arguments[2] == "" || arguments[2] == null || arguments[2].match(/\d\d\d\d/) == null) p_year = new String(gNow.getFullYear().toString());
	else p_year = arguments[2];

	if(arguments[3] == "" || arguments[3] == null || arguments[3].match(/\d\d:\d\d:\d\d/) == null) {
		now = new Date();
		p_time = new String(now.getHours() + ":" + now.getMinutes() + ":" + now.getSeconds());
	}
	else p_time = arguments[3];

	if(arguments[4] == "" || arguments[4] == null) p_format = "YYYY-MM-DD";
	else p_format = arguments[4];

	vWinCal = window.open("", "Calendar",
        "width=250,height=330,status=no,menubar=no,toolbars=no,location=no,resizable=no,top=200,left=200", true);
	vWinCal.opener = self;
	ggWinCal = vWinCal;

	Build(p_item, p_month, p_year, p_format);
}

