var tetris={colors:["transparent","#ff6600","#ffff00","#0000ff","#cc00ff","#00ff00","#66ccff","#ff0000"],startAt:[0,-1,-1,-1,0,-1,-1,0],points:[0,40,100,300,1200],shapes:[[],[[[0,0,0,0],[1,1,1,1],[0,0,0,0],[0,0,0,0]],[[0,1,0,0],[0,1,0,0],[0,1,0,0],[0,1,0,0]]],[[[0,0,0,0],[1,1,1,0],[0,1,0,0],[0,0,0,0]],[[0,1,0,0],[1,1,0,0],[0,1,0,0],[0,0,0,0]],[[0,1,0,0],[1,1,1,0],[0,0,0,0],[0,0,0,0]],[[0,1,0,0],[0,1,1,0],[0,1,0,0],[0,0,0,0]]],[[[0,0,0,0],[1,1,1,0],[1,0,0,0],[0,0,0,0]],[[1,1,0,0],[0,1,0,0],[0,1,0,0],[0,0,0,0]],[[0,0,1,0],[1,1,1,0],[0,0,0,0],[0,0,0,0]],[[0,1,0,0],[0,1,0,0],[0,1,1,0],[0,0,0,0]]],[[[1,0,0,0],[1,1,1,0],[0,0,0,0],[0,0,0,0]],[[0,1,1,0],[0,1,0,0],[0,1,0,0],[0,0,0,0]],[[0,0,0,0],[1,1,1,0],[0,0,1,0],[0,0,0,0]],[[0,1,0,0],[0,1,0,0],[1,1,0,0],[0,0,0,0]]],[[[0,0,0,0],[1,1,0,0],[0,1,1,0],[0,0,0,0]],[[0,0,1,0],[0,1,1,0],[0,1,0,0],[0,0,0,0]]],[[[0,0,0,0],[0,1,1,0],[1,1,0,0],[0,0,0,0]],[[0,1,0,0],[0,1,1,0],[0,0,1,0],[0,0,0,0]]],[[[0,1,1,0],[0,1,1,0],[0,0,0,0],[0,0,0,0]]]],init:function(a,b){tetris.start_button=a;tetris.stop_button=b;$(tetris.start_button).click(tetris.start);$(tetris.stop_button).click(tetris.gameOver);tetris.cells=[];for(y=-3;y<18;++y){tetris.cells[y]=[];k=String.fromCharCode(y+97);for(x=1;x<11;++x){tetris.cells[y][x]=(y<0)?$():$("#"+k+x)}}},start:function(){tetris.level=0;tetris.lines=0;tetris.score=0;tetris.grid=[[1,0,0,0,0,0,0,0,0,0,0,1],[1,0,0,0,0,0,0,0,0,0,0,1],[1,0,0,0,0,0,0,0,0,0,0,1],[1,0,0,0,0,0,0,0,0,0,0,1],[1,0,0,0,0,0,0,0,0,0,0,1],[1,0,0,0,0,0,0,0,0,0,0,1],[1,0,0,0,0,0,0,0,0,0,0,1],[1,0,0,0,0,0,0,0,0,0,0,1],[1,0,0,0,0,0,0,0,0,0,0,1],[1,0,0,0,0,0,0,0,0,0,0,1],[1,0,0,0,0,0,0,0,0,0,0,1],[1,0,0,0,0,0,0,0,0,0,0,1],[1,0,0,0,0,0,0,0,0,0,0,1],[1,0,0,0,0,0,0,0,0,0,0,1],[1,0,0,0,0,0,0,0,0,0,0,1],[1,0,0,0,0,0,0,0,0,0,0,1],[1,0,0,0,0,0,0,0,0,0,0,1],[1,0,0,0,0,0,0,0,0,0,0,1],[1,1,1,1,1,1,1,1,1,1,1,1]];for(i=0;i<18;++i){for(j=1;j<11;++j){tetris.cells[i][j].removeClass("block").css("backgroundColor",tetris.colors[0])}}$(tetris.start_button).unbind("click").val("pause").click(tetris.pause);$(tetris.stop_button).attr("disabled","");$(tetris.bound).keydown(tetris.key);tetris.next=tetris.newShape();tetris.shift();tetris.duration=600;tetris.refresh();tetris.timer=window.setInterval(tetris.moveDown,tetris.duration);if(tetris.gameStartEvent){tetris.gameStartEvent()}},key:function(a){switch(a.charCode||a.keyCode){case 37:tetris.moveLeft();break;case 39:tetris.moveRight();break;case 40:tetris.moveDown();break;case 38:tetris.rotate();break}},newShape:function(){var a=1+Math.random()*7;return parseInt(a>7?7:a,10)},setNext:function(){var b,a,e,g,f;tetris.next=tetris.newShape();e=tetris.shapes[tetris.next][0];g=tetris.colors[tetris.next];for(b=0;b<4;++b){for(a=0;a<4;++a){f=e[b][a]?g:tetris.colors[0];$(["#x",a,b].join("")).css("backgroundColor",f);if(e[b][a]){$(["#x",a,b].join("")).addClass("block")}else{$(["#x",a,b].join("")).removeClass("block")}}}},shift:function(){tetris.cur=tetris.next;tetris.x=tetris.x0=4;tetris.y=tetris.startAt[tetris.cur];tetris.y0=tetris.y-2;tetris.r=tetris.r0=0;tetris.curShape=tetris.shapes[tetris.cur];if(!tetris.canGo(0,tetris.x,tetris.y)){return false}tetris.setNext();return true},pause:function(){$(tetris.bound).unbind("keydown");window.clearInterval(tetris.timer);tetris.timer=null;$(tetris.start_button).unbind("click").val("resume").click(tetris.resume)},resume:function(){$(tetris.bound).keydown(tetris.key);tetris.timer=window.setInterval(tetris.moveDown,tetris.duration);$(tetris.start_button).unbind("click").val("pause").click(tetris.pause)},gameOver:function(){var b,a;if(tetris.timer){$(tetris.bound).unbind("keydown");window.clearInterval(tetris.timer);tetris.timer=null}$(tetris.start_button).unbind("click").val("start").click(tetris.start);$(tetris.stop_button).attr("disabled","disabled");for(b=0;b<18;++b){for(a=1;a<11;++a){if(tetris.grid[b][a]){tetris.cells[b][a].css("backgroundColor","#ffffff")}}}tetris.draw(tetris.r0,tetris.x0,tetris.y0,"#ffffff");if(tetris.gameOverEvent){tetris.gameOverEvent()}},canGo:function(d,a,e){var c,b;for(c=0;c<4;++c){for(b=0;b<4;++b){if(tetris.curShape[d][b][c]&&tetris.grid[e+b]&&tetris.grid[e+b][a+c]){return false}}}return true},moveX:function(a){if(!tetris.canGo(tetris.r,tetris.x+a,tetris.y)){return}tetris.x+=a;tetris.refresh()},moveLeft:function(){tetris.moveX(-1)},moveRight:function(){tetris.moveX(1)},rotate:function(){var a=tetris.r==tetris.curShape.length-1?0:tetris.r+1;if(!tetris.canGo(a,tetris.x,tetris.y)){return}tetris.r0=tetris.r;tetris.r=a;tetris.refresh()},moveDown:function(){if(!tetris.canGo(tetris.r,tetris.x,tetris.y+1)){tetris.touchDown();return}++tetris.y;tetris.refresh()},touchDown:function(){var d,c,a,e;for(d=0;d<4;++d){for(c=0;c<4;++c){if(tetris.curShape[tetris.r][c][d]&&tetris.grid[tetris.y+c]){tetris.grid[tetris.y+c][tetris.x+d]=tetris.cur}}}var b=0;for(d=17,a=17;d>-1&&b<4;--d,--a){if(tetris.grid[d].join("").indexOf("0")>-1){continue}for(c=1;c<11;++c){tetris.cells[a][c].css("backgroundColor","#ffffff")}b++;for(c=d;c>0;--c){tetris.grid[c]=tetris.grid[c-1].concat()}++d}if(b>0){window.clearInterval(tetris.timer);tetris.timer=window.setTimeout(function(){tetris.after(b)},100)}if(!tetris.shift()){tetris.gameOver();return}tetris.refresh()},after:function(e){var c,b,a=(tetris.level<20?tetris.level:20)*25;tetris.lines+=e;if(tetris.linesChangedEvent){tetris.linesChangedEvent()}tetris.score+=tetris.points[e]*(tetris.level+1);if(tetris.scoreChangedEvent){tetris.scoreChangedEvent()}var d=tetris.level;tetris.level=Math.floor(tetris.lines/10);if(tetris.levelChangedEvent&&tetris.level!=d){tetris.levelChangedEvent()}window.clearTimeout(tetris.timer);tetris.timer=window.setInterval(tetris.moveDown,tetris.duration-a);for(c=0;c<18;++c){for(b=1;b<11;++b){tetris.cells[c][b].css("backgroundColor",tetris.colors[tetris.grid[c][b]]);if(tetris.grid[c][b]){tetris.cells[c][b].addClass("block")}else{tetris.cells[c][b].removeClass("block")}}}tetris.refresh()},draw:function(e,a,g,f){for(var d=0;d<4;++d){for(var b=0;b<4;++b){if(tetris.curShape[e][b][d]){tetris.cells[g+b][a+d].addClass("block").css("backgroundColor",f)}}}},remove:function(b,a,c){for(i=0;i<4;++i){for(j=0;j<4;++j){if(tetris.curShape[b][j][i]){tetris.cells[c+j][a+i].removeClass("block").css("backgroundColor",tetris.colors[0])}}}},refresh:function(){tetris.remove(tetris.r0,tetris.x0,tetris.y0);tetris.x0=tetris.x;tetris.y0=tetris.y;tetris.r0=tetris.r;tetris.draw(tetris.r,tetris.x,tetris.y,tetris.colors[tetris.cur])},scoreChangedEvent:null,linesChangedEvent:null,levelChangedEvent:null,gameStartEvent:null,gameOverEvent:null};