
var AjaxCalendar = Class.create({
	initialize: function(elementID, baseURL, month) {
		this.url = baseURL;
		this.element = $(elementID);
		if (month) {
			var input = month.split('-');
			this.month = input[1];
			this.year = input[0];
			this.day = input[2];
		} else {
			var d = new Date();
			this.month = d.getMonth()+1;
			this.year = d.getFullYear();
			this.day = d.getDate();
		}
		this.get();
	},
	get: function() {
		var request_url = this.url + 'ajax/' + this.year + '-' + this.month + '-1';
		new Ajax.Request(request_url,{
			method: 'get',
			onSuccess: this.receive.bind(this),
			onException: this.ajaxFail.bind(this)
		});
	},
	receive: function(transport) {
		var data = transport.responseText.evalJSON();
		this.draw(data);
	},
	ajaxFail: function(transport) {
		alert('The connection the server has been interrupted. Please try again later.');
	},
	draw: function(data) {
		// build header row
		var header = document.createElement('tr');
		var prev = document.createElement('td');
		var monthyear = document.createElement('td');
		var next = document.createElement('td');
		prev.innerHTML = '&lt;&lt;';
		prev.className = 'nav';
		next.innerHTML = '&gt;&gt;';
		next.className = 'nav';
		Event.observe(prev,'click', this.prevClick.bindAsEventListener(this));
		Event.observe(next,'click', this.nextClick.bindAsEventListener(this));
		$(monthyear).writeAttribute({className: 'monthyear', colspan: 5});
		monthyear.innerHTML = data.monthName + ' ' + data.year;
		header.className = 'header';
		header.appendChild(prev);
		header.appendChild(monthyear);
		header.appendChild(next);

		// build days of week
		var days = document.createElement('tr');
		var day_letters = new Array('M','T','W','T','F','S','S');
		for (var i=0; i<7; i++) {
			var day = document.createElement('td');
			day.innerHTML = day_letters[i];
			if (i > 4)
				day.className = 'weekend';
			days.appendChild(day);
		}
		days.className = 'days';

		// begin the table body
		var tbody = document.createElement('tbody');
		tbody.appendChild(header);
		tbody.appendChild(days);

		// build days of the month
		var day_pad = data.padding;
		var day_current = 1;
		while (day_current <= data.days) {
			var row = document.createElement('tr');
			for (var i=0; i<7; i++) {
				var day = document.createElement('td');
				if ((day_pad > 0) || (day_current > data.days)) {
					day.innerHTML = '&nbsp;';
					day.className = 'empty';
					day_pad--;
				} else {
					if (i > 4)
						day.className = 'weekend';
					if (data.events[day_current]) {
						var link = document.createElement('a');
						link.href = this.url + 'day/' + data.year + '-' + data.month + '-' + day_current;
						link.innerHTML = day_current;
						day.appendChild(link);
						day.className = day.className + ' event';
					} else {
						day.innerHTML = day_current;
					}
					if (day_current == this.day)
						day.className = day.className + ' selected';
					day_current++;
				}
				row.appendChild(day);
			}
			tbody.appendChild(row);
		}

		// construct table
		var table = document.createElement('table');
		table.id = this.element.id;
		table.appendChild(tbody);

		// insert in page
		this.element.replace($(table));
		this.element = table;
	},
	nextClick: function() {
		this.day = 0;
		this.month++;
		if (this.month > 12) {
			this.month = 1;
			this.year++;
		}
		this.get();
	},
	prevClick: function() {
		this.day = 0;
		this.month--;
		if (this.month < 1) {
			this.month = 12;
			this.year--;
		}
		this.get();
	}
});

