var horizondal_line_width = 350;
var vertical_line_height = 370;
var default_number_per_box = 4;
var repeated_at = "";
var compleated = 0; 
var resuelto = 0;
var xy = new Array(9);
for(i=0;i<9;i++) {
	xy[i] = new Array(9);
}

var puzzles = new Array(
"gfbaiecdhacihgdebfehdcfbaigfcaieghbdbehfdacigdgihbcfeaegcdaibhfdfbgheiaciahbcfgde",
"idgheabcfcabfgdihehfecbiadgafcdhbgiebdigeahfcgehficdabcaifbdeghdbhecgaifegfihabcd",
"deafhicbgfihcgbaedgcbaedihfedcighafbghibfaedcbfacdehighaegcdbifibfhaedcgdgcfbieah",
"cdiafebhgehbicgdafafgbhdciefbchidgeagedabchfiiahgefdcbicfeabdghbgecdhfiahdafgiebc",
"heidgbafcbgafhcedifcdeaihgbibegdachfdchiefgabafgcbhidefagechbidhidabgcfebecdifgha",
"eacfhgdbihigbedcafdfbaicghegeahibcfddbigfcehafchedabgiighadfbceadeicbfghcbfhegiad",
"ebaihgfdchcfeadgibgdifcbeahcadheigfbbegcfaidhhifbgdceabgeaihdcfdhifgcabeafcdbeihg",
"gbfdceaihaedbhifcgcihgfabedchbeagfdieafdihgbcidgfbchaebecigdhfaigahfecdbdhfacbegi",
"fdgiabhecaiehgcdfbhbcefdgaiaciehfbgdgdfibacehbehdcgaifcfhdbegiabagfhiecdidecgafhb");

var chosen = 0;
var this_puzzle = "";
var orginal_game = "";

function getIndex(x,y) {
	var index = (x*3) + y - 3;
	return index;
}

function getXY(index) {
	var x=1,y=1;
	switch (index) { 
		case 1: x=1; y=1; break;
		case 2: x=1; y=2; break;
		case 3: x=1; y=3; break;
		case 4: x=2; y=1; break;
		case 5: x=2; y=2; break;
		case 6: x=2; y=3; break;
		case 7: x=3; y=1; break;
		case 8: x=3; y=2; break;
		case 9: x=3; y=3; break;
	}
	var xy_coods = new Array(x,y);
	return xy_coods;
}
function rand() {
	var number = Math.round(Math.random()*10);
	while (number < 1 || number > 9) { 
		number = Math.round(Math.random()*10);
	}
	return number; 
}

function uniqueRand(list) {
	var number = rand();

	for(var a=0;a<list.length;a++) {
		if(list[a] == number) {
			number = rand();
			a=-1;
		}
	}
	return number;
}

function checkForUnique(box,cell,number) {
	if(box>1) {
	var boxes_to_check = new Array(); 
	switch (box) {
		case 2 : boxes_to_check.push(1);break;
		case 3 : boxes_to_check.push(1,2);break;
		case 4 : boxes_to_check.push(1);break;
		case 5 : boxes_to_check.push(2,4);break;
		case 6 : boxes_to_check.push(3,4,5);break;
		case 7 : boxes_to_check.push(1,4);break;
		case 8 : boxes_to_check.push(2,5,7);break;
		case 9 : boxes_to_check.push(3,6,7,8);break;
	}

	var id="", value="";
	for(i=0;i<boxes_to_check.length;i++) {
		xy_coods = getXY(cell);
		for(j=1; j<=3; j++) {
			if(box==2 || box==3 || box==5 || box==6 || box==8 || box==9) { 
				if(box==5 && boxes_to_check[i]==2);
				else if(box==6 && boxes_to_check[i]==3);
				else if(box==8 && (boxes_to_check[i]==2 || boxes_to_check[i]==5));
				else if(box==9 && (boxes_to_check[i]==3 || boxes_to_check[i]==6));
				else {
					cell_to_check = getIndex(xy_coods[0],j);
					id = "c" + boxes_to_check[i] + cell_to_check;
					value = document.getElementById(id).value;

					if(value == number) {
						repeated_at = id;
						return false;
					}
				}
			}

			if(box>=4) {
				if(box==5 && (boxes_to_check[i]==4));
				else if(box==6 && (boxes_to_check[i]==4 || boxes_to_check[i]==5));
				else if(box==8 && boxes_to_check[i]==7);
				else if(box==9 && (boxes_to_check[i]==7 || boxes_to_check[i]==8));
				else {
					cell_to_check = getIndex(j,xy_coods[1]);
					id = "c" + boxes_to_check[i] + cell_to_check; 
					value = document.getElementById(id).value;

					if(value == number) {
						repeated_at = id;
						return false;
					}
				}
			}
		}
	}
	}
	
	for(k=1;k<=9;k++) {
		id = "c" + box + k;
		if(number == document.getElementById(id).value && k != cell) { 
			repeated_at = id;
			return false;
		}
	}

	return true;
}

function insert(id,value) {
	document.getElementById(id).value = value;
	
	if (compleated && document.getElementById(id).readOnly == "") {
	   document.getElementById(id).style.background = '#ffcc00';
	   document.getElementById(id).style.color = '0000cc';
    } else {
        document.getElementById(id).style.background = '#fff';
        document.getElementById(id).style.color = '000';
    }

	if(value) {
		document.getElementById(id).readOnly = "readOnly"; 
	} else {
		document.getElementById(id).readOnly = ""; 
		document.getElementById(id).style.background = '#fff';
        document.getElementById(id).style.color = '000';
	}
}

