var sBGColor = '#e9e9e9';
var iCurNum=1;
var Undos = new Array(200);
var UndosCurr;
var HideSolutionMoves;
var curOpac;
var IE = document.all;
var oPrizeInverval;
var sSolveTime;

UndosCurr=1;

function PossCheck()
{

if (document.getElementById('PossibilityMode').checked)
	{ return true;} else
	{ return false;}
}

function SqPoss(oSq)
{
if (oSq.style.fontSize=='')
	{ return false;} else
	{ return true;}		
}

function SqSet(oSq,bPossibilityOn)
{
if (bPossibilityOn==true)
	{
	oSq.style.fontSize='10px';
	oSq.style.textAlign='right';
	oSq.vAlign='top';
	}
	else
	{
	oSq.style.fontSize='';
	oSq.style.textAlign='center';
	oSq.vAlign='center';
	}
}


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 TellAFriend() {
var initialsubj="Check it out, Kakuro";
var initialmsg="Hi:\n Free Kakuros daily at \<A href='http://kakuro.cc'\>http://kakuro.cc\<\/A\>";
window.location = "mailto:?subject="+initialsubj+"&body="+initialmsg; }


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 CurNumSelect(e) {
if (this.innerHTML.toUpperCase().indexOf("<B>") ==-1)
	{
	document.getElementById('Num' + iCurNum).bgColor='';

	if (iCurNum==0)
		{ document.getElementById('Num' + iCurNum).innerHTML = '&nbsp;'; }
		else 
		{ document.getElementById('Num' + iCurNum).innerHTML = iCurNum; }

	if (this.innerHTML.toUpperCase()=='&NBSP;')
		{ iCurNum = 0; }
		else
		{ iCurNum = this.innerHTML;
	  	this.innerHTML= '<b>'+iCurNum + '</b>'; }


	this.bgColor = '#e9e9e9';
	}
}


function PlayInit()
{
var iC;
var oControl;
var bPrinterFriendly;

if (document.getElementById('Num1'))
	{
	bPrinterFriendly = false;
	document.getElementById('Num1').bgColor=sBGColor;


	for (iC=0;iC<=9;iC++)
		{
 		oControl=document.getElementById('Num' + iC);
    		oControl.ClickHandler =  CurNumSelect; 
    		XBrowserAddHandler(oControl,"click","ClickHandler");
		}
	} else
	{
	bPrinterFriendly = true;
	}

for (iC=0;iC<iGridSolved.length;iC++)
	{
	if (iGridSolved[iC]!=-1)
		{
	 	oControl=document.getElementById('sq' + iC);
		SqSet(oControl,false);
		oControl.ClickHandler = PlaceNumber; 
		if (bPrinterFriendly==false)
    			XBrowserAddHandler(oControl,"click","ClickHandler");
		}
	}
}

function ResetPoss()
{
var iC;
var oControl;
for (iC=0;iC<iGridSolved.length;iC++)
	{
	if (iGridSolved[iC]!=-1)
		{
	 	oControl=document.getElementById('sq' + iC);
		if (SqPoss(oControl)==true)
			{
			SqSet(oControl,false);
			oControl.innerHTML ='&nbsp;';
			}
		}
	}
}

function ResetBoard()
{
var iC;
var oControl;
for (iC=0;iC<iGridSolved.length;iC++)
	{
	if (iGridSolved[iC]!=-1)
		{
	 	oControl=document.getElementById('sq' + iC);
		SqSet(oControl,false);
		oControl.innerHTML ='&nbsp;';
		oControl.style.color='black';
		}
	}
}

function PlaceNumber(e)
{

SaveUndo();

if (iCurNum==0)
	{
	this.innerHTML='&nbsp;';
	SqSet(this,false);
	}
	else
	{
	if (SqPoss(this)!=PossCheck())
		{
		this.innerHTML='&nbsp;';
		SqSet(this,PossCheck());
		}
	AddRemoveNum(this,iCurNum);
	if (PossCheck()==false)
		{
		if (FinishedCheck()==true)
			{
			sSolveTime = GetFinalTime();
			ShowPrize();
			}
		}
	}
}



function AddRemoveNum(oSQ,iNum)
{
var sSorted;
if (oSQ.innerHTML.indexOf(iNum)==-1)
	{
	if (SqPoss(oSQ)==true)
		{
		sSorted = oSQ.innerHTML + ' ' + iNum;
		sSorted = SortPoss(sSorted);
		sSorted = trimString(sSorted);
		oSQ.innerHTML = sSorted;
		} else
		{
		oSQ.innerHTML = iNum;
		}
	}
	else
	{
	oSQ.innerHTML=oSQ.innerHTML.replace(iNum,'');
	oSQ.innerHTML=trimString(oSQ.innerHTML);
	if (oSQ.innerHTML=='')
		{
		oSQ.innerHTML='&nbsp;';
		SqSet(oSQ,false);
		}
	}
}

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 FinishedCheck()
{
var iC;
var oControl;
var iChoice;

for (iC=0;iC<iGridSolved.length;iC++)
	{
	if (iGridSolved[iC]!=-1)
		{
	 	oControl=document.getElementById('sq' + iC);
		if (SqPoss(oControl)==true)
			{
			return false;
			}
		else
			{
			iChoice = oControl.innerHTML;
			if (iChoice!=iGridSolved[iC])
				return false;
			}
		}
	}

return true;
}

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]);
	}
}

