var oCurrentPlayingSquare;

function KeyGet(e)
{
var keycode;
if (e) keycode=e.which;
     else keycode=window.event.keyCode;
   return String.fromCharCode(keycode);
}

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 XBrowserAddHNoCM(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); return false});
  } 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 trimString (str) {
  while (str.charAt(0) == ' ')
    str = str.substring(1);
  while (str.substring(0,6) == '&nbsp;')
    str = str.substring(6);
  while (str.charAt(str.length - 1) == ' ')
    str = str.substring(0, str.length - 1);
  return str;
}

function IsKeyOK(sChar)
{
var sOKChars='1234567890ABCDEFG';
sChar = sChar.toUpperCase();
if (sOKChars.indexOf(sChar)==-1)
	return false;
	else return true;
}

function CurNumSelect(e) 
{
var iNewNum;
if (this.innerHTML.toUpperCase().indexOf("<B>") ==-1)
	{
	if (IsClear(this)==true)
		iNewNum = 0; 
		else
		iNewNum = this.innerHTML;
	MoveNum(iNewNum);
	}
}

function MoveNum(iNewNum)
{
if (iNewNum==iCurNum)
	return true;

var oNumCtl;

oNumCtl = document.getElementById('Num' + iCurNum);
oNumCtl.bgColor='';
if (iCurNum==0)
	oNumCtl.innerHTML = '&nbsp;';
	else 
	oNumCtl.innerHTML = iCurNum;


iCurNum = iNewNum;
if (document.getElementById("GreyUsedNumbers").checked == true)
	CheckUsedNumbers();
	else SetCurrentNum();
}

function NumToHex(iTestNum)
{
if (iTestNum>9)
	return String.fromCharCode(iTestNum+55);
else
	return iTestNum;
}

function SetCurrentNum()
{
oNumCtl = document.getElementById('Num' + iCurNum);
if (oNumCtl.innerHTML.toUpperCase()!='&NBSP;')
	{ 
	oNumCtl.innerHTML= '<b>'+iCurNum+'</b>';
	if (oNumCtl.bgColor=='')
		{
		oNumCtl.bgColor = sSqMarkColor; 
		}
	}

}

function ShowFullSolution()
{
var iC;

if ( document.getElementById('btnFullSol').value=='Show Solution')
	{
	document.getElementById('btnFullSol').value='Hide Solution';
	for (iC=0;iC<iGridSolved.length;iC++)
		{
 		oControl=document.getElementById('T' + iC);
		oControl.bgColor='';
		if (IsClear(oControl)==true)
			{ iPlayerMoves[iC]=0; }
			else
			{ 
			if (IsPoss(oControl)==false)
				{ iPlayerMoves[iC]='N'; }
				else { iPlayerMoves[iC]='P' }

			iPlayerMoves[iC]=iPlayerMoves[iC]  + oControl.innerHTML;
			}
 
		if (iGridUnsolved[iC]==0)
			{oControl.innerHTML = iGridSolved[iC]; }
			else 
			{ oControl.bgColor = sBGColor; }

		TDSettings(oControl,false);
		}
	}
	else
	{
	document.getElementById('btnFullSol').value='Show Solution';
	for (iC=0;iC<iGridSolved.length;iC++)
		{
 		oControl=document.getElementById('T' + iC);
		oControl.bgColor='';
		if (iPlayerMoves[iC]==0)
			{ ClearSquare(oControl); }
			else 
			{ if (iGridUnsolved[iC]==0)
				{ 
				if (iPlayerMoves[iC].substring(0,1)=='P' )
					TDSettings(oControl,true);		
				oControl.innerHTML =iPlayerMoves[iC].substring(1);
				}
				else { oControl.bgColor = sBGColor; }
			}
		}
	}
}

function TDSettings(oCtl,bPossibilityOn)
{
if (bPossibilityOn==true)
	{
	oCtl.style.fontSize='10px';
	oCtl.style.textAlign='right';
	oCtl.vAlign='top';
	}
	else
	{
	oCtl.style.fontSize='';
	oCtl.style.textAlign='center';
	oCtl.vAlign='center';
	}
}

function ResetBoard()
{
var iC;
var oControl;
for (iC=0;iC<iGridUnsolved.length;iC++)
	{
 	oControl=document.getElementById('T' + iC);
	TDSettings(oControl,false);
	if (iGridUnsolved[iC]!=0)
		{ oControl.innerHTML ='<b>'+ iGridUnsolved[iC] + '</b>';
		  oControl.bgColor = sBGColor; }
		else
		{ oControl.innerHTML ='&nbsp;';
		  oControl.bgColor=''; }
	}
}

