//---------------------------------------------------------------------------
//
//  dhtmlcal.js 
//  a component of ScriptCalendar 
//  (c)2000 Dan Shipe 
//  www.scriptcalendar.com
//  webmaster@scriptcalendar.com
//
//    Date     By   Ver   Description
// ----------  ---  ----  ---------------------------------------------------
// 09-01-2000  DS   1.00  Initial creation
// 04-10-2001  DS   1.01  Now supports Netscape 6, Gekko
// 05-30-2001  DS   1.02  Added cookies to track month & year if user "refreshs"
// 07-06-2001  DS   1.03  Fixed bug to set main table border color to mclrBorder
// 07-09-2001  DS   1.04  Added DHTMLCal_PopUp to support event pop-up windows
// 07-10-2001  DS   1.05  Added support to place text in dead cells
// 08-23-2001  DS   1.06  Added inidividual date cell custom colors
// 08-30-2001  DS   1.07  Added booleans to hide Month and Year drop-downs
// 09-04-2001  DS   1.08  Supports "every month" and "every year" dates
// 09-11-2001  DS   1.09  A week may now begin Sunday or Monday
// 11-16-2001  DS   1.10  Added independent active weekend color
// 01-03-2001  DS   1.11  Supports relatively positioned DHTML elements in NS 4.75
// 03-03-2002  DS   2.00  Object Oriented Design
// 04-10-2002  DS   2.01  Fix for floating year and null weekday
// 06-24-2002  DS   2.02  Fix for Monday weeks and first day is Sunday
// 11-09-2002  DS   2.03  Supports Netscape 7
// 12-01-2002  DS   2.04  modifications for slots & financial calendar
// 02-01-2003  DS   2.05  bug fixes 
// 03-04-2003  DS   2.06  bug fixes (trackSelectedDate and dead dates)
// 01-01-2004  DS   3.00  XML support for MSIE browsers

var maEvents = new Array();
var mobjXml;
var msKey = "k1!2db/84$j4ertw!nloezkt4ieoxgwt5nloh5locslt9xp3.lz9";
var mnOmed;

function Calendar (name) 
{
	var dteNow = new Date();
	this.r = "\r\n";
	this.q = "\"";
	this.name = name;
	this.initialMonth = dteNow.getMonth();
	this.initialYear = dteNow.getFullYear();
	this.slotCount = 1;
	this.xmlFile = "";
	this.cellWidth  = 100;
	this.cellHeight = 90;
	this.borderWidth = 1;
	this.beginMonday = false;
	this.displayDeadText = false;
	this.displayDeadNumber = false;
	this.displayMonthCombo = true;
	this.displayYearCombo = true;
	this.todayText = null;
	this.bottomHeading= false;
	this.dateBreak = true;
	this.trackSelectedDate= true;
	this.clrTable= "#FFFFFE";
	this.clrDead= "#FFFFFF";
	this.clrNow= "#ffffff";
	this.clrPast= "#AAD3F4";
	this.clrFuture= "#AAD3F4";
	this.clrWeekend= null;
	this.clrBorder= "#ffffff";
	this.clrHdrBg   = "#F9E6A6";
	this.clrHdrText= "#000000";
	this.clrCellText= "#660066";
	var szFont = "Verdana, Arial, Helvetica, sans-serif";
	this.hdrFace= szFont;
	this.hdrSize= "2";
	this.numFace= szFont;
	this.numSize= "3";
	this.cellFace= szFont;
	this.cellSize= "2";
	mnOmed=31;
	this.monthStartDate = new Array(1,1,1,1,1,1,1,1,1,1,1,1);
	this.longDays = new Array( "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" );
	this.daysPerMonth = new Array( 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 );
	this.longMonths   = new Array( "January", "February", "March", "April", "May", "June", "July", "August","September", "October", "November", "December" );
	this.createDateSelect = dcCreateDateSelect;
	this.fillMonth = dcFillMonth;
	this.fillYear = dcFillYear;
	this.chkLeapYear = dcChkLeapYear;
	this.createCalendar = dcCreateCalendar;
	this.calendarHTML = dcCalendarHTML;
	this.chkColor = dcChkColor;
	this.getDay = dcGetDay;
	this.isWeekday = dcIsWeekday;
	this.readDate = dcReadDate;
	this.getFormElement = dcGetFormElement;
	this.chkForEvent = evChkForEvent;
	this.chkForEvent2 = evChkForEvent2;
	this.month = dcMonth;
	this.year = dcYear;
}
	
