/*
   copyright (c) 2009, keith drakard
   this program is distributed under the terms of the creative commons
   license at http://creativecommons.org/licenses/by-nc-sa/2.0/
*/

  // static global variables - get player options or set to default
  var passed= window.location.search.substring(1);
  var maxplayers= getParm(passed,'d')- 0; if (maxplayers==0) maxplayers=4;
  var max_x= getParm(passed,'x')- 0; if (max_x==0) max_x= 8;
  var max_y= getParm(passed,'y')- 0; if (max_y==0) max_y= 8;

  // dynamic globals
  var current= 0; var players_left= maxplayers;
  var score= new Array(maxplayers); for (i=0; i<maxplayers; i++) { score[i]=0; }
  var player= new Array(max_x); var amount= new Array(max_x);
  for (i=0; i<max_x; i++) {
    player[i]= new Array(max_y); amount[i]= new Array(max_y);
    for (j=0; j<max_y; j++) {
      player[i][j]= -1; amount[i][j]= 0;
    }
  }


  function preload() {
    if (document.images) {
      atoms= new makeArray(maxplayers*4 +1);
         atoms[0].src= "/wp-content/scripts/images/common/blank.gif";
      for (i=0; i<maxplayers; i++) {
         atoms[1+(4*i)].src= "/wp-content/scripts/images/react/"+(i+1)+"_1.gif";
         atoms[2+(4*i)].src= "/wp-content/scripts/images/react/"+(i+1)+"_2.gif";
         atoms[3+(4*i)].src= "/wp-content/scripts/images/react/"+(i+1)+"_3.gif";
         atoms[4+(4*i)].src= "/wp-content/scripts/images/react/"+(i+1)+"_4.gif";
      }
      number= new makeArray(11);
         number[0].src= "/wp-content/scripts/images/common/0.gif";
         number[1].src= "/wp-content/scripts/images/common/1.gif";
         number[2].src= "/wp-content/scripts/images/common/2.gif";
         number[3].src= "/wp-content/scripts/images/common/3.gif";
         number[4].src= "/wp-content/scripts/images/common/4.gif";
         number[5].src= "/wp-content/scripts/images/common/5.gif";
         number[6].src= "/wp-content/scripts/images/common/6.gif";
         number[7].src= "/wp-content/scripts/images/common/7.gif";
         number[8].src= "/wp-content/scripts/images/common/8.gif";
         number[9].src= "/wp-content/scripts/images/common/9.gif";
         number[10].src= "/wp-content/scripts/images/common/blank.gif";

    } else {
      alert("Sorry, this game needs to run on a browser\nwhich supports the image object.");
    }
  }

  function newgame() {
    var index= document.user.noofplayers.selectedIndex;
    var tmp_p= document.user.noofplayers.options[index].value;
    var index= document.user.xsize.selectedIndex;
    var tmp_x= document.user.xsize.options[index].value;
    var index= document.user.ysize.selectedIndex;
    var tmp_y= document.user.ysize.options[index].value;

    if (tmp_p!= maxplayers || tmp_x!= max_x || tmp_y!= max_y) {
      // options have changed so we need to redraw the page
      window.location.href= "?d="+tmp_p+"&x="+tmp_x+"&y="+tmp_y;

    } else {
      // same options so just reset the board
      document.images["a"+current].src= "/wp-content/scripts/images/common/blank.gif";
      document.images["b"+current].src= "/wp-content/scripts/images/common/blank.gif";
      current= 0; players_left= maxplayers;
      document.images["a"+current].src= "/wp-content/scripts/images/common/notblank.gif";
      document.images["b"+current].src= "/wp-content/scripts/images/common/notblank.gif";
      for (i=0; i<maxplayers; i++) { score[i]=0; }
      update_scores();
      for (i=0; i<max_x; i++) { for (j=0; j<max_y; j++) {
        player[i][j]= -1; amount[i][j]= 0;
        document.images["x"+i+"y"+j].src= atoms[0].src;
      } }

    }
  }

  function update_scores() {
    var ns="";
    for (i=0; i<maxplayers; i++) {
      if (score[i]==-1) ns= "0"; else ns= score[i]+"";
      var len= ns.length;

      document.images[i+"d1"].src= number[ns.charAt(len-1)].src;
      if (len>=2) document.images[i+"d10"].src= number[ns.charAt(len-2)].src;
        else document.images[i+"d10"].src= number[10].src;
      if (len==3) document.images[i+"d100"].src= number[ns.charAt(len-3)].src;
        else document.images[i+"d100"].src= number[10].src;
    }
  }

  function add(x_pos,y_pos) {
    if (players_left> 1) {
      if (player[x_pos][y_pos]== -1 || player[x_pos][y_pos]== current) {
        react(x_pos,y_pos,current); update_scores();

        // move on to the next player still in the game
        document.images["a"+current].src= "/wp-content/scripts/images/common/blank.gif";
        document.images["b"+current].src= "/wp-content/scripts/images/common/blank.gif";
        current++; if (current> maxplayers-1) current= 0;
        while (score[current]== -1) { current++; if (current> maxplayers-1) current= 0; }
        document.images["a"+current].src= "/wp-content/scripts/images/common/notblank.gif";
        document.images["b"+current].src= "/wp-content/scripts/images/common/notblank.gif";

        if (players_left== 1) get_winner();
      }
    }
  }

  function react(x,y,c) {
    var reactor= 0; var old_pl= 0;
    if (players_left> 1) {

      old_pl= player[x][y]; if (old_pl!= -1) score[old_pl]-= amount[x][y];
      amount[x][y]++; score[c]+= amount[x][y]; player[x][y]= c;

      // check if that go has wiped out a player
      if (old_pl!= -1 && score[old_pl]== 0) { score[old_pl]= -1; players_left--; }

      // normally, the reaction point is 4, but we deduct one for
      // each side that (x,y) is on using logic tests...
      reactor= 4- (x==0)- (x==(max_x-1))- (y==0)- (y==(max_y-1));

      if (amount[x][y]> reactor) {
        // more than 2(corners), 3(sides) or 4(anywhere else)
        // so go bang!

        amount[x][y]-= reactor; score[c]-= reactor;
        document.images["x"+x+"y"+y].src= atoms[amount[x][y]+ (c*4)].src;

        // and this is why it's called "chain" reaction...
        if (x> 0)       react(x-1, y, c);
        if (x< max_x-1) react(x+1, y, c);
        if (y> 0)       react(x, y-1, c);
        if (y< max_y-1) react(x, y+1, c);
      }
    
    document.images["x"+x+"y"+y].src= atoms[amount[x][y]+ (c*4)].src;
    }
  }

  function get_winner() {
    for (i=0; i<maxplayers; i++) {
      if (score[i]> -1) alert("Congratulations, player "+(i+1));
    }
  }

  // The following functions were written by Martin Webb at http://www.irt.org/
  function makeArray(n) {
    this.length= n; for (i=0; i<n; i++) { this[i] = new Image(); }
    return this;
  }
  function getParm(string,parm) {
    var startPos= string.indexOf(parm+"=");
    if (startPos> -1) {
      startPos= startPos+ 2;
      var endPos= string.indexOf("&",startPos);
      if (endPos== -1) endPos= string.length;
      return unescape(string.substring(startPos,endPos));
    }
    return '';
  }

