// global variables

        var oneDay = 1000 * 60 * 60 * 24;
        var calendarList = new Object();

// common methods

        function draw() {
                this.containerElement.appendChild(this.body);
        }

        function getDayAbbreviation(weekDay) {
                var str = '';
                switch (weekDay) {
                        case 0:
                                str = 'SUN';
                                break;
                        case 1:
                                str = 'MON';
                                break;
                        case 2:
                                str = 'TUE';
                                break;
                        case 3:
                                str = 'WED';
                                break;
                        case 4:
                                str = 'THU';
                                break;
                        case 5:
                                str = 'FRI';
                                break;
                        case 6:
                                str = 'SAT';
                                break;
                }
                return str;
        }


        function getMonthName(monthIndex) {
                var str = '';
                switch (monthIndex) {
                        case 0:
                                str = 'January';
                                break;
                        case 1:
                                str = 'February';
                                break;
                        case 2:
                                str = 'March';
                                break;
                        case 3:
                                str = 'April';
                                break;
                        case 4:
                                str = 'May';
                                break;
                        case 5:
                                str = 'June';
                                break;
                        case 6:
                                str = 'July';
                                break;
                        case 7:
                                str = 'August';
                                break;
                        case 8:
                                str = 'September';
                                break;
                        case 9:
                                str = 'October';
                                break;
                        case 10:
                                str = 'November';
                                break;
                        case 11:
                                str = 'December';
                                break;
                }
                return str;
        }

// object constructors

		function calendarDate(containerElement, newDate, calendarWeek) {
			this.events = new Array();
			this.containerElement = containerElement;
			this.calendarWeek = calendarWeek;
			this.calendar = this.calendarWeek.calendar;
			this.date = newDate;
			this.draw = draw;
			this.event = this.calendar.eventList.getEvent(this.date)
			this.hasEvent = hasEvent;
			var elmt = this.calendarWeek.body.insertCell(this.calendarWeek.body.cells.length);
			var txt;
			if (this.calendar.month == this.date.getMonth()) {
				if (this.hasEvent()) {
					elmt.className = "calendar_sm_on";
					elmt.id = "calendar_cell_on";
					try {
						elmt.style.setAttribute("cursor", "hand");
					}
					catch(e) {
						elmt.setAttribute("style", "cursor: hand; cursor: pointer;");
					}
					txt = document.createTextNode(this.date.getDate());
				}
				else {
					elmt.className = "calendar_sm";
					elmt.id = "calendar_cell";
					txt = document.createTextNode(this.date.getDate());
				}
				elmt.onclick = new Function("calendarList['" + this.calendar.id + "'].showEvent(new Date(" + this.date.getFullYear() + ", " + this.date.getMonth() + ", " + this.date.getDate() + "))");
			}
			else {
				elmt.className = "calendar_sm_off";
				elmt.id = "calendar_cell_off";
				txt = document.createTextNode(this.date.getDate());
			}
			this.body = elmt;
			this.body.appendChild(txt);
		}

// calendarDate methods

        function hasEvent() {
                return (this.event != void(0));
        }

// calendarWeek constructor

        function calendarWeek(containerElement, startDate, calendar) {

                this.containerElement = containerElement;
                this.calendar = calendar;
                this.draw = draw;
                var elmt = this.calendar.tbody.insertRow(this.calendar.tbody.rows.length);
                elmt.className = "calendar_md";
                elmt.id = "calendar_row";
                this.body = elmt;
                this.startDate = startDate;
                this.addDate = addDate;
                this.dates = new Array();
                for (i = 0; i < 7; i++) {
                        this.addDate(this.body, i);
//                        this.dates[i].draw();
                }
//				this.calendar.tbody.appendChild(this.body);
        }

// calendarWeek object methods

        function addDate(containerElement, dayNumber) {
                var startDate = new Date(this.startDate.getFullYear(), this.startDate.getMonth(), this.startDate.getDate() + dayNumber);
                this.dates[dayNumber] = new calendarDate(containerElement, startDate, this);
        }

// calendar object constructor

        function calendar(eventList, containerElement, eventContainerElement, startyear, startmonth) {

                this.id = containerElement.id;
                calendarList[this.id] = this;
                this.eventList = eventList;
                this.containerElement = containerElement;
                this.eventContainerElement = eventContainerElement;
                this.draw = draw;
                this.addWeek = addWeek;
                this.setMonth = setMonth;
                this.goNextMonth = goNextMonth;
                this.goPreviousMonth = goPreviousMonth;
                this.showEvent = showEvent;
                this.startyear = startyear;
                this.tofarpastloadmoredatayear = startyear - 2;
                this.tofarfutureloadmoredatayear = startyear + 2;

                this.setMonth(startyear, startmonth);
        }