function ResetPoss()
{
var iC;
var oControl;
for (iC=0;iC<iGridUnsolved.length;iC++)
	{
 	oControl=document.getElementById('T' + iC);
	if (IsPoss(oControl))
		{
		ClearSquare(oControl)
		}
	}
}

function IsPoss(oControl)
{
if (oControl.innerHTML.toUpperCase().indexOf('TABLE')!=-1 || oControl.innerHTML.toUpperCase().indexOf('<DIV')!=-1 )
	return true;
else return false; 
}

function IsGridPoss(oControl)
{
if (oControl.innerHTML.toUpperCase().indexOf('TABLE')!=-1  )
	return true;
else return false; 
}

function ClearSquare(oControl)
{
	TDSettings(oControl,false);
	oControl.innerHTML='&nbsp;';
}



function CheckSolution(bOnlyCheckFinished)
{
var iStatus;

iStatus = CheckSolutionBoard(bOnlyCheckFinished,false);

switch (iStatus) {
	case 0 :
		if (bOnlyCheckFinished==true)
			{ 		
			var sTime ;
			if (document.getElementById('TimerStartPause').value == "Pause")
				{
				sTime = " Your time was " + document.getElementById('TimerTime').innerHTML;
				document.getElementById('Timer_SecondsTaken').value = SWhour * 3600 + SWmin * 60 + parseInt(SWsec);
				PauseCheck(true);
				} 
			else 
				{ sTime=''; }
			sCongratsMsg = 'Correct - Congratulations!' + sTime + sPrizeCaption;
			ShowPrize();
			}
		break;
	case 1 :
		if (bOnlyCheckFinished==false)
			{ alert('All moves so far are correct.'); }
		break;
	default :
		if (bOnlyCheckFinished==false)
			{ 
			if (confirm('Some numbers were incorrect.\n\nWould you like to see which ones?'))
				{
				CheckSolutionBoard(bOnlyCheckFinished,true);
				}
			 } 
		}
	

}

function HexToNum(sHex)
{
var sHexChars;
sHexChars = "ABCDEFG";
if (sHexChars.indexOf(sHex)>-1)
	return (sHex.charCodeAt(0)-55);
else
	return parseInt(sHex);
}

function CheckUsedNumbers()
{
var iUsedNumbers = new Array(10);
var iCurrSize;
var iC;
var iValue;
var sValue;
var oControl;
var oNumCtl;
var iTemp;

if (document.getElementById("GreyUsedNumbers").checked == false)
	return true;

iCurrSize = document.getElementById('sudokutable').rows.length;
for (iC=1;iC<=iCurrSize ;iC++)
	iUsedNumbers[iC]=0;

for (iC=0;iC<iGridSolved.length;iC++)
	{
	oControl=document.getElementById('T' + iC);
	if (IsPoss(oControl)==false && oControl.innerHTML.toUpperCase()!='&NBSP;' )
		{
		sValue = oControl.innerHTML.toUpperCase();
		sValue = sValue.replace('<B>','').replace('</B>','')
		iValue = HexToNum(sValue);
		iUsedNumbers[iValue] = iUsedNumbers[iValue] +1;
		}
	}

for (iC=1;iC<=iCurrSize ;iC++)
	{
		oNumCtl = document.getElementById('Num' + NumToHex(iC));
		if (iUsedNumbers[iC]>=iCurrSize)
			oNumCtl.bgColor =sBGColor;
			else oNumCtl.bgColor ='';
	}
SetCurrentNum();
}

function IsClear(oControl)
{

if (oControl.innerHTML.toUpperCase()=='&NBSP;' || oControl.innerHTML==' ')
	return true;
else if (oControl.innerHTML.length>0)
	{
	if (oControl.innerHTML.charCodeAt(0)==160)
		return true;
	else return false;
	}
else
	return false; 
}

function CheckSolutionBoard(bOnlyCheckFinished,bShowIncorrect)
{
var iC;
var sValue;
var oControl;
var iStatus;
var iIndex;

iStatus = 0;

for (iC=0;iC<iGridSolved.length;iC++)
	{
 	oControl=document.getElementById('T' + iC);
	sValue = oControl.innerHTML.toUpperCase();
	if (sValue.indexOf("<B>") ==-1 && (sValue!=iGridSolved[iC] || IsPoss(oControl)==true) )
		{
		if (IsClear(oControl)==true || IsPoss(oControl)==true)
			{ if (iStatus==0) { iStatus=1;} }
			
		else 	{
			if (bOnlyCheckFinished==false && bShowIncorrect==true)
				{ oControl.bgColor='ff7f7f' }

			FlashSquareCheck(oControl,-1);
			
			iStatus=2;
			}
		}
	}

return iStatus;
}

