
var spaces = new Array();
var pieces = new Array();

var MAX_PLAYERS = 4;

var fromrow = -1;
var fromcol = -1;
var dragcolor = 0;
var torow = -1;
var tocol = -1;
var turn = 1;

function newGame()
{
   var youwin = document.getElementById('youwin');
   youwin.style.display = 'none';
   var youlose = document.getElementById('youlose');
   youlose.style.display = 'none';
   setupBoard();
}

function showHelp()
{
   var helpbackground = document.getElementById('helpbackground');
   helpbackground.style.display = 'block';
   var backbutton = document.getElementById('back');
   backbutton.style.display = 'block';
   var websitebutton = document.getElementById('website');
   websitebutton.style.display = 'block';
   var newgamebutton = document.getElementById('newgame');
   newgamebutton.style.display = 'none';
   var helpbutton = document.getElementById('help');
   helpbutton.style.display = 'none';
}

function hideHelp()
{
   var helpbackground = document.getElementById('helpbackground');
   helpbackground.style.display = 'none';
   var backbutton = document.getElementById('back');
   backbutton.style.display = 'none';
   var websitebutton = document.getElementById('website');
   websitebutton.style.display = 'none';
   var newgamebutton = document.getElementById('newgame');
   newgamebutton.style.display = 'block';
   var helpbutton = document.getElementById('help');
   helpbutton.style.display = 'block';
}

function setupHelp()
{
   var innerHTML = '';
   innerHTML += '<table bgcolor="#000000" width="100%" height="100%" border="0"><tr><td><div id="backScrollarea"><B>Objective</B><BR>A player wins when he/she captures all the other pieces.<BR><BR><B>Capturing Pieces</B><BR>When a piece is moved, the space moved to is the center of the area considered. The 3x3 square centered at the space moved into (the space and its eight bordering spaces) is the capture area. Either all of the pieces in the 3x3 area will be captured, or no pieces will be captured.<table><tr><td>Victory By Numbers</td><td>One player has more pieces than each other player in the area.</td><td><img width=122 height=52 src="http://www.johnhaney.com/cintos/gfx/victorynum.jpg"></td></tr><tr><td>Tie on Home Territory</td><td>Both players have the same number of pieces in the area and all pieces are on one territory.</td><td><img width=122 height=52 src="http://www.johnhaney.com/cintos/gfx/tiehome.jpg"></td></tr></table></div></td></tr></table>';

   document.getElementById('helpbackground').innerHTML = innerHTML;
}

function setupBoard()
{
   turn = 1;
   var innerHTML = '';
   var spaceColor;
   innerHTML += '<table border="0" cellpadding="0" cellspacing="1" bgcolor="#999999">';
   for (row = 0; row < 4; row++)
   {
      spaces[row] = new Array();
      pieces[row] = new Array();
      innerHTML += '<tr id="row_' + row + '">';
      for (col = 0; col < 4; col++)
      {
         spaces[row][col] = 1;
         if ((row < 2) && (col < 2))
         {
            pieces[row][col] = 1;
            spaceColor = "#999999";
         }
         else
         {
            pieces[row][col] = 0;
            spaceColor = "#990000";
         }
         innerHTML += pieceTableElement(spaceColor, "Images/piece"+pieces[row][col]+".png");
      }
      for (col = 4; col < 8; col++)
      {
         spaces[row][col] = 2;
         if ((row < 2) && (col >= 6))
         {
            pieces[row][col] = 2;
         }
         else
         {
            pieces[row][col] = 0;
         }
         innerHTML += pieceTableElement("#000099", "Images/piece"+pieces[row][col]+".png");
      }
      innerHTML += '</tr>';
   }
   for (row = 4; row < 8; row++)
   {
      pieces[row] = new Array();
      spaces[row] = new Array();
      innerHTML += '<tr id="row_' + row + '">';
      for (col = 0; col < 4; col++)
      {
         spaces[row][col] = 2;
         if ((row >= 6) && (col < 2))
         {
            pieces[row][col] = 2;
         }
         else
         {
            pieces[row][col] = 0;
         }
         innerHTML += pieceTableElement("#000099", "Images/piece"+pieces[row][col]+".png");
      }
      for (col = 4; col < 8; col++)
      {
         spaces[row][col] = 1;
         if ((row >= 6) && (col >= 6))
         {
            pieces[row][col] = 1;
            spaceColor = "#999999";
         }
         else
         {
            pieces[row][col] = 0;
            spaceColor = "#990000";
         }
         innerHTML += pieceTableElement(spaceColor, "Images/piece"+pieces[row][col]+".png");
      }
      innerHTML += '</tr>';
   }
   innerHTML += '</table>';
   document.getElementById('board').innerHTML = innerHTML;
}

