function name_values(instring) {
	var vars = new Array();
	rc = "\235";
	instring = instring.replace(/\\\;/g, rc);

	var pattern = /[a-zA-Z0-9]+\=[\/:#a-zA-Z0-9\-\+\. \235]+/gi;
	var y = instring.match(pattern);
	for (i=0; i<y.length; i++) {
		var s = y[i].split("=");
		s[1] = s[1].replace(rc, ";");
		vars[i] = "v_" + s[0];
		eval(vars[i] + " = '" + s[1] + "'");
	}
	return vars;
}

var onClickFnCode = "";
var orig_onClickFnCode = "";


function onClickFn(pday) {
	var re = /pday/;
	onClickFnCode = orig_onClickFnCode;
	onClickFnCode = onClickFnCode.replace(re, "'" + pday + "'");
	eval(onClickFnCode);
}

function Today() {
	var d = new Date();
	return ((d.getMonth() + 1) + "/" + d.getDate() + "/" + d.getFullYear());
}

function dateAdd(indt, days, sign) {
	var d = new Date(indt);
	var dv = d.valueOf();
	var ndv;
	if (sign == "+")
		ndv = dv + (days*(1000*60*60*24));
	else
		ndv = dv - (days*(1000*60*60*24));
	var nd = new Date(ndv);
	return ((nd.getMonth() + 1) + "/" + nd.getDate() + "/" + nd.getFullYear());
}

function processDateData(vInputData) {
	var m;
	var td = Today();
	var ree = new RegExp("(Today)(([\\+\\-])([0-9]+))?", "i");
	if ((m = vInputData.match(ree)) != null) {
		if (m[1].toUpperCase() == "TODAY" && m[0].length > 5)
			return dateAdd(td, m[4], m[3]);
		else if (m[1].toUpperCase() == "TODAY")
			return td;
	} else
		return vInputData;
}


var v_CloseOnSelect, v_AppendOrReplace, v_AppendChar, v_ReturnData;
var v_InlineX, v_InlineY, v_Title, v_CurrentDate, v_AllowWeekends;
var v_Resizable, v_Width, v_Height, v_SelectAfter, v_NSHierarchy;
var v_SelectBefore, v_CallFunction, v_PopupX, v_PopupY;
var v_Nav, v_SmartNav, v_Fix;

var weekend = [0,6];
var weekendColor = "#e0e0e0";
var fontface = "Courier New";
var fontsize = 2;

var gNow = new Date();
var ggWinCal;			


var theLayer;
var theLayerStyle;		

var currX, currY;
var cx, cy;		
var x, y;		
var incrX, incrY;

var mDown, mUp;
// ----------- VARIABLE DECLARATIONS END -----------


isNav = (navigator.appName.indexOf("Netscape") != -1) ? true : false;
isIE = (navigator.appName.indexOf("Microsoft") != -1) ? true : false;
isDOM = (document.getElementById) ? true : false;


Calendar.Months = ["January", "February", "March", "April", "May", "June",
	"July", "August", "September", "October", "November", "December"];

Calendar.EMonths = ["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];
Calendar.DOW = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
Calendar.count = 0;


Calendar.gInitText = "Softricks.com Calendar";

function Calendar(p_item, p_WinCal, p_month, p_year, p_format, p_type) {



	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;
	}
	
	if (p_type == null)
		this.gType = "POPUP";		
	else
		this.gType = p_type;

	if (this.gType == "INLINE") {
		this.WHO = "";
		this.INLINE = "Calendar";	
		this.codeINLINE = "";		
	} else
		this.WHO = "window.opener.";

	this.gYear = p_year;
	this.gFormat = p_format;
	this.gBGColor = "white";
	this.gFGColor = "black";
	this.gTextColor = "black";
	this.gHeaderColor = "black";
	this.gReturnItem = p_item;
	this.gTitle = "Softricks.com Calendar";
}

Calendar.get_month = Calendar_get_month;
Calendar.get_daysofmonth = Calendar_get_daysofmonth;
Calendar.get_dow = Calendar_get_dow;
Calendar.calc_month_year = Calendar_calc_month_year;
Calendar.print = Calendar_print;
Calendar.CreateCalendarLayer = Calendar_CreateCalendarLayer;
Calendar.Close = Calendar_Close;
Calendar.Lwwrite = Calendar_Lwwrite;
Calendar.MoveTo = Calendar_MoveTo;
Calendar.isWeekend = Calendar_isWeekend;

function Calendar_get_month(monthNo, pLanguage) {
if (!pLanguage || pLanguage=="E")
	return Calendar.EMonths[monthNo];
else
	return Calendar.Months[monthNo];
}

function Calendar_get_dow(dayNo) {
	return Calendar.DOW[dayNo];
}

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) {
		// 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();
}

