
/* GMineSweeper - (not affiliated in any way with) google Labs 2006 */
/* hey, what are you looking at? go away! */


var tableArray;
var ncx=0;
var ncy=0;

var mineQueue;
var drawCache;

var gTimer=0;
var minesTotal=80;
var totMines=minesTotal;
var gameState="iniGame";

//var imagePath="http://members.lycos.co.uk/friol/ticker2/";
var imagePath="http://membres.lycos.fr/gmailer/img/";
//var imagePath="img/";

//

document.onload=initGame(30,16);

// click handlers

function faceOnMouseDown()
{
	var imma=document.getElementById("faceimg");
	imma.src=imagePath+"faceoff.gif";
}

function faceOnMouseUp()
{
	var imma=document.getElementById("faceimg");
	imma.src=imagePath+"face.gif";

	gameState="iniGame";
	totMines=minesTotal;
	gTimer=0;
	clearTable(tableArray);
	initMines(tableArray,minesTotal);
	updateMinesCount();

	var timec=document.getElementById("timec");
	var timed=document.getElementById("timed");
	var timeu=document.getElementById("timeu");
	timec.src=imagePath+"t_0.gif";
	timed.src=imagePath+"t_0.gif";
	timeu.src=imagePath+"t_0.gif";

	var tabba=document.getElementById("gameTable").getElementsByTagName("TBODY")[0];
	for (var yy=1;yy<(ncy-1);yy++)
	{
		for (var xx=1;xx<(ncx-1);xx++)
		{
			var mytr=tabba.getElementsByTagName("TR")[yy-1];
			var mytd=mytr.getElementsByTagName("TD")[xx-1];
			var img=mytd.getElementsByTagName("IMG")[0];
			img.src=imagePath+"coveredCell.gif";
		}
	}
	
	redrawTable(tableArray);
}

function clk(event)
{
	var evx;
	var evy;
	var theButton;

	if ((gameState!="newGame")&&(gameState!="iniGame")) return;

	//alert(event.target.xxx);
	
	if ((navigator.appName == 'Netscape')||(navigator.appName=='Opera'))
	{
		evx=event.target.xxx;
		evy=event.target.yyy;
		if (event.button==0)
		{
			theButton="left";
		}
		else if (event.button==2)
		{
			theButton="right";
		}
		else
		{
			theButton="none";
		}
		
		//alert(theButton);
	}
	else
	{
		evx=window.event.srcElement.xxx;
		evy=window.event.srcElement.yyy;
		if (window.event.button==1)
		{
			theButton="left";
		}
		else if (window.event.button==2)
		{
			theButton="right";
		}
		else
		{
			theButton="none";
		}
	}

	if (evx==null) return true;
	if (theButton=="none") return true;

	if (gameState=="iniGame")
	{
		setTimeout('mainTimer()',1000);
		gameState="newGame";
	}

	if (theButton=="left")
	{
		if (tableArray[evy][evx].flagged==false)
		{
			uncover(evx,evy);
		}
	}
	else
	{
		if (tableArray[evy][evx].flagged)
		{
			tableArray[evy][evx].flagged=false;
			totMines++;

			//mod20060621			
			var myimg=drawCache[evy-1][evx-1];
			myimg.src=imagePath+"coveredCell.gif";
		}
		else
		{
			tableArray[evy][evx].flagged=true;
			totMines--;
		}

		updateMinesCount();
		redrawTable(tableArray);
	}

	checkWon();

	return true;
}

function ValidateButton(ev)
{
	//alert(ev.button);
	if (ev.button==2) ev.preventDefault();
	return false;
}

if ((document.layers)||(navigator.appName=='Opera'))
{
	document.captureEvents(Event.MOUSEDOWN);
}

function nocontextmenu() 
{
	event.cancelBubble = true;
	event.returnValue = false;
	return false;
} 

document.oncontextmenu = nocontextmenu;
document.onmousedown=clk;

if (document.addEventListener)
{
	document.addEventListener("click",ValidateButton,false);
}

//

function checkWon()
{
	if (gameState=="gameOver") return;
	
	for (var y=1;y<(ncy-1);y++)
	{
		for (var x=1;x<(ncx-1);x++)
		{
			if (tableArray[y][x].state=="covered")
			{
				if (tableArray[y][x].flagged==true)
				{
					if (tableArray[y][x].val!="m") return;
				}
				else
				{
					return;
				}
			}
		}
	}		

	gameState="gameWon";
	var imma=document.getElementById("faceimg");
	imma.src=imagePath+"happyface.gif";
	alert("you win! visit http://noncisonomessaggi.blogspot.com/");
}