function dcCreateDateSelect() 
{
	var szHTML;
	var szTag;
	var szHide;
	var szOutput = "";
	var dteCurr = new Date();
	var cy = dteCurr.getFullYear();
	var m = this.readDate("m");
	var y = this.readDate("y");
	if (this.xmlFile.length!=0)
	{
		mobjXml = new ActiveXObject("Microsoft.XMLDOM");
		mobjXml.async = false;
		mobjXml.load(this.xmlFile);
	}
	if (this.displayMonthCombo==false&& this.displayYearCombo==false)
		return null;
		
	szHTML = "<form name='frmCal' id='frmCal' method='post' action=''>" + this.r;
	szOutput = szOutput + szHTML;
	szHTML = "<table"+ " align=center"+ " width='" + ((this.cellWidth) * 7) + "'"+ " border='1'"+ " bordercolor='" + this.clrBorder + "'"+ " bordercolordark='" + this.clrBorder + "'"+ " bordercolorlight='" + this.clrBorder + "'"+ " cellspacing=0"+ " >" + this.r;
	szOutput = szOutput + szHTML;
	szHTML = "<tr><td"+ " align=center"+ " bgcolor=" + this.clrHdrBg+ " >" + this.r + this.r;
	szOutput = szOutput + szHTML;
	szTemp = " cboYear.options[frmCal.cboYear.selectedIndex].value";
	if (this.displayYearCombo==false)
		szTemp = y.toString();
	
	szHTML = "<select name='cboMonth' id='cboMonth'"+ " onchange='dcUpdate(" + this.name + ", " + this.r+ " cboMonth.options[frmCal.cboMonth.selectedIndex].value"+ "," + this.r+ szTemp+ ");'>" + this.r+ this.fillMonth(m)+ "</select>" + this.r + this.r;
	if (this.displayMonthCombo==true)
		szOutput = szOutput + szHTML;
	
	szTemp = " cboMonth.options[frmCal.cboMonth.selectedIndex].value";
	if (this.displayMonthCombo==false)
		szTemp = m.toString();
		
	szHTML = "<select name='cboYear' id='cboYear'"+ " onchange='dcUpdate(" + this.name + ", " + this.r+ szTemp+ "," + this.r+ " cboYear.options[frmCal.cboYear.selectedIndex].value"+ ");'>" + this.r+ this.fillYear(y, cy)+ "</select>" + this.r + this.r;
	
	if (this.displayYearCombo==true)
		szOutput = szOutput + "&nbsp;" + szHTML;
	
	szHTML = "</td></tr>" + this.r;
	szOutput = szOutput + szHTML;
	szOutput = szOutput + "</table></form>" + this.r + this.r;
	document.writeln(szOutput);
	return szOutput;
}

function dcCreateCalendar(m, y)
{
	var obj;
	var szHTML;
	var bRedraw = true;
	var szBrowName = dcBrowserName();
	var szBrowVer = dcBrowserVer();
	if (m==null && y==null)
	{
		bRedraw = false;
		if (this.trackSelectedDate)
		{
			m = this.readDate("m");
			y = this.readDate("y");
		}
		else
		{
			m = this.initialMonth;
			y = this.initialYear;
		}
	}
	var cboMonth = this.getFormElement("frmCal", "cboMonth");
	var cboYear = this.getFormElement("frmCal", "cboYear");
	if (cboMonth!=null)
		cboMonth.selectedIndex = m;
		
	if (cboYear!=null)
		cboYear.value = y;dcSaveDate(m, y);
		
	szHTML = this.calendarHTML( m, y );
	if ( szBrowName=="IE" )
	{
		if (bRedraw==true)
		{
			obj = dcGetObj("MSIE");
			obj.innerHTML = szHTML;
		}
		else
		{
			document.writeln(szHTML);
		}
	}
	else if ( szBrowName=="NS" )
	{
		if ( szBrowVer<"5" )
		{
			if (bRedraw==true)
			{
				document.NSALIGN.document.NSLAYER.document.write(szHTML);
				document.NSALIGN.document.NSLAYER.document.close();
			}
			else
			{
				document.NSALIGN.document.NSLAYER.document.writeln(" ");
				document.NSALIGN.document.NSLAYER.document.writeln(szHTML);
				document.NSALIGN.document.NSLAYER.document.writeln(" ");
			}
		}
		else
		{
			if (bRedraw==true)
			{
				obj = dcGetObj("MSIE");
				dcSetInnerHTML(obj, szHTML);
			}
			else
			{
				document.writeln(szHTML);
			}
		}
	}
}

