var EPIC_calendar = Class.create({
	initialize: function(container, events) {
		this.events = events;
		this.show_events = [];
		this.container = $(container);
		this.calendar = new Date();
		this.preview_window = new Element('div', { 'class' : "calendar_preview" });
		
		var self = this;
		Event.observe(window, "load", function() {
				$(document.body).insert({ 'bottom' : self.preview_window });
			});
		this.draw();
	},
	
	next: function() {
		this.calendar.setMonth(this.calendar.getMonth()+1);
		this.draw();
	},
	
	previous: function() {
		this.calendar.setMonth(this.calendar.getMonth()-1);
		this.draw();
	},
	
	draw: function() {
		var self = this;
		
		var first_day_timestamp = new Date(this.calendar.getFullYear(), this.calendar.getMonth(), 1, 12, 0, 0, 0);
		var calendar_start_timestamp = first_day_timestamp.getTime() - (((first_day_timestamp.getDay()?first_day_timestamp.getDay():first_day_timestamp.getDay()+7)-1) * 1000*60*60*24);
		
		var html = "";
		html += "<h4><span>Events</span> "+this.calendar.format("F Y")+"</h4>";
		html += "<table>";
		html += "<tr><th>Mo<span>n</span></th><th>Tu<span>e</span></th><th>We<span>d</span></th><th>Th<span>u</span></th><th>Fr<span>i</span></th><th>Sa<span>t</span></th><th>Su<span>n</span></th></tr>";
		
		this.show_events.each(function(i) {
				$(self.container.id+"_"+i).stopObserving();
		   });
		this.show_events = [];
		
		for (var w = 0; w < 6; w++) {
			html += "<tr>";
			for (var d = 0; d < 7; d++) {
				var n = new Date();
				n.setTime( calendar_start_timestamp + ((1000*60*60*24) * ((w*7)+d)) );
				var stamp = n.format("Y-n-j");
				
				var td_class = "";
				if (this.calendar.getMonth() == n.getMonth()) {
					/*td_class = (this.events[stamp] == null ? "fade" : "dark");*/	// for old system
					td_class = (this.events.calendar_data[stamp] == null ? "fade" : "dark");

					/*if (this.events[stamp] != null && this.events[stamp].length) {*/	// for old system
					if (this.events.calendar_data[stamp] != null && this.events.calendar_data[stamp].length) {
						this.show_events.push(stamp);
					}
				}
				
				html += "<td id='"+this.container.id+"_"+stamp+"'"+(td_class != '' ? " class='"+td_class+"'" : "")+">"+(n.getDate())+"</td>";
			}
			html += "</tr>";
		}
		html += "</table>";

		this.container.update(html);
		this.show_events.each(function(date) {
				$(self.container.id+"_"+date).observe('mousemove', function(event) {
						var px = event.pointerX();
						var py = event.pointerY();
						self.preview_window.style.top = py+"px";
						self.preview_window.style.left = (px+20)+"px";
						
						var dw = document.width ? document.width : document.documentElement.offsetWidth;
						var width = self.preview_window.getWidth();
						var right = parseInt(self.preview_window.style.left) + width;
						if (right > dw) {
							self.preview_window.style.left = (dw - width) + "px";
							self.preview_window.style.top = (py+20)+"px";
						}
					});

				$(self.container.id+"_"+date).observe('mouseover', function() {
						self.preview_window.update(self.generatePreviewContent(date));
						self.preview_window.style.display = "block";
					});
				
				$(self.container.id+"_"+date).observe('mouseout', function() { self.preview_window.style.display = "none"; });

				$(self.container.id+"_"+date).observe('click', function() { self.linkOut(date); });
			}.bind(this));
	},
	
	updateUpcoming: function(i) {
		var self = this;
		var html = "";
		this.show_events.each(function() { html += self.generatePreviewContent(i); });
		self.container.update(html);
	},
	
	generatePreviewContent: function(date) {
		var events = this.events.calendar_data[date];
		var html = "";
		events.each(function(id){
				var event_pointer = this.events.id2data[id];
				var event_details = this.events[event_pointer.stamp][event_pointer.index-1];
				
				var date = new Date();
				date.setTime(event_details.timestamp*1000);
				html += "<h3><span>"+date.format("jS F Y, g:ia")+"</span>"+event_details.title+"</h3>";
				html += "<p>"+event_details.description+"</p>";
				
				if (event_details.timestamp_end > event_details.timestamp) {
					var end = new Date();
					end.setTime(event_details.timestamp_end*1000);
					html += "<p class='end_time'>Ends: "+end.format("jS F Y, g:ia")+"</p>";
				}
				
			}.bind(this));
		return html;
	},
	
	linkOut: function(stamp) {
		if (this.events.calendar_data[stamp] == null)
			return false;
			
		var last_resort;
		var pointers = this.events.calendar_data[stamp];
		pointers.each(function(pointer){
				var ref = this.events.id2data[pointer];
				var eve = this.events[ref.stamp][ref.index-1];
				if (eve.day_link) {
					window.location.href = eve.day_link;
					return true;
				} else if (eve.link) {
					last_resort = eve.link;
				}
			}.bind(this));
		
		if (last_resort) {
			window.location.href = last_resort;
			return true;
		}
		
		return false;
	}
});