//CHECKJS  C:\temp\sudoku\crosscheck.js 11/6/2005 12:30:05 PM
// handles all crosschecking
Possible=new Array()
Data=new Array()
Blocks=new Array()
SnapShot=new Array()

function checkAllDone(){
	var nok=0
	for(var i=0;i<9;i++)for(var j=0;j<9;j++){
		if(Data[i][j].N && Data[i][j].isOK)nok++
	}
	ncellssolved=nok
	return (nok==81)
}

function crossCheckAll(){
	Possible=new Array()
	initXArray(Possible)
	ntidbits=0
	for(var i=0;i<9;i++)for(var j=0;j<9;j++)ntidbits+=crossCheck(i,j)
}

function crossCheck(i,j){
	var C=Data[i][j]
	if(!isdemo){
		for(var p=0;p<9;p++)if(p!=i && Data[p][j].N)C.Allowed[Data[p][j].N-1]=0
		for(var p=0;p<9;p++)if(p!=j && Data[i][p].N)C.Allowed[Data[i][p].N-1]=0
		for(var p=0;p<9;p++){
			ii=Blocks[Data[i][j].block][p].row
			jj=Blocks[Data[i][j].block][p].col
			if((ii!=i||jj!=j)&& Data[ii][jj].N)C.Allowed[Data[ii][jj].N-1]=0
		}
	}
	C.isOK=(C.fixed || !C.N || C.Allowed[C.N-1])

	if(C.isOK && !C.fixed && !C.N){
		C.isOK=false
		for(var k=0;k<9;k++)if(C.Allowed[k]){
			C.isOK=true
			xSetArray(Possible,C,k)
		}
	}
	if(C.N)Possible.XCell[i][j]=Pwr2[C.N-1]
	for(var k=0;k<9;k++)C.AllowedByCross[k]=C.Allowed[k]
	return getNPossible(C)
}

function getNPossible(C){
	C.npossible=0
	if(C.N)return 0
	for(var k=0;k<9;k++)if(C.Impossible[k]){
		if(!C.onlypossible){
			logAddMessage(coordOf(C,k)+": is a hidden single")
			addAutoMsg("Sh1","")
		}
		C.Allowed[k]=0
	}
	for(var k=0;k<9;k++)if(C.Allowed[k])C.npossible++
	return C.npossible
}

function markOnlyOnePossible(iaddsnapshot){

	isdone=checkAllDone()

	if(isdone)return 1

	var C=new Array()
	var n=0
	for(var i=0;i<9;i++)for(var j=0;j<9;j++)if(!Data[i][j].N){
		C=Data[i][j]
		if(C.npossible==1){
			for(var k=0;k<9;k++){
				if(C.Allowed[k]){
					logAddMessage(coordOf(C,k)+" is a naked single")
					addAutoMsg("Sn1","")
					C.onlypossible=k+1
				}
			}
			if(C.onlypossible)C.flagged=n=1
		}

	}
	if(iaddsnapshot){
		SnapShot[solving]=new Array()
		getTableRef(SnapShot[solving],0,1)
		logAddMessage("<a   name=javascript:doShowSnapShot("+solving+")>[snapshot"+(solving?" "+solving:"")+"]</a>")
	}
	for(var i=0;i<9;i++)for(var j=0;j<9;j++)if(!Data[i][j].N){
		C=Data[i][j]
		for(var k=0;k<9;k++)if(C.Allowed[k]&&!C.onlypossible){
			if(xNum(Possible.XRow[C.row][k])==1){
				logAddMessage(C.showinfo+" contains a hidden single for "+(k+1)+" in row "+(C.row+1))
				addAutoMsg("Sh1","")
				C.onlypossible=k+1
			}else if(xNum(Possible.XCol[C.col][k])==1){
				logAddMessage(C.showinfo+" contains a hidden single for "+(k+1)+" in column "+(C.col+1))
				addAutoMsg("Sh1","")
				C.onlypossible=k+1
			}else if(xNum(Possible.XBlock[C.block][k])==1){
				logAddMessage(C.showinfo+" contains a hidden single for "+(k+1)+" in block "+(C.block+1))
				addAutoMsg("Sh1","")
				C.onlypossible=k+1
			}
		}
		if(C.onlypossible)C.flagged=n=1
	}
	return (n>0) && !idonotstop
}

function updateAllowed(iupdateimpossible){
	var C=new Array()
	var n=0
	for(var i=0;i<9;i++)for(var j=0;j<9;j++){
		C=Data[i][j]
		if(C.onlypossible && C.N==0){
			C.N=C.onlypossible
			C.Allowed[C.N-1]=C.N
			if(!C.flagged)logAddMessage(coordOf(C,C.N-1)+": Only one possibility")
			n++
		}
		if(iupdateimpossible){
			for(var k=0;k<9;k++)if(C.Impossible[k]){
				C.Allowed[k]=C.Impossible[k]=C.Eliminated[k]=0
				n++
			}
		}
		getNPossible(C)
	}
	return n
}


