﻿var clockServiceUrl = "ServerTime.aspx";
var siteUpdatesServiceUrl = "GetUpdates.aspx";

var elClockDisplay;
var elLatencyDisplay;
var elUpdatesPanel;

var elLastLatencyEntry;
var elLastMessageEntry;

var cTime = "";
var latency = -1;
var respKey = "";
var firstRequest = true;
var clockTicking = false;
var curTime = new Date();

var defaultServiceTimer = 10000;

var clockTimer = null;
var serviceTimer = null;

function createClockTimer() {
	if (null != clockTimer) {
		clearInterval(clockTimer);
		clockTimer = null;
	}

	clockTimer = setInterval("clockTick()", 1000);
}

function createServiceTimer(interval) {
	if (null != serviceTimer) {
		clearTimeout(serviceTimer);
		serviceTimer = null;
	}

	setTimeout("getServerTime()", interval);
}

function getServerTime() {
	cTime = firstRequest ? -1 : curTime.getTime();
	$.getJSON(clockServiceUrl, { clientTime: cTime, requestKey: respKey }, gotServerTime);
}

function getSiteUpdates() {
	cTime = firstRequest ? -1 : curTime.getTime();
	$.getJSON(siteUpdatesServiceUrl, { clientTime: cTime, requestKey: respKey }, gotSiteUpdates);
}

function gotSiteUpdates(data) {
	if (data.MessageCount > 0) {
		displayUpdates(data);
	}
}

function gotServerTime(data) {
	firstRequest = false;
	latency = data.Latency;
	curTime = new Date(parseInt(data.ServerTime));
	displayLatency();
	if (!clockTicking) createClockTimer();
	createServiceTimer(defaultServiceTimer);
	getSiteUpdates();
}

function displayLatency() {
	var elToAppend = null;
	if (latency == -1) { elToAppend = $("<p>Initializing</p>"); }
	else { elToAppend = $("<p>" + latency + " ms</p>"); sendLatencyData(latency); }
	if (null == elLastLatencyEntry)
	{ elLastLatencyEntry = elToAppend.appendTo(elLatencyDisplay); }
	else { elLastLatencyEntry = elToAppend.prependTo(elLastLatencyEntry); }
}

function displayUpdates(data) {
	var elToAppend = $("<p>" + data.MessageCount + " updates </p>");
	if (null == elLastMessageEntry)
	{ elLastMessageEntry = elToAppend.appendTo(elUpdatesPanel); }
	else { elLastMessageEntry = elToAppend.prependTo(elLastMessageEntry); }
}

function clockTick() {
	clockTicking = true;
	curTime.setTime(curTime.getTime() + 1000);
	elClockDisplay.text(curTime.toString());
}

function errorDisplay(x) {
	$('#errorPanel').append('<p>Error [' + x.readyState + ']</p>');
//	getServerTime();
}

$(function() {
	$.ajaxSetup({
		timeout : 30000,
		error: errorDisplay,
		async: true
	});
	elClockDisplay = $('#clockDisplay');
	elLatencyDisplay = $('#latencyDisplay');
	elUpdatesPanel = $('#siteUpdatesPanel');
	getServerTime();
}); 