/*
	Blocky
	Copyright (C) 2007 Christian Davén <christian-without-the-spam-at-daven-dot-se>

	This program is free software: you can redistribute it and/or modify
	it under the terms of the GNU General Public License as published by
	the Free Software Foundation, either version 3 of the License, or
	(at your option) any later version.

	This program is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
	GNU General Public License for more details.

	You can find the GNU General Public License at
	<http://www.gnu.org/copyleft/gpl.html>.
*/

var FIXEDdrainTime = 60; //[seconds] the starting time for the timer to drain
var timeLevelDifference = 20; //[%] the % of the timer draining speed added per level (so if it is set to 20 and in level 1 the drain Time is 60 it will become 48 (60 - 12) in level 2)
var bonusSecondsPerLevel = 10; //[seconds] the seconds gained when finishing a level
var extraSecondsPerMove = 0.5; //[seconds] the seconds gained when you release a group of blocks
var bonusPointsPerLevel = 1000; //[points]
var selectionColor = '#999999'; //[HEX COLOR] selection border color (eg. #000000 for black)

var drainTime = FIXEDdrainTime;

function findPos (obj) {
	var curleft = curtop = 0;
	if (obj.offsetParent) {
		curleft = obj.offsetLeft;
		curtop = obj.offsetTop;
		while (obj = obj.offsetParent) {
			curleft += obj.offsetLeft;
			curtop += obj.offsetTop;
		}
	}
	return [curleft,curtop];
}
function appearObj (objectName, limit, speed, nextFunction) {
	
	var object = document.getElementById(objectName);
	if (object) {
		var currentAlpha = object.style.opacity * 100;

		if ((currentAlpha + speed) < limit) {
		
			currentAlpha += speed;
			setAlpha (object, currentAlpha);
			//object.style.left = (object.offsetLeft - 2) + 'px';
			//object.style.top = (object.offsetTop - 2) + 'px';
			//object.style.width = (object.offsetWidth + 4) + 'px';
			//object.style.height = (object.offsetHeight + 4) + 'px';
	
			setTimeout("appearObj('" + objectName + "', " + limit + ", " + speed + ", '" + nextFunction + "')", 50);
		} else {
			setAlpha (object, limit);
    		if (nextFunction) setTimeout(nextFunction, 0);
		}
	}
}
function fadeObj (objectName, limit, speed, nextFunction) {
	
	var object = document.getElementById(objectName);
	if (object) {
		var currentAlpha = object.style.opacity * 100;

		if ((currentAlpha - speed) > limit) {
		
			currentAlpha -= speed;
			setAlpha (object, currentAlpha);
			//object.style.left = (object.offsetLeft - 2) + 'px';
			//object.style.top = (object.offsetTop - 2) + 'px';
			//object.style.width = (object.offsetWidth + 4) + 'px';
			//object.style.height = (object.offsetHeight + 4) + 'px';
	
			setTimeout("fadeObj('" + objectName + "', " + limit + ", " + speed + ", '" + nextFunction + "')", 50);
		} else {
			setAlpha (object, limit);
			document.body.removeChild(object);
    			if (nextFunction) setTimeout(nextFunction, 0);
		}
	}
}
function setAlpha (object, alpha) {
    	
    	object.style.filter = 'alpha(opacity: ' + alpha + ')';
	object.style.MozOpacity = alpha / 100;
    	object.style.KhtmlOpacity = alpha / 100;
	object.style.opacity = alpha / 100;
}
var blockSizes = new Array();
blockSizes[4] = 86;
blockSizes[5] = 68;
blockSizes[6] = 56;
blockSizes[8] = 41;
blockSizes[10] = 32;
blockSizes[12] = 26;
var colorsArray = new Array();
colorsArray[4] = 2;
colorsArray[5] = 2;
colorsArray[6] = 2;
colorsArray[8] = 3;
colorsArray[10] = 3;
colorsArray[12] = 4;
var game = 1, paused = 0, timerLeft = 500, currentScore = 0;
var blocksNr, blockSize, blockSpace = 4, blocksArray, colorsNr, selection = 0 ,selection2, startSelection, endSelection, selX1, selX2, selY1, selY2, lastMove;
function setStartSelection (id) {
	if (game) if (!selection) {
		selection = 1;
		startSelection = id.substring(6).split('-');
		endSelection = startSelection;
	} else {
		closeSelection (id)
	}
}
function setEndSelection (id) {
	if (game) if (selection) endSelection = id.substring(6).split('-');
}
function closeSelection (id) {
	if (selection) {
		selection = 0;
		startSelection = endSelection = null;
	
		if (selection2 && (selX1 != selX2) && (selY1 != selY2)) {
		
			var LT = blocksArray[selY1][selX1];
			var RT = blocksArray[selY1][selX2];
			var LB = blocksArray[selY2][selX1];
			var RB = blocksArray[selY2][selX2];
		
			if ((LT == RT) && (LT == LB) && (LT == RB)) {
				lastMove = 0;
			
				var tempEmpty = 0, tempSad = 0, totalNrs;
				for (var i = selX1; i <= selX2; i++) {
					for (var j = selY1; j <= selY2; j++) {
					
						var tempSquare = document.getElementById('square' + j + '-' + i);
						if (tempSquare.className.substr(0, 12) == 'square empty') tempEmpty++;
						else tempSad++;
						
						var nextFunction = '';
						if ((i == selX2) && (j == selY2)) nextFunction = 'lastMove = 1';
						setTimeout("refreshBlock(" + j + ", " + i + ", '" + blocksArray[j][i] + "', '" + nextFunction + "');", (((i - selX1 + 1) + (j - selY1 + 1)) * 100) - 200);
					}
				}
				totalNrs = Math.round(tempSad * tempSad) + Math.round((tempEmpty * tempEmpty) / 2);
				currentScore += totalNrs;
				timerLeft += Math.round((extraSecondsPerMove * (tempSad + tempEmpty)) * 500 / drainTime);
				if (timerLeft > 500) timerLeft = 500;
			}
		}
	}
}
function checkFinish () {

	if (game) {
		var found = 0;
		for (var i = 1; i <= blocksNr; i++) {
			for (var j = 1; j <= blocksNr; j++) {
					
				var tempSquare = document.getElementById('square' + j + '-' + i);
				if (tempSquare.className.substr(0, 12) != 'square empty') found = 1;
				
				var tempSquare = document.getElementById('fsquare' + j + '-' + i);
				if (tempSquare) found = 1;
			}
		}
		if (!found && (lastMove == 1)) refreshTable();
		else setTimeout(checkFinish, 500);
	}
}
function refreshBlock (j, i, color, nextFunction) {
	var id = 'square' + j + '-' + i;

	var oldSquare = document.getElementById(id);
	var type = Math.floor(Math.random () * colorsNr) + 1;
	if (type == 1) { oldSquare.className = 'square empty-red-' + blocksNr; blocksArray[j][i] = 'red'; }
	if (type == 2) { oldSquare.className = 'square empty-blue-' + blocksNr; blocksArray[j][i] = 'blue'; }
	if (type == 3) { oldSquare.className = 'square empty-green-' + blocksNr; blocksArray[j][i] = 'green'; }
	if (type == 4) { oldSquare.className = 'square empty-orange-' + blocksNr; blocksArray[j][i] = 'orange'; }
	//tempBlock.style.visibility = 'hidden';

	var square = document.createElement('div');
	square.setAttribute('id', 'f' + id);
	square.className = 'square happy-' + color + '-' + blocksNr;
	square.style.position = 'absolute';
	square.style.zIndex = '51';
	square.style.width = square.style.height = blockSize + 'px';
	square.style.left = findPos(document.getElementById(id))[0] + 'px';
	square.style.top = findPos(document.getElementById(id))[1] + 'px';
	
	document.body.appendChild(square);
	setAlpha (square, 100);
	fadeObj ('f' + id, 0, Math.round((blocksNr * blocksNr) / 2), nextFunction);
}