function setPieceColor(row, col, color)
{
   var img = document.getElementById('piece'+row+'_'+col);
   img.src = 'Images/piece'+color+'.png';
}

function clearSpaceColor(row, col)
{
   setSpaceColor(row, col, spaces[row][col]);
}

function resetSpaceColor(row, col)
{
   if (pieces[row][col] == 1)
   {
      setSpaceColor(row, col, 0);
   }
   else
   {
      setSpaceColor(row, col, spaces[row][col]);
   }
}

function setSpaceColor(row, col, color)
{
   var td = document.getElementById('space'+row+'_'+col);
   switch (color)
   {
      case 1:
         td.bgColor = '#990000';
         break;
      case 2:
         td.bgColor = '#000099';
         break;
      default:
         td.bgColor = '#999999';
         break;
   }
}

function pieceTableElement(color, imgsrc)
{
   return '<td style="-webkit-user-select:ignore" id="space'+row+'_'+col+'" bgcolor="'+color+'" class="token" width="34" height="34" align="center"><img style="-webkit-user-drag:element;-webkit-user-select:ignore" valign="middle" src="'+imgsrc+'" width="32" height="32" id="piece' + row + '_' + col + '"'
                     + ' onclick="mouseClick(' + row + ',' + col + ')"'
                     + ' onmouseover="mouseOver(this, ' + row + ',' + col + ')"'
                     + ' onmouseout="mouseOut(this, ' + row + ',' + col + ')"'
                     + ' style="-khtml-user-drag:element;"'
                     + '></td>';
}

function mouseOver(img, row, col)
{
   if (pieces[row][col] == 1)
   {
      img.style.cursor = 'pointer';
   }
   else
   {
      img.style.cursor = 'default';
   }
}

function mouseOut(img, row, col)
{
   img.style.cursor = 'default';
}

function mouseClick(row, col)
{
   if (pieces[row][col] == 0)
   {
      if ((fromrow != -1) && (fromcol != -1) &&
          (Math.abs(fromrow - row) + Math.abs(fromcol - col) == 1))
      {
         var frow = fromrow;
         var fcol = fromcol;
         torow = row;
         tocol = col;

         pieces[fromrow][fromcol] = 0;
         setPieceColor(fromrow, fromcol, 0);

         pieces[torow][tocol] = dragcolor;
         setPieceColor(torow, tocol, dragcolor);

         unhighlightSpaces();

         fromrow = -1;
         fromcol = -1;
         moveJustMade(frow, fcol, torow, tocol);
         dragcolor = 0;
         torow = -1;
         tocol = -1;
         setTimeout("checkComputerMove();", 331);
      }
   }
   else if ((pieces[row][col] == 1) && (turn == 1))
   {
      fromrow = row;
      fromcol = col;
      dragcolor = pieces[row][col];
      highlightMovesAround(fromrow, fromcol);
   }
}

function highlightPieces()
{
   for (r = 0; r < 8; r++)
   {
      for (c = 0; c < 8; c++)
      {
         resetSpaceColor(r, c);
      }
   }
}

function unhighlightSpaces()
{
   for (r = 0; r < 8; r++)
   {
      for (c = 0; c < 8; c++)
      {
         clearSpaceColor(r, c);
      }
   }

}

