//<!--



//---------------------------------------------------------------------------

//

// File:    DHTMLCal.js

//

// Purpose: This is the source file for the DHTML Calendar

//

//	    This program is shareware

//          If you use this program, please send $20

//          You'll find the address to send to at

//          http://www.geocities.com/dshipe/cadown.htm

//

// Author:  Dan Shipe

//          dshipe@writeme.com

//          http://www.geocities.com/dshipe

//

//    Date     By   Description

// ----------  ---  ----------------------------------------------------------

// 09-01-2000  DS   Initial creation

// 04-10-2001  DS   Now supports Netscape 6, Gekko

// 05-30-2001  DS   Added cookies to track month & year if user "refreshs"

//---------------------------------------------------------------------------



/*

 font point size chart

 size 1 	=  8pt

 size 2		= 10pt

 size 3		= 12pt

 size 4		= 14pt

 size 5		= 18pt

 size 6		= 24pt

*/



// ---------------------------------------------------------------------------

// initialization

var R = "\r\n";

var mclrBlack =		"#000000";

var mclrWhite =		"#ffffff";

var mclrDeadWhite = 	"#fffffe";

var mclrOffWhite = 	"#e1e1e1";

var mclrLightGray = 	"#c0c0c0";

var mclrGray =		"#888888";

var mclrYellow =        "#ffe1c0";

var mclrPurple =	"#ff00ff";

var mclrBlue =		"#0000ff";

var mclrRed =		"#ff0000";

var mclrGreen =		"#00ff00";

var mclrPink =		"#ffc0c0";

var mclrLightYellow =	"#ffffc0";

var mclrLightOrange =	"#e1e1c0";

var mclrDarkPurple =	"#880088";

var mclrDarkBlue =	"#000088";

var mclrDarkRed =	"#880000";

var mclrDarkGreen =	"#008800";



// ---------------------------------------------------------------------------

// custom sizes, colors and fonts



var mclrTableBg  = mclrDeadWhite;     // table background DO NOT CHANGE

var mclrDead	 = mclrLightGray;     // background date cell color - unused this month

var mclrNow	 = mclrLightYellow;   // background date cell color - the current date

var mclrPast	 = mclrOffWhite;      // background date cell color - previous dates

var mclrFuture	 = mclrWhite;         // background date cell color - future dates

var mclrBorder	 = mclrDarkBlue;       // border color of calendar



var mnCellWidth  = 85;               // width of weekday columns and dates

var mnCellHeight = 65;                // height of date cells 



// font sizes and colors for the weekday headers (Mon, Tues, Wed...)

var mclrHdrBg	  = mclrBorder;

var mclrHdrText	  = mclrWhite;

var mstrHdrFace   = "Comic Sans MS, Arial, Helvetica, Sans Serif";

var mstrHdrSize   = "1";



// font sizes and colors for date (1st, 3rd, 15th...)

var mclrNumText	  = mclrBorder;

var mstrNumFace   = "Comic Sans MS, Arial, Helvetica, Sans Serif";

var mstrNumSize   = "1";



// font sizes and colors for the event text

var mclrCellText   = mclrBorder;

var mstrCellFace   = "Comic Sans MS, Arial, Helvetica, Sans Serif";

var mstrCellSize   = "1";



var maDaysPerMonth = new Array( 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ); 

var maLongDays	   = new Array( "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat");

var maLongMonths   = new Array( "January", "February", "March", "April",

	 		"May", "June", "July", "August", 

			"September", "October", "November", "December" );



var maYear = new Array();

var maMonth = new Array();

var maDay = new Array();

var maText = new Array();



var mstrBrowserName = DHTMLCal_BrowserName();

var mstrBrowserVer = DHTMLCal_BrowserVer();



// ---------------------------------------------------------------------------------------

function DHTMLCal_SetEvent( m, d, y, strText) {

	var x = maDay.length;



	maYear[x +1]   = y;

	maMonth[x + 1] = m-1;

	maDay[x + 1]   = d;

	maText[x + 1]  = strText;

}



// ---------------------------------------------------------------------------------------

function DHTMLCal_GetEvent( m, d, y ) {

	var x = 0;

	while( x < maDay.length ) {

		if ( y == maYear[x] ) {

			if ( m == maMonth[x] ) {

				if ( d == maDay[x] ) { 

					return maText[x];

				}

			}

		}

		x++;

	}

	return "&nbsp";

}