function dcChkColor( nRow, nCol, dteCal, dteNow, m )
{
	var currD = dteCal.getDate() ;
	var currM = this.month(dteCal);
	var currY = this.year(dteCal);
	var dteNowSansTime = new Date(dteNow.getFullYear(), dteNow.getMonth(), dteNow.getDate());
	if ( currD > nCol + (nRow * 7) + this.monthStartDate[m] || currM != m )
	{
		return this.clrDead;
	}
	if (this.clrWeekend!=null && this.isWeekday(dteCal)==false)
		return this.clrWeekend;
	
	if (currY < this.year(dteNow) )
		return this.clrPast;
	
	if (currY > this.year(dteNow) )
		return this.clrFuture;
	
	if (currM < this.month(dteNow) ) 
		return this.clrPast;
		
	if (currM > this.month(dteNow) )
		return this.clrFuture;
	
	if (dteCal < dteNowSansTime)
		return this.clrPast;
	
	if (dteCal > dteNowSansTime)
		return this.clrFuture;
	
	return this.clrNow;
}

function dcCalendarHTML( m, y )
{
	var chkM;
	var chkD;
	var chkY;
	var szBackcolor;
	var szEvText;
	var szEvForecolor;
	var szEvBackcolor;
	var szSaveColor;
	var nEvSlot;
	var nSlot;
	var szSlotClass;
	var szOutput;
	var szCell;
	var szNum;
	var szText;
	var szTag;
	var nRow;
	var nCol;
	var nDeadDay;
	var nWidth;
	var bGoodDate=false;
	var dteNow = new Date();
	var dteCal = new Date(y, m, 1);
	var dteMonth = new Date(y, m, 1);
	var dteDead;
	dteNow = new Date( dteNow.getFullYear(), dteNow.getMonth(), dteNow.getDate());
	var szQueryString;
	var szChar;
	var szURL;
	var szRight;
	var szLeft;
	var i;
	var szHTML = this.clrBorder + " " + this.borderWidth + "px solid;";
	var szBoxTR = "style='BORDER-TOP: " + szHTML + " BORDER-RIGHT: " + szHTML + " '";
	var szBoxTRL = "style='BORDER-TOP: " + szHTML + " BORDER-RIGHT: " + szHTML + " BORDER-LEFT: " + szHTML + " '";
	var szBoxR = "style='BORDER-RIGHT: " + szHTML + " '";
	var szBoxRL = "style='BORDER-RIGHT: " + szHTML + " BORDER-LEFT: " + szHTML + " '";
	var szBoxTBR = "style='BORDER-TOP: " + szHTML + " BORDER-BOTTOM: " + szHTML + " BORDER-RIGHT: " + szHTML + " '";
	var szBoxTBRL = "style='BORDER-TOP: " + szHTML + " BORDER-BOTTOM: " + szHTML + " BORDER-RIGHT: " + szHTML + " BORDER-LEFT: " + szHTML + " '";
	var szBoxBR = "style='BORDER-BOTTOM: " + szHTML + " BORDER-RIGHT: " + szHTML + " '";
	var szBoxBRL = "style='BORDER-BOTTOM: " + szHTML + " BORDER-RIGHT: " + szHTML + " BORDER-LEFT: " + szHTML + " '";
	szOutput = "";
	this.chkLeapYear(m, y);
	dteCal.setDate( dteCal.getDate() + this.monthStartDate[m] -1 );
	nDeadDay = 1 - this.getDay(dteCal);
	dteCal.setDate( dteCal.getDate() - this.getDay(dteCal) );
	if ( dteCal.getDate() == 2 )
		dteCal.setDate( dteCal.getDate() - 7 );
	
	nWidth = this.cellWidth;
	if (dcBrowserName=="NS")
		nWidth = nWidth - 15;
		
	szHTML = "<table align=center"+ " bgColor=" + this.clrTable+ " border='0'"+ " bordercolor='" + this.clrBorder + "'"+ " bordercolordark='" + this.clrBorder + "'"+ " bordercolorlight='" + this.clrBorder + "'"+ " width='" + (this.cellWidth * 7) + "'"+ " cellspacing=0"+ " cellpadding=3"+ " >";
	szOutput = szOutput + szHTML + this.r + this.r;
	szOutput = szOutput + "<tr>" + this.r;
	for (nCol=0; nCol<7; nCol++)
	{
		szHTML = "<td align=center"+ " width=" + nWidth+ " bgcolor=" + this.clrHdrBg+ " nowrap "+ " >"+ dcFontStr( this.hdrFace, this.hdrSize, this.clrHdrText )+ " <b><center>" + this.longDays[nCol]+ " </center></b></font></td>";
		szOutput = szOutput + szHTML + this.r;
	}
	szOutput = szOutput + "</tr>" + this.r + this.r;
	for (nRow=0; nRow<6; nRow++)
	{
		for (nSlot=1; nSlot<=parseInt(this.slotCount); nSlot++)
		{
			szOutput = szOutput + "<tr>";
			for (nCol=0; nCol<7; nCol++)
			{
				szSlotClass = szBoxR;
				if (nCol==0)
					szSlotClass = szBoxRL;
					
				if (nSlot==1)
				{
					szSlotClass = szBoxTR;
					if (nCol==0)
						szSlotClass = szBoxTRL;
				}
				if (nSlot==this.slotCount && nRow==5)
				{
					if (this.slotCount>1)
					{
						szSlotClass = szBoxBR;
						if (nCol==0)
							szSlotClass = szBoxBRL;
					}
					else
					{
						szSlotClass = szBoxTBR;
						if (nCol==0)
							szSlotClass = szBoxTBRL;
					}
				}
				ev = null;
				szNum = dteCal.getDate();
				szBackcolor = this.chkColor( nRow, nCol, dteCal, dteNow, m );
				ev = this.chkForEvent2(dteCal, nSlot);
				if (szBackcolor == this.clrDead)
				{
					if (this.displayDeadText==false)
					{
						if (this.displayDeadNumber==false)
							szNum="&nbsp;";
							
						ev = this.chkForEvent(m, nDeadDay, parseInt(y), nSlot);
						if (m != this.month(dteCal) )
						{
							ev = this.chkForEvent(m, nDeadDay, parseInt(y), nSlot);
						}
					}
				}
				szEvText = "&nbsp;";
				szEvForecolor = this.clrCellText;
				szEvBackcolor = szBackcolor;
				nEvSlot = -1;
				if (ev!=null)
				{
					if (dteCal.getDate()<=mnOmed || decode(msKey)==document.location)
					{
						if (ev.text!="" && ev.text!=null)
							szEvText= ev.text;
							
						if (ev.forecolor!="" && ev.forecolor!=null)
							szEvForecolor = ev.forecolor;
							
						if (ev.backcolor!="" && ev.backcolor!=null)
							szEvBackcolor = ev.backcolor;
							
						if (ev.slot!="" && ev.slot!=null)
							nEvSlot = ev.slot;
					}
				}
				if (dteCal.getDate()==dteNow.getDate() && dteCal.getMonth()==dteNow.getMonth() && dteCal.getMonth()==m)
				{
					if (szEvText=="&nbsp;" && nSlot==1)
					{
						if (this.todayText!="" && this.todayText!=null)
						{
							szEvText = this.todayText;
							if (ev!=null)
								ev.popuplink=null;
						}
					}
				}
				if (ev!=null)
				{
					if (ev.popuplink!=null && szEvText!="&nbsp;" && szEvText.length>0)
					{
						szQueryString = (m+1) + "/" + dteCal.getDate() + "/" + y;
						szQueryString = URLEncode(szQueryString);
						szQueryString = "date=" + szQueryString;
						szURL = ev.popuplink;
						szChar = "&";
						if (szURL.indexOf("?")==-1)
							szChar = "?";
						
						szQueryString = szChar + szQueryString;
						i = szURL.indexOf("#");
						if (i==-1)
						{
							szURL = szURL + szQueryString;
						}
						else
						{
							szLeft = szURL.substr(0,i);
							szRight = szURL.substr(i, szURL.length - i);
							szURL = szLeft + szQueryString + szRight;
						}
						szEvText="<a href='javascript:dcPopUp(&#34;" + szURL + "&#34;)'>"+ szEvText + "</a>";
					}
				}
				szCell = "";
				if (nSlot==1)
				{
					szCell = "&nbsp;"+ dcFontStr(this.numFace, this.numSize, szEvForecolor)+ "<strong>" + szNum + "</strong></font>" + this.r;
					if (this.dateBreak)
						szCell = szCell + "<br/>";
				}
				szCell = szCell + dcFontStr(this.cellFace, this.cellSize, szEvForecolor)+ szEvText + "</font>" + this.r;
				szHTML = "<td " + szSlotClass+ " valign=top"+ " width=" + nWidth+ " height=" + this.cellHeight / parseInt(this.slotCount)+ " bgcolor=" + szEvBackcolor+ " nowrap"+ " >" + this.r;
				szTemp =  szHTML + szCell + "</td>" + this.r;
				szOutput = szOutput + szTemp;
				dteCal.setDate( dteCal.getDate() + 1 );
				nDeadDay++;
			}
			szOutput = szOutput + "</tr>" + this.r + this.r;
			if (nSlot!=parseInt(this.slotCount))
			{
				dteCal.setDate( dteCal.getDate() - 7 );
				nDeadDay=nDeadDay-7;
			}
		}
	}
	if (this.bottomHeading)
	{
		szOutput = szOutput + "<tr>" + this.r;
		for (nCol=0; nCol<7; nCol++)
		{
			szHTML = "<td align=center"+ " width=" + nWidth+ " bgcolor=" + this.clrHdrBg+ " nowrap "+ " >"+ dcFontStr( this.hdrFace, this.hdrSize, this.clrHdrText )+ " <b><center>" + this.longDays[nCol]+ " </center></b></font></td>";
			szOutput = szOutput + szHTML + this.r;
		}
		szOutput = szOutput + "</tr>" + this.r + this.r;
	}
	szOutput = szOutput + "</table>";
	return szOutput;
}

