var arr_sudo_index;var arr_sudo_solutions;var arr_sudo_input_fields;var arr_sudo_columns;var arr_sudo_rows;var arr_sudo_regions;var arr_sudo_elimated_columns;var arr_sudo_elimated_rows;var arr_sudo_elimated_regions;var i_sudo_size;var i_sudo_field_no;var obj_sudo_placeholder;var bol_sudo_show_info=true;var bol_sudo_test_input=true;var i_sudo_field_cnt;function sudo_init(i_size){obj_sudo_placeholder=document.getElementById('sudo_gameplate')
i_sudo_size=i_size;i_sudo_field_no=Math.pow(i_sudo_size,4);arr_sudo_solutions=sudo_init_solution_array();sudo_init_html();sudo_init_arrays();sudo_reset_solutions();}
function sudo_element(){if(parent.window.document.getElementById('sudoku')){parent.window.document.getElementById('sudoku').height=450;parent.window.document.getElementById('sudoku').width=400;}}
function sudo_init_arrays(){arr_sudo_index=new Array();arr_sudo_columns=new Array();arr_sudo_rows=new Array();arr_sudo_regions=new Array();for(i=0;i<i_sudo_field_no;i++){column_index=i%(i_sudo_size*i_sudo_size);row_index=Math.floor(i/(i_sudo_size*i_sudo_size));region_index=(Math.floor(row_index/i_sudo_size))*i_sudo_size+Math.floor(column_index/i_sudo_size);arr_sudo_index[i]=Array(column_index,row_index,region_index);if(typeof(arr_sudo_columns[column_index])!='object')arr_sudo_columns[column_index]=new Array();if(typeof(arr_sudo_rows[row_index])!='object')arr_sudo_rows[row_index]=new Array();if(typeof(arr_sudo_regions[region_index])!='object')arr_sudo_regions[region_index]=new Array();arr_sudo_columns[column_index][arr_sudo_columns[column_index].length]=i;arr_sudo_rows[row_index][arr_sudo_rows[row_index].length]=i;arr_sudo_regions[region_index][arr_sudo_regions[region_index].length]=i;}}
function sudo_init_html(){str_html='<form><table cellpadding="0" cellspacing="0" class="sudotable" border="0"><form id="sudo_form">';for(i=0;i<i_sudo_size*i_sudo_size;i++){if(i>0&&i%i_sudo_size==0){str_html+='<tr><td colspan="'+(i_sudo_size*i_sudo_size+i_sudo_size-1)+'" class="hsep"></td></tr>'}
str_html+='<tr>';for(row=0;row<i_sudo_size*i_sudo_size;row++){if(row>0&&row%i_sudo_size==0){str_html+='<td class="vsep"></td>'}
i_field_index=i*i_sudo_size*i_sudo_size+row;str_html+='<td><input type="text" class="sudo_field"'+' onkeydown="old_val = this.value"'+' onkeyup="sudo_input_change(true, '+i_field_index+', this.value)"'+' onfocus="sudo_field_hightlight('+i_field_index+')"'+' onblur="sudo_field_blur('+i_field_index+')"'+' /></td>';}
str_html+='</tr>';}
str_html+='</table></form>';obj_sudo_placeholder.innerHTML=str_html;arr_sudo_input_fields=obj_sudo_placeholder.getElementsByTagName('input');}
function sudo_init_solution_array(){var arr_fields=new Array(i_sudo_field_no);for(var i=0;i<i_sudo_field_no;i++){var arr_solutions=new Array();for(a=0;a<i_sudo_size*i_sudo_size;a++){arr_solutions[a]=a;}
arr_fields[i]=[arr_solutions,false];}
return arr_fields;}
function sudo_create(i_filled_fields_fac){if(i_sudo_size>3&&!confirm('You will need a 10 GHz Pentium 12 or a lot of luck with random numbers to succeed this. We are very sorry, but this version of SuDoKu has a way too slow algorithm to create games of this size.\n\nReally continue?')){return;}
setTimeout('sudo_create_do('+i_filled_fields_fac+')',100);}
function sudo_create_do(i_filled_fields_fac){var bol_game_solvable=false;var i_filled_fields=Math.pow(i_sudo_size,3)+Math.round(i_sudo_size*i_filled_fields_fac/10);var i_min_filled_fields=1;while(!bol_game_solvable){sudo_init_arrays();arr_sudo_solutions=sudo_init_solution_array();var i_cnt=0;var arr_empty_fields=new Array(i_sudo_field_no);var arr_filled_fields=new Array();for(i=0,i_length=arr_empty_fields.length;i<i_length;i++)arr_empty_fields[i]=i;while(i_cnt<i_min_filled_fields&&sudo_eliminate(true)){i_rnd_field_index=sudo_random(0,arr_empty_fields.length);i_field_index=arr_empty_fields[i_rnd_field_index];i_rnd_number_solu_index=sudo_random(0,arr_sudo_solutions[i_field_index][0].length-1);i_rnd_number_put_in_field=arr_sudo_solutions[i_field_index][0][i_rnd_number_solu_index];arr_sudo_solutions[i_field_index][0]=[i_rnd_number_put_in_field];arr_filled_fields[arr_filled_fields.length]=i_field_index;arr_empty_fields=sudo_array_delete(arr_empty_fields,i_rnd_field_index);sudo_eliminate_solution(i_field_index,i_rnd_number_put_in_field,true);i_cnt++;if(i_cnt==i_min_filled_fields&&!(bol_game_solvable=sudo_solve(true,true)))i_min_filled_fields++;}}
var arr_filled_fields_new=arr_filled_fields;var i_filled_cnt=0;var bol_donttesttherest=false;for(var i=0,i_length=arr_filled_fields.length;i<i_length;i++){if(arr_filled_fields_new.length<=i_filled_fields){bol_donttesttherest=true;}
var arr_old=arr_sudo_solutions;var arr_filled_fields_old=arr_filled_fields_new;if(!bol_donttesttherest){arr_filled_fields_new=sudo_array_delete_value(arr_filled_fields_new,arr_filled_fields[i]);arr_sudo_solutions=sudo_init_solution_array();for(var a=0,a_length=arr_filled_fields_new.length;a<a_length;a++){arr_sudo_solutions[arr_filled_fields_new[a]][0]=arr_old[arr_filled_fields_new[a]][0];sudo_eliminate_solution(arr_filled_fields_new[a],arr_old[arr_filled_fields_new[a]][0][0],true);}}
if(bol_donttesttherest||!sudo_solve(true)){arr_sudo_solutions=arr_old;arr_filled_fields_new=arr_filled_fields_old;arr_sudo_input_fields[arr_filled_fields[i]].value=sudo_translate_input(arr_sudo_solutions[arr_filled_fields[i]][0][0],true);arr_sudo_input_fields[arr_filled_fields[i]].disabled=true;arr_sudo_input_fields[arr_filled_fields[i]].style.color="#0000d5";}}
arr_sudo_solutions=sudo_init_solution_array();sudo_eliminate_human(true);sudo_status('Kész!');}
function sudo_array_delete(arr_perfom_in,i_member){var arr_return=new Array();for(i=0,i_length=arr_perfom_in.length;i<i_length;i++){if(i!=i_member)arr_return[arr_return.length]=arr_perfom_in[i];}
return arr_return;}
function sudo_array_delete_value(arr_perfom_in,i_value){var arr_return=new Array();for(i=0,i_length=arr_perfom_in.length;i<i_length;i++){if(arr_perfom_in[i]!=i_value)arr_return[arr_return.length]=arr_perfom_in[i];}
return arr_return;}
function sudo_random(i_from,i_to){return Math.floor(Math.random()*(i_from-i_to+1)+i_to);}
function sudo_reset_solutions(){if(arguments.length==0){for(i=0;i<i_sudo_field_no;i++){i_input_val=arr_sudo_input_fields[i].value;if(i_input_val!=''){arr_sudo_solutions[i][0]=[sudo_translate_input(i_input_val,false)];}}}else{i_input_val=arr_sudo_input_fields[arguments[0]].value;if(i_input_val!=''){arr_sudo_solutions[arguments[0]][0]=[sudo_translate_input(i_input_val,false)];}}}
function sudo_solve(bol_quiet,bol_skip_elimination){if(!bol_quiet&&isNaN(i_sudo_size)){sudo_status('Nincs megoldandó játék.');return;}
bol_sudo_solved=(bol_skip_elimination||sudo_eliminate(bol_quiet));for(i=0;i<i_sudo_field_no&&bol_sudo_solved;i++){if(arr_sudo_solutions[i][0].length!=1){bol_sudo_solved=false;}else if(!bol_quiet){arr_sudo_input_fields[i].value=sudo_translate_input(arr_sudo_solutions[i][0],true);}}
if(!bol_sudo_solved&&!bol_quiet){alert('Nincs lehetséges megoldás.');}else if(!bol_quiet){sudo_status('Játék megoldva.');}
return bol_sudo_solved;}
function sudo_test(){if(isNaN(i_sudo_size)){sudo_status('Nincs megoldandó játék.');return;}
var bol_solvable=sudo_eliminate(true);if(bol_solvable&&sudo_solve(true)){alert('Van megoldás.');}else if(bol_solvable){alert('Több megoldás lehetséges, ezért nincs automatikus megoldás.');}else{alert('Nincs lehetséges megoldás.');}
sudo_eliminate_human(true,0,0);}
function sudo_eliminate(bol_quiet){return sudo_eliminate_do(arr_sudo_columns,bol_quiet)&&sudo_eliminate_do(arr_sudo_rows,bol_quiet)&&sudo_eliminate_do(arr_sudo_regions,bol_quiet);}
function sudo_eliminate_do(arr_perform_in,bol_quiet){for(i=0,i_length=arr_perform_in.length;i<i_length;i++){var arr_solutions_first_occur=new Array(i_sudo_size*i_sudo_size);var arr_count=new Array(i_sudo_size*i_sudo_size);for(a=0,a_length=arr_count.length;a<a_length;a++)arr_count[a]=0;var arr_perform_in_i=arr_perform_in[i];for(a=0,a_length=arr_perform_in_i.length;a<a_length;a++){var arr_perform_in_i_a=arr_perform_in_i[a];if(!arr_sudo_solutions[arr_perform_in_i_a][1]&&arr_sudo_solutions[arr_perform_in_i_a][0].length==1){sudo_eliminate_solution(arr_perform_in_i_a,arr_sudo_solutions[arr_perform_in_i_a][0][0],bol_quiet);return sudo_eliminate_do(arr_perform_in,bol_quiet);}
for(b=0,b_length=arr_sudo_solutions[arr_perform_in_i_a][0].length;b<b_length;b++){i_this_solution=arr_sudo_solutions[arr_perform_in_i_a][0][b];arr_count[i_this_solution]++;if(arr_count[i_this_solution]==1)arr_solutions_first_occur[i_this_solution]=arr_perform_in_i_a;}}
for(a=0,a_length=arr_count.length;a<a_length;a++){if(arr_count[a]==0){return false;}else if(arr_count[a]==1&&!arr_sudo_solutions[arr_solutions_first_occur[a]][1]){sudo_eliminate_solution(arr_solutions_first_occur[a],a,bol_quiet);return sudo_eliminate_do(arr_perform_in,bol_quiet);}else{}}}
return true;}
function sudo_eliminate_solution(i_elim_index,i_number_to_remove,bol_quiet){arr_sudo_solutions[i_elim_index][0]=[i_number_to_remove];arr_sudo_solutions[i_elim_index][1]=true;!bol_quiet?arr_sudo_input_fields[i_elim_index].value=sudo_translate_input(i_number_to_remove,true):false;sudo_eliminate_solution_do(i_elim_index,i_number_to_remove,arr_sudo_columns[arr_sudo_index[i_elim_index][0]],arr_sudo_solutions);sudo_eliminate_solution_do(i_elim_index,i_number_to_remove,arr_sudo_rows[arr_sudo_index[i_elim_index][1]],arr_sudo_solutions);sudo_eliminate_solution_do(i_elim_index,i_number_to_remove,arr_sudo_regions[arr_sudo_index[i_elim_index][2]],arr_sudo_solutions);}
function sudo_eliminate_solution_do(i_elim_index,i_number_to_remove,arr_perform_in){for(i=0,i_length=arr_perform_in.length;i<i_length;i++){i_index=arr_perform_in[i];if(i_index!=i_elim_index){arr_new_array=new Array();for(a=0,a_length=arr_sudo_solutions[i_index][0].length;a<a_length;a++){var i_this_solution=arr_sudo_solutions[i_index][0][a];i_this_solution!=i_number_to_remove?arr_new_array[arr_new_array.length]=i_this_solution:false;}
arr_sudo_solutions[i_index][0]=arr_new_array;}}}
function sudo_eliminate_human(bol_start_over,i_index,i_value){if(bol_start_over){arr_sudo_solutions=sudo_init_solution_array();sudo_reset_solutions();for(j=0,j_length=i_sudo_field_no;j<j_length;j++){if(arr_sudo_solutions[j][0].length==1){sudo_eliminate_solution(j,arr_sudo_solutions[j][0][0],true);}}}else{sudo_eliminate_solution(i_index,i_value,true);}}
function sudo_input_change(bol_start_over,i_index,i_value){if(sudo_validate_input(i_value)||i_value==''){sudo_eliminate_human(bol_start_over,i_index,sudo_translate_input(i_value,false));sudo_update_field_info(i_index);if(i_value!=''){sudo_test_input(i_index);}}else if(i_value!=''){arr_sudo_input_fields[i_index].value=old_val;}
i_sudo_field_cnt=0;for(i=0;i<i_sudo_field_no;i++){if(arr_sudo_input_fields[i].value!=''){i_sudo_field_cnt++;}}
if(i_sudo_field_cnt==i_sudo_field_no&&sudo_solve(true)){sudo_status('Helyes megoldás.');}else if(i_sudo_field_cnt==i_sudo_field_no){sudo_status('Hibás megoldás.');}}
function sudo_test_input(i_index){if(bol_sudo_test_input){if(sudo_solve(true)){arr_sudo_input_fields[i_index].style.backgroundColor='#0e0';sudo_status('A megadott szám helyes; A játék megoldható.');}else{arr_sudo_input_fields[i_index].style.backgroundColor='#f99';sudo_status('A megadott szám helytelen; A játék NEM oldható meg.');}}}
function sudo_toggle_test_input(bol_test){bol_sudo_test_input=bol_test;if(!bol_sudo_test_input)sudo_status('Kész');}
arr_sudo_number_to_char=new Array(1,2,3,4,5,6,7,8,9,'A','B','C','D','E','F','G')
arr_sudo_char_to_number=new Array(arr_sudo_number_to_char.length);for(i=0;i<arr_sudo_number_to_char.length;i++){arr_sudo_char_to_number[arr_sudo_number_to_char[i].toString()]=i;}
function sudo_translate_input(mixed_input,bol_in_out){if(bol_in_out){return arr_sudo_number_to_char[mixed_input];}else{return arr_sudo_char_to_number[mixed_input.toString()];}}
function sudo_validate_input(s_input){for(i=0,i_length=i_sudo_size*i_sudo_size;i<i_length;i++){if(s_input==arr_sudo_number_to_char[i])return true;}
return false;}
function sudo_field_fellows(i_index){return arr_sudo_columns[arr_sudo_index[i_index][0]].concat(arr_sudo_rows[arr_sudo_index[i_index][1]],arr_sudo_regions[arr_sudo_index[i_index][2]]);}
function sudo_field_hightlight(i_index){arr_member_of=sudo_field_fellows(i_index);for(i=0;i<arr_member_of.length;i++){if(arr_member_of[i]!=i_index)arr_sudo_input_fields[arr_member_of[i]].style.backgroundColor='#eee';}
arr_sudo_input_fields[i_index].style.backgroundColor='#999';sudo_update_field_info(i_index);}
function sudo_field_blur(i_index){arr_member_of=sudo_field_fellows(i_index);for(i=0;i<arr_member_of.length;i++){arr_sudo_input_fields[arr_member_of[i]].style.backgroundColor='#fff';}
sudo_update_field_info(-1);}
function sudo_update_field_info(i_index){var str_html='<b>Lehetséges megoldások:</b><br /><br />';sudo_eliminate_human(true,i_index,true);if(i_index>-1){this_solution=arr_sudo_solutions[i_index][0];for(i=0,i_length=this_solution.length;i<i_length;i++){str_html+='<input type="text" class="sudo_field" value="'+sudo_translate_input(this_solution[i],true)+'" style="margin-bottom: 4px;" /> ';}}
document.getElementById('sudo_field_info').innerHTML=str_html;}
function sudo_toggle_field_info(bol_show){bol_sudo_show_info=bol_show;if(bol_show){sudo_eliminate_human(true);document.getElementById('sudo_field_info').style.visibility='visible';}else{document.getElementById('sudo_field_info').style.visibility='hidden';}}
function sudo_print(obj_to_print){if(isNaN(i_sudo_size)){sudo_status('Nincs játék, amit kinyomtathatsz.');return;}
var obj_noprint=document.getElementById('sudo_noprint');var obj_body=document.getElementsByTagName('body');obj_noprint.style.display='none';obj_temp_print=document.createElement('div');obj_temp_print.innerHTML=obj_to_print.innerHTML;var obj_old_plate=obj_temp_print.getElementsByTagName('input');for(i=0;i<obj_old_plate.length;i++){obj_old_plate[i].value=arr_sudo_input_fields[i].value;}
obj_temp_print.style.display='block';obj_body[0].appendChild(obj_temp_print);window.print();obj_body[0].removeChild(obj_temp_print);obj_noprint.style.display='block';}
var i_sudo_timer_id=0;var i_sudo_second_count=0;var obj_sudo_timer_form;function sudo_timer(ACommand){clearTimeout(i_sudo_timer_id);switch(parseInt(ACommand)){case 0:i_sudo_second_count=parseInt($('input[name="hh"]').val()*3600)+parseInt($('input[name="mm"]').val()*60)+parseInt($('input[name="ss"]').val());sudo_timer_do();break;case 1:break;case 2:i_sudo_second_count=0;sudo_timer_do(true);break;}}
function sudo_timer_do(AStop){var i_hh=Math.floor(i_sudo_second_count/3600);var i_mm=Math.floor((i_sudo_second_count%3600)/60);var i_ss=i_sudo_second_count-i_hh*3600-i_mm*60;$('input[name="hh"]').val(sudo_format_number(i_hh));$('input[name="mm"]').val(sudo_format_number(i_mm));$('input[name="ss"]').val(sudo_format_number(i_ss));if(!AStop)
{i_sudo_second_count++;i_sudo_timer_id=setTimeout('sudo_timer_do()',1000);}}
function sudo_format_number(i_no){if(i_no<10){return'0'+i_no;}else{return i_no;}}
function sudo_save_game(){if(isNaN(i_sudo_size)){sudo_status('Nincs játék, amit elmenthetsz.');return;}
var str_xml='<sudoku>\n';str_xml+='\t<size>'+i_sudo_size+'</size>\n';for(i=0;i<i_sudo_field_no;i++){if(arr_sudo_input_fields[i].value!=''){str_xml+='\t<field>\n';str_xml+='\t\t<index>'+i+'</index>\n';str_xml+='\t\t<value>'+arr_sudo_input_fields[i].value+'</value>\n';str_xml+='\t</field>\n';}}
str_xml+='</sudoku>';document.sudo_save.savetxt.value=str_xml;sudo_toggle_layers('sudo_blur','sudo_save_dialog');}
function sudo_load_game_do(str_xml){try{str_xml=str_xml.replace(/[\n\t]/g,"");i_size=str_xml.match(/<size>(.*)<\/size>/)[1];sudo_init(parseInt(i_size));if(str_xml.search(/<field>(.*?)<\/field>/)>-1){var arr_fields=str_xml.match(/<field>(.*?)<\/field>/g);for(i=0;i<arr_fields.length;i++){var i_index=arr_fields[i].match(/<index>(.*)<\/index>/)[1];var s_value=arr_fields[i].match(/<value>(.*)<\/value>/)[1];if(parseInt(i_index)<i_sudo_field_no)arr_sudo_input_fields[i_index].value=s_value;}}
sudo_reset_solutions();sudo_eliminate_human(true,0,0);}catch(e){sudo_status('Hiba az adatok betöltése közben.');}}
function sudo_status(str_mesg){document.getElementById('sudo_status').innerHTML=str_mesg;}
function sudo_toggle_layers(){for(i=0,i_length=arguments.length;i<i_length;i++){obj_layer=document.getElementById(arguments[i]);if(obj_layer.style.display=='block'){obj_layer.style.display='none';var s_msie='visible';}else{obj_layer.style.display='block';var s_msie='hidden';}}
if(navigator.userAgent.indexOf('MSIE')>-1){obj_selects=document.getElementsByTagName('select');for(i=0;i<obj_selects.length;i++){obj_selects[i].style.visibility=s_msie;}}}
window.onload=function(){sudo_init(3)};