//

function mainTimer()
{
	gTimer++;
	
	var uni=gTimer%10;
	var dec=Math.floor((gTimer/10)%10);
	var cent=Math.floor(gTimer/100);

	if ((gameState!="iniGame")&&(gameState!="newGame"))
	{
		uni=9; dec=9; cent=9;
	}
	else if (gameState=="iniGame")
	{
		uni=0; dec=0; cent=0;
	}
	
	var timec=document.getElementById("timec");
	var timed=document.getElementById("timed");
	var timeu=document.getElementById("timeu");
	timec.src=imagePath+"t_"+cent+".gif";
	timed.src=imagePath+"t_"+dec+".gif";
	timeu.src=imagePath+"t_"+uni+".gif";
	
	if (gameState=="newGame")
	{
		setTimeout('mainTimer()',1000);
	}
}

function updateMinesCount()
{
	var tempMines=totMines;
	if (tempMines<0) tempMines=0;
	
	var uni=tempMines%10;
	var dec=Math.floor(tempMines/10);
	var cent=Math.floor(tempMines/100);

	var timec=document.getElementById("minec");
	var timed=document.getElementById("mined");
	var timeu=document.getElementById("mineu");
	timec.src=imagePath+"t_"+cent+".gif";
	timed.src=imagePath+"t_"+dec+".gif";
	timeu.src=imagePath+"t_"+uni+".gif";
}

//
//
//

function uncover(thex,they)
{
	//recursion is *off*
	
	if (tableArray[they][thex].val=="m")
	{
		// game over.
		gameState="gameOver";
		gameOver(tableArray,thex,they);
		var imma=document.getElementById("faceimg");
		imma.src=imagePath+"angryface.gif";
		return;
	}
	
	if (tableArray[they][thex].state=="uncovered")
	{
		// dah!
		return;
	}

	//

	if ((tableArray[they][thex].val=="e")&&(tableArray[they][thex].state=="covered"))
	{
		tableArray[they][thex].state="uncovered";
		
		var sstr=thex+"-"+they;
		mineQueue.push(sstr);
	}

	//
		
	var exitIt=false;
	while (!exitIt)
	{
		var newx;
		var newy;

		var curcell=mineQueue[mineQueue.length-1];
		newx=curcell.substr(0,curcell.indexOf("-"));
		newy=curcell.substr(curcell.indexOf("-")+1);
		mineQueue.pop();

		newx=parseInt(newx);
		newy=parseInt(newy);
	
		//
		
		var surroundings=0;

		if (tableArray[newy-1][newx-1].val!="e") surroundings++;
		if (tableArray[newy-1][newx  ].val!="e") surroundings++;
		if (tableArray[newy-1][newx+1].val!="e") surroundings++;
		if (tableArray[newy  ][newx+1].val!="e") surroundings++;
		if (tableArray[newy+1][newx+1].val!="e") surroundings++;
		if (tableArray[newy+1][newx  ].val!="e") surroundings++;
		if (tableArray[newy+1][newx-1].val!="e") surroundings++;
		if (tableArray[newy  ][newx-1].val!="e") surroundings++;
	
		if (surroundings==0)
		{
			var sstr;

			if ((tableArray[newy-1][newx-1].state=="covered")&&(tableArray[newy-1][newx-1].flagged==false))
			{
				tableArray[newy-1][newx-1].state="uncovered";
				sstr=(newx-1)+"-"+(newy-1); mineQueue.push(sstr);
			}
			if ((tableArray[newy-1][newx  ].state=="covered")&&(tableArray[newy-1][newx  ].flagged==false))
			{
				tableArray[newy-1][newx  ].state="uncovered";
				sstr=(newx)+"-"+(newy-1); mineQueue.push(sstr);
			}
			if ((tableArray[newy-1][newx+1].state=="covered")&&(tableArray[newy-1][newx+1].flagged==false))
			{
				tableArray[newy-1][newx+1].state="uncovered";
				sstr=(newx+1)+"-"+(newy-1); mineQueue.push(sstr);
			}
			if ((tableArray[newy ][newx+1].state=="covered")&&(tableArray[newy ][newx+1].flagged==false))
			{
				tableArray[newy  ][newx+1].state="uncovered";
				sstr=(newx+1)+"-"+(newy); mineQueue.push(sstr);
			}
			if ((tableArray[newy+1][newx+1].state=="covered")&&(tableArray[newy+1][newx+1].flagged==false))
			{
				tableArray[newy+1][newx+1].state="uncovered";
				sstr=(newx+1)+"-"+(newy+1); mineQueue.push(sstr);
			}
			if ((tableArray[newy+1][newx  ].state=="covered")&&(tableArray[newy+1][newx  ].flagged==false))
			{
				tableArray[newy+1][newx  ].state="uncovered";
				sstr=(newx)+"-"+(newy+1); mineQueue.push(sstr);
			}
			if ((tableArray[newy+1][newx-1].state=="covered")&&(tableArray[newy+1][newx-1].flagged==false))
			{
				tableArray[newy+1][newx-1].state="uncovered";
				sstr=(newx-1)+"-"+(newy+1); mineQueue.push(sstr);
			}
			if ((tableArray[newy  ][newx-1].state=="covered")&&(tableArray[newy  ][newx-1].flagged==false))
			{
				tableArray[newy  ][newx-1].state="uncovered";
				sstr=(newx-1)+"-"+(newy); mineQueue.push(sstr);
			}
		}
		else 
		{
			tableArray[newy][newx].minecount=surroundings;
		}

		//redrawTable(tableArray);
		
		if (mineQueue.length==0)
		{
			exitIt=true;
		}
	}
	
	redrawTable(tableArray);
}