function FlashSquareCheck(oControl,iCurNum)
{
var sID;
var sOldChars;

	if (iCurNum!=-1)
		{
		sOldChars =SaveGameSquare(oControl, oControl.innerHTML);
		oControl.innerHTML=iCurNum;
		TDSettings(oControl,false);
		} else
		{
		sOldChars = '&nbsp;';
		}

	if (iCurNum!=iGridSolved[parseInt(oControl.id.replace('T',''))] && document.getElementById('AllowIncorrectMoves').checked==false && document.getElementById('btnLockNumbers').style.display=='none')
		{
		sID =oControl.id;
		sID = sID.replace('T','')
		iIndex = parseInt(sID);
		if (IntervalTimes[iIndex][2]<=0) 
			{
			IntervalTimes[iIndex][4]='ff7f7f';
			IntervalTimes[iIndex][3]=sOldChars;
			IntervalTimes[iIndex][2]=6;
			IntervalTimes[iIndex][1] = setInterval("FlashSquare(" + iIndex + ")", 300);
			}
		return true;
		} else
		{ return false; }
}

function FlashSquare(iIndex)
{
var oControl;

 	oControl=document.getElementById('T' + iIndex);
	
	if (IntervalTimes[iIndex][2] % 2 == 0 )
		{ oControl.bgColor=IntervalTimes[iIndex][4]; }
		else
		{ oControl.bgColor='ffffff'; }
	

	IntervalTimes[iIndex][2]--;


	if (IntervalTimes[iIndex][2]<=0)
		{ 
		oControl.innerHTML ='&nbsp;';
		clearInterval(IntervalTimes[iIndex][1]);
		LoadGameSquare(oControl,IntervalTimes[iIndex][3])
		}

}

function KeyboardPlaceNumber(e)
{
var iNewNum;
var sChar;

sChar=KeyGet(e);
sChar = sChar.toUpperCase();
if (IsKeyOK(sChar)==false)
	return true;

iNewNum=sChar;
MoveNum(iNewNum)

if (oCurrentPlayingSquare!=undefined)
	PlaceNumber(oCurrentPlayingSquare,document.getElementById('PossibilityMode').checked);
}


function MousePlaceNumber(e)
{
if (this.innerHTML.toUpperCase().indexOf("<B>")>-1)
	{
	alert ("This is already allocated.");
	return true;
	}

if (typeof(oCurrentPlayingSquare)!='undefined')
	oCurrentPlayingSquare.bgColor='';

oCurrentPlayingSquare = this;

if (document.getElementById("HighlightCurrSquare").checked==true)
	oCurrentPlayingSquare.bgColor=sSqMarkColor;

if (document.getElementById("PlaceMovesWithMouse").checked==true)
	PlaceNumber(oCurrentPlayingSquare,document.getElementById('PossibilityMode').checked);
}

function ContainsNum(oCtl,iCurNum)
{
var sTest;
var sInnerHTML;

sInnerHTML = oCtl.innerHTML;

if (IsGridPoss(oCtl)==true)
	sTest = '>' + iCurNum + '<';
else
	{
 	sTest=iCurNum;
	if (IsPoss(oCtl)==true)
		sInnerHTML=PossDivRemove(sInnerHTML);
	}



if (sInnerHTML.indexOf(sTest)!=-1)
	return true;
else return false;

}

function RemoveNum(oCtl,iCurNum)
{
var sTemp;
var bControlIsSetForPossibilities;

if (IsGridPoss(oCtl)==true)
	oCtl.innerHTML=oCtl.innerHTML.replace('>' + iCurNum + '<','>&nbsp;<');
else
	{
	bControlIsSetForPossibilities = IsPoss(oCtl);
	sTemp = oCtl.innerHTML;
	
	if (bControlIsSetForPossibilities==true)
		sTemp = PossDivRemove(sTemp);
	sTemp=sTemp.replace(iCurNum,' ');
	sTemp=sTemp.toUpperCase();
	sTemp=sTemp.replace(/&NBSP;/g,' ');
	if (bControlIsSetForPossibilities==true)
		sTemp = PossDivAdd(sTemp);
	oCtl.innerHTML = sTemp;
	}
}

