    var urlAddress = "http://www.sudoku-solutions.com";
    var pageName = "Sudoku Solver";

    function addToFavorites()
    {
        if (window.external)
            window.external.AddFavorite(urlAddress,pageName);
        else
            alert("Sorry! Your browser doesn't support this function.");
    }

	// Hide the candidate ccontainer and display the input container
	function toggleCandidateContainer (candidateContainer) {
		// Hide the candidate container
		candidateContainer.style.display='none'; 

		// Show the candidate container
		inputContainerID = candidateContainer.id.replace("_CANDIDATE_CONTAINER","_INPUT_CONTAINER");
		inputContainer = document.getElementById(inputContainerID);
		inputContainer.style.display='block';

		// Set focus in the input cell
		inputCellID = inputContainerID.replace("_INPUT_CONTAINER","");	
		inputCell = document.getElementById(inputCellID);
		inputCell.focus(); 
		return true;
	}
	
	// Toggle a candidate value
	function toggleCandidate(candidateField, value) {
		if (candidateField.value == '')
			candidateField.value = value;
		else
			candidateField.value = '';
	}
	
	// Select a cell
    function selectCell(obj) {
        document.forms["SUDOKU"].elements["SELCELL"].value =obj.name;
    }

    // Actions on keydown
    function keydown(obj, keyStroke, gridOrder) {
    	var keyCode;
    	var cellnum;

    	cellnum = parseInt(obj.name.substr(1));

    	tgtCellnum = cellnum - 1;

    	if( -1 != navigator.userAgent.indexOf ("MSIE") )
    		keyCode = event.keyCode;
    	else
    		keyCode = keyStroke.which;


    	// Check if the keycode is valid
    	switch(keyCode) {

    		// Left arrow
    		case 37:
    			cellnum = (cellnum == 1) ? (gridOrder * gridOrder) : (cellnum - 1);
    			document.forms["SUDOKU"].elements["C" + cellnum].focus();
    			document.forms["SUDOKU"].elements["C" + cellnum].select();
    			break;

    		// Delete
    		case 8:
    		case 46:
    			break;

    		// Up arrow
    		case 38:
    			cellnum = cellnum - gridOrder;
    			if (cellnum < 1) cellnum = cellnum + (gridOrder * gridOrder);
    			document.forms["SUDOKU"].elements["C" + cellnum].focus();
    			document.forms["SUDOKU"].elements["C" + cellnum].select();
    			break;


    		// Down arrow
    		case 40:
    			cellnum = cellnum + gridOrder;
    			if (cellnum > (gridOrder * gridOrder)) cellnum = cellnum - (gridOrder * gridOrder);
    			document.forms["SUDOKU"].elements["C" + cellnum].focus();
    			document.forms["SUDOKU"].elements["C" + cellnum].select();
    			break;

    		// Right arrow, everything else
    		case 39:
    			cellnum = (cellnum == (gridOrder * gridOrder)) ? 1 : (cellnum + 1);
    			document.forms["SUDOKU"].elements["C" + cellnum].focus();
    			document.forms["SUDOKU"].elements["C" + cellnum].select();
    			break;

            default:
                break;

    	}
    	return true;
    }

    // Actions on keyup, tab to next field if input was numeric
    function keyup(obj, keyStroke, gridOrder) {
    	var keyCode;
    	var cellnum;

    	cellnum = parseInt(obj.name.substr(1));

    	tgtCellnum = cellnum - 1;

    	if( -1 != navigator.userAgent.indexOf ("MSIE") )
    		keyCode = event.keyCode;
    	else
    		keyCode = keyStroke.which;

        if ((keyCode >= 49 && keyCode <= 57) ||
            (keyCode >= 97 && keyCode <= 105) ||
            (keyCode == 32)) {
    		cellnum = (cellnum == (gridOrder * gridOrder)) ? 1 : (cellnum + 1);
   			document.forms["SUDOKU"].elements["C" + cellnum].focus();
        }
        
    	return true;
    }

    // Print the board
    function doPrintGrid()
    {
    	var oldAction = document.forms["SUDOKU"].action;
    
    	// Submit to print page
		document.forms["SUDOKU"].action = "sudokuPrint.php";
		document.forms["SUDOKU"].target = "_new";
		document.forms["SUDOKU"].submit();

		// Restore
		document.forms["SUDOKU"].action = oldAction;
		document.forms["SUDOKU"].target = "_self";
		
		return true;
    }
    
    // Toggle DIV
    function toggleVisibility(id, objButton, toggleOnText, toggleOffText) {
       var e = document.getElementById(id);
       if(e.style.display == 'block') {
          e.style.display = 'none';
          objButton.value = toggleOnText;
       } else {
          e.style.display = 'block';
          objButton.value = toggleOffText;
       }
    }
    

