singleList = {};
yearlyList = {};
monthlyList = {};
specialMonth = {};
specialYearly = {};
specialSingle = {};

word_day = new Array("Sun","Mon","Tue","Wed","Thu","Fri","Sat");
letter_day = new Array("S","M","T","W","T","F","S");
word_count = new Array("first","second","third","fourth","last");
word_month = new Array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec");
fullword_month = new Array("January","February","March","April","May","June","July","August","September","October","November","December");
month_days = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
calObjs = {};
calObjsArray = new Array();
agendaPath = '/calendar/agenda.xml';

/** ********************************************************************************************************************* **/
function Calendar() {
	this.children = {};
	this.childrenArr = new Array();

	this.init = init;
	this.drawMonthlyCalendar = drawMonthlyCalendar;
	this.goPrevMonth = goPrevMonth;
	this.goNextMonth = goNextMonth;
	this.loadCalendars = loadCalendars;
	this.calDropDown = calDropDown;
	this.addCalendar = addCalendar;
	this.removeCalendar = removeCalendar;
	function init() {
		attachEventListener(window,'load',this.loadCalendars, false);
		
	}
	
	function calDropDown(e) {
		if (!e) var e = window.event;
		
		var tg = (window.event) ? e.srcElement : e.target;
			
		var targetId = (tg.id).replace(/\_curMonthLink$/,'');
		if (calObjs[targetId].prefix == 'small')
			dropdownmenu(document.getElementById(targetId+'_curMonthLink'), e, calObjs[targetId].calMenu, '35px');
		else
			dropdownmenu(document.getElementById(targetId+'_curMonthLink'), e, calObjs[targetId].calMenu, '100px');
	}
	
	function goPrevMonth (e) {
		if (!e) var e = window.event;
			var tg = (window.event) ? e.srcElement : e.target;
		var targetId = (tg.id).replace(/\_prevClick$/,'');

		calObjs[targetId].goPrevMonth();
	}
	function goNextMonth (e) {
		if (!e) var e = window.event;
			var tg = (window.event) ? e.srcElement : e.target;
		var targetId = (tg.id).replace(/\_nextClick$/,'');

		calObjs[targetId].goNextMonth();
	}

	function loadCalendars() {
		if ( !document.getElementById || !document.createElement || !document.getElementsByTagName ) {
			return;
		}
		var dates = new DateList();
		var currentDate = new Date();
		dates.importXML();
		
		var calElems = document.getElementsByTagName('calendar');
		for (var x = 0; x < calElems.length; x++) {
			addCalendar(calElems[x].id);			
		}//for
		calElems = document.getElementsByTagName('calendar');
		while (calElems.length > 0) {
			calElems[0].parentNode.removeChild(calElems[0]);
		}
	}//function

	function removeCalendar(itemId) {
		var temp = document.createElement('calendar');
		var old = document.getElementById(itemId);
		old.id = itemId+'_temp';
		temp.id = itemId;
		old.parentNode.insertBefore(temp, old);
		old.parentNode.removeChild(old);
		pop(calObjs[itemId]);

		return temp;
	}
	
	function addCalendar(itemId) {
			currentDate = new Date();
			var temp;
			var calElem = document.getElementById(itemId);
			var old = calElem;
			var atrType = calElem.getAttribute('type');
			var prefix = '';
			if (calElem.getAttribute('day')) 
				currentDate.setUTCDate(calElem.getAttribute('day'));
			if (calElem.getAttribute('month')) 
				currentDate.setUTCMonth(calElem.getAttribute('month')-1);
			if (calElem.getAttribute('year')) 
				currentDate.setUTCFullYear(calElem.getAttribute('year'));
			if (calElem.getAttribute('hour'))
				currentDate.setUTCHours(calElem.getAttribute('hour'));
			if (calElem.getAttribute('minute')) 
				currentDate.setUTCMinutes(calElem.getAttribute('minute'));
				
			switch (atrType) {
				case 'monthlyCalSmall':
					prefix = 'small';
				case 'monthlyCal':
					temp = new MonthlyCal();
					temp.calId = calElem.getAttribute('id');
					temp.calType = calElem.getAttribute('type');
					calObjs[temp.calId] = temp;
					calObjsArray[calObjsArray.length] = temp.calId;

					drawMonthlyCalendar(temp.calId, prefix);
					temp.init(currentDate, prefix);
					break;
					
					
				case 'timePickerSmall':
					prefix = 'small';
				case 'timePicker':
				
					break;
				case 'datePickerSmall':
					prefix = 'small';
				case 'datePicker':
					temp = new DatePicker();
					temp.calId = calElem.getAttribute('id');
					temp.calType = calElem.getAttribute('type');
					temp.curDate = currentDate;
					calObjs[temp.calId] = temp;
					calObjsArray[calObjsArray.length] = temp.calId;
					
					drawDatePicker(temp.calId, prefix);
					temp.init(currentDate, prefix);
					break;
					
					
				case 'monthYearPickerSmall':
					prefix = 'small';
				case 'monthYearPicker':
				
					break;
				case 'dateTimePickerSmall':
					prefix = 'small';
				case 'dateTimePicker':
					break;
			}//switch
			if (!temp) {
				alert('unable to load calendar '+ calElem.getAttribute('id'));
			}
			return old;
	}
	
	function drawDatePicker(itemId, prefix) {
		var old = document.getElementById(itemId);
		var container = document.createElement('div');
		var calSrc = document.createElement('input');
		var calDisplay = document.createElement('span');
		var calPicker = document.getElementById('calDatePicker');
		
		if (!calPicker) {
			calPicker = document.createElement('div');
			document.getElementsByTagName('body')[0].appendChild(calPicker);
			calPicker.id = 'calDatePicker';
			calPicker.style.visibility = 'hidden';
			calPicker.style.top = '-500px';
			calPicker.style.left = '-500px';
			var tbl = document.createElement('table');
			tbl.id = 'calDatePickerTable';
			calPicker.appendChild(tbl);
			temp = new MonthlyCal();
			temp.calId = 'calDatePickerTable';
			temp.calType = 'monthlyCalSmall';
			drawMonthlyCalendar(temp.calId, 'small', null,true);
			temp.init(calObjs[itemId].curDate, prefix, true);
			calObjs['calDatePickerTable'] = temp;
		}
		old.id = 'tempOld'+itemId;
		container.id = itemId+'_container';
		calSrc.id = itemId;
		calDisplay.id = itemId+'_calDatePicker_display';
		container.className = 'calDatePicker';
		calDisplay.className = 'calDatePicker_display';
		calSrc.type = 'hidden';
		
		container.appendChild(calSrc);
		container.appendChild(calDisplay);
		attachEventListener(calDisplay,'mousedown',displayDatePicker,true);
		attachEventListener(calDisplay,'mouseout',delayHideDatePicker,true);
		old.parentNode.insertBefore(container, old);
	}
	
	function drawMonthlyCalendar(itemId, prefix, classPrefix, attachCellListeners) {
		if (!classPrefix)
			classPrefix = 'calMonthly';

		var old = document.getElementById(itemId);
		var tbl = document.createElement('table');
		var tblBody = document.createElement('tbody');
		tbl.appendChild(tblBody);
		tbl.className = prefix+classPrefix+'_main';
		var trHeader = document.createElement('tr');
		var trDayHeader = document.createElement('tr');

		var btnPrev = document.createElement('input');
		var btnNext = document.createElement('input');

		var tdPrev = document.createElement('td');
		var tdCur = document.createElement('td');
		var tdNext = document.createElement('td');
		tbl.border = 1;
		old.id = 'tempOld'+itemId;
		tbl.id = itemId;
		tdPrev.id = itemId+'_calMonthly_prev';
		tdCur.id = itemId+'_calMonthly_cur';
		tdNext.id = itemId+'_calMonthly_next';
		
		trHeader.className = prefix+classPrefix+'_header';
		trDayHeader.className = prefix+classPrefix+'_header';
		
		tdCur.colSpan = 5;
		btnPrev.id = itemId+'_prevClick';
		btnNext.id = itemId+'_nextClick';
		tdPrev.className = prefix+classPrefix+'_changeMonthTd';
		tdNext.className = prefix+classPrefix+'_changeMonthTd';
		tdCur.className = prefix+classPrefix+'_curMonth';
		btnPrev.className = prefix+classPrefix+'_changeMonthButton';
		btnNext.className = prefix+classPrefix+'_changeMonthButton';
		btnPrev.value = '«';
		btnNext.value = '»';
		btnPrev.type = 'button';
		btnNext.type = 'button';
		var curLink = document.createElement('a');
		var curYear = document.createElement('span');

//insert button hack here
		var curYearTbl = document.createElement('span');
		curYearTbl.className = 'upDownYearTbl';
		var dwnBtn = document.createElement('img');
		dwnBtn.className = 'downButton';
		dwnBtn.src = '/images/down.jpg';
		dwnBtn.id = itemId+'_dwnBtn';
		attachEventListener(dwnBtn, "click", yearJumpRedirect, true);

		var upBtn = document.createElement('img');
		upBtn.className = 'upButton';
		upBtn.src = '/images/up.jpg';
		upBtn.id = itemId+'_upBtn';

		curYearTbl.appendChild(upBtn);
		curYearTbl.appendChild(dwnBtn);

		attachEventListener(upBtn, "click", yearJumpRedirect, true);

		
		curYear.id = itemId+'_curYearLink';
		curYear.className = prefix+classPrefix+'_curYearLink';
				
		curLink.href = 'Javascript: void(0);';
		curLink.id = itemId+'_curMonthLink';
		curLink.className = prefix+classPrefix+'_curMonthLink';
		tdCur.appendChild(curLink);
		tdCur.appendChild(curYear);
		tdCur.appendChild(curYearTbl);
		
		attachEventListener(curLink, "click", calDropDown, true);
		attachEventListener(curLink, "mouseout", delayhidemenu, true);
		if (attachCellListeners)
			attachEventListener(old.parentNode, "mouseout", delayhidemenu, true);
		
		tdPrev.appendChild(btnPrev);
		tdNext.appendChild(btnNext);
		trHeader.appendChild(tdPrev);
		trHeader.appendChild(tdCur);
		trHeader.appendChild(tdNext);

		attachEventListener(btnPrev, "click", goPrevMonth, true);
		attachEventListener(btnNext, "click", goNextMonth, true);


		for (var y = 0; y < 7; y++) {
			var tdDay = document.createElement('td');
			if (prefix == 'small')
				tdDay.innerHTML = letter_day[y];			
			else
				tdDay.innerHTML = word_day[y];
			tdDay.className = prefix+classPrefix+'_dayHeader';
			trDayHeader.appendChild(tdDay);
		}

		tblBody.appendChild(trHeader);
		tblBody.appendChild(trDayHeader);

		for (var y = 1; y <= 6; y++) {
			var trow = document.createElement('tr');
			trow.id = itemId+'_calMonthly_week'+y;
			trow.className = prefix+classPrefix+'_body';
			for (var cCnt = 1; cCnt <= 7; cCnt++) {
				var tcol = document.createElement('td');
				tcol.className = 'cal_date';
				tcol.id = itemId+'_calMonthly_cell'+(cCnt + ((y-1)*6)+ (y-1));
				if (attachCellListeners) {
					attachEventListener(tcol, "click", calDatePick, true);
					attachEventListener(tcol, "mouseover", calDateHoverOn, true);
					attachEventListener(tcol, "mouseout", calDateHoverOff, true);
				}
				trow.appendChild(tcol);
			}
			tblBody.appendChild(trow);
		}
		old.parentNode.insertBefore(tbl,old);
	}
}



