// memory.js - a Javascript/HTML Memory game
// By Fredrik Fornwall, fredrikfornwall@gmail.com

var IMAGE_SIZE = 64;
var NUMBER_OF_ROWS = 6;
var updateTimeInterval = null;

function createImage(id, src) {
	var result = document.createElement('img');
	if (id != null) result.setAttribute('id', id);
	result.setAttribute('width', IMAGE_SIZE);
	result.setAttribute('height', IMAGE_SIZE);
	result.setAttribute('src', src);
	return result;
}

function init() {
	if (updateTimeInterval != null) {
		clearInterval(updateTimeInterval);
		timeElement.removeChild(timeElement.lastChild);
        	errorsElement.replaceChild(document.createTextNode('Errors: 0'), errorsElement.firstChild);
	}

        right = new Array();     // right[i] is the image number at position i
        lastClicked = -1;        // last clicked image number (-1 if player into his first guess)
        errors = 0;              // number of times player made wrong guess
        discovered = 0;          // how many images have been removed
        waiting = false;         // if we are waiting for the game engine
        globali = 0;             // global reference to i
        updateTimeInterval = 0;  // handle to the interval timer that updates the time
        seconds = 0;             // passed game time
        timeElement = 0;         // reference to the DOM element that displays the time
        errorsElement = 0;       // reference to the DOM element that displays the number of errors made by the player
        name = '';               // player name

	try {
		for (var i = 0; i < 49; i++) {
			var image = new Image();
			image.src = i + '.png';
		}
		var image = new Image();
		image.src = 'black.png';
	} catch (e) { }

        timeElement = document.getElementById('timeDisplay')
        timeElement.appendChild(document.createTextNode('0'))
        errorsElement = document.getElementById('errors')
        
        var images     = new Array(49)
        var imageTaken = new Array(49)
        for (var i = 0; i < images.length; i++) { images[i] = i; imageTaken[i] = false; } imageTaken[50] = true
        var positions  = new Array(36)
        var posTaken = new Array(36)
        for (var i = 0; i < 36; i++) { positions[i] = i; posTaken[i] = false } posTaken[36] = true
        
        for (var i = 0; i < NUMBER_OF_ROWS * NUMBER_OF_ROWS / 2; i++) {
                posTaken[i] = true;

                var imageIndex = Math.floor(Math.random() * images.length);
                while (imageTaken[imageIndex]) imageIndex = Math.floor(Math.random() * images.length);
                imageTaken[imageIndex] = true

                var j = Math.floor(Math.random() * NUMBER_OF_ROWS * NUMBER_OF_ROWS / 2 + 18 )
                while (posTaken[j]) j = Math.floor(Math.random() * NUMBER_OF_ROWS * NUMBER_OF_ROWS / 2 + 18 )
                posTaken[j] = true
                right[j] = right[i] = images[imageIndex]
        }

        var table = document.getElementById('gameview');
        while (table.hasChildNodes()) {
		table.removeChild(table.firstChild);
	}
	var body = document.getElementsByTagName('body').item(0)
         
        var i = 0
        for (var row = 0; row < NUMBER_OF_ROWS; row++) {
                var newRow = document.createElement('tr')
                for (var column = 0; column < NUMBER_OF_ROWS; column++) {
                        var newColumn = document.createElement('td')
                        var image = createImage(i, 'unknown.png');
                        image.addEventListener('mousedown', click, false)
                        newColumn.appendChild(image)
                        newRow.appendChild(newColumn)
                        i++
                }
                table.appendChild(newRow);
        }
        
        updateTimeInterval = setInterval('updateTime()', 1000)
}


function updateTime()
{
        timeElement.replaceChild(document.createTextNode(seconds++), timeElement.lastChild)
}


function timeOut()
{
        if (right[globali] == right[lastClicked]) {
                var blankImage = createImage(null, 'black.png');
                var e = document.getElementById(lastClicked);
                e.parentNode.replaceChild(blankImage, e);
                
                var e2 = document.getElementById(globali);
                e2.parentNode.replaceChild(blankImage, e2);
                
                discovered += 2;
        } else {
                var unknownImage = createImage(lastClicked, 'unknown.png');
                unknownImage.addEventListener('mousedown', click, false)
                var e = document.getElementById(lastClicked)
                e.parentNode.replaceChild(unknownImage, e)
                
                var unknownImage2 = createImage(globali, 'unknown.png');
                unknownImage2.addEventListener('mousedown', click, false);
                var e2 = document.getElementById(globali);
                e2.parentNode.replaceChild(unknownImage2, e2);

                errors++;
        }
        
        lastClicked = -1;
        
        if (discovered == NUMBER_OF_ROWS * NUMBER_OF_ROWS) {
                clearInterval(updateTimeInterval);
                
                var body = document.getElementsByTagName("body")[0];

	        var form = document.createElement("form");
	        form.setAttribute("method", "post");
	        form.setAttribute("action", "/games/highscore/?game=memory");
	        form.setAttribute("style", "display: none;");
	        body.appendChild(form);

		while (name == null || name == '') {
        		name = prompt("Enter Your Name:");
		}
	        var nameInput = document.createElement("input");
	        nameInput.setAttribute("type", "text");
	        nameInput.setAttribute("name", "name");
	        nameInput.setAttribute("value", name);
	        form.appendChild(nameInput);

	        var errorsInput = document.createElement("input");
	        errorsInput.setAttribute("type", "text");
	        errorsInput.setAttribute("name", "errors");
	        errorsInput.setAttribute("value", errors);
	        form.appendChild(errorsInput);
                  
	        var timeInput = document.createElement("input");
	        timeInput.setAttribute("type", "text");
	        timeInput.setAttribute("name", "seconds");
	        timeInput.setAttribute("value", seconds);
	        form.appendChild(timeInput);

	        form.submit();
        }
        
        errorsElement.replaceChild(document.createTextNode('Errors: ' + errors), errorsElement.firstChild);
        waiting = false;
}


function click(e)
{
        var i = e.target.getAttribute('id')
        if (lastClicked != i && !waiting) {
                var image = createImage(i, right[i] + '.png');
                e.target.parentNode.replaceChild(image, e.target);
                
                if (lastClicked == -1) {
                        lastClicked = i;
                } else {
                        globali = i;
                        waiting = true;
                        setTimeout('timeOut()', 1500);
                }
        }
}

function changeSize(change) {
	IMAGE_SIZE += change;
	document.cookie = 'bestSize = ' + IMAGE_SIZE + '; expires=' + new Date("January 1, 2006").toGMTString();
	var images = document.getElementsByTagName('img');
	for (var i = 0; i < images.length; i++) {
		images[i].setAttribute('width', IMAGE_SIZE);
		images[i].setAttribute('height', IMAGE_SIZE);
	}
}
