
Date.prototype.setISO8601 = function(dString){
	var regexp = /(\d\d\d\d)(-)?(\d\d)(-)?(\d\d)(T)?(\d\d)(:)?(\d\d)(:)?(\d\d)(\.\d+)?(Z|([+-])(\d\d)(:)?(\d\d))/;
	var d = dString.match(regexp);
	var offset = 0;

	this.setUTCDate(1);
	this.setUTCFullYear(parseInt(d[1],10));
	this.setUTCMonth(parseInt(d[3],10) - 1);
	this.setUTCDate(parseInt(d[5],10));
	this.setUTCHours(parseInt(d[7],10));
	this.setUTCMinutes(parseInt(d[9],10));
	this.setUTCSeconds(parseInt(d[11],10));

	if (d[12])
		this.setUTCMilliseconds(parseFloat(d[12]) * 1000);
	else
		this.setUTCMilliseconds(0);
	if (d[13] != 'Z') {
		offset = (d[15] * 60) + parseInt(d[17],10);
		offset *= ((d[14] == '-') ? -1 : 1);
		this.setTime(this.getTime() - offset * 60 * 1000);
	}
	return this;
};

var events = [
];
var last_event = null;

function fetch_events() {
	$.getJSON("/recent-events", function(data) {
		events = data;
	});
}

function next_event() {
	if (events.length < 2)
		fetch_events();
	
	if (events.length > 0) {
		return events.shift();
	}

	return null;
}

function format_timestamped_event(event) {
	var now = new Date();
	var eventTimestamp = new Date();
	eventTimestamp.setISO8601(event['timestamp']);
	
	var seconds = Math.ceil(
		(now.getTime() - eventTimestamp.getTime()) / 1000
	);
	
	if (seconds < 1)
		// Someone's clock is out of synch -- fudge it.
		return "A few seconds ago, " + event['description'];
	else if (seconds == 1)
		return "1 second ago, " + event['description'];
	else if (seconds < 60)
		return seconds + " seconds ago, " + event['description'];
	else
		return ""; // stale event.
}

function format_event(event) {
	if (!event)
		return "";
	
	if (event['timestamp'])
		return format_timestamped_event(event);
	
	return event['description'];
}

function update_ticker() {
	var event = next_event();
	var ticker = $("#event-ticker");

	if (!last_event || event['description'] != last_event['description']) {
		ticker.fadeOut(500, function () {
			ticker.html(format_event(event));
			window.last_event = event;
			ticker.fadeIn(500);
		});
	} else {
		ticker.fadeOut(500);
	}
}

function on_timeout() {
	update_ticker();
	setTimeout(on_timeout, 5000);
}

$.getJSON("/recent-events", function(data) {
	events = data;
	on_timeout();
});


