var spinner_id = null;
var filter_id_race = null;
var filter_id_track = null;
var filter_id_test = null;
var filter_id_year = null;
var filter_options = null;
var calendar_tbody_id = null;
var page_previous = null;
var page_next = null

var data = null;
var data_filtered = null;
var page = null;
var page_current = 0;
var page_max = 1;
var calendar_items_per_page = 7;

function render_item(item)
{
	var out = '';
	var not_present = '<td><img src="/media/images/icons/not-present.png" alt="X" /></td>';

	out += '<tr id="event-' + item.id + '"><td><div>';
	if ("" != item.track_logo_url)
	{
		out += '<img src="' + item.track_logo_url + '" alt="' + item.track_name + '" title="' + item.track_name + '" />';
	}
	out += '<h1>' + item.event_name + '</h1><span>' + item.event_daterange + '</span></div></td>';
	out += '<td class="event-type"><img src="/media/images/icons/' + item.type_slug + '.png" alt="" /><span>' + item.type_display + '</span></td>';
	if ("" != item.report_url)
	{
		out += '<td><a href="' + item.report_url + '"><img src="/media/images/icons/race-report.png" alt="" /><span>View report</span></a></td>';
	} else
	{
		out += not_present;
	}

	if ("" != item.gallery_url)
	{
		out += '<td><a href="' + item.gallery_url + '"><img src="/media/images/icons/photo-gallery.png" alt="" /><span>View gallery</span></a></td>';
	} else
	{
		out += not_present;
	}

	out += not_present;
	out += not_present;
	out += "</tr>";
	return out;
}

function render_blank(item)
{
	var out = '';
	out += '<tr class="blank"><td colspan="6"><h1>There are no events that match the specified filters.</h1></td></tr>';
	return out;
}

function filter_state_get(name)
{
	if ("race" == name)
	{
		return filter_id_race.is(":checked");
	} else if ("track" == name)
	{
		return filter_id_track.is(":checked");
	} else if ("sponsor" == name)
	{
		return filter_id_test.is(":checked");
	} else if ("year" == name)
	{
		return filter_id_year.val();
	}
	return false;
}

function spinner_set(state)
{
	if (1 == state)
	{
		spinner_id.fadeIn(200);
	} else
	{
		spinner_id.fadeOut(200);
	}
}

function filter(e)
{
	data_filtered = new Array();
	spinner_set(1);
	if (filter_options.length != 0)
	{
		race = filter_state_get("race");
		track = filter_state_get("track");
		sponsor = filter_state_get("sponsor");
	} else
	{
		race = true;
		track = false;
		sponsor = false;
	}
	year = filter_state_get("year");

	$.each(data, function (i, j)
	{
		if (j.year != year)
		{
			return true;
		}
		if (race && j.type == 1)
		{
			data_filtered.push(j);
			return true;
		} else if (track && j.type == 2)
		{
			data_filtered.push(j);
			return true;
		} else if (sponsor && j.type == 3)
		{
			data_filtered.push(j);
			return true;
		}		
	});

	page = 0;
	page_current = 0;
	page_max = Math.ceil(data_filtered.length / calendar_items_per_page) - 1;
	render();
}

function render()
{
	needs_update = 0;

	if (page != page_current)
	{
		needs_update = 1;
	}

	if (0 < data_filtered.length)
	{
		newcode = "";
		$.each(data_filtered, function (i, j)
		{
			if (
				i < (page_current * calendar_items_per_page)
				|| i > ((page_current + 1) * calendar_items_per_page - 1)
			)
			{
				return true;
			}

			newcode += render_item(j);

			if (
				!needs_update
				&& calendar_tbody_id.find('tr[id="event-' + j.id + '"]').length == 0
			)
			{
				needs_update = 1;
			} else if (
				!needs_update
				&& calendar_tbody_id.find('tr').length > data_filtered.length
			)
			{
				needs_update = 1;
			}
		});
	} else
	{
		if (calendar_tbody_id.find('tr[class="blank"]').length == 0)
		{
			needs_update = 1;
			newcode = render_blank();
		}
	}

	if (!needs_update)
	{
		spinner_set(0);
		return;
	}

	update_page_nav();
	calendar_tbody_id.fadeOut(500, swap_code);

	spinner_set(0);
}

function swap_code()
{
	calendar_tbody_id.html(newcode);
	calendar_tbody_id.fadeIn(500);
	page = page_current;
}

function update_page_nav()
{
	if (page_current == 0)
	{
		page_previous.hide(500);
	} else
	{
		page_previous.show(500);
	}

	if (page_current == page_max)
	{
		page_next.hide(500);
	} else
	{
		page_next.show(500);
	}
}

$(function()
{
	$("#team-calendar-options").append("<div id=\"spinner\"></div>");
	spinner_id = $("#spinner");

	calendar_tbody_id = $("#team-calendar-table tbody");
	filter_id_race = $("#team-calendar-show-race input");
	filter_id_track = $("#team-calendar-show-track input");
	filter_id_test = $("#team-calendar-show-test input");
	filter_id_year = $("#team-calendar-year-select");
	filter_options = $("#team-calendar-options-right");
	page_previous = $("#page-previous");
	page_next = $("#page-next");
	$("body").addClass("js");
	$("#team-calendar-options-right div input").click(filter);
	page_previous.click(function ()
	{
		if (null == data_filtered)
		{
			return;
		}

		spinner_set(1);
		if (page_current > 0)
		{
			page_current -= 1;
		}
		render();
	});
	page_next.click(function ()
	{
		if (null == data_filtered)
		{
			return;
		}

		spinner_set(1);
		if (page_current < page_max)
		{
			page_current += 1;
		}
		render();
	});
	filter_id_year.change(filter);
	$.getJSON("/calendar/all_events.json", function(d)
	{
		data = d;
		filter();
	});
});