function PlaceNumber(oCtl,bPossModeChecked) 
{ 
var sSorted;

	SaveUndo();
	this.bgColor='';
	if (iCurNum==0)
		{
		ClearSquare(oCtl);
		CheckUsedNumbers();
		}
		else
		{
		if (ContainsNum(oCtl,iCurNum)==true)
			{
			if (!bPossModeChecked && IsPoss(oCtl)==true)
				{
				if (FlashSquareCheck(oCtl,iCurNum) == false)
					{
					RemovePossibieNumbers(oCtl);
					} 
					CheckSolution(true);
				}
				else
				{
				RemoveNum(oCtl,iCurNum);
				AddPoss(oCtl,-1);
				if (oCtl.innerHTML=='')
					ClearSquare(oCtl);
				}
			CheckUsedNumbers();
			}
		else
			{
			if (bPossModeChecked)
				{
				TDSettings(oCtl,true);
				AddPoss(oCtl,iCurNum);
				}
				else
				{
				if (FlashSquareCheck(oCtl,iCurNum) == false)
					{
					RemovePossibieNumbers(oCtl);
					} 
					CheckSolution(true);
					CheckUsedNumbers();
				}
			}
		}
} 

function AddPoss(oCtl,iNum)
{
var iCurrSize;
iCurrSize = document.getElementById('sudokutable').rows.length;
var iRows;
var iCols;
var iC;
var sHTML;
var iX;
var iY;
var sCurrText;
var sWidth;
var sTemp;
var sGridTableClass;

sCurrText = oCtl.innerHTML;
sCurrText = sCurrText.replace(/33%/g,'');
sCurrText = sCurrText.replace(/100%/g,'');
sCurrText = sCurrText.replace(/50%/g,'');
sCurrText = sCurrText.replace(/25%/g,'');
sCurrText = PossDivRemove(sCurrText);


if (document.getElementById('GridPossibilities').checked==true)
	{
	sGridTableClass = 'posstable';
	switch (iCurrSize) {
		case 16 :
			iRows = 4;
			iCols = 4;
			sWidth = '25%';
			sGridTableClass = 'posstable16';
			break;
		case 9 :
			iRows = 3;
			iCols = 3;
			sWidth = '33%';
			break;
		case 6 :
			iRows = 3;
			iCols = 2;
			sWidth = '50%';
			break;
		case 4 :
			iRows = 2;
			iCols = 2;
			sWidth = '50%';
			break;
	
		}
	sHTML = "<table class='" + sGridTableClass + "' cellspacing='0' cellpadding='0' >";
	iC = 0;
	for (iY=1;iY<=iRows;iY++)
		{
		sHTML = sHTML + '<tr>';
		for (iX=1;iX<=iCols;iX++)
			{
			iC++;
			sTemp = NumToHex(iC);
			sHTML = sHTML + "<td align='center' width='" + sWidth +"' >";
			if (sCurrText.indexOf('>' + sTemp + '<')!=-1 || sTemp==iNum)
				sHTML = sHTML + sTemp; 
			else
				sHTML = sHTML + '&nbsp;';
			sHTML = sHTML + '</td>';
			}
		sHTML = sHTML + '</tr>';
		}
	sHTML = sHTML + '</table>';
	}
else
	{
	sHTML = "";
	for (iC=1;iC<=document.getElementById('sudokutable').rows.length;iC++)
		{
		sTemp = NumToHex(iC);
		if (sCurrText.indexOf(sTemp)!=-1 || sTemp==iNum)
			sHTML = sHTML + sTemp + ' ';
		}
	if (sHTML!='')
		sHTML = PossDivAdd(sHTML);
	}
oCtl.innerHTML = sHTML;
}

function PossDivAdd(sHTML)
{
	return "<DIV CLASS=POSSDIV>" + trimString(sHTML) + "</DIV>";
}

function PossDivRemove(sHTML)
{
	if (sHTML.toUpperCase().indexOf("POSSDIV")!=-1)
		{
		sHTML = sHTML.substr(sHTML.toUpperCase().indexOf('>')+1);
		sHTML = sHTML.substring(0,sHTML.length-6);
		}
	return trimString(sHTML);
}

function SortPoss(sOrigPoss)
{
var Poss= new Array(9);
var iC;
var iX;
var sRet;
iX=0;
sRet='';

for (iC=0;iC<sOrigPoss.length;iC++)
	{
	if (sOrigPoss.substring(iC,iC+1)==parseInt(sOrigPoss.substring(iC,iC+1)))
		{
		Poss[iX] = sOrigPoss.substring(iC,iC+1);
		iX = iX +1;
		}
	}
Poss.sort();
for (iC=0;iC<iX;iC++)
	{
	sRet = sRet + Poss[iC] + ' ';
	}
return sRet;
}

