var curX = 0, curY = 0;

function selectCell(i, j) {
    var obj = getObject(curX, curY);
    if (obj != null) {
        if (obj.className == 'i2Error')
            obj.className = 'i1Error';
        else
            obj.className = 'i1';
    }

    obj = getObject(i, j);
    if (obj != null) {
        if (obj.className == 'i1Error')
            obj.className = 'i2Error';
        else
            obj.className = 'i2';
    }
    curX = i;
    curY = j;
}

function setNum(n) {
    var obj = getObject(curX, curY);
    if (obj != null) {
        setValue(obj, n);
        checkAllErrors();
    }
}

function getValue(x, y) {
    return getValue2(document.getElementById("c" + (x) + (y)));
}

function getValue2(obj) {
    if (obj != null)
        return obj.innerHTML;
    return "";
}

function setValue(obj, value) {
    if (obj != null)
        obj.innerHTML = value;
}

// возвращает объект по координатам
function getObject(x, y) {
    var name = "c" + (x) + (y);
    var obj = document.getElementById(name);
    //	obj = document.all(name);
    return obj;
}

// выполняет проверку всех клеток
function checkAllErrors() {
    var i, j;
    for (i = 1; i <= 9; i++)
        for (j = 1; j <= 9; j++)
        checkCell(i, j);
}

// выполняет проверку одной клетки
function checkErrors(x, y) {
    var i, j;
    for (i = 1; i <= 9; i++)
        for (j = 1; j <= 9; j++)
        checkCell(i, j);
}

// проверяет одну клетку
function checkCell(x, y) {
    var isError = false;

    var checkValue = getValue(x, y);
    var checkObj = getObject(x, y);

    if (checkValue != "") {
        isError = isError || checkRow(x, y, checkValue, checkObj);
        isError = isError || checkCol(x, y, checkValue, checkObj);
        isError = isError || checkSquare(x, y, checkValue, checkObj);
    }
    if (isError) {
        if (curX == x && curY == y)
            checkObj.className = 'i2Error';
        else
            if (checkObj.className == 'i3' || checkObj.className == 'i3Error')
            checkObj.className = 'i3Error';
        else
            checkObj.className = 'i1Error';
    }
    else {
        if (curX == x && curY == y)
            checkObj.className = 'i2';
        else
            if (checkObj.className == 'i3' || checkObj.className == 'i3Error')
            checkObj.className = 'i3';
        else
            checkObj.className = 'i1';
    }
}

// проверяет клетку в строке
function checkRow(x, y, checkValue, checkObj) {
    var i, j;

    var isError = false;
    for (i = 1; i <= 9; i++) {
        if (i == x) continue; // не сравнивать с проверяемой клеткой
        var value = getValue(i, y);
        if (value == checkValue) {
            isError = true;
            break;
        }
    }
    return isError;
}

// проверяет клетку в столбце
function checkCol(x, y, checkValue, checkObj) {
    var i, j;

    var isError = false;
    for (j = 1; j <= 9; j++) {
        if (j == y) continue; // не сравнивать с проверяемой клеткой
        var value = getValue(x, j);
        if (value == checkValue) {
            isError = true;
            break;
        }
    }
    return isError;
}

// проверяет клетку в квадрате
function checkSquare(x, y, checkValue, checkObj) {
    var i, j;
    var sq = Array(1, 1, 1, 4, 4, 4, 7, 7, 7);
    var i1 = sq[x - 1];
    var j1 = sq[y - 1];

    var isError = false;
    for (i = i1; i <= i1 + 2 && !isError; i++)
        for (j = j1; j <= j1 + 2; j++) {
        if (i == x && j == y) continue; // не сравнивать с проверяемой клеткой
        var value = getValue(i, j);
        if (value == checkValue) {
            isError = true;
            break;
        }
    }
    return isError;
}

// восстанавливает решение из строки
function restore(s) {
    if (s.length <= 0) return;

    for (var y = 1; y <= 9; y++) {
        for (var x = 1; x <= 9; x++) {
            var obj = getObject(x, y);
            if (obj != null && obj.className.indexOf("i3") < 0) {
                var n = "";
                var i = (y - 1) * 9 + (x - 1);
                if (i < s.length)
                    n = s.substr(i, 1);
                if (n == "_")
                    n = "";
                setValue(obj, n);
            }
        }
    }
    checkAllErrors();
}

// сохраняет текущее значение в строку
function save() {
    var s = "";
    for (var y = 1; y <= 9; y++) {
        for (var x = 1; x <= 9; x++) {
            var obj = getObject(x, y);
            if (obj != null) {
                var value = getValue2(obj);
                if (value != "")
                    s = s + value;
                else
                    s = s + "_";
            }
            else
                s = s + "_";
        }
    }
    return s;
}

function clear() {
    for (var y = 1; y <= 9; y++) {
        for (var x = 1; x <= 9; x++) {
            var obj = getObject(x, y);
            if (obj.className.indexOf("i3") < 0)
                setValue(obj, "");
        }
    }
    checkAllErrors();
}

function setCookie(name, value) {
    var D = new Date(); D.setDate(D.getDate() + 1000);
    document.cookie = name + "=" + value + "; expires=" + D.toGMTString();
    // document.cookie = name + "=" + escape(value) + "; expires=" + D.toGMTString();
}

function deleteCookie(name) {
    var D = new Date(); D.setDate(D.getDate() - 1000);
    document.cookie = name + "= ; expires=" + D.toGMTString();
}

function getCookieVal(offset) {
    var endstr = document.cookie.indexOf(";", offset);
    if (endstr == -1)
        endstr = document.cookie.length;
    // return document.cookie.substring(offset, endstr);
    return unescape(document.cookie.substring(offset, endstr));
}

function getCookie(name) {
    var arg = name + "=";
    var alen = arg.length;
    var clen = document.cookie.length;
    var i = 0;
    while (i < clen) {
        var j = i + alen;
        if (document.cookie.substring(i, j) == arg)
            return getCookieVal(j);
        i = document.cookie.indexOf(" ", i) + 1;
        if (i == 0)
            break;
    }
    return "";
}
