function calendarPopups( CSSSelector ) {
	var loadingContentTimeout = 0

	function loadEvents( eventTableCell ) {
		var URL2Load = $( ' > a', eventTableCell ).get(0).href + '/ajax';

		$( eventTableCell ).prepend( '<ins></ins>' );

		$( ' > ins ', eventTableCell ).load( URL2Load, null, (function( eventTableCell ){
				return function( data ) {
					$( ' > ins ', eventTableCell ).removeClass( 'hide' );
					$( ' ins > div.calendarDayEvents > ol.events', eventTableCell ).css( 'top', -$( ' ins > div.calendarDayEvents > ol.events', eventTableCell ).height()/4+'px');
				}
			})( eventTableCell ) );
	}

	function showEvents() {
		var hasEvents = $( ' > a', this )[0];
		if( !hasEvents ) {
			return;
		}

		var dayEventsLoaded = $( ' > ins', this )[0];
		if( !dayEventsLoaded ){
			if( loadingContentTimeout ) {
				clearTimeout( loadingContentTimeout );
			}
			loadingContentTimeout = setTimeout( (function( eventTableCell ){
					return function(){
						loadEvents( eventTableCell );
						}
					})( this ), 250 );
		}
		else {
			loadingContentTimeout = setTimeout( (function( dayEventsLoaded ){
					return function(){
						$( dayEventsLoaded ).removeClass( 'hide' );
						}
					})( dayEventsLoaded ), 250 );
		}
	}

	function hideEvents() {
		clearTimeout( loadingContentTimeout );
		$( CSSSelector + ' tbody td ins' ).addClass( 'hide' );

	}

	$( CSSSelector + ' tbody td' ).hover( showEvents, hideEvents );

}

function calendarReloader( container ) {
	function loadCalendar( container ) {
		return function() {
			$( container ).load( this.href + '/ajax', null, (function(){
						return function() {
							calendarPopups( container );
						}
					})( container ) );
			return false;
		}
	}

	$( container + ' caption a' ).live( 'click', loadCalendar( container ) );
}

calendarPopups( '#wrapperCalendar' );
calendarReloader( '#wrapperCalendar' );