function RemovePossibieNumbers(oSquare)
{
var iCurrSize;


if (document.getElementById("RemovePossibilties").checked == false)
	return;

var iID;
var iIDLeft;
var iIDTop;
var iChosenNum;
var iNewID;
var iXStart;
var iYStart;
var iX;
var iY;

iCurrSize = document.getElementById('sudokutable').rows.length;

iChosenNum = oSquare.innerHTML;

iID = parseInt( oSquare.id.substring(1));
iIDLeft = Math.floor(iID/iCurrSize) * iCurrSize;

for (iNewID=iIDLeft; iNewID <=(iIDLeft+(iCurrSize-1));iNewID++)
	RemoveNumber(iNewID, iChosenNum);

iIDTop = iID % iCurrSize;

for (iNewID=iIDTop; iNewID <=(iCurrSize*iCurrSize-1);iNewID=iNewID+iCurrSize)
	RemoveNumber(iNewID, iChosenNum);

switch (iCurrSize) {
	case 16 :
		iYStart = Math.floor(iIDLeft/16/4) * 4;
		iXStart = Math.floor(iIDTop/4) * 4;

		for (iY=iYStart; iY <=iYStart+3;iY++)
			{
			for (iX=iXStart; iX <=iXStart+3;iX++)
				{
				iNewID = iY * 16 + iX;
				RemoveNumber(iNewID, iChosenNum);
				}
			}
		break;
	case 9 :
		iYStart = Math.floor(iIDLeft/9/3) * 3;
		iXStart = Math.floor(iIDTop/3) * 3;

		for (iY=iYStart; iY <=iYStart+2;iY++)
			{
			for (iX=iXStart; iX <=iXStart+2;iX++)
				{
				iNewID = iY * 9 + iX;
				RemoveNumber(iNewID, iChosenNum);
				}
			}
		break;
	case 6 :
		iYStart = Math.floor(iIDLeft/6/3) * 3;
		iXStart = Math.floor(iIDTop/2) * 2;

		for (iY=iYStart; iY <=iYStart+2;iY++)
			{
			for (iX=iXStart; iX <=iXStart+1;iX++)
				{
				iNewID = iY * 6 + iX;
				RemoveNumber(iNewID, iChosenNum);
				}
			}
		break;
	case 4 :
		iYStart = Math.floor(iIDLeft/4/2) * 2;
		iXStart = Math.floor(iIDTop/2) * 2;

		for (iY=iYStart; iY <=iYStart+1;iY++)
			{
			for (iX=iXStart; iX <=iXStart+1;iX++)
				{
				iNewID = iY * 4 + iX;
				RemoveNumber(iNewID, iChosenNum);
				}
			}
		break;
	
	}


}

function RemoveNumber(iNewID, iChosenNum)
{
var oNewSquare;
oNewSquare = document.getElementById("T" + iNewID)

if (IsPoss(oNewSquare)==true)
	{
	RemoveNum(oNewSquare,iChosenNum);
	}

}

function MouseMoveRC(evt)
{
if (!document.all) {
      evt.preventDefault();
      evt.stopPropagation(); 
	}

if (this.innerHTML.toUpperCase().indexOf("<B>")>-1)
	{
	alert ("This is already allocated.");
	return true;
	}

if (typeof(oCurrentPlayingSquare)!='undefined')
	oCurrentPlayingSquare.bgColor='';

oCurrentPlayingSquare = this;

if (document.getElementById("HighlightCurrSquare").checked==true)
	oCurrentPlayingSquare.bgColor=sSqMarkColor;

if (document.getElementById("PlaceMovesWithMouse").checked==true)
	PlaceNumber(oCurrentPlayingSquare,true);

}

function PlayInit()
{

document.onkeypress = KeyboardPlaceNumber;
if (document.layers)
document.captureEvents(Event.KEYPRESS); 

if (bEnterYourOwnPuzzle==true)
	document.getElementById('btnLockNumbers').style.display = '';
else
	document.getElementById('btnLockNumbers').style.display = 'none';

iCurNum=0;
MoveNum(1);

var iC;
var oControl;

for (iC=0;iC<=document.getElementById('sudokutable').rows.length;iC++)
	{
 	oControl=document.getElementById('Num' + NumToHex(iC));
    	oControl.ClickHandler =  CurNumSelect; 
    	XBrowserAddHandler(oControl,"click","ClickHandler");
	}

for (iC=0;iC<iGridUnsolved.length;iC++)
	{
 	oControl=document.getElementById('T' + iC);
	if (iGridUnsolved[iC]!=0)
		{ oControl.innerHTML ='<b>'+ iGridUnsolved[iC] + '</b>';
			oControl.bgColor = sBGColor; }

    	oControl.ClickHandler = MousePlaceNumber; 
    	XBrowserAddHandler(oControl,"click","ClickHandler");
    	oControl.RCClickHandler =  MouseMoveRC; 
    	XBrowserAddHNoCM(oControl,"contextmenu","RCClickHandler");
	}


}

