/* UTILITY FUNCTIONS */

// adds a simple templating method to strings
String.prototype.supplant = function (o) {
    return this.replace(/{([^{}]*)}/g,
        function (a, b) {
            var r = o[b];
            return typeof r === "string" || typeof r === "number" ? r : a;
        }
    );
};

// adds a method to array to check if a value is already present
Array.prototype.contains = function (val) {
	for (var i = 0, len = this.length; i < len; i += 1) {
		if (this[i] === val) return true;
	}
	return false;
};

// adds a leading zero to numbers less than 10
function padTime(num) {
	if (num < 10) {
		return "0" + num;
	} else {
		return "" + num;
	}
}

/* LIVE RESULTS FUNCTIONS */

function buildResult(result) {
	var race = {};
	var output = "";
	var time = new Date(Date.parse($(result).attr("time")));
	race.time = padTime(time.getHours()) + ":" + padTime(time.getMinutes());
	race.course = $(result).attr("course");
	race.name = $(result).attr("name");
	race.url = $(result).attr("url");
	race.country = ($(result).attr("country") === "uk") ? "uk" : "ireland";
	output += "\n<div class=\"race " + race.country + "\">\n";
	output += raceTemplate.supplant(race);
	output += "<table>\n<tbody>\n";
	$("finish", result).each(function (i) {
		var finish = {};
		finish.position =  $(this).attr("position");
		finish.sp = $(this).attr("sp");
		finish.sn = $(this).attr("sn");
		finish.horse = $(this).attr("horse");
		finish.horseid = $(this).attr("horseid");
		output += finishTemplate.supplant(finish);
	});
	output += "</tbody>\n</table>\n";
	output += "</div>\n";
	return output;
}

function buildResults(data) {
	var race;
	var raceId;
	var races = $("race", data).get().reverse();
	$("#no-results").remove();
	for (var i = 0, len = races.length; i < len; i += 1) {
		race = races[i];
		raceId = $(race).attr("url");
		if (!raceIds.contains(raceId)) {
			raceIds.push(raceId);
			$("#live-results").prepend(buildResult(race));
			if (!firstRun) {
				$("#live-results div:first").hide().slideDown("slow");
			}
		}
		$("#live-results .race").removeClass("new").removeClass("newish");
		$("#live-results .race").eq(0).addClass("new");
		$("#live-results .race").eq(1).addClass("newish");
	}
	if (len === 0) {
		$("#live-results").prepend("<p id=\"no-results\">There are no results in!</p>");
	}
	firstRun = false;
}

function updateResults() {
	$("#update-results").addClass("loading");
	$.ajax({
		method: "GET",
		url: feedURL,
		ifModified: true,
		success: function (data, textStatus) {
			buildResults(data);
		},
		complete: function (xhr, status) {
			filterResults();
			$("#update-results").removeClass("loading");
		}
	});
	timeout = setTimeout(updateResults, 60000);
}

function filterResults() {
	if ($("#live-filter input:checked").val() === "all-results") {
		$("#live-results").addClass("all-results").removeClass("irish-results");
	} else {
		$("#live-results").addClass("irish-results").removeClass("all-results");
	}
}

/* NEWS CAROUSEL FUNCTIONS */

function adjustNewsHeight(index) {
	$("#featured-news").animate(
		{ height: $("#news-items div").eq(index).height() + 40 },
		{ duration: 300 }
	);
}

function slideNewsTo(index) {
	if (!newsAnimating) {
		newsAnimating = true;
		$("#news-items").animate(
			{left: -(index * newsWidth)},
			{
				duration: 300, 
				complete: function () {
					newsAnimating = false;
					adjustNewsHeight(index);
				}
			}
		);
		setSelectedNews(index);
	}
}

function setSelectedNews(index) {
	currentNewsItem = index;
	$("#news-menu li").removeClass("selected");
	$("#news-menu li").eq(index).addClass("selected");
	(index === 0) ? $("#news-prev img").attr("src", "/images/prev-disabled.png") : $("#news-prev img").attr("src", "/images/prev.png");
	(index === (newsItemCount - 1)) ? $("#news-next img").attr("src", "/images/next-disabled.png") : $("#news-next img").attr("src", "/images/next.png");
}