function Calendar_isWeekend(pday) {
	var i;

	for (i=0; i<weekend.length; i++) {
		if (pday == weekend[i])
			return true;
	}
	return false;
}


new Calendar();

Calendar.prototype.getMonthlyCalendarCode = function() {
	var vCode = "";
	var vHeader_Code = "";
	var vData_Code = "";


	vCode = vCode + "<TABLE WIDTH='237' BORDER=1 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.onclickfn = function() {
	// This should return the code string for the onclickfn in the calendar document.
	
	// This is the reference to the return object
	// window.opener.document. / window.document. ... .value
	var whois = this.WHO + 
				((this.gType == "POPUP") ? 
				"document." + v_NSHierarchy : 
				"window.document." + v_NSHierarchy) + 
				this.gReturnItem + ".value";

	// apchar will turn out to be either " = " or " += ''" or " += ';'"
	var apchar = (this.returnMode == "Replace") ? " = " : " += ";

	var retCode = "apchar = ''" +
					((this.returnMode == "Replace") ? ";" : " + ") +
					"((" + whois + " == '') ? '' : '" + this.appendChar + "');\n" +
				whois + apchar + "apchar + pday;\n";

	return retCode;
}

Calendar.prototype.showSmartNavBar = function() {
	var selcalendar = "<table border=1><tr><td valign=top>";
	
	selcalendar += "<select name='selMonth' onchange=\"" + 
		this.WHO + "Build(" + 
		"'" + this.gReturnItem + "', document.frmCal.selMonth.selectedIndex, '" +  
		this.gYear + "', '" + this.gFormat + "', '" + this.gType + "');\">\n";

	selcalendar +=	"<option value=\"0\"";
	if (this.gMonth == 0) 
	{ selcalendar += "selected"; } 
	selcalendar += ">January</option>\n";

	selcalendar +=	"<option value=\"1\"";
	if (this.gMonth == 1) 
	{ selcalendar += "selected"; } 
	selcalendar += ">February</option>\n";

	selcalendar +=	"<option value=\"2\"";
	if (this.gMonth == 2) 
	{ selcalendar += "selected"; } 
	selcalendar += ">March</option>\n";

	selcalendar +=	"<option value=\"3\"";
	if (this.gMonth == 3) 
	{ selcalendar += "selected"; } 
	selcalendar += ">April</option>\n";

	selcalendar +=	"<option value=\"4\"";
	if (this.gMonth == 4) 
	{ selcalendar += "selected"; } 
	selcalendar += ">May</option>\n";

	selcalendar +=	"<option value=\"5\"";
	if (this.gMonth == 5) 
	{ selcalendar += "selected"; } 
	selcalendar += ">June</option>\n";

	selcalendar +=	"<option value=\"6\"";
	if (this.gMonth == 6) 
	{ selcalendar += "selected"; } 
	selcalendar += ">July</option>\n";

	selcalendar +=	"<option value=\"7\"";
	if (this.gMonth == 7) 
	{ selcalendar += "selected"; } 
	selcalendar += ">August</option>\n";

	selcalendar +=	"<option value=\"8\"";
	if (this.gMonth == 8) 
	{ selcalendar += "selected"; } 
	selcalendar += ">September</option>\n";

	selcalendar +=	"<option value=\"9\"";
	if (this.gMonth == 9) 
	{ selcalendar += "selected"; } 
	selcalendar += ">October</option>\n";

	selcalendar +=	"<option value=\"10\"";
	if (this.gMonth == 10) 
	{ selcalendar += "selected"; } 
	selcalendar += ">November</option>\n";

	selcalendar +=	"<option value=\"11\"";
	if (this.gMonth == 11) 
	{ selcalendar += "selected"; } 
	selcalendar += ">December</option>\n";
	selcalendar +=	"<\/select>\n</td><td valign=top>";

	selcalendar += "<input name=\"cy\" size=4 maxlength=4 value=\"" + this.gYear + "\" onchange=\"" +
		"javascript:" + this.WHO + "Build(" + 
		"'" + this.gReturnItem + "', '" + this.gMonth + 
		"', document.frmCal.cy.value, '" + this.gFormat + "', '" + this.gType + "');\">\n"; 
	selcalendar += "</td></tr></table>";
	this.wwrite(selcalendar);
}

