/*

UMC Events Calendar - Source code
Version: Version 2.0 Release Candidate 1

This contains the source code for the UMC Events Calendar. Calendar can go
within any site. Pulling from Kintera Sphere RSS feeds

Requires:
	Google AJAX Feed API
	http://code.google.com/apis/ajaxfeeds/

*/


/*
 *	Object that gets feed and creates UMCEventsCalendarObject
 */
function UMCEventsCalendar (params) {

	/*
	 *	inititializing Rss Url
	 */
	/*
	 *	get current stories
	 */
	/*
	 *	Initializing parameters
	 */
	this.createParams = function (params) {
				this.params = new Array();
				if($(params.eventsAreaId)) {
					this.params.eventsAreaId = params.eventsAreaId;
				} else {
					alert('Error: Events Area not found\nLooking for object with id \''+params.eventsAreaId+'\'');
				}
				if($(params.contentAreaId)) {
					this.params.contentAreaId = params.contentAreaId;
				} else {
					alert('Error: Content Area not found\nLooking for object with id \''+params.contentAreaId+'\'');
				}
				if($(params.eventsNavAreaId)) {
					this.params.eventsNavAreaId = params.eventsNavAreaId;
				} else {
					alert('Error: Events Navigation Area not found\nLooking for object with id \''+params.eventsNavAreaId+'\'');
				}
				if(params.loadingImage) {
					this.params.loadingImage = params.loadingImage;
				}
				this.params.recentDaysBefore = (params.recentDaysBefore) ? params.recentDaysBefore : 3;
				this.params.recentDaysAfter = (params.recentDaysAfter) ? params.recentDaysAfter : 60;
				if(params.feeds) {
					var feedlist = new Object(params.feeds);
					this.params.feeds = [];
					for (var key in feedlist) {
						this.params.feeds.push(feedlist[key]);
					}
					this.params.eventsNavAreaId = params.eventsNavAreaId;
				} else {
					alert('Error: Feed not found in initilization\nInclude feeds in initilization function');
				}
				this.params.totalEventsPerPage = (params.totalEventsPerPage) ? params.totalEventsPerPage : 20;
				this.sitepath = params.sitepath;
			}

	this.createLoading = function() {
				var loadingId = this.params.eventsAreaId;
				var loadingNode = $(loadingId);
				var loadingImage = this.params.loadingImage;
				var html = '';

				if(loadingImage) {
					html = '<div class="umc-events-calendar-loading">'+
							'<img src="'+loadingImage+'" /><br />'+
							'Loading...'+
							'</div>';
				} else {
					html = 'Loading...';
				}

				loadingNode.innerHTML = html;
			}
	this.loadFeedData = function() {
			for (divcnt=0;divcnt<this.params.feeds.length;divcnt++) {
				if (this.params.google)
					var obj = new AjaxRequestGoogle();
				else
					var obj = new AjaxRequest();
				statusobj[divcnt] = "running";
				this.dataonly = false;
				obj.rss = this.params.feeds[divcnt];
				obj.count = divcnt;
				obj.init();
			}
			this.checkStatus();
		}
		
	this.checkStatus = function() {
			var self = this;
			var statusComplete = true;
			for (divcnt=0;divcnt<this.params.feeds.length;divcnt++) {
				if (statusobj[divcnt] == "running") {
					setTimeout(function() {self.checkStatus()}, 200); /* check status every 2 seconds */
					statusComplete = false;
					break;
				}
			}
			if (statusComplete) {
				var items = [];
				/* if called from quick search setup default vars */
				for (x=0;x<this.params.feeds.length;x++) {
					items = items.concat(xhrs[x]);
				}
				var eventsData = UMCEventsParser(items);	
				eventsData.params = this.params;
				navCalendar = new UMCCalendar(); /* calendar display */
				UMCEventsDisplayController = new UMCEventsCalendarController(eventsData);
				UMCEventsDisplayController.sitepath = this.sitepath;
			}
		}
	
	/*
	 *	Initialization function
	 */
	this.init = function (params) {
				/* initializing params  */
				this.createParams(params);
				/* create loading image */
				this.createLoading();
				this.events = this.loadFeedData();
			}
	
	/* Run initialization function */
	this.init(params);

}

/*
 *	Parses and returns items from events RSS
 */
function UMCEventsParser(items) {

	/*
	 *	Initilizes and creates items to send back
	 */
	this.parseItems = function(items) {
				/* sort descending - put all data in date order */
				items.sort(function (a, b){
							a = a['date'];
							b = b['date'];
							if (a>b) return 1;
							if (a <b) return -1;
							return 0; } );
				
				eventItems = new Array;
				eventsLoaded = new Array;
				var categories = new Object();
				var years = new Array;
				for (var i = 0; i < items.length; i++) {
					//var item = items[i];
					eventItems[i] = new Array();
					eventItems[i].dates= new Array();

					eventItems[i].title = items[i].title;
					eventItems[i].description = items[i].description;
					eventItems[i].read_more_url = items[i].read_more_url;
					eventItems[i].read_more_label = items[i].read_more_label;
					eventItems[i].subtitle = items[i].subtitle;
					eventItems[i].byline = items[i].byline;
					eventItems[i].thumbnail = items[i].thumbnail;

					/* Getting standar information */
					eventItems[i].external = items[i].read_more_url;
					eventItems[i].linkurl = items[i].linkurl;
					eventItems[i].itemlink = ( items[i].read_more_url ) ? items[i].read_more_url : items[i].linkurl;
					eventItems[i].target = ( items[i].read_more_internal ) ? items[i].read_more_internal : "target=_blank";										
					eventItems[i].date = items[i].date;
					var days = items[i].days;
					days = (days) ? days : 1;
					eventItems[i].days = days;
					eventItems[i].keywords = items[i].keywords;

					eventItems[i].dates.push(items[i].date);
					if(days>1) {
						for(var j=0; j<(days-1); j++) {
							var nextDay = new Date();
							nextDay.setFullYear(items[i].date.getFullYear(),items[i].date.getMonth(),items[i].date.getDate());
							var dateOffset = j+1;
							nextDay.setDate(nextDay.getDate()+dateOffset);
							eventItems[i].dates.push(nextDay);
						}
					}
					
					/* Getting categories and parsing them */
					eventItems[i].categories = (items[i].labels != undefined) ? items[i].labels : 'n/a';
					eventItems[i].categories = eventItems[i].categories.split(', ');
					for (var j = 0; j < eventItems[i].categories.length; j++) {
						//keeps count of each category 
						categories[eventItems[i].categories[j]] = ( categories[eventItems[i].categories[j]] ) ?  (categories[eventItems[i].categories[j]]+1): 1;
					}
					years[eventItems[i].date.getFullYear()] = (years[eventItems[i].date.getFullYear()]) ? (years[eventItems[i].date.getFullYear()]+1) : 1;
				}
				eventsData = new Array;
				eventsData.events = eventItems;
				eventsData.years = years;
				eventsData.categories = categories;
				
				return eventsData;
			}
			

	/* Return items */
	return this.parseItems(items);
}

