
$j = jQuery;
jQuery(document).ready(function() {

	// Render calendar
	renderCalendar(curData);

	// Add handlers to next/prev month links
	$j('#navigation-previous-month').click(gotoPreviousMonth);
	$j('#navigation-next-month').click(gotoNextMonth);
});

function gotoPreviousMonth() {
	
	// Can't go back beyond Jan 2009
	if(curYear==2009 && curMonth==1) {
		return false;
	}

	// Go back a month
	curMonth--;
	curYear -= curMonth<1 ? 1 : 0;
	curMonth = curMonth<1 ? 12 : curMonth;

	loadMonth();
	
	return false;
}

function gotoNextMonth() {

	// Can't go back beyond Dec 2014
	if(curYear==2014 && curMonth==12) {
		return false;
	}

	// Go back a month
	curMonth++;
	curYear += curMonth>12 ? 1 : 0;
	curMonth = curMonth>12 ? 1 : curMonth;

	loadMonth();
	
	return false;
}

var dataCache = {};
function loadMonth() {

	// Check cache
	if(dataCache[curYear+':'+curMonth]) {
		processMonthData(dataCache[curYear+':'+curMonth]);
	}

	// Load from server
	else {
		$j.post('/events/calendar/'+curYear+'/'+curMonth, {}, processMonthData);
	}
}

function processMonthData(data) {
	dataCache[curYear+':'+curMonth] = data;
	data = $j.evalJSON(data);
	var win = $j('#navigation-month-window');
	win.find('h3').removeClass().addClass(data.monthName.toLowerCase()).html('<span class="month">'+data.monthName+'</span> <span class="year year'+data.year+'">'+data.year+'</span>');
	win.find('em').html(data.eventCount+' items this month');
	win.css('left', -win.position().left).animate({left:0}, 250, 'swing');
	renderCalendar(data);
}

/**
* Renders the calendar from given data.
*
* @param object Events data (see IndexController::buildCalendar) for structure)
* @return void
*/
function renderCalendar(data) {
	var weeks = data.calendar[data.year][data.monthName];
	var tbody = $j('#calendar tbody');
	tbody.empty();
	
	for(var i=0; i<weeks.length; i++) {
		var row = $j('<tr></tr>');
		row.appendTo(tbody);
		var week = weeks[i];
		for(var j in week) {
			var abbr = '';
			if(j=='Sat') {
				var td = $j('<td class="sat-sun"></td>');
				td.appendTo(row);
				var cell = $j('<div class="micro"></div>');
				cell.appendTo(td);
				abbr = '<abbr class="Saturday">Sat</abbr>';
			}
			else if(j=='Sun') {
				var cell = $j('<div class="bottom micro"></div>');
				cell.appendTo($j(row.find('td')[5]));
				abbr = '<abbr class="Sunday">Sun</abbr>';
			}
			else {
				var cell = $j('<td></td>');
				cell.appendTo(row);
			}
			if(week[j].notcurrent) {
				cell.addClass('alt');
			}
			if(week[j].today==1) {
				cell.addClass('today');
			}
			cell.html('<em class="date"><span class="date'+week[j].date+'">'+week[j].date+'</span>'+abbr+'</em>');
			if(week[j].events) {
				var ul = $j('<ul></ul>');
				for(var eId in week[j].events) {
					try {
						var catClass = week[j].events[eId].issoldout==1 ? 'sold-out' : (week[j].events[eId].iscancelled==1 ? 'cancelled' : 'category'+week[j].events[eId].categoryindex)
						var li = $j('<li id="event-'+eId+'" class="'+catClass+'"><a href="/events/'+eId+'"></a></li>');
						li.find('a').html(week[j].events[eId].title);
						li.appendTo(ul);
						week[j].events[eId].tooltipClass = j=='Mon' || j=='Tue' ? 'alt' : '';
						
						li.bind('mouseenter', week[j].events[eId], hoverOver);
						li.bind('mouseleave', week[j].events[eId], hoverOut);
						li.css('z-index',(100+j));
					}
					catch(er)
					{
						//alert(er.message);	
					}
					
				}
				ul.appendTo(cell);
			}
		}
	}
}

function hoverOver(ev) {
	var h = '<div id="event-tooltip-wrapper"><div class="event-tooltip-content category(CATEGORY-INDEX)" id="event-tooltip">';
	h += '<h4>(EVENT TITLE)</h4><span class="time">(START)</span>';
	h += '<span class="location">(LOCATION)</span>';
	h += '<div class="details"><p>(DESCRIPTION)</p></div>';
	h += '<ul class="links"><li class="contact"><a href="mailto:CONTACT EMAIL" class="email">CONTACT EMAIL</a></li>';
	h += '<li class="view-event"><a href="">View event details</a></li>';
	h += '<li class="location"><a href="" class="map" target="_blank">View location map</a></li></ul></div><div class="event-tooltip-footer">&nbsp;</div></div>';

	var li = $j(ev.currentTarget);
	
	var intFarRight = $j(ev.currentTarget).position().left+430;
	if(intFarRight > $(window).width())
	{
		var altStyle = true;
	}
	else
	{
		var altStyle = false;
	}
	
	li.append(h);
	li.find('#event-tooltip-wrapper').addClass(ev.data.tooltipClass);
	
	if(altStyle)
	{
		li.find('#event-tooltip-wrapper').addClass('point-left');
	}
	
	li.find('#event-tooltip').removeClass().addClass(ev.data.issoldout==1 ? 'sold-out' : (ev.data.iscancelled==1 ? 'cancelled' : 'category'+ev.data.categoryindex));
	li.find('h4').html(ev.data.title);
	li.find('span.time').html("<strong>TIME:</strong> "+ev.data.datetime.timestart);
	li.find('span.location').html("<strong>PLACE:</strong> "+ev.data.location+", "+ev.data.postcode);
	li.find('div.details p').html(ev.data.teaser);
	li.find('a.email').attr('href', 'mailto:'+ev.data.contactemail).html('Contact '+ev.data.contactname);
	li.find('a.map').attr('href', 'http://maps.google.com/?q='+escape(ev.data.postcode));
	li.find('li.view-event a').attr('href', '/events/'+ev.data.id);
	
	var intLeft = li.position().left-1;
	
	if(altStyle)
	{
		var intLeft = li.position().left-253;
	}
	
	//li.find('#event-tooltip-wrapper')
	li.find('#event-tooltip-wrapper').fadeIn(50).css({
		position:'absolute',
		top:li.position().top - (li.find('#event-tooltip').height()+40),
		left:intLeft
	});
}

function hoverOut(ev) {
	var li = $j(ev.currentTarget);
	li.find('#event-tooltip-wrapper').fadeOut(50,function(){
		$(this).remove();
	});
}