function DatePicker() {
	this.dates = new DateList();
	this.calMenu = new Array();
	this.prefix = '';
	this.curDate = new Date();
	this.calId = '';
	this.calType = '';
	
	this.goPrevMonth = goPrevMonth;
	this.goNextMonth = goNextMonth;
	this.monthJump = monthJump;
	this.yearJump = yearJump;
	
	this.getDays = getDays;
	
	this.generateView = generateView;
	
	this.init = init;
	this.calibrate = calibrate;
	this.setFullDate = setFullDate;
	
	function init(dateObj, prefix) {
		this.prefix = prefix;
		this.curDate = dateObj;
		var tempArray;
		if(prefix == 'small')
			tempArray = word_month;
		else
			tempArray = fullword_month;
		
		this.calMenu = new Array('<a class="'+this.prefix+'dropmenuItem" href="Javascript: monthJumpRedirect(\''+this.calId+'\', 0)">'+tempArray[0]+'</a>',
				'<a class="'+this.prefix+'dropmenuItem" href="Javascript: monthJumpRedirect(\''+this.calId+'\', 1)">'+tempArray[1]+'</a>',
				'<a class="'+this.prefix+'dropmenuItem" href="Javascript: monthJumpRedirect(\''+this.calId+'\', 2)">'+tempArray[2]+'</a>',
				'<a class="'+this.prefix+'dropmenuItem" href="Javascript: monthJumpRedirect(\''+this.calId+'\', 3)">'+tempArray[3]+'</a>',
				'<a class="'+this.prefix+'dropmenuItem" href="Javascript: monthJumpRedirect(\''+this.calId+'\', 4)">'+tempArray[4]+'</a>',
				'<a class="'+this.prefix+'dropmenuItem" href="Javascript: monthJumpRedirect(\''+this.calId+'\', 5)">'+tempArray[5]+'</a>',
				'<a class="'+this.prefix+'dropmenuItem" href="Javascript: monthJumpRedirect(\''+this.calId+'\', 6)">'+tempArray[6]+'</a>',
				'<a class="'+this.prefix+'dropmenuItem" href="Javascript: monthJumpRedirect(\''+this.calId+'\', 7)">'+tempArray[7]+'</a>',
				'<a class="'+this.prefix+'dropmenuItem" href="Javascript: monthJumpRedirect(\''+this.calId+'\', 8)">'+tempArray[8]+'</a>',
				'<a class="'+this.prefix+'dropmenuItem" href="Javascript: monthJumpRedirect(\''+this.calId+'\', 9)">'+tempArray[9]+'</a>',
				'<a class="'+this.prefix+'dropmenuItem" href="Javascript: monthJumpRedirect(\''+this.calId+'\', 10)">'+tempArray[10]+'</a>',
				'<a class="'+this.prefix+'dropmenuItem" href="Javascript: monthJumpRedirect(\''+this.calId+'\', 11)">'+tempArray[11]+'</a>');
		this.curDate.setDate(dateObj.getDate());
		this.generateView();
	}
	
	function generateView() {
		var srcObj = document.getElementById(this.calId);
		var displayObj = document.getElementById(this.calId+'_calDatePicker_display');
		if (displayObj.childNodes.length <= 0)
			displayObj.appendChild(document.createTextNode(''));
			
			displayObj.firstChild.nodeValue = 	word_month[this.curDate.getMonth()]+ ' '+
														this.curDate.getUTCDate() + ' ,' +
														this.curDate.getFullYear();
		srcObj.value = ''+this.curDate.getTime();
	}
	
	function setFullDate(targetYear, targetMonth, targetDay) {
		this.curDate.setFullYear(targetYear);
		this.curDate.setMonth(targetMonth);
		this.curDate.setUTCDate(targetDay);
		this.generateView();
	}
	function goPrevMonth() {
		this.curDate.setMonth(this.curDate.getMonth()-1);
		this.generateView();
	}
	function goNextMonth() {
		this.curDate.setMonth(this.curDate.getMonth()+1);		
		this.generateView();
	}
	function monthJump(targetMonth,targetYear) {
		this.curDate.setMonth(targetMonth-1);
		this.curDate.setFullYear(targetYear);
		this.generateView();
	}
	
	function yearJump(targetYear) {
		this.curDate.setFullYear(targetYear);	
		this.generateView();
	}
	
	function getDays(y,m) {
		month_days[1]=y%4==0&&y%100!=0||y%400==0?29:28;
		return month_days[m];
	}
	
	function calibrate(y,m) {
		if (m<0) { y--; m+=12; }
		else if (m>11) { y++; m-=12; }
		return [y,m];
	}

}
/** ********************************************************************************************************************* **/
function MonthlyCal() {
	this.dates = new DateList();
	this.calMenu = new Array();
	this.prefix = '';
	this.curDate = new Date();

	this.curDay = 0;
	this.curMonth = 0;
	this.curYear = 0;
	this.viewMonth = 0;
	this.viewYear = 0;
	this.prevMonth =0;
	this.prevYear = 0;
	this.nextMonth = 0;
	this.nextYear = 0;
	this.calId = '';
	this.calType = '';
	this.blockPopups = false;
	
	this.goPrevMonth = goPrevMonth;
	this.goNextMonth = goNextMonth;
	this.monthJump = monthJump;
	this.yearJump = yearJump;
	this.setFullDate = setFullDate;
	
	this.getDays = getDays;
	
	this.generateView = generateView;
	
	this.init = init;
	this.calibrate = calibrate;
	this.hasEvents = hasEvents;
	this.loadEvents = loadEvents;
	
	
	function init(dateObj, prefix, blockPopups) {
		if (blockPopups)
			this.blockPopups = true;
			
		this.prefix = prefix;
		var tempArray = new Array();
		
		if (prefix == 'small') {
			tempArray = word_month;
		} else {
			tempArray = fullword_month;
		}
		this.calMenu = new Array('<a class="'+this.prefix+'dropmenuItem" href="Javascript: monthJumpRedirect(\''+this.calId+'\', 0)">'+tempArray[0]+'</a>',
												'<a class="'+this.prefix+'dropmenuItem" href="Javascript: monthJumpRedirect(\''+this.calId+'\', 1)">'+tempArray[1]+'</a>',
												'<a class="'+this.prefix+'dropmenuItem" href="Javascript: monthJumpRedirect(\''+this.calId+'\', 2)">'+tempArray[2]+'</a>',
												'<a class="'+this.prefix+'dropmenuItem" href="Javascript: monthJumpRedirect(\''+this.calId+'\', 3)">'+tempArray[3]+'</a>',
												'<a class="'+this.prefix+'dropmenuItem" href="Javascript: monthJumpRedirect(\''+this.calId+'\', 4)">'+tempArray[4]+'</a>',
												'<a class="'+this.prefix+'dropmenuItem" href="Javascript: monthJumpRedirect(\''+this.calId+'\', 5)">'+tempArray[5]+'</a>',
												'<a class="'+this.prefix+'dropmenuItem" href="Javascript: monthJumpRedirect(\''+this.calId+'\', 6)">'+tempArray[6]+'</a>',
												'<a class="'+this.prefix+'dropmenuItem" href="Javascript: monthJumpRedirect(\''+this.calId+'\', 7)">'+tempArray[7]+'</a>',
												'<a class="'+this.prefix+'dropmenuItem" href="Javascript: monthJumpRedirect(\''+this.calId+'\', 8)">'+tempArray[8]+'</a>',
												'<a class="'+this.prefix+'dropmenuItem" href="Javascript: monthJumpRedirect(\''+this.calId+'\', 9)">'+tempArray[9]+'</a>',
												'<a class="'+this.prefix+'dropmenuItem" href="Javascript: monthJumpRedirect(\''+this.calId+'\', 10)">'+tempArray[10]+'</a>',
										'<a class="'+this.prefix+'dropmenuItem" href="Javascript: monthJumpRedirect(\''+this.calId+'\', 11)">'+tempArray[11]+'</a>');
		this.monthJump(dateObj.getUTCMonth(),dateObj.getUTCFullYear());
		this.curDay = dateObj.getUTCDate();
		this.generateView();
	}
	
	function goNextMonth() {
		 this.prevYear =  this.viewYear;
		 this.prevMonth =  this.viewMonth;

		 this.viewYear =  this.nextYear;
		 this.viewMonth =  this.nextMonth;

		 this.nextMonth++;
		 var temp = calibrate( this.nextYear, this.nextMonth);
		 this.nextYear = temp[0];
		 this.nextMonth = temp[1];
		

		this.generateView();
	}
	
	function goPrevMonth() {
		this.nextYear = this.viewYear;
		this.nextMonth = this.viewMonth;

		this.viewYear = this.prevYear;
		this.viewMonth = this.prevMonth;

		this.prevMonth--;
		var temp = calibrate(this.prevYear,this.prevMonth);

		this.prevYear = temp[0];
		this.prevMonth = temp[1];
		this.generateView();
	
	}
	function monthJump(targetMonth, targetYear) {
		this.viewYear = targetYear;
		this.viewMonth = targetMonth;
		
		var temp = this.calibrate(targetYear,targetMonth+1);
		this.nextYear = temp[0];
		this.nextMonth = temp[1];
		
		temp = this.calibrate(targetYear,targetMonth-1);
		this.prevYear = temp[0];
		this.prevMonth = temp[1];
		this.generateView();

	
	}
	
	function yearJump(targetDir) {
		if(targetDir == "up") {
			this.viewYear++;
			this.prevYear++;
			this.nextYear++;
		} else if (targetDir == "down") {
			this.viewYear--;
			this.prevYear--;
			this.nextYear--;
		}
		this.generateView();
	}
	
	function setFullDate(targetYear, targetMonth, targetDay) {
		this.viewYear = targetYear;
		this.viewMonth = targetMonth;
		this.curDate.setFullYear(targetYear,targetMonth,targetDay);

		var temp = this.calibrate(targetYear,targetMonth+1);
		this.nextYear = temp[0];
		this.nextMonth = temp[1];

		temp = this.calibrate(targetYear,targetMonth-1);
		this.prevYear = temp[0];
		this.prevMonth = temp[1];

		this.generateView();
	}

	function getDays(y,m) {
		month_days[1]=y%4==0&&y%100!=0||y%400==0?29:28;
		return month_days[m];
	}
	
	function generateView() {
		if (this.prefix == 'small')
			document.getElementById(this.calId+'_curMonthLink').innerHTML = word_month[this.viewMonth];
		else
			document.getElementById(this.calId+'_curMonthLink').innerHTML = fullword_month[this.viewMonth];
		if (document.getElementById(this.calId+'_curYearLink').childNodes.length <= 0) {
			document.getElementById(this.calId+'_curYearLink').appendChild(document.createTextNode(''));
		}
		document.getElementById(this.calId+'_curYearLink').childNodes[0].nodeValue = this.viewYear;
		
		var startDay = new Date();
		startDay.setFullYear(this.viewYear,this.viewMonth,1);
		var s = startDay.getDay(); //1 = monday
		var c;
		var r;
		for (x = 1; x <= 42; x++) {
			c = (x-1) % 7;
			r = Math.ceil((x-1) / 7);
			if ((x-s) > 0 && (x-s) <= this.getDays(this.viewYear,this.viewMonth) ) {
				
				document.getElementById(this.calId+'_calMonthly_cell'+x).innerHTML = ''+(x-s)+'';
				var comment = this.loadEvents(this.viewYear,this.viewMonth, x-s);
				if (comment != '') { //display events
					document.getElementById(this.calId+'_calMonthly_cell'+x).className = this.prefix+'calMonthly_busy';
					//alert(this.viewMonth+'\n'+this.viewYear+'\n'+x+'\n'+comment);
					document.getElementById(this.calId+'_calMonthly_cell'+x).setAttribute('tip',comment);
				} else {
					if (c == 0 || c == 6) {//determine if weekend or weekday
						document.getElementById(this.calId+'_calMonthly_cell'+x).className = this.prefix+'calMonthly_wkend';
						document.getElementById(this.calId+'_calMonthly_cell'+x).removeAttribute('tip',null);
					} else {
						document.getElementById(this.calId+'_calMonthly_cell'+x).className = this.prefix+'calMonthly_wkday';
						document.getElementById(this.calId+'_calMonthly_cell'+x).removeAttribute('tip',null);
					}//end else
				}//end else
			} else {
				document.getElementById(this.calId+'_calMonthly_cell'+x).innerHTML = '&nbsp;';
				document.getElementById(this.calId+'_calMonthly_cell'+x).className = this.prefix+'calMonthly_blank';
				document.getElementById(this.calId+'_calMonthly_cell'+x).removeAttribute('tip',null);
			}//end else
				
		}
		enableTooltips();
	}
	
	function hasEvents(y,m,d) {
		var sD = new Date();
		sD.setFullYear(y,m,1);
		var sStart = (sD.getUTCDay()) % 7;
		sD.setFullYear(y,m,d);
		var s = (sD.getUTCDay()) % 7;

		var dayTemp = ''+(d);
		if (d < 10) { dayTemp = '0'+dayTemp;} //formatting
		var datetemp = 'a'+y;
		var datetemp1 = 'a';
		var datetemp2 = 'a';
		var specialDate = 'a';
		var specialDate1 = specialDate;
		var specialDate2 = specialDate;
		if ((m+1) < 10) { 
			datetemp += '0';
			datetemp1 += '0';
			specialDate += '0';
			specialDate1 += '0';
			specialDate2 += '0';
		}
		specialDate += (m+1)+'_'+ Math.floor((d + sStart + 1) / 7)+word_day[s]+'_';
		specialDate1 += (m+1)+'_x'+word_day[s]+'_';
		specialDate2 += (m+1)+'_y'+word_day[s]+'_';
		if (d+9 <= month_days[m])
			specialDate1 = specialDate;
		if(!(d+15 > month_days[m] && d+8 <= month_days[m]))
			specialDate2 = specialDate;

		datetemp += (m+1)+dayTemp+'_';
		datetemp1 += (m+1)+dayTemp+'_';
		datetemp2 += dayTemp+'_';
		
		if (d==3 && m==8)
			alert ('ceil: '+(sStart)+'\nceilCal: '+Math.floor((d + sStart + 1) / 7)+'\nd: '+d + '\ndatetemp: '+datetemp+'\ndatetemp1: '+datetemp1+'\ndatetemp2: '+datetemp2+'\nspecialDate: '+specialDate+'\nspecialDate1: '+specialDate1+'\nspecialDate2: '+specialDate2);
		if (!this.blockPopups) {
			if (singleList[datetemp+'1'] != undefined || monthlyList[datetemp2+'1'] != undefined || 
					yearlyList[datetemp1+'1'] != undefined || specialYearly[specialDate+'1'] != undefined || 
					specialYearly[specialDate1+'1'] != undefined || specialYearly[specialDate2+'1'] != undefined)
				return true;
		}
		return false;
	}
	function loadEvents(y,m,d) {
		var output = '';
		var sD = new Date();
		sD.setFullYear(y,m,1);
		var sStart = (sD.getUTCDay()) % 7;
		sD.setFullYear(y,m,d);
		var s = (sD.getUTCDay()) % 7;

		var dayTemp = ''+(d);
		if (d < 10) { dayTemp = '0'+dayTemp;} //formatting
		var datetemp = 'a'+y;
		var datetemp1 = 'a';
		var datetemp2 = 'a';
		var specialDate = 'a';
		var specialDate1 = specialDate;
		var specialDate2 = specialDate;
		if ((m+1) < 10) { 
			datetemp += '0';
			datetemp1 += '0';
			specialDate += '0';
			specialDate1 += '0';
			specialDate2 += '0';
		}
		specialDate += (m+1)+'_'+ (Math.floor((d) / 7)+1)+word_day[s]+'_';
		specialDate1 += (m+1)+'_x'+word_day[s]+'_';
		specialDate2 += (m+1)+'_y'+word_day[s]+'_';
		if (d+9 <= month_days[m])
			specialDate1 = specialDate;
		if(!(d+15 > month_days[m] && d+8 <= month_days[m]))
			specialDate2 = specialDate;

		datetemp += (m+1)+dayTemp+'_';
		datetemp1 += (m+1)+dayTemp+'_';
		datetemp2 += dayTemp+'_';

		cnt = 1;
		while (singleList[datetemp+cnt]) {
			if (output != '') { output += "\n";}
			output += '» '+singleList[datetemp+cnt];
			cnt++;
		}
		cnt = 1;
		while (monthlyList[datetemp2+cnt]) {
			if (output != '') { output += "\n";}
			output += '» '+monthlyList[datetemp2+cnt];
			cnt++;
		}
		cnt = 1;
		while (yearlyList[datetemp1+cnt]) {
			if (output != '') { output += "\n";}
			output += '» '+yearlyList[datetemp1+cnt];
			cnt++;
		}
		cnt = 1;
		while (specialYearly[specialDate+cnt]) {
			if (output != '') { output += "\n";}
			output += '» '+specialYearly[specialDate+cnt];
			cnt++;
		}
		cnt = 1;
		if (d+9 > month_days[m]) {
			while (specialYearly[specialDate1+cnt]) {
				if (output != '') { output += "\n";}
				output += '» '+specialYearly[specialDate1+cnt];
				cnt++;
			}
		}
		cnt = 1;
		if (d+15 > month_days[m] && d+8 <= month_days[m]) {
			while (specialYearly[specialDate2+cnt]) {
				if (output != '') { output += "\n";}
				output += '» '+specialYearly[specialDate2+cnt];
				cnt++;
			}
		}
		return output;
	}
	function getDays(y,m) {
			month_days[1]=y%4==0&&y%100!=0||y%400==0?29:28;
			return month_days[m];
		}
	
	function calibrate(y,m) {
			if (m<0) { y--; m+=12; }
			else if (m>11) { y++; m-=12; }
			return [y,m];
		}

}