function refreshTable () {
	
	var game = document.getElementById('game');
	var table = document.getElementById('gameTable');
	var selectionDiv = document.getElementById('selection');
	game.removeChild(table);
	game.removeChild(selectionDiv);
	
	if ((blockSizes.length - 1) > blocksNr) {
		blocksNr++;
		while(!blockSizes[blocksNr]) blocksNr++;
	}
	blockSize = blockSizes[blocksNr];
	colorsNr = colorsArray[blocksNr];
	
	createTable(blocksNr, blocksNr);
	
	drainTime -= Math.round(timeLevelDifference * drainTime / 100);
	timerLeft += Math.round(bonusSecondsPerLevel * 500 / drainTime);
	if (timerLeft > 500) timerLeft = 500;
	
	currentScore += bonusPointsPerLevel;
	
}
function createTable (columns, rows) {
	var game = document.getElementById('game');
	
	var table = document.createElement('div');
	table.setAttribute('id', 'gameTable');
	table.className = 'table';
	//table.style.width = (columns * (blockSize + blockSpace)) + 'px';
	//table.style.height = (rows * (blockSize + blockSpace)) + 'px';
	game.appendChild(table);
	
	blocksArray = new Array ();
	
	for (var i = 1; i <= rows; i++) {
		
		var row = document.createElement('div');
		row.setAttribute('id', 'row' + i);
		row.className = 'row';
		table.appendChild(row);
		
		tempArray = new Array ();
		blocksArray[i] = tempArray;
		
		for (var j = 1; j <= columns; j++) {
			var cell = document.createElement('div');
			cell.className = 'cell';
			row.appendChild(cell);
			
			cell.onmouseout = function () { selection2 = 0; }
			
			var square = document.createElement('div');
			square.setAttribute('id', 'square' + i + '-' + j);
			square.style.width = square.style.height = blockSize + 'px';
			var type = Math.floor(Math.random () * colorsNr) + 1;
			if (type == 1) { square.className = 'square sad-red-' + blocksNr; tempArray[j] = 'red'; }
			if (type == 2) { square.className = 'square sad-blue-' + blocksNr; tempArray[j] = 'blue'; }
			if (type == 3) { square.className = 'square sad-green-' + blocksNr; tempArray[j] = 'green'; }
			if (type == 4) { square.className = 'square sad-orange-' + blocksNr; tempArray[j] = 'orange'; }
			
			cell.appendChild(square);
			
			square.onmouseover = function () { selection2 = 1; setEndSelection(this.id); }
			square.onmousedown = function () { setStartSelection(this.id); }
			square.onmouseup = function () { closeSelection(); }
		}
		var clearDIV = document.createElement('div');
		clearDIV.className = 'clear';
		row.appendChild(clearDIV);
	}
	var selectionDiv = document.createElement('div');
	selectionDiv.setAttribute('id', 'selection');
	//selection.style.width = (columns * (blockSize + blockSpace) + blockSpace) + 'px';
	//selection.style.height = (rows * (blockSize + blockSpace) + blockSpace) + 'px';
	game.appendChild(selectionDiv);
	
	var selectionObj = document.createElement('div');
	selectionObj.setAttribute('id', 'selectionObject');
	selectionObj.style.visibility = 'hidden';
	selectionObj.style.border = '4px solid ' + selectionColor;
	selectionDiv.appendChild(selectionObj);
	
	checkFinish ();
}
function disableSelection(target){
	if (typeof target.onselectstart != "undefined") //IE route
		target.onselectstart = function () { return false; }
	else if (typeof target.style.MozUserSelect != "undefined") //Firefox route
		target.style.MozUserSelect = "none";
	else //All other route (ie: Opera)
		target.onmousedown = function () { return false; }
		target.style.cursor = "default";
	}