function clearer() {
	var id = ""
	document.f.reset(); 
	for(var i=1; i<=9; i++) {
		for(var j=1; j<=9; j++) {
			id = "c"+i+j;
			document.getElementById(id).readOnly = "";
			document.getElementById(id).style.background = '#fff';
            document.getElementById(id).style.color = '0000cc';
		}
	}
}
function discolorCells(cell1,cell2) {
	document.getElementById(cell1).style.background = "#fff";
	document.getElementById(cell2).style.background = "#fff";
}

function discolorCell(cell) {
	document.getElementById(cell).style.background = "#fff";
}

function recordPosition() {
	var value=0;
	for(a=0;a<9;a++) {
		for(b=0;b<9;b++) {
			value = document.getElementById("c"+(a+1)+(b+1)).value;
			if(!isNaN(value) && value.length==1) {
				xy[a][b] = value;
			} else {
				xy[a][b] = 0;
			}
		}
	}
}

function str2pos(str) {
	var zero_flag = 0;
	var alpha = "abcdefghijklmnopqrstuvwxyz";
	var pos = 0;
	var a = 0;
	var b = 0;
	str = str.replace(/\./g,"");

	while(a<9) {
		ch = str.charAt(pos);
		id = "c" + (a+1) + (b+1);

		if(!isNaN(ch) && !zero_flag) {
			insert(id,ch);
		} else if(zero_flag) {
			insert(id,"");
			zero_flag--;
		} else {
			insert(id,"");
			zero_flag = alpha.indexOf(ch);
		}

		if(!zero_flag) {
			pos++;
		}

		b++;
		if(b>=9) {
			b=0;
			a++;
		}
	}
}

function checker() {
	var found = 0;
	loop:
	for(a=1;a<=9;a++) {
		for(b=1;b<=9;b++) {
			id = "c"+a+b;
			value = document.getElementById(id).value
			if(isNaN(value) || value > 9 || value < 1) {
				found = 1;

				document.getElementById(id).style.background = "red";
				setTimeout("discolorCells(id,id)",2000);
				alert("No es correcto");
				break loop;
			}
			else if(value) {
				if(!checkForUnique(a,b,value)) {
					document.getElementById(id).style.background = "red";
					document.getElementById(repeated_at).style.background = "red";

					setTimeout("discolorCells(repeated_at,id)",2000);
					found++;
					break loop;
				}
			} else {
				alert("Hay casillas vacías");
				document.getElementById(id).style.background = "red";
				setTimeout("discolorCells(id,id)",2000);				
				found = 1;
				break loop;
			}  
		}
	}
	if(!found) {
		if(compleated) {
			alert("Ya te habías rendido");
		} else
			alert("Felicidades, lo has conseguido");
	}
}

function solve() {
  if (!resuelto) {
        compleated = 1;
		str2pos(this_puzzle);
		resuelto = 1;
  }
}

function makeNewOrder(str) {
	var alpha = " abcdefghijklmnopqrstuvwxyz";
	var new_order = "";

 	numbers = new Array("0");
	for(j=0;j<9;j++) {
		new_numbers = uniqueRand(numbers);
		numbers.push(new_numbers);
	}

	for(i=0;i<str.length;i++) {
		if(str.charAt(i)=="." || str.charAt(i)=="*" || str.charAt(i)=="x" || 
				str.charAt(i)=="_" || str.charAt(i)=="-" || str.charAt(i)=="+") { 
			new_order += "."
		} else {
			new_order += numbers[alpha.indexOf(str.charAt(i))]
		}
	}

	return new_order;	
}

function init(numpercell) {
    if (numpercell > 0)
        default_number_per_box = numpercell;
        
	chosen = Math.floor((Math.random()*10) / (10/puzzles.length));
	chosen = 2
	this_puzzle = makeNewOrder(puzzles[chosen]);
	compleated = 0;
	resuelto = 0;
	clearer();
	
	var id = "niveldificultad";
	if (default_number_per_box == 5)
        document.getElementById(id).value = 'Fácil';
    else if (default_number_per_box == 4)
            document.getElementById(id).value = 'Normal';
    else if (default_number_per_box == 3)
            document.getElementById(id).value = 'Difícil';
    
	var last_box_ended_at = 0;
	var extra_number_count = 0;
	for(var i=0;i<9;i++) {
		var b=0,location_of_fixed_number=0;
		var arr_b = new Array();
		var limit = 9;
		var this_box = "";
		var dot_count = 0;
		for(var j=last_box_ended_at; j<last_box_ended_at+limit; j++) {
			if(this_puzzle.charAt(j) == ".") {
				limit++;
				dot_count++;
			}
			this_box = this_box + this_puzzle.charAt(j);
		}
		last_box_ended_at = last_box_ended_at + limit;
		
		number_of_numbers = default_number_per_box - extra_number_count;
		extra_number_count = 0;
		
		if (dot_count > number_of_numbers) {
			if(rand() > 5) {
				extra_number_count = dot_count - number_of_numbers;
			} 
			number_of_numbers = dot_count;
		}
		

		arr_b = new Array();
		for(b=0;b<number_of_numbers;b++) {
			location_of_fixed_number = this_box.indexOf(".");
			if(location_of_fixed_number + 1) {
				this_box =  this_box.substring(0,location_of_fixed_number) +
							this_box.substring(location_of_fixed_number+1,this_box.length);
			} else { 
				location_of_fixed_number = uniqueRand(arr_b);
				location_of_fixed_number--;
			}
			arr_b.push(location_of_fixed_number+1);
			insertion_number = this_box.charAt(location_of_fixed_number);
			location_of_fixed_number++;
			id = "c" + (i+1) + location_of_fixed_number
			insert(id,insertion_number);
			discolorCell(id);
		}
	}
	
}
