/**
 * @author Den Odell denodell@me.com
 */

/**
 * CALENDAR
 */

JK.Calendar = function(values) {
	var displayedMonth, startMonthForDisplay, endMonthForDisplay;
	var events = {};
	var months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
	var days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
	
	var fixData = function() {
		var today = new Date();
		displayedMonth = new Date(today.getFullYear(), today.getMonth(), "1");
		
		$.each(values, function(index) {
			values[index].startDate.setMonth(values[index].startDate.getMonth() - 1);
			values[index].endDate.setMonth(values[index].endDate.getMonth() - 1);
		});
		
		values.sort(function(a,b) {
			return a.startDate < b.startDate ? -1 : (a.startDate > b.startDate ? 1 : 0);
		});
		
		var earliestDate = new Date(today.getFullYear(), today.getMonth(), "1");
		if (values.length > 0) {
			earliestDate.setTime(values[0].startDate.getTime());
		}		
		var latestDate = new Date(today.getFullYear(), today.getMonth(), "1");
		if (values.length > 0) {
			latestDate.setTime(values[values.length - 1].endDate.getTime());
		}
		
		$.each(values, function() {
			if (this.endDate.getTime() > latestDate.getTime()) {
				latestDate.setTime(this.endDate.getTime());
			}
		});
		
		startMonthForDisplay = earliestDate;
		if (earliestDate > displayedMonth) {
			earliestDate.setTime(displayedMonth.getTime());
		}
		startMonthForDisplay.setDate(1);
		
		endMonthForDisplay = latestDate;
		endMonthForDisplay.setDate(1);
		
		for (var x = earliestDate.getFullYear(), limit = latestDate.getFullYear(); x <= limit; x++) {
			events[x] = {};
		}
		
		$.each(values, function() {
			if (!events[this.startDate.getFullYear()][this.startDate.getMonth() + 1]) {
				events[this.startDate.getFullYear()][this.startDate.getMonth() + 1] = {};
			}
			if (!events[this.endDate.getFullYear()][this.endDate.getMonth() + 1]) {
				events[this.endDate.getFullYear()][this.endDate.getMonth() + 1] = {};
			}
			
			var ONE_DAY = 1000 * 60 * 60 * 24
			var date1_ms = this.startDate.getTime();
			var date2_ms = this.endDate.getTime();
			var difference_ms = Math.abs(date1_ms - date2_ms)
		    var eventLengthInDays = Math.round(difference_ms/ONE_DAY) + 1;
			
			for (var x = 0; x < eventLengthInDays; x++) {
				var loopDate = new Date();
				loopDate.setTime(this.startDate.getTime());
				loopDate.setDate(this.startDate.getDate() + x);
				events[loopDate.getFullYear()][loopDate.getMonth() + 1][loopDate.getDate()] = {
					location: this.location,
					title: this.title,
					time: this.time
				};
			}
		});
	}
	
	
	var goPrevious = function() {
		var newDisplayedMonth = new Date(displayedMonth.getFullYear(), displayedMonth.getMonth() - 1, "1");
		if (newDisplayedMonth.getTime() > startMonthForDisplay.getTime()) {
			displayedMonth.setMonth(displayedMonth.getMonth() - 1);
		} else if (newDisplayedMonth.getTime() == startMonthForDisplay.getTime()) {
			displayedMonth.setMonth(displayedMonth.getMonth() - 1);
			$("#calendar-navigate-month-previous").hide();
		}
		
		if (newDisplayedMonth.getTime() < endMonthForDisplay.getTime()) {
			$("#calendar-navigate-month-next").show();
		}
		
		$("#month-title").attr('class', '');
		$("#month-title").addClass('month month-' + (displayedMonth.getMonth() + 1));
		$("#month-title").text(months[displayedMonth.getMonth()]);
		
		$("#year-title").attr('class', '');
		$("#year-title").addClass('year year-' + displayedMonth.getFullYear());
		$("#year-title").text(displayedMonth.getFullYear());
		
		buildMonth();
	}
	
	var goNext = function() {
		var newDisplayedMonth = new Date(displayedMonth.getFullYear(), displayedMonth.getMonth() + 1, "1");
		if (newDisplayedMonth.getTime() < endMonthForDisplay.getTime()) {
			displayedMonth.setMonth(displayedMonth.getMonth() + 1);
		} else if (newDisplayedMonth.getTime() == endMonthForDisplay.getTime()) {
			displayedMonth.setMonth(displayedMonth.getMonth() + 1);
			$("#calendar-navigate-month-next").hide();
		}
		
		if (newDisplayedMonth.getTime() > startMonthForDisplay.getTime()) {
			$("#calendar-navigate-month-previous").show();
		}
		
		$("#month-title").attr('class', '');
		$("#month-title").addClass('month month-' + (displayedMonth.getMonth() + 1));
		$("#month-title").text(months[displayedMonth.getMonth()]);
		
		$("#year-title").attr('class', '');
		$("#year-title").addClass('year year-' + displayedMonth.getFullYear());
		$("#year-title").text(displayedMonth.getFullYear());
		
		buildMonth();
	}
	
	var buildMonthNavigator = function() {
		var list = $("<ul>");
		var previous = $("<li>").addClass('previous');
		var previousLink = $("<a>").attr({
			'id': 'calendar-navigate-month-previous',
			'href': '#'
		}).click(function(e) {
			e.preventDefault();
			goPrevious();
		})
		previous.append(previousLink);
		var next = $("<li>").addClass("next");
		var nextLink = $("<a>").attr({
			'id': 'calendar-navigate-month-next',
			'href': '#'
		}).click(function(e) {
			e.preventDefault();
			goNext();
		})
		next.append(nextLink);
		list.append(previous);
		list.append(next);
		$("#month-navigator").append(list);

		if (displayedMonth.getTime() <= startMonthForDisplay.getTime()) {
			$("#calendar-navigate-month-previous").hide();
		}
		
		if (displayedMonth.getTime() >= endMonthForDisplay.getTime()) {
			$("#calendar-navigate-month-next").hide();
		}
	}
	
	var buildMonth = function() {
		var lastDateInDisplayedMonth = new Date();
		lastDateInDisplayedMonth.setTime(displayedMonth.getTime());
		lastDateInDisplayedMonth.setMonth(displayedMonth.getMonth() + 1);
		lastDateInDisplayedMonth.setDate(displayedMonth.getDate() - 1);
		
		var numberOfWeeks = Math.ceil((displayedMonth.getDay() + lastDateInDisplayedMonth.getDate()) / 7);		
		var tableBody = $("#calendar-selector tbody");
		tableBody.empty();
		
		for (var x = 0, limit = numberOfWeeks; x < limit; x++) {
			var tableRow = $("<tr>");
			for (var y = 1; y <= 7; y++) {
				var date = ((x * 7) + y - displayedMonth.getDay());
				var tableCell = $("<td>").addClass('day-' + date);
				if (date >= 1 && date <= lastDateInDisplayedMonth.getDate()) {
					var dateSpan = $("<span>").text(date);
					var dateLink = null;
					if (events[displayedMonth.getFullYear()] && events[displayedMonth.getFullYear()][displayedMonth.getMonth() + 1] && events[displayedMonth.getFullYear()][displayedMonth.getMonth() + 1][date]) {
						dateLink = $("<a>").attr('href', '#').click(function(e) {
							e.preventDefault();
							selectDate($(this).text());
						}).data('event', events[displayedMonth.getFullYear()][displayedMonth.getMonth() + 1][date]).append(dateSpan);
					}
					var dateDiv = $("<div>").append(dateLink ? dateLink : dateSpan);
					tableCell.append(dateDiv);
				}
				tableRow.append(tableCell);
			}
			tableBody.append(tableRow);
		}
		
		
		if (displayedMonth.getMonth() == (new Date()).getMonth() && displayedMonth.getYear() == (new Date()).getYear()) { // this month
			var haveRacesLeftInMonth = false;
			var todaysDate = (new Date()).getDate();
			$.each($(tableBody).find('td a'), function(){
				if (!haveRacesLeftInMonth && parseInt($(this).text()) > todaysDate) {
					haveRacesLeftInMonth = true;
					selectDate($(this).text());
				}
			});
			
			if (!haveRacesLeftInMonth) {
				selectDate();
			}
		}
		else { // future month
			if ((tableBody.find('td a').size() > 0)) {
				selectDate($(tableBody.find('td a').get(0)).text());
			} else {
				selectDate();
			}
		}	
	}
	
	var selectDate = function(date) {
		if (date) {
			$("td div.selected").removeClass('selected');
			var cell = $("td.day-" + date).find('div').addClass('selected');
			var event = $(cell.find('a').get(0)).data('event');
			$('#calendar-event-date').attr('class', '').addClass('date date-' + date).text(date);
			$('#calendar-event-title').text(event.title);
			$('#calendar-event-location').text(event.location);
			$('#calendar-event-time').text(event.time);
		} else {
			$('#calendar-event-date').attr('class', '').text("");
			$('#calendar-event-title').text('No upcoming races this month');
			$('#calendar-event-location').text('');
			$('#calendar-event-time').text('');
		}
	}
	
	fixData();
	buildMonthNavigator();
	buildMonth();
	$("#calendar-selector").removeClass("hide");
}