/** ********************************************************************************************************************* **/

function DateList() {
	this.importXML = importXML;
	this.loadDates = loadDates;
	
	function importXML()
	{
		var catString = '';
		var ajaxCat = new sack();
		ajaxCat.requestFile = agendaPath;
		ajaxCat.method = 'GET';
		ajaxCat.onLoading = function () {};
		ajaxCat.onLoaded = function () {};
		ajaxCat.onInteractive = function () {};
		ajaxCat.onCompletion = this.loadDates;
		ajaxCat.runAJAX(catString);
	}

	function loadDates(xmlDoc) {
		var list = xmlDoc.getElementsByTagName('event');
		for (x = 0; x<list.length;x++){
			var node = list[x].childNodes.item(0);
			if (node == null) {
				node = {};
				node.data = '-';
			}
			var id = '';
			var cnt = 1;
			var day = list[x].getAttribute('day');
			var month = list[x].getAttribute('month');
			var year = list[x].getAttribute('year');
			switch(list[x].getAttribute('type')) {
				case 'once':
					id = 'a'+year+month+day;
					while (singleList[id+'_'+cnt] != undefined || singleList[id+'_'+cnt] != null){ cnt++;}
					singleList[id+'_'+cnt] = node.data;
					break;
				case 'yearly':
					if (day.indexOf('first') != -1) {
						day = day.replace(/first/,'');
						day = day.substring(0,3);
						id = 'a'+month+'_1'+day;
						while (specialYearly[id+'_'+cnt] != undefined || specialYearly[id+'_'+cnt] != null){ cnt++;}
						specialYearly[id+'_'+cnt] = node.data;
					} else if (day.indexOf('second') != -1) {
						day = day.replace(/second/,'');
						day = day.substring(0,3);
						id = 'a'+month+'_2'+day;
						while (specialYearly[id+'_'+cnt] != undefined || specialYearly[id+'_'+cnt] != null){ cnt++;}
						specialYearly[id+'_'+cnt] = node.data;
					} else if (day.indexOf('third') != -1) {
						day = day.replace(/third/,'');
						day = day.substring(0,3);
						id = 'a'+month+'_3'+day;
						while (specialYearly[id+'_'+cnt] != undefined || specialYearly[id+'_'+cnt] != null){ cnt++;}
						specialYearly[id+'_'+cnt] = node.data;
					} else if (day.indexOf('fourth') != -1) {
						day = day.replace(/fourth/,'');
						day = day.substring(0,3);
						id = 'a'+month+'_4'+day;
						while (specialYearly[id+'_'+cnt] != undefined || specialYearly[id+'_'+cnt] != null){ cnt++;}
						specialYearly[id+'_'+cnt] = node.data;				
					} else if (day.indexOf('nextLast') != -1) {
						day = day.replace(/nextLast/,'');
						day = day.substring(0,3);
						id = 'a'+month+'_y'+day;
						while (specialYearly[id+'_'+cnt] != undefined || specialYearly[id+'_'+cnt] != null){ cnt++;}
						specialYearly[id+'_'+cnt] = node.data;
					
					} else if (day.indexOf('last') != -1) {
						day = day.replace(/last/,'');
						day = day.substring(0,3);
						id = 'a'+month+'_x'+day;
						while (specialYearly[id+'_'+cnt] != undefined || specialYearly[id+'_'+cnt] != null){ cnt++;}
						specialYearly[id+'_'+cnt] = node.data;
					}else {
						id = 'a'+month+day;
						while (yearlyList[id+'_'+cnt] != undefined || yearlyList[id+'_'+cnt] != null){ cnt++;}
						yearlyList[id+'_'+cnt] = node.data;
					}
					break;
				case 'monthly':
					id = 'a'+day;
					while (monthlyList[id+'_'+cnt] != undefined || monthlyList[id+'_'+cnt] != null){ cnt++;}
					monthlyList[id+'_'+cnt] = node.data;
					break;
			}//switch
			
		}//for
		for (var x = 0; x < calObjsArray.length; x++) {
			calObjs[calObjsArray[x]].generateView();
		}
	}//function
}//class