function UMCEventsCalendarController( eventsData ) {
	this.sitepath = '';
	
	/*
	 *	Creates initial HTML Area for navigation
	 */
	this.createInitialNavArea = function() {
			var self = this;
	 		var pageNavNode = $(eventcal.params.eventsNavAreaId);	
			var categoryTagName = "umc-events-nav-category";
			var categoryTagNameUnchecked = "umc-events-nav-category-unchecked";
	 		var navNode = document.createElement('div');
			//navNode.id = "umc-events-nav-area";

			var categoriesNode = document.createElement('div');
			categoriesNode.id = "umc-events-nav-categories";
			categoriesNode.innerHTML = '<div id="umc-events-nav-categories-heading"><div class="umc-event-nav-heading">View events by subject area</div></div>';



/*
* Added by Downey
*/
			
			var catChkAll = document.createElement("div");
			catChkAll.className="umc-category-check-all";
			var catChkStatus = catChkAll.onclick = function () { 
					var checkStatus = self.checkNavAllCategories();
					return checkStatus;
				}
			if (catChkStatus = 1) {
			catChkAll.innerHTML="Unselect All";
			}
			else {
			catChkAll.innerHTML="Select All";
			}
			categoriesNode.appendChild(catChkAll, categoriesNode.firstChild);/* write all subcats into hidden div */
			
/* 
* End add by Downey
*/
			







			var catAllDiv = document.createElement('div');
			catAllDiv.style.display = "none"; //hide for now but keep around
			if(this.categoriesLoadedInitial[0] != '') {
				catAllDiv.className = categoryTagName + ' ' + categoryTagNameUnchecked;
				catAllDiv.checked = 0;
			} else {
				catAllDiv.className = categoryTagName;
				catAllDiv.checked = 1;
			}
			catAllDiv.innerHTML = 'All (<span>'+this.eventsDisplayed.length+'</span>)';
			catAllDiv.onclick = function () { 
					self.checkNavAllCategories();
				}
			categoriesNode.appendChild(catAllDiv);

			/*
			 *	Setting categories nodes
			 */
			var cat = '';
			var navCategoriesNodes = new Array;
			var currCategories = new Array();
			var i = 0;
			for (var key in this.categories) {
				currCategories[i] = new Array();
				currCategories[i].key = key;
				currCategories[i].cat = this.categories[key];
				i++;
			}
			//sort nodes before display
			currCategories.sort(function (a, b){
						a = a['key'];
						b = b['key'];
						if (a>b) return 1;
						if (a <b) return -1;
						return 0; } );



			
			
			
			
			var catNodes = [];
			var i = 0;
			for (k=0;k<currCategories.length;k++){
				var catDiv = document.createElement('div');
				var displayedDiv = 1;
				cat = currCategories[k]['cat'];
				catDiv.innerHTML = currCategories[k]['key']+' (<span class="umc-events-nav-category-total">'+cat+'</span>)';
				catDiv.key = currCategories[k]['key'];
				if(cat == 0) catDiv.className = categoryTagName+' umc-unsellected';
				catDiv.onclick = function () { 
						UMCEventsDisplayController.checkNavCategory(this.key);
					}
				if(this.checkNavCategoryStringLoaded(key)) {
					displayedDiv = 1;
				} else {
					displayedDiv = 0;
				}
				if(displayedDiv) {
					catDiv.checked = 1;
					catDiv.className = categoryTagName;
				} else {
					catDiv.checked = 0;
					catDiv.className = categoryTagName+' '+categoryTagNameUnchecked;
				}
				categoriesNode.appendChild(catDiv);
				navCategoriesNodes[currCategories[k]['key']] = catDiv;	
				catNodes.push(catDiv);
				i++;
			}
			
			var catChkAll = document.createElement("div");
			catChkAll.className="umc-category-check-all";
			var catChkStatus = catChkAll.onclick = function () { 
					var checkStatus = self.checkNavAllCategories();
					return checkStatus;
				}
			if (catChkStatus = 1) {
			catChkAll.innerHTML="Unselect All";
			}
			else {
			catChkAll.innerHTML="Select All";
			}
			categoriesNode.appendChild(catChkAll, categoriesNode.firstChild);/* write all subcats into hidden div */
			
			navNode.appendChild(categoriesNode);
			pageNavNode.appendChild(navNode);
			
			/*
			 *	Setting object variables
			 */
			/* Navigation node */
			this.navNode = navNode;
			this.catNodes = catNodes;
			/* Navigation category Nodes */
			this.navCategoriesNodes = navCategoriesNodes;
			/* Navigation All category Node */
			this.navCategoryAll = catAllDiv;

		}
	
	this.createInitialEventsArea = function() {
	 		var pageEventsNode = $(this.params.eventsAreaId);	
			pageEventsNode.innerHTML = '';

	 		var eventsNode = document.createElement('div');
			eventsNode.id = "umc-events-area";
			
			var eventsHeading = document.createElement('div');
			eventsHeading.id = "umc-events-heading";
			
			var statusNode = document.createElement('div');
			statusNode.id = "umc-status-area";

			var eventsSort = document.createElement('div');
			eventsSort.id = "umc-events-sort";
			
			var eventsList = document.createElement('div');
			eventsList.id = "umc-events-list";
			
			var dateSearch = document.createElement('div');
			dateSearch.id = "umc-events-date-search";
			
			eventsNode.appendChild(eventsHeading); 
			eventsNode.appendChild(statusNode);
			eventsNode.appendChild(eventsSort); 
			eventsNode.appendChild(eventsList); 
			
			pageEventsNode.appendChild(eventsNode);
			pageEventsNode.appendChild(dateSearch);
			
			var loadingNode = document.createElement('div');
			loadingNode.id = "umc-events-loading";
			loadingNode.innerHTML = "Loading...";
			var contentParentNode = this.contentAreaNode.parentNode;
			var contentFirstChild = this.contentAreaNode.firstChild;
			if(document.all) {
				this.contentAreaNode.insertBefore(loadingNode, contentFirstChild);
			} else {
				contentParentNode.insertBefore(loadingNode, this.contentAreaNode);
			}
			
			this.eventsHeadingNode = eventsHeading;
			this.statusNode = statusNode;
			this.eventsSortNode = eventsSort;
			this.eventsListNode = eventsList;
			this.loadingNode = loadingNode;
			this.eventsNode = eventsNode;
			this.eventsDatesSearch = dateSearch;
			this.eventsStart = 0;
			this.eventsLimit = this.params.totalEventsPerPage;
			//this.populateEvents();
		}

	this.checkNavCategoryStringLoaded = function (cat) {
			if(this.categoriesLoadedInitial[0] == '') return true;
			for(var i=0; i<this.categoriesLoadedInitial.length; i++) {
				var thisCat = this.categoriesLoadedInitial[i].split('%20').join(' ');
				if(thisCat.toLowerCase() == cat.toLowerCase()) {
					return true;
				}
			}
			return false;
		}

	/* loop through each day of cal - if an event is found for that day then add hyperlink */
	this.getDates = function() {
			var datenodes = new Array();
			for(var i=0; i<this.events.length; i++ ) {
				datenodes.push(this.formatNodeDate(this.events[i].date));
				var daycount = (this.events[i].days != undefined) ? (this.events[i].days) : 0;
				for (d=0;d<daycount;d++) {
					var newdate = new Date( this.events[i].date);
					newdate.setDate(this.events[i].date.getDate()+d); // add each addtional day to array
					datenodes.push(this.formatNodeDate(newdate));
				}
			}
			this.datenodes = datenodes;
		}
		
	this.displayEvents = function() {
		    var datestring = this.datenodes.join();
			for(var i=0;i<6;i++) {
				for(var j=0; j<7; j++) {
					var day = navCalendar.dateNodes[i][j];
					if (day.innerHTML != '') {
						if(datestring.indexOf(this.formatNodeDate(day.date)) > -1) {
							day.className = "umc-calendar-day umc-calendar-day-selected";
							day.onclick = function () {
									UMCEventsDisplayController.displayDates(this.date, this.date);
								}
						} else {
							day.className = "umc-calendar-day";
						}
					}
				}
			}
		}
	
	this.formatNodeDate = function(date) {
		var dd = (date.getDate() <= 9) ? '0' + date.getDate() : date.getDate();
		var mm = (date.getMonth() < 9) ? '0' + (date.getMonth()+1) : (date.getMonth()+1);
		var key = date.getFullYear() + '' + mm + '' + dd; 
		return key;
	}
	
	this.setFocus = function(o) {
			this.dateSearchFocus.className = '';
			o.className = 'umc-selected';
			o.focus();
			this.dateSearchFocus = o;
		}
		
	this.showAll = function() {
			this.startDate = new Date('1/1/1970');
			this.endDate = new Date('1/1/2200');
			this.changedYears = 1;
			this.changedSelection();
			this.refreshEventsArea();
			this.backToEvents();
			this.refreshNavCategoriesTotals();
		}


	this.refreshNavCategoriesTotals = function(total) {
			var total = (total) ? total : this.totalEventsDisplayed;
			var catnodes = this.catNodes;
			for(x=0;x<catnodes.length;x++) {
				var key = catnodes[x].key;
				var totalNode = catnodes[x].getElementsByTagName('span')[0];
				totalNode.innerHTML = this.categories[key];	
				if(this.categories[x] == 0) {
					if(catnodes[x].checked) {
						catnodes[x].className = 'umc-events-nav-category umc-unsellected';	
					} else {
						catnodes[x].className = 'umc-events-nav-category umc-events-nav-category-unchecked umc-unsellected';	
					}
				} else {
					if(catnodes[x].checked) {
						catnodes[x].className = 'umc-events-nav-category';	
					} else {
						catnodes[x].className = 'umc-events-nav-category umc-events-nav-category-unchecked';	
					}
				}
			}
			/*	Displaying total all categories	*/
			this.navCategoryAll.getElementsByTagName('span')[0].innerHTML = total;
		}

	this.displayDates = function(startDate, endDate) {
			this.initialDisplay = false;
			startDate = (startDate != undefined) ? startDate : new Date();
			if (endDate == undefined) {
				this.initialDisplay = true;
				endDate = new Date();
				endDate.setDate((startDate.getDate() - startDate.getDay()) + 2000); //add 8 weeks to current date
			}
			this.changeDisplayedEventsByDates(startDate, endDate);
		}
	
	this.refreshEventsHeading = function() {
			this.statusNode.innerHTML = this.createEventsHeadingDates();
			if(this.eventsDisplayed.length) {
				//this.eventsHeadingNode.innerHTML = 'Viewing '+this.eventsDisplayed.length+' events in category: '+this.createEventsHeadingCategories();
			} else {
				//this.eventsListNode.innerHTML = 'There are no events found in your search criteria.';
			}
		}

	this.createEventsHeadingCategories = function() {
			var categories = new Array;
			for(key in this.navCategoriesNodes) {
				if(this.navCategoriesNodes[key].checked) categories.push(key);
			}
			var html = '';
			html = categories.join(', ');
			return html;
		}

	this.createEventsHeadingDates = function() {
			var html = '';
			this.startDate = ((this.startDate != undefined) && (this.startDate != '')) ? this.startDate : new Date('1/1/1970');
			this.endDate = ((this.endDate != undefined) && (this.endDate != '')) ? this.endDate : new Date('1/1/2200');
			if ((this.startDate.getFullYear() == 1970) && (this.endDate.getFullYear() == 2200)) {
				html += '<div class="umc-calendar-heading-dates">Viewing All events</div>';
			} else {
				if (parseInt(this.startDate.getFullYear()) > 2000) {
					if ((this.season != undefined) && (this.season != ''))
						html += '<div class="umc-calendar-heading-res">' + this.season + '</div>';
					if ((this.special != undefined) && (this.special != ''))
						html += '<div class="umc-calendar-heading-res">' + this.special + '</div>';
					if ((this.startDate != undefined) && (this.startDate != '')) {
						 html += '<div class="umc-calendar-heading-dates">';
						if (this.initialDisplay) {
							html += "Viewing All events from ";
						} else {
							html += "Viewing ";
						}
						html += this.formatHeadingDate(this.startDate);
						if (this.initialDisplay) {
							html += " forward";
						}
						if ((this.formatHeadingDate(this.startDate) != this.formatHeadingDate(this.endDate) ) && !this.initialDisplay)
							html += ' - ' + this.formatHeadingDate(this.endDate);
						html += '</div>';
					}
				}
			}

			return html;
		}

	this.formatHeadingDate = function(date, incday) {
			var months = {0:"January", 1:"February", 2:"March", 3:"April", 4:"May", 5:"June", 6:"July", 7:"August", 8:"September", 9:"October", 10:"November", 11:"December" }
			var days = {0:"Sunday", 1:"Monday", 2:"Tuesday", 3:"Wednesday", 4:"Thursday", 5:"Friday", 6:"Saturday" }
			if (incday == "yes") 
				var string = days[date.getDay()]+', '+months[date.getMonth()]+' '+date.getDate()+', '+date.getFullYear();
			else
				var string = months[date.getMonth()]+' '+date.getDate()+', '+date.getFullYear();
			return string;
			
		}
	
	this.sortDisplayedEvents = function() {
			var sort = this.sortBy;
			if(sort == 'date') {
				this.eventsDisplayed.sort(UMCEventsDateSort);			
			}else if(sort == 'title') {
				this.eventsDisplayed.sort(UMCEventsTitleSort);			
			}
		}

	this.changeSort = function(sort) {
			if(sort == 'date') {
				this.sortBy = 'date';
			}else if(sort == 'title') {
				this.sortBy = 'title';
			}
			this.sortDisplayedEvents();
			this.refreshEventsArea();
		}

	this.refreshEventsSort = function() {
			var html = '';
			var divider = ' | ';
			html = 'View by: ';
			html += '<span class="umc-events-sort-options">';
			if(this.sortBy == 'title') {
				html += '<span class="umc-events-sort-options-selected">Title</span>';
			} else {
				html += '<a onclick="UMCEventsDisplayController.changeSort(\'title\');" href="#">Title</a>';
			}
			html += '</span>';
			html += divider;
			html += '<span class="umc-events-sort-options">';
			if(this.sortBy == 'date') {
				html += '<span class="umc-events-sort-options-selected">Date</span>';
			} else {
				html += '<a onclick="UMCEventsDisplayController.changeSort(\'date\');" href="#">Date</a>';
			}
			html += '</span>';
			if (!this.initialDisplay) {
				html += '<span class="umc-reset-display">';
				html += '<a href="#" onClick="UMCEventsDisplayController.resetDisplay();">Return to viewing event from today forward</a>';
				html += '</span>';
			}
			this.eventsSortNode.innerHTML = html;
		}

	this.populateEvents = function() {
			/* Populating heading */
			this.refreshEventsHeading();

			/* Populating Sort Area */
			this.refreshEventsSort();
			
			/* total pages based on number of events to display */
			this.totalPages = Math.ceil( (this.eventsDisplayed.length+1) / this.params.totalEventsPerPage) ;

			/* Displaying events */
			this.eventsListNode.innerHTML = '';
			if(this.eventsDisplayed.length) {
				var start = this.eventsStart;
				var limit = this.params.totalEventsPerPage + start;
				if(this.eventsDisplayed.length > this.params.totalEventsPerPage) {
					this.eventsListNode.innerHTML += this.createPaginationHTML();
				}
				for(var i=start; i<limit; i++) {
					if(this.eventsDisplayed[i]) {	
						this.eventsListNode.innerHTML += this.createEventsListingHTML(this.eventsDisplayed[i]);
					}
				}
				if(this.eventsDisplayed.length > this.params.totalEventsPerPage) {
					this.eventsListNode.innerHTML += this.createPaginationHTML();
				}
			} else {
				this.eventsListNode.innerHTML = 'There are no events found in your search criteria.';
			}
		}

	this.createPaginationHTML = function() {
			/* Setting up start and limit */
			var start = this.eventsStart+1;
			var limit = this.params.totalEventsPerPage + start - 1;
			
			var firstbtn = "<img src='"+this.sitepath+"/arrow_gray_left.gif'><img src='"+this.sitepath+"/arrow_gray_left.gif'>&nbsp;first";
			var prevbtn = "<img src='"+this.sitepath+"/arrow_gray_left.gif'>&nbsp;prev";
			var nextbtn = "next&nbsp;<img src='"+this.sitepath+"/arrow_gray.gif'>";
			var lastbtn = "last&nbsp;<img src='"+this.sitepath+"/arrow_gray.gif'><img src='"+this.sitepath+"/arrow_gray.gif'>";

			/* Checking if pagination limit is larger then display total */
			limit = (limit > this.eventsDisplayed.length) ? this.eventsDisplayed.length : limit;

			/* Building HTML for pagination */
			var html = '<div class="umc-events-calendar-pagination">';
			html += '<div class="umc-events-calendar-pagination-nav">';
			if(this.page != 1) {
				html += '<a href="#" onclick="UMCEventsDisplayController.firstEvents();" class="umc-events-calendar-pagination-button">'+firstbtn+'</a>';
				html += '<a href="#" onclick="UMCEventsDisplayController.previousEvents();" class="umc-events-calendar-pagination-button">'+prevbtn+'</a>';
			} else {
				html += '<span class="umc-events-calendar-pagination-button">'+firstbtn+'</span>';
				html += '<span class="umc-events-calendar-pagination-button">'+prevbtn+'</span>';
			}
			if (this.totalPages!=this.page) {
				html += '<a href="#" onclick="UMCEventsDisplayController.nextEvents();" class="umc-events-calendar-pagination-button">'+nextbtn+'</a>';
				html += '<a href="#" onclick="UMCEventsDisplayController.lastEvents();" class="umc-events-calendar-pagination-button">'+lastbtn+'</a>';
			} else {
				html += '<span class="umc-events-calendar-pagination-button">'+nextbtn+'</span>';
				html += '<span class="umc-events-calendar-pagination-button">'+lastbtn+'</span>';
			}
			html += '</div>';
			html += '<div class="umc-events-calendar-pagination-info">';
			html += start+' to '+limit+' of '+this.eventsDisplayed.length;
			html += '</div>';
			html += '<div style="clear:both;"></div>';
			html += '</div>';
			return html;
		}

	this.nextEvents = function() {
			this.page++;
			this.eventsStart = this.eventsStart + this.params.totalEventsPerPage;
			this.refreshEventsArea();
		}
	this.lastEvents = function() {
			this.page = this.totalPages;
			this.eventsStart = (this.eventsDisplayed.length+1) - this.params.totalEventsPerPage;
			this.refreshEventsArea();
		}
	this.previousEvents = function() {
			this.page--;
			this.eventsStart = this.eventsStart - this.params.totalEventsPerPage;
			this.refreshEventsArea();
		}
	this.firstEvents = function() {
			this.changedSelection();
			this.refreshEventsArea();
		}


	this.createEventsListingHTML = function(event) {
			this.displayEventDates = function(event) {
						var dateObject = event.dates[0];
						var days = {0:"Sunday", 1:"Monday", 2:"Tuesday", 3:"Wednesday", 4:"Thursday", 5:"Friday", 6:"Saturday" };
						var months = {0:"January", 1:"February", 2:"March", 3:"April", 4:"May", 5:"June", 6:"July", 7:"August", 8:"September", 9:"October", 10:"November", 11:"December" }
						var startDay = days[dateObject.getDay()];
						var startMonth= months[dateObject.getMonth()];
						var startYear = dateObject.getFullYear();
						var startDate = dateObject.getDate();
						var dateString = startDay+', '+startMonth+' '+startDate+', '+startYear;
						if(event.days) {
							if (event.days > 1) {
								var dateEndObject = event.dates[event.dates.length-1];
								var endDay = days[dateEndObject.getDay()];
								var endMonth= months[dateEndObject.getMonth()];
								var endYear = dateEndObject.getFullYear();
								var endDate = dateEndObject.getDate();
								dateString += ' - '+endDay+', '+endMonth+' '+endDate+', '+endYear;
							}
						}
						return dateString;
					}
			var html = "";
			var imgHTML = (event.thumbnail) ? '<img src="'+event.thumbnail+'" />' : '';
			var imgArea = (event.thumbnail) ? '<div class="umc-events-calendar-event-left-area">'+imgHTML+'</div>' : '';
			var addedRightAreaClass = (event.thumbnail) ? '' : ' umc-events-calendar-event-right-area-noimage';
			var readMore = (event.read_more_label) ? event.read_more_label : 'Go to event Site';
			var itemlink = '';
					itemlink = ' onclick="UMCEventsDisplayController.displayEvent(\''+event.linkurl+'\'); return false;" href="#"';
			//var link = ' href="'+event.linkurl+'" ';
			var key = 'toJSON'; //not sure why this is here
			html = '<div class="umc-events-calendar-event" id="umc-event-'+key+'">'+
				imgArea+
				'<div class="umc-events-calendar-event-right-area'+addedRightAreaClass+'">';
			html +=	'<div class="umc-events-calendar-event-heading">';
			html += '<div class="umc-eventsbydate-resource">'+((event.subtitle!=undefined)?event.subtitle:'')+'</div>';
			if (event.read_more_url)
					itemlink = '<a class="umc-events-calendar-event-link" href="'+event.itemlink+'" '+event.target+'>'+event.title+'</a>';
			else
				if (event.read_more_label)
					itemlink = '<a class="umc-events-calendar-event-link" onclick="UMCEventsDisplayController.displayEvent(\''+event.linkurl+'\'); return false;" href="#">'+event.title+'</a>';
				else
					itemlink = event.title;
			html += itemlink;
			html +=	'</div>';
			html += '<div class="umc-events-calendar-event-dates">'+this.displayEventDates(event)+'</div>'+
				'<div class="umc-events-calendar-event-description">'+((event.description != undefined) ? event.description : '') +'</div>';
			html += '<div class="umc-events-calendar-event-site">';
			itemlink = '';
			if (event.read_more_url)
				itemlink = '<a class="umc-events-calendar-event-link" href="'+event.itemlink+'" '+event.target+'>'+readMore+'</a>';
			else
				if (event.read_more_label)
					itemlink = '<a class="umc-events-calendar-event-link" onclick="UMCEventsDisplayController.displayEvent(\''+event.linkurl+'\'); return false;" href="#">'+readMore+'</a>';
			html += itemlink;
			html += '</div>';
			html += '<div class="umc-events-calendar-event-categories"><strong>Categories: </strong>'+event.categories.join(', ')+'</div>'+
				'</div>'+
				'<div style="clear:both;"></div>'+
				'</div>';
			return html;
		}

	/*
	 *	Creates initial HTML Areas for calendar
	 */
	this.createInitialHTMLAreas = function() {
			this.createInitialNavArea();
			this.createInitialEventsArea();
		}

	this.checkNavAllCategories = function(checkval) {
			if (checkval == null) checkval = 0;
			this.navCategoryAll.checked = (this.navCategoryAll.checked) ? checkval : 1;
			this.navCategoryAll.className = (this.navCategoryAll.checked) ? "umc-events-nav-category" : "umc-events-nav-category umc-events-nav-category-unchecked";
			for(key in this.categories) {
				this.navCategoriesNodes[key].checked = (this.navCategoryAll.checked) ? 1 : checkval;
				this.navCategoriesNodes[key].className = (this.navCategoryAll.checked) ? "umc-events-nav-category" : "umc-events-nav-category umc-events-nav-category-unchecked";
			}
			this.eventsRefresh=1;
			this.refreshEventsArea();
			return checkval;
		}
	
	this.changedSelection = function() {
			this.eventsRefresh = 1;
			this.eventsStart = 0;
			this.page = 1;
		}
		
	this.displayNavAllCategories = function() {
			var foundCategory = false;
			for(key in this.navCategoriesNodes) {
				if(!this.navCategoriesNodes[key].checked) {
					foundCategory = true;
				}
			}
			this.changedSelection();
			this.navCategoryAll.className = (!foundCategory) ? "umc-events-nav-category" : "umc-events-nav-category umc-events-nav-category-unchecked";
			this.navCategoryAll.checked = (!foundCategory) ? 1 : 0;
		}

	this.checkNavCategory = function(key) {
			this.navCategoriesNodes[key].checked = (this.navCategoriesNodes[key].checked) ? 0 : 1;
			var unsellect = (this.categories[key] == 0) ? ' umc-unsellected' : '';
			this.navCategoriesNodes[key].className = (this.navCategoriesNodes[key].checked) ? "umc-events-nav-category"+unsellect : "umc-events-nav-category umc-events-nav-category-unchecked"+unsellect;
			this.changedSelection();
			this.displayNavAllCategories();
			this.eventsRefresh = 1;
			this.refreshEventsArea();
		}
	
	this.refreshEventsArea = function() {
			this.displayLoading();
			setTimeout('UMCEventsDisplayController.displayEventsArea()', 100);
		}
	
	this.displayEventsArea = function () {
			if(this.eventsRefresh) {
				this.refreshDisplayedEvents();
				this.eventsRefresh=0;
			}
			if(this.changedYears) {
				this.refreshNavCategoriesTotals();
				this.changedYears=0;
			}
			this.removeLoading();
			this.populateEvents();
			//navCalendar.pushEvents(this.eventsDisplayed);
		}

	this.checkEventBetweenDates = function(event, dateBefore, dateAfter) {
			var dateStart = new Date();
			dateStart.setFullYear(dateBefore.getFullYear(), dateBefore.getMonth(), dateBefore.getDate());
			dateStart.setHours(0,0,0,0);
			var dateEnd = new Date();
			dateEnd.setFullYear(dateAfter.getFullYear(), dateAfter.getMonth(), dateAfter.getDate());
			dateEnd.setHours(0,0,0,0);
			var isBetween = 0
			for(var j=0;j<event.dates.length;j++) {
				var eventDate = new Date();
				eventDate.setFullYear(event.dates[j].getFullYear(), event.dates[j].getMonth(), event.dates[j].getDate());
				eventDate.setHours(0,0,0,0);
				if((eventDate>=dateStart) && (eventDate<=dateEnd)) {
					isBetween = 1;
					break;
				}
			}
			return isBetween;
		}

	this.changeDisplayedEventsByDates = function(dateBefore, dateAfter) {
			this.startDate =dateBefore;
			this.endDate =dateAfter;
			this.changedYears = 1;
			this.changedSelection();
			this.refreshEventsArea();
			this.backToEvents();
			this.refreshNavCategoriesTotals();
		}

	this.backToEvents = function(events) {
			$$('.pageTitle')[0].className = "pageTitle";
			this.eventsDatesSearch.style.display = 'none';
			changeOpac(100,this.contentAreaNode);
			this.eventsNode.style.display = 'block';
			navCalendar.showNav();
		}

	this.displayEvent = function(linkurl) {
			var self = this;
			this.displayLoading();
			setTimeout(function(){self.getEvent(linkurl)}, 10);
		}
	this.getEvent = function(linkurl) {
			navCalendar.hideNav();
			document.location = '#';

			var obj = new AjaxRequest();
			obj.dataonly = true;
			obj.rss = linkurl;
			obj.count = 50;
			obj.init();
			
			this.eventsNode.style.display = 'none';
			this.removeLoading();
			
			/* Displaying events */
			var temphtml = '<table id="umc-event-display"><tr><td valign=top>';
			temphtml += '<span class="umc-event-display-link"><a href="#" onclick="UMCEventsDisplayController.backToEvents(); return false;" class="umc-back-to-events">Back to events</a></span>';
			temphtml += '<span class="umc-event-display-text"><table>'+xhrs[50]+'</table></span></td></tr></table>';
			this.eventsDatesSearch.innerHTML = temphtml;
			$$('.pageTitle')[0].className += " umc-pagetitle-resource";
			
			this.eventsDatesSearch.style.display = 'block';

		}

	this.displayEventsByDate = function(events, day) {
			var stringDate = this.getMonth(day)+' '+day.getDate()+', '+day.getFullYear(); 
			this.eventsNode.style.display = 'none';

			/* Displaying events */
			this.eventsDatesSearch.innerHTML = '<div id="umc-single-day-heading">Viewing events on '+stringDate+' in categories: '+this.createEventsHeadingCategories()+'</div>';
			this.eventsDatesSearch.innerHTML += '<br /><a href="#" onclick="UMCEventsDisplayController.backToEvents(); return false;" id="umc-back-to-events">Back to events</a>';
			if(events) {
				for(var i=0; i<events.length; i++) {
					if(events[i]) {	
						this.eventsDatesSearch.innerHTML += this.createEventsListingHTML(events[i]);
					}
				}
			} else {
				this.eventsDatesSearch.innerHTML += '<p>No events found in range.</p>';
			}
			this.eventsDatesSearch.style.display = 'block';
		}

	this.clearCategoryTotals = function() {
			for(key in this.categories) {
				this.categories[key] = 0;
			}
		}

	this.incrementCategory= function(event) {
			for (var k = 0; k < event.categories.length; k++) {
				this.categories[event.categories[k]]++;
			}
		}

	this.initDisplayedEvents = function() {
			var newEvents = new Array;
			for(var i=0; i<this.events.length; i++) {
				var eventdata=this.events[i];
				var eventDate = this.formatNodeDate(eventdata.date);
				for(var j=0; j<eventdata.categories.length; j++) {
					if(this.checkNavCategoryStringLoaded(eventdata.categories[j])) {
						if((eventDate > this.formatNodeDate(this.startDate)) && (eventDate < this.formatNodeDate(this.endDate))) {
							newEvents.push(eventdata);	
							break;
						}
					}
				}
			}

			this.eventsDisplayed = newEvents;
			this.totalPages = Math.ceil( (this.eventsDisplayed.length+1) / this.params.totalEventsPerPage) ;
			this.sortDisplayedEvents();

			this.changedSelection();
			this.refreshEventsArea();
		}
	

	this.refreshDisplayedEvents = function() {
			var newEvents = [];
			var totalEvents = 0;
			this.clearCategoryTotals();
			for(var i=0; i<this.events.length; i++) {
				var eventdata=this.events[i];
				var eventDate = this.formatNodeDate(eventdata.date);
				var daycount = (eventdata.days != undefined) ? parseInt(eventdata.days) : 1;
				for (d=0;d<daycount;d++) {
					var newDate = new Date(eventdata.date);
					newDate.setDate(eventdata.date.getDate() + d);
					newDate = this.formatNodeDate(newDate);
					if((newDate >= this.formatNodeDate(this.startDate)) && (newDate <= this.formatNodeDate(this.endDate))) {
						totalEvents++;
						for(var j=0; j<eventdata.categories.length; j++) {
							if(this.navCategoriesNodes[eventdata.categories[j]].checked) {
								newEvents.push(eventdata);	
								this.incrementCategory(eventdata);
								break;
							}
						}
						break;
					}
				}
			}

			this.totalEventsDisplayed = totalEvents;
			this.eventsDisplayed = newEvents;
			this.totalPages = Math.ceil( (this.eventsDisplayed.length+1) / this.params.totalEventsPerPage) ;
			this.sortDisplayedEvents();
		}
	this.resetDisplay = function() {
			this.checkNavAllCategories('0')
			this.displayDates();
		}
	
	this.removeLoading = function() {
			changeOpac(100,this.contentAreaNode);
			this.loadingNode.style.display = 'none';
		}

	this.displayLoading = function() {
			changeOpac(40,this.contentAreaNode);
			this.loadingNode.style.display = 'block';
		}
	
	this.getLoadingCategories = function() {
			var q = getQval('categories');
			this.categoriesLoadedInitial = q.split(',');
		}

	/*
	 *	Initilizes controller of events calendar
	 */
	this.init = function() {
	 		this.mainNode = $(this.params.eventsAreaId);
			this.createInitialHTMLAreas();
			if(this.categoriesLoadedInitial[0] != '') {
				this.initDisplayedEvents();
			}
			//update mini cal with links to days with entries
			this.getDates();        //Get all dates for mini cal
			this.displayEvents();   //update mini cal 
			this.displayDates();    //initial event display
		}
	
	this.params = eventsData.params;
	this.startDate = new Date('1/1/1971');
	this.endDate = new Date('1/1/2200');
	this.getLoadingCategories(); //category passed via url?
	this.events = eventsData.events;
	this.eventsDisplayed = eventsData.events;
	this.eventsStart = 0;
	this.page = 1;
	this.categories = eventsData.categories;
	this.sortBy = 'date';
	this.years = eventsData.years;
	this.yearsViewed = new Array;
	this.feedLoadSpeed = 2000;
	this.contentAreaNode = $(eventsData.params.contentAreaId);
	this.init();
}


