
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;
	
	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;
	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) {
	/* 
	Check for leap year ..
	1.Years evenly divisible by four are normally leap years, except for... 
	2.Years also evenly divisible by 100 are not leap years, except for... 
	3.Years also evenly divisible by 400 are leap years. 
	*/
	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) {
	/* 
	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();
}

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;
}

// 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=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.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("<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>");

	// 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("<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 + "', '" + this.gMonth + "', '" + (parseInt(this.gYear)-1) + "', '" + this.gFormat + "'" +
		");" +
		"\"><<<\/A>]</TD><TD ALIGN=center>");
	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>");
	this.wwrite("[<A HREF=\"" +
		"javascript:window.opener.Build(" + 
		"'" + this.gReturnItem + "', '" + nextMM + "', '" + nextYYYY + "', '" + this.gFormat + "'" +
		");" +
		"\">><\/A>]</TD><TD ALIGN=center>");
	this.wwrite("[<A HREF=\"" +
		"javascript:window.opener.Build(" + 
		"'" + this.gReturnItem + "', '" + this.gMonth + "', '" + (parseInt(this.gYear)+1) + "', '" + this.gFormat + "'" +
		");" +
		"\">>><\/A>]</TD></TR></TABLE><BR>");

	// Get the complete calendar code for the month..
	vCode = this.getMonthlyCalendarCode();
	this.wwrite(vCode);

	this.wwrite("</font></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>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>");
	this.wwrite("</head>");

	this.wwrite("<body " + 
		"link=\"" + this.gLinkColor + "\" " + 
		"vlink=\"" + this.gLinkColor + "\" " +
		"alink=\"" + this.gLinkColor + "\" " +
		"text=\"" + this.gTextColor + "\">");
	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 (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 = "";
	
	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 = "";

	/*
	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 + "'> </FONT></TD>";
	}

	// Write rest of the 1st week
	for (j=vFirstDay; j<7; j++) {
		vCode = vCode + "<TD WIDTH='14%'" + this.write_weekend_string(j) + "><FONT SIZE='2' FACE='" + fontface + "'>" + 
			"<A HREF='#' " + 
				"onClick=\"self.opener.document.all['" + this.gReturnItem + "'].value='" + 
				this.format_data(vDay) + 
				"';window.close();\">" + 
				this.format_day(vDay) + 
			"</A>" + 
			"</FONT></TD>\n";
		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 = vCode + "<TD WIDTH='14%'" + this.write_weekend_string(j) + "><FONT SIZE='2' FACE='" + fontface + "'>" + 
				"<A HREF='#' " + 
					"onClick=\"self.opener.document.all['" + this.gReturnItem + "'].value='" + 
					this.format_data(vDay) + 
					"';window.close();\">" + 
				this.format_day(vDay) + 
				"</A>" + 
				"</FONT></TD>\n";
			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'> </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 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 (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 = 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);

	// 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_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=250,height=250,status=yes,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);
}





/*
var L_Language_Text="1033";

function TrimWhiteSpaces( str ) 
{
    var start;
    var end;
    str = str.toString();
    var len = str.length;
    for (start = 0; start < len; start ++)
    {
        ch = str.charAt(start);
        if (ch!=' ' && ch!='\t' && ch!='\n' && ch!='\r' && ch!='\f')
            break;
    }
    if (start == len)
        return "";
    for (end = len - 1; end > start; end --)
    {
        ch = str.charAt(end);
        if (ch!=' ' && ch!='\t' && ch!='\n' && ch!='\r' && ch!='\f')
            break;
    }
    end ++;
    return str.substring(start, end);
}
function WindowPosition(elt)
{
	var pos = new Object;
	pos.x = 0;
	pos.y = 0;
	while (elt.offsetParent != null && elt.id.search('WebPart') != 0)
		{
		pos.x += elt.offsetLeft;
		pos.y += elt.offsetTop;
		elt = elt.offsetParent;
		}
	return pos;
}
function StAttrQuote(st)
{
	st = st.toString();
	st = st.replace(/&/g, '&amp;');
	st = st.replace(/\"/g, '&quot;'); 
	st = st.replace(/\r/g, '&#13;');
	return '"' + st + '"';
}
function FBlankString(st)
{
	st = st.toString();
	st = st.replace(/\s/g, "");
	return (st == "");
}
function StBuildParam(stPattern)
{
	var re;
	var i;
	for (i = 1; i < StBuildParam.arguments.length; i++)
		{
		re = new RegExp("\\^" + i);
		stPattern = stPattern.replace(re, StBuildParam.arguments[i]);
		}
	return stPattern;
}
function  WMultiple(w, wMult)
{
	return Math.round(w/wMult)*wMult;
}
function St2Digits(w)
{
	var st = "";
	if (w < 10)
		st += "0";
	st += w;
	return st;
}
function STSScriptEncode(str)
{
    var strOut = "";
    var ix = 0;
    for (ix = 0; ix < str.length; ix++)
    {
        var charCode = str.charCodeAt(ix);
        if (charCode > 0x0fff)
        {
            strOut += ("\\u" + charCode.toString(16).toUpperCase());
        }
        else if (charCode > 0x00ff)
        {
            strOut += ("\\u0" + charCode.toString(16).toUpperCase());
        }
        else if (charCode > 0x007f)
        {
            strOut += ("\\u00" + charCode.toString(16).toUpperCase());
        }
        else
        {
            switch (str.charAt(ix))
            {
            case '\\':
                strOut += "\\\\";
                break;
            case '\"':
                strOut += "\\\"";
                break;
            case '\r':
                strOut += "\\r";
                break;
            case '\n':
                strOut += "\\n";
                break;
            case '\'':
                strOut += "\\'";
                break;
            case '<':
                strOut += "\\u003c";
                break;
            case '>':
                strOut += "\\u003e";
                break;
            default:
                strOut += str.charAt(ix);
            };
        }
    }
    return strOut;
}
function STSScriptEncodeWithQuote(str)
{
    return '"' + STSScriptEncode(str) + '"';
}
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////

function DateOptions()
{
	var L_strAllDay_Text="All Day";
	var L_strMore_Text="more...";
	var strMore=L_strMore_Text;
	var strAllDay=L_strAllDay_Text;
	var L_AllDayWidth_Text = 54;	
	var L_StrAM_Text="am";
	var L_StrPM_Text="pm";
	this.stDateOrder = "MDY";
	this.f12Hour = true;
	this.stAM = L_StrAM_Text;
	this.stPM = L_StrPM_Text;
	this.TimeMarkPosn = 0;
	this.dminControl = 5;
	this.chDateSep = "/";
	this.chTimeSep = ":";
	this.dyrWindow = 30;
	this.dow = 0;
	this.webTZOffsetMin = 0;
	this.WorkDayStartHour = 8;
	this.WorkDayEndHour = 17;
	this.DailyStartHourDelta = 1;	
	this.DailyEndHourDelta = 4;
	this.CalendarPeriod = "month"
	this.L_AllDay_Text = strAllDay;
	this.AllDayWidth = L_AllDayWidth_Text;
	this.L_More_Text = strMore;
}
DateOptions.prototype.SetTimeFormat = DOSetTimeFormat;
function DOSetTimeFormat(w)
{
	this.f12Hour = (w == 0);
}
DateOptions.prototype.SetDateOrder = DOSetDateOrder;
function DOSetDateOrder(w)
{
	switch (w)
		{
	case 0:
		this.stDateOrder = "MDY";
		break;
	case 1:
		this.stDateOrder = "DMY";
		break;
	case 2:
		this.stDateOrder = "YMD";
		break;
		}
}
DateOptions.prototype.SetDOW = DOSetDOW;
function DOSetDOW(dow)
{
	this.dow = (dow+1)%7;
}
DateOptions.prototype.ParseLocaleDate = DOParseLocaleDate;
function DOParseLocaleDate(stDate, caltype)
{
	var chSep = this.chDateSep;
	var ord = this.stDateOrder;
	var ichSlash1 = stDate.indexOf(chSep);
	var num1;
	var num2;
	var num3;
	var mon;
	var day;
	var yr;
	if (ichSlash1 < 0)
		{
		chSep = "/";
		ichSlash1 = stDate.indexOf(chSep);
		if (ichSlash1 < 0)
			{
			chSep = "-";
			ichSlash1 = stDate.indexOf(chSep);
			}
		}
	if (ichSlash1 < 0)
		return Number.NaN;
	var ichSlash2 = stDate.indexOf(chSep, ichSlash1+1);
	num1 = stDate.substr(0, ichSlash1) - 0;
	if (ichSlash2 < 0)
		{
		if (caltype != 1)
			return Number.NaN;
		ichSlash2 = stDate.length;
		var date = this.Today();
		num3 = date.getUTCFullYear();
		if (ord == "YMD")
			ord = "MDY";
		}
	else
		{
		num3 = stDate.substr(ichSlash2+1) - 0;
		}
	num2 = stDate.substr(ichSlash1 + 1, ichSlash2 - ichSlash1 - 1) - 0;
	if (isNaN(num1) || isNaN(num3) || isNaN(num3))
		return Number.NaN;
	var yrLen;
	switch (ord)
		{
	case "DMY":
		day = num1;
		mon = num2;
		yr = num3;
		yrLen = stDate.length - ichSlash2 - 1;
		break;
	case "YMD":
		yr = num1;
		yrLen = ichSlash1;
		mon = num2;
		day = num3;
		break;
	case "MDY":
		mon = num1;
		day = num2;
		yr = num3;
		yrLen = stDate.length - ichSlash2 - 1;
		break;
		}
	if (yr < 0)
		return Number.NaN;
	if (yrLen < 3)
		yr = this.YrWindow(yr, caltype);
	mon = mon-1;
       var yrMin = 1900;	
       var yrMax = 8900;   
       switch (caltype)
       {
       case 6:  
        	yrMin = 1319;
        	yrMax = 3481;
        	break;
       case 7:  
        	yrMin = 2444;
        	yrMax = 5043;
        	break;
       case 8:  
        	yrMin = 5662;
        	yrMax = 5998;
        	break;
       case 16:  
        	yrMin = 1823;
        	yrMax = 3920;
        	break;
       }
	var minCalGregorian = caltype == 1 && yr == 1899 && mon == 11 && day == 31;
	if ((yr < yrMin || yr > yrMax) && !minCalGregorian)
	{
		return Number.NaN;
	}
	switch(caltype)
		{
		case 6: 
		case 7: 
		case 8: 
			var date = this.DateIntlYMD(yr, mon, day, caltype);
			break;
		default:
			var date = this.DateYMD(yr, mon, day);
			break;
		}
	return date;
}
DateOptions.prototype.DateYMD = DODateYMD;
function DODateYMD(yr, mon, day)
{
	if (isNaN(yr) || isNaN(mon) || isNaN(day))
		return Number.NaN;
	var date = new Date(Date.UTC(yr, mon, day));
	if (yr != date.getUTCFullYear() || mon != date.getUTCMonth() ||
		day != date.getUTCDate())
		return Number.NaN;
	return date;
}
DateOptions.prototype.DateIntlYMD = DODateIntlYMD;
function DODateIntlYMD(yr, mon, day, caltype)
{
	if (isNaN(yr) || isNaN(mon) || isNaN(day))
		return Number.NaN;
	var date = new IntlDate(yr, mon, day, 0, 0, 0, caltype);
	return date;
}
DateOptions.prototype.YrWindow = DOYrWindow;
function DOYrWindow(st, caltype)
{
	var yr = st - 0;
	if (isNaN(yr))
		return st;
	if (st < 100)
	{
		switch(caltype)
		{
		case 1:  
		    var date = this.Today();
		    var yrCur = date.getUTCFullYear();
		    yr += WMultiple(yrCur, 100);
		    if (yr > yrCur + this.dyrWindow)
			    yr -= 100;
		    else if (yr < yrCur + this.dyrWindow - 100)
			    yr += 100;
		    break;
		case 6:  
		    if(yr < 52)
		    	yr +=1400;
		    else
		    	yr +=1300;
		    break;			
		case 7:  
		    if(yr < 73)
		    	yr +=2500;
		    else
		    	yr +=2400;
		    break;			
		case 8:  
		    if(yr < 91)
		    	yr +=5700;
		    else
		    	yr +=5600;
		    break;			
		case 16:  
		    if(yr < 52)
		    	yr +=1900;
		    else
		    	yr +=1800;
		    break;			
		}
		return yr;		
	}
	return st;
}
DateOptions.prototype.StDate = DOStDate;
function DOStDate(date)
{
	return this.StDateString(date.getUTCFullYear(), date.getUTCMonth() + 1, date.getUTCDate());
}
DateOptions.prototype.StDateString = DOStDateString;
function DOStDateString(yr, mon, day)
{
	var st;
	switch (this.stDateOrder)
		{
	case "MDY":
		st = mon + this.chDateSep + day + this.chDateSep + yr;
		break;
	case "DMY":
		st = day + this.chDateSep + mon + this.chDateSep + yr;
		break;
	case "YMD":
		st = yr + this.chDateSep + mon + this.chDateSep + day;
		break;
		}
	return st;
}
DateOptions.prototype.StTime = DOStTime;
function DOStTime(date)
{
	var stSuff = "";
	var hr = date.getUTCHours();
	var min = date.getUTCMinutes();
	if (this.f12Hour)
		{
		if (hr >= 12)
			{
			stSuff = this.stPM;
			if (hr > 12)
				hr -= 12;
			}
		else
			{
			if (hr == 0)
				hr = 12;
			stSuff = this.stAM;
			}
		}
	if(this.TimeMarkPosn == 0)
		return hr + this.chTimeSep + St2Digits(min) + " " + stSuff;
	else
		return stSuff + " " + hr + this.chTimeSep + St2Digits(min);
}
DateOptions.prototype.StBareTime = DOStBareTime;
function DOStBareTime(date)
{
	var stSuff = "";
	var hr = date.getUTCHours();
	var min = date.getUTCMinutes();
	if (this.f12Hour)
		{
		if (hr >= 12)
			{
			if (hr > 12)
				hr -= 12;
			}
		else
			{
			if (hr == 0)
				hr = 12;
			}
		}
	return hr + this.chTimeSep + St2Digits(min);
}
DateOptions.FHasTime = DOFHasTime;
function DOFHasTime(date)
{
	var hr = date.getUTCHours();
	var min = date.getUTCMinutes();
	return (hr != 0 || min != 0);
}
DateOptions.prototype.StTimeControls = DOStTimeControls;
function DOStTimeControls(fld, date)
{
	var st;
	var hr = date.getUTCHours();
	var min = date.getUTCMinutes();
	var hrT;
	var hrTT;
	var stSuff = "";
	var hrMax;
	var fPM;
	var L_Hours_Text="Hours";
	var L_Minutes_Text="Minutes";
	var L_Time_Text = ":"; 
	var L_MinutesTime_Text = ""; 
	var L_SmallHour_Text = "0"; 
	st = "<span dir=ltr><SELECT TITLE='" + L_Hours_Text + "' class='ms-input' NAME=" + StAttrQuote(fld.frm.StFieldName(fld, "Hours")) + ">\r";
	for (hrT = 0; hrT < 24; hrT++)
		{
		if (hrT == hr)
			stSelected = " SELECTED";
		else
			stSelected = "";
		st += "<OPTION VALUE=" + hrT + stSelected + ">";
		hrTT = hrT;
		if (this.f12Hour)
			{
			if (hrT < 12)
				{
				stSuff = this.stAM;
				}
			else
				{
				stSuff = this.stPM;
				hrTT -= 12;
				}
			if (hrTT == 0)
				hrTT = 12;
			if (this.TimeMarkPosn == 0)
				st += hrTT + " " + stSuff + "\r";
			else
				st += stSuff + " " + hrTT + "\r";
			}
		else
			{
			if (hrT < 10)
				st += L_SmallHour_Text;
			st += hrTT + L_Time_Text + "\r";
			}
		}
	st += "</SELECT>\r";
	st += "&nbsp;<SELECT TITLE='" + L_Minutes_Text+ "' NAME=" + StAttrQuote(fld.frm.StFieldName(fld, "Minutes")) + ">\r";
	min = WMultiple(min, this.dminControl);
	for (minT = 0; minT < 60; minT += this.dminControl)
		{
		if (minT == min)
			stSelected = " Selected=True";
		else
			stSelected = "";
		st += "<OPTION VALUE=" + minT + stSelected + ">";
		st += St2Digits(minT) + L_MinutesTime_Text + "\r";
		}
	st += "</SELECT></span>\r";
	return st;
}
DateOptions.prototype.SetTimeControls = DOSetTimeControls;
function DOSetTimeControls(fld, date)
{
	var fieldHours = fld.frm.FieldSubPart(fld, "Hours");
	var fieldMinutes = fld.frm.FieldSubPart(fld, "Minutes");
	var hr = date.getUTCHours();
	var min = date.getUTCMinutes();
	var fPM;
	min = WMultiple(min, this.dminControl);
	fieldHours.selectedIndex = hr;
	fieldMinutes.selectedIndex = min/this.dminControl;
}
DateOptions.prototype.Today = DOToday;
function DOToday()
{
	var date = this.Now();
	date.setUTCHours(0,0,0,0);
	return date;
}
DateOptions.prototype.Now = DONow;
function DONow()
{
	var date = new Date();
	date.setTime(date.getTime() - this.webTZOffsetMin * DateOptions.msMinute);
	return date;
}
DateOptions.ClientToday = DOClientToday;
function DOClientToday()
{
	var date = DateOptions.ClientNow();
	date.setUTCHours(0,0,0,0);
	return date;
}
DateOptions.ClientNow = DOClientNow;
function DOClientNow()
{
	var date = new Date();
	date.setTime(date.getTime() - date.getTimezoneOffset() * DateOptions.msMinute);
	return date;
}
DateOptions.ParseISODate = DOParseISODate;
function DOParseISODate(stISO, caltype)
{
	var date = "#INVALID";
	if (stISO.length < 19)
	    return date;
	var yr = stISO.substr(0, 4) - 0;
	var mon = stISO.substr(5, 2) - 0;
	var day = stISO.substr(8, 2) - 0;
	var hr = stISO.substr(11, 2) - 0;
	var min = stISO.substr(14, 2) - 0;
	var sec = stISO.substr(17, 2) - 0;
    if (isNaN(yr) || isNaN(mon) || isNaN(day) || isNaN(hr) || isNaN(min) || isNaN(sec))
		return date;
	if (caltype == "undefined")
		caltype = 0;
	switch (caltype)
	{
	case 6: 
	case 7: 
	case 8: 
	    date = new IntlDate(yr, mon-1, day, hr, min, sec, caltype);
	    break;
	default:
	    date = new Date(Date.UTC(yr, mon-1, day, hr, min, sec));
	    break;
	}
	return date;
}
DateOptions.prototype.RoundDate = DateRoundDate;
function DateRoundDate(date)
{
	date.setSeconds(0);
	return date;
}
DateOptions.StISODate = DOStISODate;
function DOStISODate(date)
{
	var yr = date.getUTCFullYear();
	var mon = date.getUTCMonth() + 1;
	var day = date.getUTCDate();
	var hr = date.getUTCHours();
	var min = date.getUTCMinutes();
	var sec = date.getUTCSeconds();
	return yr + "-" + St2Digits(mon) + "-" + St2Digits(day) + "T" + St2Digits(hr) + ":" +
		St2Digits(min) + ":" + St2Digits(sec) + "Z";
}
DateOptions.msSecond = 1000;
DateOptions.msMinute = DateOptions.msSecond*60;
DateOptions.msHour = DateOptions.msMinute * 60;
DateOptions.msDay = DateOptions.msHour * 24;
DateOptions.msWeek = DateOptions.msDay * 7;
DateOptions.cdyYr = 365;
DateOptions.cdyQYr = 4*DateOptions.cdyYr + 1;
DateOptions.cdyC = 25*DateOptions.cdyQYr - 1;
DateOptions.cdyQC = 4*DateOptions.cdyC + 1;
DateOptions.mpMonIdy = new Array(31, 61, 92, 122, 153, 184, 214, 245, 275, 306, 337);
DateOptions.idyJan1 = 306;
DateOptions.ddayOrigin = 135080;
function DateDecode(date)
{
	this.ms = date.getTime();
	this.msDay = this.ms % DateOptions.msDay;
	if (this.sec < 0)
		this.sec += DateOptions.msDay;
	this.idy = Math.floor(this.ms / DateOptions.msDay) + DateOptions.ddayOrigin;	
	var idyQC = this.idy % DateOptions.cdyQC;			
	var iQC = Math.floor(this.idy / DateOptions.cdyQC);
	var idyC = idyQC % DateOptions.cdyC;			
	var iC = Math.floor(idyQC / DateOptions.cdyC);
	if (iC == 4)
		{
		iC = 3;
		idyC = DateOptions.cdyC;
		}
	var idyQYr = idyC % DateOptions.cdyQYr;			
	var iQYr = Math.floor(idyC / DateOptions.cdyQYr);
	var idyYr = idyQYr % DateOptions.cdyYr;			
	var iYr = Math.floor(idyQYr / DateOptions.cdyYr);
	if (iYr == 4)
		{
		iYr = 3;
		idyYr = DateOptions.cdyYr;
		}
	this.yr = 1600 + iQC * 400 + iC * 100 + iQYr * 4 + iYr;
	if (idyYr >= DateOptions.idyJan1)
		this.yr++;
	var imon;
	for (imon = 0; imon < 11; imon++)
		{
		if (idyYr < DateOptions.mpMonIdy[imon])
			break;
		}
	this.mon = (imon + 2) % 12;
	this.day = idyYr - ((imon > 0) ? DateOptions.mpMonIdy[imon-1] : 0) + 1;
	this.hr = Math.floor(this.msDay/DateOptions.msHour);
	this.min = Math.floor((this.msDay%DateOptions.msHour)/DateOptions.msMinute);
	this.sec = Math.floor((this.msDay%DateOptions.msMinute)/DateOptions.msSecond);
	this.dow = (this.idy+3) % 7;
}
DateDecode.prototype.MsEncode = DDMsEncode;
function DDMsEncode()
{
	this.ms = Date.UTC(this.yr, this.mon, this.day, this.hr, this.min, this.sec);
	return this.ms;
}
DateOptions.fOldDate = typeof(Date.prototype.getUTCHours) == "undefined";
if (DateOptions.fOldDate)
	{
	Date.prototype.getUTCDay = DateGetUTCDay;
	Date.prototype.getUTCDate = DateGetUTCDate;
	Date.prototype.getUTCFullYear = DateGetUTCFullYear;
	Date.prototype.getUTCMonth = DateGetUTCMonth;
	Date.prototype.getUTCHours = DateGetUTCHours;
	Date.prototype.getUTCMinutes = DateGetUTCMinutes;
	Date.prototype.getUTCSeconds = DateGetUTCSeconds;
	Date.prototype.setUTCDate = DateSetUTCDate;
	Date.prototype.setUTCHours = DateSetUTCHours;
	Date.prototype.EnsureDecode = DateEnsureDecode;
	Date.prototype.ResetMs = DateResetMs;
	}
function DateEnsureDecode()
{
	if (this.dd == "undefined" || this.dd.ms != this.getTime())
		this.dd = new DateDecode(this);
}
function DateResetMs()
{
	this.setTime(this.dd.MsEncode());
}
function DateGetUTCDate()
{
	this.EnsureDecode();
	return this.dd.day;
}
function DateGetUTCDay()
{
	this.EnsureDecode();
	return this.dd.dow;
}
function DateGetUTCFullYear()
{
	this.EnsureDecode();
	return this.dd.yr;
}
function DateGetUTCMonth()
{
	this.EnsureDecode();
	return this.dd.mon;
}
function DateGetUTCHours()
{
	this.EnsureDecode();
	return this.dd.hr;
}
function DateGetUTCMinutes()
{
	this.EnsureDecode();
	return this.dd.min;
}
function DateGetUTCSeconds()
{
	this.EnsureDecode();
	return this.dd.sec;
}
function DateSetUTCDate(day)
{
	this.EnsureDecode();
	this.dd.day = day;
	this.ResetMs();
}
function DateSetUTCHours(hr, min, sec)
{
	this.EnsureDecode();
	if (!min) min = 0;
	if (!sec) sec = 0;
	this.dd.hr = hr;
	this.dd.min = min;
	this.dd.sec = sec;
	this.ResetMs();
}
DateDecode.prototype.toString = StDateDecode;
function StDateDecode()
{
	return "Date Object\rYear: " + this.yr +
		"\rMon: " + (this.mon+1) +
		"\rDay: " + this.day +
		"\rhr: " + this.hr +
		"\rmin: " + this.min +
		"\rsec: " + this.sec;
}




///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////

function DatePicker(frm)
{
	this.frm = frm;
	if (frm.fUseDHTML)
		{
		document.write('<IFRAME FRAMEBORDER=0 SRC="' + frm.stPagePath + 'iframe.htm" SCROLLING=no style="position:absolute;display:none;background:white;" ID=DatePickerWind></IFRAME>');
		this.wnd = DatePickerWind;
		document.body.onclick=DPCancelHandler;
		this.ifrm = document.getElementById("DatePickerWind");
		}
}
function DPCancelHandler()
{
	//frmCurrent.dp.Cancel();
}
var L_DatePickerAlt_Text = "Choose date from calendar";
DatePicker.prototype.StButton = DPStButton;
function DPStButton(fld, stPopUpOnClick2)
{
	var st = "";
	if (this.frm.fUseDHTML)
		{
		st += "<IMG ALT=\"" + L_DatePickerAlt_Text + "\" CLASS=ms-button " +
			"ONCLICK='{var elt = event.srcElement; "+stPopUpOnClick2+"; if (!elt.disabled) frm.FindField(" + STSScriptEncodeWithQuote(fld.stName) + ").PopDatePicker(elt);}'" +
			"SRC=" + StAttrQuote(this.frm.stImagesPath + "calendar.gif") + ">";
		}
	return st;
}
DatePicker.prototype.Popup = DPPopup;
function DPPopup(date, field, elt)
{
	if (this.elt != null && this.elt == elt)
		{
		this.Cancel();
		return;
		}
	this.Cancel();
	this.bRTLAlign = false;
	this.date = new Date(date.getTime());
	this.date.setUTCHours(0,0,0,0);
	this.field = field;
	this.elt = elt;
	var pos = WindowPosition(elt);
	this.ifrm.style.pixelLeft = pos.x + 1;
	this.ifrm.style.pixelTop = pos.y + elt.offsetHeight;
	this.SetHTML(this.StBuild());
}
DatePicker.prototype.AdjustFrameSize = DPAdjustFrameSize;
function DPAdjustFrameSize()
{
	this.ifrm.style.display = "block";
	var divDP = this.wnd.document.getElementById("DatePickerDiv");
	if (!this.bDidAlign)
	{
		this.bDidAlign = true;
		this.ifrm.style.pixelWidth = divDP.offsetWidth - 100;
	}
	this.ifrm.style.pixelWidth = divDP.offsetWidth;
	this.ifrm.style.pixelHeight = divDP.offsetHeight;
	if (this.ifrm.currentStyle.direction == "rtl" && !this.bRTLAlign)
	{
		this.bRTLAlign = true;
		this.ifrm.style.pixelLeft -= this.ifrm.style.pixelWidth - event.srcElement.offsetWidth + 1;
	}
}
DatePicker.prototype.StBuild = DPStBuild;
function DPStBuild()
{
	var st = "";
	this.cal = new Calendar(this.date.getUTCFullYear(), this.date.getUTCMonth(), this.frm.dopt, "parent.frm.dp");
	this.cal.fDatePicker = true;
	this.cal.dateDP = this.date;
	st += this.cal.StBuild();
	return st;
}
DatePicker.prototype.SetHTML = DPSetHTML;
function DPSetHTML(stHTML)
{
	//var cssLink = this.wnd.document.getElementById("onetidThemeCSS");
	//if (cssLink && this.frm.themeCSSurl)
	//	cssLink.href = this.frm.themeCSSurl;
	this.wnd.document.body.innerHTML += "<DIV ID=DatePickerDiv>" + stHTML + "</DIV>";
	this.wnd.document.selection.empty();
	this.AdjustFrameSize();
}
DatePicker.prototype.ClickDay = DPClickDay;
function DPClickDay(yr, mon, day)
{
	var date = new Date(Date.UTC(yr, mon, day));
	this.field.value = this.frm.dopt.StDate(date);
	this.Cancel();
}
DatePicker.prototype.MoveMonth = DPMoveMonth;
function DPMoveMonth(dmon)
{
	this.cal.SetDate(this.cal.yr, this.cal.mon + dmon, 1);
	this.SetHTML(this.cal.StBuild());
}
DatePicker.prototype.Cancel = DPCancel;
function DPCancel()
{
	if (this.elt != null)
		{
		this.ifrm.style.display = "none";
		this.elt = null;
		}
}
DatePicker.prototype.SetDate = DPSetDate;
function DPSetDate(yr, mon, day)
{
	this.cal.SetDate(yr, mon, day);
	this.SetHTML(this.cal.StBuild());
}


///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////

function OWSForm(stName, fUseDHTMLOverride, stPagePath)
{
	this.stName = stName;
	this.stFieldPrefix = "urn:schemas-microsoft-com:office:office#";
	this.dopt = new DateOptions;
	//this.nopt = new NumberOptions;
	//this.fUseDHTML = browseris.ie4up && browseris.win32;
	this.fUseDHTML=true;
	if (!fUseDHTMLOverride)
			this.fUseDHTML = false;
	this.ifldMax = 0;
	this.rgfld = new Array;
	this.stError = "";
	this.stImagesPath = "/MLA - Safemeat/Images/";
	this.stPagePath = stPagePath + L_Language_Text+"/";
	this.dp = new DatePicker(this);
	//this.stInputStyle = ((browseris.ie4up && browseris.win32) || browseris.nav6up) ? "CLASS=ms-input" : "";
	//this.stLongStyle = ((browseris.ie4up && browseris.win32) || browseris.nav6up) ? "CLASS=ms-long" : "";
	this.fPreviewMode = false;
	//if (document[this.stName])
	//	document[this.stName].onsubmit = FrmOnSubmitRetFalse; 
	this.form = null;
	//this.themeCSSurl = retrieveCurrentThemeLink();
	//frmCurrent = this;
	return this; ////ADDED////
}
OWSForm.prototype.AddField = FrmAddField;
function FrmAddField(fld, stName, stDisplay, stValue)
{
	this.rgfld[this.ifldMax++] = fld;
	fld.frm = this;
	fld.stName = stName;
	fld.stDisplay = stDisplay;
	fld.stValue = stValue;
	fld.fRequired = false;
	fld.stError = "";
	fld.stAttributes = "";
	fld.fCalcCheck = false;
}
OWSForm.prototype.DataBind = FrmDataBind;
function FrmDataBind()
{
	var ifld;
	var fld;
    if (this.form == null)
	    this.form = document[this.stName]
	for (ifld = 0; ifld < this.ifldMax; ifld++)
		{
		fld = this.rgfld[ifld];
		fld.DataBind();
		}
}
OWSForm.prototype.FindField = FrmFindField;
function FrmFindField(stField)
{
	var fld;
	for (ifld = 0; ifld < this.ifldMax; ifld++)
		{
		fld = this.rgfld[ifld];
		if (fld.stName == stField)
			return fld;
		}
	return null;
}
OWSForm.prototype.ValidateAndSubmit = FrmValidateAndSubmit;
function FrmValidateAndSubmit(fUI)
{
	if (this.fPreviewMode)
	{
		var L_cantSave_Text = "This form cannot be saved when previewing this page.";
		window.alert(L_cantSave_Text);
		return;
	}
	if (this.FValidate(fUI)){
		this.FPostProcess();
		this.form.submit();
	}
}
OWSForm.prototype.FValidate = FValidateForm;
function FValidateForm(fUI)
{
	var ifld;
	var fld;
	var bFormValid = true;
    if (this.form == null)
	    this.form = document[this.stName]
	for (ifld = 0; ifld < this.ifldMax; ifld++)
		{
		fld = this.rgfld[ifld];
		if (!fld.fSkipValidation && !fld.FValidate())
			{
			if (fld.errFld)
				fld = fld.errFld;
			if (bFormValid)
				{
				this.stError = fld.stError;
				bFormValid = false;
				}
			if (fUI)
				{
				fld.FieldFocus();
				alert(this.stError);
				return false;
				}
			}
		}
	return bFormValid;
}
OWSForm.prototype.FPostProcess = FPostProcessForm;
function FPostProcessForm()
{
	var ifld;
	var fld;
	this.form = document[this.stName]
	for (ifld = 0; ifld < this.ifldMax; ifld++)
		{
		fld = this.rgfld[ifld];
		if (fld.PostProcess)
			fld.PostProcess();
		}
	return true;
}
OWSForm.prototype.SetFirstFocus = FrmSetFirstFocus;
function FrmSetFirstFocus(bAlreadyInitialized)
{
	var i;
	if (bAlreadyInitialized != true)
		this.InitFormFields();
	for (i in this.rgfld)
		if (this.rgfld[i].FieldFocus && this.rgfld[i].FieldFocus())
			break;
}
OWSForm.prototype.InitFormFields = FrmInitFields;
function FrmInitFields()
{
	var i;
	window.focus();
	this.form = document[this.stName];
	for (i in this.rgfld)
	{
		if (this.rgfld[i].Init)
			this.rgfld[i].Init();
	}
}
OWSForm.prototype.BuildFieldUI = FrmBuildFieldUI;
function FrmBuildFieldUI(fld, st)
{
	document.write(st);
}
OWSForm.prototype.StFieldPost = FrmStFieldPost;
function FrmStFieldPost(fld)
{
	if (!fld.posted)
	{
		fld.posted=true;
		return "<INPUT TYPE=HIDDEN NAME=" + StAttrQuote(this.stFieldPrefix + fld.stName) + ">\r";
	}
	else
		return "";
}
OWSForm.prototype.FieldPost = FrmFieldPost;
function FrmFieldPost(fld)
{
    if (this.form == null)
		this.form = document[this.stName];
	return this.form[this.stFieldPrefix + fld.stName];
}
OWSForm.prototype.FilenameFieldPost = FilenameFrmFieldPost;
function FilenameFrmFieldPost(fld)
{
    if (this.form == null)
		this.form = document[this.stName];
	return this.form[fld.stName];
}
OWSForm.prototype.StFieldSubPart = FrmStFieldSubPart;
function FrmStFieldSubPart(fld, stPart, stValue)
{
	var maxLen = "MaxLength=255 ";
	var stDir;
	switch(fld.direction)
	{
	case 1:
		stDir = " dir=ltr";
		break;
	case 2:
		stDir = " dir=rtl";
		break;
	default:
		stDir = "";
		break;		
	}	
	var strIMEMode = fld.IMEMode ? " style=\"ime-mode:" + fld.IMEMode + "\" " : "";
	return "<INPUT " + maxLen + fld.stAttributes + //REMOVED FrmTabIndex
        " TITLE=" + StAttrQuote(fld.stDisplay) +
	    " NAME=" + StAttrQuote(this.StFieldName(fld, stPart)) +
	    " id='" + "id" + fld.stName + "'" +
	    strIMEMode + 	    
		" VALUE=" + StAttrQuote(stValue) + stDir + ">";
}
OWSForm.prototype.FieldSubPart = FrmFieldSubPart;
function FrmFieldSubPart(fld, stPart)
{
    if (this.form == null)
		this.form = document[this.stName];
	return this.form[this.StFieldName(fld, stPart)];
}
OWSForm.prototype.StFieldName = FrmStFieldName;
function FrmStFieldName(fld, stPart)
{
	return this.StFieldNameFactory(fld.stName, stPart);
}
OWSForm.prototype.StFieldNameFactory = FrmStFieldNameFactory;
function FrmStFieldNameFactory(name, stPart)
{
	return "OWS:" + name + ":" + stPart;
}
OWSForm.prototype.GetSelValue = FrmGetSelValue;
function FrmGetSelValue(st)
{
    if (this.form == null)
		this.form = document[this.stName];
	var sel = this.form[st];
	return sel[sel.selectedIndex].value;
}
OWSForm.prototype.TestURL = FormTestURL;
function FormTestURL(stName)
{
	var fld = this.FindField(stName);
	var stURL = StURLNormalize(TrimWhiteSpaces(this.FieldSubPart(fld, "URL").value));
	if (stURL.substr(0, 7) == "mailto:")
		open(stURL, "_self");
	else
		open(stURL, "_blank");
}
OWSForm.prototype.SetRadioValue = FormSetRadioValue;
function FormSetRadioValue(stName, stValue)
{
	var fld = this.FindField(stName);
	if (fld.stAlias)
		fld = this.FindField(fld.stAlias);
	fld.SetValue(stValue);
	return true;
}
OWSForm.prototype.RevertSelect = FormRevertSelect;
function FormRevertSelect(stName, stValue)
{
	var fld = this.FindField(stName);
	fld.RevertSelect(stValue);
}
OWSForm.prototype.SetFillInButton = FormSetFillInButton;
function FormSetFillInButton(stName)
{
    if (event != null)
    {
        var charCode;
        if (browseris.ie)
            charCode = event.keyCode;
        else
            charCode = event.which;
        if (charCode == 9 || charCode == 16)
            return;
    }
	var fld = this.FindField(stName);
    fld.SetFillInButton();
}
OWSForm.prototype.UnsetFillInButton = FormUnsetFillInButton;
function FormUnsetFillInButton(stName)
{
	var fld = this.FindField(stName);
	fld.UnsetFillInButton();
}


///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////

function DateField(frm, stName, stDisplay, stValue)
{
	frm.AddField(this, stName, stDisplay, stValue);
	this.fDateOnly = false;
	this.stAttributes = frm.stInputStyle + " SIZE=12";
	this.caltype = 1;
	this.direction = 0;
	this.stPopUpOnClick2 = "";
	this.origDate = null;
}
var L_DateOrderYear_Text = "YYYY";
var L_DateOrderMonth_Text = "M";
var L_DateOrderDay_Text = "D";
var L_DateOrderDesc_Text = "Enter date in ^2 format^1.";
var L_CalendarHijri_Text = " using Hijri Calendar";
var L_CalendarHebrew_Text = " using Hebrew Lunar Calendar";
var L_CalendarThai_Text = " using Buddhist Calendar";
var L_CalendarSaka_Text = " using Saka Era Calendar";
DateField.prototype.BuildUI = DateBuildUI;
function DateBuildUI()
{
	var st = this.stBuildUI();
	this.frm.BuildFieldUI(this, st + "\r");
}
DateField.prototype.stBuildUI = stDateBuildUI;
function stDateBuildUI()
{
	var st = "";
	var date;
	st += this.frm.StFieldPost(this);
	if (!this.fHideDateSpan)
		st += "<span ID="+StAttrQuote(this.frm.StFieldName(fld, "DateSpan"))+">";
	alert('2');
	if (FBlankString(this.stValue))
		{
		st += this.frm.StFieldSubPart(this, "Date", "");
		date = this.frm.dopt.Today();
		}
	else
		{
		date = DateOptions.ParseISODate(this.stValue, this.caltype);
		if (date == "#INVALID")
			{
			date = this.frm.dopt.Today();
			st += this.frm.StFieldSubPart(this, "Date", date);
			}
		else
		    {
		        date = this.frm.dopt.RoundDate(date);
        		st += this.frm.StFieldSubPart(this, "Date", this.frm.dopt.StDate(date));
		    }
		}
	this.origDate = date;
	st += "&nbsp;";
	if(this.caltype == 1)
		st += this.frm.dp.StButton(this, this.stPopUpOnClick2);
	st += "&nbsp;&nbsp;"
	if (!this.fHideDateSpan)
		st += "</span>";
	if (!this.fDateOnly)
		{
		st += this.frm.dopt.StTimeControls(this, date);
		}
	st += "<IMG alt='' style='vertical-align: bottom' width=1pt height=26pt SRC="
		+ StAttrQuote(this.frm.stImagesPath + "blank.gif") + ">";
	var stCalenarString="";
	var stDateString="";	
	switch (this.caltype)
	{
	case 6:  
		stCalenarString = L_CalendarHijri_Text;
		break;
	case 7:  
		stCalenarString = L_CalendarThai_Text;
		break;
	case 8:  
		stCalenarString = L_CalendarHebrew_Text;
		break;
	case 16:  
		stCalenarString = L_CalendarSaka_Text;
		break;
	default:
		stCalenarString="";
	}
	stDateString = this.frm.dopt.StDateString(L_DateOrderYear_Text,
		L_DateOrderMonth_Text, L_DateOrderDay_Text);	
	if (!this.fHideDescription)
		{
		st += "&nbsp;<br><SPAN class=ms-formdescription ID="
		   + StAttrQuote(this.frm.StFieldName(fld, "DateSpan"))+ ">"
		   + StBuildParam(L_DateOrderDesc_Text, stCalenarString, stDateString)
		   + "</SPAN>";
		}
	return st;
}
DateField.prototype.PopDatePicker = DatePopDatePicker;
function DatePopDatePicker(elt)
{
	this.frm.form = document[this.frm.stName]
	var date;
	var field = this.frm.FieldPost(this);
	var fieldDate = this.frm.FieldSubPart(this, "Date");
	event.cancelBubble = true;
	date = this.frm.dopt.Today();
	if (this.FValidate() && this.date != null)
		date = this.date;
	this.frm.dp.Popup(date, fieldDate, elt);
	return true;	
}
DateField.prototype.DataBind = DateDataBind;
function DateDataBind()
{
	var date;
	var fieldData = this.frm.FieldPost(this);
	var fieldDate = this.frm.FieldSubPart(this, "Date");
	if (FBlankString(fieldData.value))
		{
		fieldDate.value = "";
		date = this.frm.dopt.Today();
		}
	else
		{
		date = DateOptions.ParseISODate(fieldData.value);
		date = this.frm.dopt.RoundDate(date);
		fieldDate.value = this.frm.dopt.StDate(date);
		}
	if (!this.fDateOnly)
		{
		this.frm.dopt.SetTimeControls(this, date);
		}
}
DateField.prototype.FieldFocus = DateFieldFocus;
function DateFieldFocus()
{
	var field = this.frm.FieldSubPart(this, "Date");
	if (!field.disabled)
	{
		field.focus();
		field.select();
		return true;
	}
	return false;
}
var L_DateRequired_Text = "You must specify a date for ^1.";
var L_InvalidDate_Text = "^1 is not a valid date.";
DateField.prototype.FValidate = DateFValidate;
function DateFValidate()
{
	var field = this.frm.FieldPost(this);
	var formfld = this.frm.FieldSubPart(this, "Date");
	if (!formfld.disabled)
		{
		var stDate = TrimWhiteSpaces(formfld.value);
		if (stDate == "")
			{
			if (this.fRequired)
				{
				this.stError = StBuildParam(L_DateRequired_Text, this.stDisplay);
				return false;
				}
			else
				{
				field.value = "";
				this.date = null;
				return true;
				}
			}
		var date = this.frm.dopt.ParseLocaleDate(stDate, this.caltype);
		if (isNaN(date))
			{
			this.stError = StBuildParam(L_InvalidDate_Text, this.stDisplay);
			return false;
			}
		var yrMin = 1900;	
		var yrMax = 8900;   
		switch (this.caltype)
		{
		case 6:  
			yrMin = 1319;
			yrMax = 3481;
			break;
		case 7:  
			yrMin = 2444;
			yrMax = 5043;
			break;
		case 8:  
			yrMin = 5662;
			yrMax = 5998;
			break;
		case 16:  
			yrMin = 1823;
			yrMax = 3920;
			break;
		}
		if (!this.fDateOnly)
			{
			var hr = this.frm.GetSelValue(this.frm.StFieldName(this, "Hours")) - 0;
			var min = this.frm.GetSelValue(this.frm.StFieldName(this, "Minutes"));
			date.setUTCHours(hr, min);
			}
		var yr = date.getUTCFullYear();
		var mon = date.getUTCMonth();
		var day = date.getUTCDate();
		var minCalGregorian = (this.origDate == null
							  || date.getTime() >= this.origDate.getTime())
							  && this.caltype == 1 && yr == 1899 && mon == 11 && day == 31;
		if ((yr < yrMin || yr > yrMax) && !minCalGregorian)
			{
			this.stError = StBuildParam(L_InvalidDate_Text, this.stDisplay);
			return false;
			}
		field.value = DateOptions.StISODate(date);
		this.date = date;
		}
	return true;
}

////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////

function Calendar(yr, mon, dopt, stObject)
{
	if (!dopt)
		dopt = new DateOptions;
	this.dopt = dopt;
	var day=1;
	if (yr == null || mon == null)
		{
		var stCalDate = StURLGetVar("CalendarDate");
		if (stCalDate != "")
			{
			yr = stCalDate.substr(0, 4) - 0;
			var idxM2D = stCalDate.indexOf("-",5);
			if (idxM2D == -1) 
				{
				mon = stCalDate.substr(5) - 1;
				}
			else
				{
				mon = stCalDate.substr(5, idxM2D-5) - 1;
				day = stCalDate.substr(idxM2D+1);
				}
			}
		if (stCalDate == "" || isNaN(dopt.DateYMD(yr, mon, 1)))
			{
			var dateToday = this.dopt.Today();
			yr = dateToday.getUTCFullYear();
			mon = dateToday.getUTCMonth();
			day = dateToday.getUTCDate();
			}
		}
	var stCalPeriod = StURLGetVar("CalendarPeriod");
	if (stCalPeriod == "week")
	{
		this.period = "week";
		this.iperiod = 1;
	}	
	else if (stCalPeriod == "day")
	{
		this.period = "vday";
		this.iperiod = 2;
	}
	else if (stCalPeriod == "vday")
	{
		this.period = "vday";
		this.iperiod = 2;		
	}
	else if (stCalPeriod == "month")
	{
		this.period = "month";
		this.iperiod = 0;		
	}
	else
	{
		this.period = dopt.CalendarPeriod;
		if (this.period == "week")
			this.iperiod = 1;		
		else if (this.period == "day")
			this.iperiod = 2;		
		else if (this.period == "vday")
			this.iperiod = 2;		
		else 
			this.iperiod = 0;		
	}
	this.SetDate(yr, mon, day);
	if (this.iperiod == 0 )
	{
		this.cchanMin = 4;
		this.cchanMax = 4;
	}
	else if (this.iperiod == 1 )
	{
		this.cchanMin = 20;
		this.cchanMax = 20;
	}
	else 
	{
		this.cchanMin = 3;
		this.cchanMax = 100; 
	}
	this.ievtMax = 0;
	this.rgEvt = new Array;
	//this.fUseDHTML = (browseris.ie && browseris.verIEFull > 4.0 && browseris.win32)
	//				 || browseris.nav6up;
	this.fUseDHTML = true; //ADDED
	this.fDatePicker = false;
	this.dateDP = null;
	if (!stObject)
		stObject = "cal";
	this.stObject = stObject;
}
Calendar.msMinute = 1000*60;
Calendar.msHour = Calendar.msMinute * 60;
Calendar.msDay = Calendar.msHour * 24;
Calendar.msWeek = Calendar.msDay * 7;
var L_rgDOW0_Text = "Sun";
var L_rgDOW1_Text = "Mon";
var L_rgDOW2_Text = "Tue";
var L_rgDOW3_Text = "Wed";
var L_rgDOW4_Text = "Thur";
var L_rgDOW5_Text = "Fri";
var L_rgDOW6_Text = "Sat";
Calendar.rgDOW = new Array(L_rgDOW0_Text, L_rgDOW1_Text, L_rgDOW2_Text,
						   L_rgDOW3_Text, L_rgDOW4_Text, L_rgDOW5_Text,
						   L_rgDOW6_Text);
var L_rgDOWLong0_Text = "Sunday";
var L_rgDOWLong1_Text = "Monday";
var L_rgDOWLong2_Text = "Tuesday";
var L_rgDOWLong3_Text = "Wednesday";
var L_rgDOWLong4_Text = "Thursday";
var L_rgDOWLong5_Text = "Friday";
var L_rgDOWLong6_Text = "Saturday";
Calendar.rgDOWLong = new Array(L_rgDOWLong0_Text, L_rgDOWLong1_Text, L_rgDOWLong2_Text,
						   L_rgDOWLong3_Text, L_rgDOWLong4_Text, L_rgDOWLong5_Text,
						   L_rgDOWLong6_Text);
var L_rgDOWDP0_Text = "S";
var L_rgDOWDP1_Text = "M";
var L_rgDOWDP2_Text = "T";
var L_rgDOWDP3_Text = "W";
var L_rgDOWDP4_Text = "Th";
var L_rgDOWDP5_Text = "F";
var L_rgDOWDP6_Text = "S";
Calendar.rgDOWDP = new Array(L_rgDOWDP0_Text, L_rgDOWDP1_Text, L_rgDOWDP2_Text,
							 L_rgDOWDP3_Text, L_rgDOWDP4_Text, L_rgDOWDP5_Text,
							 L_rgDOWDP6_Text);
var L_rgMonths0_Text = "January";
var L_rgMonths1_Text = "February";
var L_rgMonths2_Text = "March";
var L_rgMonths3_Text = "April";
var L_rgMonths4_Text = "May";
var L_rgMonths5_Text = "June";
var L_rgMonths6_Text = "July";
var L_rgMonths7_Text = "August";
var L_rgMonths8_Text = "September";
var L_rgMonths9_Text = "October";
var L_rgMonths10_Text = "November";
var L_rgMonths11_Text = "December";
Calendar.rgMonths = new Array(L_rgMonths0_Text, L_rgMonths1_Text,
							  L_rgMonths2_Text, L_rgMonths3_Text,
							  L_rgMonths4_Text, L_rgMonths5_Text,
							  L_rgMonths6_Text, L_rgMonths7_Text,
							  L_rgMonths8_Text, L_rgMonths9_Text,
							  L_rgMonths10_Text, L_rgMonths11_Text);
var L_MYDATE_Text = "^1 ^2"; 
var L_YMDATE_Text = "^1 ^2"; 
var L_MDYDATE_Text = "^1 ^2, ^3"; 
var L_DMYDATE_Text = "^1 ^2, ^3"; 
var L_YMDDATE_Text = "^1, ^2 ^3"; 
var L_MDYDATESameYear_Text = "^1 ^2"; 
var L_DMYDATESameYear_Text = "^1 ^2"; 
var L_YMDDATESameYear_Text = "^1, ^2 ^3"; 
var L_DATE1DATE2_Text = "^1 - ^2"; 
var L_MDY_DOW_DATE_Text = "^4 ^1 ^2, ^3"; 
var L_DMY_DOW_DATE_Text = "^4 ^1 ^2, ^3"; 
var L_YMD_DOW_DATE_Text = "^4 ^1, ^2 ^3"; 
Calendar.prototype.StMonthYear = CalStMonthYear;
function CalStMonthYear()
{
	var st = "";
	if (this.iperiod != 0 )
		st += '<SPAN style="cursor:hand;" onmouseover="HighlightText(this, \'red\');" onmouseout="HighlightText(this, \'\');"' + StClickEvent(this.stObject + '.MoveMonth(0)') + '>';
	var stFormat = "";
	var param1 = "";
	var param2 = "";
	switch (this.dopt.stDateOrder)
		{
	case "MDY":
	case "DMY":
		param1 = Calendar.rgMonths[this.mon];
		param2 = this.yr;
		stFormat = L_MYDATE_Text;
		break;
	case "YMD":
		param1 = this.yr;
		param2 = Calendar.rgMonths[this.mon];
		stFormat = L_YMDATE_Text;
		break;
		}
	st += StBuildParam(stFormat, param1, param2);
	if (this.iperiod != 0 )
		st += "</SPAN>";
	return st;
}
Calendar.prototype.StDaySpanMonthYear = CalDaySpanMonthYear;
function CalDaySpanMonthYear()
{
	var st = "";
	var stStart = "";
	var stEnd = "";
	var stFormat1 = "";
	var stFormat2 = "";
	var param1 = "";
	var param2 = "";
	var param3 = "";
	var param4 = "";
	var param5 = "";
	var param6 = "";
	if (this.iperiod != 0 )
		st += '<SPAN style="cursor:hand;" onmouseover="HighlightText(this, \'red\');" onmouseout="HighlightText(this, \'\');"' + StClickEvent(this.stObject + '.MoveMonth(0)') + '>';
	var bDiffYears = this.dateStart.getUTCFullYear() != this.dateEnd.getUTCFullYear();	
	switch (this.dopt.stDateOrder)
		{
	case "MDY":
		param1 = Calendar.rgMonths[this.dateStart.getUTCMonth()];
		param2 = this.dateStart.getUTCDate();
		param3 = this.dateStart.getUTCFullYear();
		if (bDiffYears)
			stFormat1 = L_MDYDATE_Text;
		else
			stFormat1 = L_MDYDATESameYear_Text;
		param4 = Calendar.rgMonths[this.dateEnd.getUTCMonth()];
		param5 = this.dateEnd.getUTCDate();
		param6 = this.dateEnd.getUTCFullYear();
		stFormat2 = L_MDYDATE_Text;
		break;
	case "DMY":
		param1 = this.dateStart.getUTCDate();
		param2 = Calendar.rgMonths[this.dateStart.getUTCMonth()];
		param3 = this.dateStart.getUTCFullYear();
		if (bDiffYears)
			stFormat1 = L_DMYDATE_Text;
		else
			stFormat1 = L_DMYDATESameYear_Text;
		param4 = this.dateEnd.getUTCDate();
		param5 = Calendar.rgMonths[this.dateEnd.getUTCMonth()];
		param6 = this.dateEnd.getUTCFullYear();
		stFormat2 = L_DMYDATE_Text;
		break;
	case "YMD":
		param1 = this.dateStart.getUTCFullYear();
		param2 = Calendar.rgMonths[this.dateStart.getUTCMonth()];
		param3 = this.dateStart.getUTCDate();
		if (bDiffYears)
			stFormat1 = L_YMDDATE_Text;
		else
			stFormat1 = L_YMDDATESameYear_Text;
		param4 = this.dateEnd.getUTCFullYear();
		param5 = Calendar.rgMonths[this.dateEnd.getUTCMonth()];
		param6 = this.dateEnd.getUTCDate();
		stFormat2 = L_YMDDATE_Text;
		break;
		}
	stStart = StBuildParam(stFormat1, param1, param2, param3);
	stEnd = StBuildParam(stFormat2, param4, param5, param6);
	st += StBuildParam(L_DATE1DATE2_Text, stStart, stEnd); 
	if (this.iperiod != 0 )
		st += "</SPAN>";
	return st;
}
Calendar.prototype.StDayMonthYear = CalStDayMonthYear;
function CalStDayMonthYear()
{
	var st = "";
	st += '<SPAN style="cursor:hand;" onmouseover="HighlightText(this, \'red\');" onmouseout="HighlightText(this, \'\');"' + StClickEvent(this.stObject + '.MoveMonth(0)') + '>';
	var stFormat = "";
	var param1 = "";
	var param2 = "";
	var param3 = "";
	var param4 = Calendar.rgDOWLong[this.dow];
	switch (this.dopt.stDateOrder)
		{
	case "MDY":
		param1 = Calendar.rgMonths[this.mon];
		param2 = this.day;
		param3 = this.yr;
		stFormat = L_MDY_DOW_DATE_Text;
		break;
	case "DMY":
		param1 = this.day;
		param2 = Calendar.rgMonths[this.mon];
		param3 = this.yr;
		stFormat = L_DMY_DOW_DATE_Text;
		break;
	case "YMD":
		param1 = this.yr;
		param2 = Calendar.rgMonths[this.mon];
		param3 = this.day;
		stFormat = L_YMD_DOW_DATE_Text;
		break;
		}
	st += StBuildParam(stFormat, param1, param2, param3, param4);
	st += "</SPAN>";
	return st;
}
function alertDate(st, date)
{
	alert(st + ": yr=" + date.getUTCFullYear() + " mon=" + (date.getUTCMonth()+1) + " day=" + date.getUTCDate());
}
Calendar.prototype.SetDate = CalSetDate;
function CalSetDate(yr, mon, day)
{
	var date = new Date(Date.UTC(yr, mon, day));
	this.dateStart = new Date(date.getTime());
	this.dateEnd = new Date(date.getTime());
	this.givenDate = new Date(date.getTime());
	if (this.iperiod == 0  )
		{
		this.dateStart.setUTCDate(1);
		this.dateEnd.setTime(Date.UTC(yr, mon+1, 0));
		}
	var irw = 0;
	if (this.iperiod != 2 )
		{
		this.dateStart.setUTCDate(this.dateStart.getUTCDate() - (this.dateStart.getUTCDay() -this.dopt.dow+7)%7);
		irw = this.IrwFromDate(this.dateEnd);
		this.dateEnd.setUTCDate(this.dateEnd.getUTCDate() + irw * 7 - 1);
		}
	this.irwMax = irw+1;
	if (this.iperiod == 1 )
		{
		this.dateEnd.setTime(this.dateStart.getTime() + 6 * Calendar.msDay);
		date = new Date(this.dateStart.getTime() + 3 * Calendar.msDay);
		}
	else if (this.iperiod == 2 )
		{
		this.dateTodayEnd = new Date(this.dateStart.getTime() + Calendar.msDay - 1);		
		}
	this.day = date.getUTCDate();
	this.mon = date.getUTCMonth();
	this.yr = date.getUTCFullYear();
	this.dow = date.getUTCDay();
}
Calendar.prototype.DayStyle = CalDayStyle;
function CalDayStyle(dateCur, fBottom, fTop, fWeekly)
{
	var st;
	var dateToday = this.dopt.Today();
	if (dateCur.getTime() == dateToday.getTime())
		{
			if (fBottom)
				st = ' style="border-color:\'#FFD275\'; border-bottom-style:solid; border-left-style:solid; border-right-style:solid; border-bottom-width:2pt; border-left-width:2pt; border-right-width:2pt" ';
			else if (fTop)
				st = ' style="border-color:\'#FFD275\'; border-top-style:solid; border-left-style:solid; border-right-style:solid; border-top-width:2pt; border-left-width:2pt; border-right-width:2pt" ';
			else
				st = ' style="border-color:\'#FFD275\'; border-left-style:solid; border-right-style:solid; border-left-width:2pt; border-right-width:2pt" ';
		}
	else if (!fWeekly && dateCur.getUTCMonth() != this.mon)
		{
			st = ' BGCOLOR="#e6e6e6"';
		}
	else
		st = "";
	return st;
}
Calendar.prototype.AddFullEvent = CalAddFullEvent;
function CalAddFullEvent(stDateStart, stDateEnd, stLocation, stDesc, stTitle, stURL, rgIcons)
{
	var dateStart;
	var dateEnd;
	if (stDateStart == "")
		return;
	dateStart = DateOptions.ParseISODate(stDateStart);
	if (stDateEnd == "")
		{
		dateEnd = new Date(dateStart.getTime());
		}
	else
		{
		dateEnd = DateOptions.ParseISODate(stDateEnd);
		}
	if (dateEnd < dateStart)
		dateEnd = new Date(dateStart.getTime());
	var displayDateStart = new Date(dateStart.getTime());
	var displayDateEnd = new Date(dateEnd.getTime());
	if (this.iperiod == 2 )
	{
		if (dateStart > this.dateTodayEnd || dateEnd < this.dateStart)
			return; 
		if (displayDateStart < this.dateStart)
			displayDateStart = this.dateStart;
		var minDisplay = Calendar.msHour/3;	
		if (dateEnd.getTime() < dateStart.getTime()+minDisplay)
			displayDateEnd = new Date(dateStart.getTime()+minDisplay);
	}
	stURL += "&Source=" + escapeProperly(window.location.href);
	var evt = new CalEvent(displayDateStart, displayDateEnd, dateStart, dateEnd, stLocation, stDesc, stTitle, stURL, rgIcons);
	this.AddEvent(evt);
}
Calendar.prototype.AddEvent = CalAddEvent;
function CalAddEvent(evt)
{
	this.rgEvt[this.ievtMax++] = evt;
}
Calendar.prototype.AssignChannels = CalAssignChannels;
function CalAssignChannels()
{
	var ievt;
	this.mpSpan = new Object;       
	this.mpIchan = new Object;      
	this.mpEvents = new Object;     
	var fAllDaySeparate = false;
	var dateTodayStart;
	var dateTodayEnd;
	if (this.iperiod == 2 )
		{   
		fAllDaySeparate = true;
		dateTodayStart = this.dateStart;
		dateTodayEnd = this.dateTodayEnd;
		this.mpNoTimeEvents = new Array;
		this.mpAllDayEvents = new Array;
		var dailyStart = this.dopt.WorkDayStartHour - this.dopt.DailyStartHourDelta;
		var dailyEnd = this.dopt.WorkDayEndHour + this.dopt.DailyEndHourDelta;
		if (dailyStart < 0) dailyStart = 0;
		if (dailyEnd > 24) dailyEnd = 24;
		this.minQuarterStart = 4*dailyStart;
		this.maxQuarterEnd = 4*dailyEnd-1;
		for (ievt=0; ievt < this.rgEvt.length; ievt++)
			{
			evt = this.rgEvt[ievt];
			if ((evt.actualDateStart > dateTodayEnd || (evt.actualDateEnd-1) < dateTodayStart)
				|| (evt.actualDateStart <= dateTodayStart && evt.actualDateEnd >= dateTodayEnd))
				continue;
			irwMin = this.IrwFromDate(evt.dateStart);
			if (irwMin < 0)
				irwMin = 0;
			irwMax = this.IrwFromDate(evt.dateEnd);
			if (irwMax > this.irwMax)
				irwMax = this.irwMax;
			if (irwMin < this.irwMax && irwMax >= 0)
				{
				for (irw = irwMin; irw <= irwMax; irw++)
					{
					var date = new Date;
					this.SetDateFromGrid(date, irw, 0);
					if (date < dateTodayStart || date >= dateTodayEnd)
						continue;
					var quarterRow = date.getTime()/(Calendar.msHour/4);
					var quarterStart = MsFloorTime(evt.dateStart, Calendar.msHour/4, 0)/(Calendar.msHour/4) - quarterRow;
					var quarterEnd = MsFloorTime(evt.dateEnd, Calendar.msHour/4, 1)/(Calendar.msHour/4) - quarterRow + 1;
					if (quarterEnd < quarterStart)
						quarterEnd = quarterStart;
					if (quarterStart < this.minQuarterStart)
						this.minQuarterStart = quarterStart;
					if (quarterEnd > this.maxQuarterEnd)
						this.maxQuarterEnd = quarterEnd;
					if (quarterStart > 0 && 95 - quarterStart < 2)
						this.FVdayOverflow = true;
					}
				}
			}
			this.minQuarterStart = Math.floor(this.minQuarterStart/4)*4;
			if (this.minQuarterStart < 0)
				this.minQuarterStart = 0;
			if (this.maxQuarterEnd > 95)	
				this.maxQuarterEnd = 95;
			else
				this.maxQuarterEnd = 4 * (Math.floor(this.maxQuarterEnd/4) + 1) - 1;
		}
	if (this.iperiod <= 1 )	
		this.rgEvt.sort(CalEvtSort);
	var todayMiliSec = this.dateStart;
	todayMiliSec.setUTCHours(0,0,0,0);
	todayMiliSec = todayMiliSec.getTime();
	for (ievt=0; ievt < this.rgEvt.length; ievt++)
		{
		evt = this.rgEvt[ievt];
		if (fAllDaySeparate)
		{
			if (evt.actualDateStart.getTime() == todayMiliSec
				&& evt.actualDateEnd.getTime() == todayMiliSec)
				{
					this.mpNoTimeEvents[this.mpNoTimeEvents.length] = evt;
					continue;
				}
			if (evt.actualDateStart <= dateTodayStart
				&& evt.actualDateEnd >= dateTodayEnd)
				{
					this.mpAllDayEvents[this.mpAllDayEvents.length] = evt;
					continue;
				}
		}
		irwMin = this.IrwFromDate(evt.dateStart);
		if (irwMin < 0)
			irwMin = 0;
		irwMax = this.IrwFromDate(evt.dateEnd);
		if (irwMax > this.irwMax)
			irwMax = this.irwMax;
		if (irwMin < this.irwMax && irwMax >= 0)
			{
			for (irw = irwMin; irw <= irwMax; irw++)
				{
				this.PlaceEventInRow(evt, irw);
				}
			}
		}
}
function CalEvtSort(e1, e2)
{
	if (e1.multiDay ^ e2.multiDay)
	{
		if (e1.multiDay)
			return -1;
		else
			return 1;
	}
	else if (e1.multiDay)
	{
		var d1 = e1.dateEnd - e1.dateStart;
		var d2 = e2.dateEnd - e2.dateStart;
		if (d2 < d1)
			return -1;
		else if (d2 > d1)
			return 1;
		else
			return 0;
	}
	else
	{
		if (e1.dateStart < e2.dateStart)
			return -1;
		else if (e1.dateStart > e2.dateStart)
			return 1;
		else
			return 0;
	}
}
Calendar.prototype.PlaceEventInRow = CalPlaceEventInRow;
function CalPlaceEventInRow(evt, irw)
{
	var span;
	var date = new Date;
	this.SetDateFromGrid(date, irw, 0);
	if (this.iperiod == 2 )
		{
		if (irw != 0)	
			return;
		var quarterRow = date.getTime()/(Calendar.msHour/4);
		var quarterStart = MsFloorTime(evt.dateStart, Calendar.msHour/4, 0)/(Calendar.msHour/4) - quarterRow;
		var quarterEnd = MsFloorTime(evt.dateEnd, Calendar.msHour/4, 1)/(Calendar.msHour/4) - quarterRow;
		if (quarterEnd < quarterStart)
			quarterEnd = quarterStart;
		var workdayStart;
		var workdayEnd;
		if (this.iperiod == 2 )
			{
			workdayStart = this.minQuarterStart;
			workdayEnd = this.maxQuarterEnd;
			}
		else
			{
			workdayStart = 4*this.dopt.WorkDayStartHour;
			workdayEnd = 4*this.dopt.WorkDayEndHour-1;
			}
		if (quarterEnd >= workdayStart && quarterStart <= workdayEnd)
			{
			if (this.FVdayOverflow)
				workdayEnd = 99;
			quarterStart = Math.max(quarterStart, workdayStart);
			quarterEnd = Math.min(quarterEnd, workdayEnd);
			ichan = this.IchanNext(irw, quarterStart, quarterEnd);
			new Span(this, irw, quarterStart, quarterEnd, ichan, evt);
			}
		}
	else
		{
		var dayRow;
		var dayStart;
		var dayEnd;
		dayRow = date.getTime()/Calendar.msDay;
		dayStart = MsFloorTime(evt.dateStart, Calendar.msDay, 0)/Calendar.msDay - dayRow;
		dayEnd = MsFloorTime(evt.dateEnd, Calendar.msDay, 1)/Calendar.msDay - dayRow;
		if (dayEnd < dayStart
			|| (evt.actualDateEnd.getTime()-evt.actualDateStart.getTime()) < Calendar.msDay)
			{
			dayEnd = dayStart;
			}
		if (dayEnd >= 0 && dayStart <= 6)
			{
			dayStart = Math.max(dayStart, 0);
			dayEnd = Math.min(dayEnd, 6);
			ichan = this.IchanNext(irw, dayStart, dayEnd);
			new Span(this, irw, dayStart, dayEnd, ichan, evt);
			}
		}
}
function Span(cal, irw, start, end, ichan, evt)
{
	this.evt = evt;
	this.cbucket = end - start + 1;
	if (cal.iperiod == 2 )
		{   
		evt.ichan = ichan;
		evt.ihour = start;
		var maxEnd = cal.maxQuarterEnd;
		if (maxEnd == 95)	
			maxEnd = 99;
		evt.rowspan = Math.min(this.cbucket, 1 + maxEnd - start);
		}
	cal.mpSpan[irw + "." + start + "." + ichan] = this;
	for (bucket = start; bucket <= end; bucket++)
		{
		cal.mpIchan[irw + "." + bucket] = ichan + 1;
		var rgevt = cal.mpEvents[irw + "." + bucket];
		if (rgevt == null)
			{
			rgevt = new Array;
			cal.mpEvents[irw + "." + bucket] = rgevt;
			}
		rgevt[rgevt.length] = evt;
		}
}
Calendar.prototype.IchanNext = CalIchanNext;
function CalIchanNext(irw, start, end)
{
	var bucket;
	var ichan = 0;
	for (bucket = start; bucket <= end; bucket++)
		{
		if (this.mpIchan[irw + "." + bucket] != null)
			ichan = Math.max(ichan, this.mpIchan[irw + "." + bucket]);
		}
	return ichan;
}
Calendar.prototype.IrwFromDate = CalIrwFromDate;
function CalIrwFromDate(date)
{
	var irw;
	irw = Math.floor((date.getTime() - this.dateStart.getTime())/Calendar.msWeek);
	return irw;
}
Calendar.prototype.BuildUI = CalBuildUI;
function CalBuildUI()
{
	var st = this.StBuild();
	document.write(st);
}
Calendar.prototype.StBuild = CalStBuild;
function CalStBuild()
{
	this.AssignChannels();
	if (this.fDatePicker)
		return this.StBuildPicker();
	if (!this.fUseDHTML)
		return this.StDownlevelBuild();
	return this.StBuildDHTML();
}
Calendar.prototype.StBuildDHTML = CalStBuildDHTML;
function CalStBuildDHTML()
{
	var st;
	var span;
	var dateCur = new Date;
	var irw;
	var iday;
	var ichan;
	var cchan;
	var ihour;
	var iHourStart;
	var iHourEnd;
	var iGrayStart;	
	var iGrayEnd;	
	iHourStart = iGrayStart = 4*this.dopt.WorkDayStartHour;
	iHourEnd = 4*this.dopt.WorkDayEndHour;
	iGrayEnd = iHourEnd - 1;
	if (this.iperiod == 2 )
		{
		iHourStart = this.minQuarterStart;
		iHourEnd = this.maxQuarterEnd+1;
		if (iHourEnd == 96 && this.FVdayOverflow)
			iHourEnd = 100;
		}
	var stTDHigh = '<th style="cursor:hand;" onmouseover="HighlightText(this, \'red\');" onmouseout="HighlightText(this, \'\');" ';
	if (this.iperiod == 2 )
		{
		cchan = this.IchanNext(0, iHourStart, iHourEnd);
		var cNoTime = this.mpNoTimeEvents.length;
		var cAllDay = this.mpAllDayEvents.length;
		cchan = Math.max(cchan, this.cchanMin);
		if (this.cchanMax > 0)
			cchan = Math.min(cchan, this.cchanMax);
		st = "<table width=100% class=ms-cal cellpadding=0 cellspacing=0>";
		st += '<tr>' + stTDHigh + StClickEvent(this.stObject + '.MoveDate(-1)') + ' class=ms-calhead style="cursor:hand;" width=8%>&lt;</th><th width=84% class=ms-calhead nowrap>' +
			this.StDayMonthYear() +
			'</th>' + stTDHigh + StClickEvent(this.stObject + '.MoveDate(1)') + ' class=ms-calhead style="cursor:hand;" width=8%>&gt;</th></tr>';
		if (cNoTime > 0)
			{
			st += "</table><table width=100% class=ms-cal cellpadding=0 cellspacing=0>\r";
			st += "<tr height=0><td width="+(this.dopt.AllDayWidth+8)+"pt/><td/></tr>\r";
			st += "<tr><td class=ms-CalAllDay rowspan="+(cNoTime+1)+"></td><td width=1%/></tr>";
			for (i=0; i < cNoTime; i++)
				{
					evt = this.mpNoTimeEvents[i];
					st += "<tr><td class=ms-Vapptsingle style='border-top:1px solid black; border-left:1px solid black; border-bottom:1px solid black; border-right:1px solid black;' ";
					st += " TITLE=" + StAttrQuote(evt.StTip(this.dopt)) + "><nobr>"+
						StRenderVDayEvt(evt, this.dopt, 2) + "</nobr></td></tr>\r";
				}
			}
		if (cAllDay > 0)
			{
			st += "</table><table width=100% class=ms-cal cellpadding=0 cellspacing=0>\r";
			st += "<tr height=0><td width="+(this.dopt.AllDayWidth+8)+"pt/><td/></tr>\r";
			st += "<tr><td class=ms-CalAllDay rowspan="+(cAllDay+1)+">"+this.dopt.L_AllDay_Text+"</td><td width=1%/></tr>";
			for (i=0; i < cAllDay; i++)
				{
					evt = this.mpAllDayEvents[i];
					st += "<tr><td class=ms-Vapptsingle style='border-top:1px solid black; border-left:1px solid black; border-bottom:1px solid black; border-right:1px solid black;' ";
					st += " TITLE=" + StAttrQuote(evt.StTip(this.dopt)) + "><nobr>"+
						StRenderVDayEvt(evt, this.dopt, 2) + "</nobr></td></tr>\r";
				}
			}
		st += "</table><table width=100% STYLE='table-layout:fixed' class=ms-vcal cellpadding=0 cellspacing=0>\r";
		st += "<tr height=0><td width="+this.dopt.AllDayWidth+"pt/><td width=8pt/>\r";
		for (ichan = 1; ichan < cchan; ichan++)
			{
				st += "<td/>\r";
			}
		st += "</tr>\r";
		var LayoutGrid = new Object;         
		var HitDetect = new Array(iHourEnd); 
		for (ihour = iHourStart; ihour < iHourEnd; ihour++)
			{
			HitDetect[ihour] = 0;
			for (ichan = 0; ichan < cchan; ichan++)
				LayoutGrid[ihour + "." + ichan] = 0;
			}
		for (i = 0; i < this.rgEvt.length; i++)
			{
			var evt = this.rgEvt[i];
			var ihour = evt.ihour;
			var ichan = evt.ichan;
			var rowspan = evt.rowspan;
			var max = ichan+1;
			for (irow = 0; irow < rowspan; irow++)
				if (HitDetect[ihour+irow] > max)
					max = HitDetect[ihour+irow];
			for (irow = 0; irow < rowspan; irow++)
				{
				HitDetect[ihour+irow] = max;
				LayoutGrid[(ihour+irow) + "." + ichan] = 1;
				}
			}
		for (i = 0; i < this.rgEvt.length; i++)
			{
			var width = 0;
			var irow = 0;
			ihour = this.rgEvt[i].ihour;
			max = HitDetect[ihour]
			rowspan = this.rgEvt[i].rowspan;
			var hit=0;
			var popMax = false;
			for (irow = 1; irow < rowspan; irow++)
				{
				hit = HitDetect[ihour+irow];
				popMax |= hit != max;
				if (hit > max)
					max = hit;
				}
			if (!popMax)
				continue;
			for (irow = 0; irow < rowspan; irow++)
				HitDetect[ihour+irow] = max;
			}
		for (i = this.rgEvt.length-1; i >= 0; i--)
			{
			var width = 0;
			var irow = 0;
			ihour = this.rgEvt[i].ihour;
			max = HitDetect[ihour]
			rowspan = this.rgEvt[i].rowspan;
			var hit=0;
			var popMax = false;
			for (irow = 1; irow < rowspan; irow++)
				{
				hit = HitDetect[ihour+irow];
				popMax |= hit != max;
				if (hit > max)
					max = hit;
				}
			if (!popMax)
				continue;
			for (irow = 0; irow < rowspan; irow++)
				HitDetect[ihour+irow] = max;
			}
		for (ihour = iHourStart; ihour < iHourEnd; ihour++)
			{
			st += "<tr>\r";
			if (ihour%4 == 0)
				{
				var stHour = ihour/4;
				if (stHour == 24)
					stHour = "&nbsp;"; 
				else if (this.dopt.f12Hour)
					{
					stHour = ((ihour/4+11)%12+1);
					if (this.dopt.TimeMarkPosn == 0)
						{
						stHour += " " + ((ihour/4 < 12) ? this.dopt.stAM : this.dopt.stPM);
						}
					else
						stHour = ((ihour/4 < 12) ? this.dopt.stAM : this.dopt.stPM) + " " + stHour;
					}
				var stGrayBG = "";
				if ((ihour < iGrayStart || ihour > iGrayEnd))
				{
					stGrayBG = ' BGCOLOR="#e6e6e6" ';
				}
				if (ihour != iHourStart || cAllDay > 0 || cNoTime > 0)
					{
					st += "<td class=ms-CalHour rowspan=2"+stGrayBG+"><nobr>" + stHour + "</nobr></td>";
					st += "<td class=ms-calHour"+stGrayBG+">&nbsp;</td>\r";
					}
				else
					{
					st += "<td class=ms-firstCalHour rowspan=2"+stGrayBG+"><nobr>" + stHour + "</nobr></td>";
					st += "<td class=ms-firstCalHour"+stGrayBG+">&nbsp;</td>\r";
					}
				}
			else if (ihour%2 == 0)
				{
				st += "<td class=ms-CalHalfHour"+stGrayBG+">&nbsp;</td>\r";
				st += "<td class=ms-calHalfHour"+stGrayBG+">&nbsp;</td>\r";
				}
			else if (ihour%4 == 1)
				{
				st += "<td class=ms-CalQuarterHour"+stGrayBG+">&nbsp;</td>\r";
				}
			else if (ihour%4 == 3)
				{
				st += "<td class=ms-CalQuarterHour"+stGrayBG+">&nbsp;</td>\r";
				st += "<td class=ms-calQuarterHour"+stGrayBG+">&nbsp;</td>\r";
				}
			for (ichan = 0; ichan < cchan; ichan++)
				{
				span = this.mpSpan[0 + "." + ihour + "." + ichan];
				if (span != null)
					{
					var stClass = "ms-Vappt";
					var rowspan = span.evt.rowspan;
					var colspan = Math.floor(cchan / HitDetect[ihour]);
					if (colspan > cchan / this.cchanMin)
						colspan = Math.floor(cchan / this.cchanMin);
					var reduceby = colspan - 1;
					if (reduceby > 0)
						for (irow = 0; irow < rowspan; irow++)
							{
							reduceby = colspan - 1;
							for (jchan = cchan-1; jchan > ichan && reduceby > 0; jchan--)
								{
								if (LayoutGrid[(ihour+irow) + "." + jchan] == 0)
									{
										LayoutGrid[(ihour+irow) + "." + jchan] = 1;
										reduceby--;
									}
								}
							}
					st += "<td class=" + stClass +
						" style='border-top:1px solid black; border-left:1px solid black; border-bottom:2px solid black; border-right:2px solid black;' rowspan=" + span.evt.rowspan;
					if (colspan > 1)
						st += " colspan=" + colspan;
					st += " TITLE=" + StAttrQuote(span.evt.StTip(this.dopt)) + "><nobr>"+
						StRenderVDayEvt(span.evt, this.dopt, span.evt.rowspan) + "</nobr></td>\r";
					}
				else if (LayoutGrid[ihour + "." + ichan] == 0)
					{
					if (ihour%4 == 0)
						{
						if (ihour != iHourStart || cAllDay > 0 || cNoTime > 0)
							st += "<td class=ms-calHour" +stGrayBG+">&nbsp;</td>\r";
						else
							st += "<td class=ms-firstCalHour"+stGrayBG+">&nbsp;</td>\r";
						}
					else if (ihour%2 == 0)
						st += "<td class=ms-calHalfHour"+stGrayBG+">&nbsp;</td>\r";
					else
						st += "<td class=ms-calQuarterHour"+stGrayBG+">&nbsp;</td>\r";
					}
				}
			st += "</tr>\r";
			}
		st += "<tr>\r";
		for (ichan = -2; ichan < cchan; ichan++)
			{
			st += "<td class=ms-CalHour>&nbsp;</td>\r";
			}
		st += "</tr>\r";
		}
	else 
		{
		var fWeekly = this.iperiod == 1;
		st = "<table width=100% class=ms-cal cellpadding=0 cellspacing=0>";
		st += '<tr>' + stTDHigh + StClickEvent(this.stObject + '.MoveDate(-1)') + ' class=ms-calhead style="cursor:hand;">&lt;</td><td class=ms-calhead colspan=5>';
		if (this.iperiod == 0 )
			st += this.StMonthYear();
		else 
			st += this.StDaySpanMonthYear();
		st += '</td>' + stTDHigh + StClickEvent(this.stObject + '.MoveDate(1)') + ' class=ms-calhead style="cursor:hand;">&gt;</td></tr>';
		st += "<tr>\r";
		for (iday = 0; iday < 7; iday++)
			{
			st += "<td class=ms-calDOW>" + Calendar.rgDOW[(iday+this.dopt.dow)%7] + "</td>\r";
			}
		st += "</tr>";
		for (irw = 0; irw < this.irwMax; irw++)
			{
			cchan = Math.max(this.IchanNext(irw, 0, 6), this.cchanMin);
			if (this.cchanMax > 0)
				cchan = Math.min(cchan, this.cchanMax);
			st += "<tr>\r";
			for (iday = 0; iday < 7; iday++)
				{
				this.SetDateFromGrid(dateCur, irw, iday);
				st += '<td class=ms-calTop' + this.DayStyle(dateCur, false, true, fWeekly) +
					'>&nbsp;<span style="cursor:hand;" onmouseover="HighlightText(this, \'red\');" onmouseout="HighlightText(this, \'\');"' + StClickEvent(this.stObject + ".MoveToDay(" + dateCur.getUTCFullYear() + "," + (dateCur.getUTCMonth()+1) + "," + dateCur.getUTCDate() + ")") + ">" + dateCur.getUTCDate() + "</span>&nbsp;</td>\r";
				}
			st += "</tr>\r";
			for (ichan = 0; ichan < cchan; ichan++)
				{
				if (this.iperiod == 1 )
				{	
					st += "<tr>\r";
					for (iday = 0; iday < 7; iday++)
						{
						this.SetDateFromGrid(dateCur, irw, iday);
						if (ichan == cchan-1 && this.SpanCheck(irw, iday, ichan, cchan)) 
							{
								st += "<td class=ms-apptsingle " + this.DayStyle(dateCur, false, false, fWeekly) + ">&nbsp;</td>";
							}
						else
							{
							span = this.mpSpan[irw + "." + iday + "." + ichan];
							if (span != null
								&& !span.evt.multiDay
								&& 0 != span.evt.actualDateStart.getTime() % Calendar.msDay
								&& 0 != span.evt.actualDateEnd.getTime() % Calendar.msDay)
								{
								var stClass = "ms-apptsingle" + this.DayStyle(dateCur, false, false, fWeekly);
								st += "<td class=" + stClass +
											" colspan=" + span.cbucket + " TITLE=" + StAttrQuote(span.evt.StTip(this.dopt)) + "><nobr>";
								st += StEvtTime(span.evt, this.dopt, true);
								st += "&nbsp;</nobr></td>\r";
								iday += span.cbucket - 1;
								}
							else
								{
								st += "<td class=ms-calMid" + this.DayStyle(dateCur, false, false, fWeekly) + ">&nbsp;</td>\r";
								}
							}
						}
					st += "</tr>\r";
				}
				st += "<tr>\r";
				for (iday = 0; iday < 7; iday++)
					{
					this.SetDateFromGrid(dateCur, irw, iday);
					if (ichan == cchan-1 && this.SpanCheck(irw, iday, ichan, cchan)) 
						{
							st += "<td class=ms-apptsingle " + this.DayStyle(dateCur, false, false, fWeekly) +
							'><span style="cursor:hand;" onmouseover="HighlightText(this, \'red\');" onmouseout="HighlightText(this, \'\');"' + StClickEvent(this.stObject + ".MoveToDay(" + dateCur.getUTCFullYear() + "," + (dateCur.getUTCMonth()+1) + "," + dateCur.getUTCDate() + ")") +
							">"+this.dopt.L_More_Text+"</span></td>\r";
						}
					else
						{
						span = this.mpSpan[irw + "." + iday + "." + ichan];
						if (span != null)
							{
							var stClass = "ms-appt";
							if (!span.evt.multiDay)
								stClass = "ms-apptsingle" + this.DayStyle(dateCur, false, false, fWeekly);
							st += "<td class=" + stClass +
								" colspan=" + span.cbucket + " TITLE=" + StAttrQuote(span.evt.StTip(this.dopt)) + "><nobr>"+
								StURL(span.evt.stURL, span.evt.stTitle) + "</nobr></td>\r";
							iday += span.cbucket - 1;
							}
						else
							{
							st += "<td class=ms-calMid" + this.DayStyle(dateCur, false, false, fWeekly) + ">&nbsp;</td>\r";
							}
						}
					}
				st += "</tr>\r";
				st += "<tr>\r";
				if (ichan == cchan-1)
					stClass = "ms-CalBot";
				else
					stClass = "ms-CalSpacer";
				for (iday = 0; iday < 7; iday++)
					{
					this.SetDateFromGrid(dateCur, irw, iday);
					st += "<td class=" + stClass + this.DayStyle(dateCur, ichan == cchan-1, false, fWeekly) + ">&nbsp;</td>\r";
					}
				st += "</tr>\r";
				}
			}
		}
	st += "</table>";
	return st;
}
Calendar.prototype.SpanCheck = CalSpanCheck;
function CalSpanCheck(irw, iday, ichan, cchan)
{
	var span;
	var i;
	var iMax;
	if (this.IchanNext(irw, iday, iday) > cchan)
		return true;
	span = this.mpSpan[irw + "." + iday + "." + ichan];
	if (span != null)
	{
		iMax = span.cbucket+iday;
		if (iMax > 7)
			iMax = 7;
		for (i=iday+1; i<iMax; i++)
		{
			if (this.IchanNext(irw, i, i) > cchan)
				return true;
		}
	}
	return false;
}
function StRenderVDayEvt(evt, dopt, rowSpan)
{
	var st = "";
	st += "<table height=12px border='0' cellpadding='0' cellspacing='0' style='border-collapse: collapse; padding-right:6px' ><tr>";
	if (evt.rgIcons && evt.rgIcons.length)
	{
		var i;
		var bAllBlank = true;
		for (i in evt.rgIcons)
			if (evt.rgIcons[i] && evt.rgIcons[i].indexOf("blank.gif") < 0)
			{
				bAllBlank=false;
				break;
			}				
		if (!bAllBlank)
		{
			st += "<td valign=top nowrap>";
			for (i in evt.rgIcons)
				if (evt.rgIcons[i] && evt.rgIcons[i].length)
					st += evt.rgIcons[i];
			st += "</td>";
		}
	}
	st += "<td nowrap>" + StURL(evt.stURL, evt.stTitle) + "</td></tr></table>";
	if (rowSpan > 2)
		st += "<nobr>" + StEvtTime(evt, dopt, false) + "</nobr>";
	if (rowSpan > 3
		&& evt.stLocation != null)
		st += "<br><nobr>" + STSHtmlEncode(evt.stLocation) + "</nobr>";
	return st;
}
function StEvtTime(evt, dopt, fAMPM)
{
	var st="";
	if (fAMPM)
		st += dopt.StTime(evt.actualDateStart);
	else
		st += dopt.StBareTime(evt.actualDateStart);
	if (evt.actualDateStart.getTime() != evt.actualDateEnd.getTime()
		&& (MsFloorTime(evt.actualDateStart, Calendar.msDay, 0) == MsFloorTime(evt.actualDateEnd, Calendar.msDay, 0)
			|| (evt.actualDateEnd.getTime() - evt.actualDateStart.getTime()) < Calendar.msDay))
		{
		st += " - ";
		if (fAMPM)
			st += dopt.StTime(evt.actualDateEnd);
		else
			st += dopt.StBareTime(evt.actualDateEnd);
		}
	return st;
}
function StClickEvent(st)
{
	return 'onclick="' + st + '" ondblclick="' + st + '"';
}
var L_TodaysDate_Text = "Today's date is ^1";
Calendar.prototype.StBuildPicker = CalStBuildPicker;
function CalStBuildPicker()
{
	var st;
	var dateCur = new Date;
	var dateToday = this.dopt.Today();
	var irw;
	var iday;
	var stClass;
	var ievt;
	var L_LittleRedDiamond_TXT = "&loz;"; // This is the little red diamond in the calendar picker. If the diamond doesn't show up for your language you can localize it to e.g. an asterisk.
	st = '<TABLE ONSELECTSTART="return false;" CLASS=ms-datepicker CELLPADDING="2" CELLSPACING="0" BORDER="1">\r';
	var stTDHigh = '<td style="cursor:hand;" onmouseover="Highlight(this, \'yellow\', \'black\');" onmouseout="Highlight(this, \'\', \'\');" ';
	st += '<tr>' + stTDHigh + StClickEvent(this.stObject + '.MoveMonth(-1)') + ' class=ms-dpnextprev>&lt;</td><td class=ms-dphead colspan=5>' +
		this.StMonthYear() +
		'</td>' + stTDHigh + StClickEvent(this.stObject + '.MoveMonth(1)') + ' class=ms-dpnextprev>&gt;</td></tr>';
	st += "<tr>\r";
	for (iday = 0; iday < 7; iday++)
		{
		st += '<TD class=ms-dpdow HEIGHT="20" WIDTH="14%">' +
			'&nbsp;' + Calendar.rgDOWDP[(iday+this.dopt.dow)%7] + '&nbsp;</TD>\r';
		}
	st += "</tr>\r";
	for (irw = 0; irw < this.irwMax; irw++)
		{
		st += "<tr>\r";
		for (iday = 0; iday < 7; iday++)
			{
			this.SetDateFromGrid(dateCur, irw, iday);
			var rgevt = this.mpEvents[irw + "." + iday];
			var fHasEvent = (rgevt != null);
			var yr = dateCur.getUTCFullYear();
			var mon = dateCur.getUTCMonth();
			var day = dateCur.getUTCDate();
			st += stTDHigh + StClickEvent(this.stObject + '.ClickDay(' + yr + ',' + mon + ',' + day + ')');
			if (fHasEvent)
				{
				var stTips = "";
				for (ievt = 0; ievt < rgevt.length; ievt++)
					{
					stTips += rgevt[ievt].StTip(this.dopt);
					if (ievt < rgevt.length-1)
						stTips += "\r";
					}
				st += " TITLE=" + StAttrQuote(stTips);
				}
			st += ' WIDTH="14%"' +
				this.DPDayStyle(dateCur, fHasEvent) + '>&nbsp;' + (fHasEvent ? "<b>" : "") +
				dateCur.getUTCDate() + (fHasEvent ? "</b>" : "") +
				(dateCur.getTime() == dateToday.getTime() ? "<font color=red>" + L_LittleRedDiamond_TXT + "</font>" : "&nbsp;");
			st += '</TD>\r';
			}
		st += "</tr>\r";
		}
	var stTodayLink = "<A HREF='javascript:" + this.stObject + ".SetDate(" + dateToday.getUTCFullYear() + "," +
		dateToday.getUTCMonth() + "," + dateToday.getUTCDate() + ");'>" + this.dopt.StDate(dateToday) + "</A>";
	st += "<tr><td class=ms-DPFoot colspan=7><font color=red>&loz;</font>" +
		StBuildParam(L_TodaysDate_Text, stTodayLink) + "</td></tr>";
	st += "</table>";
	return st;
}
Calendar.prototype.MoveDate = CalMoveDate;
function CalMoveDate(delta)
{
	if(this.iperiod == 2 )
		this.MoveVDay(delta)
	else if (this.iperiod == 1 )
		this.MoveWeek(delta)
	else
		this.MoveMonth(delta);
}
Calendar.prototype.MoveMonth = CalMoveMonth;
function CalMoveMonth(dmon)
{
	var stURL;
	var mon = this.givenDate.getUTCFullYear() * 12 + this.givenDate.getUTCMonth() + dmon;
	var yr = Math.floor(mon / 12);
	mon = mon % 12;
	if (dmon != 0)
		stURL = StURLSetVar("CalendarDate", yr + "-" + St2Digits(mon+1) + "-1");
	else
		stURL = StURLSetVar("CalendarDate", yr + "-" + St2Digits(mon+1) + "-" + (this.givenDate.getUTCDate()));
	stURL = StURLSetVar2(stURL, "CalendarPeriod", "month");
	this.Post(stURL);
}
Calendar.prototype.MoveWeek = CalMoveWeek;
function CalMoveWeek(dweek)
{
	var stURL;
	var date = this.givenDate;
	date.setUTCDate(this.givenDate.getUTCDate() + 7*dweek);
	stURL = StURLSetVar("CalendarDate", date.getUTCFullYear() + "-" + St2Digits(date.getUTCMonth()+1) + "-" + (date.getUTCDate()));
	stURL = StURLSetVar2(stURL, "CalendarPeriod", "week");
	this.Post(stURL);
}
Calendar.prototype.MoveDay = CalMoveDay;
Calendar.prototype.MoveVDay = CalMoveDay;   
function CalMoveDay(dday)
{
	var stURL;
	var date = this.givenDate;
	date.setUTCDate(this.givenDate.getUTCDate() + dday);
	stURL = StURLSetVar("CalendarDate", date.getUTCFullYear() + "-" + St2Digits(date.getUTCMonth()+1) + "-" + (date.getUTCDate()));
	stURL = StURLSetVar2(stURL, "CalendarPeriod", "day");
	this.Post(stURL);
}
Calendar.prototype.MoveToDay = CalMoveToDay;
function CalMoveToDay(yr, mon, day)
{
	var stURL;
	stURL = StURLSetVar("CalendarDate", yr + "-" + St2Digits(mon) + "-" + day);
	stURL = StURLSetVar2(stURL, "CalendarPeriod", "day");
	this.Post(stURL);
}
Calendar.prototype.MoveToToday = CalMoveToToday;
function CalMoveToToday()
{
	var date = this.dopt.Today();
	var stURL = StURLSetVar("CalendarDate", date.getUTCFullYear() + "-" + St2Digits(date.getUTCMonth()+1) + "-" + date.getUTCDate());
	this.Post(stURL);
}
Calendar.prototype.Post = CalDoPost;
function CalDoPost(stURL)
{
	if (this.stViewID && this.stViewID.length)
		stURL = StURLSetVar2(stURL, "View", this.stViewID);
	SubmitFormPost(stURL);
}
function EditSeries(stEditURL)
{
	var stID = "";
	if (stEditURL)
		stID = StSearchVar(stEditURL, "ID");
	else
		stID = StURLGetVar("ID");
	if (stID.length)
	{
		var iOccurDate = stID.indexOf(".0.");
		if (iOccurDate > 0)
		{
			var stURL = "";
			if (stEditURL)
			{
				stURL = window.location.href;
				var ichQ = stURL.indexOf("?");
				if (ichQ > 0)
					stEditURL += stURL.substring(ichQ, stURL.length);
				stURL = StURLSetVar2(stEditURL, "ID", stID.substr(0, iOccurDate));
			}
			else
				stURL = StURLSetVar("ID", stID.substr(0, iOccurDate));
			window.location.href = stURL;
		}
	}
}
function EditSeriesID(stMasterID, stEditURL)
{
	if (stMasterID.length)
	{
		var stURL = "";
		if (stEditURL)
		{
			stURL = window.location.href;
			var ichQ = stURL.indexOf("?");
			if (ichQ > 0)
				stEditURL += stURL.substring(ichQ, stURL.length);
			stURL = StURLSetVar2(stEditURL, "ID", stMasterID);
		}
		else
			stURL = StURLSetVar("ID", stMasterID);
		window.location.href = stURL;
	}
}
function StURLSetVar(stVar, stValue)
{
	return StURLSetVar2(window.location.href, stVar, stValue);
}
function StViewURLSetVar(viewPage, stVar, stValue)
{
	stUrl = window.location.href;
	p1 = stUrl.lastIndexOf("/");
	if (p1 > 0)
		stUrl = stUrl.substring(0, p1+1) + viewPage;
	return StURLSetVar2(stUrl, stVar, stValue);
}
function StURLSetVar2(stURL, stVar, stValue)
{
	var stNewSet = stVar + "=" + stValue;
	var ichQ = stURL.indexOf("?");
	if (ichQ != -1)
		{
		var ich = stURL.indexOf("?" + stVar + "=", ichQ);
		if (ich == -1)
			{
			ich = stURL.indexOf("&" + stVar + "=", ichQ);
			if (ich != -1)
				stNewSet = "&" + stNewSet;
			}
		else
			{
			stNewSet = "?" + stNewSet;
			}
		if (ich != -1)
			{
			var re = new RegExp("[&?]" + stVar + "=[^&]*", "");
			stURL = stURL.replace(re, stNewSet);
			}
		else
			{
			stURL = stURL + "&" + stNewSet;
			}
		}
	else
		stURL = stURL + "?" + stNewSet;
	return stURL;
}
function StURLGetVar(stVar)
{
	var stURL = document.location.href;
	return StSearchVar(stURL, stVar);
}
function StSearchVar(st, stVar)
{
	var re = new RegExp("[?&]" + stVar + "=", "g");
	var ich = st.search(re);
	if (ich == -1)
		return "";
	ich += stVar.length + 2;
	var ichEnd = st.indexOf("&", ich+1);
	if (ichEnd == -1)
		ichEnd = st.length;
	var stValue = st.substring(ich, ichEnd);
	return stValue;
}
function HighlightText(elt, stText)
{
	if (stText != "")
		{
		elt.colorTextSav = elt.style.color;
		elt.style.color = stText;
		}
	else
		{
		elt.style.color = elt.colorTextSav;
		}
}
function Highlight(elt, stHighlight, stText)
{
	if (stHighlight != "")
		{
		elt.colorBackSav = elt.style.backgroundColor;
		elt.colorTextSav = elt.style.color;
		elt.style.backgroundColor = stHighlight;
		elt.style.color = stText;
		}
	else
		{
		elt.style.backgroundColor = elt.colorBackSav;
		elt.style.color = elt.colorTextSav;
		}
}
Calendar.prototype.DPDayStyle = CalDPDayStyle;
function CalDPDayStyle(dateCur, fHasEvent)
{
	var st = "";
	if (dateCur.getTime() == this.dateDP.getTime())
		st += " class=ms-dpselectedday";
	else if (dateCur.getUTCMonth() != this.mon)
		st += " class=ms-dpnonmonth";
	else
		st += " class=ms-dpday";
	if (fHasEvent)
		{
		st += ' style:"font-weight: bold;"';
		}
	return st;
}
Calendar.prototype.StDownlevelBuild = CalStDownlevelBuild;
function CalStDownlevelBuild()
{
	var st;
	var dateCur = new Date;
	var irw;
	var iday;
	var stClass;
	var ievt;
	st = '<TABLE CELLPADDING="2" CELLSPACING="0" WIDTH="100%" BORDER="1">\r';
	st += '<TR><TD class=ms-calhead><A class=ms-calhead TARGET=_self HREF="javascript:' + this.stObject + '.MoveDate(-1);"><B>&lt;</B></A></TD><TD class=ms-calhead colspan=5>' +
		this.StMonthYear() +
		'</TD><TD class=ms-calhead><A class=ms-calhead TARGET=_self HREF="javascript:' + this.stObject + '.MoveDate(1);"><B>&gt;</B></A></TD></TR>';
	st += "<tr>\r";
	for (iday = 0; iday < 7; iday++)
		{
		st += '<TD class=ms-calDOWDown HEIGHT="20" WIDTH="14%">' +
			'&nbsp;' + Calendar.rgDOW[(iday+this.dopt.dow)%7] + "&nbsp;</TD>\r";
		}
	st += "</tr>\r";
	for (irw = 0; irw < this.irwMax; irw++)
		{
		st += "<tr>\r";
		for (iday = 0; iday < 7; iday++)
			{
			this.SetDateFromGrid(dateCur, irw, iday);
			st += '<TD class=ms-calDown HEIGHT="80" WIDTH="14%"' +
				this.DayStyle(dateCur) + '>&nbsp;' + dateCur.getUTCDate() + "&nbsp;<br>\r";
			var rgevt = this.mpEvents[irw + "." + iday];
			if (rgevt != null)
				{
				for (ievt = 0; ievt < rgevt.length; ievt++)
					{
					st += StURL(rgevt[ievt].stURL, rgevt[ievt].stTitle) + '<br>\r';
					}
				}
			st += '</TD>';
			}
		st += "</tr>\r";
		}
	st += "</table>";
	return st;
}
Calendar.prototype.SetDateFromGrid = CalSetDateFromGrid;
function CalSetDateFromGrid(date, irw, iday)
{
	date.setTime(this.dateStart.getTime() + irw * Calendar.msWeek +
		iday*Calendar.msDay);
}
var L_NoTitle_Text = "(No Title)";
function CalEvent(dateStart, dateEnd, actualDateStart, actualDateEnd, stLocation, stDesc, stTitle, stURL, rgIcons)
{
	this.dateStart = dateStart;
	this.dateEnd = dateEnd;
	this.actualDateStart = actualDateStart;
	this.actualDateEnd = actualDateEnd;
	this.stLocation = stLocation;
	this.stDesc = stDesc;
	this.stTitle = stTitle;
	if (stTitle.length == 0)
		this.stTitle = L_NoTitle_Text;
	this.stURL = stURL;
	this.rgIcons = rgIcons;
	var start;
	var end;
	var dayStart = MsFloorTime(dateStart, Calendar.msDay, 0);
	var dayEnd = MsFloorTime(dateEnd, Calendar.msDay, 1);
	if (dayStart < dayEnd
		&& (actualDateEnd.getTime() - actualDateStart.getTime()) >= Calendar.msDay)
	{
		this.multiDay = true;
	}
	else
		this.multiDay = false;
	var quarterStart = MsFloorTime(dateStart, Calendar.msHour/4, 0);
	var quarterEnd = MsFloorTime(dateEnd, Calendar.msHour/4, 1);
	if (quarterStart < quarterEnd)
		this.multiQuarter = true;
}
CalEvent.prototype.FOverlap = EvtFOverlap;
function EvtFOverlap(evt)
{
	return evt.dateStart <= this.dateEnd && evt.dateEnd >= this.dateStart;
}
var L_Tip_Text = "^1: ^2";
CalEvent.prototype.StTip = EvtStTip;
function EvtStTip(dopt)
{
	var stT;
	var stTime = StEvtTime(this, dopt, true);
	if (DateOptions.FHasTime(this.actualDateStart) || DateOptions.FHasTime(this.actualDateEnd))
		stT = StBuildParam(L_Tip_Text, stTime, this.stTitle);
	else
		stT = this.stTitle;
	if (!FBlankString(this.stLocation))
		stT += "\r" + this.stLocation;
	if (!FBlankString(this.stDesc))
		stT += "\r" + this.stDesc;
	return stT;
}


*/