/** ********************************************************************************************************************* **/

/*Javascript for Bubble Tooltips by Alessandro Fulciniti
http://pro.html.it - http://web-graphics.com */

function enableTooltips(id){
	var links,i,h;
	var temp = document.getElementById("btc");
	if (temp) {
		document.getElementsByTagName("body")[0].removeChild(temp);
	}
	if(!document.getElementById || !document.getElementsByTagName) return;

	h=document.createElement("span");
	h.id="btc";
	h.setAttribute("id","btc");
	h.style.position="absolute";
	document.getElementsByTagName("body")[0].appendChild(h);
	if(id==null) links=document.getElementsByTagName("td");
	else links=document.getElementById(id).getElementsByTagName("td");
	for(i=0;i<links.length;i++){
		Prepare(links[i]);
		}
	}

function Prepare(el){
	var tooltip,t,b,s,l;
	t=el.getAttribute("tip");
	if (el.tooltip) {
		detachEventListener(el,"mouseover", showTooltip, false);
		detachEventListener(el,"mouseout", hideTooltip, false);
		detachEventListener(el,"mousemove", Locate, false);
		detachEventListener(el, "click",showSignup,false);
	}
	if(t!=null && t.length>0) {
		el.removeAttribute("title");
		tooltip=CreateEl("span","tooltip");
		var t_array = t.split("\n");

		s=CreateEl("span","top");
		tooltip.appendChild(s);

		for (x = 0; x<t_array.length;x++) {
			s=CreateEl("span","value");
			s.appendChild(document.createTextNode(t_array[x]));
			tooltip.appendChild(s);
		}

		s=CreateEl("span","bottom");
		tooltip.appendChild(s);
		setOpacity(tooltip);
		el.tooltip=tooltip;
		attachEventListener(el, "mouseover", showTooltip, false);
		attachEventListener(el, "mouseout", hideTooltip, false);
		attachEventListener(el, "mousemove", Locate, false);
		attachEventListener(el, "click",showSignup,false);
	}
}