// ---------------------------------------------------------------------------------------

function DHTMLCal_CheckLeapYear(m, y) {

	var x = 2;	



	if ( m == x ) {

        	if ( y % 4 == 0 ) {

               		if ( y % 100 == 0) {

                    		if ( y % 400 == 0) maDaysPerMonth[x] = 29;

               		} else {

                    		maDaysPerMonth[x] = 29;

			}

		}

	}

}



// ---------------------------------------------------------------------------------------

function DHTMLCal_FillMonth( m ) {

	var strHTML = "";



	for ( i=0; i<=11; i++ ) {

		var strSelected = "";

		if ( i == m ) strSelected = "selected";



		strHTML = strHTML + "<option value='" + i + "' " + strSelected + " >" + maLongMonths[i] + "</option>" + R;

	};

	return strHTML;

}



// ---------------------------------------------------------------------------------------

function DHTMLCal_FillYear( y ) {

	var strHTML = "";



	for ( i=y-1; i<=y+5; i++ ) {

		var strSelected = "";

		if ( i == y ) strSelected = "selected";



		strHTML = strHTML + "<option value='" + i + "' " + strSelected + " >" + i + "</option>" + R;

	};

	return strHTML;

}



// ---------------------------------------------------------------------------------------

function DHTMLCal_Form() {

	var strHTML;

	var strTag;	

	var strOutput = "";

	

	var m = DHTMLCal_GetDate("m");

	var y = DHTMLCal_GetDate("y");



	// ----- begin form

	strHTML = "<form name='frmCal' method='post' action=''>" + R;

	strOutput = strOutput + strHTML;



	// ----- begin table

	strHTML = "<table align=center"

		+ " width='" + (mnCellWidth * 7) + "'"

		+ " >" + R;

	strOutput = strOutput + strHTML;



	// ----- month & year selector

	strHTML = "<tr><td"

		+ " bgcolor=" + mclrHdrBg

		+ " ><center>" + R + R;

	strOutput = strOutput + strHTML;



	// ----- month combo

	strHTML = "<select name='cboMonth'"

		+ " onchange='DHTMLCal_Update("

		+ " cboMonth.options[frmCal.cboMonth.selectedIndex].value,"

		+ " cboYear.options[frmCal.cboYear.selectedIndex].value);'>" + R

		+ DHTMLCal_FillMonth(m)

		+ "</select>" + R + R;

	strOutput = strOutput + strHTML;



	// ----- year combo

	strHTML = "&nbsp"

		+ "<select name='cboYear'"

		+ " onchange='DHTMLCal_Update("

		+ " cboMonth.options[frmCal.cboMonth.selectedIndex].value,"

		+ " cboYear.options[frmCal.cboYear.selectedIndex].value);'>" + R

		+ DHTMLCal_FillYear(y)

		+ "</select>" + R + R;

	strOutput = strOutput + strHTML;



	strHTML = "</center></td></tr>" + R + "</table></form>" + R + R;

	strOutput = strOutput + strHTML;



	document.writeln(strOutput);

}



// ---------------------------------------------------------------------------------------

function DHTMLCal_Draw() {

	var obj;

	var sHTML;



	var m = DHTMLCal_GetDate("m");

	var y = DHTMLCal_GetDate("y");



	strHTML = DHTMLCal_Create( m, y );



	if ( mstrBrowserName == "IE" ) {

		// microsoft internet explorer (handle ver 4 & 5)

		document.writeln(strHTML);

	

	} else if ( mstrBrowserName == "NS" ) {

		if ( mstrBrowserVer < "5" ) {

			// netscape version 4

			document.CALLAYER.document.writeln(strHTML);

			

		} else {

			// netscape version 5 and up		

			obj = document.getElementById("CALDIV");

			DHTMLCal_SetInnerHTML(obj, strHTML);

		};

	};

}



// ---------------------------------------------------------------------------------------

function DHTMLCal_Update(m, y) {

	var strNewText;

	var obj;

	var strHTML;



	// write the current month and year to a cookie

	// will expire in one hour

	DHTMLCal_SetDate(m, y)



	strHTML = DHTMLCal_Create( m, y );



	if ( mstrBrowserName == "IE" ) {

		// microsoft internet explorer (handle ver 4 & 5)

		document.all["CALDIV"].innerHTML = strHTML;

	

	} else if ( mstrBrowserName == "NS" ) {

		if ( mstrBrowserVer < "5" ) {

			// netscape version 4

			document.CALLAYER.document.write(strHTML);

			document.CALLAYER.document.close();

			

		} else {

			// netscape version 5 and up		

			obj = document.getElementById("CALDIV");

			DHTMLCal_SetInnerHTML(obj, strHTML);

		};

	};

}



