function f_check_game()
{
	f_resetClassName();
	for(var i = 0; i < 81; i++)
	{
		var cell = document.getElementById('cell' + i.toString());
						
		if ((cell.value.length != 1) || (cell.className == 'insumark'))
			continue;
			
		if (cell.value != solution.charAt(i))
		{
			document.getElementById('td' + i.toString()).className = origTDStyles[i] + ' wrongTD'; 
			curTDStyles[i] = document.getElementById('td'+i.toString()).className;				
		}
	}
}

function f_Mark(cell_no)
{
	var cell = document.getElementById('cell' + cell_no.toString());
	var v = cell.value;
	
	if (v.length != 1) return true;
		
	if (cell.className != 'insumark')
	{			
		f_resetClassName();
		cell.className = 'insumark'; 
	}	
	else check_input(cell_no);
}

function check_input(cell_no)
{
	var cell = document.getElementById('cell' + cell_no.toString());
	var v = cell.value;
	
	f_resetClassName();
	cell.className = 'insu'; 
	
	if (v == '')
		return true;
		
	if (v.length > 1) 
	{
		cell.className = 'insumark'; 
		return true;
	}
	
	game = get_CurrentGame();
	game = game.substr(0, cell_no) + v + game.substr(cell_no+1, 81);
	undo_stack.push(cell_no);
	
	if (game == solution)
	{
		f_show_winner();
		return true;
	}
	
	digits=/[123456789]/;
	if( (v.length > 0) && (!digits.test(v)))
	{	
		cell.value = "";
		return false;	
	}
	
	var row = row_num(cell_no);
	for (var i = row*9; i < (row+1)*9; i++)
	{
		if (( i != cell_no ) && (game.charAt(i) == v))
		{ 
			// found a duplicate in a row
			f_warn('row',cell_no);
			break;
		} 
	}

	var col = col_num(cell_no);
	for (var i = 0; i < 9; i++)
	{
		if (((i*9+col) != cell_no) && (game.charAt(i*9+col) == v))
		{
			f_warn('col',cell_no);
			break;
		}
	} 

	var startBlock = start_block_num(cell_no);

	for (var i = startBlock; i < (startBlock + 3 + 2*9); i += 9) 
	{
		for (var j = 0; j < 3; j++)
		{
			if (((i+j) != cell_no) && (v == game.charAt(i+j)))
			{
				f_warn('block',cell_no);
				break;
			}
		}
	}
	
	cell.className = origCellStyles[cell_no];
	return true;
}

function row_num(c)
{
   return (c - (c % 9)) / 9;
}

function col_num(c)
{   
	return c % 9;
}

function block_num(c)
{ 	//returns block number 0 to 8 from left to right and top to bottom
	var row = row_num(c);
	var col = col_num(c);
	return (row - row%3)+(col - col%3)/3;
}

function start_block_num(c)
{
	return ((Math.floor(c / 27) * 27) + (Math.floor(col_num(c) / 3) * 3));
}

function f_hint()
{
	f_resetClassName();
	game = get_CurrentGame();
	
	var i = 0;
	var loop = true;
	var c = 0;
	
	for(i = 0; i < 81; i++)
	{
		var cell = document.getElementById('cell'+i);
		if ((!cell.readOnly) && (cell.value == ""))
			c++;
	}

	var ran_number = Math.floor(Math.random()*c);
	i = 0;
	var r = 0;
	
	while ((i < 81) && (loop == true))
	{
		var cell = document.getElementById('cell'+i.toString());

		if ((!cell.readOnly) && (cell.value == ""))
		{
			if (r >= ran_number)
			{
				document.getElementById('cell'+i.toString()).value = solution.charAt(i);
				document.getElementById('cell' + i.toString()).className = origCellStyles[i] + ' insuHint';
				game = game.substr(0, i) + solution.charAt(i) + game.substr(i+1, 81);
				undo_stack.push(i);
				loop = false;
			}
			else r++;
		}
		i++;
	}
}