function showTooltip(e){
document.getElementById("btc").appendChild(this.tooltip);
Locate(e);
}

function hideTooltip(e){
	if (!e) e = window.event;
var d=document.getElementById("btc");
if(d.childNodes.length>0) d.removeChild(d.firstChild);
}

function setOpacity(el){
el.style.filter="alpha(opacity:95)";
el.style.KHTMLOpacity="0.95";
el.style.MozOpacity="0.95";
el.style.opacity="0.95";
}

function CreateEl(t,c){
var x=document.createElement(t);
x.className=c;
x.style.display="block";
return(x);
}

function Locate(e){
	if (!e) e = window.event;
var posx=0,posy=0;
if(e==null) e=window.event;
if(e.pageX || e.pageY){
    posx=e.pageX; posy=e.pageY;
    }
else if(e.clientX || e.clientY){
    if(document.documentElement.scrollTop){
        posx=e.clientX+document.documentElement.scrollLeft;
        posy=e.clientY+document.documentElement.scrollTop;
        }
    else{
        posx=e.clientX+document.body.scrollLeft;
        posy=e.clientY+document.body.scrollTop;
        }
    }
document.getElementById("btc").style.top=(posy)+"px";
document.getElementById("btc").style.left=(posx+20)+"px";
}


function attachEventListener(target, eventType, functionRef,
   capture)
{
 if (typeof target.addEventListener != "undefined")
 {
   target.addEventListener(eventType, functionRef, capture);
 }
 else if (typeof target.attachEvent != "undefined")
 {
   var functionString = eventType + functionRef;
   target["e" + functionString] = functionRef;

   target[functionString] = function(event)
   {
     if (typeof event == "undefined")
     {
       event = window.event;
     }
     target["e" + functionString](event);
   };

   target.attachEvent("on" + eventType, target[functionString]);
 }
 else
 {
   eventType = "on" + eventType;

   if (typeof target[eventType] == "function")
   {
     var oldListener = target[eventType];

     target[eventType] = function()
     {
       oldListener();

       return functionRef();
     }
   }
   else
   {
     target[eventType] = functionRef;
   }
 }
}