function monthname()
{
   var months = new Array(13);
   months[0]  = "January";
   months[1]  = "February";
   months[2]  = "March";
   months[3]  = "April";
   months[4]  = "May";
   months[5]  = "June";
   months[6]  = "July";
   months[7]  = "August";
   months[8]  = "September";
   months[9]  = "October";
   months[10] = "November";
   months[11] = "December";
   return months[sTodaysDate.split('-')[1]-1];
}

function ChangeBoard()
{
var oCtl;
var iX;
var iY;
var iSize;

oCtl = document.getElementById('sudokutable');

if (sDiffSetting=='Y')
	{
	iSize = 40
	oCtl.height='640px';
	document.getElementById('sudokutableBox').style.width='640px';
	document.getElementById('sudokutableBox').style.height='640px';
	} else
{
switch (oCtl.height) {
	case '360' :
	case '360px' :
	iSize = 36
	oCtl.height='324px';
	document.getElementById('sudokutableBox').style.width='324px';
	document.getElementById('sudokutableBox').style.height='324px';
	break;

	case '324' :
	case '324px' :
	iSize = 30
	oCtl.height='270px';
	document.getElementById('sudokutableBox').style.width='270px';
	document.getElementById('sudokutableBox').style.height='270px';
	break;

	case '270' :
	case '270px' :
	iSize = 40
	oCtl.height='360px';
	document.getElementById('sudokutableBox').style.width='360px';
	document.getElementById('sudokutableBox').style.height='360px';
	break;
	
	default :
	iSize = 36
	oCtl.height='324px';
	document.getElementById('sudokutableBox').style.width='324px';
	document.getElementById('sudokutableBox').style.height='324px';
	break;
	}
}

SetCellSize(oCtl,iSize);
}

function SetCellSize(oCtl,iSize)
{
var iX;
var iY;

for (iX=0;iX<=oCtl.rows.length-1;iX++)
	{
	for (iY=0;iY<=oCtl.rows.length-1;iY++)
		{
		oCtl.rows[iY].cells[iX].height=iSize + 'px';
		}
	}
}

function getCookieVal (offset) {
var endstr = document.cookie.indexOf (";", offset);
if (endstr == -1)
endstr = document.cookie.length;
return unescape(document.cookie.substring(offset, endstr));
}

function GetCookie (name,DefaultVal) {
var arg = name + "=";
var alen = arg.length;
var clen = document.cookie.length;
var i = 0;
while (i < clen) {
var j = i + alen;
if (document.cookie.substring(i, j) == arg)
return getCookieVal (j);
i = document.cookie.indexOf(" ", i) + 1;
if (i == 0) break; 
}
return DefaultVal;
}  

function SetCookie (name, value) {
var argv = SetCookie.arguments;
var argc = SetCookie.arguments.length;
var expires = (argc > 2) ? argv[2] : null;
var path = (argc > 3) ? argv[3] : null;
var domain = (argc > 4) ? argv[4] : null;
var secure = (argc > 5) ? argv[5] : false;
document.cookie = name + "=" + escape (value) +
((expires == null) ? "" : ("; expires=" + expires.toGMTString())) +
((path == null) ? "" : ("; path=" + path)) +
((domain == null) ? "" : ("; domain=" + domain)) +
((secure == true) ? "; secure" : "");
}



function SetDefaults()
{
var expdate = new Date ();
expdate.setTime (expdate.getTime() + (24 * 60 * 60 * 1000 * 31));

	SetCookie("ckRemovePossibilties",document.getElementById("RemovePossibilties").checked,expdate);
	SetCookie("ckAllowIncorrectMoves",document.getElementById("AllowIncorrectMoves").checked,expdate);
	SetCookie("ckPlaceMovesWithMouse",document.getElementById("PlaceMovesWithMouse").checked,expdate);
	SetCookie("ckHighlightCurrSquare",document.getElementById("HighlightCurrSquare").checked,expdate);
	SetCookie("ckGreyUsedNumbers",document.getElementById("GreyUsedNumbers").checked,expdate);
	SetCookie("ckGridPossibilities",document.getElementById("GridPossibilities").checked,expdate);

var oCtl;
var iHeight;
oCtl = document.getElementById('sudokutable');

switch (oCtl.height) {
	case '360' :
	case '360px' :
	iHeight = 270
	break;

	case '324' :
	case '324px' :
	iHeight = 360
	break;

	case '270' :
	case '270px' :
	iHeight = 324
	break;

	case '640' :
	case '640px' :
	iHeight = 640
	break;
}
	SetCookie("iTableHeight",iHeight,expdate);
}

