<!--

var self;

function Sudoku()
{
    self = this;
    this.sudokuArr = new Array(9);
    this.padObj = null;this.gameOver = false;this.level=1;this.startTime;
    this.padPtr = null;this.allNumArr = new Array(1,2,3,4,5,6,7,8,9);
    this.isSmartPad = true;this.sqr_f = "sqr_f_b";this.sqr_e="sqr_e_b";
    this.callBackFunc = null;
    this.handPtr = new Array(2);this.handVisible = false;
    this.cleanArr = new Array();
    this.undoArr = new Array();
    this.usrGameCB = null;
    
    this.dimy = [38,72,108,145,178,0,36,72,108];
    this.dimx = [38,72,108,145,178,40,78,112,147];
    
    this.handy = [38,72,108,145,178,214,243,279,108];
    this.handx = [38,72,108,145,178,214,243,279,147];
    
    this.checkDuplicates = false;
	
	this.setUsrGameCallback = function(ucb) {this.usrGameCB = ucb;}
	this.setFinishCallBack = function(fnc) {this.callBackFunc = fnc;}
	
	this.setLevel = function(n) {var o = document.getElementById("selid_"+this.level); if (o != null) {o.className="sel_0";};this.level = n;o = document.getElementById("selid_"+this.level); if (o != null) {o.className="sel_1";};}
	
	this.initScr = function()
	{
	    var str = '<div class="line_h"></div><div class="btntxt" style="margin-left:100px;"><u>Smart Sudoku</u></div>';
		var togstr = setUpToggle(0,"Smart Number Pad");
		str += '<div style="float:left;width:320px;">'+togstr+'</div>';
		togstr = setUpToggle(0,"Auto Fill");
		str += '<div style="float:left;width:320px;">'+togstr+'</div>';
		togstr = setUpToggle(0,"Auto Clean");
		str += '<div style="float:left;width:320px;">'+togstr+'</div>';
		str += '<div class="line_h"></div><div style="float:left;width:320px;" class="btntxt">Choose a level:</div>';
		var lstr = '';
		for (var i = 0; i < 8; i++) {lstr += '<div class="sel_0" id="selid_'+(i+1)+'" onClick="self.setLevel('+(i+1)+');">'+(i+1)+'</div>';}
		str += lstr;
		str += '<div class="line_h"></div><div style="float:right;width:200px;"><div class="startbtn" onClick="self.initGame(1,5);">OK</div></div>';
	    
	    var o = document.getElementById("sudokubrd"); if (o != null) {o.innerHTML = str;}
	}
	
	this.initGame = function()
	{
		var xxx = ["v","b","g","w", "r"];
	    var clrcode = xxx[this.getRandom(0,4)];		
		var  autoFill = getToggleValue(1);
		this.isSmartPad = getToggleValue(0);
		this.autoClean = getToggleValue(2);;		
		this.checkDuplicates = true;
		this.handPtr[0] = null; this.handPtr[1] = null;
		this.gameOver = false;
	    this.sqr_f = "sqr_f_"+clrcode;this.sqr_e="sqr_e_"+clrcode;
	    
	    if (this.level > 0)
	    {
			for (var i = 0; i < 9; i++)
			{
				this.sudokuArr[i] = new Array(9);
				for (var j = 0; j < 9; j++)
				{
					var n = j + 1 + (i*3) + Math.floor(i/3)%3;
					if(n>9) {n = n % 9;}
					if(n==0){n=9;}
					this.sudokuArr[i][j] = n;
				}
			}

			this.swapNumbers();	    
			this.removeSquares(this.level);
	    }
	    
		
	    var str = '';
	    for (var i = 0; i < 9; i++)
	    {
	        if (i%3 == 0) {str += '<div class="line_h"></div>';}
	        for (var j = 0; j < 9; j++)
	        {
	            if (j%3 == 0) {str += '<div class="line_v"></div>';}
	            if (this.sudokuArr[i][j]%10 == 0)
	            {
	                str += '<div id = "sq_' + (i*9+j) + '" class="' + this.sqr_e + '" onClick="self.sqrTouch(' + i + ',' + j + ');"></div>';
	            }
	            else
	            {
	                str += '<div class="' + this.sqr_f + '">' + this.sudokuArr[i][j] + '</div>';
	            }	            
	        }
	    }
	    
	    var o = document.getElementById("sudokubrd"); if (o != null) {o.innerHTML = str;}
	    this.addPadObject(o);
	    
		for (var i = 0; i < 9; i++)
		{
			for (var j = 0; j < 9; j++)
			{
				if (this.sudokuArr[i][j]%10 == 0)
				{
					var obj = document.getElementById("sq_" + (i*9+j));
					if (obj != null) {obj.pvalues = null;if (this.isSmartPad) {obj.pvalues = this.getPossibleNumbers(i,j);};obj.uvalues = new Array();}
					if (obj != null && autoFill)
					{
					    var tmpArr = null;
					    if (this.isSmartPad) {tmpArr = obj.pvalues;} else {tmpArr = this.getPossibleNumbers(i,j);}
					    if (tmpArr != null && tmpArr.length > 1)
					    {
							for (var k = 0; k < tmpArr.length; k++)
							{
								obj.uvalues.push(tmpArr[k]);
							}
							obj.innerHTML = this.getSmartHtmlStr(obj);
					    }
					}
				}
			}
		}

	    this.startTime = (new Date()).getTime();
	    this.isGameOver();
	}
	
	this.getSupStr = function(n, uarr)
	{
	    var str = "";
	    if (uarr != null)
	    {
		    for (var x = 0; x < uarr.length; x++) {if (n == uarr[x]) {str = '<sup class="supx">&radic;</sup>';}}
	    }
	    
	    return str;
	}
	
	this.getSmartPadString = function(pArr, tr, tc, padArr)
	{
		var str = "";var uarr = null;
	    var o = document.getElementById("sq_" + (tr*9+tc));
	    if (o != null) {uarr = o.uvalues;}
		for (var m = 1; m < 10; m++) 
		{
		    var found = false;
		    for (var k = 0; found == false && k < pArr.length; k++) {if (m == pArr[k]) {found = true;}}
		    if (found)
		    {
		        var supstr = this.getSupStr(m, uarr);
		        if (supstr.length > 10) {padArr.push(m);}
				str += '<div class="numbtn_e" id="pad_id_' + m + '" onClick="self.selNum(' + m + ');">' + m + supstr + '</div>';
		    }
		    else
		    {
				str += '<div class="numbtn_d">' + m + '</div>';
		    }
		}
		return str;
	}
	
	this.getOkStr = function()
	{
	    return '<div id="undo_id" class="undo_f" onClick="self.undoNumbers();"></div><div class="numbtn_ok" onClick="self.onPadOk();">OK</div>';
	}
	
	this.enableUndoButton = function()
	{
		var uo = document.getElementById("undo_id");
		if (uo == null) {return;}
	    if (this.undoArr.length > 0)
	    {
	    	uo.className = "undo_t";
	    }
	    else
	    {
	    	uo.className = "undo_f";
	    }
	}
	
	this.sqrTouch = function(r,c)
	{
		if (this.handVisible) {this.hideHandPointers();}
	    if (this.gameOver) {return;}
	    var pNumArr = this.getPadNumbers(r,c);
	    var ptrcls = 0;
	    this.padObj.row = r;
	    this.padObj.col = c;
	    
	    while (this.padObj.svalues.length > 0) {this.padObj.svalues.pop();}

	    var pt = this.dimy[r]; var pl = this.dimx[c];
	    this.padObj.style.top  = pt + "px";
	    this.padObj.style.left = pl + "px";
	    this.padObj.innerHTML = this.getSmartPadString(pNumArr, r, c, this.padObj.svalues) + this.getOkStr();
	    this.padObj.style.visibility = "visible";
	    this.enableUndoButton();

		var toff=-15; var loff=-15;
	    if (r >= 5) {ptrcls+=1;toff += 170}
	    if (c >= 5) {ptrcls+=2;loff += 130}
		this.padPtr.className = "numptr_" + ptrcls;
	    this.padPtr.style.top  = pt + toff + "px";
	    this.padPtr.style.left = pl + loff + "px";
	    this.padPtr.style.visibility = "visible";	
	}
	
	this.addPadObject = function(obj)
	{
	    this.padObj = document.createElement("div");
		this.padObj.className = "numpad";
		this.padObj.style.left = "0px";
		this.padObj.style.top = "0px";
		
		var str = "";
		for (var m = 1; m < 10; m++) {str += '<div class="numbtn_e" onClick="self.selNum(' + m + ');">' + m + '</div>';}
		this.padObj.innerHTML = str;
		this.padObj.style.visibility = "hidden";
		this.padObj.svalues = new Array();
		obj.appendChild(this.padObj);

		this.padPtr = document.createElement("div");
		this.padPtr.className = "numptr_0";
		this.padPtr.style.left = "0px";
		this.padPtr.style.top = "0px";
		this.padPtr.style.visibility = "hidden";
		obj.appendChild(this.padPtr);

		for (var x = 0; x < 2; x++)
		{
			this.handPtr[x] = document.createElement("div");
			this.handPtr[x].className = "handptr_0";
			this.handPtr[x].style.left = "0px";
			this.handPtr[x].style.top = "0px";
			this.handPtr[x].style.visibility = "hidden";
			obj.appendChild(this.handPtr[x]);
		}

	}
	
	this.showHints = function()
	{
	    var chksum = true;
	    for (var i = 0; chksum && i < 9; i++)
	    {
	        for (var j = 0; chksum && j < 9; j++)
	        {
	        	if (this.sudokuArr[i][j] > 10)
	        	{
	        	   var cn = Math.floor(this.sudokuArr[i][j]/10);
	        	   var un = this.sudokuArr[i][j]%10;
	        	   if (cn != un)
	        	   {
	        	        chksum = false;
						var o = document.getElementById("sq_" + (i*9 + j));
						this.showHand(this.handPtr[0], i, j);
	        	   }
	        	}
	        }	        
	    }
	    
	    return chksum;
	}
	
	this.tryAlternateSolution = function()
	{
		var chksum = true;var sum = 0;
		for (var i = 0; i < 9 && chksum; i++)
		{
			sum = 0;
			for (var j = 0; j < 9; j++)
			{
			    sum += this.sudokuArr[i][j]%10;
			}
			if (sum != 45) {chksum = false;}
		}
		
		if (chksum)
		{
			for (var i = 0; i < 9 && chksum; i++)
			{
				sum = 0;
				for (var j = 0; j < 9; j++)
				{
					sum += this.sudokuArr[j][i]%10;
				}
				if (sum != 45) {chksum = false;}
			}
		}
		
		if (chksum)
		{	    
			for (var i = 0; (chksum == false) && i < 3; i++)
			{
				for (var j = 0; (chksum == false) && j < 3; j++) 
				{
					sum = 0;
					sum += this.sudokuArr[i*3][j*3]%10;sum += this.sudokuArr[i*3][j*3+1]%10;sum += this.sudokuArr[i*3][j*3+2]%10;
					sum += this.sudokuArr[i*3+1][j*3]%10;sum += this.sudokuArr[i*3+1][j*3+1]%10;sum += this.sudokuArr[i*3+1][j*3+2]%10;
					sum += this.sudokuArr[i*3+2][j*3]%10;sum += this.sudokuArr[i*3+2][j*3+1]%10;sum += this.sudokuArr[i*3+2][j*3+2]%10;
					if (sum != 45) {chksum = false;}
				}	        
			}		
		}
		
		return chksum;		
	}

	this.isGameOver = function()
	{
	    var chksum = true;
	    // first make sure all cells are non zero
	    for (var i = 0; chksum && i < 9; i++)
	    {
	        for (var j = 0; j < 9; j++)
	        {
	        	if (this.sudokuArr[i][j]%10 == 0) {chksum = false;}
	        }
	        
	    }
	    
	    if (chksum == false) {return chksum;}
	    	    
		// Make sure no duplicates in any row	  
		var nm = 0;
	    for (var i = 0; chksum && i < 9; i++)
	    {
	        for (var j = 0; chksum && j < 8; j++)
	        {
	        	nm = this.sudokuArr[i][j]%10;
	        	for (var k = j+1; chksum && k < 9; k++)
	        	{
	        		if (nm == this.sudokuArr[i][k]%10) {chksum = false;this.showHandPointers(i,j,i,k);}
	        	}
	        }
	    }
	    
	    if (chksum)
	    {
	    	// Make sure no duplicates in any column	
			for (var i = 0; chksum && i < 9; i++)
			{
				for (var j = 0; chksum && j < 8; j++)
				{
					nm = this.sudokuArr[j][i]%10;
					for (var k = j+1; chksum && k < 9; k++)
					{
						if (nm == this.sudokuArr[k][i]%10) {chksum = false;this.showHandPointers(j,i,k,i);}
					}
				}
			}
	    }
	    
	    if (chksum)
	    {
	    	// Make sure no duplicates in any 3x3 grid	
	    	var tmpArr = new Array(9);
			for (var i = 0; chksum && i < 3; i++)
			{
				for (var j = 0; chksum && j < 3; j++)
				{
					var rr = i*3; var cc = j*3;var idx=0;
					for (var k = rr; k < rr+3; k++)
					{						
						for (var m = cc; m < cc+3; m++)
						{
							tmpArr[idx] = this.sudokuArr[k][m]%10;
							idx++;
						}
					}

					for (var xx = 0; chksum && xx < 8; xx++)
					{
						nm = tmpArr[xx];
						for (var yy = xx+1; chksum && yy < 9; yy++)
						{
							if (nm == tmpArr[yy])
							{
								chksum = false;
								this.showHandPointers(rr+Math.floor(xx/3),cc+xx%3,rr+Math.floor(yy/3),cc+yy%3);
							}
						}
					}
				}
			}
		}
	    
	    
	    return chksum;
	}
	
	this.addUsrSel = function(o,n)
	{
	    if (o != null)
	    {
	        var uarr = o.uvalues;
	        while (uarr.length > 0) {uarr.pop();}
	        for (var i = 0; i < this.padObj.svalues.length; i++)
	        {
	            uarr.push(this.padObj.svalues[i]);
	        }
	    }
	}
	

	this.getSmartHtmlStr = function(o)
	{
	    var str = "";
	    if (o != null)
	    {
	        var uarr = o.uvalues;
	        if (uarr.length == 1) {str = uarr[0];}
	        else if (uarr.length > 1)
	        {
	            uarr.sort(self.numsort);
	            for (var k = 0; k < uarr.length; k++)
	            {
	                str += '<div class="small_num">'+uarr[k]+'</div>';
	            }
	        }
	    }
	    
	    return str;
	}
	
	
	this.selNum = function(n)
	{
		var uarr = this.padObj.svalues;
		var found = false;
		for (var i = 0; i < uarr.length; i++)
		{
			if (n == uarr[i]) {uarr.splice(i,1);found=true;}
		}
		if (!found) {uarr.push(n);}
		var o = document.getElementById("pad_id_"+n);
		if (o != null)
		{
			o.innerHTML = n + this.getSupStr(n,uarr);
		}
	}
	
	
	this.showHand = function(handObj,r,c)
	{
		var ptrcls = 0;
		var pt = this.handy[r]; var pl = this.handx[c];
		var toff=-15; var loff=-15;						
		if (r >= 8) {ptrcls+=1;toff += 170}
		if (c >= 8) {ptrcls+=2;loff += 130}
		handObj.className = "handptr_" + ptrcls;
		handObj.style.top  = pt + toff + "px";
		handObj.style.left = pl + loff + "px";
		handObj.style.visibility = "visible";	
		this.handVisible = true;
	}
	
	
	this.showHandPointers = function(r1,c1,r2,c2)
	{	
		this.showHand(this.handPtr[0],r1,c1);
		this.showHand(this.handPtr[1],r2,c2);
	}
	
	this.checkForDuplicates = function(row, col, val)
	{
		var prevVal = 0;
		var prevRow = 0;prevCol = 0;
		var found = false;
		
		// Check same row
		for (var k = 0; k < 9 && (found == false); k++)
		{
			if (col != k)
			{		
				prevVal = this.sudokuArr[row][k]%10;
				if (prevVal == val) {found=true;prevRow=row;prevCol=k;}
			}
		}
		
		if (found == false)
		{
			// Check same column
			for (var k = 0; k < 9 && (found == false); k++)
			{
				if (row != k)
				{
					prevVal = this.sudokuArr[k][col]%10;
					if (prevVal == val) {found=true;prevRow=k;prevCol=col;}
				}
			}
		}

		if (found == false)
		{
			// check same grid			
			var rr = Math.floor(row/3);
			var cc = Math.floor(col/3);
			for (var k1 = 0; k1 < 3 && (found == false); k1++)
			{
				for (var k2 = 0; k2 < 3 && (found == false); k2++)
				{
					if ((rr*3+k1 != row) && (cc*3+k2 != col))
					{
						prevVal = this.sudokuArr[rr*3+k1][cc*3+k2]%10;
						if (prevVal == val) {found=true;prevRow=rr*3+k1;prevCol=cc*3+k2;}
					}
				}
			}
		}
		
		if (found) {this.showHandPointers(row,col,prevRow,prevCol);}
	}
	
	this.cleanSquare = function(r,c,n,validNum)
	{
	    var o = document.getElementById("sq_" + (r*9 + c));
	    if (o != null) 
	    {
	        var uarr = o.uvalues;
	        if (uarr != null && uarr.length > 1)
	        {
				for (var ix = 0; ix < uarr.length; ix++)
				{
					if (n == uarr[ix]) 
					{
						this.undoArr.push([r,c,n]);
						uarr.splice(ix,1);
						o.innerHTML = this.getSmartHtmlStr(o);	
						if (uarr.length == 1)
						{
							var nx = this.sudokuArr[r][c];
							nx = Math.floor(nx/10)*10;
					    	this.sudokuArr[r][c] = nx + o.uvalues[0];
					    	this.cleanArr.push([r,c,o.uvalues[0]]);
					    	if (validNum == false)
					    	{
						    	this.checkForDuplicates(r,c,o.uvalues[0]);
					    	}
						}
						break;
					}
				}
	        }
	    }	    
	}
	
	this.cleanDuplicatesRecurse = function()
	{
		if (this.cleanArr.length == 0) {return true;}
		var xArr = this.cleanArr.shift();
		this.cleanDuplicates(xArr[0],xArr[1],xArr[2]);
		return true;
	}
	
	this.undoNumbers = function()
	{
	    if (this.undoArr.length == 0) {return;}
	    var xArr = null;
	    while (this.undoArr.length > 0)
	    {
	        xArr = this.undoArr.pop();
	        if (xArr.length == 3)
	        {
	            var nx = Math.floor(this.sudokuArr[xArr[0]][xArr[1]]/10)*10;
	            this.sudokuArr[xArr[0]][xArr[1]] = nx;
				var o = document.getElementById("sq_" + (xArr[0]*9 + xArr[1]));
				if (o != null) 
				{
					var found = false;
					var uarr = o.uvalues;
					for (var kx = 0; kx < uarr.length; kx++) {if (uarr[kx] == xArr[2]) {found=true;}}
					if (found == false) {uarr.push(xArr[2]);}
					o.innerHTML = this.getSmartHtmlStr(o);
				}
	        }
	    }	   
	    
	    // Empty the selected Square
	    if (xArr != null && xArr.length == 3)
	    {
			var o = document.getElementById("sq_" + (xArr[0]*9 + xArr[1]));
			if (o != null) 
			{
				if (o.uvalues.length == 1 && o.uvalues[0] == xArr[2])
				{
					o.uvalues.pop();
					o.innerHTML = this.getSmartHtmlStr(o);
				}
			}
	    }
	    
		this.padObj.style.visibility = "hidden";
	    this.padPtr.style.visibility = "hidden";
	}

	this.cleanDuplicates = function(row, col, val)
	{		
		var validNum = false;
		var nx = Math.floor(this.sudokuArr[row][col]/10);
		if (nx == val) {validNum = true;}
		
		// Check same row
		for (var k = 0; k < 9; k++)
		{
			if (col != k)
			{	
				this.cleanSquare(row,k,val, validNum);
				if (this.handVisible) {return;}
			}
		}
		
		// Check same column
		for (var k = 0; k < 9; k++)
		{
			if (row != k)
			{
				this.cleanSquare(k,col,val, validNum);
				if (this.handVisible) {return;}
			}
		}

		// check same grid			
		var rr = Math.floor(row/3);
		var cc = Math.floor(col/3);
		for (var k1 = 0; k1 < 3; k1++)
		{
			for (var k2 = 0; k2 < 3; k2++)
			{
				if ((rr*3+k1 != row) && (cc*3+k2 != col))
				{
					this.cleanSquare(rr*3+k1,cc*3+k2,val, validNum);
					if (this.handVisible) {return;}
				}
			}
		}
		
		if (validNum) {return this.cleanDuplicatesRecurse();}
	}
	
	this.onPadOk = function()
	{
		// clear undo array.
		while (this.undoArr.length > 0) {this.undoArr.pop();}
		
	    this.handVisible = false;
	    var nx = this.sudokuArr[this.padObj.row][this.padObj.col];
	    nx = Math.floor(nx/10)*10;
	    this.sudokuArr[this.padObj.row][this.padObj.col] = nx;
	    var o = document.getElementById("sq_" + (this.padObj.row*9 + this.padObj.col));
	    if (o != null) 
	    {
	    	this.addUsrSel(o);o.innerHTML = this.getSmartHtmlStr(o);
		    if (o.uvalues.length == 1) 
		    {
		    	this.undoArr.push([this.padObj.row,this.padObj.col,o.uvalues[0]]);
		    	this.sudokuArr[this.padObj.row][this.padObj.col] = nx + o.uvalues[0];
		    	if (this.checkDuplicates) {this.checkForDuplicates(this.padObj.row, this.padObj.col, o.uvalues[0]);}
		    	// If we found duplicates then don't auto clean
		    	if (this.autoClean && (this.handVisible == false)) {this.cleanDuplicates(this.padObj.row, this.padObj.col, o.uvalues[0]);}
		    }
	    }
	    
		this.padObj.style.visibility = "hidden";
	    this.padPtr.style.visibility = "hidden";
	    
	    if (this.handVisible) {return;}
		this.gameOver = this.isGameOver();
		if (this.gameOver)
		{
		    var ticks = Math.floor(((new Date()).getTime() - this.startTime)/1000);
		    var tmstr = Math.floor(ticks/60) + ":" + ticks % 60;
			var str = '<div class="btntxt" style="margin-left:30px;">Check your time </div><div id="lbtn"></div><div id="mbtn" onClick="self.submitfrm(\'' + tmstr + '\');">OK</div><div id="rbtn"></div>';
			var f = document.getElementById("btnbrd"); if (f != null) {f.innerHTML = str;}        
		}
	}
	
	this.hideHandPointers = function()
	{
		this.handPtr[0].style.visibility = "hidden";
	    this.handPtr[1].style.visibility = "hidden";
		this.handVisible = false;
	}
	
	this.submitfrm = function(tmstr)
	{
		var f = document.getElementById("sudokubrd");
		if (f != null) 
		{
			var str = "Your time for level " + this.level + " is: " + tmstr; 
			f.innerHTML = "";
			var o = f.appendChild(document.createElement('div'));
			o.innerHTML='<input type="hidden" name="helppage" value="sudokuhelp.html" />';
			var o = f.appendChild(document.createElement('div'));
			o.innerHTML='<input type="hidden" name="gamepage" value="sudoku.html" />';
			o = f.appendChild(document.createElement('div'));
			o.innerHTML='<input type="hidden" name="msg" value="' + str + '" />';
		}

		document.sudoku_frm.submit();
	}

	
		
	this.swapNumbers = function()
	{
		var rnd = this.getRandom(53,79);
	    for (var i = 0; i < rnd; i++)
	    {
	        var n1 = this.getRandom(1,9);var n2 = this.getRandom(1,9);
	        if (n1 != n2)
	        {
	            for (var k = 0; k < 9; k++)
	            {
	                for (var m = 0; m < 9; m++)
	                {
	                    if (this.sudokuArr[k][m] == n1) {this.sudokuArr[k][m] = n2;}
	                    else if (this.sudokuArr[k][m] == n2) {this.sudokuArr[k][m] = n1;}
	                }
	            }
	        }
	    }
	}
	

	this.removeSquares = function(lvl)
	{
	    for (var k = 0; k < lvl*9; k++)
	    {
	        var rr = this.getRandom(0,8);
	        var cc = this.getRandom(0,8);
	        if (this.sudokuArr[rr][cc] < 10) {this.sudokuArr[rr][cc] *= 10;}
	    }
	}
	
	this.getPadNumbers = function(tr,tc)
	{
	    if (this.isSmartPad)
	    {
			var o = document.getElementById("sq_" + (tr*9+tc));
			if (o != null) {return o.pvalues;}
	    }
	    else {return this.allNumArr;}
	}
	
	this.getPossibleNumbers = function(tr,tc)
	{
	    var r=0; var c=0;var pArr = new Array(0,1,2,3,4,5,6,7,8,9);
	    if (tr < 3) {r=0;} else if (tr < 6) {r=1;} else {r=2;}
	    if (tc < 3) {c=0;} else if (tc < 6) {c=1;} else {c=2;}
	    r *= 3; c *= 3;var x = 0;
	    for (var i = r; i < r+3; i++)
	    {
	        for (var j = c; j < c+3; j++)
	        {
	            x = this.sudokuArr[i][j]%10;
	            pArr[x] = 0;
	        }
	    }
	    for (var i = 0; i < 9; i++) {x = this.sudokuArr[tr][i]%10;pArr[x] = 0;}
	    for (var i = 0; i < 9; i++) {x = this.sudokuArr[i][tc]%10;pArr[x] = 0;}	    
	    pArr.sort(self.numsort);
	    while (pArr[0] == 0) {pArr.shift();}
	    return pArr;
	}
	
	
	this.numsort = function(a,b) {return a-b;}
	
	this.getRandom = function(min,max)
	{
		return min + Math.floor(Math.random()*(max-min+1))
	}
	
	this.createUserBoard = function(clrcode)
	{
		this.isSmartPad = false;
		this.checkDuplicates = true;
		this.autoClean = false;
		var clsNm ="sqr_e_"+clrcode;	
	    var str = '';
	    for (var i = 0; i < 9; i++)
	    {
	        if (i%3 == 0) {str += '<div class="line_h"></div>';}
	        for (var j = 0; j < 9; j++)
	        {
	            if (j%3 == 0) {str += '<div class="line_v"></div>';}
                str += '<div id = "sq_' + (i*9+j) + '" class="' + clsNm + '" onClick="self.sqrTouch(' + i + ',' + j + ');"></div>';
	        }
	    }
	    
	    var o = document.getElementById("sudokubrd"); if (o != null) {o.innerHTML = str;}

		for (var i = 0; i < 9; i++)
		{
			for (var j = 0; j < 9; j++)
			{
				var obj = document.getElementById("sq_" + (i*9+j));
				if (obj != null) {obj.pvalues = null;obj.uvalues = new Array();}
			}
		}

	    for (var i = 0; i < 9; i++)
	    {
	        this.sudokuArr[i] = new Array(9);
	        for (var j = 0; j < 9; j++)
	        {
	            this.sudokuArr[i][j] = 0;
	        }
	    }
	    this.addPadObject(o);
	    
	    var okobj = document.getElementById("btnbrd"); if (okobj != null) {okobj.innerHTML = '<div class="numbtn_ok" onClick="self.onUsrBrdOk();">Start</div>';}	    
	}
	
	this.onUsrBrdOk = function()
	{
	    if (this.usrGameCB != null) {this.usrGameCB();}
	}
}


-->