function detachEventListener(target, eventType, functionRef,
   capture)
{
 if (typeof target.removeEventListener != "undefined")
 {
   target.removeEventListener(eventType, functionRef, capture)
 }
 else if (typeof target.detachEvent != "undefined")
 {
   var functionString = eventType + functionRef;

   target.detachEvent("on" + eventType, target[functionString]);

   target["e" + functionString] = null;
   target[functionString] = null;
 }
 else
 {
   target["on" + eventType] = null;
 }
}

function showSignup() {
}


/** ******************* DROP DOWN MENUS *********************** **/
var menuwidth='165px' //default menu width
var disappeardelay=250  //menu disappear speed onMouseout (in miliseconds)
var hidemenu_onclick="yes" //hide menu when user clicks within menu?

/////No further editting needed

var ie4=document.all
var ns6=document.getElementById&&!document.all

if (ie4||ns6)
document.write('<div id="dropmenudiv" style=" visibility:hidden;width:'+menuwidth+';" onMouseover="clearhidemenu()" onMouseout="dynamichide(event)"></div>')

function getposOffset(what, offsettype){
var totaloffset=(offsettype=="left")? what.offsetLeft : what.offsetTop;
var parentEl=what.offsetParent;
while (parentEl!=null){
totaloffset=(offsettype=="left")? totaloffset+parentEl.offsetLeft : totaloffset+parentEl.offsetTop;
parentEl=parentEl.offsetParent;
}
return totaloffset;
}


