var ArrayWidth = 9;
var ArrayHeight = 9;
var DigitArray = [];

function Clear()
{
	for(var i = 0; i < ArrayWidth * ArrayHeight; i++)
		DigitArray[i] = 0;
}
	
function SetDigit(digit, x, y)
{
	if((x >= ArrayWidth) || (y >= ArrayHeight))
		return;
	var i = y * ArrayWidth + x;
	DigitArray[i] = digit;
}

function GetDigit(x, y)
{
	if((x >= ArrayWidth) || (y >= ArrayHeight))
		return 0;
	var i = y * ArrayWidth + x;
	return DigitArray[i];
}

function Check(zch)
{
	var x, y, v;
	
	if(zch == true)
	{
		for(var y = 0; y < 9; y++)
		{
			for(x = 0; x < 9; x++)
			{
				if(GetDigit(x,y) == 0) return 2;
			}
		}
	}

	//Check rows
	var f1 = false;
	var f2 = false;
	var f3 = false;
	var f4 = false;
	var f5 = false;
	var f6 = false;
	var f7 = false;
	var f8 = false;
	var f9 = false;
	for(y = 0; y < ArrayHeight; y++)
	{
		f1 = false;
		f2 = false;
		f3 = false;
		f4 = false;
		f5 = false;
		f6 = false;
		f7 = false;
		f8 = false;
		f9 = false;
		for(x = 0; x < ArrayWidth; x++)
		{
			v = GetDigit(x,y);
			if(v == 1) { if (f1 == true) return 1; else f1 = true; }
			if(v == 2) { if (f2 == true) return 1; else f2 = true; }
			if(v == 3) { if (f3 == true) return 1; else f3 = true; }
			if(v == 4) { if (f4 == true) return 1; else f4 = true; }
			if(v == 5) { if (f5 == true) return 1; else f5 = true; }
			if(v == 6) { if (f6 == true) return 1; else f6 = true; }
			if(v == 7) { if (f7 == true) return 1; else f7 = true; }
			if(v == 8) { if (f8 == true) return 1; else f8 = true; }
			if(v == 9) { if (f9 == true) return 1; else f9 = true; }
		}
	}
	//Check rows
	
	//Check columns
	for(x = 0; x < ArrayWidth; x++)
	{
		f1 = false;
		f2 = false;
		f3 = false;
		f4 = false;
		f5 = false;
		f6 = false;
		f7 = false;
		f8 = false;
		f9 = false;
		for(y = 0; y < ArrayHeight; y++)
		{
			v = GetDigit(x,y);
			if(v == 1) { if (f1 == true) return 1; else f1 = true; }
			if(v == 2) { if (f2 == true) return 1; else f2 = true; }
			if(v == 3) { if (f3 == true) return 1; else f3 = true; }
			if(v == 4) { if (f4 == true) return 1; else f4 = true; }
			if(v == 5) { if (f5 == true) return 1; else f5 = true; }
			if(v == 6) { if (f6 == true) return 1; else f6 = true; }
			if(v == 7) { if (f7 == true) return 1; else f7 = true; }
			if(v == 8) { if (f8 == true) return 1; else f8 = true; }
			if(v == 9) { if (f9 == true) return 1; else f9 = true; }
		}
	}
	//Check columns
	
	//Check sells (1)
	f1 = false;
	f2 = false;
	f3 = false;
	f4 = false;
	f5 = false;
	f6 = false;
	f7 = false;
	f8 = false;
	f9 = false;
	for(y = 0; y < 3; y++)
	{
		for(x = 0; x < 3; x++)
		{
			v = GetDigit(x,y);
			if(v == 1) { if (f1 == true) return 1; else f1 = true; }
			if(v == 2) { if (f2 == true) return 1; else f2 = true; }
			if(v == 3) { if (f3 == true) return 1; else f3 = true; }
			if(v == 4) { if (f4 == true) return 1; else f4 = true; }
			if(v == 5) { if (f5 == true) return 1; else f5 = true; }
			if(v == 6) { if (f6 == true) return 1; else f6 = true; }
			if(v == 7) { if (f7 == true) return 1; else f7 = true; }
			if(v == 8) { if (f8 == true) return 1; else f8 = true; }
			if(v == 9) { if (f9 == true) return 1; else f9 = true; }
		}
	}
	//Check sells (1)
	
	//Check sells (2)
	f1 = false;
	f2 = false;
	f3 = false;
	f4 = false;
	f5 = false;
	f6 = false;
	f7 = false;
	f8 = false;
	f9 = false;
	for(y = 0; y < 3; y++)
	{
		for(x = 3; x < 6; x++)
		{
			v = GetDigit(x,y);
			if(v == 1) { if (f1 == true) return 1; else f1 = true; }
			if(v == 2) { if (f2 == true) return 1; else f2 = true; }
			if(v == 3) { if (f3 == true) return 1; else f3 = true; }
			if(v == 4) { if (f4 == true) return 1; else f4 = true; }
			if(v == 5) { if (f5 == true) return 1; else f5 = true; }
			if(v == 6) { if (f6 == true) return 1; else f6 = true; }
			if(v == 7) { if (f7 == true) return 1; else f7 = true; }
			if(v == 8) { if (f8 == true) return 1; else f8 = true; }
			if(v == 9) { if (f9 == true) return 1; else f9 = true; }
		}
	}
	//Check sells (2)

	//Check sells (3)
	f1 = false;
	f2 = false;
	f3 = false;
	f4 = false;
	f5 = false;
	f6 = false;
	f7 = false;
	f8 = false;
	f9 = false;
	for(y = 0; y < 3; y++)
	{
		for(x = 6; x < 9; x++)
		{
			v = GetDigit(x,y);
			if(v == 1) { if (f1 == true) return 1; else f1 = true; }
			if(v == 2) { if (f2 == true) return 1; else f2 = true; }
			if(v == 3) { if (f3 == true) return 1; else f3 = true; }
			if(v == 4) { if (f4 == true) return 1; else f4 = true; }
			if(v == 5) { if (f5 == true) return 1; else f5 = true; }
			if(v == 6) { if (f6 == true) return 1; else f6 = true; }
			if(v == 7) { if (f7 == true) return 1; else f7 = true; }
			if(v == 8) { if (f8 == true) return 1; else f8 = true; }
			if(v == 9) { if (f9 == true) return 1; else f9 = true; }
		}
	}
	//Check sells (3)

	//Check sells (4)
	f1 = false;
	f2 = false;
	f3 = false;
	f4 = false;
	f5 = false;
	f6 = false;
	f7 = false;
	f8 = false;
	f9 = false;
	for(y = 3; y < 6; y++)
	{
		for(x = 0; x < 3; x++)
		{
			v = GetDigit(x,y);
			if(v == 1) { if (f1 == true) return 1; else f1 = true; }
			if(v == 2) { if (f2 == true) return 1; else f2 = true; }
			if(v == 3) { if (f3 == true) return 1; else f3 = true; }
			if(v == 4) { if (f4 == true) return 1; else f4 = true; }
			if(v == 5) { if (f5 == true) return 1; else f5 = true; }
			if(v == 6) { if (f6 == true) return 1; else f6 = true; }
			if(v == 7) { if (f7 == true) return 1; else f7 = true; }
			if(v == 8) { if (f8 == true) return 1; else f8 = true; }
			if(v == 9) { if (f9 == true) return 1; else f9 = true; }
		}
	}
	//Check sells (4)

	//Check sells (5)
	f1 = false;
	f2 = false;
	f3 = false;
	f4 = false;
	f5 = false;
	f6 = false;
	f7 = false;
	f8 = false;
	f9 = false;
	for(y = 3; y < 6; y++)
	{
		for(x = 3; x < 9; x++)
		{
			v = GetDigit(x,y);
			if(v == 1) { if (f1 == true) return 1; else f1 = true; }
			if(v == 2) { if (f2 == true) return 1; else f2 = true; }
			if(v == 3) { if (f3 == true) return 1; else f3 = true; }
			if(v == 4) { if (f4 == true) return 1; else f4 = true; }
			if(v == 5) { if (f5 == true) return 1; else f5 = true; }
			if(v == 6) { if (f6 == true) return 1; else f6 = true; }
			if(v == 7) { if (f7 == true) return 1; else f7 = true; }
			if(v == 8) { if (f8 == true) return 1; else f8 = true; }
			if(v == 9) { if (f9 == true) return 1; else f9 = true; }
		}
	}
	//Check sells (5)

	//Check sells (6)
	f1 = false;
	f2 = false;
	f3 = false;
	f4 = false;
	f5 = false;
	f6 = false;
	f7 = false;
	f8 = false;
	f9 = false;
	for(y = 3; y < 6; y++)
	{
		for(x = 6; x < 9; x++)
		{
			v = GetDigit(x,y);
			if(v == 1) { if (f1 == true) return 1; else f1 = true; }
			if(v == 2) { if (f2 == true) return 1; else f2 = true; }
			if(v == 3) { if (f3 == true) return 1; else f3 = true; }
			if(v == 4) { if (f4 == true) return 1; else f4 = true; }
			if(v == 5) { if (f5 == true) return 1; else f5 = true; }
			if(v == 6) { if (f6 == true) return 1; else f6 = true; }
			if(v == 7) { if (f7 == true) return 1; else f7 = true; }
			if(v == 8) { if (f8 == true) return 1; else f8 = true; }
			if(v == 9) { if (f9 == true) return 1; else f9 = true; }
		}
	}
	//Check sells (6)

	//Check sells (7)
	f1 = false;
	f2 = false;
	f3 = false;
	f4 = false;
	f5 = false;
	f6 = false;
	f7 = false;
	f8 = false;
	f9 = false;
	for(y = 6; y < 9; y++)
	{
		for(x = 0; x < 3; x++)
		{
			v = GetDigit(x,y);
			if(v == 1) { if (f1 == true) return 1; else f1 = true; }
			if(v == 2) { if (f2 == true) return 1; else f2 = true; }
			if(v == 3) { if (f3 == true) return 1; else f3 = true; }
			if(v == 4) { if (f4 == true) return 1; else f4 = true; }
			if(v == 5) { if (f5 == true) return 1; else f5 = true; }
			if(v == 6) { if (f6 == true) return 1; else f6 = true; }
			if(v == 7) { if (f7 == true) return 1; else f7 = true; }
			if(v == 8) { if (f8 == true) return 1; else f8 = true; }
			if(v == 9) { if (f9 == true) return 1; else f9 = true; }
		}
	}
	//Check sells (7)

	//Check sells (8)
	f1 = false;
	f2 = false;
	f3 = false;
	f4 = false;
	f5 = false;
	f6 = false;
	f7 = false;
	f8 = false;
	f9 = false;
	for(y = 6; y < 9; y++)
	{
		for(x = 3; x < 6; x++)
		{
			v = GetDigit(x,y);
			if(v == 1) { if (f1 == true) return 1; else f1 = true; }
			if(v == 2) { if (f2 == true) return 1; else f2 = true; }
			if(v == 3) { if (f3 == true) return 1; else f3 = true; }
			if(v == 4) { if (f4 == true) return 1; else f4 = true; }
			if(v == 5) { if (f5 == true) return 1; else f5 = true; }
			if(v == 6) { if (f6 == true) return 1; else f6 = true; }
			if(v == 7) { if (f7 == true) return 1; else f7 = true; }
			if(v == 8) { if (f8 == true) return 1; else f8 = true; }
			if(v == 9) { if (f9 == true) return 1; else f9 = true; }
		}
	}
	//Check sells (8)

	//Check sells (9)
	f1 = false;
	f2 = false;
	f3 = false;
	f4 = false;
	f5 = false;
	f6 = false;
	f7 = false;
	f8 = false;
	f9 = false;
	for(y = 6; y < 9; y++)
	{
		for(x = 6; x < 9; x++)
		{
			v = GetDigit(x,y);
			if(v == 1) { if (f1 == true) return 1; else f1 = true; }
			if(v == 2) { if (f2 == true) return 1; else f2 = true; }
			if(v == 3) { if (f3 == true) return 1; else f3 = true; }
			if(v == 4) { if (f4 == true) return 1; else f4 = true; }
			if(v == 5) { if (f5 == true) return 1; else f5 = true; }
			if(v == 6) { if (f6 == true) return 1; else f6 = true; }
			if(v == 7) { if (f7 == true) return 1; else f7 = true; }
			if(v == 8) { if (f8 == true) return 1; else f8 = true; }
			if(v == 9) { if (f9 == true) return 1; else f9 = true; }
		}
	}
	//Check sells (9)

	return 0;
}

function GenerateRandomDigit()
{
	var v = Math.floor(Math.random() * 9);
	if(v <= 0)
		v = 1;
	if(v >= 9)
		v = 9;
	return v;
}

function Generate(level)
{
	Clear();
	
	for(var Yb = 0; Yb < 3; Yb++)
	{
		for(var Xb = 0; Xb < 3; Xb++)
		{
			var i = 0;
			for(;;)
			{
				i++;
				var p = GenerateRandomDigit()-1;

				var y = Math.floor(p/3);
				var x = p - y * 3;

				var xs = Xb*3+x;
				var ys = Yb*3+y;

				if(GetDigit(xs, ys) != 0)
				{
					i--;
					continue;
				}

				var v = GenerateRandomDigit();
				SetDigit(v, xs, ys);

				var ch = Check(false);
				if(ch == 1)
				{
					i--;
					SetDigit(0, xs, ys);
				}
				
				if(i >= level)
					break;
			}			
		}
	}
}