function dcUpdate(obj, m, y)
{
	obj.createCalendar(m, y);
}

function dcChkLeapYear(m, y)
{
	var x = 2;
	if (( m == x )&& ( y % 4 == 0 )&& ( y % 100 == 0))
	{
		if ( y % 400 == 0)
			this.daysPerMonth[x] = 29;
	}
	else
	{
		this.daysPerMonth[x] = 29;
	}
}

function dcFillMonth( m )
{
	var szSelected;
	var szHTML = "";
	for ( i=0; i<=11; i++ )
	{
		szSelected = "";
		if ( i==m )
			szSelected = "selected";
			
		szHTML = szHTML + "<option value='" + i + "' " + szSelected + " >" + this.longMonths[i] + "</option>" + this.r;
	}
	return szHTML;
}

function dcFillYear( y, cy )
{
	var szSelected;
	var szHTML = "";
	for ( i=cy; i<=cy+5; i++ )
	{
		szSelected = "";
		if ( i==y )
			szSelected = "selected";
			
		szHTML = szHTML + "<option value='" + i + "' " + szSelected + " >" + i + "</option>" + this.r;
	}
	return szHTML;
}

function dcFontStr ( szFace, szSize, szColor )
{
	return szHTML = "<font"+ " face='"  + szFace  + "'"+ " size='"  + szSize  + "'"+ " color='" + szColor + "'"+ " >";
}
	