// ---------------------------------------------------------------------------------------

function DHTMLCal_CheckColor( j, i, x, dteCal, dteNow, m ) {

	var strID = "r" + i + "c" + j; 

	var currD = dteCal.getDay();

	var currM = dteCal.getMonth();

	var currY = dteCal.getYear();



	// Is this a "dead" cell?

	if ( currD > (i + x) || currM != m ) {

		return mclrDead;

	} else {

		if ( dteCal.getYear() < dteNow.getYear()) {

			return mclrPast;

		} else if (dteCal.getYear() > dteNow.getYear()) {

			return mclrFuture;

		} else {				

			// Same year...

			if (dteCal.getMonth() < dteNow.getMonth() ) {

				return mclrPast;

			} else if (dteCal.getMonth() > dteNow.getMonth() ) {

				return mclrFuture;

			} else {

				// Same month...

				if (dteCal.getDate() < dteNow.getDate()) {

					return mclrPast;

				} else if (dteCal.getDate() > dteNow.getDate()) {

					return mclrFuture;

				} else {

					return mclrNow;

				}

			}

		}

	}

}



// ---------------------------------------------------------------------------------------

function DHTMLCal_Create( m, y ) {

	var strOutput = "";

	var strHTML;

	var strID;

	var nColor;

	var strCell;

	var strNum;

	var strText;

	var strTag;	



	var dteNow = new Date();

	var dteCal = new Date(y, m, 1);

	DHTMLCal_CheckLeapYear(m, y);



	// ----- find the first day and subrtact back to Sun

	dteCal.setDate( dteCal.getDate() - dteCal.getDay() );



	// ----- begin table

	strHTML = "<table align=center"

		+ " bgColor=" + mclrTableBg

		+ " border='1'"

		+ " bordercolor='" + mclrDarkPurple + "'"

		+ " bordercolordark='" + mclrDarkPurple + "'"

		+ " bordercolorlight='" + mclrDarkPurple + "'"

		+ " width='" + (mnCellWidth * 7) + "'"

		+ " >";

	strOutput = strOutput + strHTML + R + R;



	// ----- Create the WEEKDAY headers

	strOutput = strOutput + "<tr>" + R;

	for( i = 0; i < 7; i++) {

		strHTML = "<td align=center"

			+ " width='" + mnCellWidth + "'"

			+ " bgcolor=" + mclrHdrBg

			+ " >"

			+ DHTMLCal_FontStr( mstrHdrFace, mstrHdrSize, mclrHdrText )

			+ " <b><center>" + maLongDays[i]

			+ " </center></b></font></td>";

		strOutput = strOutput + strHTML + R;

	}

	strOutput = strOutput + "</tr>" + R + R;



	// ----- now create calendar grid ( 7 columns by 6 rows ) 

	for (j = 0; j < 6; j++)	{



		x = 0;

		strOutput = strOutput + "<tr>"; // + R;

		for( i = 0; i < 7; i++) {



			// ----- create unique ID

			strID = "r" + i + "c" + j; 



			// ----- determine color and text

			nColor = DHTMLCal_CheckColor( j, i, x, dteCal, dteNow, m );

			if (nColor == mclrDead) {

				strCell="&nbsp;";

			} else {

				strNum = dteCal.getDate();

				strText = DHTMLCal_GetEvent(dteCal.getMonth(), dteCal.getDate(), dteCal.getFullYear());

				if (strText=="") strText=" ";

				strCell = DHTMLCal_FontStr(mstrNumFace, mstrNumSize, mclrNumText)

					+ "<strong>" + strNum + "</strong></font>"

					+ "<br>"

					+ DHTMLCal_FontStr(mstrCellFace, mstrCellSize, mclrCellText)

					+ strText + "</font>";

			}

	

			// ----- HTML for cell

			strHTML = "<td valign=top" 

				+ " width=" + mnCellWidth 

				+ " height=" + mnCellHeight 

				+ " bgcolor=" + nColor

				+ " >";

			strOutput = strOutput + strHTML + strCell + "</td>" + R;

		

			dteCal.setDate( dteCal.getDate() + 1 );

		}

		x = x + 7;

		strOutput = strOutput + "</tr>" + R + R;

	}

	strHTML = "";

	strOutput = strOutput + strHTML + R + R;



	// ---- end the table, form

	strOutput = strOutput + "</table>";



	return strOutput;

}



