$.fn.left = function(val) {
	if (typeof val === 'undefined')
		return parseInt(this.css('left').replace('px', ''));
		
	this.css('left', val);
}

var getRandomSpeed = function() {
	return 500 + Math.random() * 500;
}

$(function() {
	/*/91.5917f7d413074b62e7d8000400/12.d71ee53130855e2351800017993.html*/
	var canHoverEvents = true;
	$('.month-next').live('click', function() {
		CALENDAR.baseDate.setDate(CALENDAR.baseDate.getDate() + CALENDAR.daysToShow);
		
		canHoverEvents = false;
		$('.calendar .day').animate({left: '-=984px'}, 1100, function() { canHoverEvents = true; });
		$('.calendar .event').each(function() {
			$(this).animate({left: '-=984px'}, getRandomSpeed());
		});
		
		$('.calendar .month').each(function() {
			$(this).animate({left: '-=984px'}, 900);
		});
		
		loadNextIfNeeded();
		
		return false;
	});
	
	$('.month-prev').live('click', function() {
		CALENDAR.baseDate.setDate(CALENDAR.baseDate.getDate() - CALENDAR.daysToShow);
		
		canHoverEvents = false;
		$('.calendar .day').animate({left: '+=984px'}, 1100, function() { canHoverEvents = true; });
		$('.calendar .event').each(function() {
			$(this).animate({left: '+=984px'}, getRandomSpeed());
		});
		
		$('.calendar .month').each(function() {
			$(this).animate({left: '+=984px'}, 900);
		});
		
		loadPrevIfNeeded();
		
		return false;
	});
	
	var loadNextIfNeeded = function() {
		if (CALENDAR.baseDate.getTime() >= CALENDAR.loadedTo.getTime() - CALENDAR.daysToShow * 86400000) {
			// console.log('loading...', CALENDAR.baseDate);
			$.post('/91.5ff0ccf12f2c7b78bc800011259/12.46a90da9130a1e9698d800014268.portet', { date: CALENDAR.baseDate.getTime()}, function(html) {
				CALENDAR.loadedTo = new Date(CALENDAR.loadedTo.getTime() + CALENDAR.daysToShow * 86400000);
				
				html = $(html);
				var cal = $('.calendar');
				html.find('.day').each(function() {
					var day = $(this);
					var exists = $('#' + day.attr('id')).length > 0;
					
					if (!exists) {
						cal.append(day);
					}
				});
				
				html.find('.event').each(function() {
					var evt = $(this);
					var exists = $('#' + evt.attr('id')).length > 0;
					
					if (!exists) {
						cal.append(evt);
					}
				});
				
				html.find('.month').each(function() {
					var mo = $(this);
					var exists = $('#' + mo.attr('id')).length > 0;
					
					if (!exists) {
						cal.append(mo);
					}
				});
			});
		}
	}
	
	var loadPrevIfNeeded = function() {
		if (CALENDAR.baseDate.getTime() <= CALENDAR.loadedFrom.getTime() + CALENDAR.daysToShow * 86400000) {
			// console.log('loading...', CALENDAR.baseDate.toString());
			$.post('/91.5ff0ccf12f2c7b78bc800011259/12.46a90da9130a1e9698d800014268.portet', { date: CALENDAR.baseDate.getTime()}, function(html) {
				CALENDAR.loadedFrom = new Date(CALENDAR.loadedFrom.getTime() - CALENDAR.daysToShow * 86400000);
				
				html = $(html);
				var cal = $('.calendar');
				html.find('.day').each(function() {
					var day = $(this);
					var exists = $('#' + day.attr('id')).length > 0;
					
					if (!exists) {
						cal.append(day);
					}
				});
				
				html.find('.event').each(function() {
					var evt = $(this);
					var exists = $('#' + evt.attr('id')).length > 0;
					
					if (!exists) {
						cal.append(evt);
					}
				});
				
				html.find('.month').each(function() {
					var mo = $(this);
					var exists = $('#' + mo.attr('id')).length > 0;
					
					if (!exists) {
						cal.append(mo);
					}
				});
			});
		}
	}
	
	var prevDay = function() {
		CALENDAR.baseDate.setDate(CALENDAR.baseDate.getDate() - 7);
		
		canHoverEvents = false;
		$('.calendar .day').animate({left: '+=' + CALENDAR.dayWidth * 7 + 'px'}, 500, function() { canHoverEvents = true; });
		$('.calendar .event').each(function() {
			$(this).animate({left: '+=' + CALENDAR.dayWidth * 7 + 'px'}, 400);
		});
		
		$('.calendar .month').each(function() {
			$(this).animate({left: '+=' + CALENDAR.dayWidth * 7 + 'px'}, 500);
		});
		
		loadPrevIfNeeded();
	};
	
	var nextDay = function() {
		CALENDAR.baseDate.setDate(CALENDAR.baseDate.getDate() + 7);
		
		canHoverEvents = false;
		$('.calendar .day').animate({left: '-=' + CALENDAR.dayWidth * 7 + 'px'}, 500, function() { canHoverEvents = true; });
		$('.calendar .event').each(function() {
			$(this).animate({left: '-=' + CALENDAR.dayWidth * 7 + 'px'}, 400);
		});
		
		$('.calendar .month').each(function() {
			$(this).animate({left: '-=' + CALENDAR.dayWidth * 7 + 'px'}, 500);
		});
		
		loadNextIfNeeded();
	};
	
	//
	// expose in calendar
	CALENDAR.nextDay = nextDay;
	CALENDAR.prevDay = prevDay;
	
	$('.event').live('click', function(evt) {
		window.location.href = $(this).data('url');
	});
	
	$('.event').live("mouseenter mouseleave", function(event) {
		if (!canHoverEvents)
			return;
		
		var obj = $(this);
		if (event.type == "mouseenter") {
			if (!obj.data('width'))
				obj.data('width', obj.width());
				
			obj.find('.event-name').hide();
			
			var from = obj.left();
			var to = obj.left() + obj.width();
			var diff = from < 0 ? 0 - from : 0;
			
			if (from < 0) {
				obj.find('.event-details').left(0 - from);
			} else {
				obj.find('.event-details').left(0);
			}
			
			obj.stop().css('z-index', 99).animate({'height': obj.find('.event-details').outerHeight()+10, 'width': Math.max(obj.width() + diff + 10, 210 + diff)}, 200, function() {
				obj.find('.event-details').fadeIn(200);
			});
			
			$('#day-marker').css({left: from, width: obj.width()}).stop().show();
			$('.day').each(function() {
				var d = $(this);
				if (d.left() >= from-2 && d.left() < to) {
					d.addClass('marked');
				}
			});
		} else {
			obj.find('.event-details').hide();
			$('#day-marker').hide();
			$('.day.marked').removeClass('marked');
			
			obj.stop().css('z-index', 1).animate({'height': 15, width: obj.data('width')}, 100, function() {
				obj.find('.event-name').fadeIn(300);
			});
		}
	});
});

/*$.post('/91.5917f7d413074b62e7d8000400/12.d71ee53130855e2351800017993.portlet', {date: d.getTime()}, function(html) {
			console.log(html);
			html = $(html);
			
			var days = $('.calendar .day').each(function() {
				$(this).data('nl', '-=984px');
			});
			
			html.find('.day').each(function() {
				var day = $(this);
				if ($('#' + day.attr('id')).data('nl', day.css('left')).length == 0) {
					day.left(day.left() + 984);
					$('.calendar').append(day);
					day.data('nl', day.left() - 984 + 'px');
					
					days = days.add(day);
				}
			});
			
			days.each(function() {
				var day = $(this);
					console.log(day.attr('id'));
				day.animate({'left': day.data('nl')}, 500);
			});
		});*/