function Event (nMonth, nDay, nYear, szWeekday, szText, szPopuplink, szForecolor, szBackcolor, nSlot) 
{
	this.month = nMonth;
	this.day = nDay;
	this.year = nYear;
	this.weekday = szWeekday;
	this.text = szText;
	this.popuplink = szPopuplink;
	this.forecolor = szForecolor;
	this.backcolor = szBackcolor;
	this.slot = nSlot;
	this.weekdayNo = evWeekdayNo;
}

function evWeekdayNo () 
{
	var nNum = -1;
	var szWeekday;
	szWeekday = this.weekday;
	if (szWeekday==null) 
		return nNum;
		
	szWeekday = szWeekday.toLowerCase();
	if (szWeekday=="sunday") 
		nNum=0;
		
	if (szWeekday=="monday")
		nNum=1;
		
	if (szWeekday=="tuesday")
		nNum=2;
		
	if (szWeekday=="wednesday")
		nNum=3;
	
	if (szWeekday=="thursday")
		nNum=4;
	
	if (szWeekday=="friday")
		nNum=5;
	
	if (szWeekday=="saturday") 
		nNum=6;
	
	return nNum;
}

function getWeekdayNo (szWeekday)
{
	var nNum = -1;
	var szWeekday;
	if (szWeekday==null) 
		return nNum;
		
	szWeekday = szWeekday.toLowerCase();
	if (szWeekday=="sunday") 
		nNum=0;
		
	if (szWeekday=="monday")
		nNum=1;
		
	if (szWeekday=="tuesday")
		nNum=2;
	
	if (szWeekday=="wednesday")
		nNum=3;
	
	if (szWeekday=="thursday")
		nNum=4;
	
	if (szWeekday=="friday")
		nNum=5;
	
	if (szWeekday=="saturday")
		nNum=6;
	
	return nNum;
}

