(function($) {
	
	//variables
	var _calendar, _hoverElement, _lastHover;
	var _hoverMarkup = '<div id="calendarhover"></div>';
	var _hideTimeout;
	
	//calendarMouseEnter
	//handle the mouse enter event of the calendar
	//
	//@param e : object : the event object
	function calendarMouseOver(e) {
		var self = $(e.target);
		_lastHover = self;
		
		if (self.siblings('ul').size() == 0)
			return;
			
		if (!_hoverElement)
			_hoverElement = $(_hoverMarkup).appendTo('body');
			
		_hoverElement.empty().append(self.siblings('ul').clone()).append('<div></div>');
		
		var sw = self.width()/2;
		var offset = self.offset();
		var ow = _hoverElement.outerWidth();
		
		var l = offset.left - (ow * .775) + sw;
		var t = offset.top - _hoverElement.outerHeight();
		
		var css = { 'top': t, 'left': l };
		
		if (_hideTimeout) {
			clearTimeout(_hideTimeout);
			_hideTimeout = undefined;
		}
		
		if (_hoverElement.is(':visible'))
			_hoverElement.hide();
		
		_hoverElement.css(css).fadeIn(200).bind('mouseover', hoverElementOver);
		
		self.bind('mouseout', calendarMouseOut);
	}
	
	//removeHoverElement
	//fade out and remove the hover element
	function removeHoverElement() {
		if (_hoverElement)
			_hoverElement.fadeOut(200, function() { _hoverElement.remove(); _hoverElement = undefined; });
	}
	
	//hoverElementOver
	//handle the mouse over event for the hover element itself
	//
	//@param e : object : the event object
	function hoverElementOver(e) {
		var self = $(e.target);
		
		if (_hideTimeout) {
			clearTimeout(_hideTimeout);
			_hideTimeout = undefined;
		}
		
		self.bind('mouseout', calendarMouseOut);
	}
	
	//calendarMouseLeave
	//handle the mouse leave event of the calendar
	//
	//@param e : object : the event object
	function calendarMouseOut(e) {
		var self = $(e.target);
		
		if (_hoverElement) {
			if (_hideTimeout) {
				self.unbind('mouseleave');
			} else {
				_hideTimeout = setTimeout(removeHoverElement, 500);
			}
		}
	}
	
	//get started
	$(document).ready(function() {
		
		//return if there's no calendar on the page
		if ($('#eventscalendar').size() == 0)
			return;
		
		_calendar = $('#eventscalendar');
		
		_calendar.find('tbody td span').bind('mouseover', calendarMouseOver);
		
	});
	
})(jQuery);