//change the opacity for different browsers
function changeOpac(opacity, object) {
	object.style.opacity = (opacity / 100);
	object.style.MozOpacity = (opacity / 100);
	object.style.KhtmlOpacity = (opacity / 100);
	if(opacity == 100) {
		object.style.filter = '';
	} else {
		object.style.filter = "alpha(opacity=" + opacity + ")";
	}
}
function changeOpacId(opacity, id) {
	var object = $(id).style;
	object.opacity = (opacity / 100);
	object.MozOpacity = (opacity / 100);
	object.KhtmlOpacity = (opacity / 100);
	object.filter = "alpha(opacity=" + opacity + ")";
}

/* Event Comparing */
function UMCEventsTitleSort(x,y) {
	if(x.title == y.title) { return 0; }
	if(x.title < y.title) { return -1; }
	return 1;
}
function UMCEventsDateSort(a, b){
	var c = a.date;
	var d = b.date;
	if (c<d) return -1;
	if (c>d) return 1;
	return 0; 
}

function getQval(name)
{
var m, Q = window.location.search.substring(1);
if ('' != Q)
{
var re = new RegExp(escape(name) + '=([^&$]+)');
if (m = Q.match(re))
return m[1];
else return '';
}
return '';
}

/* @@@@
 * UMC Calendar
 */