/* GLOBALS */

/* LIVE RESULTS GLOBALS */
var timeout;
var firstRun = true;
var feedURL = "xml/panelfeed.xml";
var raceTemplate = "<p class=\"course\">{course}</p>\n<h2><a href=\"{url}\">{time}</a></h2>\n<h3><a href=\"{url}\">{name}</a></h3>\n";
var finishTemplate = "<tr>\n<td class=\"pos\">{position}</td>\n<td class=\"sp\">{sp}</td>\n<td class=\"sn\">{sn}.</td>\n<td><a href=\"/v5horseinfo?prt={horseid}\">{horse}</a></td>\n</tr>\n";
var raceIds = [];
var currentResultsFeed;

/* NEWS CAROUSEL GLOBALS */

var newsWidth = 540;
var newsItemCount;
var currentNewsItem = 0;
var newsAnimating = false;

$(document).ready(function () {
							
	/* LIVE RESULTS */
	updateResults();
	$("#update-results span").click(function () {
		clearTimeout(timeout);
		updateResults();
	});
	
	$("#live-filter input").click(function () {
		filterResults();
	});
	
	/* ACCORDION WIDGET */
	$("#widget > h2").click(function () {
		var clickIndex = $("#widget > h2").index(this);
		var currentIndex = $("#widget > div").index($("#widget > div:visible"));
		if (clickIndex !== currentIndex) {
			$("#widget > h2").removeClass("open");
			$(this).addClass("open");
			$("#widget > div:visible").slideUp("slow");
			$("#widget > div").eq(clickIndex).slideDown("slow");
		}
	});

	/* SIDE ACCORDION WIDGET */
	$("#sidewidget > h2").click(function () {
		var clickIndex = $("#sidewidget > h2").index(this);
		var currentIndex = $("#sidewidget > div").index($("#sidewidget > div:visible"));
		if (clickIndex !== currentIndex) {
			$("#sidewidget > h2").removeClass("open");
			$(this).addClass("open");
			$("#sidewidget > div:visible").slideUp("slow");
			$("#sidewidget > div").eq(clickIndex).slideDown("slow");
		}
	});

	/* PLUS ACCORDION WIDGET */
	$("#pluswidget > h2").click(function () {
		var clickIndex = $("#pluswidget > h2").index(this);
		var currentIndex = $("#pluswidget > div").index($("#pluswidget > div:visible"));
		if (clickIndex !== currentIndex) {
			$("#pluswidget > h2").removeClass("open");
			$(this).addClass("open");
			$("#pluswidget > div:visible").slideUp("slow");
			$("#pluswidget > div").eq(clickIndex).slideDown("slow");
		}
	});

	
	/* NEWS TABS */
	
	$("#news-tabs li").click(function () {
		var clickIndex = $("#news-tabs li").index(this);
		$("#news-tabs li").removeClass("selected");
		$(this).addClass("selected");
		$("#news-panel > div").hide();
		if (!$.browser.msie) {
			$("#news-panel > div").eq(clickIndex).fadeIn("fast");
		} else {
			$("#news-panel > div").eq(clickIndex).show();
		}
	});
	
	/* NEWS CAROUSEL */	
	
	$("#news-container").height($("#news-items").height());
	
	adjustNewsHeight(0);
	
	newsItemCount = $("#news-menu li").length;

	$("#news-menu li").click(function () {
		var clickIndex = $("#news-menu li").index(this);
		slideNewsTo(clickIndex);
	});
	
	$("#news-prev").click(function () {
		if (currentNewsItem > 0) {
			slideNewsTo(currentNewsItem - 1);
		}
	});
	
	$("#news-next").click(function () {
		if (currentNewsItem < (newsItemCount - 1)) {
			slideNewsTo(currentNewsItem + 1);
		}
	});	
	
});