function f_print()
{
	window.open('print.php?game_id='+ get_CurrentLevel()+ game_id.toString(), 'Print');
}

function f_solution()
{
	for(var i = 0; i < 81; i++)
	{
		if (document.getElementById('cell'+i.toString()).className == 'insumark')
			document.getElementById('cell'+i.toString()).className = 'insu'; 
	}

	f_resetClassName();
	
	for(var i = 0; i < 81; i++)
	{
		var cell=document.getElementById('cell'+i.toString());
		if (!cell.readOnly)
		{
			document.getElementById('cell'+i).value = solution.charAt(i);
			document.getElementById('cell'+i).className = origCellStyles[i] + ' insuHint';    
		}    
	}
}

function f_new_game()
{
	SetCookie("cookieLevel", get_CurrentLevel(), 3650);
	//document.frm.submit();
	
	var url = 'rpc_micro.php?level='+ get_CurrentLevel() + '&sid=' + Math.random();
	loadXMLDoc(url);
	undo_stack = new Array();
	document.body.style.cursor = 'wait';
}


function get_CurrentGame()
{
	lgame = "";
	for (i = 0; i < 81; i++)
	{
		var v = document.getElementById('cell'+i).value;
		if ((v.length == 1) && (document.getElementById('cell'+i).className != 'insumark'))
			lgame = lgame + v;
		else
			lgame = lgame + "0";
	}
	
	return lgame;
}

function get_CurrentLevel()
{
	return document.getElementById('level').value;
}

function SetCookie(cookieName, cookieValue, nDays) 
{
	var today = new Date();
	var expire = new Date();
	
	if (nDays == null || nDays == 0) 
		nDays=1;
		
	expire.setTime(today.getTime() + 3600000*24*nDays);
	
	document.cookie = cookieName + "=" + escape(cookieValue) + ";expires=" + expire.toGMTString();
}

function highlight(i)
{
	document.getElementById('td'+i.toString()).className = origTDStyles[i] + ' highlightTDCell';
}

function dehighlight(i)
{
	document.getElementById('td'+i.toString()).className = curTDStyles[i];				
}

function f_warn(elem_type, cell_no)
{
	for(var i = 0; i < 81; i++)
	{
		if( ((elem_type=='row') && (row_num(i)==row_num(cell_no))) ||
		    ((elem_type=='col') && (col_num(i)==col_num(cell_no))) ||
		    ((elem_type=='block') && (block_num(i)==block_num(cell_no))) )
		{
			if (getValueAt(cell_no) == getValueAt(i))
				document.getElementById('td'+i.toString()).className =  origTDStyles[i] + ' warningTD';
			curTDStyles[i] = document.getElementById('td'+i.toString()).className;	
		}
	}
}

function f_resetClassName()
{
	for(var i = 0; i < 81; i++)
	{
		document.getElementById('td'+i.toString()).className =  origTDStyles[i]; 
		curTDStyles[i] = document.getElementById('td'+i.toString()).className;
	}
}

function getValueAt(cell_no)
{
	var cell = document.getElementById('cell' + cell_no.toString());
	var v = cell.value;
	if ((v.length == 1) && (cell.className != 'insumark'))
		return v;
	else
		return '0';
}

function getOrigStyles()
{
	for(var i = 0; i < 81; i++)
	{
		origTDStyles[i] = document.getElementById('td'+i.toString()).className;
		origCellStyles[i] = document.getElementById('cell'+i.toString()).className;
		curTDStyles[i] = origTDStyles[i];
	}
}

function f_show_winner()
{
	alert('Great, you solved the Sudoku!') ;
/*	nDisplayPage = 1;
	document.getElementById("GameboardDiv").style.display = 'none';
	document.getElementById("HelpDiv").style.display = 'none';
	document.getElementById("GadgetDiv").style.display = 'none';
	document.getElementById("WinnerDiv").style.display = 'block';
	document.getElementById("ControlbarDiv").style.display = 'block';
	document.getElementById("HelpbarDiv").style.display = 'none';
*/}