function showhide(obj, e, visible, hidden, menuwidth){
if (ie4||ns6)
dropmenuobj.style.left=dropmenuobj.style.top="-500px"
if (menuwidth!=""){
dropmenuobj.widthobj=dropmenuobj.style
dropmenuobj.widthobj.width=menuwidth
}
if (e.type=="click" && obj.visibility==hidden || e.type=="mouseover") {
	obj.visibility=visible
}
else if (e.type=="click"){
	obj.visibility=hidden;
}
}

function iecompattest(){
return (document.compatMode && document.compatMode!="BackCompat")? document.documentElement : document.body
}

function clearbrowseredge(obj, whichedge){
var edgeoffset=0
if (whichedge=="rightedge"){
var windowedge=ie4 && !window.opera? iecompattest().scrollLeft+iecompattest().clientWidth-15 : window.pageXOffset+window.innerWidth-15
dropmenuobj.contentmeasure=dropmenuobj.offsetWidth
if (windowedge-dropmenuobj.x < dropmenuobj.contentmeasure)
edgeoffset=dropmenuobj.contentmeasure-obj.offsetWidth
}
else{
var topedge=ie4 && !window.opera? iecompattest().scrollTop : window.pageYOffset
var windowedge=ie4 && !window.opera? iecompattest().scrollTop+iecompattest().clientHeight-15 : window.pageYOffset+window.innerHeight-18
dropmenuobj.contentmeasure=dropmenuobj.offsetHeight
if (windowedge-dropmenuobj.y < dropmenuobj.contentmeasure){ //move up?
edgeoffset=dropmenuobj.contentmeasure+obj.offsetHeight
if ((dropmenuobj.y-topedge)<dropmenuobj.contentmeasure) //up no good either?
edgeoffset=dropmenuobj.y+obj.offsetHeight-topedge
}
}
return edgeoffset
}

function populatemenu(what){
if (ie4||ns6)
dropmenuobj.innerHTML=what.join("")
}


