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;')		
	}	
});