function highlightMovesAround(row, col)
{
   var moves = 0;
   for (r = 0; r < 8; r++)
   {
      for (c = 0; c < 8; c++)
      {
         clearSpaceColor(r, c);
      }
   }

   if ((row > 0) && (pieces[row-1][col] == 0))
   {
      setSpaceColor(row-1, col, 0);
      moves++;
   }
   if ((row < 7) && (pieces[row+1][col] == 0))
   {
      setSpaceColor(row+1, col, 0);
      moves++;
   }
   if ((col > 0) && (pieces[row][col-1] == 0))
   {
      setSpaceColor(row, col-1, 0);
      moves++;
   }
   if ((col < 7) && (pieces[row][col+1] == 0))
   {
      setSpaceColor(row, col+1, 0);
      moves++;
   }

   if (moves == 0)
   {
      highlightPieces();
   }
}

function moveJustMade(fromrow, fromcol, row, col)
{
   winner = winningColorAroundSpace(row, col);
   if (winner > 0)
   {
      changeColorAroundSpace(winner, row, col);
      
      // check for winner
      if (checkForWinner() == true)
      {
         var r,c;
         // winner, do a happy dance!
         for (r = 0; r < 8; r++)
         {
            for (c = 0; c < 8; c++)
            {
               setSpaceColor(r,c,winner);
            }
         }

         if (winner == 1)
         {
            var youwin = document.getElementById('youwin');
            youwin.style.display = 'block';
         }
         else
         {
            var youlose = document.getElementById('youlose');
            youlose.style.display = 'block';
         }

         // exit this function
         turn = 0;
         return;
      }
   }
   turn = 3 - turn;
}

function checkForWinner()
{
   var color = 0;
   var r,c;
   for (r = 0; r < 8; r++)
   {
      for (c = 0; c < 8; c++)
      {
         if ((pieces[r][c] != 0) && (pieces[r][c] != color))
         {
            if (color == 0)
            {
               color = pieces[r][c];
            }
            else
            {
               return false;
            }
         }
      }
   }
   return true;
}

function changeColorAroundSpace(color, row, col)
{
   var r,c;
   for (r = -1; r <= 1; r++)
   {
      for (c = -1; c <= 1; c++)
      {
         if (((row + r) >= 0) && ((row + r) < 8) && ((col + c) >= 0) && ((col + c) < 8))
         {
            if (pieces[row + r][col + c] > 0)
            {
               pieces[row + r][col + c] = color;
               setPieceColor(row + r, col + c, color);
            }
         }
      }
   }
}

function winningColorAroundSpace(row, col)
{
var pieceCount;
var hasSpaces;
var topPlayer;
var numTopPlayers = 0;
var numPlayerColors = 0;
var numSpaceColors = 0;
var maxPieces = 0;
var tempPieceColor;
var tempSpaceColor;
var r,c;
var tempPlayerNum;
var pieceColor;
var p;

   pieceCount = new Array();
   hasSpaces = new Array();
   topPlayer = new Array();

   for (p = 0; p < MAX_PLAYERS; p++)
   {
      pieceCount[p] = 0;
      hasSpaces[p] = false;
      topPlayer[p] = 0;
   }

   var pieceColor = pieces[row][col];

	for (r = -1; r <= 1; r++)
	{
		for (c = -1; c <= 1; c++)
		{
         if (((row + r) >= 0) && ((row + r) < 8) && ((col + c) >= 0) && ((col + c) < 8))
         {
				tempPieceColor = pieces[row + r][col + c];
				tempSpaceColor = spaces[row + r][col + c];

				if (tempPieceColor > 0)
				{
					//NSLog(@"CGame:   hasPiece (%d)", tempPieceColor);
					pieceCount[tempPieceColor]++;
					if (pieceCount[tempPieceColor] == 1)
					{
						numPlayerColors++;
					}
					if (pieceCount[tempPieceColor] > maxPieces)
					{
						maxPieces = pieceCount[tempPieceColor];
					}
					hasSpaces[tempSpaceColor] = true;
				}
			}
		}
	}
	
	if (numPlayerColors > 1)
	{
		numTopPlayers = 0;
		numSpaceColors = 0;

		for (tempPlayerNum = 0; tempPlayerNum < MAX_PLAYERS; tempPlayerNum++)
		{
			if (pieceCount[tempPlayerNum] == maxPieces)
			{
				topPlayer[tempPlayerNum] = true;
				numTopPlayers++;
			}
			else
			{
				topPlayer[tempPlayerNum] = false;
			}

			if (hasSpaces[tempPlayerNum] == true)
			{
				numSpaceColors++;
			}
		}

		if (numTopPlayers == 1)
		{
			for (tempPlayerNum = 0; tempPlayerNum < MAX_PLAYERS; tempPlayerNum++)
			{
				if (topPlayer[tempPlayerNum] == true)
				{
					return tempPlayerNum;
				}
			}
		}
		else
		{
			if (numSpaceColors == 1)
			{
				for (tempPlayerNum = 0; tempPlayerNum < MAX_PLAYERS; tempPlayerNum++)
				{
					if ((hasSpaces[tempPlayerNum] == true) && (topPlayer[tempPlayerNum] == true))
					{
						return tempPlayerNum;
					}
				}

				if (topPlayer[pieceColor] == true)
				{
					return pieceColor;
				}
			}
		}
	}
	return 0;
}


