var game={
	width:24,
	height:16,
	cellSize:24,
	padding:2,
	speed:50,
	acceleration:0.5,
	x:0,y:0,
	dir:1,
	length:2
};

$(document).ready(function() {
	$.build();
});


jQuery.spawn=function() {

	$cells=$('#game .cell').not('.snake');
	var indx=Math.floor(Math.random()*($cells.length+1));
	$cells.slice(indx,indx+1).addClass('kibble');

}

jQuery.tick=function() {
	var gameover=false;

	$(document).keydown(function(event) {
		var k=event.keyCode;

		var dir=0;
		switch (k) {
			case 38:dir=1;break; // up
			case 40:dir=3;break; // down
			case 37:dir=4;break; // left
			case 39:dir=2;break; // right
			default:break; // wut?
		}

		if (dir!=0) {
			if (
				!(game.dir==1 && dir==3) &&
				!(game.dir==3 && dir==1) &&
				!(game.dir==2 && dir==4) &&
				!(game.dir==4 && dir==2)
			) {
				game.dir=dir;
				$(document).unbind('keydown');
			}
		}
	});

	var ox=game.dir==4?-1:(game.dir==2?1:0)
	var oy=game.dir==1?-1:(game.dir==3?1:0)

	game.x+=ox;
	game.y+=oy;

	if (game.x==-1) game.x=game.width-1;
	if (game.y==-1) game.y=game.height-1;
	if (game.x==game.width) game.x=0;
	if (game.y==game.height) game.y=0;

	var $next=$.cell(game.x,game.y);

	if ($next.hasClass('kibble')) {
		$next.removeClass('kibble');
		game.length++;
		game.speed+=game.acceleration;
		$.spawn();
	} else if ($next.hasClass('snake')) {
		gameover=true;
		$('#game').fadeOut(1000,function() {
			$(this).remove();
			$.build();
		});
	} else {
		$('#game .cell').filter(function() {
			return $(this).data('life')==1;
		}).removeData('life').removeClass('snake').fadeTo(1,1).end()
		.filter(function() {
			return $(this).data('life')>1;
		}).each(function() {
			var x=$(this).data('life');
			$(this).data('life',x-1).css({'opacity':1-1/x});
		});
	}

	if (!gameover) {
		$next.addClass('snake').data('life',game.length);
		setTimeout($.tick,10000/game.speed);
	}
}

jQuery.build=function() {
	game=$.extend(game,{
		length:2,
		speed:50
	});
	$('<div>').attr('id','game').appendTo($('body'));
	var frag=document.createDocumentFragment();

	for (var y=0;y<game.height;y++) {
		for (var x=0;x<game.width;x++) {
			var $cell=$('<div>').addClass('cell');
			frag.appendChild($cell[0]);
		}
	}

	var w=game.width*(game.cellSize+game.padding);
	var h=game.height*(game.cellSize+game.padding)

	$('#game').css({
		width:w,
		height:h,
		marginLeft:-(w/2),
		marginTop:-(h/2)
	})[0].appendChild(frag);

	game.x=Math.floor(game.width/2);
	game.y=game.height;
	game.dir=1;

	$('#game').find('.cell').css({
		width:game.cellSize,
		height:game.cellSize,
		marginRight:game.padding,
		marginBottom:game.padding
	}).end().fadeIn(1000,function() {
		$.spawn();
		$.tick();

	});
}

jQuery.cell=function(x,y) {
	var indx=game.width*y+x
	return $('#game .cell').slice(indx,indx+1);
}