function gameOver(arr,thex,they)
{
	var tabba=document.getElementById("gameTable").getElementsByTagName("TBODY")[0];

	for (var y=1;y<(ncy-1);y++)
	{
		for (var x=1;x<(ncx-1);x++)
		{
			if (arr[y][x].state=="covered")
			{             
				if (arr[y][x].val=="m")
				{
					if ((thex==x)&&(they==y))
					{
						var mytr=tabba.getElementsByTagName("TR")[y-1];
						var mytd=mytr.getElementsByTagName("TD")[x-1];
						var img=mytd.getElementsByTagName("IMG")[0];
						img.src=imagePath+"redmine.gif";
					}
					else
					{
						var mytr=tabba.getElementsByTagName("TR")[y-1];
						var mytd=mytr.getElementsByTagName("TD")[x-1];
						var img=mytd.getElementsByTagName("IMG")[0];
						img.src=imagePath+"mine.gif";
					}
				}
				else if ((arr[y][x].flagged==true)&&(arr[y][x].val!="m"))
				{
					// wrongly flagged
					var mytr=tabba.getElementsByTagName("TR")[y-1];
					var mytd=mytr.getElementsByTagName("TD")[x-1];
					var img=mytd.getElementsByTagName("IMG")[0];
					img.src=imagePath+"cross.gif";
				}
				else if (arr[y][x].flagged==true)
				{
					var mytr=tabba.getElementsByTagName("TR")[y-1];
					var mytd=mytr.getElementsByTagName("TD")[x-1];
					var img=mytd.getElementsByTagName("IMG")[0];
					img.src=imagePath+"flagged.gif";
				}
				else
				{
					var mytr=tabba.getElementsByTagName("TR")[y-1];
					var mytd=mytr.getElementsByTagName("TD")[x-1];
					var img=mytd.getElementsByTagName("IMG")[0];
					img.src=imagePath+"coveredCell.gif";
				}
			}
			else if (arr[y][x].val=="e")
			{
				if (arr[y][x].minecount=="-")
				{
					var mytr=tabba.getElementsByTagName("TR")[y-1];
					var mytd=mytr.getElementsByTagName("TD")[x-1];
					var img=mytd.getElementsByTagName("IMG")[0];
					img.src=imagePath+"emptyCell.gif";
				}
				else
				{
					var mytr=tabba.getElementsByTagName("TR")[y-1];
					var mytd=mytr.getElementsByTagName("TD")[x-1];
					var img=mytd.getElementsByTagName("IMG")[0];
					img.src=imagePath+arr[y][x].minecount+".gif";
				}
			}
		}
	}
	
}