function f_help()
{
	nDisplayPage = 2;
	document.getElementById("GameboardDiv").style.display = 'none';
	document.getElementById("HelpDiv").style.display = 'block';
	document.getElementById("GadgetDiv").style.display = 'none';
	document.getElementById("ControlbarDiv").style.display = 'none';
	document.getElementById("HelpbarDiv").style.display = 'block';
	document.getElementById("btPrev").style.visibility = 'hidden';
	document.getElementById("btNext").style.visibility = 'visible';
}

function f_OK()
{
	nDisplayPage = 1;
	document.getElementById("GameboardDiv").style.display = 'block';
	document.getElementById("HelpDiv").style.display = 'none';
	document.getElementById("GadgetDiv").style.display = 'none';
	document.getElementById("ControlbarDiv").style.display = 'block';
	document.getElementById("HelpbarDiv").style.display = 'none';
} 

function f_NextPage()
{
	nDisplayPage += 1;
	switch (nDisplayPage) {
		case 3:  
			document.getElementById("GameboardDiv").style.display = 'none';
			document.getElementById("HelpDiv").style.display = 'none';
			document.getElementById("GadgetDiv").style.display = 'block';
			document.getElementById("ControlbarDiv").style.display = 'none';
			document.getElementById("HelpbarDiv").style.display = 'block';
			break;
	}
	document.getElementById("btPrev").style.visibility = 'visible';
	if (nDisplayPage >= 3)
		document.getElementById("btNext").style.visibility = 'hidden';

}

function f_PrevPage()
{
	nDisplayPage -= 1;
	switch (nDisplayPage) {
		case 2:  
			document.getElementById("GameboardDiv").style.display = 'none';
			document.getElementById("HelpDiv").style.display = 'block';
			document.getElementById("GadgetDiv").style.display = 'none';
			document.getElementById("ControlbarDiv").style.display = 'none';
			document.getElementById("HelpbarDiv").style.display = 'block';
			break;
	}
	document.getElementById("btNext").style.visibility = 'visible';
	if (nDisplayPage <=2)
		document.getElementById("btPrev").style.visibility = 'hidden';

}

function f_gadget()
{
	document.getElementById("GameboardDiv").style.display = 'none';
	document.getElementById("HelpDiv").style.display = 'none';
	document.getElementById("GadgetDiv").style.display = 'block';
	document.getElementById("btHint").style.visibility = 'hidden';
	document.getElementById("btCheck").style.visibility = 'hidden';
	document.getElementById("btPrint").style.visibility = 'hidden';
	document.getElementById("btSolution").style.visibility = 'hidden';
	document.getElementById("btNew").style.visibility = 'hidden';
	document.getElementById("level").style.visibility = 'hidden';
}
	
var req;

function loadXMLDoc(url) 
{
	req = false;

    if(window.XMLHttpRequest) 
	{
    	try {
			req = new XMLHttpRequest();
        } catch(e) {
			req = false;
        }		
    } 
	else if(window.ActiveXObject) 
	{
       	try {
        	req = new ActiveXObject("Msxml2.XMLHTTP");
      	} 
		catch(e) {
        	try {
          		req = new ActiveXObject("Microsoft.XMLHTTP");
        	} 
			catch(e) {
          		req = false;
        	}
		}
    }
	
	if(req) 
	{
		req.onreadystatechange = processReqChange;
		req.open("GET", url, true);
		req.send(null);
	}
}

function processReqChange() {
    if (req.readyState == 4) {
        if (req.status == 200) {
            var response = req.responseText;
			data = response.split('|');
			document.getElementById('HeadLineDiv').innerHTML = data[0];	
			document.getElementById('GameboardDiv').innerHTML = data[1];	
			game_id = data[2];
			solution = data[3];
			getOrigStyles();
			f_resetClassName();
			document.body.style.cursor = 'default';
        } else {
            alert("There was a problem retrieving the XML data:\n" +
                req.statusText);
        }
    }
}