function initialise() {  
  var output= '';
  output+= '<table align=center cellspacing=12 cellpadding=0 border=0><tr>\n';

  // create the board
  output+= '<td align=center valign=top><table cellspacing=0 cellpadding=0 border=1>\n';
  for (y=0; y<max_y; y++) {
    output+= '<tr>';
    for (x=0; x<max_x; x++) {
      output+= '<td><a href="javascript:add('+x+','+y+')" onFocus="blur();"><img src="/wp-content/scripts/images/common/blank.gif"';
      output+= ' name="x'+x+'y'+y+'" onDblClick="add('+x+','+y+')" width=40 height=40 alt="" border=0></a></td>';
    }
    output+= '</tr>\n';
  }
  output+= '</table></td>\n';

  // and create the whose-go-is-it indicator + score etc
  output+= '<td valign=top><form name="user"><table cellspacing=0 cellpadding=4 border=0>\n';
  output+= '<tr bgcolor="#000088"><td align=center><b>Player</b></td><td align=center><b>Score</b></td></tr>\n';

  for (i=1; i<=maxplayers; i++) {
    output+= '<tr bgcolor="#000088"><td align=center>';
    output+= '<img src="/wp-content/scripts/images/common/'; if (i==1) output+= 'not';
    output+= 'blank.gif" width=4 height=40 alt="" name="a'+(i-1)+'">';
    output+= '<img src="/wp-content/scripts/images/react/'+i+'_'+i+'.gif" width=40 height=40 alt="">';
    output+= '<img src="/wp-content/scripts/images/common/'; if (i==1) output+= 'not';
    output+= 'blank.gif" width=4 height=40 alt="" name="b'+(i-1)+'"></td>';
    output+= '<td align=right valign=middle>';
    output+= '<img src="/wp-content/scripts/images/common/blank.gif" width=14 height=18 alt="" name="'+(i-1)+'d100">';
    output+= '<img src="/wp-content/scripts/images/common/blank.gif" width=14 height=18 alt="" name="'+(i-1)+'d10">';
    output+= '<img src="/wp-content/scripts/images/common/0.gif" width=14 height=18 alt="" name="'+(i-1)+'d1">';
    output+= '&nbsp;&nbsp;</td></tr>\n';
  }

  output+= '<tr><td colspan=2>&nbsp;</td></tr>';
  output+= '<tr bgcolor="#000088"><td align=right>Players:</td><td><select name="noofplayers" size=1>';
  for (x= 2; x<5; x++) {
    output+= '<option value="'+x+'"';
    if (x==maxplayers) output+= ' selected';
    output+= '>'+x;
  }
  output+= '</select></td></tr><tr bgcolor="#000088"><td colspan=2>&nbsp;</td></tr>\n';
  output+= '<tr bgcolor="#000088"><td align=right>x:</td><td><select name="xsize" size=1>';
  for (x= 4; x<13; x++) {
    output+= '<option value="'+x+'"';
    if (x==max_x) output+= ' selected';
    output+= '>'+x;
  }
  output+= '</select></td></tr><tr bgcolor="#000088"><td colspan=2>&nbsp;</td></tr>\n';
  output+= '<tr bgcolor="#000088"><td align=right>y:</td><td><select name="ysize" size=1>';
  for (x= 4; x<13; x++) {
    output+= '<option value="'+x+'"';
    if (x==max_y) output+= ' selected';
    output+= '>'+x;
  }
  output+= '</select></td></tr><tr bgcolor="#000088"><td colspan=2>&nbsp;</td></tr>\n';
  output+= '<tr bgcolor="#000088"><td colspan=2 align=center>';
  output+= '<input type="button" value=" new game " onClick="newgame()"></TD></TR>\n';

  output+= '<tr><td colspan=2>&nbsp;</td></tr>';
  output+= '</table></form></td>\n';

  output+= '</tr></table>\n';

  document.write(output);
  preload();

}