function ReadDefaults()
{

	document.getElementById("RemovePossibilties").checked= (GetCookie("ckRemovePossibilties","false")=="true") ;
	document.getElementById("AllowIncorrectMoves").checked=(GetCookie("ckAllowIncorrectMoves","true")=="true");
	document.getElementById("PlaceMovesWithMouse").checked=(GetCookie("ckPlaceMovesWithMouse","true")=="true");
	document.getElementById("HighlightCurrSquare").checked=(GetCookie("ckHighlightCurrSquare","true")=="true");
	document.getElementById("GreyUsedNumbers").checked=(GetCookie("ckGreyUsedNumbers","true")=="true");
	document.getElementById("GridPossibilities").checked=(GetCookie("ckGridPossibilities","false")=="true");
	document.getElementById('sudokutable').height = GetCookie("iTableHeight","270px");
	ChangeBoard();

}

function SaveGame()
{
var SBoard;

SBoard = sGetBoardString();

var expdate = new Date ();
expdate.setTime (expdate.getTime() + (24 * 60 * 60 * 1000 * 7));

	SetCookie(sDiffSetting + sSourceName + "_SavedBoard",SBoard,expdate);
	alert("The current Game has been saved.");

}

function sGetBoardString()
{
var iC;
var sValue;
var oControl;
var sBoard;

sBoard = '';

for (iC=0;iC<iGridSolved.length;iC++)
	{
 	oControl=document.getElementById('T' + iC);
	sValue = oControl.innerHTML.toUpperCase();
	if (sValue == '' || sValue == '&NBSP;')
		{}
		else
		{
		sBoard = sBoard + SaveGameSquare(oControl,sValue);
		}
	sBoard = sBoard + "|";
	}
return sBoard;
}

function SaveGameSquare(oControl,sValue)
{
var iC;
var sRetValue;
var sCurrNum;

	sValue = sValue.replace('<B>','');
	sValue = sValue.replace('</B>','');

	if (IsPoss(oControl)==true)
		{
		sRetValue = 'P';
		for (iC=1;iC<=16;iC++)
			{
			sCurrNum = NumToHex(iC);
			if (ContainsNum(oControl,sCurrNum)==true)
				sRetValue = sRetValue + sCurrNum;
			}
			return sRetValue;
		}
		else
		{return sValue;}

}

function LoadGame()
{
var sBoard;

sBoard =  GetCookie( sDiffSetting + sSourceName + "_SavedBoard","NoSave");

if (sBoard=="NoSave") 
	{
	alert("There is no saved game for this puzzle (clearing cookies will erase saved games).");
	return true;
	}

LoadBoardFromString(sBoard);

}

function LoadBoardFromString(sBoard)
{
var iC;
var sValue;
var oControl;

ResetBoard();

for (iC=0;iC<iGridSolved.length;iC++)
	{
 	oControl=document.getElementById('T' + iC);
	sValue = sBoard.split('|')[iC];
	if (sValue !='')
		{
		LoadGameSquare(oControl,sValue);
		}
	}
}

function LoadGameSquare(oControl,sValue)
{
var sPossHTML;
var iC;
	if (oControl.bgColor=='')
		{
		if (sValue.substring(0,1)=="P")
			{
			sPossHTML = '';
			TDSettings(oControl,true);
			sValue = sValue.substring(1);
			for (iC=0;iC<sValue.length;iC++)
				sPossHTML = sPossHTML + '<i>' + sValue.substring(iC,iC+1) + '</i>';
			oControl.innerHTML = sPossHTML;
			AddPoss(oControl,-1);
			}
		else
			oControl.innerHTML = sValue;
		}
}

var curOpac;
var IE = document.all;
var oPrizeInverval;
var sCongratsMsg;

function ShowPrize()
{

if (sDiffSetting=='Y')
	{
	sCongratsMsg = 'You solved the sudoku! Congratulations.';
	curOpac = 99;
	oPrizeInverval = setInterval("ShowPrizeGrad()",10);
	return true;
	}

document.getElementById('hideDiv').style.display = '';
document.getElementById('hideDiv').style.MozOpacity = '0.0';
document.getElementById('hideDiv').style.height = '360px';
document.getElementById('hideDiv').style.width= '360px';
document.getElementById('hideDiv').style.position = 'relative';
document.getElementById('hideDiv').style.top = '-360px';
document.getElementById('Grabber').style.position = 'relative';
document.getElementById('Grabber').style.top = '-360px';
document.getElementById('PrizePic').style.display = '';
document.getElementById('sudokutable').style.MozOpacity = '1.0';

curOpac = 0;
oPrizeInverval = setInterval("ShowPrizeGrad()",10)

}

