var sudoku=new Array();
var sud_color=new Array();
var assignments=new Array();
var solutions=new Array();
var max_solutions = 100;
for (i=1;i<=9;i++) {
	sudoku[i]=new Array();
	sud_color[i]=new Array();
	assignments[i]=new Array();
	solutions[i]=new Array();
	for (j=1;j<=9;j++) {
		solutions[i][j]=new Array();
	}
}
function possible() {
	c1=(i-1-((i-1)% 3))+1;
	d1=(j-1-((j-1)% 3))+1;
	probable=true;
	c2=c1;
	d2=d1-1;
	m=0;
	do {
		m++;
		if(d2==d1+2) {
			d2=d1;
			c2++;
		} else d2++;
	}
	while((sudoku[c2][d2]!=k)&&(m!=9));
	if(sudoku[c2][d2]==k)probable=false; else {
		c1=0;
		do {
			c1++;
		}
		while((sudoku[i][c1]!=k)&&(sudoku[c1][j]!=k)&&(c1!=9));
		if((sudoku[i][c1]==k)||(sudoku[c1][j]==k))probable=false;
	}
	return probable;
}
function solve_sudoku() {
	for (i=1;i<=9;i++) {
		for (j=1;j<=9;j++) {
			id_str='a'+i+j;
			sudoku[i][j]=((document.getElementById(id_str).value=='')? 0 : parseInt(document.getElementById(id_str).value));
			sud_color[i][j]=((sudoku[i][j]==0)? 0 : 1);
		}
	}
	i=1;
	j=0;
	puzzle=true;
	while((puzzle==true)&&(i+j<18)) {
		do {
			if(j==9) {
				i++;
				j=1;
			} else j++;
		}
		while((sud_color[i][j]==0)&&(i+j!=18));
		if(sud_color[i][j]==1) {
			k=sudoku[i][j];
			sudoku[i][j]=0;
			if(possible())sudoku[i][j]=k; else puzzle=false;
		}
	}
	given=0;
	for (i=1;i<=9;i++) for (j=1;j<=9;j++)given+=sud_color[i][j];
	if((puzzle==true)&&(given<81)) {
		sol_num=0;
		k=0;
		a=1;
		i=1;
		j=0;
		do {
			do {
				if(j==9) {
					i++;
					j=1;
				} else j++;
			}
			while((sudoku[i][j]>0)&&((i!=9)||(j!=9)));
			if(sudoku[i][j]==0) {
				var probable=true;
				if(k<9) {
					do {
						k++;
					}
					while((possible()==false)&&(k<9));
				} else probable=false;
				if((possible())&&(probable==true)) {
					sudoku[i][j]=k;
					assignments[1][a]=i;
					assignments[2][a]=j;
					assignments[3][a]=k;
					a++;
					k=0;
					if((i==9)&&(j==9)) {
						sol_num++;
						document.getElementById("sol_num").value=sol_num;
						for (m=1;m<=9;m++) {
							for (n=1;n<=9;n++) {
								id_str='a'+m+n;
								document.getElementById(id_str).value=sudoku[m][n];
								solutions[m][n][sol_num]=sudoku[m][n];
							}
						}
						a--;
						j=8;
						sudoku[9][9]=0;
						k=9;
					}
				} else {
					if(a==1)puzzle=false; else {
						a--;
						if(assignments[2][a]==1) {
							j=9;
							i=assignments[1][a]-1;
						} else {
							j=assignments[2][a]-1;
							i=assignments[1][a];
						}
						sudoku[assignments[1][a]][assignments[2][a]]=0;
						k=assignments[3][a];
					}
				}
			} else {
				sol_num++;
				document.getElementById("sol_num").value=sol_num;
				for (m=1;m<=9;m++) {
					for (n=1;n<=9;n++) {
						id_str='a'+m+n;
						document.getElementById(id_str).value=sudoku[m][n];
						solutions[m][n][sol_num]=sudoku[m][n];
					}
				}
				a--;
				j=8;
				sudoku[9][9]=0;
				k=9;
			}
		}
		while((puzzle==true)&&(sol_num<(max_solutions + 1)));
		document.getElementById("sol_num").value=(sol_num==(max_solutions + 1))? max_solutions:sol_num;
		if(sol_num==0)alert(lang_no_solutions); else print('first');
		if(sol_num==(max_solutions + 1))alert(lang_more_solutions_than_max_1 + max_solutions + lang_more_solutions_than_max_2);
	} else if(given<81) {
		alert(lang_mistyped);
		document.getElementById("sol_act").value=0;
		document.getElementById("sol_num").value=0;
	} else if(puzzle==true) {
		alert(lang_already_solved);
	} else {
		alert(lang_wrong_sudoku);
		document.getElementById("sol_act").value=0;
		document.getElementById("sol_num").value=0;
	}
}
function clean() {
	for (i=1;i<=9;i++) {
		for (j=1;j<=9;j++) {
			id_str='a'+i+j;
			document.getElementById(id_str).value='';
		}
	}
	document.getElementById("sol_num").value="0";
	document.getElementById("sol_act").value="0";
	sol_num=0;
}
function print(direction) {
	switch (direction) {
		case "first":place=(sol_num==0)? 0:1;
		break;
		case "previous" :if (place>1) place--;
		break;
		case "next":if (place<(sol_num-1)) place++;
		break;
		case "last":place=(sol_num==(max_solutions + 1))? max_solutions:sol_num;
		break;
	}
	if (sol_num>0) {
		for (m=1;m<=9;m++) {
			for (n=1;n<=9;n++) {
				id_str='a'+m+n;
				document.getElementById(id_str).value=solutions[m][n][place];
			}
		}
	}
	document.getElementById("sol_act").value=place;
}