		//================================
		//
		//	EVENTS
		//
		//================================
	
		// ---------------------------------------------
		// GET MINI CALENDAR HTML
		//		Creates an HTML Calendar with event days highlighted using data from aEvents array
		//			1. Determine dayA and dayZ of the offset calendar month
		//			2. Look through each event passed in to find matching events for that month
		//			3. For each matching event get data
		//			4. Record which days have events
		//			5. Build calendar HTML
		//			6. Return HTML string
		//		parameters:
		// 			nMonthOffset = number of months +/- from current month
		// 			aEvents = format: "EventId|EventTypeId|EventTypeName|StartTime|EndTime|Author|Title|Description|Email|URL|Person.DisplayName"
		// 			fEditOK = allow clicks on days to bring up add event dialog
		//
		function getMiniCalMonthHTML(nMonthOffset, aEvents, fEditOK) {
			var strCal = ""; 	//calendar table
			
			// ---------------------------------------
			// 1. Determine dayA and dayZ of the month
			// 		-- A Today's date
			var tToday =  new Date();
			var msecToday = tToday.getTime(); 		
			var nTodayDay = tToday.getDate();
			var nTodayMonth = tToday.getMonth()+1;
			var nTodayYear = timeGetYear(tToday);
			
			// 		-- B Displayed Calendar Month info
			//			 Offset from this month by nMonthOffset
			var tDayA = new Date();	// date object for first day of the month
			var tDayZ = new Date();	// date object for last day of month
			var tCal = new Date();	// date object for displayed calendar month. holds first day.
			var	nCalMonth; 			// 0-11 index of cal month
			var	nCalYear; 			// year (ex. 2002)
			var	nDayOneOfCal; 		// 0-6 index of weekday for first day in cal month
			var	nDaysInCalMonth;	// number of days in the cal month
			var	fCalThisMonth;		// true if displayed cal month is todays month
			var aCalClassSession = new Array(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
			var aCalGeneralEvent = new Array(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
			var aCalEventIdList  = new Array(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
					// OFFSET to day one of correct month
			tCal.setDate(1);
			tCal.setMonth(tToday.getMonth() + nMonthOffset); 
			tCal.setHours(12);
			tDayA.setTime(tCal.getTime());
					// determine if today is in this month
			nCalMonth = tCal.getMonth() + 1;
			nCalYear = timeGetYear(tCal);
			if (nCalYear < 1000) {nCalYear += 1900;} //netscape and ie give different values for getYear!
			fCalThisMonth = ((nCalMonth == nTodayMonth) && (nCalYear == nTodayYear));
					// get weekday of first day in cal month
			nDayOneOfCal = tCal.getDay(); 	// weekday number of first day of month
					// get number of days in cal month
			for (var i=31; i>=28; i--) {
				tCal.setMonth(nCalMonth - 1);
				tCal.setDate(i);
				if (tCal.getMonth() == nCalMonth - 1) {
					nDaysInCalMonth = i;
					break;
				}
			}
			tCal.setMonth(nCalMonth-1);
			tCal.setDate(1);
					// determine last day of month
			tDayZ.setTime(tDayA.getTime());
			tDayZ.setDate(nDaysInCalMonth);			
			
			// ---------------------------------------
			//	2. check each event get data
			//
			for (var i = 0; i < aEvents.length - 1; i++) {
				var aP = aEvents[i].split("|");
				var idEvent			= aP[0];
				var strEventDate 	= aP[3];
				var strTitle 		= aP[5];
				var aDInfo 			= parseMysqlDatetime(strEventDate);
				var nStartYear 		= aDInfo[0];
				var nStartMonth 	= aDInfo[1];
				var nStartDay 		= aDInfo[2];
				var nStartH 		= aDInfo[3];
				var nStartM 		= aDInfo[4];
	
				//  3. see if in correct year and month
				if ((nStartYear == nCalYear) && (nStartMonth == nCalMonth)) {
					//	4. Record event info for that day
					//		-- first record event title
					//		-- then record if classSession event on that day 
					aCalGeneralEvent[nStartDay - 1] += '\n * '+ getTimeString (nStartH,nStartM) + ' ' + strTitle;
					aCalEventIdList[nStartDay - 1] += ':'+idEvent;
				}
				
			}
		
			// ---------------------------------------
			//	5. Build calendar HTML
			strCal = '';
			// month name and link to other month
			strCal = '<div class="cal_monthname">';
			strCal += '<table cellspacing="0" cellpadding="0" style="width:180px"><tr>';
			strCal += '<td>'+ aMonths[nCalMonth-1]+'</td>';
			if (fCalThisMonth) {
				strCal += '<td align="right"><a class="cal_montharrow" href="javascript: showCal(2);">next month &gt;</a></td>';
			} else {
				strCal += '<td align="right"><a class="cal_montharrow" href="javascript: showCal(1);">&lt; this month</a></td>';
			}
			strCal += '</tr></table>';
			strCal += '</div>';
			// calendar itself
			strCal += '<div class="cal_boxarea">';
			// DIMENSIONS
			var dxCALBOX = 200;
			var dyCALBOX = 130;
			var dxDAYBOX = 28;			// total width of the box
			var dxDAYBOXWEEKEND = 30;	// total width of the box
			var wDAYBOX = 25;			// 25(width) 	+ 2(pad-right) 	+ 1(border-right) 	= 28px = dxDAYBOX
			var wDAYBOXWEEKEND = 27;	// 27(width) 	+ 2(pad-right) 	+ 1(border-right) 	= 30px = dxDAYBOXWEEKEND
			var dyDAYBOX = 18;			// total height of the box
			var dyDAYNAMEBOX = 18;			// total height of the box
			var hDAYBOX = 15;			// 19(height) 	+ 2(pad-top) 	+ 1(border-top) 	= 22px;
			var hDAYNAMEBOX = 15;		// 15(height) 	+ 2(pad-top) 	+ 1(border-top) 	= 18px;
			// give box right size since everything else absolutely positioned
			strCal += '<img src="/spacer.gif" width="200" height="126" alt="" border="0">';
			// day names
			for (var j=0; j < 7; j++) {
				// -- create style for x,y,dx,dy for each cell
				var styleExtra = ' style ="position:absolute; height:15px; top: 0px;';
				if (j == 0) {
					styleExtra += ' left:0px;';
				} else { 
					styleExtra += ' left:'+(dxDAYBOXWEEKEND +((j-1)*dxDAYBOX))+'px;';
				}
				if ((j == 0) || (j == 6)) {
					styleExtra += ' width:27px;';
				} else {
					styleExtra += ' width:25px;';
				}
				styleExtra += '" ';
				// -- create the cell
				strCal += '<div class="cal_dayname"'+styleExtra+'>' + aDaysShort[j] + '</div>';
			}
			// day numbers
			var iDay = 0 - nDayOneOfCal; 				//0-based -- set to negative for number of blank days at start of month
			for (var iW=0; iW<6; iW++) {
				for (var iD=0; iD <7; iD++) {
					// -- create style for x,y,dx,dy for each cell
					var styleExtra = ' style ="position:absolute; height:15px;';
					if ((iD == 0) || (iD == 6)) {
						styleExtra += ' width:27px;';
					} else {
						styleExtra += ' width:25px;';
					}
					if (iD == 0) {
						styleExtra += ' left:0px;';
					} else { 
						styleExtra += ' left:'+(dxDAYBOXWEEKEND +((iD-1)*dxDAYBOX))+'px;';
					}
					styleExtra += ' top:'+((iW*dyDAYBOX)+dyDAYNAMEBOX)+'px;';
					styleExtra += '" ';
					
					// -- create the cell
					var fInPast = false;
					if ((iDay < 0) || (iDay >= nDaysInCalMonth)) {
						//blank day
						strCal += '<div class="tdcalempty"'+styleExtra+'>&nbsp;</div>';
					} else {
						// numbered day
						//		...does it have any events?
						var fHasClassEvents = false;
						var fHasGeneralEvents = false;
						if (aCalClassSession[iDay] != 0) {fHasClassEvents = true;}
						if (aCalGeneralEvent[iDay] != 0) {fHasGeneralEvents = true;}
						// 		...first set correct stylesheet info
						if ((fCalThisMonth) && (iDay+1 == nTodayDay)) { 
							// today
							if (fHasGeneralEvents) {
								strCal += '<div class="tdcaltodayEvents"'+styleExtra+'>';
							} else {
								strCal += '<div class="tdcaltoday"'+styleExtra+'>';
							}
	
						} else if ((fCalThisMonth) && (iDay+1 < nTodayDay)) { 
							// in past
							if (fHasGeneralEvents) {
								strCal += '<div class="tdcalinpastEvents"'+styleExtra+'>';
							} else {
								strCal += '<div class="tdcalinpast"'+styleExtra+'>';
							}
							fInPast = true;
						} else {
							// in future
							if (fHasGeneralEvents || fHasClassEvents) {
								strCal += '<div class="tdcalfutureEvents"'+styleExtra+'>';
							} else {
								strCal += '<div class="tdcalfuture"'+styleExtra+'>';						
							}
						}
						// -- put the ClassSession marker in if there are class session this day
						var strLinkTitle = "";
						if (fHasGeneralEvents) {
							strLinkTitle += 'EVENTS';
							var strTemp = aCalGeneralEvent[iDay];
							strLinkTitle += strTemp.substring(1,strTemp.length);
						}
						if (fHasClassEvents) {
							strLinkTitle += 'EVENTS';
							var strTemp = aCalClassSession[iDay];
							strLinkTitle += strTemp.substring(1,strTemp.length);
						}
						if (fHasClassEvents || fHasGeneralEvents) {
							var strTemp = aCalClassSession[iDay];
							var idList = aCalEventIdList[iDay];
							strCal += '<img class="calCellIcon" src="/bits/clock.gif" width="8" height="8" ';
							strCal += 'alt="'+strLinkTitle+'" title="'+strLinkTitle+'" border="0">';					
						}
						// -- create day number link
						var strClass = "";
						if (fHasGeneralEvents || fHasClassEvents) {
							if (fInPast) {
								strClass = 'calDayEventInPast';
							} else {
								strClass = 'calDayEvent';
							}
							strLinkTitle  = 'Click to add a new event on this day...';
						} else {
							if (fInPast) {
								strClass = 'calDayNoEventInPast';
								strLinkTitle = '';
							} else {
								strClass = 'calDayNoEvent';
								strLinkTitle = 'Click to add an event on this day...';
							}
						}
						strCal += '<a class="'+strClass+'" ';
						if (fEditOK) {
							strCal += 'href="javascript:addEvent(';
						} else {
							strCal += 'href="javascript:noaddEvent(';
							strLinkTitle = "";
						}
						strCal += (iDay+1) + ',' + nCalMonth  + ',' + nCalYear + ',0';
						strCal += ')" title="'+ strLinkTitle +'">';
						strCal += (iDay+1);
						strCal += ' </a>';
						// -- finish cell
						strCal += '</div>';
					}
					iDay++;
				}
			}
			strCal += "</div>";
			
			// --------------------------
			// 6. RETURN HTML STRING
			return strCal;
		}
		
		// ---------------------------------------------
		// 	getUpcomingEventsHTML
		//		-- ASSUMPTION: aEventsAll are in starting date order
		//		-- look for first event that start more than n days from today
		//		-- skip it an all others
		//		-- get html for good events
		//		-- return html to caller
		function getUpcomingEventsHTML(aEventsAll, nDayRange, fShowAll, idUser, fIsAdmin) {
			var aEventsShow = new Array();
			if (fShowAll == 1) {
				aEventsShow = aEventsAll;
			} else {
				// determine date range
				var tToday = new Date();
				tToday.setHours(23);
				tToday.setMinutes(59);
				tToday.setSeconds(59);
				var msecEndRange = tToday.getTime() + (nDayRange * msecOneDay);
				// new event array to fill with good events
				var nShown = 0;
				// check each event until find one too far in future
				for (var i = 0; i < aEventsAll.length - 1; i++) {
					var aE = aEventsAll[i].split("|");
					var EStart	= aE[3];
					var msecE = msecFromMysqlDatetime(EStart);
					var tE = new Date(msecE);
					if (msecE <= msecEndRange) {
						aEventsShow[nShown] = aEventsAll[i];
						nShown++;
					} else {
						break;
					}
				}	
				aEventsShow[nShown] = "***";
			}
			var str = getEventListHTML(aEventsShow, idUser, fIsAdmin);
			return (str);
		}
	
		// ---------------------------------------------
		// 	getEventListHTML
		//		-- creates html list of events for all events passed into aEventsShow
		//		-- returns html
		function getEventListHTML(aEventsShow, idUser, fIsAdmin) {
			var str = ""; 	
			
			// For each matching event get data
			//		-- NOTE: these are already sorted in date order
			//		-- FORMAT: "EventId|EventTypeId|EventTypeName|StartTime|EndTime|Author|Title|Description|Email|URL|Person.DisplayName"
			var nEvents = aEventsShow.length - 1;
			for (var i = 0; i < nEvents; i++) {
				var aE = aEventsShow[i].split("|");
				var EventId		 	= aE[0];
				var FarmId		 	= aE[1];
				var strFarmName 	= aE[2];
				var EStart		 	= aE[3];
				var EFinish			= aE[4];
				var strTitle 		= aE[5];
				var strText 		= aE[6];
				var strLocation		= aE[7];
				var nModifiedDays	= aE[8];
				
				// create HTML for each event
				str += '<div class="event_area">';

					// DATE
					var strEDate = getEventDateHTML(EStart, EFinish, 1);
					//str += '<div class="event_date"><img src="/bits/clock.gif" width="8" height="8" alt="" border="0"> ' + strEDate+ '</div>' ;
					str += '<div class="event_date">' + strEDate+ '</div>' ;
					// TITLE
					str += '<div class="event_title">';
						str += strTitle;
						if (nModifiedDays > 0 ) { str += '<img src="/bits/updated2.gif" width="11" height="11" alt="New or Updated" border="0">';					}
					str += '</div>';
					
					// TEXT 
					str += '<div class="event_text">';
						if (FarmId > 1) {
							str += '<i><a href="javascript:visitFarm('+FarmId+')">'+strFarmName +'</a></i> '+getFooterDivider()+ ' ';
						}
						str += makeURLsHot(strText);
						if (isNotEmpty(strLocation)) { str += '<b> Location: </b>'+strLocation;	}
					str += '</div>';
					
					// FOOTER
					str += '<div class="footer">';
						var fAddTilde = false;
						// IF SIGNED IN AS OWNER
						if ((FarmId == idUser) || fIsAdmin) {
							if (fAddTilde) { str += getFooterDivider(); }
							str += '<a href="javascript:editEvent('+EventId+');" class="notice_footer">change</a> ';
							str += getFooterDivider();
							str += '<a href="javascript:deleteEvent('+EventId+');" class="notice_footer">delete</a> ';
						}
					str += '</div>';

				str += '</div>';
			} // for loop
			return str;
		}
				
		function showCal(nCal) {
			var dom1 = getDOM("calmonth1",1);
			var dom2 = getDOM("calmonth2",1);
			//var domT1 = getDOM("caltab1",1);
			//var domT2 = getDOM("caltab2",1);
			if (nCal == 1) {
				dom1.zIndex = 10;
				//domT1.zIndex = 11;
				dom2.zIndex = 8;
				//domT2.zIndex = 3;
			} else {
				dom1.zIndex = 8;
				//domT1.zIndex = 3;
				dom2.zIndex = 10;
				//domT2.zIndex = 11;
			}
		}
	
			
	