Calendar.prototype.show = function() {
	var vCode = "";

	if (this.gType == "POPUP")
		this.gWinCal.document.open();

	// Setup the page...
	this.wwrite("<html>");
	this.wwrite("<head><title>Calendar</title>");
	
	if (this.gType == "POPUP")
		this.wwrite("<script language='javascript'>" + 
			"function onClickFn(pday) {\n" +
			this.onclickfn() + "}\n<\/script>");
	else
		orig_onClickFnCode = this.onclickfn();

	this.wwrite("</head>");

	this.wwrite("<body " + 
			"link=\"" + this.gLinkColor + "\" " + 
			"vlink=\"" + this.gLinkColor + "\" " +
			"alink=\"" + this.gLinkColor + "\" " +
			"text=\"" + this.gTextColor + "\" LANGUAGE=javascript onload=\"window.focus();\">");
	
	// For Smart navigation
	if (v_SmartNav == "Yes")
		this.wwrite("<form name=\"frmCal\" onsubmit=\"return false;\">");

	this.wwrite("<TABLE WIDTH='237' BORDER=0 CELLPADDING=0 BGCOLOR='#000099'><TR><TD>" +  
		"<TABLE BORDER=0 WIDTH='100%' CELLPADDING=1 BGCOLOR='#B7B7C7'>" +  
		"<TR><TD BGCOLOR='#000099'>" + 
		"<FONT COLOR=white FACE='" + fontface + "' SIZE=2><B>" + this.gTitle + "</B></FONT>" + 
		"</TD><TD BGCOLOR='#000099' ALIGN=RIGHT>" + 
		"<FONT COLOR=white FACE='" + fontface + "' SIZE=2><B>" + 
		"<A HREF='javascript:" +
		this.WHO + "Calendar.Close(\"" + this.gType + "\", \"" + this.INLINE + "\");' " +
		"STYLE='color:white'>" + 
		"x</A></B></FONT></TD></TR><TR>");
	 
	this.wwrite("<TD BGCOLOR='#B7B7C7'>");
	this.wwriteA("<FONT FACE='" + fontface + "' SIZE=2><B>");
	this.wwriteA(this.gMonthName + " " + this.gYear);
	this.wwriteA("</B></TD>");
	
	// Code to let users fix the calendar or let it move
	this.wwriteA("<TD BGCOLOR='#B7B7C7' ALIGN=RIGHT>" +
		"<FONT FACE='" + fontface + "' SIZE=2><B>" + 
		"Fix" + 
		"<INPUT TYPE=CHECKBOX NAME=fixCheck " + 
		((v_Fix == "Yes") ? "CHECKED " : "") + 
		"onClick=\"" + 
		((this.gType == "POPUP") ? "alert('Fixing Window')" : "fixCal(this.checked);") + 
		"\"></B></FONT>" + 
		"</TD></TR><TR><TD COLSPAN=2>");

	if (v_SmartNav == "Yes")
		this.showSmartNavBar();
	
	// 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];

	if (v_Nav == "Yes") {
		this.wwrite("<TABLE BORDER=1 CELLSPACING=0 CELLPADDING=0 BGCOLOR='#e0e0e0'><TR><TD ALIGN=center>");

		this.wwrite("<FONT COLOR=black FACE='" + fontface + "' SIZE=2>" + 
				"[<A HREF=\"" +
				"javascript:" + this.WHO + "Build(" + 
				"'" + this.gReturnItem + "', '" + this.gMonth + "', '" + (parseInt(this.gYear)-1) + "', '" + this.gFormat + "', '" + this.gType + "'" + 
				");\"><<<\/A>]</FONT></TD><TD ALIGN=center>");
		this.wwrite("<FONT COLOR=black FACE='" + fontface + "' SIZE=2>" + 
				"[<A HREF=\"" +
				"javascript:" + this.WHO + "Build(" + 
				"'" + this.gReturnItem + "', '" + prevMM + "', '" + prevYYYY + "', '" + this.gFormat + "', '" + this.gType + "'" + 
				");\"><<\/A>]</FONT></TD><TD ALIGN=center>");
		this.wwrite("<FONT COLOR=black FACE='" + fontface + "' SIZE=2>" + 
				"[<A HREF=\"javascript:window.print();\">" + 
				"Print</A>]</FONT></TD><TD ALIGN=center>");
		this.wwrite("<FONT COLOR=black FACE='" + fontface + "' SIZE=2>" + 
				"[<A HREF=\"" +
				"javascript:" + this.WHO + "Build(" + 
				"'" + this.gReturnItem + "', '" + gNow.getMonth() + "', '" + gNow.getFullYear() + "', '" + this.gFormat + "', '" + this.gType + "'" + 
				");\">Today<\/A>]</FONT></TD><TD ALIGN=center>");
		this.wwrite("<FONT COLOR=black FACE='" + fontface + "' SIZE=2>" + 
				"[<A HREF=\"" +
				"javascript:" + this.WHO + "Build(" + 
				"'" + this.gReturnItem + "', '" + nextMM + "', '" + nextYYYY + "', '" + this.gFormat + "', '" + this.gType + "'" + 
				");\">><\/A>]</FONT></TD><TD ALIGN=center>");
		this.wwrite("<FONT COLOR=black FACE='" + fontface + "' SIZE=2>" + 
				"[<A HREF=\"" +
				"javascript:" + this.WHO + "Build(" + 
				"'" + this.gReturnItem + "', '" + this.gMonth + "', '" + (parseInt(this.gYear)+1) + "', '" + this.gFormat + "', '" + this.gType + "'" + 
				");\">>><\/A>]</FONT></TD></TR></TABLE>");
	}

	// Get the complete calendar code for the month..
	vCode = this.getMonthlyCalendarCode();
	this.wwrite(vCode);

	this.wwrite("</TD></TR></TABLE></TD></TR></TABLE>");

	// For Smart navigation
	if (v_SmartNav == "Yes")
		this.wwrite("</form>");

	this.wwrite("</font></body></html>");
	
	if (this.gType == "POPUP")
		this.gWinCal.document.close();
		
	if (this.gType == "INLINE")
		Calendar.Lwwrite(this.codeINLINE, this.INLINE);
}

