// Original:  Jason Fondren (usher@betterbox.net)
// Modified:  Benjamin Wright, Editor

//	Preload and identify images.
//	Default config for the script uses three different colored balls.
//	0=blank  1=red  2=yellow  3=blue
off0 = new Image();
off0.src = "http://i.factmonster.com/images/games/samegameblack.gif";
off1 = new Image();
off1.src = "http://i.factmonster.com/images/games/samegame1off.gif";
off2 = new Image();
off2.src = "http://i.factmonster.com/images/games/samegame2off.gif";
off3 = new Image();
off3.src = "http://i.factmonster.com/images/games/samegame3off.gif";
on0 = new Image();
on0.src = "http://i.factmonster.com/images/games/samegameblack.gif";
on1 = new Image();
on1.src = "http://i.factmonster.com/images/games/samegame1on.gif";
on2 = new Image();
on2.src = "http://i.factmonster.com/images/games/samegame2on.gif";
on3 = new Image();
on3.src = "http://i.factmonster.com/images/games/samegame3on.gif";

// Declare the total score and the winner variable
var total = 0;
var winner = false;

// Bottom row array, used by the findAdjacent2() function
n=0;
bottom=new Array();
for(i=0;i<15;i++){bottom[i]=n;n+=10}

// Top row array, used by the findAdjacent2() function
n=9;
head=new Array();
for(i=0;15>i;i++){head[i]=n;n+=10}

// Main array, random seed all	coordinates with number	from 1-3
main=new Array();
for(i=0;150>i;i++){main[i]=random()}

//	Random number function. Change ballCount to add more colors
//	(which would make the game harder).
//	If you do this you must preload more images.
function random() {
ballCount=3;
randomNum=Math.floor((Math.random()*ballCount));
randomNum++;
return randomNum;
}

//	Uses findAdjacent() to find connected balls
//	of the same color. Called on mouseover, changes
//	the ball image to alert user of how many
//	balls will be removed. 
function onBall(k) {
if (main[k] != 0) {
crayon = main[k];
findAdjacent(k);
if (adj.length > 1) {
for (n = 0; n < adj.length; n++) {
document["img" + adj[n]].src = eval("on" + crayon + ".src");
document.getElementById('CLICK').innerHTML = (adj.length-2)*(adj.length-2);
         }
      }
   }
}

//	Uses findAdjacent() to find connected balls
//	of the same color. Turns off the alternate
//	balls on mouseout.
function offBall(k) {
if (main[k] != 0) {
crayon = main[k];
findAdjacent(k);
if (adj.length > 1) {
for (n = 0; n < adj.length; n++) {
document["img" + adj[n]].src = eval("off" + crayon + ".src");
document.getElementById('CLICK').innerHTML = 0;
         }
      }
   }
}

//	Uses findAdjacent() to find connected balls
//	of the same color. Removes selected balls by
//	changing the value to 0, cleans up columns
//	using slideBalls(), updates the game board
//	with startUp(), adjusts the score, and checks
//	to see if the game board is cleared with
//	checkwinner() or if all the removable pieces
//	are taken with checkLoser().
function clickBall(k) {
if (main[k] != 0) {
findAdjacent(k);
if (adj.length > 1) {
for (n=0; n<adj.length; n++) {
main[adj[n]] = 0;
}
slideBalls();
startUp();
total = (adj.length - 2) * (adj.length - 2) + total;
if(checkWinner()){winner = true;total+=1000}
document.getElementById('SHOW').innerHTML = total;
document.getElementById('CLICK').innerHTML = 0;
q = 0;
checkLoser();
if (q == 60){gameOver(q,total,winner)}
}
}
}

//	Rolls through the remaining balls
//	and checks to see if any more can
//	be removed with smallAdjacent().
//	If you set this function to check
//	much higher than main[60] Netscape
//	will give you a "too much recursion"
//	error, so there is a small chance that
//	this function will think the game is
//	over before it really is.
function checkLoser(){
if(q==60){return true}
if(main[q]!=0&&smallAdjacent(q)){return false}
q++;
checkLoser();
}

//	Checks to see if the game was won.
//	Simply checks main[0], and if it
//	equals 0 returns true
function checkWinner(){if(main[0]==0){return true}}

//	A smaller faster version of
//	findAdjacent2(). Runs through
//	the balls until it finds the first
//	set of adjacent balls. Used by
//	checkLoser() to determine if the
//	game is over.
function smallAdjacent(k) {
isBottom = 0;
isHead = 0;
for (n = 0; n < 20; n++) {
if (k == head[n]) {
isHead = 1;
   }
}
for (n = 0; n < 20; n++) {
if (k == bottom[n]) {
isBottom = 1;
   }
}
if (main[k + 1] == main[k] && isHead != 1) {
return true;
}
if (main[k + 10] == main[k]) {
return true;
}
if (main[k - 1] == main[k] && isBottom != 1) {
return true;
}
if (main[k - 10] == main[k]) {
return true;
}
return false;
}

