// JavaScript Document

(function() {
	// constants
	var constRequestTimeInterval = 8000; // request new invasion table every 8 seconds
	
	var container;
	var currentInvasionTable = new Array(0); // an array containing wrappers of an InvasionEntry object and DOM object
	var timeOnLastResult = 0; // the time when we got the last data result
	
	var doRequest = (function() {
		var ajaxObj = {
			url: 'http://ttwebinfo.dyndns.org/GetInvasionTable',
			dataType: 'jsonp',
			error: function(jqXHR, textStatus, errorThrown) {
				startTimeout();
			},
			success: function(data, textStatus, jqXHR) {
				parseResult(data);
				startTimeout();
			}
		};
		return function() {
			$.ajax(ajaxObj);
		};
	})();
	
	function startTimeout() {
		window.setTimeout(onTimeoutEvent, constRequestTimeInterval);
	}
	
	function onTimeoutEvent() {
		doRequest(); // do a new request
	};
	
	function onTimerEvent() {
		for (var i = 0; i < currentInvasionTable.length; i++) {
			refreshRemainingTime(i); // refresh remaining time for this table row
		};
	};
	
	function refreshRemainingTime(tableIndex) {
		var remaining = currentInvasionTable[tableIndex].invData.remaining - (new Date().getTime() - timeOnLastResult);
		if (remaining < 0)
			remaining = 0;
		currentInvasionTable[tableIndex].domObject.childNodes[3].childNodes[0].nodeValue = formatTimeInterval(remaining);
	}
	
	function parseResult(data) {
		if (data.result == 'InvasionTable') { // we got an invasion table
			timeOnLastResult = new Date().getTime();
			currentInvasionTable = new Array(data.list.length); // create new array for the wrappers
			for (var i = 0; i < data.list.length; i++) {
				currentInvasionTable[i] = { // create a wrapper of the InvasionEntry object and a <tr> (row) element
					invData: data.list[i],
					domObject: document.createElement('tr') // create a table row
				};
				currentInvasionTable[i].domObject.setAttribute('class', 'CogGroup' + Math.floor(currentInvasionTable[i].invData.cogNumber / 8));
				// create four columns in the row
				for (var z = 0; z < 4; z++) {
						currentInvasionTable[i].domObject.appendChild(document.createElement('td'));
				}
				// Insert District, Cog Type and Duration
				currentInvasionTable[i].domObject.childNodes[0].appendChild(document.createTextNode(currentInvasionTable[i].invData.district));
				currentInvasionTable[i].domObject.childNodes[1].appendChild(document.createTextNode(currentInvasionTable[i].invData.cogType));
				currentInvasionTable[i].domObject.childNodes[2].appendChild(document.createTextNode(formatTimeInterval(currentInvasionTable[i].invData.duration)));
				currentInvasionTable[i].domObject.childNodes[3].appendChild(document.createTextNode(''));
				refreshRemainingTime(i); // display the remaining time
			}
			
			// clear existing table contents and insert new ones
			container.innerHTML = '';
			var tableObj = document.createElement('table');
			tableObj.appendChild(createTableHeaders()); // add header to the table
			for (var i = 0; i < currentInvasionTable.length; i++) {
				tableObj.appendChild(currentInvasionTable[i].domObject); // add the rows to the table
			}
			container.appendChild(tableObj);
			
		};
	};
	
	var tableHeaders = ['District', 'Cog Type', 'Duration', 'Remaining'];
	function createTableHeaders() {
		var tr = document.createElement('tr');
		tr.setAttribute('class', 'invTableHeader');
		for (var i = 0; i < tableHeaders.length; i++) {
			var td = document.createElement('td');
			tr.appendChild(td);
			td.appendChild(document.createTextNode(tableHeaders[i]));
		}
		return tr;
	}
	
	$(document).ready(function() { // execute this when the DOM is ready
		container = document.getElementById('TTWebInfoInvasionTableContainer');
		container.innerHTML = 'Loading...';
		
		// set up a Timer to refresh the remaining time columns every 0.25 seconds
		window.setInterval(onTimerEvent, 250);
		
		// execute the first JSONP/AJAX request
		doRequest();
	});
	
	
	function formatTimeInterval(time) { // formats the time to "mm:ss" (the code is a bit 'dirty')
		var timeSeconds = Math.floor(time / 1000);
		var minutes = Math.floor(timeSeconds / 60);
		var seconds = timeSeconds % 60;
		var secondsStr = String(seconds);
		if (secondsStr.length < 2)
			secondsStr = "0" + secondsStr;
		return String(minutes) + ":" + secondsStr;
	};
		  
})();