function dropdownmenu(obj, e, menucontents, menuwidth){
if (window.event) event.cancelBubble=true
else if (e.stopPropagation) e.stopPropagation()
clearhidemenu();
dropmenuobj=document.getElementById? document.getElementById("dropmenudiv") : dropmenudiv;
populatemenu(menucontents);

if (ie4||ns6){
showhide(dropmenuobj.style, e, "visible", "hidden", menuwidth);
dropmenuobj.x=getposOffset(obj, "left");
dropmenuobj.y=getposOffset(obj, "top");
dropmenuobj.style.left=dropmenuobj.x-clearbrowseredge(obj, "rightedge")+"px";
dropmenuobj.style.top=dropmenuobj.y-clearbrowseredge(obj, "bottomedge")+obj.offsetHeight+"px"
}

return clickreturnvalue()
}

function clickreturnvalue(){
if (ie4||ns6) return false
else return true
}

function contains_ns6(a, b) {
while (b.parentNode)
if ((b = b.parentNode) == a)
return true;
return false;
}

function dynamichide(e){
	if (!e) e = window.event;

if (ie4&&!dropmenuobj.contains(e.toElement))
delayhidemenu()
else if (ns6&&e.currentTarget!= e.relatedTarget&& !contains_ns6(e.currentTarget, e.relatedTarget))
delayhidemenu()

}

function hidemenu(e){
	if (!e) e = window.event;
	var et = e.target;
	
	if (!et)
		et = e.srcElement;
	
	var calDatePicker = document.getElementById('calDatePicker');
	
	if (typeof dropmenuobj!="undefined"){
		if (ie4||ns6)
			dropmenuobj.style.visibility="hidden";
		if (typeof (calDatePicker) != "undefined") {
			if (curDatePickerTarget)
				if (et.id != curDatePickerTarget.id && !contains(calDatePicker, et) && !contains(dropmenuobj,et) && !contains(curDatePickerTarget,dropmenuobj))
					hideDatePicker();
		}
	} else if (typeof (calDatePicker) != "undefined") {
		if (curDatePickerTarget)
			if (et.id != curDatePickerTarget.id && !contains(calDatePicker, et) )
				hideDatePicker();
	}
}

function delayhidemenu(){
//if (ie4||ns6)
//delayhide=setTimeout("hidemenu()",disappeardelay)
}

function clearhidemenu(){
if (typeof delayhide!="undefined")
clearTimeout(delayhide)
}

if (hidemenu_onclick=="yes")
document.onclick=hidemenu

function monthJumpRedirect(target, targetMonth) {
	calObjs[target].monthJump(targetMonth, calObjs[target].viewYear);
}

function yearJumpRedirect(e) {
	if (!e) e = window.event;
	var et = e.target;
	if (!et)
		et = e.srcElement;
	var totaloffset= et.offsetTop;
	var parentEl= et.offsetParent;
	var targetId = (et.id).replace(/\_(up|dwn)Btn/,'');
	var direct = (et.id).replace(/^.*\_(up|dwn)Btn$/,'$1');
	direct = direct.replace('dwn','down');
	calObjs[targetId].yearJump(direct);
}

function calDatePick(e) {
	if (!e) e = window.event;
	var et = e.target;
	if (!et)
		et = e.srcElement;
		
	if (et.innerHTML != '&nbsp;') {
		var targetId = (curDatePickerTarget.id).replace(/\_calDatePicker\_display/,'');
		calObjs[targetId].setFullDate(calObjs['calDatePickerTable'].viewYear,calObjs['calDatePickerTable'].viewMonth,et.innerHTML) ;
		curDatePickerTarget = null;
		hideDatePicker();
	}
}

var curDatePickerTarget = null;

function displayDatePicker(e) {
	if (!e) e = window.event;
	var et = e.target;
	if (!et)
		et = e.srcElement;

	var targetId = (et.id).replace(/\_calDatePicker\_display/,'');
	
	if (curDatePickerTarget && et == (curDatePickerTarget)) {
		hideDatePicker();
		curDatePickerTarget = null;
		return;
	} else if (curDatePickerTarget) {
		curDatePickerTarget = null;
		hideDatePicker();
		return;
	}
	
	var yOffset = et.offsetTop;
	var xOffset = et.offsetLeft;
	var parentEl= et.offsetParent;

	var newDate = calObjs[targetId].curDate;
	calObjs['calDatePickerTable'].setFullDate(newDate.getFullYear(), newDate.getMonth(), newDate.getUTCDate());

	while (parentEl!=null){
	 yOffset = yOffset+parentEl.offsetTop;
	 xOffset = xOffset+parentEl.offsetLeft;
	 parentEl=parentEl.offsetParent;
	}
	var datePicker = document.getElementById('calDatePicker');
	datePicker.style.visibility = 'visible';
	datePicker.style.left = xOffset+'px';
	datePicker.style.top = (yOffset+20)+'px';
	curDatePickerTarget = et;
}

function delayHideDatePicker(e) {
	if (!e) e = window.event;

}

function hideDatePicker() {
	var datePicker = document.getElementById('calDatePicker');
	datePicker.style.visibility = 'hidden';
	datePicker.style.left = '-500px';
	datePicker.style.top = '-500px';
	curDatePickerTarget = null;
}

var dateHoverCurClass = null;
function calDateHoverOn(e) {
	if (!e) e = window.event;
	var et = e.target;
	if (!et)
		et = e.srcElement;
		
	if (et.className != 'smallcalMonthly_busy' && et.innerHTML != '&nbsp;') {
		dateHoverCurClass = et.className;
		et.className = 'smallcall_dateHover';
	}
}


function calDateHoverOff(e) {
	var et = e.target;
	if (!et)
		et = e.srcElement;
	
	if (et.className != 'smallcalMonthly_busy' && et.innerHTML != '&nbsp;')
		et.className = dateHoverCurClass;
	dateHoverCurClass = null;
	

}


function contains(parentObj, childObj) {
	var parentTest = childObj;
	while (parentTest) {
		if (parentTest == parentObj)
			return true;
		else
			parentTest = parentTest.parentNode;
	}

	return false;
}


















/** ********************************************************************************************************** **/
var cal = new Calendar();
cal.init();