var Calendar = {

	container: null,

	year: null,
	month: null,
	day: null,

	init: function() {
		this.container = document.createElement('div');
		this.container.className = 'calendar';
		var form = document.getElementById('event_search');
		if (!form) return
		form.getElementsByTagName('fieldset')[0].appendChild(this.container);

		var date = new Date();
		Calendar.year = date.getFullYear();
		Calendar.month = date.getMonth();

		var whenLabel = document.getElementById('id_when_label');
		whenLabel.parentNode.removeChild(whenLabel);
		document.getElementById('id_when').style.visibility = 'hidden';
		document.getElementById('id_when').style.position = 'absolute';
		var date = document.getElementById('id_when').value;
		if (date.length == 10) {
			Calendar.year = parseInt(date.substring(0, 4));
			Calendar.month = date.substring(5, 7);
			if (Calendar.month.charAt(0) == '0') Calendar.month = Calendar.month.substring(1);
			Calendar.month = parseInt(Calendar.month) - 1;
			Calendar.day = date.substring(8);
			if (Calendar.day.charAt(0) == '0') Calendar.day = Calendar.day.substring(1);
			Calendar.day = parseInt(Calendar.day);
		} else {
			var range = document.getElementById('id_date_range');
			if (range) {
				range.oldSelectedIndex = range.selectedIndex;
				var option = document.createElement('option');
				option.innerHTML = 'any';
				range.insertBefore(option, range.getElementsByTagName('option')[0]);
				range.selectedIndex = 0;
				range.disabled = true;
			}
		}

		Calendar.setMonth(Calendar.year, Calendar.month);

	},

	setMonth: function(year, month) {

		var table = document.createElement('table');
		var tbody = document.createElement('tbody');
		table.appendChild(tbody);

		var tr = document.createElement('tr');
		for (var i = 0; i < 7; i++) {
			var th = document.createElement('th');
			th.innerHTML = Date.getDayName(i).substring(0, 1);
			tr.appendChild(th);
		}
		tbody.appendChild(tr);

		var today = new Date();
		today = new Date(today.getFullYear(), today.getMonth(), today.getDate());
		var date = new Date(year, month, 1);

		tr = document.createElement('tr');
		tbody.appendChild(tr);

		for (var i = 0; i < date.getDay(); i++) {
			var td = document.createElement('td');
			td.innerHTML = '&nbsp;';
			td.style.textAlign = 'center';
			tr.appendChild(td);
		}

		var daysInMonth = Date.daysInMonth(year, month)
		for (var i = 1; i <= daysInMonth; i++) {

			var td = document.createElement('td');
			td.id = 'calendar_day_' + year + '_' + month + '_' + i;
			td.innerHTML = i;
			td.date = new Date(year, month, i);

			if (td.date.getFullYear() == Calendar.year && td.date.getMonth() == Calendar.month && td.date.getDate() == Calendar.day) {
				td.className = 'day_selected';
			} else {
				td.className = 'day';
			}

			if (td.date.getTime() < today.getTime()) {
				td.className += ' past';
			} else {

				td.onmouseover = function() {
					this.className = 'day_selected';
				}

				td.onmouseout = function() {

					if (this.date.getFullYear() == Calendar.year && this.date.getMonth() == Calendar.month && this.date.getDate() == Calendar.day) {
					} else {
						this.className = 'day';
					}
				}

				td.onclick = function() {
					Calendar.selectDate(this.date.getFullYear(), this.date.getMonth(), this.date.getDate());
				}
			}

			if (td.date.getDay() == 0) {
				tr = document.createElement('tr');
				tbody.appendChild(tr);
			}
			tr.appendChild(td);
		}

		for (var i = new Date(year, month, daysInMonth).getDay() + 1; i < 7; i++) {
			var td = document.createElement('td');
			td.innerHTML = '&nbsp;';
			td.style.textAlign = 'center';
			tr.appendChild(td);
		}

		var leftArrow = document.createElement('img');
		leftArrow.src = '/media/img/core/calendar_left.png';
		leftArrow.onclick = function() {
			var newYear = year;
			var newMonth = month - 1;
			if (newMonth < 0) {
				newMonth += 12;
				newYear -= 1;
			}
			Calendar.setMonth(newYear, newMonth);
		}
		if (date.getTime() <= today.getTime()) {
			leftArrow.style.visibility = 'hidden';
		}

		var rightArrow = document.createElement('img');
		rightArrow.src = '/media/img/core/calendar_right.png';
		rightArrow.className = 'next';
		rightArrow.onclick = function() {
			var newYear = year;
			var newMonth = month + 1;
			if (newMonth >= 12) {
				newMonth -= 12;
				newYear += 1;
			}
			Calendar.setMonth(newYear, newMonth);
		}

		var monthName = document.createElement('div');

		monthName.appendChild(rightArrow);
		monthName.appendChild(leftArrow);
		monthName.appendChild(document.createTextNode(new Date(year, month, 1).getMonthName() + "\xA0" + ('' + year).substring(2)));

		var findButton = document.createElement('input');
		findButton.type  = "image";
		findButton.src   = "/media/img/core/find_events.png";
		findButton.value = "Go";
		
		var findButtonDiv = document.createElement('div');
		findButtonDiv.style.textAlign = "center";
		findButtonDiv.style.background = "none";
		findButtonDiv.style.margin = "0px";
		findButtonDiv.appendChild(findButton);

		this.container.innerHTML = '';
		this.container.appendChild(monthName);
		this.container.appendChild(table);
		this.container.appendChild(findButtonDiv);
	},

	selectDate: function(year, month, day) {
		if (Calendar.year == year && Calendar.month == month && Calendar.day == day) {
			Calendar.day = null;
			document.getElementById('id_when').value = '';
		} else {
			Calendar.year = year;
			Calendar.month = month;
			Calendar.day = day;
			document.getElementById('id_when').value = new Date(year, month, day).format('yyyy-MM-dd');
		}
		var form = document.getElementById('event_search').submit();
	}
}

Behaviour.addLoadEvent(function() {
	// Test for DOM goodness.
	if (!document.getElementById) return false;
	// Add the calendar to the page.
	Calendar.init();
	// Focus on first input.
	var content = document.getElementById('content');
	var inputs = content.getElementsByTagName('input');
	if (inputs.length > 1 && inputs[1].id == 'id_keywords') {
		inputs[1].focus();
		inputs[1].select();
	}
});
