var curX = 0, curY = 0;
function checkAll(x,y)
{
curX = x;
curY = y;
var isError = checkAllErrors();
if (isError)
{
	// ошибка
	var panel = document.getElementById("ctl00_ContentPlaceHolderMain_toppanel");
	panel.innerHTML = '';
}
else
{
	var filled_count = getFilledCount();
	//confirm( filled_count);
	if (filled_count<81)
	{
	
	}
	else
	{
	//решили!	
	var panel = document.getElementById("ctl00_ContentPlaceHolderMain_toppanel");
	panel.innerHTML = '';
	var otext = document.createElement("div");	
	otext.className='TopMsg';
	otext.innerHTML = SolvedMsg;
	
	panel.appendChild(otext);
	//obj.visible = true;
	}
}
return false;
}

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) {
obj = document.getElementById("ctl00_ContentPlaceHolderMain_" + (y)+"_" + (x));
//obj  - textbox или tablecell
    return getValue2(obj);
}

function getTextBoxValue(x,y)
{
obj = document.getElementById("ctl00_ContentPlaceHolderMain_" + (y)+"_" + (x));
if (obj != null)
        return obj.value;
    return "";
}
function getValue2(obj) {
    if (obj != null)
		if (obj.value !=undefined)
			return obj.value;
		else
			return obj.innerHTML;
			
    return "";
}

function setValue(obj, value) {
    if (obj != null)
        obj.innerHTML = value;
}

// возвращает объект по координатам
function getObject(x, y) {
    var name = "ctl00_ContentPlaceHolderMain_" + (y)+"_"+ (x);
    var obj = document.getElementById(name);
    //	obj = document.all(name);
    return obj;
}

// выполняет проверку всех клеток
function checkAllErrors() {
    var i, j;
	var isError = false;
    for (i = 0; i < 9; i++)
        for (j = 0; j < 9; j++)
        isError = checkCell(i, j) || isError;
	return isError;
}
// проверяет одну клетку
function checkCell(x, y) {
//TMP!
//curX = x;
//curY = 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 = 'cur_input_Error';
			checkObj.parentNode.className = 'cur_input_Error';
		}
        else
            if (checkObj.className == 'Sudoku_cell' || checkObj.className == 'Sudoku_cell_Error')
				checkObj.className = 'Sudoku_cell_Error';
			else
			{
				checkObj.className = 'cell_input_Error';
				checkObj.parentNode.className = 'cell_input_Error';
			}
    }
    else {
        if (curX == x && curY == y)
		{
            checkObj.className = 'cur_input';
			checkObj.parentNode.className = 'Sudoku_cell';
		}
        else
            if (checkObj.className == 'Sudoku_cell' || checkObj.className == 'Sudoku_cell_Error')			
            checkObj.className = 'Sudoku_cell';
        else
		{
            checkObj.className = 'cell_input';
			checkObj.parentNode.className = 'Sudoku_cell';
		}
    }
	return isError;
}

// проверяет клетку в строке
function checkRow(x, y, checkValue, checkObj) {
    var i, j;

    var isError = false;
    for (i = 0; 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 = 0; 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(0, 0, 0, 3, 3, 3, 6, 6, 6);
    var i1 = sq[x];
    var j1 = sq[y];

    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 getFilledCount()
{
	var i, j;
	var count = 0;
    for (i = 0; i < 9; i++)
        for (j = 0; j < 9; j++)
			if (getValue(i,j)!="")
			count++;
	return count;
}
// восстанавливает решение из строки
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 "";
}

function makeTip(x,y,value)
{
 var obj = document.getElementById('ctl00_ContentPlaceHolderMain_'+(y)+'_'+(x) );
 obj.value = value;
 checkAll(x,y);
return false;
}

function CheckNumeric(e)
{
	//var key = e ? e.which : window.event.keyCode;
	var key=e.which;
  //var key = window.event.keyCode; 
  //if (key <48 || key >57) 
    //window.event.returnValue = false; 
	//e.returnValue = false;
	return ((key >=48 && key <=57) ||(key==46) || (key==8) || (key==37) || (key==39) );
}
