// updated 12/19/2009

if (cal_gfShowApptInPast == null)		var cal_gfShowApptInPast = false;
if (cal_gfShowHolidayInPast == null)	var cal_gfShowHolidayInPast = false;
if (cal_giDebugBirthdays == null)		var cal_giDebugBirthdays = 0;
if (cal_gfShowBdayInPast == null)		var cal_gfShowBdayInPast = true;
if (cal_gfShowEventInPast == null)		var cal_gfShowEventInPast = true;
var cal_grgEvents = new Array();
var cal_gnrgEvents = 0;
var cal_grgImages = new Array();
var cal_gnrgImages = 0;
var cal_grgSearch = new Array();
var cal_gnrgSearch = 0;
// clibdb_register('cal_grgEvents','cal_grgImages','cal_grgSearch');
var cal_x_iHandle = 42;
// var cal_grgFullMoon = new Array();
// var cal_gnrgFullMoon = 0;

function cal_x_moonRecord(date,fBlue) {
	this.members = 'date,fBlue';
	this.date=date;
	this.fBlue=fBlue;
	}

function cal_x_imageRecord(url,url_dim,w,h) {
	this.members = 'url,url_dim,w,wInit,h,hInit';
	this.url = url;
	this.url_dim = url_dim;
	this.w = w;
	this.wInit = w;
	this.h = h;
	this.hInit = h;
	}

function cal_x_searchRecord(month,date,year,handle) {
	this.members = 'month,date,year,iEvent,handle';
	this.month = month;
	this.date = date;
	this.year = year;
	this.iEvent = 0;
	this.handle = handle;
	}


function cal_x_newSearch(month,date,year,handle) {
	for (var i = 0; i < cal_gnrgSearch; i++) if (cal_grgSearch[i].handle == null) {
		cal_grgSearch[i].handle
		cal_grgSearch[i].month = month;
		cal_grgSearch[i].date = date;
		cal_grgSearch[i].year = year;
		cal_grgSearch[i].iEvent = 0;
		cal_grgSearch[i].handle = handle;
		return i;
		}
	cal_grgSearch[cal_gnrgSearch] = new cal_x_searchRecord(month,date,year,handle);
	i = cal_gnrgSearch;
	cal_gnrgSearch ++;
	return i;
	}

function cal_openEventSearch(month,date,year) {
	var handle = cal_x_iHandle++;
	var irg = cal_x_newSearch(month,date,year,handle)
	return handle;
	}

function cal_nextEventSearch(handle) {
	var iH = null;
	for (var i = 0; i < cal_gnrgSearch; i++) if (cal_grgSearch[i].handle = handle) iH = i;
	if (iH == null) return null;
	for (var i = cal_grgSearch[iH].iEvent; i < cal_gnrgEvents; i++) {
		cal_grgSearch[iH].iEvent++;
		if ((cal_grgEvents[i].month == cal_grgSearch[iH].month) &&
			(cal_grgEvents[i].date==cal_grgSearch[iH].date) &&
			((cal_grgEvents[i].year == null) || (cal_grgEvents[i].year == cal_grgSearch[iH].year))) return i;
		}
	return null;
	}

function cal_closeEventSearch(handle) {
	for (var i = 0; i < cal_gnrgSearch; i++) if (cal_grgSearch[i].handle = handle) cal_grgSearch[i].handle = null;
	}

function cal_x_eventRecord(what,month,date,year,url,noImageText,fShowInPast,fHoliday,fTime,timeStart,timeEnd,timeColor,fOpen,fBgImage) {
	this.members = 'what,month,date,year,url,noImageText,fShowInPast,fHoliday,fTime,timeStart,timeEnd,timeColor,fOpen,fBgImage,imgAlt';
	this.what = what;
	this.date = date;
	this.month = month;
	this.year = year;
	this.url = url;
	this.noImageText = noImageText;
	var iImage = 0;
	if (url != null) {
		var i = 1;
		while ((i < cal_gnrgImages) && (iImage == 0)) {
			if (url == cal_grgImages[i].url) iImage = i;
			i++;
			}
		}
	this.iImage = iImage;
	this.fShowInPast = ((fShowInPast == null) ? false : fShowInPast);
	this.fHoliday = ((fHoliday == null) ? false : fHoliday);
	this.fTime = ((fTime == null) ? false : fTime);
	this.timeStart = timeStart;
	this.timeEnd = timeEnd;
	this.timeColor = timeColor;
	this.fOpen = fOpen;
	this.fBgImage = fBgImage;
	this.imgAlt = null;
	}

