var w, columns, rows; var insert_mode, clear_mode, easter_egg, pause_mode; var counter, frequence, touch_count; let board, next;

function setup() {

createCanvas(windowWidth, windowHeight);
w = 8;
easter_egg = 0;
counter = 0; frequence = 50; touch_count = 0;
insert_mode = 0; clear_mode = 0; pause_mode = 0;
columns = floor(width/w);
rows = floor(height/w);

randomize_colors();
board = new Board(columns, rows);
board.fill(0, columns, 0, 3);
next = new Board(columns, rows);
next.empty();

background(253, 253, 253);
draw_board();

}

function draw() {

if (counter % frequence === 0 && easter_egg === 1){
  background(253, 253, 253);
  draw_board();
  generate();
}
counter += 1;

}

function draw_board(){

for ( var i = 0; i < columns;i++) {
  for ( var j = 0; j < rows;j++) {
    if ((board.cells[i][j] == 1)) fill(r, g, b);
    else fill(253, 253, 255);
    stroke(253, 253, 255);
    rect(i*w, j*w, w-1, w-1);
  }
}

}

function generate(){

if (pause_mode != 1) {
  var temp = board;
  board = Board.generate_next(board);
  next = temp;
}

}

function windowResized() {

resizeCanvas(windowWidth, windowHeight);

}

function mouseDragged() {

if (insert_mode == 1) {
  var tmpX = floor(mouseX/w);
  var tmpY = floor( mouseY/w);

  board.fill(tmpX - 4, tmpX + 4, tmpY - 4, tmpY + 4);
}
return false;

}

function mousePressed() {

if (insert_mode == 1) {
  var tmpX = floor(mouseX/w);
  var tmpY = floor( mouseY/w);

  board.fill(tmpX - 3, tmpX + 3, tmpY - 3, tmpY + 3);
};

return false;

}

function keyTyped(){

if (key ==='e') {
  frequence = 50;
  easter_egg = 1;
  randomize_colors();
  board.empty();
  board.fill(0, columns, rows - 30, rows);
}
else if (key === 'q') {
  hide_game_of_life();
  clear_mode = 1;
  insert_mode = 0;
}
else if (key === 'k') {
  insert_mode = 0;
  frequence = max(5, frequence - 5);
}
else if (key === 'j') {
  insert_mode = 0;
  frequence += 5;
}
else if (key === 's') {
  pause_mode = 0;
}
else if (key === 'p') {
  pause_mode = 1;
}
else if (key === 'i'){
  if (clear_mode == 1) insert_mode = 0;
  else {
    clear_mode = 0;
    insert_mode = 1;
  };
} else randomize_colors();

return false;

}

function keyPressed(){

if (keyCode === ESCAPE) insert_mode = 0;

}

function touchStarted() {

touch_count += 1;
if (touch_count % 2 === 0){
  pause_mode = 1;
}
else {
  pause_mode = 0;
  frequence = 50;
  easter_egg = 1;
  randomize_colors();
  board.empty();
  board.fill(0, columns, rows - 30, rows);
}
return false;

}

function touchMoved() {

return false;

}

function randomize_colors(){

clear_mode = 0;
r = random(255);
g = random(255);
b = random(255);

}

function hide_game_of_life(){

clear_mode = 1;
r = 253;
g = 253;
b = 255;

}