

var SolverBoard = new Array(10);
for (x=0; x <9; x++)
	{ 
	SolverBoard[x]=new Array(9);
	for (y=0; y <9; y++)
		SolverBoard[x][y]=new Array(10);
	 }

function SimpleSolve()
{
var sRet;

InitBoard();
CheckPoss();
sRet=MoveSoleCandidate();

if (sRet=='')
	sRet=MoveUniqueCandidateRow();

if (sRet=='')
	sRet=MoveUniqueCandidateCol();

if (sRet=='')
	sRet=MoveUniqueCandidateBlock();

WriteBoard();

if (sRet=='')
	alert('No numbers were fixed, only possibilities');
else
	alert(sRet);

}

function SolveEasy()
{
var sRet;

InitBoard();

do {
	CheckPoss();
	sRet=MoveSoleCandidate();

	if (sRet=='')
		sRet=MoveUniqueCandidateRow();

	if (sRet=='')
		sRet=MoveUniqueCandidateCol();

	if (sRet=='')
		sRet=MoveUniqueCandidateBlock();

	WriteBoard();
	} while (sRet!='')

	alert("OK, I've solved all I can.");
	CheckSolution(true);
}

function Hint()
{
var sRet;
var iX;
var iY;
var oControl;
var iC;
var sOldChars;

InitBoard();
CheckPoss();

sRet=MoveSoleCandidate();


if (sRet=='')
	sRet=MoveUniqueCandidateRow();

if (sRet=='')
	sRet=MoveUniqueCandidateCol();

if (sRet=='')
	sRet=MoveUniqueCandidateBlock();

if (sRet=='')
	alert("Sorry, I can't help you. Too tough for me!");
else
	{
	iX =parseInt(sRet.split(',')[0]);
	iY =parseInt(sRet.split(',')[1]);
	iC = iX + iY*9;
	oControl = document.getElementById('T'+iC);
	sOldChars =SaveGameSquare(oControl, oControl.innerHTML);
	IntervalTimes[iC][4]='00ccff';
	IntervalTimes[iC][3]=sOldChars;
	IntervalTimes[iC][2]=6;
	IntervalTimes[iC][1] = setInterval("FlashSquare(" + iC + ")", 300);
	}
}

function InitBoard()
{
var iC;
var iX;
var iY;
var sValue;
var oControl;

for (iC=0;iC<81;iC++)
	{
	iX = iC % 9;
	iY = Math.floor(iC/9);
	oControl = document.getElementById('T'+iC);
	if (oControl.style.fontSize=='' && oControl.innerText!=' ' && oControl.innerHTML.toUpperCase()!='&NBSP;')
		{
		sValue = oControl.innerHTML.toUpperCase();
		sValue = sValue.replace('<B>','').replace('</B>','')
		FixNumber(iX,iY,parseInt(sValue));
		}
	else
		{
		SolverBoard[iX][iY][0]=0;
		for (iI=1; iI <=9; iI++)
			SolverBoard[iX][iY][iI]=1;
		}
		
	}
}

function WriteBoard()
{
var iC;
var iX;
var iY;
var sValue;
var oControl;
var iI;

for (iC=0;iC<81;iC++)
	{
	iX = iC % 9;
	iY = Math.floor(iC/9);
	oControl = document.getElementById('T'+iC);
	if (SolverBoard[iX][iY][0] !=0 )
		{
		if ( oControl.innerHTML.toUpperCase().indexOf("<B>") ==-1)
			{
			TDSettings(oControl,false);
			oControl.innerHTML=SolverBoard[iX][iY][0];
			}
		}
		else
		{
		TDSettings(oControl,true)
		sValue = '';
		for (iI=1;iI<=9;iI++)
			{
			if (SolverBoard[iX][iY][iI]!=0)
				{
				sValue = sValue + iI + ' ';
				}
			}
		oControl.innerHTML=sValue;
		AddPoss(oControl,-1);
		}
	}
	
}

function FixNumber(iX,iY,iNum)
{
var iI;
	SolverBoard[iX][iY][0] = iNum;
	for (iI=1;iI<=9;iI++)
		SolverBoard[iX][iY][iI] = 0;
}

function CheckPoss()
{
var iX;
var iY;

for (iX=0; iX <9; iX++)
	{ 
	for (iY=0; iY <9; iY++)
		{
		if (SolverBoard[iX][iY][0]!=0)
			RemovePoss(iX,iY);
		}
	}
}

