/* AJAX Init & functions */ var XMLHTTP = false; /*@cc_on @*/ /*@if (@_jscript_version >= 5) try { XMLHTTP = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { XMLHTTP = new ActiveXObject("Microsoft.XMLHTTP"); } catch (E) { XMLHTTP = false; } } @end @*/ if (!XMLHTTP && window.XMLHttpRequest) { XMLHTTP = new XMLHttpRequest(); } function request(method, url, query) { query = 'nocache=' + Math.random() + (query.length > 0 ? ('&' + query) : ''); if (method == 'GET') { url = url + '?' + query; } else { method = 'POST'; } XMLHTTP.open(method, url, true); if (method == 'POST') { XMLHTTP.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); XMLHTTP.setRequestHeader("Content-Length", query.length); } XMLHTTP.onreadystatechange = function() { if (XMLHTTP.readyState == 4) { if (XMLHTTP.status == 200) { if (XMLHTTP.responseText) loadFromString(XMLHTTP.responseText); else alert('No solution !'); } else { alert('XMLHTTP Error !'); } } } XMLHTTP.send(method == 'POST' ? query : null); return false; } function urlencode(string) { return escape(string); } function urldecode(string) { return unescape(string); } /* Sudoku functions */ function selectSquare() { document.getElementById('osn-selection').style.display = "none"; if (!this.disabled) { if (this.value) { this.select() } else { this.focus(); } } } function changeSquare() { if (!this.value.match(/^[1-9]{1}$/)) this.value = ''; var x = this.name.charAt(4); var y = this.name.charAt(6); var v = this.value == "" ? 0 : parseInt(this.value); doChangeSquare(x,y,v); } function showSelect(e) { if (this.disabled) { return false; } selectedSquare = this; var posx = 0; var posy = 0; if (!e) var e = window.event; if (e.pageX || e.pageY) { posx = e.pageX; posy = e.pageY; } else if (e.clientX || e.clientY) { posx = e.clientX + document.body.scrollLeft; posy = e.clientY + document.body.scrollTop; } document.getElementById('osn-selection').selectedIndex = this.value; document.getElementById('osn-selection').style.top = posy-10+"px"; document.getElementById('osn-selection').style.left = posx-10+"px"; document.getElementById('osn-selection').style.display = "block"; } function hideSelect() { element = document.getElementById('osn-selection'); element.style.display = "none"; selectedSquare.focus(); selectedSquare.value = element.selectedIndex == 0 ? '' : element.selectedIndex; var x = selectedSquare.name.charAt(4); var y = selectedSquare.name.charAt(6); var v = element.selectedIndex; doChangeSquare(x,y,v); } function getBoxFromXY(x,y) { return 1+Math.floor((x-1)/3)+3*Math.floor((y-1)/3); } function doChangeSquare(x,y,v) { var b = getBoxFromXY(x,y); var old = document.getElementById('osn-'+x+'-'+y); if (document.getElementById('osn-draft').checked) { old.style.fontSize = "100%"; } old.style.color = '#000'; old = grid[x][y]; grid[x][y] = v; //alert('('+x+','+y+')='+old+' -> '+v+' [box '+b+']'); if (old != 0) { freeSquares++; countByBox[b][old]--; countByCol[x][old]--; countByRow[y][old]--; if (countByBox[b][old] == 1) { for (var i = 1; i <= 3; i++) { for (var j = 1; j <= 3; j++) { var x2 = ((b-1)%3)*3 + i; var y2 = Math.floor((b-1)/3)*3 + j; var element = document.getElementById('osn-'+x2+'-'+y2); if ((element.value == old) && (countByCol[x2][old] <= 1) && (countByRow[y2][old] <= 1)) { element.style.color = '#000'; } } } } if (countByCol[x][old] == 1) { for (var i = 1; i <= 9; i++) { var element = document.getElementById('osn-'+x+'-'+i); if ((element.value == old) && (countByBox[getBoxFromXY(x,i)][old] <= 1) && (countByRow[i][old] <= 1)) { element.style.color = '#000'; } } } if (countByRow[y][old] == 1) { for (var i = 1; i <= 9; i++) { var element = document.getElementById('osn-'+i+'-'+y); if ((element.value == old) && (countByBox[getBoxFromXY(i,y)][old] <= 1) && (countByCol[i][old] <= 1)) { element.style.color = '#000'; } } } } if (v) { freeSquares--; countByBox[b][v]++; countByCol[x][v]++; countByRow[y][v]++; if (countByBox[b][v] > 1) { for (var i = 1; i <= 3; i++) { for (var j = 1; j <= 3; j++) { var x2 = ((b-1)%3)*3 + i; var y2 = Math.floor((b-1)/3)*3 + j; var element = document.getElementById('osn-'+x2+'-'+y2); if (element.value == v) { element.style.color = '#f00'; } } } } if (countByCol[x][v] > 1) { for (var i = 1; i <= 9; i++) { var element = document.getElementById('osn-'+x+'-'+i); if (element.value == v) { element.style.color = '#f00'; } } } if (countByRow[y][v] > 1) { for (var i = 1; i <= 9; i++) { var element = document.getElementById('osn-'+i+'-'+y); if (element.value == v) { element.style.color = '#f00'; } } } } if (freeSquares == 0) { checkGrid(); } } function checkGrid() { for (var x = 1; x <= 9; x++) { for (var y = 1; y <= 9; y++) { if ((countByBox[x][y] != 1) || (countByCol[x][y] != 1) || (countByRow[x][y] != 1)) { return false; } } } timer = false; alert("Well done !"); } function toProblem() { for (var x = 1; x <= 9; x++) for (var y = 1; y <= 9; y++) { if (grid[x][y] != 0) { document.getElementById('osn-'+x+'-'+y).disabled = 'disabled'; } } } function clearGrid() { for (var x = 1; x <= 9; x++) for (var y = 1; y <= 9; y++) { element = document.getElementById('osn-'+x+'-'+y); if ((grid[x][y] != 0) && !element.disabled) { element.color = '#000'; countByBox[getBoxFromXY(x,y)][element.value]--; countByCol[x][element.value]--; countByRow[y][element.value]--; element.value = ""; grid[x][y] = 0; } } } function loadFromString(s) { var i = 0; for (var y = 1; y <= 9; y++) for (var x = 1; x <= 9; x++) { var element = document.getElementById('osn-'+x+'-'+y); if (!element.disabled) { element.value = s.charAt(i).match(/^[1-9]{1}$/) ? parseInt(s.charAt(i)) : ""; doChangeSquare(x,y,parseInt(s.charAt(i))); } i++; } } function saveToString() { var s = ''; for (var y = 1; y <= 9; y++) for (var x = 1; x <= 9; x++) { s += grid[x][y]; } return s; } function loadProblem() { init(); problem = new Array( '001020700050000090000400000080005000090000000000060002002000000006000005000009083', '000007008010000570020400000400005800000100030350060210602000009005001004000000000', '000004850900000000087015000000600070004000000060003291000006000010900002002000015', '068300020510000000300000006000050009009002080000400300000800000697040000100000730', '030500008064010300000002000006009000002000040080075209000004070000000800841000056', '000004710072006040000900205800000000096510000105002000430008000000000090000060370', '007100500000200006421000090000000200700050000000000643060070400049008000000560009', '000015700001200800003000000700500900006071000010002060004003000602400500080009002', '100800000000000020800002030000400800003000009000615040000900605008200000050034002', '000910000000000068050806093000000426006190005003000000048000000500604000900030000', '072050006001009500000060020500000400000100008000000609300040000900087005004000080', '000009060062000005900603008000900006024100800000075000007000009050002310001090000', '300000000000209600094008000043080100008050700700000030100002040020003000007610003', '000000000090005100500000709000860000730900004001400067070009000003640000012000000', '000300800050000010002010000640850000900032000500900006009200005180007900007000000', '910000080000040300000060009040830600500000008000007094608059020020700000000400060', '070000000300800010001000000400070000900104020205980000000050108003000000040020697', '004000000103000070008700250305009002420070081000000000500013800000800900000500407', '003000804006905200000100000000053020080400010020000003957000000000008306000001700', '001004000800030060030010800000520007009048000506000000060000038078000020000709000', '001000405008069007000002000039070000040000000607500300000005000000900284020000060', '000004000003501000050200087000100200000009030820040000207300004009000700030000021', '082700300900300200600002001000000043010000790000470800009800000070010008000643000', '000200049000603000000040800001000020960001000040000007000078601400000098310000700', '105000000000601005004009000000070002000805600030000008040100060680000040001080090', '009038020000000105000200000040800000085179000003000700071000030000000010050600004', '030000000006700200980050000060040507000000000400029000007490006200600140000010030', '000320001902000083800400000040001000007000506000004007009100600100060070500807004', '000060950860200070405000000000820004000006000000591608096030800070900000500000100', '084070000070600000000090208450000020000004006000062010005000003960000000320000450', '007000018043000000000008904009785060000001000570000000000200080600094072020000506', '000005080900000004070000300000000600590084200003001450000238000400007000600400023', '060078050038000000005090010000009006000267000800300000050000700000001300701804020', '903700000000300200001006000007000000060470592000025070000059000080000039400003000', '000500700080000000000900861700000203000600050008040000074105000800000500906402000', '100009060005600004000000000000500000004203670500007000009002008000000407340081900', '590020010300060009700040600003700100000090000017200000004000065000079400100006000', '200005000004000000000010980430000007000100060050730100060000200809002000000409000', '080010040000004200200000960002540090500000000000008600004001000000030070071000003', '000093027070000000400000036000005000006700003000600100308070040710800900000000000', '000004000028067004001000020000000500000036200100800090010020600043081070000450000', '007000000050160000000000200000000900500400003410309002060004500039500800800010000', '500370080020805000090010000605700000810000000004003018002007000760000004001000906', '000600001006300002000040080040200000360005000508400007050030700790024005002700090', '000060010000801500700090200903050700020300000005000038350000800600005000090020006', '000700604407000305908000007324006000000005000000090830801043002002510000000000100', '000080002001540008040000900270005000080000050000600200054090010090000600006000009', '000004180009003000000500000140000000000306040700805000000000050407000901205900700', '080500100702003000003090008406102790030000050900007000000000900000710000008006010', '010000080400001000697400000000002007000005060008090010000000002040970500060000100', '003960074000370000400000000500100009006002000001600700060000805007508002800000100', '000501060009000520020090007100405600074000003605300000000006070310004800000000000', '500000000000000078300000904901002000000390000000800600000200050008040209030106000', '020008000000030105705020800057001003609800007100600000500300009090000000400000200', '000206700000400020040000193000000000000600850910003000009302046070000000200004010', '860003000003000000005600100210004008030000004009030010000800200000041500090706000', '920500000300000790004000000000100008000970000000208040050000074090050030017083000', '005010090000000020010800300062040700503000400800031005000000040000207800620000100', '000700006300206000008300400003100700020000009000000100004001807000037900080002060', '570130000010000005000060080290010000000020407400008090109300042000006000000050003', '000254000040390500800000000200000008000000400700040650060020805008001930510900040', '006000000078090000040005008000004050000002001012060803000650000305000700080400200', '000000000090063500006427009005000670260000008000000102007200800080094000102000000', '000000003200006008090074000025000006000000901000302804401005002030040000700020000', '085004000003607000000200005007100020000000000530900600002093000700060000000002178', '000700080500000000030000904000000000005089170069100000070001060002000049600300802', '300007040040030005680090003017000600000000800009840000000103000100070300006000090', '800600007000900300100300009060780090010000004050040602000000000300010060042000008', '700003060501004000000060020009000482000200059300000000007000008430000000000870600', '002003800100900700008000003301600000000080060090700502010000000800070040603000070', '060000300120086900040003100900062700000058000000700020070090000200070006000005080', '700000000800400300005000006086000200000012000002060507000307005500000479000090080', '900006005017009060240000300000040900000005000070012040305000010600290000000508000', '095000400073090000000001002631000020000008004000050030089020001002000000010800075', '900000060240009100000000300000590000071000400000106000000050006030000000407213000', '400000000100000200200907000007065000540008000900030007000000010600501704008200009', '000700350060080000012600090905000000320000700000010000458000001000003007000050400', '080006000302480060901000000810070000200000000007000003000007139000105008043900705', '090700000805000001000060020000400006057003208008000037920000140000000300000030072', '008025000500000000070600500200019000000200003006300705060000000039000102007080006', '000010704504000000000820030020700800000060001047001000009000000401070058000102009', '000709002005030000000054060040007013039000080000006007008000100000500090060200300', '760800400008000000000050002809000005040035100075006004000000360007000000002040008', '000408090400231000000090030062300100010060000000100050200000005030006200007903000', '713000500000000020000500018080650004600000350209400000000002460000369000000700000', '086000009000500000090007401002100370040002500900000000600901040000004005050600020', '000010050800000730050200006070000000405008000010600400906500000000086000000130027', '400030091050047000300000076031000000000013800500000002000809000075000609008070000', '100000304000046000000005080003080090400030000701000000852070000000400000090000021', '008090050025003007000200004062800300000900070000030060009000000087620001001005008', '000090000067000000020004608200850700000009810000740090300000500090000002400007963', '090000040504100000080060500006070003900020700000009100000000064270000800005000910', '030400008960000000050072000800003070005781003000040600090008000000000706001000009', '000002060520000000106078500691203700030700002000900100070000090208600000000000001', '000003100900000060030806000200000010083400005000009000705080000060100850009604070', '090000080060000002103090005031400800000070010020906004000008300009200000006050000', '006080007024090306000001040700000000002050000000000109000800090090620081030100004', '000002008070000900000750000003900001008300600000600082020000700490006000006009050', '000001000080390625002007010000005000500070004098100006009020000000010009050600280', '003090200900000000002000401000000608500003000400709000809006100020900084140002000', '000608300480000000000054010093000108850000030010000004000075600000040029200000000', '000510000000007002920080600010029800003600000040000090000400000000100307001000008', '000050040060000008200300600700000000100260003805030010012000080004001900000008004', '000051000300070014009000000030000105000040080000803000000200500060090008750608300', '080300067710000000004009200200900015000000320070810040900204000001050000000003000' ); var currentTime = new Date(); loadFromString(problem[currentTime.getTime()%problem.length]); toProblem(); time = 0; timer = true; } function solveProblem() { //toProblem(); request('GET','http://www.online-sudoku.net/sudoku-engine.php','action=solve&grid='+saveToString()) } function toggleDraftMode() { if (!document.getElementById('osn-draft').checked) { for (var x = 1; x <= 9; x++) { for (var y = 1; y <= 9; y++) { document.getElementById('osn-'+x+'-'+y).style.fontSize = "200%"; } } } } function clearDraft() { if (document.getElementById('osn-draft').checked) { for (var x = 1; x <= 9; x++) { for (var y = 1; y <= 9; y++) { var element = document.getElementById('osn-'+x+'-'+y); if (element.style.fontSize == "100%") { element.value = ""; doChangeSquare(x,y,0); } } } } } function togglePauseGame() { var element = document.getElementById('osn-grid'); if (element.style.visibility == "hidden") { element.style.visibility = "visible" timer = true; } else { timer = false; element.style.visibility = "hidden"; } } function showTimer() { if (timer) { time += 1; var h = Math.floor(time/3600); var m = Math.floor((time%3600)/60); var s = time%60; h = h < 10 ? "0"+h : h; m = m < 10 ? "0"+m : m; s = s < 10 ? "0"+s : s; document.getElementById('osn-timer').innerHTML = h+":"+m+":"+s; } t = setTimeout('showTimer()', 1000); } function init() { freeSquares = 81; document.getElementById('osn-draft').checked = false; for (var x = 1; x <= 9; x++) { countByBox[x] = new Array(); countByCol[x] = new Array(); countByRow[x] = new Array(); grid[x] = new Array(); for (var y = 1; y <= 9; y++) { countByBox[x][y] = 0; countByRow[x][y] = 0; countByCol[x][y] = 0; grid[x][y] = 0; element = document.getElementById('osn-'+x+'-'+y); element.disabled = false; element.value = ''; element.style.color = '#000'; element.style.fontSize = "200%"; } } } /* Global variables */ var countByBox = new Array(); var countByRow = new Array(); var countByCol = new Array(); var grid = new Array(); var selectedSquare = null; var timer = false; var time = 0; var freeSquares = 81; /* Write and initialize grid */ document.write('


©2005-2006 Online-Sudoku.net
'); for (var x = 1; x <= 9; x++) { for (var y = 1; y <= 9; y++) { element = document.getElementById('osn-'+x+'-'+y); element.onmouseover = selectSquare; element.onchange = changeSquare; element.onclick = showSelect; } } loadProblem(); showTimer();