function redrawTable(arr)
{
	var tabba=document.getElementById("gameTable").getElementsByTagName("TBODY")[0];
	var x,y;

	for (y=1;y<(ncy-1);y++)
	{
		for (x=1;x<(ncx-1);x++)
		{
			if (arr[y][x].state=="covered")
			{             
				if (arr[y][x].flagged==true)
				{
					var myimg=drawCache[y-1][x-1];
					myimg.src=imagePath+"flagged.gif";
				}
			}
			else if ((arr[y][x].val=="e")&&(arr[y][x].minecount=="-"))
			{
				var mytr=tabba.getElementsByTagName("TR")[y-1];
				var mytd=mytr.getElementsByTagName("TD")[x-1];
				var myimg=mytd.getElementsByTagName("IMG")[0];
				myimg.src=imagePath+"emptyCell.gif";
				//mytd.style.width="16px";
				//mytd.style.height="16px";
				//mytd.style.border="none";
			}
		}
	}

	//
	
	for (y=1;y<(ncy-1);y++)
	{
		for (x=1;x<(ncx-1);x++)
		{
			if ((arr[y][x].state!="covered")&&((arr[y][x].val=="e")&&(arr[y][x].minecount!="-")))
			{
				var myimg=drawCache[y-1][x-1];
				myimg.src=imagePath+arr[y][x].minecount+".gif";
			}
		}
	}
	
}

function clearTable(arr)
{
	for (var y=0;y<ncy;y++)
	{
		for (var x=0;x<ncx;x++)
		{
			arr[y][x].val="e";
			if ((x==0)||(y==0)||(x==(ncx-1))||(y==(ncy-1)))
			{
				arr[y][x].state="uncovered";
			}
			else
			{
				arr[y][x].state="covered";
			}
			arr[y][x].minecount="-";
			arr[y][x].flagged=false;
		}
	}
}

function initMines(arr,nummines)
{
	var placedMines=0;
	
	while (placedMines<nummines)
	{
		var xr=Math.floor(Math.random()*(ncx-2));
		var yr=Math.floor(Math.random()*(ncy-2));
		
		if (arr[yr+1][xr+1].val!="m")
		{
			arr[yr+1][xr+1].val="m";
			placedMines++;
		}		
		
	}
	
}

function initGame(xcells,ycells)
{
	ncx=xcells+2;
	ncy=ycells+2;
	
	//
	
	mineQueue=new Array();

	//
	
	tableArray=new Array(ncy);
	
	for (var i=0;i<ncy;i++)
	{
		tableArray[i]=new Array(ncx);
		for (var z=0;z<ncx;z++)
		{
			tableArray[i][z]=new Object();
		}		
	}
	
	clearTable(tableArray);
	initMines(tableArray,totMines);
	
	//
	
	var tabba=document.getElementById("gameTable").getElementsByTagName("TBODY")[0];

	for (var y=0;y<ycells;y++)
	{	
		var newrow = document.createElement("TR");
	
		for (var x=0;x<xcells;x++)
		{	
			var newtd = document.createElement("TD");
			var myii=new Image();
			myii.src=imagePath+"coveredCell.gif";
			myii.xxx=x+1;
			myii.yyy=y+1;
			newtd.appendChild(myii);
			newrow.appendChild(newtd);						
		}
		
		tabba.appendChild(newrow);
	}

	// fix firefox bugs....
	
	for (var yy=1;yy<(ncy-1);yy++)
	{
		for (var xx=1;xx<(ncx-1);xx++)
		{
			var mytr=tabba.getElementsByTagName("TR")[yy-1];
			var mytd=mytr.getElementsByTagName("TD")[xx-1];
			var myimg=mytd.getElementsByTagName("IMG")[0];
			mytd.style.width="16px";
			mytd.style.height="16px";
			mytd.style.border="none";
		}
	}	

	//

	drawCache=new Array(ncy-2);
	for (var r=0;r<(ncy-2);r++)
	{
		drawCache[r]=new Array(ncx-2);
	}

	for (var ayy=1;ayy<(ncy-1);ayy++)
	{
		for (var axx=1;axx<(ncx-1);axx++)
		{
			var mytr=tabba.getElementsByTagName("TR")[ayy-1];
			drawCache[ayy-1][axx-1]=mytr.getElementsByTagName("TD")[axx-1].getElementsByTagName("IMG")[0];
		}
	}
	
	//
	
	redrawTable(tableArray);
	updateMinesCount();
}