// ---------------------------------------------------------------------------------------

function DHTMLCal_FontStr ( strFace, strSize, strColor ) {

	var strHTML = "<font"

		+ " face='"  + strFace  + "'"

		+ " size='"  + strSize  + "'"

		+ " color='" + strColor + "'"

		+ " >";

	return strHTML;

}



// ---------------------------------------------------------------------------------------

function DHTMLCal_BrowserName () {

	var strOutput="";

	var strBrowser = navigator.appName;



	if ( strBrowser=="Microsoft Internet Explorer" ) {

		strOutput = "IE";

	} else if ( strBrowser=="Netscape" ) {

		strOutput = "NS";

	};

	return strOutput;

}



// ---------------------------------------------------------------------------------------

function DHTMLCal_BrowserVer () {

	var strVer = navigator.appVersion.charAt(0);

	return strVer;

}



// ---------------------------------------------------------------------------------------

function DHTMLCal_SetOuterHTML (obj, strHTML) {

	var range = document.createRange();

	range.setStartBefore(obj);



	var df = range.createContextualFragment(strHTML);

	obj.parentNode.replaceChild(df, this);

}



// ---------------------------------------------------------------------------------------

function DHTMLCal_SetInnerHTML (obj, strHTML) {

	var range = document.createRange();

	range.selectNodeContents(obj);

	range.deleteContents();

	

	var df = range.createContextualFragment(strHTML);

	obj.appendChild(df);

}



// ---------------------------------------------------------------------------------------

function DHTMLCal_SetDate (m, y) {

	var strYear =  y.toString();

	var strMonth = m.toString();



	if (strMonth.length==1) strMonth = "0" + strMonth;



	DHTMLCal_CookieSet("dhtmlcal", strYear + strMonth);

};



// ---------------------------------------------------------------------------------------

function DHTMLCal_GetDate (strOption) {

	var strValue = DHTMLCal_CookieGet("dhtmlcal");

	var m, strM

	var y, strY



	if (strValue==false) {

		var dCurrDate = new Date();

		m = dCurrDate.getMonth();

		y = dCurrDate.getFullYear();

	} else {

		strM = strValue.substring(4, 6);

		strY = strValue.substring(0, 4);



		m = parseInt(strM);

		y = parseInt(strY);

		

		if (strM != m.toString()) {

			strM = strM.substring(strM.lastIndexOf("0")+1,strM.lastIndexOf("0")+2);

			m = parseInt(strM);

		};

	};



	if (strOption=="m") return m;

	if (strOption=="y") return y;

	return -1;

};



// ---------------------------------------------------------------------------------------

function DHTMLCal_CookieSet (strName, strValue, hours, strPath, strDomain, strSecure) {

	var numHours;



	if ( (typeof(hours) == 'string') && Date.parse(hours) ) { 

		// already a Date string

		numHours = hours;

	} else if (typeof(hours) == 'number') { 

		// calculate Date from number of hours

		numHours = (new Date((new Date()).getTime() + hours*3600000)).toGMTString();

	};



	// Set the cookie, adding any parameters that were specified.

  	document.cookie = strName + "=" + escape(strValue) +  

  		+ ((numHours == null) ? "" : "; expires=" + numHours) 

  		+ ((strPath == null) ? "" : "; strPath=" + strPath) 

  		+ ((strDomain == null) ? "" : "; strDomain=" + strDomain)

  		+ ((strSecure == null) ? "" : "; strSecure");

};



// ---------------------------------------------------------------------------------------

function DHTMLCal_CookieGet (strName) {

	var strData;

	var nBegin;

	var nEnd;



	var MyCookie = document.cookie;

	

	if (MyCookie.length>0) {

		nBegin = MyCookie.indexOf(strName);

		if (nBegin != -1) {

			nBegin += strName.length;

			nEnd = MyCookie.indexOf(";", nBegin);

			if (nEnd==-1) nEnd = MyCookie.length;

			strData = unescape(MyCookie.substring(nBegin+1, nEnd-1));

			return strData;

		} else {

			//no cookie of name found		

			return false;

		};

	} else {

		//no cookie found

		return false;

	};

	

};



//-->