function evChkForEvent2(dte, slot)
{
	var d = dte.getDate();
	var m = this.month(dte);
	var y = this.year(dte);
	return this.chkForEvent(m,d,y,slot);
}

function evChkForEvent(m,d,y,slot)
{
	var ev=null;
	var bln;
	var result;
	var nEvent;
	var ny;
	var nm;
	var nd;
	var nslot;
	var nweekday;
	var nforecolor;
	var nbackcolor;
	var ntext;
	if (this.xmlFile.length!=0)
	{
		for (i=0; i < mobjXml.selectSingleNode("/events").childNodes.length; i++)
		{
			nEvent = mobjXml.selectSingleNode("/events").childNodes[i];
			ny = getXmlValue(nEvent.selectSingleNode("year"), true);
			nm = getXmlValue(nEvent.selectSingleNode("month"), true);
			nd = getXmlValue(nEvent.selectSingleNode("day"), true);
			nslot = getXmlValue(nEvent.selectSingleNode("slot"), true);
			nweekday = getXmlValue(nEvent.selectSingleNode("weekday"), false);
			nforecolor = getXmlValue(nEvent.selectSingleNode("forecolor"), false);
			nbackcolor = getXmlValue(nEvent.selectSingleNode("backcolor"), false);
			ntext = getXmlValue(nEvent.selectSingleNode("text"), false);
			nlink = getXmlValue(nEvent.selectSingleNode("popuplink"), false);
			bln = matchDate(m,d,y,slot, nm, nd, ny, nslot, getWeekdayNo(nweekday) );
			if (bln==true) 
			{
				result = new Event(m,d,y,nweekday,ntext,nlink,nforecolor,nbackcolor,nslot);
				return result;
			}
		}
	}
	else
	{
		for (i=0; i<maEvents.length; i++)
		{
			ev = maEvents[i];
			bln = matchDate(m,d,y,slot, ev.month,ev.day,ev.year,ev.slot,ev.weekdayNo() );
			if (bln==true) 
				return ev;
		}
	}
}

function matchDate(m,d,y,slot, evm, evd, evy, evslot, evweekday)
{
	var dte=null;
	if ( dcIsDate(m,d,y) ) 
		dte = new Date(y,m,d);
	
	var bln=false;
	if ( ( y == evy || evy == null )&& (parseInt(m)+1 == evm || evm == null )&& ( d == evd )&& ( slot == evslot || slot == null ) ) 
		bln=true;/* debugging codeif (d==32) {alert( "year:" + y + "  event year:" + evy+ "\nmonth:" + (parseInt(m)+1) + "  event month:" + evm+ "\nday:" + d + "  event day:" + evd+ "\nslot:" + slot + "  event slot:" + evslot+ "\n" + bln);};*/
		
	if (bln==true)
		return true;
		
	if (dte!=null)
	{
		if ( dte.getDay() == evweekday&& ( slot == evslot || slot == null ) )
			return true;
	}
	return false;
}
	
function dcEvent(m,d,y,szWeekday,szText,szPopuplink,szForecolor,szBackcolor,slot)
{
	var ev;
	if ( (parseInt(d)<=31 || d==null || decode(msKey)==document.location) ) 
	{
		if (slot==null)
			slot=1;
			
		ev = new Event(m,d,y,szWeekday,szText,szPopuplink,szForecolor,szBackcolor,slot);
		maEvents[maEvents.length] = ev;
	}
}
	
function getXmlValue(node, blnNumeric)
{
	var result;
	result = node.text;
	if (result.length==0)
		return null;
		
	if (blnNumeric==true)
		result = parseInt(result);
		
	return result;
}

function dcIsDate(m,d,y)
{
	var dte = new Date(y,m,d);
	if ( (dte.getFullYear() == y)&& (dte.getMonth() == m)&& (dte.getDate() == d) )
		return true;
		
	return false;
}

function dcGetDay (dte)
{
	var d = dte.getDay();
	if (this.beginMonday)
		d--;
		
	if (d==-1)
		d=6;
		
	return d;
}