/**
 * GALLERY
 */

JK.Gallery = new function() {
	$(function() {
		$("#full-images").css('overflow', 'hidden').height($("#full-images").height() - 20);
		
		var currentImage = 1;
		var imageCount = $("#full-images img").size();
		var oneImageWidth = $($("#full-images img").get(0)).width();
		
		var previous = $("<li>").addClass('previous').hide().append($("<a>").attr("href", "#").text('Previous').click(function(e) {
			e.preventDefault();
			currentImage--;
			if (currentImage == 1) {
				previous.hide();
			}
			next.show();
			$('#full-images ul.images').animate({
				marginLeft: -((currentImage - 1) * oneImageWidth) + 'px'
			}, 250);
			$('#thumb-images li').removeClass('on');
			$('#thumb-images .image-' + currentImage).addClass('on');
		}));
		var next = $("<li>").addClass('next').hide().append($("<a>").attr("href", "#").text('Next').click(function(e) {
			e.preventDefault();
			currentImage++;
			previous.show();
			if (currentImage == imageCount) {
				next.hide();
			}
			$('#full-images ul.images').animate({
				marginLeft: -((currentImage - 1) * oneImageWidth) + 'px'
			}, 250);
			$('#thumb-images li').removeClass('on');
			$('#thumb-images .image-' + currentImage).addClass('on');
		}));
		
		if (imageCount > 1) {
			next.show();
		}
		
		var nav = $("<ul>");
		nav.addClass("nav").append(previous).append(next).appendTo($("#full-images"));
		$("#gallery").mouseenter(function() {
			$('ul.nav a').animate({
				opacity: 1
			}, 250);
		});
		$("#gallery").mouseleave(function() {
			$('ul.nav a').animate({
				opacity: 0.2
			}, 250);
		});
		$('ul.nav a').css('opacity', 0.2);
		
		$('#thumb-images .image-1').addClass('on');
		
		$("#thumb-images a").live('click', function(e) {
			e.preventDefault();
			var closestLi = $(this).closest('li');
			$("#thumb-images li").removeClass('li');
			closestLi.addClass('on');
			currentImage = parseInt(closestLi.attr('class').replace(/\slast/g, '').replace(/image-/g, ''));
			$('#full-images ul.images').animate({
				marginLeft: -((currentImage - 1) * oneImageWidth) + 'px'
			}, 250);
			next.show();
			previous.show();
			if (currentImage == 1) {
				previous.hide();
			}
			if (currentImage == imageCount) {
				next.hide();
			}
		});
	});
}();