function Calendar_Close(pType, pINLINE) {
	if (pType == "POPUP")
		ggWinCal.close();
	if (pType == "INLINE")
		Calendar.Lwwrite(Calendar.gInitText, pINLINE)
	
	ggWinCal = null;
}

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 (isDOM)	vym = 25;
	else if (isNav)	vym = 25;

	this.gWinCal.document.open();

	this.wwrite("<html>");
	this.wwrite("<head><title>Calendar</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>");

	if (this.gType == "POPUP")
		this.wwrite("<script language='javascript'>" + 
			"function onClickFn(pday) {\n" +
			this.onclickfn() + "}\n<\/script>");
	else
		orig_onClickFnCode = this.onclickfn();

	this.wwrite("</head>");

	this.wwrite("<FONT FACE='" + fontface + "' 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 (isDOM)
			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 (isDOM)
			this.wwrite("</DIV>");
		else if (isNav)
			this.wwrite("</LAYER>");
	}

	this.wwrite("</font><BR></body></html>");
	this.gWinCal.document.close();
}


Calendar.prototype.cal_header = function() {
	var vCode = "";

	vCode = vCode + "<TR>";
	vCode = vCode + "<TD WIDTH='14%'><FONT SIZE='2' FACE='" + fontface + "' COLOR='" + this.gHeaderColor + "'><B>Sun</B></FONT></TD>";
	vCode = vCode + "<TD WIDTH='14%'><FONT SIZE='2' FACE='" + fontface + "' COLOR='" + this.gHeaderColor + "'><B>Mon</B></FONT></TD>";
	vCode = vCode + "<TD WIDTH='14%'><FONT SIZE='2' FACE='" + fontface + "' COLOR='" + this.gHeaderColor + "'><B>Tue</B></FONT></TD>";
	vCode = vCode + "<TD WIDTH='14%'><FONT SIZE='2' FACE='" + fontface + "' COLOR='" + this.gHeaderColor + "'><B>Wed</B></FONT></TD>";
	vCode = vCode + "<TD WIDTH='14%'><FONT SIZE='2' FACE='" + fontface + "' COLOR='" + this.gHeaderColor + "'><B>Thu</B></FONT></TD>";
	vCode = vCode + "<TD WIDTH='14%'><FONT SIZE='2' FACE='" + fontface + "' COLOR='" + this.gHeaderColor + "'><B>Fri</B></FONT></TD>";
	vCode = vCode + "<TD WIDTH='16%'><FONT SIZE='2' FACE='" + fontface + "' COLOR='" + this.gHeaderColor + "'><B>Sat</B></FONT></TD>";
	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 = "";
	
	var linkText = "";
	var linkCloseText = "";

	/*
	Get day for the 1st of the requested month/year..
	Place as many blank cells before the 1st day of the month as necessary. 
	*/
	vCode = vCode + "<TR>";
	for (i=0; i<vFirstDay; i++) {
			vCode = vCode + "<TD WIDTH='14%'" + this.write_weekend_string(i) + "><FONT SIZE='2' FACE='" + fontface + "'>&nbsp;</FONT></TD>";
	}

	// If closeable...
	if (this.closeable) {
		closecodeP = ((this.gType=="POPUP") ? "window.close();" : "");
		closecodeI = "Calendar.Close(\"" + this.gType + "\", \"" + this.INLINE + "\"); ";
	} else {
		closecodeP = "";
		closecodeI = "void(0);' ";
	}

	var whois = this.WHO + 
				((this.gType == "POPUP") ? "document." : "window.document.") + 
				this.gReturnItem + ".value";

	// Write rest of the 1st week
	for (j=vFirstDay; j<7; j++) {
		vDate.setDate(vDay);
		if ((this.gAllowWeekends == "No" && Calendar.isWeekend(j)) || 
			(vDate < v_SelectAfter || vDate > v_SelectBefore)) {
					linkText = "";
					linkCloseText = "";
		} else {
			linkText = "<A HREF='javascript:" + closecodeI + "' " +
				"onClick=\"onClickFn('" + 
				
				((this.returnData == "Date") ? 
				this.format_data(vDay) : this.format_dow(vDay)) + 
				
				"');" + 
				((this.CallFunction != "") ? (this.WHO + this.CallFunction + "();") : "") +
				closecodeP +
				"return true;" + 
				"\">";
			linkCloseText = "<\/A>";
		}

		vCode = vCode + "<TD WIDTH='14%'" + this.write_weekend_string(j) + 
				"><FONT SIZE='2' FACE='" + fontface + "'>" + 
				linkText + 
				this.format_day(vDay) + 
				linkCloseText + 
				"</FONT></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++) {
			vDate.setDate(vDay);
			if ((this.gAllowWeekends == "No" && Calendar.isWeekend(j)) || 
				(vDate < v_SelectAfter || vDate > v_SelectBefore)) {
					linkText = "";
					linkCloseText = "";
			} else {
				linkText = "<A HREF='javascript:" + closecodeI + "' " +
					"onClick=\"onClickFn('" + 
				
					((this.returnData == "Date") ? 
					this.format_data(vDay) : this.format_dow(vDay)) + 
				
					"');" + 
					((this.CallFunction != "") ? (this.WHO + this.CallFunction + "();") : "") +
					closecodeP +
					"return true;" + 
					"\">";
				linkCloseText = "<\/A>";
			}

			vCode = vCode + "<TD WIDTH='14%'" + this.write_weekend_string(j) + 
					"><FONT SIZE='2' FACE='" + fontface + "'>" + 
					linkText + 
					this.format_day(vDay) + 
					linkCloseText + 
					"</FONT></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++) {
		if (this.gYearly)
			vCode = vCode + "<TD WIDTH='14%'" + this.write_weekend_string(j+m) + 
				"><FONT SIZE='2' FACE='" + fontface + "' COLOR='gray'>&nbsp;</FONT></TD>";
		else
			vCode = 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 highDate;
	if (this.gCurrentDate != "NONE")
		highDate = this.gCurrentDate;
	else
		highDate = gNow;

	var vNowDay = highDate.getDate();
	var vNowMonth = highDate.getMonth();
	var vNowYear = highDate.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.
	if (Calendar.isWeekend(vday))
		return (" BGCOLOR=\"" + weekendColor + "\"");

	return "";
}

Calendar.prototype.format_data = function(p_day) {
	// Supports any format consisting of 'DD/YY/YYYY/MM/MON/MONTH/DOW'
	var vData = this.gFormat;
	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;
	var vDOW = Calendar.get_dow((new Date(vMonth + "/" + vDD + "/" + vY4)).getDay());

	if ((new RegExp("YYYY", "ig")).test(vData))
		vData = vData.replace(/YYYY/ig, vY4);
	else if ((new RegExp("YY", "ig")).test(vData))
		vData = vData.replace(/YY/ig, vY2);
	if ((new RegExp("DD", "ig")).test(vData))
		vData = vData.replace(/DD/ig, vDD);
	if ((new RegExp("MM", "ig")).test(vData))
		vData = vData.replace(/MM/ig, vMonth);
	if ((new RegExp("MONTH", "ig")).test(vData))
		vData = vData.replace(/MONTH/ig, vFMon);
	else if ((new RegExp("MON", "ig")).test(vData))
		vData = vData.replace(/MON/ig, vMon);
	if ((new RegExp("DOW", "ig")).test(vData))
		vData = vData.replace(/DOW/ig, vDOW);

	return vData;
}

Calendar.prototype.format_dow = 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 vDD = (p_day.toString().length < 2) ? "0" + p_day : p_day;

	var vDate = new Date(vMonth + "\/" + vDD + "\/" + vY4);
	vData = Calendar.get_dow(vDate.getDay());
	
	return vData;
}