function sGetBoardString()
{
var iC;
var sValue;
var oControl;
var sBoard;

sBoard = '';

for (iC=0;iC<iGridSolved.length;iC++)
	{
	if (iGridSolved[iC]!=-1)
		{
	 	oControl=document.getElementById('sq' + iC);
		sValue = oControl.innerHTML.toUpperCase();
		if (sValue == '' || sValue == '&NBSP;')
			{}
			else
			{
			sBoard = sBoard + SaveGameSquare(oControl,sValue);
			}
		sBoard = sBoard + "|";
		}
	}
return sBoard;
}

function SaveGameSquare(oControl,sValue)
{

	if (SqPoss(oControl)==true)
		{return 'P' + sValue;}
		else
		{return sValue;}

}

function LoadBoardFromString(sBoard)
{
var iC;
var sValue;
var oControl;
var iPos;

ResetBoard();
iPos = 0;

for (iC=0;iC<iGridSolved.length;iC++)
	{
	if (iGridSolved[iC]!=-1)
		{
	 	oControl=document.getElementById('sq' + iC);
		sValue = sBoard.split('|')[iPos];
		iPos=iPos+1;
		if (sValue !='')
			{
			LoadGameSquare(oControl,sValue);
			}
		}
	}
}

function LoadGameSquare(oControl,sValue)
{
	if (oControl.bgColor=='')
		{
		if (sValue.substring(0,1)=="P")
			{
			SqSet(oControl,true);
			sValue = sValue.substring(1);
			}
		oControl.innerHTML = sValue;
		}
}


function LoadGame()
{
var sBoard;

sBoard =  GetCookie( sSaveFileName + "_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 SaveGame()
{
var SBoard;

SBoard = sGetBoardString();

var expdate = new Date ();
expdate.setTime (expdate.getTime() + (24 * 60 * 60 * 1000 * 31));

	SetCookie(sSaveFileName + "_SavedBoard",SBoard,expdate);
	alert("The current Game has been saved.");

}

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 ToggleSolution()
{
var iC;
var oControl;

if (document.getElementById('btnToggleSolution').value=='Show Solution')
	{
	document.getElementById('btnToggleSolution').value='Hide Solution';
	HideSolutionMoves = sGetBoardString();

	for (iC=0;iC<iGridSolved.length;iC++)
		{
		if (iGridSolved[iC]!=-1)
			{
	 		oControl=document.getElementById('sq' + iC);
			SqSet(oControl,false);
			oControl.style.color = 'green';
			oControl.innerHTML ='<b>' + iGridSolved[iC] + '</b>';
			}
		}

	} else
	{
	document.getElementById('btnToggleSolution').value='Show Solution';
	LoadBoardFromString(HideSolutionMoves);
	}
	
}

function ShowPrize()
{
var iNewSize;
iNewSize = 350;

document.getElementById('hideDiv').style.MozOpacity = '0.0';
document.getElementById('hideDiv').style.height = iNewSize  + 'px';
document.getElementById('hideDiv').style.width= iNewSize  + 'px';
document.getElementById('hideDiv').style.position = 'relative';
document.getElementById('hideDiv').style.top = (-iNewSize-7) + 'px';
document.getElementById('hideDiv').style.display = '';
document.getElementById('Grabber').style.position = 'relative';
document.getElementById('Grabber').style.top =(-iNewSize)  + 'px';
document.getElementById('kakurotable').style.MozOpacity = '1.0';
document.getElementById('PrizePic').style.height = (iNewSize+7)  + 'px';
document.getElementById('PrizePic').style.width = iNewSize  + 'px';

curOpac = 0;
oPrizeInverval = setInterval("ShowPrizeGrad()",10)
}

function ShowPrizeGrad()
{
document.getElementById('PrizePic').style.display = '';

curOpac++;

if (curOpac>100 && curOpac<500)
	{
	clearInterval(oPrizeInverval);
	curOpac=1000;
	document.getElementById('hideDiv').style.MozOpacity = '1.0';
	document.getElementById('kakurotable').style.MozOpacity = '0.0';
	alert("Congratulations for solving the kakuro!" + sSolveTime + "\n\n" + sPrizeCaption);
	return true;
	}
	
IE?document.getElementById("hideDiv").style.filter="alpha(opacity="+curOpac+")":document.getElementById("hideDiv").style.MozOpacity=curOpac/90.1;

IE?document.getElementById("kakurotable").style.filter="alpha(opacity="+(90-curOpac)+")":document.getElementById("kakurotable").style.MozOpacity=(90-curOpac)/90.1;

}