/*
 * Script by Mike Tyndall. HW1 - Bloody Harry (95952), HW2 - Mike ® (11047)
 * University solver algorithm by Mike Vogt. HW1 - orber (81042), HW2 - orber (6836)
 */

var CC1 = 0, CC2 = 0, CC3 = 0, CC4 = 0, RR1 = 0, RR2 = 0, RR3 = 0, RR4 = 0;
var oldCC1 = 0, oldCC2 = 0, oldCC3 = 0, oldCC4 = 0, oldRR1 = 0, oldRR2 = 0, oldRR3 = 0, oldRR4 = 0;

var dots         = Array(Array(1, 1, 1, 1), Array(1, 1, 1, 1), Array (1, 1, 1, 1), Array(1, 1, 1, 1));
var currentScore = 0;
var solved       = false;

function change(i, j) {
    var dot = ++(dots[i][j]);
    if(dots[i][j] > 2) { dots[i][j] = 0; currentScore -= 2; }
    else               { ++currentScore; }

    var index = i + "-"; index += j;
    if(dots[i][j] == 0)      { document.getElementById(index).src = "red.gif"; }
    else if(dots[i][j] == 1) { document.getElementById(index).src = "yellow.gif"; }
    else                     { document.getElementById(index).src = "green.gif"; }

    document.getElementById("current_score").innerHTML = currentScore;
}

function changeRow(row) {
    for(var i = 0; i < 4; ++i) {
        change(row, i);
    }
    if(solved) {
        var rowMarker = document.getElementById("r" + (row + 1));
        if(rowMarker.innerHTML != "") {
            var changesLeft = rowMarker.innerHTML - 0;
            if(changesLeft <= 1) { rowMarker.innerHTML = ""; }
            else                 { rowMarker.innerHTML = changesLeft - 1; }
        }
    }
}

function changeColumn(column) {
    for(var i = 0; i < 4; ++i) {
        change(i, column);
    }
    if(solved) {
        var columnMarker = document.getElementById("c" + (column + 1));
        if(columnMarker.innerHTML != "") {
            var changesLeft = columnMarker.innerHTML - 0;
            if(changesLeft <= 1) { columnMarker.innerHTML = ""; }
            else                 { columnMarker.innerHTML = changesLeft - 1; }
        }
    }
}

function reset() {
    currentScore = 0;
    solved       = false;
    document.getElementById("current_score").innerHTML = "0";
    document.getElementById("best_score").innerHTML    = "";
    for(var i = 0; i < 4; ++i) {
        for(var j = 0; j < 4; ++j) {
            dots[i][j] = 1;
            document.getElementById(i + "-" + j).src = "yellow.gif";
        }
        document.getElementById("c" + (i + 1)).innerHTML = "";
        document.getElementById("r" + (i + 1)).innerHTML = "";
    }
}

function generatePuzzle() {
    for(var i = 0; i < 4; ++i) {
        for(var j = 0; j < 4; ++j) {
            var temp = Math.floor(Math.random() * 10 % 3);
            for(var k = 0; k < temp; ++k) { change(i, j); }
        }
    }
}

function solve() {
    var temp, moves, bestMoves = 0, bestScore = 0;

    for(var i = 0; i <= 2; ++i) {
        for(var j = 0; j <= 2; ++j) {
            for(var k = 0; k <= 2; ++k) {
                for(var l = 0; l <= 2; ++l) {
                    for(var m = 0; m <= 2; ++m) {
                        for(var n = 0; n <= 2; ++n) {
                            for(var o = 0; o <= 2; ++o) {
                                for(var p = 0; p <= 2; ++p) {
                                    var tempScore = 0;

                                    var array1 = Array(i, j, k, l);
                                    var array2 = Array(m, n, o, p);
                                    for(var a = 0; a < 4; ++a) {
                                        for(var b = 0; b < 4; ++b) {
                                            temp = dots[a][b] + array1[a] + array2[b];
                                            while(temp > 2) { temp -= 3; }
                                            tempScore += temp;
                                        }
                                    }
                                    tempScore -= 16;
                                    moves = i + j + k + l + m + n + o + p;

                                    if((tempScore > bestScore) || (tempScore == bestScore && moves < bestMoves)) {
                                        bestMoves = moves;
                                        bestScore = tempScore;
                                        CC1 = i;
                                        CC2 = j;
                                        CC3 = k;
                                        CC4 = l;
                                        RR1 = m;
                                        RR2 = n;
                                        RR3 = o;
                                        RR4 = p;
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    if(RR1 || oldRR1) { document.getElementById("c1").innerHTML = ((oldRR1 && !RR1)? "" : RR1); }
    if(RR2 || oldRR2) { document.getElementById("c2").innerHTML = ((oldRR2 && !RR2)? "" : RR2); }
    if(RR3 || oldRR3) { document.getElementById("c3").innerHTML = ((oldRR3 && !RR3)? "" : RR3); }
    if(RR4 || oldRR4) { document.getElementById("c4").innerHTML = ((oldRR4 && !RR4)? "" : RR4); }
    if(CC1 || oldCC1) { document.getElementById("r1").innerHTML = ((oldCC1 && !CC1)? "" : CC1); }
    if(CC2 || oldCC2) { document.getElementById("r2").innerHTML = ((oldCC2 && !CC2)? "" : CC2); }
    if(CC3 || oldCC3) { document.getElementById("r3").innerHTML = ((oldCC3 && !CC3)? "" : CC3); }
    if(CC4 || oldCC4) { document.getElementById("r4").innerHTML = ((oldCC4 && !CC4)? "" : CC4); }
    oldRR1 = RR1;
    oldRR2 = RR2;
    oldRR3 = RR3;
    oldRR4 = RR4;
    oldCC1 = CC1;
    oldCC2 = CC2;
    oldCC3 = CC3;
    oldCC4 = CC4;
    solved = true;
    document.getElementById("best_score").innerHTML = bestScore;
}