/*
Calendar Writing Functions
*/
Calendar.prototype.wwrite = function(wtext) {
	if (this.gType == "POPUP")
		this.gWinCal.document.writeln(wtext);
	else {
		// Keep adding to the codeINLINE variable.
		this.codeINLINE += wtext;
	}
}

Calendar.prototype.wwriteA = function(wtext) {
	if (this.gType == "POPUP")
		this.gWinCal.document.write(wtext);
	else {
		// Keep adding to the codeINLINE variable.
		this.codeINLINE += wtext;
	}
}

function Calendar_CreateCalendarLayer(pLeft, pTop, pInitText) {
	/* IMPORTANT : 
	If you use relative positioning of this layer, use LAYER Tag for Netscape.
	If you want absolute positioning, use DIV tag for Netscape.
	*/
	if (pInitText == null)
		pInitText = Calendar.gInitText;
	else
		Calendar.gInitText = pInitText;

	v_InlineX = pLeft;
	v_InlineY = pTop;

	var Calendar_ID = "Calendar";

	if (isIE)
		document.writeln("<DIV ID=\"" + Calendar_ID + "\" STYLE=\"" + 
		"position:absolute;top:" + pTop + ";left:" + pLeft + ";" + 
		"\">" + pInitText + "<\/DIV>");
	else if (isDOM)
		document.writeln("<DIV ID=\"" + Calendar_ID + "\" STYLE=\"" + 
		"position:absolute;top:" + pTop + ";left:" + pLeft + ";" + 
		"\">" + pInitText + "<\/DIV>");
	else if (isNav)
		document.writeln("<DIV ID=\"" + Calendar_ID + "\" STYLE=\"" + 
		"position:absolute;top:" + pTop + ";left:" + pLeft + ";" + 
		"\">" + pInitText + "<\/DIV>");
}

