// Javascript/HTML5 Game of Life Clock
// (c) 2009 Ben Charlton, ben@spod.cx
 
var bgcolor = "rgb(0,0,0)";
var clockcolor = "rgb(0,255,0)";
var fgcolor = "rgb(0,64,0)";

var size_x = 34;
var size_y = 13;

var size_blob = 30;
var gap = 4;

var width = ((size_blob+gap) * size_x) + gap;
var height = ((size_blob+gap) * size_y) + gap;

var canvas;
var g;

var fonts = [];
fonts['1'] = [ [4,0], [4,1], [4,2], [4,4], [4,3], [4,5], [4,6], [3,1], [3,6], [5,6] ];
fonts['2'] = [ [3,0], [4,0], [5,0], [2,1], [6,1], [6,2], [5,3], [4,4], [3,5], [2,6], [3,6], [4,6], [5,6], [6,6] ];
fonts['3'] = [ [3,0], [4,0], [5,0], [2,1], [6,1], [6,2], [5,3], [4,3], [6,4], [6,5], [2,5], [3,6], [4,6], [5,6] ];
fonts['4'] = [ [4,0], [5,0], [3,1], [5,1], [2,2,], [5,2], [2,3], [3,3], [4,3], [5,3], [6,3], [5,4], [5,5], [5,6], [4,6], [6,6] ];
fonts['5'] = [ [2,0], [3,0], [4,0], [5,0], [6,0], [2,1], [2,2], [2,3], [3,3], [4,3], [5,3], [6,4], [6,5], [2,5], [3,6], [4,6], [5,6] ];
fonts['6'] = [ [3,0], [4,0], [5,0], [6,1], [2,1], [2,2], [2,3], [3,3], [4,3], [5,3], [2,4], [6,4], [6,5], [2,5], [3,6], [4,6], [5,6] ];
fonts['7'] = [ [2,0], [3,0], [4,0], [5,0], [6,0], [6,1], [5,2], [4,3], [3,4], [3,5], [3,6] ];
fonts['8'] = [ [3,0], [4,0], [5,0], [6,1], [2,1], [2,2], [6,2], [3,3], [4,3], [5,3], [2,4], [6,4], [6,5], [2,5], [3,6], [4,6], [5,6] ];
fonts['9'] = [ [3,0], [4,0], [5,0], [6,1], [2,1], [2,2], [6,2], [3,3], [4,3], [5,3], [6,3], [6,4], [6,5], [2,5], [3,6], [4,6], [5,6] ];
fonts['0'] = [ [3,0], [4,0], [5,0], [2,1], [2,2], [2,3], [2,4], [2,5], [6,1], [6,1], [6,2], [6,3], [6,4], [6,5], [3,6], [4,6], [5,6] ];
fonts[':'] = [ [4,1], [5,1], [4,2], [5,2], [4,4], [5,4], [4,5], [5,5] ];

var life = createLife(size_x, size_y);
life[9][8] = 1;
life[10][8] = 1;
life[8][9] = 1;
life[9][9] = 1;
life[9][10] = 1;
	

function createLife(size_x, size_y) {
	var x = new Array(size_x);
	for (i=0; i<size_x; i++) {
		y = new Array(size_y);
		x[i] = y;	
	}
	return x;
}

function bodyinit() {
	setTimeout("draw()", 0);
}

function draw() {
	canvas = document.getElementById("canvas");
	canvas.width = width;
	canvas.height = height;

	g = canvas.getContext("2d");

	g.fillStyle = bgcolor;
	g.fillRect(0, 0, width, height);

	life = runLife(life);

	for (x=0; x<size_x; x++) {
		for (y=0; y<size_x; y++) {
			if (life[x][y] == 1) {
				g.fillStyle = fgcolor;
				g.fillRect(x * (size_blob+gap), y * (size_blob+gap), size_blob, size_blob);
			} else {
				g.fillStyle = bgcolor;
				g.fillRect(x * (size_blob+gap), y * (size_blob+gap), size_blob, size_blob);
			}
		}
	}
	var currentTime = new Date();
	var hours = currentTime.getHours();
	var minutes = currentTime.getMinutes();
	
	var y_offset = 3;
	var x_offset = 1;

	if (minutes < 10) minutes = "0" + minutes;
	theTime = hours + ":" + minutes;
	var ta = theTime.split("");
	for (var t=0; t<ta.length; t++) {
		var f = fonts[ta[t]];
		for (var c=0; c<f.length; c++) {
			var x = f[c][0]+x_offset;
			var y = f[c][1]+y_offset;
			life[x][y] = 1;
			g.fillStyle = clockcolor;
			g.fillRect(x * (size_blob+gap), y * (size_blob+gap), size_blob, size_blob);
			
		}
		x_offset += 6;
	}

	setTimeout("draw()", 1000);
}

function runLife(life) {
	var newlife = createLife(size_x, size_y);

	for (x=0; x<size_x; x++) {       
                for (y=0; y<size_x; y++) {

   // 1. Any live cell with fewer than two live neighbours dies, as if caused by underpopulation.
   // 2. Any live cell with more than three live neighbours dies, as if by overcrowding.
   // 3. Any live cell with two or three live neighbours lives on to the next generation.
   // 4. Any dead cell with exactly three live neighbours becomes a live cell.

			var count = 0;
			// upper left
			if (x-1 >= 0 && y-1 >= 0) {
				if (life[x-1][y-1] == 1) count++;
			}
			// above
                        if (y-1 >= 0) {
                                if (life[x][y-1] == 1) count++;
                        }

			// upper right
                        if (x+1 < size_x && y-1 >= 0) {
                                if (life[x+1][y-1] == 1) count++;
                        }

			// left
                        if (x-1 >= 0) {
                                if (life[x-1][y] == 1) count++;
                        }

			// right
                        if (x+1 < size_x) {
                                if (life[x+1][y] == 1) count++;
                        }

			// lower left
                        if (x-1 >= 0 && y+1 < size_y) {
                                if (life[x-1][y+1] == 1) count++;
                        }

			// below
                        if (y+1 < size_y) {
                                if (life[x][y+1] == 1) count++;
                        }

			// lower right
                        if (x+1 < size_x && y+1 < size_y) {
                                if (life[x+1][y+1] == 1) count++;
                        }

			// live cell?
			if (life[x][y] == 1 ) {
				if ( count < 2 || count > 3 ) {
					newlife[x][y] = 0;
				} else {
					newlife[x][y] = 1;
				}
			} else {
				if (count == 3) newlife[x][y] = 1;
			}
		}
	}
	return newlife;

}

