// GLOBALNE ZMIENNE
var direction = 'up';
var foodBite = 1;
var box = 20;
var life = 3;
var points = 0;
var death = false;

function PointClass()
{
	this.left = new Array();
	this.top = new Array();
	this.id = new Array();
}
Food = new PointClass();
Wall = new PointClass();

// WSTĘPNE USTAWIENIA
$().ready(function() {
	$('.game').click(function() {
		if($('.game').text() == 'zatrzymaj')
		{
			// pauza
			$('.game').text('graj');
			window.clearInterval(gameTimer);
			window.clearInterval(snakeMovement);
			dialog('<p><b>PAUZA</b></p><p>Naciśnij \'P\', aby kontynuować.</p>');
		}
		else if($('.game').text() == 'graj')
		{
			// start gry
			$('.game').text('zatrzymaj');
			$('#board').children('.dialog').remove();
			gameTimer = window.setInterval("executeTimer()", 1000);
			snakeMovement = window.setInterval("moveSnake()", 400);
		}
	});
	setSnake(10,5,10);
	setFood(30);
	setWall(50);
	dialog('<p><b>NOWA GRA</b></p><p>Naciśnij \'P\', aby rozpocząć.</p>');
});

// FUNKCJA POMOCNICZA - CZY PODANE PUNKTY SĄ RÓWNE
function isTheSame(posTop,posLeft)
{
	for(var i=0; i<Snake.top.length; i++)
	{
		if(Snake.top[i] == posTop && Snake.left[i] == posLeft)
		{
			return true;
		}
	}
	if(Food.top.length)
	{
		for(var i=0; i<Food.top.length; i++)
		{
			if(Food.top[i] == posTop && Food.left[i] == posLeft)
			{
				return true;
			}
		}
	}
	if(Wall.top.length)
	{
		for(var i=0; i<Wall.top.length; i++)
		{
			if(Wall.top[i] == posTop && Wall.left[i] == posLeft)
			{
				return true;
			}
		}
	}
	return false;
}

// USTAW JEDZONKO
function setFood(foodCount)
{
	Food = new PointClass();
	
	var boardWidth = $('#board').width()/box;
	var boardHeight = $('#board').height()/box;
	var counter = 0;
	
	while(foodCount)
	{
		do{
			var posTop = Math.floor(Math.random()*boardHeight);
			var posLeft = Math.floor(Math.random()*boardWidth);
		} while(isTheSame(posTop,posLeft));
		
		var food = $('<div>');
		food.attr('class', 'food');
		food.css('top', posTop*box);
		food.css('left', posLeft*box);
		Food.top[counter] = posTop;
		Food.left[counter] = posLeft;
		Food.id[counter] = (counter+1);
		food.attr('id', 'food'+Food.id[counter]);
		foodCount--;
		counter++;
		$("#board").append(food);
	}
}

// USTAW ŚCIANY
function setWall(wallCount)
{
	Wall = new PointClass();
	
	var boardWidth = $('#board').width()/box;
	var boardHeight = $('#board').height()/box;
	var counter = 0;
	
	while(wallCount)
	{
		do {
			var posTop = Math.floor(Math.random()*boardHeight);
			var posLeft = Math.floor(Math.random()*boardWidth);
		} while(isTheSame(posTop,posLeft));
		
		var wall = $('<div>');
		wall.attr('class', 'wall');
		wall.css('top', posTop*box);
		wall.css('left', posLeft*box);
		Wall.top[counter] = posTop;
		Wall.left[counter] = posLeft;
		Wall.id[counter] = (counter+1);
		wall.attr('id', 'wall'+Wall.id[counter]);
		wallCount--;
		counter++;
		$("#board").append(wall);
	}
}

// PRZESUWANIE WĘŻA PO PLANSZY
function moveSnake()
{
	wallCheck();
	biteCheck();

	for(var i=Snake.top.length-foodBite; i>0; i--)
	{
		Snake.left[i] = Snake.left[i-1];
		Snake.top[i] = Snake.top[i-1];
		foodBite = 1;
	}
	
	switch(direction)
	{
		case 'up': Snake.top[0] -= 1; break;
		case 'down': Snake.top[0] += 1; break;
		case 'left': Snake.left[0] -= 1; break;
		case 'right': Snake.left[0] += 1; break;
	}

	foodCheck();
	if(!death) refreshSnake();
	
	if(points == Food.top.length*10)
	{
		window.clearInterval(snakeMovement);
		$('#board').children('.dialog').remove();
		dialog('<p><b>WYGRAŁEŚ! GRATULACJE!</b></p><p>Naciśnij OK, aby zagrać jeszcze raz.</p>');
		alert('WYGRAŁEŚ! GRATULACJE!');
		window.location = '';
		refresh();
	}
}

// ODRYSOWANIE WĘŻA
function refreshSnake()
{
	$('.snakeHead').remove();
	$('#board').children('.snakeBody').remove();
	
	var head = $('<div>');
	head.css('top', Snake.top[0]*box);
	head.css('left', Snake.left[0]*box);
	
	switch(direction)
	{
		case 'up': head.attr('class', 'snakeHead shUp'); break;
		case 'down': head.attr('class', 'snakeHead shDown'); break;
		case 'left': head.attr('class', 'snakeHead shLeft'); break;
		case 'right': head.attr('class', 'snakeHead shRight'); break;
	}
	
	$('#board').append(head);
	
	for(var i=1; i<Snake.top.length; i++)
	{
		var body = $('<div>');
		body.attr('class', 'snakeBody');
		body.css('top', Snake.top[i]*box);
		body.css('left', Snake.left[i]*box);
		$('#board').append(body);
	}
}