function Blocky() {
	blocksNr = 5;
	blockSize = blockSizes[blocksNr];
	colorsNr = colorsArray[blocksNr];
	
	var maindiv = document.getElementById('blockgame');
	
	var game = document.createElement('div');
	game.setAttribute('id', 'game');
	maindiv.appendChild(game);
	
	createTable (blocksNr, blocksNr);
	
	showSelection();
	
	var panel = document.createElement('div');
	panel.setAttribute('id', 'interface');
	maindiv.appendChild(panel);
	
	var panelContent = document.createElement('div');
	panelContent.className = 'content';
	panelContent.innerHTML = '<br /><br /><br /><br />Poäng:<div id="cscore">0</div><br />Rekord:<div id="hscore">0</div><br /><br /><button onmousedown="restartGame();" style="float: none; margin: 0px auto;">STARTA OM</button>';
	panel.appendChild(panelContent);
	
	setHighScore(getCookie('blockyhighscore'));
	setScore ();
	
	var clearDIV = document.createElement('div');
	clearDIV.className = 'clear';
	maindiv.appendChild(clearDIV);
	
	var timer = document.createElement('div');
	timer.setAttribute('id', 'timer');
	maindiv.appendChild(timer);
	
	var timerBar = document.createElement('div');
	timerBar.className = 'bar';
	timer.appendChild(timerBar);
	
	var timerBarFill = document.createElement('div');
	timerBarFill.setAttribute('id', 'timerBarFill');
	timerBarFill.className = 'fill';
	timerBar.appendChild(timerBarFill);
	
	var PAUSEbtn = document.createElement('button');
	PAUSEbtn.setAttribute('id', 'pauseBtn');
	timer.appendChild(PAUSEbtn);
	PAUSEbtn.innerHTML = 'PAUS';
	PAUSEbtn.onmousedown = pauseGame;
	
	setTimer ();
	
	var cover = document.createElement('div');
	cover.setAttribute('id', 'gamecover');
	maindiv.appendChild(cover);
	
	disableSelection(document.getElementById("game"));
	
	document.onmouseup = function () { closeSelection(); }
}
function pauseGame () {
	
	var PAUSEbtn = document.getElementById('pauseBtn');
	PAUSEbtn.innerHTML = 'FORTSÄTT';
	PAUSEbtn.onmousedown = continueGame;
	
	var selObj = document.getElementById('selectionObject');
	selObj.style.visibility = 'hidden';
	
	var cover = document.getElementById('gamecover');
	cover.style.left = (findPos(document.getElementById('game'))[0] + 4) + 'px';
	cover.style.top = (findPos(document.getElementById('game'))[1] + 4) + 'px';
	cover.style.display = 'block';
	cover.innerHTML = 'PAUS';
	
	setAlpha (cover, 0);
	appearObj ('gamecover', 100, 10, '');
	
	paused = 1;
}
function continueGame () {
	
	var PAUSEbtn = document.getElementById('pauseBtn');
	PAUSEbtn.innerHTML = 'PAUS';
	PAUSEbtn.onmousedown = pauseGame;
	
	var selObj = document.getElementById('selectionObject');
	selObj.style.visibility = 'visible';
	
	var cover = document.getElementById('gamecover');
	cover.style.display = 'none';
	
	paused = 0;
}
function restartGame () {
	
	var PAUSEbtn = document.getElementById('pauseBtn');
	PAUSEbtn.innerHTML = 'PAUS';
	PAUSEbtn.disabled = '';
	PAUSEbtn.onmousedown = pauseGame;
		
	var cover = document.getElementById('gamecover');
	cover.style.display = 'none';
	
	var game = document.getElementById('game');
	var table = document.getElementById('gameTable');
	var selectionDiv = document.getElementById('selection');
	game.removeChild(table);
	game.removeChild(selectionDiv);
	
	drainTime = FIXEDdrainTime;
	game = 1;
	paused = 0; 
	timerLeft = 500;
	currentScore = 0;
	blocksNr = 5;
	blockSize = blockSizes[blocksNr];
	colorsNr = colorsArray[blocksNr];
	selection = 0;
	createTable(blocksNr, blocksNr);
	setTimer (1);
	setScore ();
	checkFinish ();
}
function endGame () {
	
	selection = 0;
	startSelection = endSelection = null;
	
	game = 0;
	setCookie('blockyhighscore', currentScore, 9999);
	setHighScore(getCookie('blockyhighscore'));
			
	var PAUSEbtn = document.getElementById('pauseBtn');
	PAUSEbtn.innerHTML = 'PAUS';
	PAUSEbtn.disabled = 'disabled';
	PAUSEbtn.onmousedown = function () { };
	
	var cover = document.getElementById('gamecover');
	//cover.style.left = (findPos(document.getElementById('game'))[0] + 4) + 'px';
	//cover.style.top = (findPos(document.getElementById('game'))[1] + 4) + 'px';
	cover.style.display = 'block';
	cover.innerHTML = 'GAME OVER';
	
	setAlpha (cover, 0);
	appearObj ('gamecover', 100, 10, '');
}
function setTimer (restart) {

	if (restart) game = 1;
	
	if (game) {
		if (!paused) timerLeft -= 500 / (drainTime * 10); 
		
		if (timerLeft <= 0) {
			endGame ();
		}
	
		var timerBarFill = document.getElementById('timerBarFill');
		timerBarFill.style.width = Math.round(timerLeft) + 'px';
		
		setTimeout(setTimer, 100);
	}
}
function setHighScore (score) {
	
	var scoreDiv = document.getElementById('hscore');
	scoreDiv.innerHTML = score;
}
function setScore () {
	if (game) {
	
		var scoreDiv = document.getElementById('cscore');
		if (scoreDiv.innerHTML != currentScore) scoreDiv.innerHTML = currentScore;
		
		setTimeout(setScore, 100);
	}
}
function showSelection () {
	var sel = document.getElementById('selection');
	var selObj = document.getElementById('selectionObject');
	
	if (startSelection && endSelection) {
		
		var tempCoord;
		
		selY1 = startSelection[0] * 1;
		selY2 = endSelection[0] * 1;
		if (selY1 > selY2) {
			tempCoord = selY1;
			selY1 = selY2;
			selY2 = tempCoord;
		}
		selX1 = startSelection[1] * 1;
		selX2 = endSelection[1] * 1;
		if (selX1 > selX2) {
			tempCoord = selX1;
			selX1 = selX2;
			selX2 = tempCoord;
		}
		
		sel.style.top = ((selY1 - 1) * (blockSize + blockSpace)) + 'px';
		sel.style.left = ((selX1 - 1) * (blockSize + blockSpace)) + 'px';
		
		sel.style.height = ((selY2 - selY1 + 1) * (blockSize + blockSpace) + blockSpace) + 'px';
		sel.style.width = ((selX2 - selX1 + 1) * (blockSize + blockSpace) + blockSpace) + 'px';
		selObj.style.height = ((selY2 - selY1 + 1) * (blockSize + blockSpace) - blockSpace) + 'px';
		selObj.style.width = ((selX2 - selX1 + 1) * (blockSize + blockSpace) - blockSpace) + 'px';

		if (!paused) selObj.style.visibility = 'visible';
		
	}
	else selObj.style.visibility = 'hidden';
	
	setTimeout(showSelection, 50);
}

//COOKIE STUFF
function setCookie (c_name, value, expiredays) {
	var exdate = new Date();
	exdate.setDate(exdate.getDate() + expiredays);
	var oldValue = getCookie(c_name);
	if (oldValue < value) document.cookie = c_name+ "=" + escape(value) + ((expiredays == null) ? "" : ";expires=" + exdate.toGMTString());
}

function getCookie (c_name) {
	if (document.cookie.length > 0) {
		c_start=document.cookie.indexOf(c_name + "=");
  		if (c_start != -1) { 
   			c_start = c_start + c_name.length+1;
			c_end = document.cookie.indexOf(";", c_start);
   			if (c_end == -1) c_end = document.cookie.length;
   			return unescape(document.cookie.substring(c_start, c_end))
   		} 
  	}
	return "";
}
