/*************************************************
Flip, ©Copyright 2006 - bezumie.com, All Rights Reserved
Ôëèï, ©Copyright 2006 - bezumie.com, Âñè÷êè ïðàâà çàïàçåíè
**************************************************/

function random(minValue, maxValue) {
	return Math.floor(Math.random() * (maxValue - minValue + 1) + minValue);
}

function sqr(val){
	return val * val;
}

function SetCookie (name, value) {
	var argv = SetCookie.arguments;
	var argc = SetCookie.arguments.length;
	var expires = (argc > 2) ? argv[2] : null;
	var path = (argc > 3) ? argv[3] : null;
	var domain = (argc > 4) ? argv[4] : null;
	var secure = (argc > 5) ? argv[5] : false;
	document.cookie = name + "=" + escape (value) +
	((expires == null) ? "" : ("; expires=" + expires.toGMTString())) +
	((path == null) ? "" : ("; path=" + path)) +
	((domain == null) ? "" : ("; domain=" + domain)) +
	((secure == true) ? "; secure" : "");
}

function getCookieVal (offset) {
	var endstr = document.cookie.indexOf (";", offset);
	if (endstr == -1)
	endstr = document.cookie.length;
	return unescape(document.cookie.substring(offset, endstr));
}

function GetCookie (name, DefaultVal) {
	var arg = name + "=";
	var alen = arg.length;
	var clen = document.cookie.length;
	var i = 0;
	while (i < clen) {
		var j = i + alen;
		if (document.cookie.substring(i, j) == arg)
			return getCookieVal (j);
		i = document.cookie.indexOf(" ", i) + 1;
		if (i == 0) break; 
	}
	return DefaultVal;
}

function SelectedObj(){
	this.div;
	this.x;
	this.y;
	this.n;
}

var selected = null;
var score = 0;
var remove = null;
var timeDiv = null;
var time = 50;
var timeSpeed = 300;
var gameIsOver;
var clickDisabled;
var gameIsPaused;

function init(){
	window.document.onkeydown = keyDown;
	setCursorAll('pointer');
	timeDiv = document.getElementById('time');
	gameIsPaused = false;
	gameIsOver = false;
	clickDisabled = false;
	timer();
}

function resumeGame(){
	if (gameIsOver) return ;
	gameIsPaused = false;
	document.getElementById('gamePaused').style.display = 'none';
	timer();
}

function pauseGame(){
	if (gameIsOver) return ;
	gameIsPaused = true;
	document.getElementById('gamePaused').style.display = 'block';
}

function keyDown(e) {
	var ch;
	var ctrl=false;
	if (e) { // Netscape/Firefox/Opera
		ch=e.which;
		ctrl=((e.ctrlKey) || (e.metaKey) || (e.altKey) || (e.modifiers));
	}
	else if (window.event) { // IE  
		ch=window.event.keyCode;
		ctrl= ((window.event.ctrlKey) || (window.event.altKey) || (window.event.metaKey));
	}
	else return true;
	if (ctrl) return true;

	if (gameIsOver) return;

	if ((ch == 80) || (ch == 19)){
		if (gameIsPaused) resumeGame();
		else pauseGame(); 
	}
	else return true;

	if ((window.event) && (window.event.preventDefault)) window.event.preventDefault()
	else if ((e) && (e.preventDefault)) e.preventDefault();
	if ((window.event) && (window.event.stopPropagation)) window.event.stopPropagation()
	else if ((e) && (e.stopPropagation)) e.stopPropagation();
	if (window.event) window.event.cancelBubble = true;
	return false;
}
function xy2el(x, y){
	var p = x * board.length + y;
	return document.getElementById('p_' + p);
}

function setBoard(x, y, n){
	board[x][y] = n;
	with (xy2el(x, y).style){
		if (n == 0) display = 'none';
		else {
			backgroundColor = dark[n - 1];
			display = 'block';
		}
	}
}