function RemovePoss(iX,iY)
{
var iJ;
var iNum;
var tX;
var tY;

	iNum = SolverBoard[iX][iY][0];

	for (i=0;i<9;i++)
		{
		SolverBoard[i][iY][iNum]=0;
		SolverBoard[iX][i][iNum]=0;
		}
	for (tX =0; tX<3;tX++)
		{
		for (tY =0; tY<3;tY++)
			{
		 	SolverBoard[tX+(Math.floor(iX/3)*3)][tY+(Math.floor(iY/3)*3)][iNum]=0;
			}
		}

}

function MoveSoleCandidate()
{
var iX;
var iY;
var iChosen;
var iI;

for (iX=0; iX <9; iX++)
	{ 
	for (iY=0; iY <9; iY++)
		{
		if (SolverBoard[iX][iY][0]==0)
			{
			iChosen=0;
			for (iI=1;iI<=9;iI++)
				{
				if (SolverBoard[iX][iY][iI]!=0)
					{
					if (iChosen==0)
						iChosen = iI;
					else
						iChosen = -1;
					}
				}
			if (iChosen>0)
				{
				FixNumber(iX,iY,iChosen);
				CheckPoss();
				<!-- return 'Put ' + iChosen + ' in c' + (iX+1) + 'r' + (iY+1) + ' (Sole Candidate)'; // -->
				return iX + ',' + iY;
				}
			}
				
		}
	}
return '';
}

function MoveUniqueCandidateRow()
{
var iX;
var iY;
var iChosenX;
var iI;

for (iY=0; iY <9; iY++)
	{
	for (iI=1;iI<=9;iI++)
		{
		iChosenX=-1
		for (iX=0; iX <9; iX++)
			{
			if (SolverBoard[iX][iY][iI]!=0)
				{
				if (iChosenX==-1)
					iChosenX = iX;
				else
					iChosenX = -2;
				}
			}
		if (iChosenX>-1)
			{
			FixNumber(iChosenX,iY,iI);
			CheckPoss();
			<!-- return 'Put ' + iI + ' in c' + (iChosenX+1) + 'r' + (iY+1) + ' (Row Unique Candidate)'; // -->
			return iChosenX + ',' + iY;
			}
		}
	}
return '';
}

function MoveUniqueCandidateCol()
{
var iX;
var iY;
var iChosenY;
var iI;

for (iX=0; iX <9; iX++) 
	{
	for (iI=1;iI<=9;iI++)
		{
		iChosenY=-1
		for (iY=0; iY <9; iY++)
			{
			if (SolverBoard[iX][iY][iI]!=0)
				{
				if (iChosenY==-1)
					iChosenY = iY;
				else
					iChosenY = -2;
				}
			}
		
		if (iChosenY>-1)
			{
			FixNumber(iX,iChosenY,iI);
			CheckPoss();
			<!-- return 'Put ' + iI + ' in c' + (iX+1) + 'r' + (iChosenY+1) + ' (Column Unique Candidate)'; // -->
			return iX + ',' + iChosenY;
			}
		}
	}
return '';
}

function MoveUniqueCandidateBlock()
{
var iX;
var iY;
var iChosenX;
var iChosenY;
var iI;
var iB;
var iXAdd;
var iYAdd;

for (iB=0;iB<9;iB++)
	{
	iXAdd = (iB % 3)*3;
	iYAdd = Math.floor(iB/3) * 3;
	for (iI=1; iI <=9; iI++) 
		{
		iChosenX = -1;
		iChosenY = -1;
		for (iX=iXAdd; iX <(iXAdd+3); iX++) 
			{
			for (iY=iYAdd;iY<(iYAdd+3);iY++)
				{
				if (SolverBoard[iX][iY][iI]!=0)
					{
					if (iChosenX==-1)
						{
						iChosenX = iX;
						iChosenY = iY;
						}
					else
						iChosenX = -2;
					}
				}
			}
		if (iChosenX>-1)
			{
			FixNumber(iChosenX,iChosenY,iI);
			CheckPoss();
			<!-- return 'Put ' + iI + ' in c' + (iChosenX+1) + 'r' + (iChosenY+1) + ' (Block Sole Candidate)'; // -->
			return iChosenX + ',' + iChosenY;
			}

		}	
	}
return '';
}


