var Calendar = new Class({		initialize: function() {		window.me = this;		window.hm = new HistoryManager();		this.parseData();	    $('submitQuery').addEvent('click', function() {			hm.addState(encodeURI($('filterBy').value));			me.parseData($('filterBy').value);		});		$('filterBy').addEvent('change', function() {			hm.addState(encodeURI($('filterBy').value));			me.parseData($('filterBy').value);		});		hm.addEvent('onHistoryChange', me.parseData);	},	parseData: function(filterBy, page, events) {		scroll(0,0);		if (!page)page = me.getHash('page') || 1;	    if (!events)events = me.getHash('events') || "all";	    if (!filterBy) {filterBy = me.getHash('filterBy') || "descriptions";} 		else {filterBy = filterBy.split(':')[0]}		var calendar = $('calendar');	    calendar.setHTML(null);	    var pagination = $('pagination');	    pagination.setHTML(null);	    var path = window.location.pathname;				//if (page > eventArr.events.pageTotal) {calendar.setHTML('No events are scheduled at this time.'); return false;}		if (events == 'all') {			if (filterBy != 'begindate') {				me.genByDescription(eventArr.descriptions, filterBy, page, calendar);				$('filterBy').selectedIndex = 0;			} else {	                    				me.genByDate(eventArr.events, filterBy, page, calendar, events, pagination);				$('filterBy').selectedIndex = 1;			} 		} else {			s.pageName='http://k12.com' + path + '/#' + filterBy + ':' + page + ':' + events;			s.prop1=eventArr.events.displayitle || s.prop1;			s.eVar2=eventArr.events.displayTitle;								void(s.t());			me.genByType(eventArr.events, filterBy, page, calendar, events, pagination);		}			},		genByDate: function(data, filterBy, page, calendar, events, pagination) {		$('title').setHTML(calTitle);		if (!data.objArr || data.objArr.length == 0) {calendar.setHTML('No events are scheduled at this time.'); return false;}	    var prevDate, boxTop, dateHeading, beginDate, endDate, event, title, detailBox, place, eventDetail, dateElem, moreLinks;	    var eventBlock = new Element('ul', {'class': 'eventBlock', 'id': 'eventBlock'});	    		var limit = 10;		var begin = (page-1) * limit;		var length = data.objArr.length;		var end = begin + limit		var end = (end > length) ? length : end;		for (var i=begin;i<end;i++) {			var key = data.objArr[i];			if ((key.bMonth + ' ' + key.bYear) != prevDate) {	            prevDate = (key.bMonth + ' ' + key.bYear);	            boxTop = new Element('li', {'class':'boxTop'});	            dateHeading = new Element('h3', {'class':'eventMonth'}).setHTML(me.getFullMonth(key.bMonth) + ' ' + key.bYear);	            boxTop.adopt(dateHeading);	            eventBlock.adopt(boxTop);	        }       	        beginDate = me.getFullMonth(key.bMonth) + ' ' + key.bDate + ', ' + key.bYear;	        if (key.enddate) endDate = ' - ' + me.getFullMonth(key.eMonth) + ' ' + key.eDate + ', ' + key.eYear;               	        event = new Element('li', {'class':'event'});       	        title = new Element('h2', {'class':'eventTitle'});      	        detailBox = new Element('div', {'class':'detailBox'});	        eventLocBox = new Element('ul', {'class':'eventLoc'});			place = new Element('li').setHTML("<em>Place: </em>" + (key.eventloc||''));			eventLocBox.adopt(place);			if (key.eventloc2) { 								place2 = new Element('li').setHTML(key.eventloc2);				eventLocBox.adopt(place2);			}			place3 = new Element('li').setHTML((key.eventcity||'') + ', ' + (key.eventstate||'') + ' ' + (key.eventzip||''));			eventLocBox.adopt(place3);	        eventDetail = new Element('ul', {'class':'eventDetail'});	        dateElem = new Element('li').setHTML('<em>Date: </em>' + beginDate + (endDate||''));	        moreLinks = new Element('ul', {'class':'moreLinks'});	        title.setHTML(me.changeEntities(key.title));	        event.adopt(title);	        detailBox.adopt(eventLocBox);				        eventDetail.adopt(dateElem);	        if (key.eventtime) {eventDetail.adopt(new Element('li').setHTML('<em>Time: </em>' + key.eventtime));}	        if (key.cost) {eventDetail.adopt(new Element('li').setHTML('<em>Cost: </em>' + key.cost));}	        detailBox.adopt(eventDetail);               	        event.adopt(detailBox);	        if (key.details) {event.adopt(new Element('div', {'class':'eventDesc'}).setHTML(key.details));}	        if (key.directions) {moreLinks.adopt(new Element('li').setHTML('<a href="' + key.directions + '">directions</a> &gt;&gt;'));}	        if (key.show_detail) {moreLinks.adopt(new Element('li').setHTML('<a href="' + key.href + '">more details</a> &gt;&gt;'));}	        if (key.reg_button) {moreLinks.adopt(new Element('li').setHTML('<a target="' + (key.nw ? key.nw : '_self') + '" href="' + (key.reg_link ? key.reg_link : '#') + '" class="button">registration</a>'));}	        event.adopt(moreLinks);	        eventBlock.adopt(event).injectInside(calendar);			endDate = null; //Removing endDate since it should be empty for each loop thru data		}		   	    if ($('eventBlock')) {	        $('eventBlock').getElements('li[class=boxTop]').each(function(obj) {	            obj.getPrevious() ? obj.getPrevious().setProperty('class', 'event last') : null;	        });	    }		if ($('secondNav')) $('secondNav').setStyle('display', 'block');		if ($('promoItems')) $('promoItems').setStyle('display', 'block');		$('col2Nav').setHTML(null);		$('colPromos').setHTML(null);	    if (data.pageTotal > 1) {this.genPagination(data, filterBy, page, events, calendar);}	},	genByDescription: function(data, filterBy, page, calendar) {		$('title').setHTML(data.pageTitle);		if (!data.objArr || data.objArr.length == 0) {calendar.setHTML('No events are scheduled at this time.'); return false;}	    var event, eventInfo, eventTitle, eventDesc, linkButton, anchor;	    var display_abs = new Element('div', {'class':'eventAbstract'});		display_abs.setHTML(data.display_abs || null);	    display_abs.injectInside(calendar);	    var eventBlock = new Element('ul', {'class': 'eventBlock', 'id':'descriptions'});	    $each(data.objArr,function(key, value){	        event = new Element('li', {'class':'event'});	        eventInfo = new Element('ul', {'class':'eventInfo'});	        linkButton = new Element('li', {'class':'linkButton'});	        linkButton.adopt(new Element('a', {'class':'button', 'href': 'javascript:void(0);'}).setHTML('view these events').addEvent('click', function(){				hm.addState('begindate:1:'+ encodeURI(key.id));				me.parseData("begindate", 1,key.id);							}));	        eventInfo.adopt(new Element('li', {'class':'eventTitle'}).setHTML(me.changeEntities(key.display)));	        eventInfo.adopt(new Element('li', {'class':'eventDesc'}).setHTML(key.description || null));	        eventInfo.adopt(linkButton);	        event.adopt(eventInfo);	        eventBlock.adopt(event).injectInside(calendar);	    });    	    var desc = $('descriptions').getElements('li[class=event]');	    desc[desc.length-1].addClass('last');			},	genByType: function(data, filterBy, page, calendar, events, pagination) {			    if (!data.objArr || data.objArr.length == 0) {calendar.setHTML('No events are scheduled at this time.'); return false;}		var eventDetailBlock, list, endDate, beginDate, dateBlock;		var dateBlock = new Element('div', {'class':'dateBlock'})	    var eventObj = [];		var length = data.objArr.length;		for (var j=0;j<length;j++){	        if (data.objArr[j].getEventType == events) {				eventObj.push(data.objArr[j]);			}	    }		$('title').setHTML(eventObj[0] ? eventObj[0].eventTitle : eventArr.descriptions.pageTitle);		var description = new Element('div', {'class':'calendarAbstract'}).setHTML(eventObj[0] ? eventObj[0].eventDesc : null);	    description.injectInside(calendar);		var eoLength = eventObj.length;		if (eoLength == 0) {calendar.setHTML('No events are scheduled at this time.'); return false;}		var limit = 10;		var begin = (page-1) * limit;				var end = begin + limit;				end = (end > eoLength) ? eoLength : end;		for (k=begin;k<end;k++) {			var key = eventObj[k];			beginDate = me.getShortDay(key.bDay) + ', ' + me.getFullMonth(key.bMonth) + ' ' + key.bDate + ', ' + key.bYear;	        if (key.enddate) endDate = ' - ' + me.getShortDay(key.eDay) + ', ' + me.getFullMonth(key.eMonth) + ' ' + key.eDate + ', ' + key.eYear;	        eventDetailBlock = new Element('div', {'class':'eventDetailBlock'});	        list = new Element('ul', {'class':'eventTime'});				        list.adopt(new Element('li').setHTML('<h2>' + me.changeEntities(key.title) + '</h2>'));	        list.adopt(new Element('li').setHTML('<em>Date: </em>' + beginDate + (endDate||'')));				        if (key.eventtime) {list.adopt(new Element('li').setHTML('<em>Time: </em>' + key.eventtime));}	        eventDetailBlock.adopt(list);			eventLocBox = new Element('ul', {'class':'eventLoc'});			place = new Element('li').setHTML("<em>Place: </em>" + (key.eventloc||''));			eventLocBox.adopt(place);			if (key.eventloc2) { 								place2 = new Element('li').setHTML(key.eventloc2);				eventLocBox.adopt(place2);			}			place3 = new Element('li').setHTML((key.eventcity||'') + ', ' + (key.eventstate||'') + ' ' + (key.eventzip||''));			eventLocBox.adopt(place3);			eventDetailBlock.adopt(eventLocBox);			if (key.details) {eventDetailBlock.adopt(new Element('div', {'class':'eventDesc'}).setHTML(key.details));}						moreLinks = new Element('ul', {'class':'moreLinks'});			if (key.directions) {moreLinks.adopt(new Element('li').setHTML('<a href="' + key.directions + '">directions</a> &gt;&gt;'));}			if (key.show_detail) {moreLinks.adopt(new Element('li').setHTML('<a href="' + key.href + '">more details</a> &gt;&gt;'));}	        if (key.reg_button) {moreLinks.adopt(new Element('li').setHTML('<a target="' + (key.nw ? key.nw : '_self') + '" href="' + (key.reg_link ? key.reg_link : '#') + '" class="button">register now</a>'));}			eventDetailBlock.adopt(moreLinks);			dateBlock.adopt(eventDetailBlock).injectInside(calendar);			endDate = null; //Removing endDate since it should be empty for each loop thru data		}		if ($('secondNav')) $('secondNav').setStyle('display', 'block');		if ($('promoItems')) $('promoItems').setStyle('display', 'block');		if ($('col2Nav')) $('col2Nav').setHTML(null);		if($('colPromos')) $('colPromos').setHTML(null);	    if (data.pageTotal > 1) {this.genPagination(data, filterBy, page, events, calendar, (Math.ceil(eoLength / limit)));}    	},	genPagination: function(data, filterBy, page, events, calendar, pageTotal) {		var pt = pageTotal || data.pageTotal;		if (pt < 1) {calendar.setHTML('No events are scheduled at this time.'); return false;}	    var pagination = $('pagination');	    pagination.setHTML(null);	    var pageList = new Element('ul');		var oldAnc = new Element('a',{'href':'javascript:void(0);'}).setHTML(' &lt; older events');		oldAnc.addEvent('click', function(){			hm.addState('begindate:' + encodeURI((parseInt(page)-1)) + ':' + encodeURI(events));			me.parseData(filterBy,(parseInt(page)-1),events);					});	    if (page >= 2) {pageList.adopt(new Element('li', {'class':'newer'}).adopt(oldAnc));}	    var element = null;	    var anchor = [];		var count = 1;		if (pt > 1) {			for (var i=1;i<(pt+1);i++) {		        element = new Element('li');				anchor[i] = new Element('a', {'href':'javascript:void(0);'}).setHTML(i);				anchor[i].i = count;				anchor[i].addEvent('click',function() {					hm.addState('begindate:' + encodeURI(this.i) + ':' + encodeURI(events));					me.parseData(filterBy, this.i, events);								});				count++				        element.adopt(anchor[i]);		        pageList.adopt(element);		        if (page == i) {anchor[i].addClass('active');}		    }		}	    if (page != pt) {			var newAnc = new Element('a',{'href':'javascript:void(0);'}).setHTML('newer events &gt;').addEvent('click', function() {				hm.addState('begindate:' + encodeURI((parseInt(page)+1)) + ':' + encodeURI(events));				me.parseData(filterBy,(parseInt(page)+1),events);							});			pageList.adopt(new Element('li', {'class':'older'}).adopt(newAnc));		}	    pagination.adopt(pageList).injectAfter(calendar);	},		getHash: function(hash) {		var qs = hm.getCurrentLocation() ? hm.getCurrentLocation().split(':') : null;				if (qs) {						switch (hash) {				case 'filterBy':return qs[0];break;				case 'page':return qs[1];break;				case 'events':return qs[2];break;				default: return null; break;			}		}	},	getFullMonth: function(date) {	    switch (date) {	        case 0: return 'January'; break;	        case 1: return 'February'; break;	        case 2: return 'March'; break;	        case 3: return 'April'; break;	        case 4: return 'May'; break;	        case 5: return 'June'; break;	        case 6: return 'July'; break;	        case 7: return 'August'; break;	        case 8: return 'September'; break;	        case 9: return 'October'; break;	        case 10: return 'November'; break;	        case 11: return 'December'; break;			default: return null; break;				    }	},	getShortDay: function(date) {	    switch (date) {	        case 0: return 'Sun'; break;	        case 1: return 'Mon'; break;	        case 2: return 'Tues'; break;	        case 3: return 'Wed'; break;	        case 4: return 'Thur'; break;	        case 5: return 'Fri'; break;	        case 6: return 'Sat'; break;			default: return null; break;	    }	},	changeEntities: function(data) {		return data.replace(/K12/ig, 'K&sup1;&sup2;')			}	});