function Calendar_Lwwrite(pText, pINLINE) {
	if (isIE) {
		document.all[pINLINE].innerHTML = pText;
	} else if (isDOM) {
		rng = document.createRange();
		el = document.getElementById(pINLINE);
		rng.setStartBefore(el);
		htmlFrag = rng.createContextualFragment(pText)
		while(el.hasChildNodes()) el.removeChild(el.lastChild);
		el.appendChild(htmlFrag);
	} else if (isNav) {
		var lyr = document.layers[pINLINE].document;
		lyr.open();
		lyr.write(pText);
		lyr.close();
	}
}

function Calendar_MoveTo(pX, pY, pINLINE) {
	if (isIE) {
		document.all[pINLINE].style.top = pY;
		document.all[pINLINE].style.left = pX;
	} else if (isDOM) {
		document.getElementById(pINLINE).style.top = pY;
		document.getElementById(pINLINE).style.left = pX;
	} else if (isNav) {
		document.layers[pINLINE].top = pY;
		document.layers[pINLINE].left = pX;
	}
}
/* ******************************************************************************* */
/*
Drag-n-Drop and Other Event-Handling Functions
*/
mDown = false;
mUp = false;

function fixCal(chkd) {
	if (chkd)
		initEvents(0);
	else
		initEvents(1);
}

function click(e) {
	x = (isIE) ? (event.x + document.body.scrollLeft) : e.pageX;
	y = (isIE) ? (event.y + document.body.scrollTop) : e.pageY;
	cx = (isIE) ? (x - parseInt(theCSSLayer.left)) : 
		((isDOM) ? (x - parseInt(theCSSLayer.left)) : (x - theLayer.x));
	cy = (isIE) ? (y - parseInt(theCSSLayer.top)) : 
		((isDOM) ? (y - parseInt(theCSSLayer.top)) : (y - theLayer.y));
	
	mUp = false;
	mDown = true;
}

function unclick(e) {
	mUp = true;
	mDown = false;
}

function handleMove(e) {
	currX = (isIE) ? (event.x + document.body.scrollLeft) : e.pageX;
	currY = (isIE) ? (event.y + document.body.scrollTop) : e.pageY;

	// If it is dragging, move the layer by the same shift..
	if (mDown) {
		window.status = "DRAGGGGGG : X=" + (currX-cx) + ", Y=" + (currY-cy);
		v_InlineX = currX - cx;
		v_InlineY = currY - cy;
		MoveLayer(currX - cx, currY - cy, "myLayer");
	} else
		window.status = "X=" + currX + ", Y=" + currY;
}

function initEvents(able) {
	if (able == 1) {
		if (isNav && !isDOM) {
			theLayer.captureEvents(Event.MOUSEDOWN | Event.MOUSEUP | Event.MOUSEMOVE);
		}

		if (isDOM && isNav) {
			theLayer.addEventListener("mousemove", handleMove, true);
			theLayer.addEventListener("mousedown", click, true);
			theLayer.addEventListener("mouseup", unclick, true);
		} else {
			// Assign handlers for mouse activity
			theLayer.onmousemove = handleMove;
			theLayer.onmousedown = click;
			theLayer.onmouseup = unclick;
		}
	} else {
		if (isNav && !isDOM) {
			theLayer.releaseEvents(Event.MOUSEDOWN | Event.MOUSEUP | Event.MOUSEMOVE);
		}

		if (isDOM && isNav) {
			theLayer.removeEventListener("mousemove", handleMove, true);
			theLayer.removeEventListener("mousedown", click, true);
			theLayer.removeEventListener("mouseup", unclick, true);
		} else {
			// Release handlers for mouse activity
			theLayer.onmousemove = "";
			theLayer.onmousedown = "";
			theLayer.onmouseup = "";
		}
	}
}

