<!-- Original:  Kedar R. Bhave (softricks@hotmail.com) -->
<!-- Web Site:  http://www.softricks.com -->

<!-- This script and many more are available free online at -->
<!-- The JavaScript Source!! http://javascript.internet.com -->


var weekend = [0,6];
var weekendColor = "#e0e0e0";
var fontface = "Verdana";
var fontsize = 2;
var submit_on_select=false;
var gNow = new Date();
var ggWinCal;
isNav = (navigator.appName.indexOf("Netscape") != -1) ? true : false;
isIE = (navigator.appName.indexOf("Microsoft") != -1) ? true : false;
/*
Note: This script is dependent upon a helper script to generate the following
variables:

var cTitle="Calendar";
var cAltNextMonth="Next Month",cAltNextYear="Next Year",cAltPrevMonth="Previous Month",cAltPrevYear="Previous Year";
MonthLabels=["January","February","March","April","May","June","July","August","September","October","November","December"];
DaysOfWeek=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"];
StartDOW=0;
DateSep="/";
PartOrder="MDY";
*/


// Non-Leap year Month days..
Calendar.DOMonth = [31, 28, 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;

	if (p_month == null) {
		this.gMonthName = null;
		this.gMonth = null;
		this.gYearly = true;
	} else {
		this.gMonthName = Calendar.get_month(p_month);
		this.gMonth = new Number(p_month);
		this.gYearly = false;
	}

	this.gYear = p_year;
   switch (PartOrder) {
   case "DMY":
      this.gFormat="DD"+DateSep+"MM"+DateSep+"YYYY";
      break;
   case "YMD":
      this.gFormat="YYYY"+DateSep+"MM"+DateSep+"DD";
      break;
   case "MDY":
   default:
      this.gFormat="MM"+DateSep+"DD"+DateSep+"YYYY";
      break;
   }
	// 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 MonthLabels[monthNo];
}

function Calendar_get_daysofmonth(monthNo, p_year) {
	var iResult=Calendar.DOMonth[monthNo];
	if (monthNo==2)
		if ((p_year % 4) == 0) {
			if ((p_year % 100) == 0 && (p_year % 400) != 0)
				;
			else
				iResult++;
		}
	return iResult;
}