// calendar object methods

        function showEvent(eventDate) {
				var strHTML = '<hr style="border:1px solid #dfaa8c"><span class="text_lg_bk">Events for ';
				strHTML += getMonthName(eventDate.getMonth()) + ' ' + eventDate.getDate() + ', ' + eventDate.getFullYear() + '</span>';
				strHTML += '<hr style="border:1px solid #dfaa8c">';
                var eventArray = this.eventList.getEvent(eventDate);
				if (eventArray == void(0)) {
					strHTML += 'There are no events scheduled on this date.';
				}
				else {
					strHTML += this.eventContainerElement.innerHTML = eventArray.join('<hr>');
				}
                this.eventContainerElement.innerHTML = strHTML;
        }

        function goNextMonth() {
                var dt = new Date(this.year, this.month, 1);
				while(dt.getMonth() == this.month) {
	                dt = new Date(dt - 1 + 1 + (oneDay * 7));
				}
                var newMonth = dt.getMonth();
                var newYear = dt.getFullYear();
                if (newYear >= this.tofarfutureloadmoredatayear) {
	                window.location="http://rochesterarea.org/cal/events.php?&date=" + this.tofarfutureloadmoredatayear + "-1-1";
                }
                this.setMonth(newYear, newMonth);
                this.draw();
        }

        function goPreviousMonth() {
                var dt = new Date(this.year, this.month, 1);
				while(dt.getMonth() == this.month) {
	                dt = new Date(dt - (oneDay * 7));
				}
                var newMonth = dt.getMonth();
                var newYear = dt.getFullYear();
                if (newYear <= this.tofarpastloadmoredatayear) {
	                window.location="http://rochesterarea.org/cal/events.php?&date=" + this.tofarpastloadmoredatayear + "-12-31";
                }
                this.setMonth(newYear, newMonth);
                this.draw();
        }

        function setMonth(year, month) {
                this.month = month;
                this.year = year;
                var dt = new Date(year, month, 1);
                dt = new Date(dt - dt.getDay() * oneDay)
                this.startDate = dt;
                try {
                        this.containerElement.removeChild(this.body);
                }
                catch(e) {
                }
                var elmt = document.createElement('TABLE')
                elmt.className = "calendar_lg";
                elmt.id = "calendar_table";
                this.body = elmt;

                elmt = document.createElement('TBODY');
                elmt.className = "calendar_lg";
                elmt.id = "calendar_tbody";
				this.tbody = elmt;

                elmt = this.body.createTHead();
                elmt.className = "calendar_lg";
                elmt.id = "calendar_thead";
				this.thead = elmt;
				this.body.appendChild(this.thead);

                // add a heading for the month names
//                elmt = document.createElement('TR');
                elmt = this.thead.insertRow(0);
                elmt.className = "calendar_md";
                elmt.id = "calendar_top_row";
                this.topRow = elmt;

                // add the "previous month" button to the top row
                elmt = document.createElement('TH');
                elmt.className = "calendar_sm";
                elmt.id = "calendar_previous_cell";
                var txt = document.createElement('A');
				txt.className = "text_md_bk"
                txt.href = "javaScript: calendarList['" + this.id + "'].goPreviousMonth();"
                txt.innerHTML = '&lt;&lt;';
                elmt.appendChild(txt);
                this.topRow.appendChild(elmt);

                // add the month heading to the top row
                elmt = document.createElement('TH');
                elmt.className = "calendar_sm";
                elmt.id = "calendar_monthname_cell";
                elmt.colSpan = "5";
                txt = document.createTextNode(getMonthName(month) + ', ' + year);
                elmt.appendChild(txt);
                this.topRow.appendChild(elmt);

                // add the "next month" button to the top row
                elmt = document.createElement('TH');
                elmt.className = "calendar_sm";
                elmt.id = "calendar_next_cell";
                var txt = document.createElement('A');
				txt.className = "text_md_bk"
                txt.href = "javaScript: calendarList['" + this.id + "'].goNextMonth();"
                txt.innerHTML = '&gt;&gt;';
                elmt.appendChild(txt);
                this.topRow.appendChild(elmt);

                // add a heading for the week names
                elmt = this.thead.insertRow(1);
                elmt.className = "calendar_md";
                elmt.id = "calendar_heading_row";
                this.headingRow = elmt;
				
				// insert calendar rows
				this.body.appendChild(this.tbody);
                for (i = 0; i < 7; i++) {
                        elmt = document.createElement('TH');
                        elmt.className = "calendar_sm";
                        elmt.id = "calendar_heading_cell";
                        var txt = document.createTextNode(getDayAbbreviation(i));
                        elmt.appendChild(txt);
                        this.headingRow.appendChild(elmt);
                }
//                this.body.appendChild(this.headingRow);

                // create an array of calendarWeek objects
                this.weeks = new Array();
//                for(var i = 0; i < 6; i++) {
//                        this.addWeek(this.body, month, year, i);
//                }
                for(var i = 0; i < 6; i++) {
                        this.addWeek(this.body, month, year, i);
						var dt = new Date(this.startDate - 1 + 1 + ((i + 1) * 7 * oneDay));
						if (dt.getMonth() != month) break;
                }


        }


        function addWeek(containerElement, month, year, weekNumber) {
                var startDate = new Date(this.startDate.getFullYear(), this.startDate.getMonth(), this.startDate.getDate() + (weekNumber * 7));
                this.weeks[weekNumber] = new calendarWeek(containerElement, startDate, this);
        }

// constructor for event-list object

        function eventList() {
                this.eventList = new Object();
                this.addEvent = addEvent;
                this.getEvent = getEvent;
        }

// event-list methods

        function addEvent(eventDate, eventDescription) {
                var dt = new Date(eventDate.getFullYear(), eventDate.getMonth(), eventDate.getDate());
                var evnt = this.eventList[dt];
                if(evnt == void(0)) {
                        evnt = new Array(eventDescription);
                        this.eventList[dt] = evnt;
                }
                else {
                        evnt[evnt.length] = eventDescription;
                }
        }

        function getEvent(eventDate) {
                var dt = new Date(eventDate.getFullYear(), eventDate.getMonth(), eventDate.getDate());
                var evnt = this.eventList[dt];
                if (evnt == void(0)) {
                        return void(0);
                }
                else {
                        return evnt;
                }
        }