function load()
{
   setupBoard();
   setupHelp();
}

function checkComputerMove()
{
   myColor = 2;
   if (turn != myColor)
   {
      return;
   }

   var myPieces = new Array();
   var numPieces = 0;
   for (r = 0; r < 8; r++)
   {
      for (c = 0; c < 8; c++)
      {
         if (pieces[r][c] == myColor)
         {
            myPieces[numPieces] = new Array(2);
            myPieces[numPieces][0] = r;
            myPieces[numPieces][1] = c;
            numPieces++;
         }
      }
   }
   
   var myMoves = new Array(5);
   for (i = 0; i < 5; i++)
   {
      myMoves[i] = new Array();
   }
   for (p = 0; p < numPieces; p++)
   {
      checkForMove(myPieces[p][0], myPieces[p][1], -1,  0, myMoves);
      checkForMove(myPieces[p][0], myPieces[p][1],  0, -1, myMoves);
      checkForMove(myPieces[p][0], myPieces[p][1],  1,  0, myMoves);
      checkForMove(myPieces[p][0], myPieces[p][1],  0,  1, myMoves);
   }

   var move;
   if (myMoves[myColor].length != 0)
   {
      var m = randomNumber(myMoves[myColor].length);
      move = myMoves[myColor][m];
   }
   else if (myMoves[0].length != 0)
   {
      var m = randomNumber(myMoves[0].length);
      move = myMoves[0][m];
   }
   else
   {
      for (i = 4; i >= 0; i--)
      {
         if (myMoves[i].length != 0)
         {
            var m = randomNumber(myMoves[i].length);
            move = myMoves[i][m];
            break;
         }
      }
   }
   pieces[move[2]][move[3]] = pieces[move[0]][move[1]];
   setPieceColor(move[0], move[1], 0);
   pieces[move[0]][move[1]] = 0;
   setPieceColor(move[2], move[3],
                 pieces[move[2]][move[3]]);
   moveJustMade(move[0], move[1],
                move[2], move[3]);

   if (turn == 1)
   {
      highlightPieces();
   }
}

function checkForMove(row, col, dr, dc, move)
{
   var result = 0;
   if ((row + dr >= 0) && (row + dr < 8) &&
       (col + dc >= 0) && (col + dc < 8))
   {
      if (pieces[row + dr][col + dc] == 0)
      {
         var winner = winningColorAroundSpace(row + dr, col + dc);
         var idx = move[winner].length;
         move[winner][idx] = new Array(5);
         move[winner][idx][0] = row;
         move[winner][idx][1] = col;
         move[winner][idx][2] = row + dr;
         move[winner][idx][3] = col + dc;
         result = 1;
      }
   }
   return result;
}


function randomNumber(max) {
   var ran = 1000.0/max;
   var currentdate = new Date();
   var core = currentdate.getMilliseconds() * currentdate.getSeconds() % 1000.0;
   return Math.floor(core/ran);
}


