/**************************************************************************
This Code must not be copied in any way, or used on any website other than
am-lindenbaum.de. All rights are reserved, none granted.
Copyright 2007 by Ronny Döring
**************************************************************************/
sudoku={init: function(conf){this.conf=conf;this.board=new Array();this.resetBoard();this.sp=false;this.fontS=24;this.boxW=30;this.boxH=30;this.borderThin=1;this.borderStrong=2;this.boardW=this.boxW*9+this.borderThin*6+this.borderStrong*4;this.borderMS=ua.ie?2:0;this.form=null;},create: function(){var stil="";document.write('<form id="board" name="board" action="javascript:void()"><div style="margin:0 auto 0 auto;width:'+this.boardW+'px;padding:0px;background:#000">');for(i=0;i<81;i++){   stil="text-align:center;border:0px;padding:0px;font-size:"+this.fontS+"px;line-height:"+this.fontS+"px;width:"+this.boxW+"px;height:"+this.boxH+"px;";if(i%9==0&&i!=0)document.write('<br>');stil+=(Math.floor(i/9)%3==0)?(Math.floor(i/9)==0)?'margin-top:'+(this.borderStrong-this.borderMS/2)+'px;':'margin-top:'+this.borderStrong+'px;':'margin-top:'+this.borderThin+'px;';stil+=(Math.floor(i/9)==8)?'margin-bottom:'+(this.borderStrong-this.borderMS/2)+'px;':'margin-bottom:'+(0-this.borderMS)+'px;';stil+=(i%3==0)?'margin-left:'+this.borderStrong+'px;':'margin-left:'+this.borderThin+'px;';stil+=(i%9==8)?'margin-right:'+this.borderStrong+'px;':'margin-right:0px;';document.write('<input class="text" type="text" style="'+stil+'" name="'+i+'" maxlength=1 size=1 value="">');}document.write('</div>live? <input type="checkbox" name="sp"><br><a href="#" onmousedown="this.className=\'mdown\';" onmouseup="this.className=null;" onmouseout="this.className=null;window.status=\'\';return true;" onclick="sudoku.findSolution();return false;" onmouseover="window.status=\''+this.conf.status0+'\';return true;" title="'+this.conf.status0+'"><small>'+this.conf.button0+'</small></a><a href="#" onmousedown="this.className=\'mdown\';" onmouseup="this.className=null;" onmouseout="this.className=null;window.status=\'\';return true;" onclick="document.board.reset();sudoku.resetBoard();return false;" onmouseover="window.status=\''+this.conf.status1+'\';return true;" title="'+this.conf.status1+'"><small>'+this.conf.button1+'</small></a><a href="#" onmousedown="this.className=\'mdown\';" onmouseup="this.className=null;" onmouseout="this.className=null;window.status=\'\';return true;" onclick="sudoku.showHelp();return false;" onmouseover="window.status=\''+this.conf.status2+'\';return true;" title="'+this.conf.status2+'"><small>'+this.conf.button2+'</small></a><a href="#" onmousedown="this.className=\'mdown\';" onmouseup="this.className=null;" onmouseout="this.className=null;window.status=\'\';return true;" onclick="self.close();return false;" onmouseover="window.status=\''+this.conf.status3+'\';return true;" title="'+this.conf.status3+'"><small>'+this.conf.button3+'</small></a><br><span style="font-size:10px;line-height:20px">Copyright &copy; 2007 Ronny D&ouml;ring &amp; SawatDi Webdesign</span></form>');document.write('<div id="help">'+this.conf.help+'</div>');},findSolution: function(){this.form=getElement(document,"id","board",null);if(Undef(this.form)){alert(this.conf.msg0);return false;}this.sp=this.form.elements["sp"].checked==true?true:false;this.resetBoard();if(Def(this.help))this.help.style.visibility='hidden';for(i=0;i<81;i++){if(Undef(this.form.elements[i])){alert(this.conf.msg1);return false;}if(this.form.elements[i].value!="")this.board[i]=this.form.elements[i].value;this.form.elements[i].disabled=true;}if(this.findS(-1)==true){if(this.sp)alert(this.conf.msg2);else if(!confirm(this.conf.msg3))return false;for(i=0;i<81;i++)this.form.elements[i].value=this.board[i];}else{alert(this.conf.msg4);}},findS: function(start){if(start==81)return true;var poss=new Array();var c=0;var b=0;var counter=start+1;for(c=0;c<81;c++){poss[c]=0;if(this.board[c]==0){var x=this.fH(c);var y=this.fV(c);var z=this.fS(c);var v=(x|y)|z;var m=(Math.pow(2,10)-1)^v;if(m==1){return false;}else{poss[c]=m;}}}if(this.board[counter]==0){for(b=1;b<10;b++){if(poss[counter]&Math.pow(2,b)){this.board[counter]=b;if(this.sp)this.form.elements[counter].value=this.board[counter];if(!this.findS(counter)){this.board[counter]=0;if(this.sp)this.form.elements[counter].value="";}else{return true;}}}}else{return this.findS(counter);}return false;},fH: function(x){var row=Math.floor(x/9);var start=row*9;var stop=start+9;var retval=0;var c=0;for(c=start;c<stop;c++){retval=retval|Math.pow(2,this.board[c]);}return retval^1;},fV: function(y){var col=y%9;var retval=0;var c=0;for(c=0;c<9;c++)retval=retval|Math.pow(2,this.board[c*9+col]);return retval^1;},fS: function(z){var b1=Math.floor(z/3);var b2=b1%3;var b3=Math.floor(b1/9);var start=b3*27+b2*3;var retval=0;var c=0;var d=0;for(c=0;c<19;c=c+9){for(d=0;d<3;d++)retval=retval|Math.pow(2,this.board[start+d+c]);}return retval^1;},setEvents: function(){this.form=getElement(document,"id","board",null);if(Undef(this.form))return;for(var i=0;i<81;i++)evnt.add(this.form.elements[i],"keyup",this.check,true);},check: function(e){e=evnt.dom(e);var key=evnt.getKey(e);var input=e.trgt.value*1;if(key>47&&key<58&&input){var idx=e.trgt.name*1;var x=sudoku.fH(idx);var y=sudoku.fV(idx);var z=sudoku.fS(idx);var m=(x|y)|z;if(m&Math.pow(2,input)){e.trgt.value="";alert(sudoku.conf.msg5);return;}sudoku.board[idx]=input;var nxt=idx<80?idx+1:"sp";e.trgt.form.elements[nxt].focus();}else switch (key){case "":break;case 0:break;case 8:break;case 9:break;case 13:break;case 20:break;case 27:break;case 33:break;case 34:break;case 35:break;case 36:break;case 37:break;case 38:break;case 39:break;case 40:break;case 45:break;case 46:break;default:e.trgt.value="";alert(sudoku.conf.msg6);return;}},resetBoard: function(){for(var i=0;i<81;i++){this.board[i]=0;if(Def(this.form))this.form.elements[i].disabled=false;}},showHelp:function(){this.help=getElement(document,"id","help",null);this.help.style.visibility="visible";}}

