words = [];

ROWS=4;
COLS=4;
currRotationMatrix = new Array();
highlights = new Array();
showBoard = false;

function isNeighbor(orig, neighbor) {
  var orig_col = orig % COLS;
  var orig_row = (orig - orig_col) / COLS;
  for (var deltar = -1; deltar < 2; deltar++) {
    for (var deltac = -1; deltac < 2; deltac++) {
      if (deltar == 0 && deltac == 0) continue;
      var rnew = orig_row + deltar;
      var cnew = orig_col + deltac;
      var index = rnew * COLS + cnew;
      if (rnew >= 0 && rnew < ROWS && cnew >= 0 && cnew < COLS &&
          index == neighbor) {
        return true;
      }
    }
  }
  return false;
}


function initRotationMatrix() {
    for (var r = 0; r < ROWS; r++) {
        for (var c = 0; c < COLS; c++) {
            currRotationMatrix[r * COLS + c] = r * COLS + c;
        }
    }
}

function initHighlights() {
    for (var i = 0; i < ROWS; i++) {
        for (var j = 0; j < COLS; j++) {
            highlights[i * COLS + j] = 0;
        }
    }
}

initHighlights();
initRotationMatrix();

function __findWord(r, c, word, path, board) {
    if (word.length == 0) return true;
    for (var deltar = -1; deltar < 2; deltar++) {
        for (var deltac = -1; deltac < 2; deltac++) {
            var rnew = r + deltar;
            var cnew = c + deltac;
            var valid = true;
            for (var i = 0; i < path.length; i++) {
                if (path[i] == rnew * COLS + cnew) {
                    valid = false;
                    break;
                }
            }
            if (valid &&
                rnew >= 0 && rnew < ROWS && cnew >= 0 && cnew < COLS) {
                if (word.charAt(0) == board.charAt(rnew * COLS + cnew)) {
                    path.push(rnew * COLS + cnew);
                    if (__findWord(rnew, cnew, word.substring(1), path, board))
                        return true;
                    path.pop();
                }
            }
        }
    }
    return false;
}

function findWord(word) {
    if (word.length == 0) return new Array();
    
    var myboard = lower_case_board.replace('qu', 'Q');
    var myword = word.replace('qu', 'Q');

    var path = new Array();
    for (var r = 0; r < ROWS; r++) {
        for (var c = 0; c < COLS; c++) {
            if (myword.charAt(0) == myboard.charAt(r * COLS + c)) {
                path.push(r * COLS + c);
                if (__findWord(r, c, myword.substring(1), path, myboard))
                    return path;
                path.pop();
            }
        }
    }
    return path;
}

function existsOnBoard(word) {
    path = findWord(word);
    if (word.indexOf('qu') != -1)
        return (path.length == word.length - 1);
    return (path.length == word.length);
}

function updateHighlights() {
  for(var i = 0; i < ROWS; i++) {
    for(var j = 0; j < COLS; j++) {
      var idx = currRotationMatrix[i * COLS + j];
      if(highlights[idx] == 1)
        $('#board_id_' + idx).attr("class", "tile highlighted");
      else
        $('#board_id_' + idx).attr("class", "tile regular");
    }
  }
}

function setWordHighlight(word) {
    initHighlights();
    var path = findWord(word);
    for (var i = 0; i < path.length; i++) {
        highlights[path[i]] = 1;
    }
    updateHighlights();
}

function unsetWordHighlight() {
    initHighlights();
    updateHighlights();
}