var fOnlyOnce = true;

function cal_x_createEvent(what,month,date,year,url,noImageText,fShowInPast,fHoliday, fTime, timeStart, timeEnd, timeColor, fOpen, fBgImage) {
	var fixlist = 'url,noImageText,fShowInPast,fHoliday,fTime,timeStart,timeEnd,timeColor,fOpen,fBgImage';
	var rgfix = fixlist.split(',');
	for (var i = 0; i < rgfix.length; i++) eval("if ((typeof " + rgfix[i] + " == 'undefined') || (" + rgfix[i] + " == 'undefined')) " + rgfix[i] + "= null;");
	if (fShowInPast == null) fShowInPast = false;
	if (fHoliday == null) fHoliday = false;
	if (fTime == null) fTime = false;
	if (fOpen == null) fOpen = true;
	if (fBgImage == null) fBgImage = false;
	if ((typeof url == 'string') && (url.substr(url.length - 4,1) != '.')) url += '.gif';
	cal_grgEvents[cal_gnrgEvents++] = new cal_x_eventRecord(what,month,date,year,url,noImageText,fShowInPast,fHoliday, fTime, timeStart, timeEnd, timeColor, fOpen, fBgImage);
	return (cal_gnrgEvents-1);
	}

function cal_defineBirthday(name, bdate) {
	var rg = new Array();
	rg = dt_parseDate(bdate,0,9999);
	var year = (rg[6]==true) ? null : rg[3];
	if (cal_giDebugBirthdays > 0) {
		window.alert('"' + bdate + '" (' + rg + ')')
		cal_giDebugBirthdays --;
		}
	cal_x_createEvent(name + ((year==null) ? " B'day" : ' (' + rg[3] + ')'),rg[1],rg[2],null,"candle",null,cal_gfShowBdayInPast);
	}

function cal_defineImageSize(url,w,h) {
	if (typeof url == 'string') url = clib_unhideUrl(url + '~g~');
	var url_dim = (typeof url == 'string' ? clib_insertText(url, '.', '_dim.') : null);
	cal_grgImages[cal_gnrgImages] = new cal_x_imageRecord(url,url_dim,w,h);
	cal_gnrgImages++;
	}

function cal_defineEvent(edate,what,url,noImageText,fHoliday,fBgImage) {
	if (fBgImage == null) fBgImage = false;
	var rg = new Array();
	rg = dt_parseDate(edate,0,9999);
	var year = (rg[6]==true) ? null : rg[3];
	return cal_x_createEvent(what,rg[1],rg[2],year,url,noImageText,cal_gfShowEventInPast,fHoliday,null,null,null,null,null,fBgImage);
	}

function cal_defineEventGMT(gmt,what,url,noImageText,fHoliday,fAddTime) {
	if (fAddTime = null) fAddTime = true;
	var rgLocal = cal_x_getLocalFromGMT(gmt)
//	if (fAddTime) 
	what += ' (' + rgLocal[1] + ')';
	var edate = rgLocal[0]
	var rg = new Array();
	rg = dt_parseDate(edate,0,9999);
	var year = (rg[6]==true) ? null : rg[3];
	var iEvent = cal_x_createEvent(what,rg[1],rg[2],year,url,noImageText,cal_gfShowEventInPast,fHoliday);
	var e = cal_grgEvents[iEvent];
	e.imgAlt = rgLocal[4];
	return iEvent;
	}

var cal_gmtLastMonth = null;
function cal_defineFullMoonGMT(gmt) {
	var rg = cal_x_getLocalFromGMT(gmt);
	var localString = rg[0];
	var localDate = new Date(localString);
	var month = localDate.getMonth();
	var fBlue = (month == cal_gmtLastMonth);	// makes (dubious) assumption full moons are defined in order
	cal_gmtLastMonth = month;
	var iEvent = cal_defineEvent(localString,(fBlue ? "Blue Moon" : "Full Moon"), (fBlue ? "bluemoon.gif" : "fullmoon.gif"));
	var e = cal_grgEvents[iEvent];
	e.imgAlt = rg[4];
	return iEvent;
	}