function MoveLayer(pX, pY) {
	theCSSLayer.top = pY;
	theCSSLayer.left = pX;
}

function drag_init(Leyer) {
	if (isIE) {
		theCSSLayer = document.all[Leyer].style;
		theLayer = document.all[Leyer];
	} else if (isDOM) {
		theCSSLayer = document.getElementById(Leyer).style;
		theLayer = document.getElementById(Leyer);
	} else if (isNav) {
		theCSSLayer = document.layers[Leyer];
		theLayer = document.layers[Leyer];
	}

	if (v_Fix == "Yes")
		initEvents(0);
	else
		initEvents(1);
}

function CalResize() {
	// Store these values 
	// so that subsequent calendar windows keep the same settings.
	v_Height = ggWinCal.innerHeight;
	v_Width = ggWinCal.innerWidth;
}

/* ******************************************************************************* */
/*
Calendar Build Function
*/
function Build(p_item, p_month, p_year, p_format, p_type, p_custom) {
	// Read Custom parameters from the custom string here..
	if (p_custom && p_custom != "") {
		// Reset the name/value variables 
		// which should not be carried forward to the next calendar..
		v_CurrentDate = "";
		p_month = (p_month && p_month != "") ? p_month : (new Date()).getMonth();
		p_year = (p_year && p_year != "") ? p_year : (new Date()).getFullYear().toString();
		
		var vvars = name_values(p_custom);
	} else
		v_CurrentDate = "";

	// If the current date is specified, 
	// split it & send it to the calendar...
	var vCurrentDate;
	if (v_CurrentDate && v_CurrentDate != "") {
		vCurrentDate = new Date(processDateData(v_CurrentDate));
		p_month = vCurrentDate.getMonth();
		p_year = vCurrentDate.getFullYear().toString();
	} else
		vCurrentDate = "NONE";


	v_Resizable = (v_Resizable && v_Resizable != "") ? v_Resizable : "No";
	v_SelectAfter = (typeof v_SelectAfter == "string") ? 
			new Date(processDateData(v_SelectAfter)) :
			v_SelectAfter;
	v_SelectBefore = (typeof v_SelectBefore == "string") ?
			new Date(processDateData(v_SelectBefore)) :
			v_SelectBefore;
	v_NSHierarchy = isNav ? 
					((v_NSHierarchy && v_NSHierarchy != "") ? (v_NSHierarchy + ".document.") : "")
					: "";
	v_CallFunction = (v_CallFunction && v_CallFunction != "") ? v_CallFunction : "";
	v_Nav = (v_Nav && v_Nav != "") ? v_Nav : "Yes";
	v_SmartNav = (v_SmartNav && v_SmartNav != "") ? v_SmartNav : "No";
	v_Fix = (v_Fix && v_Fix != "") ? v_Fix : "Yes";

	var vHeight, vWidth;
	if (p_type == "POPUP") {
		vWidth = (v_Width && v_Width != "") ? v_Width : 260;
		
		if (isIE) vHeight = (v_Height && v_Height != "") ? v_Height : 250;
		else if (isNav) vHeight = (v_Height && v_Height != "") ? v_Height : 250;
		if (v_SmartNav == "Yes")
			vHeight += 30;

		v_PopupX = v_PopupX ? v_PopupX : -1;
		v_PopupY = v_PopupY ? v_PopupY : -1;
		
		if (v_PopupX >= 0 && v_PopupY >= 0) {
			if (!ggWinCal)
				ggWinCal = window.open("", "Calendar", 
					"width=" + vWidth + ",height=" + vHeight + 
					",status=no,resizable=" + v_Resizable +
					",screenX=" + v_PopupX + ",screenY=" + v_PopupY +
					",left=" + v_PopupX + ",top=" + v_PopupY);
		} else {
			if (!ggWinCal)
				ggWinCal = window.open("", "Calendar", 
					"width=" + vWidth + ",height=" + vHeight + 
					",status=no,resizable=" + v_Resizable);
		}

		ggWinCal.opener = self;
		var p_WinCal = ggWinCal;

		if (isNav) ggWinCal.captureEvents(Event.RESIZE);
		ggWinCal.onresize = CalResize;
	}

	gCal = new Calendar(p_item, p_WinCal, p_month, p_year, p_format, p_type);

	gCal.gCurrentDate = vCurrentDate;
	gCal.gAllowWeekends = 
		(v_AllowWeekends && v_AllowWeekends != "" &&  
		v_AllowWeekends == "Yes") ? "Yes" : "No";

	// ############ CUSTOMIZE #############
	// Customize your Calendar here..
	gCal.gBGColor="white";
	gCal.gLinkColor="black";
	gCal.gTextColor="black";
	gCal.gHeaderColor="darkgreen";
	
	gCal.closeable = v_CloseOnSelect ? 
		((v_CloseOnSelect == "Yes") ? true : false)
		: false;

	gCal.returnMode = v_AppendOrReplace ?
		v_AppendOrReplace : "Replace";

	gCal.returnData = v_ReturnData ?
		v_ReturnData : "Date";

	// Character to be added For Append mode
	gCal.appendChar = (gCal.returnMode == "Append") ?
		v_AppendChar ? v_AppendChar : ";" 
		: "";

	gCal.CallFunction = v_CallFunction ? v_CallFunction : "";

	// Position for INLINE Calendar
	// It either comes from the Calendar_CreateCalendarLayer function or 
	// from the 
	gCal.InlineX = v_InlineX ? v_InlineX : 100;
	gCal.InlineY = v_InlineY ? v_InlineY : 100;

	// Re-position INLINE Calendar now
	if (gCal.gType == "INLINE") {
		Calendar.MoveTo(gCal.InlineX, gCal.InlineY, gCal.INLINE);
	}

	gCal.gTitle = v_Title ? v_Title : gCal.gMonthName + "/" + gCal.gYear;
	// ############ CUSTOMIZE #############

	// Choose appropriate show function
	if (gCal.gYearly)	gCal.showY();
	else gCal.show();

	if (gCal.gType == "INLINE") {
		// Initialize INLINE Calendar for drag-n-drop functionality
		drag_init(gCal.INLINE);
	}
}

