//**********************************************************************
// clickOnCell: handler for a click on a cell.
//**********************************************************************
Sudoku.clickOnCell = function(e) {
    Sudoku.boxes[Sudoku.selectedBox].removeClass('selected');
    var box = $(this);
    if(box.is('.single-poss')) {
        box.removeClass('single-poss');
        box.removeClass('single-digit');
        var poss = box.data('poss');
        var index = $.inArray(true, poss);
        if(index<0) console.log('ERROR: clickOnCell: true not found');
        var digit = index+1;
        //console.log("clickOnCell: digit="+digit);
        $('.mid-digit', box).html(digit.toString());
        box.data('digit', digit);
        Sudoku.changeMade();
    } else if(box.is('.single-digit')) {
        box.removeClass('single-digit');
        box.removeClass('single-poss');
        var digit = box.data('single-digit');
        $('.mid-digit', box).html(digit.toString());
        box.data('digit', digit);
        Sudoku.changeMade();
    } else {
        Sudoku.selectedBox = box.data('index');;
        box.addClass('selected');
    }
    
};

//**********************************************************************
// changeMade: called when a number is placed in a cell.
//**********************************************************************
Sudoku.changeMade = function() {    
    Sudoku.computePossibles();
};

//**********************************************************************
// markSingles: 
//**********************************************************************
Sudoku.markSingles = function() {
    // See if any cells have only once place to put a number.
    var row, col;
    
    var checkBoxes = function(boxes) {
        var digitCounts = [0, 0, 0, 0, 0, 0, 0, 0, 0];
        var lastDigitCountBox = [null, null, null, null, null, null, null, null, null];
        $.each(boxes, function(iBox, aBox) {
            var poss = aBox.data('poss');
            $.each(poss, function(i,a) {
                if(a) {
                    digitCounts[i] += 1;
                    lastDigitCountBox[i] = aBox;
                }
            });
        });
        //console.log("row="+row+" col="+col+" digitCounts="+digitCounts.join(','));
        $.each(digitCounts, function(i,a) {
            var box = lastDigitCountBox[i];
            if((a==1) && (box.data('digit')==0) && !(box.is('.single-poss'))) {
                box.addClass('single-digit');
                var digit = i+1;
                box.data('single-digit', digit);
                $('.bottom-line', box).html(digit.toString());
                //console.log("single-digit: index="+box.data('index')+" row="+row
                    //+" col="+col+" digit="+digit);
            }
        });
    };
    
    for(row=0; row<9; row += 3) {
        for(col=0; col<9; col += 3) {
            var index = 9*row + col;
            var box = Sudoku.boxes[index];
            if(!(box.is('.single-poss'))) {
                checkBoxes(Sudoku.getCellBoxes(box));
            }
        }
    }
    
    // See if any rows have only once place to put a number.
    var row;
    for(index=0; index<81; index += 9) {
        var box = Sudoku.boxes[index];
        if(!(box.is('.single-poss'))) {
            checkBoxes(Sudoku.getRowBoxes(box));
        }
    }

    // See if any columns have only once place to put a number.
    var row;
    for(index=0; index<9; index += 1) {
        var box = Sudoku.boxes[index];
        if(!(box.is('.single-poss'))) {
            checkBoxes(Sudoku.getColBoxes(box));
        }
    }
};

//**********************************************************************
// computePossibles:
//**********************************************************************
Sudoku.computePossibles = function()
{
    var i, j, poss;
    
    var processBoxes = function(i, box) {
        var digit = box.data('digit');
        if(digit > 0) {
            poss[digit-1] = false;
        }
    };
    
    for(i=0; i<81; ++i) {
        var topRow = '&nbsp;';
        var thisBox = Sudoku.boxes[i];
        var digit = thisBox.data('digit');
        thisBox.removeClass('single-poss');
        thisBox.removeClass('single-digit');
        
        if(digit == 0) {
            // Initialize the array of possible numbers in this cell;
            poss = [true, true, true, true, true, true, true, true, true];
            
            $.each(Sudoku.getRowBoxes(thisBox), processBoxes);
            $.each(Sudoku.getColBoxes(thisBox), processBoxes);
            $.each(Sudoku.getCellBoxes(thisBox), processBoxes);
        
            // save the possibilities for this box.
            thisBox.data('poss', poss);
            
            // Put in the top-line digits
            var s = '';
            for(j=0; j<9; ++j) {
                if(poss[j]) s += (j+1).toString();
            }
            if(s.length>0) topRow = s;
            if(s.length==1) {
                thisBox.addClass('single-poss');
                //console.log('single-poss: index='+i+' digit='+s);
            }
        } else {
            poss = [false, false, false, false, false, false, false, false, false];
            poss[digit-1] = true;
        }
        
        thisBox.data('poss', poss);
        
        $('.top-line', thisBox).html(topRow);
        $('.bottom-line', thisBox).html('&nbsp;');
    }
    
    Sudoku.markSingles();  
};