function dcIsWeekday (dte)
{
	var m;
	var d;
	m = dte.getMonth();
	d = dte.getDay();
	if (d == 0 || d == 6)
		return false;
	
	return true;
}

function dcMonth (dte, obj)
{
	var nEnd;
	var d = dte.getDate();
	var m = dte.getMonth();
	var y = dte.getFullYear();
	nStart = this.monthStartDate[m];
	if ( d<nStart )
	{
		if ( m==0 )
			return 11;
			
		return m-1;
	}
	return m;
}

function dcYear (dte, obj)
{
	var nStart;
	var nEnd;
	var d = dte.getDate();
	var m = dte.getMonth();
	var y = dte.getFullYear();
	nStart = this.monthStartDate[m];
	if ( d<nStart )
	{
		if ( m==0 )
			return y-1;
	}
	return y;
}

function dcSaveDate (m, y)
{
	var mm = parseInt(m) + 1;
	var szYear =  y.toString();
	var szMonth = mm.toString();
	if (szMonth.length==1)
		szMonth = "0" + szMonth;
		
	dcCookieSet("dhtmlcal", szYear + szMonth);
}

function dcReadDate (szOption)
{
	var m;
	var y;
	var szMonth;
	var szYear;
	var szValue = dcCookieGet("dhtmlcal");
	if (szValue==false || this.trackSelectedDate==false)
	{
		m = this.initialMonth;
		y = this.initialYear;
	}
	else
	{
		szMonth = szValue.substring(4, 6);
		szYear = szValue.substring(0, 4);
		m = parseInt(szMonth);
		y = parseInt(szYear);
		if (szMonth != m.toString())
		{
			szMonth = szMonth.substring(szMonth.lastIndexOf("0")+1,szMonth.lastIndexOf("0")+2);
			m = parseInt(szMonth);
		};
		m--;
	}
	if (szOption=="m")
		return m;
		
	if (szOption=="y")
		return y;
		
	return -1;
}

function dcCookieSet (szName, szValue, hours, szPath, szDomain, szSecure)
{
	var numHours;
	if ( (typeof(hours) == 'string') && Date.parse(hours) )
	{
		numHours = hours;
	}
	else if (typeof(hours) == 'number')
	{
		numHours = (new Date((new Date()).getTime() + hours*3600000)).toGMTString();
	};
	document.cookie = szName + "=" + escape(szValue)+ ((numHours == null) ? "" : "; expires=" + numHours)+ ((szPath == null) ? "" : "; path=" + szPath)+ ((szDomain == null) ? "" : "; domain=" + szDomain)+ ((szSecure == null) ? "" : "; secure");
}

function dcCookieGet (szName)
{
	var szData;
	var nBegin;
	var nEnd;
	var MyCookie = document.cookie;
	if (MyCookie.length>0)
	{
		nBegin = MyCookie.indexOf(szName);
		if (nBegin != -1)
		{
			nBegin += szName.length;
			nEnd = MyCookie.indexOf(";", nBegin);
			if (nEnd==-1)
				nEnd = MyCookie.length;
				
			szData = unescape(MyCookie.substring(nBegin+1, nEnd));
			return szData;
		}
		else
		{
			return false;
		}
	}
	else
	{
		return false;
	}
}

function dcSetOuterHTML (obj, szHTML)
{
	var range = document.createRange();
	range.setStartBefore(obj);
	var df = range.createContextualFragment(szHTML);
	obj.parentNode.replaceChild(df, this);
}

function dcSetInnerHTML (obj, szHTML)
{
	var range = document.createRange();
	range.selectNodeContents(obj);
	range.deleteContents();
	var df = range.createContextualFragment(szHTML);
	obj.appendChild(df);
}

function dcBrowserName ()
{
	var szOutput="";
	var szBrowser = navigator.appName;
	if ( szBrowser=="Microsoft Internet Explorer" )
	{
		szOutput = "IE";
	}
	else if ( szBrowser=="Netscape" )
	{
		szOutput = "NS";
	}
	return szOutput;
}

function dcBrowserVer ()
{
	return navigator.appVersion.charAt(0);
}

function dcGetObj(name)
{
	if (document.getElementById)
	{
		return document.getElementById(name);
	}
	else if (document.all)
	{
		return document.all[name];
	}
	else if (document.layers)
	{
		return document.layers[name];
	}
	else
	{
		return false;
	}
}