//	Slides all non-0 balls down the column
//	and places the zeroed balls at the top
//	of each column.
//	If all balls in a column are marked with
//	a 0, all subsequent columns are moved left
//	and the last column is zeroed out.
function slideBalls() {
change = 0;
for (i = 0; i < 15; i++) {
blankCount = 0;
column = new Array();
newColumn = new Array();
for (c = 0; c < 10; c++) {
column[c] = main[c + change];
}
for (c = 0; c < 10; c++) {
if (column[c] == 0) {
blankCount++;
newColumn[10-blankCount] = 0;
}
else {
newColumn[c - blankCount] = column[c];
   }
}
for (c = 0; c < 10; c++) {
main[c + change] = newColumn[c];
}
if (blankCount == 10) {
for (c = change; c < 150; c++) {
main[c] = main[c + 10];
}
for (c = 140; c < 150; c++) {
main[c] = 0;
}
change -= 10;
}
change += 10;
   }
}

//	Draws the balls on the game board based
//	on the values of the "main" Array.
//	0=blank  1=red  2=yellow  3=blue
function startUp() {
 document.getElementById('SHOW').innerHTML = 0;
 for (i = 0; i < main.length; i++) {
  document["img" + i].src = eval("off" + main[i] + ".src");
 }
}

// Take the ball which was clicked and find all connected
// balls of the same color with findAdjacent2()
function findAdjacent(k){
adj=new Array();
adj[0]=k;i=0;c=0;
findAdjacent2(adj[c]);
}

// Roll through "adj" Array and add adjacent balls of
// the same color
// Check in this order:
//  up(+1), right(+10), down(-1), left(-10)

// isBottom and isHead checks to see if the ball
// in question is on the top row or the bottom row.
// If the ball in question is on the bottom row, the
// down(-1) check is disabled, if it is on the top row
// up(+1) is disabled.
// Uses isAdjacent() to check whether or not the ball
// in question is allready included in the "adj" Array.
// Does not add the ball to the array if isAdjacent() returns
// false.
function findAdjacent2(k) {
isBottom = 0;
isHead = 0;
for (n = 0; n < 20; n++) {
if (k == head[n]) {
isHead = 1;
   }
}
for (n = 0; n < 20; n++) {
if (k == bottom[n]) {
isBottom = 1;
   }
}
if (main[k+1] == main[k] && isHead != 1 && isAdjacent(k+1)) {
i++;
adj[i] = k + 1;
}
if (main[k+10] == main[k] && isAdjacent(k+10)) {
i++;
adj[i] = k + 10;
}
if (main[k-1] == main[k] && isBottom != 1 && isAdjacent(k-1)) {
i++;
adj[i] = k - 1;
}
if (main[k-10] == main[k] && isAdjacent(k-10)) {
i++;
adj[i] = k - 10;
}
c++;
if (c == adj.length) {
blah = 500;
}
else {
findAdjacent2(adj[c]);
   }
}

// scan "adj" Array, return false if the ball is already counted
function isAdjacent(k){
for(n=0;n<adj.length;n++){if(adj[n]==k){return false}}
return true
}

function gameOver(q,score,winner){
var scores=new Cookie(document,'scores');
var msg2='';
if (scores.get('samegame')){
msg2+='<p>Your previous best was '+scores.get('samegame')+'</p>';
var hiscore=parseInt(scores.get('samegame'));
if(score>hiscore)scores.put('samegame',score);
}else{
scores.put('samegame',score)
}
scores.write()
document.getElementById('SCORE').innerHTML+='<div id="GAMEOVER"><p>Your score was '+score+'</p>'+msg2+'<p><a href="/games/samegame.html" onclick="location.href=document.location;return false;">Play Again?</a></div>';
}

function drawBoard(){
document.writeln('<table border="0" cellpadding="0" cellspacing="0" bgcolor="black">');
for(i=9;i>-1;i=i-1){
n=i;
for(c=0;15>c;c++){
if(10>n){document.writeln('<tr>')}
document.writeln('<td><a onclick="clickBall('+n+')" onmouseover=onBall('+n+') onmouseout=offBall('+n+')><img src="http://i.factmonster.com/images/games/samegameblack.gif" height="32" width="32" name="img'+n+'" border="0"></a></td>');
document["img"+n].src = eval("off"+main[n]+".src");
n=n+10;
}
}
document.writeln('</table>');
}
