$(document).ready(function () {
	var re = /(\d{4})\/([A-Za-z]{3})\//;
	var matches = re.exec(window.location.pathname);
	if (matches && (matches.length == 3)) {
		var y = matches[1];
		var m = matches[2];
		calendar.init(y,m);
	} else if (window.location.pathname == '/events/') {
		var y = new Date().getFullYear();
		var m = new Date().getMonth();
		monthname=new Array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec");
		calendar.init(y,monthname[m],'/events/');
	}
});

function track(msg) {
	//$('#content').append('<p>'+msg);
}

calendar = {
	init: function (year, month, base) {
		if (!base) {
			var basere = /^(.+)\/\d{4}\//;
			var basematches = basere.exec(window.location.pathname);
			this.baseURL = basematches[1]+'/';
		} else this.baseURL = base;
		this.year = parseInt(year);
		this.month = month;
		$('#navCalendar').html('').removeClass('static');
		this.elements.header = $('<p class="calHead"></p>').appendTo('#navCalendar');
		this.elements.table = $('<table><thead><tr></tr></thead></table>').appendTo('#navCalendar');
		this.elements.tbody = $('<tbody><tr></tr><tr></tr><tr></tr><tr></tr>').appendTo(this.elements.table);
		this.elements.table.hover(function () {
			calendar.hover('month', $(this));
		}, function () { $(this).removeClass('active'); });
		this.initNavigation();
		$.getJSON(this.jsonBaseURL+'?year='+this.year+'&month='+this.month, function (data) { calendar.load(data) });
	},
	initNavigation: function () {
		this.elements.prev_month = $('<a href="." class="prev">Previous</a>').appendTo(this.elements.header);
		this.elements.prev_month.click(function () { calendar.changeMonth('prev'); return false; });
		this.elements.title = $('<span class="name"></span>').appendTo(this.elements.header);
		this.elements.next_month = $('<a href="." class="next">Next</a>').appendTo(this.elements.header);
		this.elements.next_month.click(function () { calendar.changeMonth('next'); return false; });
		this.elements.range = $('<div class="range"><p class="label">Range</p></div>').appendTo('#navCalendar');
		this.elements.range_ul = $('<ul class="ranges">').prependTo(this.elements.range);
		this.elements.range_day = $('<li id="rangeDay"><a href=".">Day</a></li>').appendTo(this.elements.range_ul);
		this.elements.range_week = $('<li id="rangeWeek"><a href=".">Week</a></li>').appendTo(this.elements.range_ul);
		this.elements.range_month = $('<li id="rangeMonth"><a href=".">Month</a></li>').appendTo(this.elements.range_ul);
		
		this.elements.range_day.click(function () { calendar.changeRange('day', this); return false; });
		this.elements.range_week.click(function () { calendar.changeRange('week', this); return false; });
		this.elements.range_month.click(function () { calendar.changeRange('month', this); return false; });
	},
	load: function (json) {
		this.year = parseInt(json['date'].verbose.split(' ').pop());
		this.month = json['date'].verbose.substr(0,3);
		this.prev_month = json['prev_date']; // format is Y/b, e.g. 2009/Jun
		this.next_month = json['next_date'];
		this.week_numbers = json['week_numbers'];
		this.elements.title.html(json['date'].verbose);
		if (!this.elements.table.find('thead th').length) {
			for (header in json['headers']) { this.elements.table.find('thead tr').append('<th>'+json['headers'][header].substr(0,1)); }
		}
		var month_cal = json['month_cal'];
		// remove or append a tr to match the month's weeks
		while (month_cal.length < this.elements.tbody.find('tr').length) {
			this.elements.tbody.find('tr:last').remove();
		}
		while (month_cal.length > this.elements.tbody.find('tr').length) {
			this.elements.tbody.append('<tr>');
		}
		for (var i=0; i<month_cal.length; i++) {
			var week = month_cal[i];
			var tr = this.elements.tbody.find('tr').eq(i);
			tr.attr('id','week-'+this.week_numbers[i]);
			for (var j=0; j<week.length; j++) {
				var day = week[j];
				var daystr = day['day'].split('-').pop();
				classname = day['in_month'] ? 'in' : 'out';
				if (tr.find('td').length >= j+1) var td = tr.find('td').eq(j);
				else var td = $('<td><a href="">x</a></td>').appendTo(tr);
				td.attr('className',classname).find('a').html(daystr);
			}
		}
		$('#navCalendar td a').click(function () { calendar.click('day', this); return false; }).hover(function () {
			calendar.hover('day', $(this));
		}, function () { $(this).removeClass('active'); });
		$('#navCalendar tbody tr').hover(function () {
			calendar.hover('week', $(this));
		}, function () { $(this).removeClass('active'); });
		this.activate();
	},
	activate: function() {
		var weekre = /(\d{4})\/([A-Za-z]{3})\/week\/(\d{1,2})\//;
		var dayre = /(\d{4})\/([A-Za-z]{3})\/(\d{2})\//;
		var week_match = weekre.exec(window.location.pathname);
		var day_match = dayre.exec(window.location.pathname);
		if (week_match) {
			this.elements.range_week.addClass('active');
			var selWeek = week_match[3];
			$('#week-'+selWeek).addClass('selected');
			calendar.range = calendar.context = 'week';
		} else if (day_match) {
			this.elements.range_day.addClass('active');
			var selDay = parseInt(day_match[3]) - 1;
			this.elements.tbody.find('td.in').eq(selDay).addClass('selected');
			calendar.range = calendar.context = 'day';
		} else {
			this.elements.range_month.addClass('active');
		}
	},
	jsonBaseURL: '/json/calendar/',
	baseURL: '',
	range: 'month',
	context: 'month',
	year: '',
	month: '',
	week_numbers: [],
	prev_month: '',
	next_month: '',
	elements: {},
	changeRange: function (val, elem) {
		this.range = val;
		$('#navCalendar .range li.active').removeClass('active');
		$(elem).addClass('active');
	},
	hover: function (type, elem) {
		if (type == this.range) elem.addClass('active');
	},
	click: function (type, elem) {
		track(type+' ['+calendar.range+']: '+$(elem).html());
		track($(elem).parents('.active').length);
		if ($(elem).parents('.active').length || elem.className == 'active') {
			var targetYear = this.year;
			var targetMonth = this.month;
			track('targets: '+targetYear+', '+targetMonth);
			if ((elem.parentNode.className == 'out' || $(elem).parents('td').eq(0).siblings('.out').length) && (this.month == 'Dec' || this.month == 'Jan')) {
				if ((this.range == 'week' && $(elem).parents('tr:first').find('td').eq(3).attr('className') == 'out') || this.range == 'day') {
					targetYear = this.month == 'Dec' ? this.year + 1 : this.year - 1;
					targetMonth = this.month == 'Dec' ? 'Jan' : 'Dec';
				}
			}
			track(targetYear+', '+targetMonth);
			if (calendar.range == 'month') window.location.href=this.baseURL+this.year+'/'+this.month+'/'; // click month
			else if (calendar.range == 'week') window.location.href=this.baseURL+targetYear+'/'+targetMonth+'/week/'+$(elem).parents('tr:first').attr('id').split('-').pop(); // click week
			else if (calendar.range == 'day') window.location.href=this.baseURL+targetYear+'/'+targetMonth+'/'+$(elem).html()+'/'; // click day
		}
	},
	changeMonth: function (dir) {
		var target = this.jsonBaseURL + '?year=' + this[dir+'_month'].split('/')[0] + '&month=' + this[dir+'_month'].split('/')[1];
		$.getJSON(target, function (data) { calendar.load(data) });
	}
}

