var CurrSpaceCtl;
var sPicName;
var iGridDim;
var iTDPicSize;
var iAnimMoveCount;
var AnimInvID;
var AnimSpeed;
var ScrambleMoves;
var ScrambleID;
var ScrambleLastMove;
var PicUrlEncoded;
var UserHeading;
var DiffDesc;
var GameStarted;
var AllowForCellSpace;
var MovingSquareParent;
var oPrizeInverval;
var IE = document.all;

iAnimMoveCount=-999;
ScrambleMoves=0;
ScrambleID=-999;

function TellAFriend() {
var initialsubj="Check it out, a cool online sliding puzzle";
var initialmsg="Hi:%0A%0A Free online sliding puzzles at http://slidingpuzzle.net";
window.location = "mailto:?subject="+initialsubj+"&body="+initialmsg; }

function MailAFriend()
{
var initialsubj="Check out this puzzle";

var initialmsg="Hi:%0A%0A Check out this sliding puzzle, with a photo I chose myself%0A http://slidingpuzzle.net?PicURL=" + PicUrlEncoded + "%26Size=" + iTDPicSize + "%26Go=" + DiffDesc + "%26Hd=" + UserHeading;
window.location = "mailto:?subject="+initialsubj+"&body="+initialmsg;
}

function ClickSpace(e)
{

if (GameStarted==false)
	{
	alert("Let's start the game, shall we?");
	JumbleBoard();
	return true;
	}

var iXSpace;
var iYSpace;
var iXTaken;
var iYTaken;

iXTaken = parseInt(this.id.substring(1,2));
iYTaken = parseInt(this.id.substring(2,3));
iXSpace = parseInt(CurrSpaceCtl.id.substring(1,2));
iYSpace = parseInt(CurrSpaceCtl.id.substring(2,3));

if (!( (Math.abs(iXTaken-iXSpace)==1 && iYTaken==iYSpace) || (iXTaken==iXSpace && Math.abs(iYTaken-iYSpace)==1) ))
	return true;
	
MoveToSpace(this , iXSpace-iXTaken,iYSpace-iYTaken);
}

function AnimMove(oTakenSquareID,iXMove,iYMove)
{
var iThisXMove;
var iThisYMove;
var oTakenSquare;

oTakenSquare = document.getElementById(oTakenSquareID);

iAnimMoveCount=iAnimMoveCount+AnimSpeed;

if (iXMove!=0)
	{
	iThisXMove =iAnimMoveCount * iXMove;
	oTakenSquare.style.left = iThisXMove + 'px';
	}

if (iYMove!=0)
	{
	iThisYMove =iAnimMoveCount * iYMove;
	oTakenSquare.style.top = iThisYMove + 'px'
	}

if (iAnimMoveCount>(iTDPicSize+AllowForCellSpace))
	{
	iAnimMoveCount=-999;

	oTakenSquare.style.position='';
	oTakenSquare.style.top='0px';
	oTakenSquare.style.left='0px';
	oTakenSquare =  MovingSquareParent;
	CurrSpaceCtl.innerHTML = oTakenSquare.innerHTML;
	oTakenSquare.innerHTML = '';
	CurrSpaceCtl = oTakenSquare;

		clearInterval(AnimInvID);

	if (ScrambleID=-999)
		CheckSolution()
	}
}

function CheckSolution()
{
var iX;
var iY;
var oControl;
var iC;

	iC=0;

  for (iY=1;iY<=iGridDim;iY++)
	{
	for (iX=1;iX<=iGridDim;iX++)
		{
		iC++;
 		oControl=document.getElementById('T' + iX + iY);
    	if (oControl.childNodes[0])
    		{
    		if (oControl.childNodes[0].id!='PP'+iC)
    			return true;	 
    		}
		}
	}
	
	ShowPrize();
}

function RandomSpaceMove()
{
var iXSpace;
var iYSpace;
var iXAdjust;
var iYAdjust;
var iXNew;
var iYNew;
var IsOK;
var iMove;

iXSpace = parseInt(CurrSpaceCtl.id.substring(1,2));
iYSpace = parseInt(CurrSpaceCtl.id.substring(2,3));

IsOK= false;

	do {
	iXAdjust=0;
	iYAdjust=0;
	iMove =Math.floor(Math.random()*2);
	if (iMove==0)
		{
		iMove =Math.floor(Math.random()*2)
		if (iMove==0)
			iXAdjust=1;
			else	iXAdjust=-1;
		} else
		{
		iMove =Math.floor(Math.random()*2)
		if (iMove==0)
			iYAdjust=1;
			else	iYAdjust=-1;
		}
	iXNew = iXAdjust + iXSpace;
	iYNew = iYAdjust + iYSpace;
	
	if (document.getElementById('T' + iXNew + iYNew))
		{
		if (document.getElementById('T' + iXNew + iYNew)!=ScrambleLastMove)
			{
			ScrambleLastMove=CurrSpaceCtl;
			IsOK=true;
			}
		}
	} 
	while (IsOK==false);
	
	MoveToSpace(document.getElementById('T' + iXNew + iYNew),-iXAdjust,-iYAdjust);
}