function UMCCalendar(id, dateObj) {

	this.buildLeftCal = function() {
			/* main div id in left area */
	 		var pageNavNode = $(eventcal.params.eventsNavAreaId);	
			
			/*default tag names */
			var categoryTagName = "umc-events-nav-category";
			var categoryTagNameUnchecked = "umc-events-nav-category-unchecked";
			
			/* main nav node - where mini cal will be placed */
	 		var navNode = document.createElement('div');
			//navNode.id = "umc-events-nav-areax";

			/* hidden node for date range */
			var hideNode = document.createElement('div');
			hideNode.id = "umc-events-nav-hide";
			hideNode.innerHTML = "&nbsp;";
			
			/* node for where mini cal will reside */
			var calendarDiv = document.createElement('div');
			calendarDiv.id = "umc-events-calendar-area";
			
			/***********************/
			/* build mini calendar */
			/***********************/
			var month = this.getMonth(this.dateObj);
			var calendarHeading = document.createElement('div');
			calendarHeading.id = "umc-calendar-heading";
			this.calendarHeadingMonthId = 'umc-calendar-heading-month';
			/* calendar header */
			calendarHeading.innerHTML = '<div id="umc-calendar-heading-left">'+
								'<a href="#" onclick="return navCalendar.previousYear();">'+
								'<img src="'+eventcal.sitepath+'umc-heading-double-left-arrow.gif" /></a> '+
								'<a href="#" onclick="return navCalendar.previousMonth();">'+
								'<img src="'+eventcal.sitepath+'umc-heading-left-arrow.gif" /></a> '+
							'</div>'+
							'<div class="umc-calendar-heading-center" id="'+this.calendarHeadingMonthId+'">'+month+' '+this.dateObj.getFullYear()+'</div>'+
							'<div id="umc-calendar-heading-right">'+
								' <a href="#" onclick="return navCalendar.nextMonth();">'+
								'<img src="'+eventcal.sitepath+'umc-heading-right-arrow.gif" /></a>'+
								' <a href="#" onclick="return navCalendar.nextYear();">'+
								'<img src="'+eventcal.sitepath+'umc-heading-double-right-arrow.gif" /></a>'+
							'</div>'+
							'<div style="clear:both;"></div>';

			/* -- calendar days -- */
			var calendarDays = document.createElement('div');
			calendarDays.id = "umc-calendar-days";
			var days = new Array('S','M','T','W','T','F','S');
			for(var i=0; i<days.length; i++) {
				var day = document.createElement('div');
				day.className = "umc-calendar-day";
				day.innerHTML = days[i];
				calendarDays.appendChild(day);
			}
			var clear = document.createElement('div');
			clear.className = "umc-clear";
			calendarDays.appendChild(clear);

			var calendarDates = document.createElement('div');
			calendarDates.id = "umc-calendar-dates";

			/* create basic calendar layout - days not added yet */
			var dateNodes = new Array();
			/* 6 weeks */
			for(var i=0;i<6;i++) {
				dateNodes[i] = new Array();

				var week = document.createElement('div');
				week.className = "umc-calendar-week";
				/* 7 days a week */
				for(var j=0; j<7; j++) {
					var day = document.createElement('div');
					day.className = "umc-calendar-day";

					/* Adding node to array */
					dateNodes[i][j] = day;

					week.appendChild(day);
				}
				calendarDates.appendChild(week);
			}
			var week = document.createElement('div');
			week.className = "umc-clear";
			calendarDates.appendChild(week);

			calendarDiv.appendChild(calendarHeading); /* write calendar heading */
			calendarDiv.appendChild(calendarDays);    /* write day titles - Sun - Sat */
			calendarDiv.appendChild(calendarDates);   /* write the 6 weeks of day fields */
			this.dateNodes = dateNodes;
			/* add hidden node */
			navNode.appendChild(hideNode);
			/* add calendar layout */
			navNode.appendChild(calendarDiv);
						
			
			/****************************************/
			/* create date range area - layout only */
			/****************************************/
			var dateRangeArea = document.createElement('div');
			dateRangeArea.id = "umc-events-nav-date-search-area";
			dateRangeArea.innerHTML = '<div id="umc-date-range-heading"><div style="float:left; cursor:pointer;" onclick="navCalendar.closeDateRange(); return false;">close</div>'+
							'<div onclick="navCalendar.setDateRangeForm(document.forms[\'umcdaterange\']);" id="umc-form-submit">&nbsp;</div>'+
							'<form name="umcdaterange" onsubmit="navCalendar.setDateRangeForm(this); return false;" id="umc-date-range-form" >'+
							'Date Range: '+
							'<input onclick="navCalendar.setFocus(this);" name="start" />'+
							'<input onclick="navCalendar.setFocus(this);" name="end" /> '+
							'</form> <div class="umc-clear"></div></div>';
			var dateCalendarArea= document.createElement('div');
			dateCalendarArea.id = "umc-events-nav-date-calendar-area";

			/* store current month */
			var thisMonth = new Date();
			/* store next month */
			var nextMonth = new Date();
			nextMonth.setMonth(thisMonth.getMonth()+1);
			/* store previous month */
			var previousMonth = new Date();
			previousMonth.setMonth(thisMonth.getMonth()-1);
			/* store prev, curr and next months in array - date range only displays 3 months at a time */
			var months = new Array( previousMonth, thisMonth, nextMonth);
			/* dateNodes = days defined within the 3 months */
			this.rangedateNodes = new Array();

			/* create back month div for previous month */
			var backMonthDiv = document.createElement('div');
			backMonthDiv.className = 'umc-calendar-date-leftside';

			var backMonth = document.createElement('img');
			backMonth.src = eventcal.sitepath+'umc-calendar-left.gif';
			backMonth.style.cursor = 'pointer';
			backMonth.className = 'umc-calendar-date-navigation';
			backMonth.onclick = function() {
						navCalendar.backMonth();
				}
			backMonthDiv.appendChild(backMonth);
			dateCalendarArea.appendChild(backMonthDiv);

			/* create forward month div for next month */
			var forwardMonth = document.createElement('img');
			forwardMonth.src = eventcal.sitepath+'umc-calendar-right.gif';
			forwardMonth.style.cursor = 'pointer';
			forwardMonth.className = 'umc-calendar-date-navigation';
			forwardMonth.onclick = function() {
						navCalendar.forwardMonth();
				}

			/* loop through 3 months and build day nodes - no values in nodes yet */
			for(var k=0; k<months.length; k++) {
				if(k!=0) {
					var backMonthDiv = document.createElement('div');
					backMonthDiv.className = 'umc-calendar-date-leftside';
					dateCalendarArea.appendChild(backMonthDiv);
				}
				var month = this.getMonth(months[k]); /* get month name */
				var calendar = document.createElement('div');
				calendar.className = "umc-date-calendar";
				var calendarHeading = document.createElement('div');
				calendarHeading.className = 'umc-date-calendar-heading';
				calendarHeading.innerHTML = '<span id="umc-date-calendar-heading-'+k+'">'+month+' '+months[k].getFullYear()+'</span>'; /* write heading */
				calendar.appendChild(calendarHeading);
				
				/* write day headings */
				var calendarDays = document.createElement('div');
				calendarDays.className = "umc-calendar-days";
				var days = new Array('S','M','T','W','T','F','S');
				for(var i=0; i<days.length; i++) {
					var day = document.createElement('div');
					day.className = "umc-calendar-date-day";
					day.innerHTML = days[i];
					calendarDays.appendChild(day);
				}
				var clear = document.createElement('div');
				clear.className = "umc-clear";
				calendarDays.appendChild(clear);
				
				/* write calendar day nodes */
				var calendarDates = document.createElement('div');
				calendarDates.className = "umc-calendar-dates";

				var rangedateNodes = new Array();

				/* write 6 weeks */
				for(var i=0;i<6;i++) {
					rangedateNodes[i] = new Array();

					var week = document.createElement('div');
					week.className = "umc-calendar-date-week";
					
					/* write 7 days per week day nodes */
					for(var j=0; j<7; j++) {
						var day = document.createElement('div');
						day.className = "umc-calendar-date-day";
						day.onclick = function() {
								navCalendar.fillDate(this);
							}

						/* Adding node to array */
						rangedateNodes[i][j] = day;

						week.appendChild(day);
					}
					calendarDates.appendChild(week);
				}

				this.rangedateNodes.push(rangedateNodes);

				calendar.appendChild(calendarDays);
				calendar.appendChild(calendarDates);
				dateCalendarArea.appendChild(calendar);

			}
			dateCalendarArea.appendChild(forwardMonth);

			this.months = months;

			var week = document.createElement('div');
			week.className = "umc-clear";
			calendarDates.appendChild(week);
			dateRangeArea.appendChild(dateCalendarArea);

			var dateRange = document.createElement('div');
			dateRange.id = "umc-events-nav-date-search";
			dateRange.innerHTML = '( <a href="#" onclick="UMCEventsDisplayController.showAll(); return false;" id="umc-events-nav-show-all">Show all</a> ) <a href="#" onclick="navCalendar.showDateRange(); return false;">Set Date Range</a>';

			navNode.appendChild(dateRangeArea); /* add date range area */
			navNode.appendChild(dateRange);     /* add daterange div */
			pageNavNode.appendChild(navNode);   /* add nav node to the page - this si the final add to get everything to display */
			/* store for future routines */
			this.calendarNode = calendarDiv;
			this.dateRangeArea = dateRangeArea;
			this.navHideNode = hideNode;
			this.navNode = navNode;
			
			this.dateSearchFocus = document.forms['umcdaterange'].start;
			this.dateSearchFocus.className = 'umc-selected';
			/* fill in mini cal day nodes */
			this.changeMonth(); /* builds days into mini calendar month */
			/* fill in daterange day nodes */
			this.changeDateRangeMonth();
		
	}

	this.changeMonth = function() {
			var firstWeek = 1;
			var lastWeek = 0;
			var dayOfMonth = new Date();
			dayOfMonth.setFullYear(this.dateObj.getFullYear(), this.dateObj.getMonth(), 1);
			for(var i=0;i<6;i++) {
				for(var j=0; j<7; j++) {
					day = this.dateNodes[i][j];

					if(firstWeek) {
						if(dayOfMonth.getDay() == j) {
							firstWeek = 0;
						}
					}

					if(!firstWeek && !lastWeek) {
						var dayDate = new Date();
						dayDate.setFullYear(dayOfMonth.getFullYear(), dayOfMonth.getMonth(), dayOfMonth.getDate());
						day.date = dayDate;
						day.className = "umc-calendar-day";
						day.innerHTML = dayDate.getDate();
						dayOfMonth.setDate(dayOfMonth.getDate() +1);
						if(dayOfMonth.getMonth() != dayDate.getMonth()) {
							lastWeek = 1;
						}
					} else {
						day.innerHTML = '';
					}
				}
			}
			var headingMonthNode = $(this.calendarHeadingMonthId);
			var month = this.getMonth(this.dateObj);
			headingMonthNode.innerHTML = month + ' ' + this.dateObj.getFullYear();
		}

	this.changeDateRangeMonth = function() {
			for(var k=0; k<this.months.length; k++) {
				var firstWeek = 1;
				var lastWeek = 0;
				var dayOfMonth = new Date();
				dayOfMonth.setFullYear(this.months[k].getFullYear(), this.months[k].getMonth(), 1);
				for(var i=0;i<6;i++) {
					for(var j=0; j<7; j++) {
						day = this.rangedateNodes[k][i][j];
						if(firstWeek) {
							if(dayOfMonth.getDay() == j) {
								firstWeek = 0;
								var d = 1;
								var n = j-1;
								for(n; n>-1;n--) {
									var oldDay = this.rangedateNodes[k][i][n];
									var dayDate = new Date(dayOfMonth);
									dayDate.setDate(dayDate.getDate() - d);
									d++;
									oldDay.date = dayDate;
									oldDay.className = 'umc-calendar-date-day umc-unsellected';
									oldDay.innerHTML = dayDate.getDate();
								}
							}
						}

						if(lastWeek == 1) {
							var dayDate = new Date();
							dayDate.setFullYear(dayOfMonth.getFullYear(), dayOfMonth.getMonth(), dayOfMonth.getDate());
							day.date = dayDate;
							day.className = 'umc-calendar-date-day umc-unsellected';
							day.innerHTML = dayDate.getDate();
							dayOfMonth.setDate(dayOfMonth.getDate() +1);
						}
						if(!firstWeek && !lastWeek) {
							var dayDate = new Date();
							dayDate.setFullYear(dayOfMonth.getFullYear(), dayOfMonth.getMonth(), dayOfMonth.getDate());
							day.date = dayDate;
							day.className = 'umc-calendar-date-day';
							day.innerHTML = dayDate.getDate();
							dayOfMonth.setDate(dayOfMonth.getDate() +1);
							if(dayOfMonth.getMonth() != dayDate.getMonth()) {
								lastWeek = 1;
							}
						}
					}
				}
				var headingMonthNode = $('umc-date-calendar-heading-'+k);
				var month = this.getMonth(this.months[k]);
				headingMonthNode.innerHTML = month + ' ' + this.months[k].getFullYear();
			}
		}

	this.convertDateKey = function(date) {
			var key = date.getMonth()+' '+date.getDate()+' '+date.getFullYear();
			return key;
		}

	this.getMonth = function(dateObj) {
			var months = {0:"January", 1:"February", 2:"March", 3:"April", 4:"May", 5:"June", 6:"July", 7:"August", 8:"September", 9:"October", 10:"November", 11:"December" }
			var month = months[dateObj.getMonth()];
			return month;
		}

	this.showDateRange = function () {
			this.hideNav();
			changeOpac(40,this.contentAreaNode);
			document.forms['umcdaterange'].start.value='';
			document.forms['umcdaterange'].end.value='';
			this.resetMonths();
			this.dateRangeArea.style.display = 'block';
			this.setFocus(document.forms['umcdaterange'].start);
		}

	this.previousYear = function() {
			this.dateObj.setFullYear(this.dateObj.getFullYear()-1 );
			this.changeMonth();
			UMCEventsDisplayController.displayEvents();
			return false;
		}

	this.nextYear = function() {
			this.dateObj.setFullYear(this.dateObj.getFullYear()+1 );
			this.changeMonth();
			UMCEventsDisplayController.displayEvents();
			return false;
		}

	this.nextMonth = function() {
			this.dateObj.setMonth(this.dateObj.getMonth() +1 );
			this.changeMonth();
			UMCEventsDisplayController.displayEvents();
			return false;
		}

	this.previousMonth = function() {
			this.dateObj.setMonth(this.dateObj.getMonth() -1 );
			this.changeMonth();
			UMCEventsDisplayController.displayEvents();
			return false;
		}

	this.showNav = function() {
			this.navHideNode.style.position = 'static';
			this.navHideNode.style.display = 'none';
			changeOpac(100,this.navHideNode);
		}
	

	this.hideNav = function() {
			this.navHideNode.style.position = 'absolute';
			this.navHideNode.style.display = 'block';
			this.navHideNode.style.height =  $(eventcal.params.eventsNavAreaId).parentNode.offsetHeight+'px';
			this.navHideNode.style.width =  $(eventcal.params.eventsNavAreaId).parentNode.offsetWidth+'px';
			changeOpac(50,this.navHideNode);
		}
	
	this.resetMonths = function() {
			var thisMonth = new Date();
			var nextMonth = new Date();
			nextMonth.setMonth(thisMonth.getMonth()+1);
			var previousMonth = new Date();
			previousMonth.setMonth(thisMonth.getMonth()-1);
			var months = new Array( previousMonth, thisMonth, nextMonth);
			this.months = months;
			//this.changeMonth();
			this.changeDateRangeMonth();
		}

	this.setFocus = function(o) {
			this.dateSearchFocus.className = '';
			o.className = 'umc-selected';
			o.focus();
			this.dateSearchFocus = o;
		}
		
	this.closeDateRange = function() {
			this.showNav();
			changeOpac(100,this.contentAreaNode);
			this.dateRangeArea.style.display = 'none';
		}

	this.backMonth = function() {
			for(var i=0; i<this.months.length; i++) {
				this.months[i].setMonth(this.months[i].getMonth() -3 );
				this.changeDateRangeMonth();
			}
			return false;
		}
	this.forwardMonth = function() {
			for(var i=0; i<this.months.length; i++) {
				this.months[i].setMonth(this.months[i].getMonth() +3 );
				this.changeDateRangeMonth();
			}
			return false;
		}

	this.fillDate = function(o) {
			var thisDate = o.date;
			this.dateSearchFocus.value = (thisDate.getMonth()+1)+'/'+thisDate.getDate()+'/'+thisDate.getFullYear();	
			if(this.dateSearchFocus.name == 'start') this.setFocus(document.forms['umcdaterange'].end);
		}	

	this.setDateRangeForm = function(f) {
			var start = new Date(f.start.value);
			var end= new Date(f.end.value);
			var regex=/^\d{1,2}\/\d{1,2}\/\d{4}$/g;
			if(!f['start'].value.match(regex)) {
				alert('Date is invalid');
				f['start'].className = 'umc-selected';
				f['end'].className = '';
				this.dateSearchFocus = f['start'];
				return false;
			}else if(!f['end'].value.match(regex)) {
				alert('Date is invalid');
				f['end'].className = 'umc-selected';
				f['start'].className = '';
				this.dateSearchFocus = f['end'];
				return false;
			} else if(start > end) {
				alert('Start date is after end date.');
				return false;
			}
			this.showNav();
			changeOpac(100,this.contentAreaNode);
			this.dateRangeArea.style.display = 'none';
			UMCEventsDisplayController.displayDates(start, end);
			//navResCalendar.selectResource(start, end, '', '', 'date');
			//document.location = '#';
		}
	
	this.init = function() {

			this.dateObj =new Date();
			this.buildLeftCal();
			this.changeMonth();
		}
	
	this.contentAreaNode = $(eventcal.params.contentAreaId);
	this.init();
}

window.onbeforeunload = function () {
  // return "Are you sure you would like to navigate away from this page? You will lose your search results.";
}

function UMCReload() {
	window.onbeforeunload = function () {
		}
	document.location = document.location;
}

