// author: Norbert Schrepf
// copyright 2006 Webdesign Schrepf


// initialize constants
var HUMAN    = 0;
var FREE     = 1;
var COMPUTER = 2;

// setup game board
var symbols = new Array (3);

symbols[HUMAN] = new Image();
symbols[HUMAN].src = "Cross.gif";

symbols[FREE] = new Image();
symbols[FREE].src = "Blank.gif";

symbols[COMPUTER] = new Image();
symbols[COMPUTER].src = "Circle.gif";

var nextPlayer = COMPUTER;

var field = new Array (3);

for (x = 0; x < 3; x++) {
  field [x] = new Array (3);
}

// set up victory conditions !
var victory = new Array (8);
for (i = 0; i < 8; i++) {
  victory [i] = new Array (3);
  for (j = 0; j < 3; j++) {
    victory [i][j] = new Array (2);
  }
}
var options = "001122";   // left - right diagonal
options    += "201102";   // right - left diagonal
options    += "001020";   // horizontal
options    += "011121";
options    += "021222";
options    += "000102";   // vertical
options    += "101112";
options    += "202122";
for (n = 0; n < 8; n ++) {
  for (f = 0; f < 3; f ++) {
    victory [n][f][0] = options.charAt (n * 6 + f * 2) ;
    victory [n][f][1] = options.charAt (n * 6 + f * 2 + 1);
//    alert ("n=" + n + " f=" + f + "  : (" + victory [n][f][0] + "," + victory [n][f][1] + ")");
  }
}

// set up priority turns
var priority = new Array (9);
options = "110020220210211201";
for (i = 0; i < 9; i++) {
  priority[i] = new Array (2);
  priority[i][0] = options.charAt (i * 2);
  priority[i][1] = options.charAt (i * 2 + 1);
}



// ====== functions =======
function initialize () {

  for (x = 0; x < 3; x++) {
    for (y = 0; y < 3; y++) {
      field [x][y] = FREE;
      document.images["field"+x+y].src = symbols[FREE].src;
    }
  }

  if (nextPlayer == COMPUTER) {
    computerTurn ();
  }
}


function playerSetAt (x, y) {
  if (nextPlayer != HUMAN) {
    return;
  }
  
  if (setAt (x , y)) {
    nextPlayer = COMPUTER;
    if (! isVictory()) {
      var timer = setTimeout("computerTurn ()", 1000);
    }
    else {
      alert ("congratulations ... you won!");
      initialize ();
    }
  }
}

function setAt (x, y) {
  if (field [x][y] == FREE) {
    field [x][y] = nextPlayer;
    document.images["field"+x+y].src = symbols[nextPlayer].src;
    return true;
  }
  else {
    return false;
  }
}

function computerTurn () {
  if (isSet ()) {
    alert ("no winner! ... I try again.");
    initialize ();
    return;
  }

  var x0, y0;
//  alert ("my turn");

  // find the priority field
  for (i = 0; i < 9; i++) {
    if (field [priority[i][0]][priority[i][1]] == FREE) {
      x0 = priority[i][0];
      y0 = priority[i][1];
      break;
    }
  }

  // can you win next turn ?
  for (x = 0; x < 3; x++) {
    for (y = 0; y < 3; y++) {
      if (field [x][y] == FREE) {
        field [x][y] = (2 - nextPlayer);
        if (isVictory ()) {
          x0 = x;
          y0 = y;
        }
        field [x][y] = FREE;
      }
    }
  }


  // can I win with this turn !
  for (x = 0; x < 3; x++) {
    for (y = 0; y < 3; y++) {
      if (field [x][y] == FREE) {
        field [x][y] = nextPlayer;
        if (isVictory ()) {
          x0 = x;
          y0 = y;
        }
        field [x][y] = FREE;
      }
    }
  }

//  alert ("set at (" + x0 + "," + y0 + ")");

  setAt (x0, y0);

  nextPlayer = HUMAN;

  if (isVictory ()) {
    alert ("too bad! ... you lost!");
    initialize ();
  }

  if (isSet ()) {
    alert ("no winner! ... You try again.");
    initialize ();
  }
}

function isVictory () {
  for (n = 0; n < 8; n++) {
    var sum = 0;
    sum += field [victory[n][0][0]][victory[n][0][1]] - 1;
    sum += field [victory[n][1][0]][victory[n][1][1]] - 1;
    sum += field [victory[n][2][0]][victory[n][2][1]] - 1;
    if (Math.abs (sum) == 3) {
      return true;
    }
  }
  return false;
}

function isSet () {
  var product = 1;
  for (x = 0; x < 3; x ++) {
    for (y = 0; y < 3; y ++) {
      product *= (field [x][y] - 1);
    }
  }
  return (product != 0);
}