function Calendar_calc_month_year(p_Month, p_Year, incr) {
	/*
	Will return an 1-D array with 1st element being the calculated month
	and second being the calculated year
	after applying the month increment/decrement as specified by 'incr' parameter.
	'incr' will normally have 1/-1 to navigate thru the months.
	*/
	var ret_arr = new Array();

	if (incr == -1) {
		// B A C K W A R D
		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) {
		// F O R W A R D
		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();
}


// 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 Width='100%' STYLE=\" border: navy 1px solid;\" BGCOLOR=\"" + this.gBGColor + "\">";

	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("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"");
    this.wwrite("\"http://www.w3.org/TR/html4/loose.dtd\">");
	this.wwrite("<html>");
    this.wwrite("<META http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">");
	this.wwrite("<head><title>"+cTitle+"</title>");
   this.wwrite("<STYLE type=text/css>");
	this.wwrite("Body { font-family: "+fontface+"; font-size: 6pt; color: "+this.gTextColor+"; background-color: "+this.gBGColor+";}");
	this.wwrite("A { text-decoration: none; font-size: 10pt; color: "+this.gLinkColor+";}");
	this.wwrite("TH { width: 14%; color: "+this.gHeaderColor+"; font-size: 8pt; }\nTD {text-align: center; color:gray; font-size: 8pt;}");
	this.wwrite("A:Visited { color: "+this.gLinkColor+";}\nA:Active { color: "+this.gLinkColor+";}");
	this.wwrite("A:Hover { background-color: "+this.gLinkColor+"; color: "+this.gBGColor+";}");
	this.wwrite("A.navbutton:Hover { background-color: " + this.gBGColor + " }");
	this.wwrite("</STYLE>");
	this.wwrite("</head>");

	this.wwrite("<body>");
	this.wwriteA("<CENTER><FONT SIZE=3><B>");
	this.wwriteA(this.gMonthName + " " + this.gYear);
	this.wwriteA("</B></FONT></CENTER><BR>");

	// Show navigation buttons
	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("<SCRIPT LANGUAGE=\"Javascript\" TYPE=\"text/javascript\">");
   this.wwrite("function setItAndQuit(cValue){");
   this.wwrite("self.opener.document."+ this.gReturnItem + ".value=cValue;");

   if (submit_on_select)
      this.wwrite("self.opener.document."+this.gReturnItem+".form.submit();");

   this.wwrite("window.close();");

   this.wwrite("}");
   this.wwrite("</SCRIPT>");

	this.wwrite("<CENTER><TABLE WIDTH='100%' BORDER=0 CELLSPACING=0 CELLPADDING=0 ><TR>");

	this.wwrite("<TD><A TITLE=\""+cAltPrevYear+"\" CLASS=\"navbutton\" HREF=\"javascript:window.opener.Build(" +
		"'" + this.gReturnItem + "', '" + this.gMonth + "', '" + (parseInt(this.gYear)-1) + "', '" + this.gFormat +
		"');\"><IMG ALT=\""+cAltPrevYear+"\" SRC=\""+PrevYear+"\" WIDTH=\"24\" HEIGHT=\"24\" BORDER=\"0\"></A></TD>");

	this.wwrite("<TD><A TITLE=\""+cAltPrevMonth+"\" CLASS=\"navbutton\" HREF=\"javascript:window.opener.Build(" +
		"'" + this.gReturnItem + "', '" + prevMM + "', '" + prevYYYY + "', '" + this.gFormat +
		"');\"><IMG ALT=\""+cAltPrevMonth+"\" SRC=\""+PrevMonth+"\" WIDTH=\"24\" HEIGHT=\"24\" BORDER=\"0\"></A></TD>");

	this.wwrite("<TD><A TITLE=\""+cAltNextMonth+"\" CLASS=\"navbutton\" HREF=\"javascript:window.opener.Build(" +
		"'" + this.gReturnItem + "', '" + nextMM + "', '" + nextYYYY + "', '" + this.gFormat +
		"');\"><IMG ALT=\""+cAltNextMonth+"\" SRC=\""+NextMonth+"\" WIDTH=\"24\" HEIGHT=\"24\" BORDER=\"0\"></A></TD>");

	this.wwrite("<TD><A TITLE=\""+cAltNextYear+"\" CLASS=\"navbutton\" HREF=\"javascript:window.opener.Build(" +
		"'" + this.gReturnItem + "', '" + this.gMonth + "', '" + (parseInt(this.gYear)+1) + "', '" + this.gFormat +
		"');\"><IMG ALT=\""+cAltNextYear+"\" SRC=\""+NextYear+"\" WIDTH=\"24\" HEIGHT=\"24\" BORDER=\"0\"></A></TD></TR></TABLE><BR>");

   // this.wwrite("<SCRIPT LANGUAGE=\"JavaScript\">alert(document.URL);</SCRIPT>");

   // Get the complete calendar code for the month..

	this.wwrite(this.getMonthlyCalendarCode());

	this.wwrite("</CENTER></body></html>");
	this.gWinCal.document.close();
}

Calendar.prototype.showY = function() {
	var vCode = "";
	var i;
	var vr, vc, vx, vy;		// Row, Column, X-coord, Y-coord
	var vxf = 285;			// X-Factor
	var vyf = 200;			// Y-Factor
	var vxm = 10;			// X-margin
	var vym;				// Y-margin
	if (isIE)	vym = 75;
	else if (isNav)	vym = 25;

	this.gWinCal.document.open();

	this.wwrite("<html>");
	this.wwrite("<head><title>"+cTitle+"</title>");
	this.wwrite("<style type='text/css'>\n<!--");
	for (i=0; i<12; i++) {
		vc = i % 3;
		if (i>=0 && i<= 2)	vr = 0;
		if (i>=3 && i<= 5)	vr = 1;
		if (i>=6 && i<= 8)	vr = 2;
		if (i>=9 && i<= 11)	vr = 3;

		vx = parseInt(vxf * vc) + vxm;
		vy = parseInt(vyf * vr) + vym;

		this.wwrite(".lclass" + i + " {position:absolute;top:" + vy + ";left:" + vx + ";}");
	}
	this.wwrite("-->\n</style>");
	this.wwrite("</head>");

	this.wwrite("<body " +
		"link=\"" + this.gLinkColor + "\" " +
		"vlink=\"" + this.gLinkColor + "\" " +
		"alink=\"" + this.gLinkColor + "\" " +
		"text=\"" + this.gTextColor + "\">");
	this.wwrite("<FONT SIZE=2><B>");
	this.wwrite("Year : " + this.gYear);
	this.wwrite("</B><BR>");

	// Show navigation buttons
	var prevYYYY = parseInt(this.gYear) - 1;
	var nextYYYY = parseInt(this.gYear) + 1;

	this.wwrite("<TABLE WIDTH='100%' BORDER=1 CELLSPACING=0 CELLPADDING=0 BGCOLOR='#e0e0e0'><TR><TD ALIGN=center>");
	this.wwrite("[<A HREF=\"" +
		"javascript:window.opener.Build(" +
		"'" + this.gReturnItem + "', null, '" + prevYYYY + "', '" + this.gFormat + "'" +
		");" +
		"\" alt='Prev Year'><<<\/A>]</TD><TD ALIGN=center>");
	this.wwrite("[<A HREF=\"javascript:window.print();\">Print</A>]</TD><TD ALIGN=center>");
	this.wwrite("[<A HREF=\"" +
		"javascript:window.opener.Build(" +
		"'" + this.gReturnItem + "', null, '" + nextYYYY + "', '" + this.gFormat + "'" +
		");" +
		"\">>><\/A>]</TD></TR></TABLE><BR>");

	// Get the complete calendar code for each month..
	var j;
	for (i=11; i>=0; i--) {
		if (isIE)
			this.wwrite("<DIV ID=\"layer" + i + "\" CLASS=\"lclass" + i + "\">");
		else if (isNav)
			this.wwrite("<LAYER ID=\"layer" + i + "\" CLASS=\"lclass" + i + "\">");

		this.gMonth = i;
		this.gMonthName = Calendar.get_month(this.gMonth);
		vCode = this.getMonthlyCalendarCode();
		this.wwrite(this.gMonthName + "/" + this.gYear + "<BR>");
		this.wwrite(vCode);

		if (isIE)
			this.wwrite("</DIV>");
		else if (isNav)
			this.wwrite("</LAYER>");
	}

	this.wwrite("</font><BR></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 = "",i;

	vCode = "<TR>";
   for (i=0; i < 7; i++) {
      vCode=vCode+"<TH>"+DaysOfWeek[(i+StartDOW)%7]+"</TH>";
   }
	vCode = vCode + "</TR>\n";
	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 = "";
   var i,iColumn;

	/*
	Get day for the 1st of the requested month/year..
	Place as many blank cells before the 1st day of the month as necessary.
	*/
   iColumn=0
	vCode = "\n<TR>";


   if (vFirstDay!=StartDOW) {
      for (i=StartDOW; i != vFirstDay; ) {
         vCode = vCode + "<TD" + this.write_weekend_string(i) + "> </TD>";
         i++;
         if (i>6) {
            i=0;
         }
      }
   }
   for ( ; vDate.getMonth()==this.gMonth; ) {
      if ((vDate.getDay()==StartDOW) && (vDate.getDate()!=1)) {
         iColumn=0;
         vCode=vCode+"</TR><TR>\n"
         }
      iColumn++;
      vCode = vCode + "<TD" + this.write_weekend_string(vDate.getDay()) + ">" +
         "<A HREF=\"JavaScript: setItAndQuit('" +
            this.format_data(vDate.getDate()) +
            "');\">" +
         this.format_day(vDate.getDate()) +
         "</A>" +
         "</TD>";

      vDate.setTime(vDate.getTime()+86400000);
   }

   if (vDate.getDay()!=StartDOW) {
      iDay=vDate.getDay();
      for (i=iColumn; i < 7; i++,iDay++ ) {
         vCode = vCode + "<TD" + this.write_weekend_string(iDay%7) + "> </TD>";
      }
   }
   vCode=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 ("<FONT COLOR=\"RED\"><B>" + vday + "</B></FONT>");
	else
		return (vday);
}

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

	// Return special formatting for the weekend day.
	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 (PartOrder) {
      case "DMY":
      vData=vDD+DateSep+vMonth+DateSep+vY4;
      break;
   case "YMD":
      vData=vY4+DateSep+vMonth+DateSep+vDD;
      break;
   default:    // Intentional Fall through...
   case "MDY":
         vData=vMonth+DateSep+vDD+DateSep+vY4;
         break;
   }

   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
	if (gCal.gYearly)
		gCal.showY();
	else
		gCal.show();
}

function show_calendar() {
	/*
		p_item	: Return Item.
		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_submit: submit form on select
	*/

	p_item = arguments[0];
	var sValue;
    // Fix from David Brown @ EESUS, J&J
        if (arguments[1]!=null)
                if (arguments[1].length==0)
                        arguments[1]=null;
                else if (isNaN(Date.parse(arguments[1]))) {
                        arguments[1] = null;
                }
/*
	if (arguments[1]!=null)
		if (arguments[1].length==0)
			arguments[1]=null;
*/
	sValue=arguments[1];

	if (sValue!=null && sValue.length==10) {
		var iMonth;
      switch (PartOrder){
      case 'DMY':
         p_month=new String(sValue.substr(3,2));
         p_year=new String(sValue.substr(6,4));
         break;
      case 'YMD':
         p_month=new String(sValue.substr(5,2));
         p_year=new String(sValue.substr(0,4));
         break;
      case 'MDY':
      default:
         p_month=new String(sValue.substr(0,2));
         p_year=new String(sValue.substr(6,4));
         break;
      }
      iMonth=p_month-1;
      p_month=""+iMonth;
	}
	else {
		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 = "MM/DD/YYYY";
	else
		p_format = arguments[3];

   if (arguments[4] != null) {
      submit_on_select=arguments[4]
   }
	vWinCal = window.open("", "Calendar_"+(new Date().getTime()),
		"width=250,height=238,status=no,resizable=no,top=200,left=200");
	vWinCal.opener = self;
	ggWinCal = vWinCal;

	Build(p_item, p_month, p_year, p_format);
}
/*
Yearly Calendar Code Starts here
*/
function show_yearly_calendar(p_item, p_year, p_format) {
	// Load the defaults..
	if (p_year == null || p_year == "")
		p_year = new String(gNow.getFullYear().toString());
	if (p_format == null || p_format == "")
		p_format = "MM/DD/YYYY";

	var vWinCal = window.open("", "Calendar", "scrollbars=yes");
	vWinCal.opener = self;
	ggWinCal = vWinCal;

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

function AddDate( txtArea, newValue){
	if (newValue!=null)
		if (newValue.length > 0)
			if (txtArea.value.length==0)
				txtArea.value=newValue;
			else
				txtArea.value=txtArea.value+"\n"+newValue;
}