function clickme(el) {
	if (gameIsOver) return ;
	if (clickDisabled) return ;
	if (gameIsPaused) return ;
	var x = Math.floor(parseInt(el.style.left) / tilesize);
	var y = Math.floor(parseInt(el.style.top) / tilesize);
	var n = board[x][y];
	if (!selected) {
		setCursorAll('default');
		select(el, x, y, n);
	}
	else {
		if (selected.div == el) {
			unselect();
		}
		else{
			if ((((selected.x == x) && ((selected.y == y + 1) || (selected.y == y - 1)))
					|| (selected.y == y) && ((selected.x == x + 1) || (selected.x == x - 1)))){
				die = false;
				switchSelectedWith(el, x, y, n);
			}
		}
	}
}

function select(el, x, y, n) {
	selected = new SelectedObj();
	selected.div = el;
	selected.x = x;
	selected.y = y;
	selected.n = n;
	with (selected.div.style) {
		backgroundColor = light[n - 1];
		cursor = 'pointer';
	}
	if (x > 1) setCursor(x-1, y, 'pointer');
	if (y > 1) setCursor(x, y-1, 'pointer');
	if (x < board.length - 1) setCursor(x+1, y, 'pointer');
	if (y < board[x].length - 1) setCursor(x, y+1, 'pointer'); 
}

function unselect() {
	if (selected){
		with (selected.div.style) {
			backgroundColor = dark[selected.n - 1];
		}
		selected = null;
	}
	setCursorAll('pointer');
}

function setCursor(x, y, cur){
	xy2el(x, y).style.cursor = cur;
}

function setCursorAll(cur){
	for (var i = 0; i < board.length; i++)
		for (var j = 0; j < board[i].length; j++)
			setCursor(i, j, cur);
}

var die = false;
var els = new Array();
function move_els() {
	var cont = false;
	
	var i = 0;
	var n = els.length;
	while (i < n) {
		var el = els[i];
		if ((el.x != el.dx) || (el.y != el.dy)) {
			var tx = (el.x - el.dx);
			var mx = Math.round(tx / 3);
			if (tx < 0) {
				if (mx == 0) mx = -1;
			} else if (tx > 0) {
				if (mx == 0) mx = 1;
			} else mx = 0;
			
			var ty = (el.y - el.dy);
			var my = Math.round(ty / 3);
			if (ty < 0) {
				if (my == 0) my = -1;
			} else if (ty > 0) {
				if (my == 0) my = 1;
			} else my = 0;
			
			el.x -= mx;
			el.y -= my;
			
			el.el.style.left = el.x + 'px';
			el.el.style.top = el.y + 'px';
			
			cont = true;
		}
		i++;
	}
	
	if (cont) setTimeout('move_els()', 30);
	else {
		
		els[0].el.style.backgroundColor = dark[els[1].n-1];
		els[1].el.style.backgroundColor = dark[els[0].n-1];
	
		els[0].el.style.left = els[1].dx + 'px';
		els[1].el.style.left = els[0].dx + 'px';
		els[0].el.style.top = els[1].dy + 'px';
		els[1].el.style.top = els[0].dy + 'px';
		
		if (die) return;
		die = true;
		
		remove = new Array();
		checkSameFrom(els[1].bx, els[1].by);
		checkSameFrom(els[0].bx, els[0].by);
		if (remove.length == 0){
			select(els[0].el, els[0].bx, els[0].by, els[1].n);
			switchSelectedWith(els[1].el, els[1].bx, els[1].by, els[0].n);
		}
		else {
			clickDisabled = true;
			removeSame();	
		}
	}
}

function switchSelectedWith(el, x, y, n){
	var tmp = board[x][y];
	board[x][y] = board[selected.x][selected.y];
	board[selected.x][selected.y] = tmp;
	
	els.length = 0;
	
	var obj = new Object();
	obj.el = selected.div;
	obj.x = selected.div.offsetLeft;
	obj.y = selected.div.offsetTop;
	obj.dx = el.offsetLeft;
	obj.dy = el.offsetTop;
	obj.bx = selected.x;
	obj.by = selected.y;
	obj.n = selected.n;
	els.push(obj);
	
	var obj = new Object();
	obj.el = el;
	obj.x = el.offsetLeft;
	obj.y = el.offsetTop;
	obj.dx = selected.div.offsetLeft;
	obj.dy = selected.div.offsetTop;
	obj.bx = x;
	obj.by = y;
	obj.n = n;
	els.push(obj);
	
	selected = null;
	
	move_els();

}