/* ******************************************************************************* */
/*
Monthly Calendar Code Starts here
*/
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_type	: POPUP/INLINE Calendar
		p_custom: String of customizable name/value pair parameters
					v_CloseOnSelect
					v_AppendOrReplace
					v_AppendChar
					v_ReturnData
					v_InlineX
					v_InlineY
					v_Title
					v_CurrentDate
					v_AllowWeekends
					v_Height
					v_Width
					v_Resizable
					v_SelectAfter
					v_NSHierarchy	: If the form calling calendar is in a layer
										(reqd only for Netscape)
					v_SelectBefore
					v_CallFunction	: Name of the void function to be called
										after the date is populated
										in the return item
					v_PopupX
					v_PopupY
					v_Nav		: Yes/No for Navigation bar
					v_SmartNav	: Yes/No for Smart Navigation bar
					v_Fix		: Yes/No for fixing the calendar by default
	*/

	p_item = arguments[0];
	if (arguments[1] == null)
		p_month = new String(gNow.getMonth());
	else
		p_month = (typeof(arguments[1]) == "number") ? 
						arguments[1].toString() 
						: 
						arguments[1];
	if (arguments[2] == "" || arguments[2] == null)
		p_year = new String(gNow.getFullYear().toString());
	else
		p_year = (typeof(arguments[2]) == "number") ? 
						arguments[2].toString() 
						: 
						arguments[2];
	if (arguments[3] == null)
		p_format = "MM/DD/YYYY";
	else
		p_format = (typeof(arguments[3]) == "string") ? 
						arguments[3] 
						: 
						"MM/DD/YYYY";
	if (arguments[4] == null)
		p_type = "POPUP";
	else
		p_type = (typeof(arguments[4]) == "string" && 
					(arguments[4] == "POPUP" || arguments[4] == "INLINE")) ?
						arguments[4]
						:
						"POPUP";
	if (arguments[5] == null)
		p_custom = "CloseOnSelect=Yes;AppendOrReplace=Replace;AppendChar=';';ReturnData=Date;Title=Popup Date Picker;AllowWeekends=Yes;Resizable=No";
	else
		p_custom = typeof(arguments[5]) == "string" ?
					arguments[5]
					:
					"CloseOnSelect=Yes;AppendOrReplace=Replace;AppendChar=';';ReturnData=Date;Title=Popup Date Picker;AllowWeekends=Yes;Resizable=No";

	Build(p_item, p_month, p_year, p_format, p_type, p_custom);
}

/* ******************************************************************************* */
/*
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());
	else
		p_year = (typeof(p_year) == "number") ?
					p_year.toString()
					:
					p_year;

	if (p_format == null || p_format == "")
			p_format = "MM/DD/YYYY";

	ggWinCal = window.open("", "Calendar", "scrollbars=yes");
	ggWinCal.opener = self;

	Build(p_item, null, p_year, p_format);
}
/* *********************************EOF********************************* */