function JumbleBoard()
{
GameStarted = true;
ScrambleMoves=0;
ScrambleID=setInterval("ScrambleBoard()",50);
}

function ScrambleBoard()
{
	if (iAnimMoveCount!=-999)
		return true;
	
	AnimSpeed = 5 * (iTDPicSize/50);
	ScrambleMoves++;

	if (ScrambleMoves> (20 + (iGridDim-4)*10))
		{
		AnimSpeed = 3 * (iTDPicSize/50);
		clearInterval(ScrambleID);
		ScrambleID=-999;
		} else
		{	RandomSpaceMove(); }
}

function MoveToSpace(oTakenSquare,iXMove,iYMove)
{
var oMovingSquare;
MovingSquareParent=oTakenSquare;

oMovingSquare = oTakenSquare.childNodes[0];
oMovingSquare.style.position='relative';
oMovingSquare.style.top='0px';
oMovingSquare.style.left='0px';

iAnimMoveCount=0;
AnimInvID = setInterval("AnimMove('" + oMovingSquare.id + "'," + iXMove + "," + iYMove + ")", 1);

}

function XBrowserAddHandler(target,eventName,handlerName) { 
  if ( target.addEventListener ) { 
    target.addEventListener(eventName, function(e){target[handlerName](e);}, false);
  } else if ( target.attachEvent ) { 
    target.attachEvent("on" + eventName, function(e){target[handlerName](e);});
  } else { 
    var originalHandler = target["on" + eventName]; 
    if ( originalHandler ) { 
      target["on" + eventName] = function(e){originalHandler(e);target[handlerName](e);}; 
    } else { 
      target["on" + eventName] = target[handlerName]; 
    } 
  } 
}

function PlacePic(oTDSquare, iPicPieceNum)
{
var iXOffset;
var iYOffset;

iXOffset = ((iPicPieceNum-1) % iGridDim) * iTDPicSize;
iYOffset = Math.floor((iPicPieceNum-1)/iGridDim) * iTDPicSize;

oTDSquare.innerHTML = "<div id='PP" + iPicPieceNum + "' style='width:" + iTDPicSize + "px; height: " + iTDPicSize + "px;overflow:hidden'><img src='" + sPicName + "' border=0 height=" + (iGridDim*iTDPicSize) + "px width=" + (iGridDim*iTDPicSize) + "px style='margin-left: -" + iXOffset + "px; margin-top: -" + iYOffset + "px'></div>"; 
}

function ShowPrize()
{
var iSize;
var oPrizePic;

document.getElementById('puzzletable').style.MozOpacity = '1.0';

iSize = iGridDim*iTDPicSize + (iGridDim-1)*6;
var oHideDiv = document.getElementById('hideDiv');
oHideDiv.style.MozOpacity = '0.0';
oHideDiv.style.height =iSize + 'px';
oHideDiv.style.width= iSize + 'px';

oHideDiv.style.position = 'relative';
oHideDiv.style.top ='-' + iSize + 'px';


document.getElementById('Grabber').style.position = 'relative';
document.getElementById('Grabber').style.top ='-' + iSize + 'px';


oPrizePic = document.getElementById('PrizePic');
oPrizePic.style.display = '';
oPrizePic.style.width= iSize + 'px';
oPrizePic.style.height= iSize + 'px';

curOpac = 0;
oPrizeInverval = setInterval("ShowPrizeGrad()",10)

IE?document.getElementById("hideDiv").style.filter="alpha(opacity="+curOpac+")":document.getElementById("hideDiv").style.MozOpacity=curOpac/90.1;

oHideDiv.style.display = '';

}

function ShowPrizeGrad()
{

curOpac++;

if (curOpac>90)
	{
	clearInterval(oPrizeInverval);
	document.getElementById('hideDiv').style.MozOpacity = '1.0';
	document.getElementById('puzzletable').style.MozOpacity = '0.0';
	alert('Congratulations');
	return true;
	}
	
IE?document.getElementById("hideDiv").style.filter="alpha(opacity="+curOpac+")":document.getElementById("hideDiv").style.MozOpacity=curOpac/90.1;

IE?document.getElementById("puzzletable").style.filter="alpha(opacity="+(90-curOpac)+")":document.getElementById("sudokutable").style.MozOpacity=(90-curOpac)/90.1;

}



function InitGame()
{
var iX;
var iY;
var oControl;
var iC;

	iC=0;

  for (iY=1;iY<=iGridDim;iY++)
	{
	for (iX=1;iX<=iGridDim;iX++)
		{
		iC++;
 		oControl=document.getElementById('T' + iX + iY);
    	oControl.ClickHandler = ClickSpace; 
    	XBrowserAddHandler(oControl,"click","ClickHandler");
    	
    	if (iC>1)
    		PlacePic(oControl,iC);
		}
	}
	
	CurrSpaceCtl = document.getElementById('T11');
GameStarted = false;
AllowForCellSpace =3;
document.getElementById('PrizePic').src = sPicName;


}