function checkAllSame(){
	remove = new Array();
	for (var i = 0; i < board.length; i++){
		for (var j = 0; j < board[i].length; j++){
			checkSameFrom(i, j);
		}
	}
	if (remove.length > 0) removeSame();
	else {
		clickDisabled = false;
		setCursorAll('pointer');
	}
}

function checkSameFrom(x, y){
	var n = board[x][y];
	var remX = new Array();
	var i = x + 1;
	while ((i < board.length) && (board[i][y] == n)){
		remX.push({x:i, y:y});
		i++;
	}
	remX.push({x:x, y:y});
	i = x - 1;
	while ((i >= 0) && (board[i][y] == n)){
		remX.push({x:i, y:y});
		i--;
	}
	//remove.concat(remX);
	if (remX.length >= 3) {
		for (var i = 0; i < remX.length; i++)
			remove.push({x:remX[i].x, y:remX[i].y});
	}
	
	var remY = new Array();
	var j = y + 1;
	while ((j < board[x].length) && (board[x][j] == n)){
		remY.push({x:x, y:j});
		j++;
	}
	remY.push({x:x, y:y});
	j = y - 1;
	while ((j >= 0) && (board[x][j] == n)){
		remY.push({x:x, y:j});
		j--;
	}
	//remove.concat(remY);
	if (remY.length >= 3) {
		for (var j = 0; j < remY.length; j++)
			remove.push({x:remY[j].x, y:remY[j].y});
	}
}

function removeSame(){
	for (var i = 0; i < remove.length; i++){
		xy2el(remove[i].x, remove[i].y).style.backgroundColor = light[board[remove[i].x][remove[i].y] - 1];
	}
	setTimeout("doRemoveSame()", 400);
}

function doRemoveSame(){
	var tmpscore=0;
	for (var i = 0; i < remove.length; i++){
		if (board[remove[i].x][remove[i].y] != 0){
			setBoard(remove[i].x, remove[i].y, 0);
			tmpscore++;
		}
	}
	score += sqr(tmpscore - 2);
	setScore();
	if (!gameIsOver){
		timeSpeed -= (tmpscore - 2);
		time += sqr(tmpscore);
		if (time > 100) time = 100;
	}
	setTimeout("dropDown()", 200);
}

function dropDown(){
	var maxj = -1;
	for (var i = 0; i < board.length; i++){
		for (var j = 0; j < board[i].length; j++){
			if (board[i][j] == 0){
				if (j < 1) setBoard(i, j, random(1, 7));
				else {
					setBoard(i, j, board[i][j-1]);
					setBoard(i, j-1, 0);
					if (maxj < j) maxj = j;
				}
			}
		}
	}
	if (maxj > -1) setTimeout("dropDown()", 250 / (maxj+2));
	else {
		setTimeout("checkAllSame()", 300);
	};
}

function timer(){
	time--;
	timeDiv.style.width = (time * 2) + 'px';
	if (time > 0){
		if (!gameIsPaused) setTimeout("timer()", timeSpeed);
	}
	else {
		gameIsOver = true;
		document.getElementById('gameOver').style.display = 'block';
		setTopScore();
	}
}

function setScore(){
	document.getElementById('score').innerHTML = score;
}

function setTopScore(){
	var topScoreDiv = document.getElementById('topScore');
	if ((topScoreDiv) && (topScoreDiv.innerHTML < score)){
		topScoreDiv.innerHTML = score;
		SetCookie('Flip_topScore', score);
	}
}

var cancelHide = false;

function showSets() {
	var cp = document.getElementById('sets');
	if (cp.style.display == 'none'){
		cp.style.display = 'block';
		cancelHide = true;
	}
	else {
		cancelHide = false;
		hideSets();
	}
}

function hideSets() {
	if (cancelHide) return;
	document.getElementById('sets').style.display = 'none';
}

function selectSet(el) {
	var id = (el.id).substr(3, 2);
	SetCookie('Flip_ImageSet', id);
	if ((id != 0) && (GetCookie('Flip_ImageSet', 0) == 0)){
		alert('Cookies must be enabled.');
	}
	else {
		window.location.reload();
		cancelHide = false;
		hideSets();
	}
}