function cal_defineTimeBlock(edate,what,timeStart,timeEnd,timeColor,url,noImageText,fOpen) {
	var rg = new Array();
	rg = dt_parseDate(edate,0,9999);
	return cal_x_createEvent(what,rg[1],rg[2],rg[3],url,noImageText,cal_gfShowApptInPast,false,true,timeStart,timeEnd,timeColor,fOpen);
	}

function cal_defineTimeBlockList(what,timeColor,url,noImageText,fOpen,  date1,start1,end1,  date2,start2,end2,  etc) {
	var args = cal_defineTimeBlockList.arguments;
	for (var i=6; i<args.length; i+=3) cal_defineTimeBlock(args[i-2],what,args[i-1],args[i],timeColor,url,noImageText,fOpen);
	}

function cal_defineEventList(what,url,noImageText,fHoliday,  date1,  date2,  etc) {
	var args = cal_defineEventList.arguments;
	for (var i=4; i<args.length; i++) cal_defineEvent(args[i],what,url,noImageText,fHoliday);
	}

function cal_defineMonthEventList(what,url,noImageText,fHoliday, month_year, date1,  date2,  etc) {
	var args = cal_defineMonthEventList.arguments;
	for (var i=5; i < args.length; i++) cal_defineEvent(args[i] + ' ' + month_year,what,url,noImageText,fHoliday);
	}

function cal_defineMonthEventListBg(what,url,noImageText,fHoliday, month_year, date1,  date2,  etc) {
	var args = cal_defineMonthEventListBg.arguments;
	for (var i=5; i < args.length; i++) cal_defineEvent(args[i] + ' ' + month_year,what,url,noImageText,fHoliday,true);
	}

function cal_defineHoliday(edate,what,url,noImageText) {				// define holiday from school
	var fShowInPast = (what != null);
	var rg = new Array();
	rg = dt_parseDate(edate,0,9999);
	var year = (rg[6]==true) ? null : rg[3];
	return cal_x_createEvent(what,rg[1],rg[2],year,url,noImageText,cal_gfShowHolidayInPast,true);
	}

function cal_defineAppointmentList(trueText,falseText,trueColor,falseColor, nSlots, slot0Start, slot1Start, etc1, date0, fSlot0OpenDate0, fSlot1OpenDate0, etc2, date1, etc3) {
	var args = cal_defineAppointmentList.arguments;
	if (args.length < 10) return;
	var nSlots = args[4];
	if ((nSlots == null) || (nSlots == 0)) return;
	var iSlotStart = 5;
	var iSlotLimit = iSlotStart + nSlots;
	var iDateStart = iSlotLimit;
	var rgTime = new Array();
	for (var i = 0; i < nSlots; i++) rgTime[i] = args[iSlotStart + i];

	for (var i = iDateStart; i < args.length - nSlots; i += nSlots + 1) {
		for (j = 0; j < nSlots; j++) {
			var fOpen = args[i+j+1];
			var text = (fOpen ? trueText : falseText);
			var color = (fOpen ? trueColor : falseColor);
			cal_defineTimeBlock(args[i],text,rgTime[j],null,color,null,null,fOpen)
			}
		}
	}

function cal_x_getDateTimeString(d) {
	if (typeof d != 'object') d = new Date();
	var rgMonth = new Array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec");
	var rg = new Array();
	rg[0] = rgMonth[d.getMonth()] + ' ' + d.getDate() + ', ' + d.getFullYear();
	var h = d.getHours();
	var m = d.getMinutes();
	if ((h == 12) && (m == 0)) rg[1] = '12:00N';
	else if ((m == 0) && ((h == 0) || (h == 24))) rg[1] = '12:00M';
	else {
		var ampm = (h >= 12 ? 'PM' : 'AM');
		if (h > 12) h = h - 12;
		if (h == 0) h = 12;
		rg[1] = h + ':' + (m > 9 ? '' : '0') + m + ampm;
		}
	return rg;
	}

var fAlertOnce = true;
function cal_x_getLocalFromGMT(gmt) {
	var gmtDate = new Date(gmt);
	var rgGmt = cal_x_getDateTimeString(gmtDate)
	var localDate = new Date(gmtDate.getTime() - (gmtDate.getTimezoneOffset() * 60000));
	var rg = cal_x_getDateTimeString(localDate);
	rg[2] = rgGmt[0];
	rg[3] = rgGmt[1];
	rg[4] = rg[1] + ' (' + rg[3] + (rg[0] != rg[2] ? ' ' + rg[2] : '') + ' UT/GMT)';
	return rg;
	}