// USTAW WĘŻA
function setSnake(left,top,length)
{
	Snake = new PointClass();

	var head = $('<div>');
	head.css('top', top*box);
	head.css('left', left*box);
	direction = 'right';
	head.attr('class', 'snakeHead shRight');
	$('#board').append(head);
	Snake.left[0] = left;
	Snake.top[0] = top;
	for(var i=1; i<length; i++)
	{
		var body = $('<div>');
		body.attr('class', 'snakeBody');
		body.css('top', top*box);
		body.css('left', (left-i)*box);
		Snake.left[i] = (left-i);
		Snake.top[i] = top;
		$('#board').append(body);
	}
}

// SPRAWDŹ CZY WĄŻ TRAFIŁ NA JEDZONKO
function foodCheck()
{
	for(var i=0; i<Food.top.length; i++)
	{
		if(Snake.top[0] == Food.top[i] && Snake.left[0] == Food.left[i])
		{
			Food.top[i] = Food.left[i] = 0;
			document.getElementById('board').removeChild(document.getElementById('food'+Food.id[i]));
			foodBite = 0;
			$('#length').text(parseInt(Snake.top.length)+1);
			points += 10;
			$('#points').text(points);
			break;
		}
	}
}

// SPRAWDŹ CZY WĄŻ NIE WSZEDŁ W ŚCIANĘ
function wallCheck()
{
	var boardWidth = ($('#board').width()/box);
	var boardHeight = ($('#board').height()/box);
	if(Snake.top[0] < 0 || Snake.top[0] >= boardHeight || Snake.left[0] < 0 || Snake.left[0] >= boardWidth)
	{
		death = true;
		dialog('<p><b>WSZEDŁEŚ W ŚCIANĘ!</b></p><p>Naciśnij \'N\' aby kontynuować.</p>');
		lifeLost();
	}
	if(Wall.top.length)
	{
		for(var i=0; i<Wall.top.length; i++)
		{
			if(Snake.top[0] == Wall.top[i] && Snake.left[0] == Wall.left[i])
			{
				death = true;
				dialog('<p><b>WSZEDŁEŚ W ŚCIANKĘ!</b></p><p>Naciśnij \'N\' aby kontynuować.</p>');
				lifeLost();
			}
		}
	}
}

// SPRAWDŹ CZY WĄŻ NIE UGRYZŁ SIĘ W OGON
function biteCheck()
{
	for(var i=1; i<=Snake.top.length; i++)
	{
		if(Snake.top[0] == Snake.top[i] && Snake.left[0] == Snake.left[i])
		{
			death = true;
			dialog('<p><b>UGRYZŁEŚ SIĘ W OGON!</b></p><p>Naciśnij \'N\' aby kontynuować.</p>');
			lifeLost();
		}
	}
}

// WĄŻ TRACI ŻYCIE
function lifeLost()
{
	life--;
	$('#life').text(life);
	if(life > 0)
	{
		$('.game').click();
	}
	else if(life <= 0)
	{
		$('#board').children('.dialog').remove();
		dialog('<p><b>KONIEC GRY!</b></p><p>Naciśnij OK, aby rozpocząć od nowa.</p>');
		alert('KONIEC GRY!');
		window.location = '';
	}
}

// RESTART
function restart()
{
	// restart wszystkiego
	death = false;
	points = 0;
	$('#length').text(Snake.top.length);
	$('#life').text(life);
	$('#points').text('0');
	$('#time').text('0');
	$('.game').click();
	$('#board').children('.food').remove();
	$('#board').children('.wall').remove();
	$('#board').children('.snakeHead').remove();
	$('#board').children('.snakeBody').remove();
	setSnake(10,5,10);
	setFood(30);
	setWall(50);
}

// LICZNIK CZASU
function executeTimer()
{
	var time = parseInt($("#time").text());
	$("#time").text(time+1);
}

// OKIENKO DIALOGOWE
function dialog(tekst)
{
	var dialogPositionTop = ($('#board').width()/2-300/2);
	var dialogPositionLeft = ($('#board').height()/2-0/2);
	
	var dialog = $('<div>');
	dialog.css('top', dialogPositionTop);
	dialog.css('left', dialogPositionLeft);
	dialog.attr('class', 'dialog');
	dialog.html(tekst);
	
	$('#board').prepend(dialog);
}

// OBSŁUGA WCIŚNIĘCIA KLAWISZA

$().keypress(function(e)
{
	switch(e.which)
	{
		// W, w
		case 87:
		case 119: direction = 'up'; break;
		// S, s
		case 83:
		case 115: direction = 'down'; break;
		// A, a
		case 65:
		case 97: direction = 'left'; break;
		// D, d
		case 68:
		case 100: direction = 'right'; break;
		// P, p
		case 80:
		case 112: $('.game').click(); break;
		// N, n
		case 78:
		case 110: $('#board').children('.dialog').remove(); restart(); break;
	}
});

