/* Reaction speed test - by Fredrik Fornwall [http://fornwall.net/] */

var REPEATED = 15;
var name = null;
var active = false;
var shouldPress = false;

var startTime = null;

var statsDisplay = null;
var instructionsDisplay = null;

var lastDisplay = null;
var slowestDisplay = null;
var fastestDisplay = null;
var countDisplay = null;
var centerDiv = null;

function init() {
	centerDiv = document.getElementsByTagName('div').item(1);

	statsDisplay = document.getElementById('statsDisplay');
	instructionsDisplay = document.getElementById('instructionsDisplay');
        countDisplay = document.getElementById('countDisplay');
	lastDisplay = document.getElementById('lastDisplay');
	fastestDisplay = document.getElementById('fastestDisplay');
	slowestDisplay = document.getElementById('slowestDisplay');

	centerDiv.removeChild(statsDisplay);
	statsDisplay.style.visibility = 'visible';

	toggleDisplay();
}

function toggleDisplay() {
	try {
		if (active) {
			centerDiv.replaceChild(statsDisplay, instructionsDisplay);
		} else {
			centerDiv.replaceChild(instructionsDisplay, statsDisplay);
		}
	} catch (e) {
	}
}

function stop() {
	active = false;
	toggleDisplay();
}

function start() {      
        active = true;
	toggleDisplay();
        shouldPress = false;
        totalTime = 0;
        
        countDisplay.replaceChild(document.createTextNode('0 / ' + REPEATED), countDisplay.firstChild);

	lastDisplay.replaceChild(document.createTextNode(''), lastDisplay.firstChild);
	slowestDisplay.replaceChild(document.createTextNode(''), slowestDisplay.firstChild);
	fastestDisplay.replaceChild(document.createTextNode(''), fastestDisplay.firstChild);

        intervalCount = 0;
        active = true;
        fastestTime = 100000;
        slowestTime = -1;
	nextInterval();
}

function nextInterval() {
        if (intervalCount == REPEATED) {
		while (name == null || name == '') {
			name = prompt('Enter your name:', getCookie('name'));
		}
		document.cookie = 'name=' + name + '; expires=' + new Date('January 1, 2007').toGMTString();

                var body = document.getElementsByTagName('body')[0];
                var form = document.createElement('form');
        	form.setAttribute('method', 'post');
        	form.setAttribute('action', '/games/highscore/?game=reaction');
        	form.setAttribute('style', 'display: none;');
        	body.appendChild(form);
	        var input = document.createElement("input");
	        input.setAttribute('type', 'text');
	        input.setAttribute('name', 'name');
	        input.setAttribute('value', name);
	        form.appendChild(input);
	        var scoreInput = document.createElement('input');
	        scoreInput.setAttribute('type', 'text');
	        scoreInput.setAttribute('name', 'speed');
	        scoreInput.setAttribute('value', totalTime / REPEATED);
        	var fastestInput = document.createElement('input');
	        fastestInput.setAttribute('type', 'text');
	        fastestInput.setAttribute('name', 'fastest');
	        fastestInput.setAttribute('value', fastestTime);
 	        var slowestInput = document.createElement('input');
	        slowestInput.setAttribute('type', 'text');
	        slowestInput.setAttribute('name', 'slowest');
	        slowestInput.setAttribute('value', slowestTime);
	        form.appendChild(scoreInput);
                form.appendChild(fastestInput);
                form.appendChild(slowestInput);
	        form.submit();
        } else {
                interval = setTimeout("timeOut()", 1500 + Math.random() * 3000)
        }
}

function timeOut() {
        var h = document.getElementsByTagName('html')[0];
        startTime = new Date().getTime();
        shouldPress = true;
        h.style.background = 'red';
}

document.onkeydown = function(e) {
	var elapsedTime = (new Date()).getTime() - startTime;
        if (!active) { start(); return; }
        clearTimeout(interval);
        if (shouldPress) {
                shouldPress = false;
                totalTime += elapsedTime;
                slowestTime = Math.max(elapsedTime, slowestTime);
                fastestTime = Math.min(elapsedTime, fastestTime);
                document.documentElement.style.background = 'black';
                
                countDisplay.replaceChild(document.createTextNode(++intervalCount + ' / ' + REPEATED), countDisplay.firstChild);

		lastDisplay.replaceChild(document.createTextNode('Last: ' + elapsedTime + ' ms'), lastDisplay.firstChild);
		fastestDisplay.replaceChild(document.createTextNode('Fastest: ' + fastestTime + ' ms'), fastestDisplay.firstChild);
		slowestDisplay.replaceChild(document.createTextNode('Slowest: ' + slowestTime + ' ms'), slowestDisplay.firstChild);
                
                nextInterval();
        } else {
                alert('Head start! Game will restart!');
		stop();
        }
}

function getCookie(name) {
        var prefix = name + "=";
        var begin = document.cookie.indexOf("; " + prefix);
        if (begin == -1) {
                begin = document.cookie.indexOf(prefix);
                if (begin != 0) return '';
        } else {
                begin += 2;
        }
        var end = document.cookie.indexOf(";", begin);
        if (end == -1) end = document.cookie.length;
        return unescape(document.cookie.substring(begin + prefix.length, end));
}