function ShowPrizeGrad()
{
var bSaveResponse;

curOpac++;

if (curOpac>90)
	{
	clearInterval(oPrizeInverval);

	if (sDiffSetting!='Y')
		FinalShowPrize();

	if (IsSupportingMember==true && document.getElementById('Timer_SecondsTaken').value!=0)
		{
		bSaveResponse = confirm(sCongratsMsg + '\n\nWould you like to save your time?');
		if (bSaveResponse==true)
			{
			document.getElementById('Timer_SaveTime').value="Yes";
			document.Form1.submit();
			} else
			document.getElementById('Timer_SecondsTaken').value = 0;
		} else
		alert(sCongratsMsg);

	if(typeof HeartStart != "undefined"){
     	HeartStart();
	}
	return true;
	}
	
IE?document.getElementById("hideDiv").style.filter="alpha(opacity="+curOpac+")":document.getElementById("hideDiv").style.MozOpacity=curOpac/90.1;

IE?document.getElementById("sudokutable").style.filter="alpha(opacity="+(90-curOpac)+")":document.getElementById("sudokutable").style.MozOpacity=(90-curOpac)/90.1;

}

function FinalShowPrize()
{
IE?document.getElementById("hideDiv").style.filter="alpha(opacity=100)":document.getElementById('hideDiv').style.MozOpacity = '1.0';
IE?document.getElementById("sudokutable").style.filter="alpha(opacity=0)":document.getElementById('sudokutable').style.MozOpacity = '0.0';
}

function ShareGame()
{
var sBoard;
sBoard = sGetBoardString();
document.getElementById("ShareStuff").style.display='inline';
document.getElementById("txtShareStuffCode").value=sBoard;
}

function LoadSharedGame()
{
var sBoard;
sBoard = document.getElementById("txtShareStuffCode").value;
LoadBoardFromString(sBoard);
document.getElementById("ShareStuff").style.display='none';
}

function SaveUndo()
{
Undos[UndosCurr]=sGetBoardString();
if (UndosCurr==Undos.length)
	alert('The limit of the Undos has been reached, no more can be saved.');
else
	UndosCurr=UndosCurr+1;
}

function LoadUndo()
{
if (UndosCurr==1)
	alert('No moves have been made');
else
	{
	UndosCurr=UndosCurr-1;
	LoadBoardFromString(Undos[UndosCurr]);
	}
}





var SWsec = -1;
var SWmin = 0;
var SWhour = 0;
function stopwatch(text) {

   SWsec++;
  if (SWsec == 60) {
   SWsec = 0;
   SWmin = SWmin + 1; }
  else {
   SWmin = SWmin; }
  if (SWmin == 60) {
   SWmin = 0; 
   SWhour += 1; }

if (SWsec<=9) { SWsec = "0" + SWsec; }
   document.getElementById('TimerTime').innerHTML = ((SWhour<=9) ? "0"+SWhour : SWhour) + ":" + ((SWmin<=9) ? "0" + SWmin : SWmin) + ":" + SWsec;

  if (text == "Start") { document.getElementById('TimerStartPause').value = "Pause"; }
  if (text == "Pause") { document.getElementById('TimerStartPause').value = "Start"; }

  if (document.getElementById('TimerStartPause').value == "Start") {
   PauseCheck(false);
   return true; }
SD=window.setTimeout("stopwatch();", 1000);
}

function PauseCheck(bPauseTimer)
{
  if (document.getElementById('TimerStartPause').value == "Start" || bPauseTimer==true) 
	{
   	window.clearTimeout(SD);
   	SWsec=SWsec-1;
	if (bPauseTimer==true)
		{ document.getElementById('TimerStartPause').value = "Start"; }
	}
}

function resetIt() {
  SWsec = -1;
  SWmin = 0;
  SWhour = 0;
  document.getElementById('TimerTime').innerHTML = "00:00:00";

  if (document.getElementById('TimerStartPause').value == "Pause") {
  document.getElementById('TimerStartPause').value = "Start"; }
  window.clearTimeout(SD);
 }

function ButtonsDisable16x16()
{
var oButton;
oButton = document.getElementById('btnSolveEasy');
if (oButton)
	oButton.disabled = true;

oButton = document.getElementById('btnHint');
if (oButton)
	oButton.disabled = true;

oButton = document.getElementById('btnScreen');
if (oButton)
	oButton.disabled = true;
}