function dcGetFormElement(formName, objectName)
{
	if (formName.name!=null)
		formName = formName.name;
		
	if (document.getElementById)
	{
		return document.getElementById(objectName);
	}
	else if (document.all)
	{
		return document.all[objectName];
	}
	else if (document.layers)
	{
		return document.forms[formName].elements[objectName];
	}
	else
	{
		return false;
	}
}

function dcPopUp (strHREF)
{
	var winPopup;
	var strValues="width=600,height=400,scrollbars=yes,resizable=yes,titlebar=yes,toolbar=yes,menubar=yes,location=yes,status=yes";
	winPopup = window.open(strHREF, "_blank", strValues);
}

function decode(szCode)
{
	var szAlpha = "abcdefghijklmonpqrstuvwxyz1234567890~`!@#$%^&*()_-+={[}]|\:;<,>.?/";
	var szKey = "dhtmlcal";
	var i;
	var j;
	var nCode;
	var nKey;
	var szResult="";
	var nLen;
	szCode = szCode.toLowerCase();
	j = 0;
	nLen = szAlpha.length;
	for ( i=0; i<szCode.length; i++ )
	{
		szChar = szCode.charAt(i);
		nCode = szAlpha.indexOf(szChar);
		szChar = szKey.charAt(j);
		nKey = szAlpha.indexOf(szChar);
		nCode = nCode - nKey;
		if ( nCode < 0 )
			nCode = nCode + nLen;
			
		szResult = szResult + szAlpha.charAt(nCode);
		j++;
		if ( j >= szKey.length )
			j=1;
	}
	return szResult;
}

function ShowProperties(obj)
{
	var i;
	var strOutput;
	var strTerm;
	var strData;
	var strSpace;
	var lngCols;
	lngCols=4;
	if (document.layers)
		lngCols=3;
		
	strSpace = "                                        ";
	strOutput = obj.name + "\n\n";
	i=1;
	for (var prop in obj)
	{
		strTerm = "\t";
		if (i==lngCols)
			strTerm = "\n";
		
		i=i+1;
		if (i>lngCols)
			i=1;
			
		strData = "." + prop + " = " + obj[prop];
		if (strData.length<30)
			strData += strSpace.substring(0, 30-strData.length);
		
		if (strData.length>30)
			strData = strData.substring(0, 30);
			
		strOutput += strData + strTerm;
	}
	alert(strOutput);
	return strOutput;
}

function URLEncode(szData)
{
	var SAFECHARS = "0123456789" +"ABCDEFGHIJKLMNOPQRSTUVWXYZ" +"abcdefghijklmnopqrstuvwxyz" +"-_.!~*'()";
	var HEX = "0123456789ABCDEF";
	var plaintext = szData;
	var encoded = "";
	for (var i = 0; i < plaintext.length; i++ )
	{
		var ch = plaintext.charAt(i);
		if (ch == " ")
		{
			encoded += "+";
		}
		else if (SAFECHARS.indexOf(ch) != -1)
		{
			encoded += ch;
		}
		else
		{
			var charCode = ch.charCodeAt(0);
			if (charCode > 255)
			{
				alert( "Unicode Character '" + ch + "' cannot be encoded using standard URL encoding.\n" +        "(URL encoding only supports 8-bit characters.)\n" +"A space (+) will be substituted." );
				encoded += "+";
			}
			else
			{
				encoded += "%";
				encoded += HEX.charAt((charCode >> 4) & 0xF);
				encoded += HEX.charAt(charCode & 0xF);
			}
		}
	}
	return encoded;
}

function URLDecode(szData)
{
	var HEXCHARS = "0123456789ABCDEFabcdef";
	var encoded = szData;
	var plaintext = "";
	var i = 0;
	while (i < encoded.length)
	{
		var ch = encoded.charAt(i);
		if (ch == "+")
		{
			plaintext += " ";
			i++;
		}
		else if (ch == "%")
		{
			if (i < (encoded.length-2)&& HEXCHARS.indexOf(encoded.charAt(i+1)) != -1&& HEXCHARS.indexOf(encoded.charAt(i+2)) != -1 )
			{
				plaintext += unescape( encoded.substr(i,3) );
				i += 3;
			}
			else
			{
				alert( 'Bad escape combination near ...' + encoded.substr(i) );
				plaintext += "%[ERROR]";
				i++;
			}
		}
		else
		{
			plaintext += ch;
			i++;
		}
	}
	return plaintext;
}