function getEleX(node){var px;px=node.offsetLeft;if(node.offsetParent)px+=getEleX(node.offsetParent);return px}function getEleY(node){var py;py=node.offsetTop;if(node.offsetParent)py+=getEleY(node.offsetParent);return py};var Deltazon={};Deltazon.config=function(){this.canvasWidth=0;this.canvasHeight=0;this.canvasMainID="";this.canvasBackID="";this.compositeImageID="";this.backgroundWidth=0;this.backgroundHeight=0;this.backgroundSourceX=0;this.backgroundSourceY=0;this.backgroundStaticSourceX=0;this.backgroundStaticSourceY=0;this.targetWidth=0;this.targetHeight=0;this.targetCoords=null;this.pitTargetX=0;this.pitTargetY=null;this.tileWidth=0;this.tileHeight=0;this.tileSourceX=0;this.tileSourceY=null;this.memoWidth=0;this.memoHeight=0;this.memoSourceX=0;this.memoSourceY=0};Deltazon.Tile=function(simg,sfX,sfY,sbX,sbY,cX,cY,hX,hY,w,h,v,s,d){this.sourceImage=simg;this.sourceForegroundX=sfX;this.sourceForegroundY=sfY;this.sourceBackgroundX=sbX;this.sourceBackgroundY=sbY;this.canvasX=cX;this.canvasY=cY;this.homeX=hX;this.homeY=hY;this.width=w;this.height=h;this.value=v;this.isStatic=s;this.canDrag=d;this.target=null};Deltazon.Tile.prototype.getHitX=function(){return this.canvasX+this.width/2};Deltazon.Tile.prototype.getHitY=function(){return this.canvasY+this.height/2};Deltazon.Tile.prototype.hitTest=function(x,y){return this.canvasX<x&&this.canvasY<y&&this.canvasX+this.width>x&&this.canvasY+this.height>y};Deltazon.Tile.prototype.moveTo=function(x,y){this.canvasX=x;this.canvasY=y};Deltazon.Tile.prototype.moveDelta=function(dX,dY){this.canvasX=this.canvasX+dX;this.canvasY=this.canvasY+dY};Deltazon.Tile.prototype.moveHome=function(){this.canvasX=this.homeX;this.canvasY=this.homeY};Deltazon.Tile.prototype.paint=function(ctx){ctx.drawImage(this.sourceImage,this.sourceBackgroundX,this.sourceBackgroundY,this.width,this.height,this.canvasX,this.canvasY,this.width,this.height);ctx.drawImage(this.sourceImage,this.sourceForegroundX,this.sourceForegroundY,this.width,this.height,this.canvasX,this.canvasY,this.width,this.height)};Deltazon.Target=function(cX,cY,w,h,hX,hY,hw,hh,i,v){this.canvasX=cX;this.canvasY=cY;this.width=w;this.height=h;this.hitX=hX;this.hitY=hY;this.hitWidth=hw;this.hitHeight=hh;this.tile=null;this.index=i;this.value=v};Deltazon.Target.prototype.captureMemo=function(memo){var x=this.canvasX+(this.width-memo.width)/2,y=this.canvasY+(this.height-memo.height)/2;memo.moveTo(x,y);memo.visible=true};Deltazon.Target.prototype.captureHome=function(tile){if(this.tile!=null){this.tile.moveHome();this.tile=null}var x=this.canvasX+(this.width-tile.width)/2,y=this.canvasY+(this.height-tile.height)/2;tile.homeX=x;tile.homeY=y;tile.moveTo(x,y);this.tile=tile};Deltazon.Target.prototype.captureTile=function(tile){this.tile=tile;this.value=tile.value;this.tile.target=this;var x=this.canvasX+(this.width-tile.width)/2,y=this.canvasY+(this.height-tile.height)/2;tile.moveTo(x,y)};Deltazon.Target.prototype.hitTest=function(x,y){if(this.tile!=null&&!this.tile.canDrag)return false;return this.hitX<x&&this.hitY<y&&this.hitX+this.hitWidth>x&&this.hitY+this.hitHeight>y};Deltazon.Memo=function(img,x,y,w,h){this.memoImage=img;this.sourceX=x;this.sourceY=y;this.width=w;this.height=h;this.canvasX=0;this.canvasY=0;this.visible=false;this.target=null};Deltazon.Memo.prototype.moveTo=function(x,y){this.canvasX=x;this.canvasY=y};Deltazon.Memo.prototype.paint=function(ctx){this.visible&&ctx.drawImage(this.memoImage,this.sourceX,this.sourceY,this.width,this.height,this.canvasX,this.canvasY,this.width,this.height)};Deltazon.Sudoku=function(){this.SAVE_SUDOKU_PUZZLE="saveSudokuPuzzle";this.SAVE_SUDOKU_GAME="saveSudokuGame";this.SAVE_SUDOKU_PUZZLE_PREFIX="sp";this.SAVE_SUDOKU_GAME_PREFIX="sg";this.game=null;this.gameValues=null;this.isComplete=false;this.useStorage=false;this.canvasWidth=0;this.canvasHeight=0;this.mainCanvas=null;this.mainContext=null;this.backCanvas=null;this.backContext=null;this.backBufferIsDirty=true;this.backImage=null;this.backgroundSourceX=0;this.backgroundSourceY=0;this.backgroundStaticSourceX=0;this.backgroundStaticSourceY=0;this.tiles=[];this.targets=[];this.pits=[];this.dragItem=null;this.memo=null;this.dragDistance=0;this.mainCanvasOffsetX=0;this.mainCanvasOffsetY=0;this.offsetX=0;this.offsetY=0;this.resizeScreen=function(){this.mainCanvasOffsetX=getEleX(this.mainCanvas);this.mainCanvasOffsetY=getEleY(this.mainCanvas)};this.reset=function(){this.isComplete=false;this.memo.target=null;this.memo.moveTo(0,0);this.memo.visible=false;for(var a=0;a<81;a++){var target=this.targets[a];if(target.tile!=null)if(target.tile.canDrag){target.tile.target=null;target.tile.moveHome();target.tile=null;target.value=0;this.gameValues[a]=0}}this.saveGame();this.backBufferIsDirty=true;this.paint()};this.loadPuzzle=function(game){this.game=game;this.isComplete=false;this.memo.target=null;this.memo.moveTo(0,0);this.memo.visible=false;for(var a=0;a<81;a++){var tile=this.tiles[a];tile.sourceBackgroundX=this.backgroundSourceX;tile.sourceBackgroundY=this.backgroundSourceY;tile.isStatic=true;tile.canDrag=true;tile.target=null;tile.moveHome();var target=this.targets[a];target.tile=null;target.value=0;this.gameValues[target.index]=0}for(var b=0;b<81;b++){var v=this.game[b];if(v>0){var target=this.targets[b],tile=this.getAvailableTile(v);tile.sourceBackgroundX=this.backgroundStaticSourceX;tile.sourceBackgroundY=this.backgroundStaticSourceY;tile.isStatic=true;tile.canDrag=false;target.captureTile(tile);this.gameValues[target.index]=v}}this.savePuzzle();this.backBufferIsDirty=true;this.paint()};this.getAvailableTile=function(val){for(var i=0;i<81;i++)if(this.tiles[i].value==val&&this.tiles[i].canDrag&&this.tiles[i].target==null)return this.tiles[i];return null};this.paintBackBuffer=function(){this.backContext.clearRect(0,0,this.canvasWidth,this.canvasHeight);this.backContext.drawImage(this.backImage,0,0,this.canvasWidth,this.canvasHeight,0,0,this.canvasWidth,this.canvasHeight);this.memo.paint(this.backContext);for(var i=0;i<81;i++){var tile=this.tiles[i];tile.isStatic&&tile.paint(this.backContext)}};this.paint=function(){this.mainContext.clearRect(0,0,this.canvasWidth,this.canvasHeight);if(this.backBufferIsDirty){this.paintBackBuffer();this.backBufferIsDirty=false}this.mainContext.drawImage(this.backCanvas,0,0);this.dragItem!=null&&this.dragItem.paint(this.mainContext);this.isComplete&&puzzleComplete()};this.initializeGame=function(config){this.useStorage=supports_html5_storage();this.canvasWidth=config.canvasWidth;this.canvasHeight=config.canvasHeight;this.mainCanvas=document.getElementById(config.canvasMainID);this.mainContext=this.mainCanvas.getContext("2d");this.backCanvas=document.getElementById(config.canvasBackID);this.backContext=this.backCanvas.getContext("2d");this.mainCanvasOffsetX=getEleX(this.mainCanvas);this.mainCanvasOffsetY=getEleY(this.mainCanvas);this.backImage=document.getElementById(config.compositeImageID);this.backgroundSourceX=config.backgroundSourceX;this.backgroundSourceY=config.backgroundSourceY;this.backgroundStaticSourceX=config.backgroundStaticSourceX;this.backgroundStaticSourceY=config.backgroundStaticSourceY;this.memo=new Deltazon.Memo(this.backImage,config.memoSourceX,config.memoSourceY,config.memoWidth,config.memoHeight);this.gameValues=[];for(var y=0;y<9;y++){var pit=new Deltazon.Target(config.pitTargetX[y],config.pitTargetY,config.targetWidth,config.targetHeight,config.pitTargetX,config.pitTargetY[y],config.targetWidth,config.targetHeight,0,0);this.pits[y]=pit;for(var x=0;x<9;x++){var index=y*9+x,target=new Deltazon.Target(config.targetCoords[x],config.targetCoords[y],config.targetWidth,config.targetHeight,config.targetCoords[x],config.targetCoords[y],config.targetWidth,config.targetHeight,index,0);this.targets[index]=target;var tile=new Deltazon.Tile(this.backImage,config.tileSourceX,config.tileSourceY[y],config.backgroundSourceX,config.backgroundSourceY,0,0,0,0,config.tileWidth,config.tileHeight,y+1,true,true);this.pits[y].captureHome(tile);this.tiles[index]=tile;this.gameValues[index]=0}}this.paint()};this.calculateNaiveDistance=function(x1,x2,y1,y2){var dX=x2-x1,dY=y2-y1;return dX*dX+dY*dY};this.mouseMoveHandler=function(evt){if(this.dragItem!=null){var eventX=0,eventY=0;if(evt.pageX){eventX=evt.pageX;eventY=evt.pageY}else if(evt.clientX||evt.clientY){eventX=evt.clientX;eventY=evt.clientY}this.dragItem.moveDelta(eventX-this.offsetX,eventY-this.offsetY);this.dragDistance+=this.calculateNaiveDistance(this.offsetX,eventX,this.offsetY,eventY);this.offsetX=eventX;this.offsetY=eventY;this.paint();evt.preventDefault()}};this.mouseDownHandler=function(evt){if(this.isComplete)return;this.dragDistance=0;if(evt.pageX){this.offsetX=evt.pageX;this.offsetY=evt.pageY}else if(evt.clientX||evt.clientY){this.offsetX=evt.clientX;this.offsetY=evt.clientY}for(var hitX=this.offsetX-this.mainCanvasOffsetX,hitY=this.offsetY-this.mainCanvasOffsetY,i=0;i<81;i++){var tile=this.tiles[i];if(tile.canDrag&&tile.hitTest(hitX,hitY)){if(tile.target!=null){this.gameValues[tile.target.index]=0;this.saveGame();tile.target.tile=null;tile.target.value=0;tile.target=null}this.dragItem=tile;this.dragItem.isStatic=false;this.backBufferIsDirty=true;this.paint();return}}for(var i=0;i<81;i++){var trgt=this.targets[i];if(trgt.hitTest(hitX,hitY)&&trgt.Tile==null){if(trgt==this.memo.target){this.memo.target=null;this.memo.moveTo(0,0);this.memo.visible=false}else{trgt.captureMemo(this.memo);this.memo.target=trgt}this.backBufferIsDirty=true;this.paint();return}}};this.mouseUpHandler=function(evt){if(this.isComplete)return;if(this.dragItem!=null){var isClick=this.dragDistance<25,hitX=this.dragItem.getHitX(),hitY=this.dragItem.getHitY(),target=null;if(isClick)target=this.memo.target;else for(var i=0;i<81;i++){target=this.targets[i];if(target.hitTest(hitX,hitY))break;target=null}if(target!=null){if(target.tile!=null){target.tile.target=null;target.tile.moveHome();target.tile=null;this.isComplete=false}if(target==this.memo.target){this.memo.target=null;this.memo.moveTo(0,0);this.memo.visible=false}target.captureTile(this.dragItem);this.gameValues[target.index]=this.dragItem.value;this.saveGame();this.dragItem.isStatic=true;this.dragItem=null;this.isComplete=this.checkComplete();this.backBufferIsDirty=true;this.paint()}else{this.dragItem.moveHome();this.dragItem.isStatic=true;this.dragItem=null;this.isComplete=false;this.backBufferIsDirty=true;this.paint()}}};this.loadSaved=function(){var result=false,puzz=null,gam=null;if(this.useStorage){if(localStorage[this.SAVE_SUDOKU_PUZZLE]){puzz=[];for(var i=0;i<81;i++)puzz[i]=parseInt(localStorage[this.SAVE_SUDOKU_PUZZLE_PREFIX+i]);result=true}if(localStorage[this.SAVE_SUDOKU_GAME]){gam=[];for(var i=0;i<81;i++)gam[i]=parseInt(localStorage[this.SAVE_SUDOKU_GAME_PREFIX+i])}if(result){this.loadPuzzle(puzz);if(gam!=null&&gam.length>0){for(var i=0;i<81;i++){var v=gam[i];if(v>0){var target=this.targets[i],tile=this.getAvailableTile(v);if(tile!=null){target.captureTile(tile);this.gameValues[target.index]=v}else tile=null}}this.saveGame()}this.backBufferIsDirty=true;this.paint()}}return result};function supports_html5_storage(){try{return "localStorage" in window&&window["localStorage"]!==null}catch(e){return false}}this.savePuzzle=function(){if(this.useStorage){localStorage[this.SAVE_SUDOKU_PUZZLE]=true;localStorage.removeItem(this.SAVE_SUDOKU_GAME);for(var i=0;i<81;i++){localStorage[this.SAVE_SUDOKU_PUZZLE_PREFIX+i]=this.game[i];localStorage.removeItem(this.SAVE_SUDOKU_GAME_PREFIX+i)}}};this.saveGame=function(){if(this.useStorage){localStorage[this.SAVE_SUDOKU_GAME]=true;for(var i=0;i<81;i++)if(this.game[i]<0)localStorage[this.SAVE_SUDOKU_GAME_PREFIX+i]=this.gameValues[i]}};this.clearSaves=function(){if(this.useStorage)for(var i=0;i<81;i++){localStorage.removeItem(this.SAVE_SUDOKU_PUZZLE);localStorage.removeItem(this.SAVE_SUDOKU_PUZZLE_PREFIX+i);localStorage.removeItem(this.SAVE_SUDOKU_GAME);localStorage.removeItem(this.SAVE_SUDOKU_GAME_PREFIX+i)}};this.checkComplete=function(){for(var i=0;i<81;i++)if(this.game[i]<0){if(this.gameValues[i]==0)return false;if(-this.game[i]!=this.gameValues[i])return false}this.clearSaves();return true}};var _sudoku=null;function ajaxErrorLoad(){alert("There was an ajax error loading the puzzle.")}function errorLoad(){alert("There was an error loading the puzzle.")}function resetPuzzle(){_sudoku!=null&&_sudoku.reset()}function onMouseDown(evt){_sudoku!=null&&_sudoku.mouseDownHandler(evt)}function onMouseMove(evt){_sudoku!=null&&_sudoku.mouseMoveHandler(evt)}function onMouseUp(evt){_sudoku!=null&&_sudoku.mouseUpHandler(evt)}function onScreenResize(){_sudoku!=null&&_sudoku.resizeScreen()}function loadSudokuGame(){_sudoku!=null&&$.ajax({url:"SudokuGame.aspx",success:completeSudokuGame,error:errorLoad,ajaxError:ajaxErrorLoad})}function completeSudokuGame(json){if(_sudoku!=null){var game=eval(json);_sudoku.loadPuzzle(game)}}function startSudokuRuntime(canvasID){var cvs=document.getElementById(canvasID);if(cvs!=null&&cvs.getContext){config=new Deltazon.config;config.canvasWidth=462;config.canvasHeight=540;config.canvasMainID="cvsMain";config.canvasBackID="cvsBack";config.compositeImageID="imgSudoku";config.backgroundWidth=462;config.backgroundHeight=540;config.backgroundSourceX=462;config.backgroundSourceY=0;config.backgroundStaticSourceX=462;config.backgroundStaticSourceY=42;config.tileWidth=42;config.tileHeight=42;config.tileSourceX=462;config.tileSourceY=[84,126,168,210,252,294,336,378,420];config.memoWidth=32;config.memoHeight=32;config.memoSourceX=462;config.memoSourceY=462;config.targetWidth=50;config.targetHeight=50;config.targetCoords=[2,52,102,156,206,256,310,360,410];config.pitTargetY=480;config.pitTargetX=[6,56,106,156,206,256,306,356,406];_sudoku=new Deltazon.Sudoku;_sudoku.initializeGame(config);var cvsMain=document.getElementById(config.canvasMainID);cvsMain.onmousedown=onMouseDown;cvsMain.onmousemove=onMouseMove;cvsMain.onmouseup=onMouseUp;cvsMain.touchstart=onMouseDown;cvsMain.touchmove=onMouseMove;cvsMain.touchend=onMouseUp;window.onresize=onScreenResize;!_sudoku.loadSaved()&&loadSudokuGame()}}
