// to do next
// preload images
// left, right, turn, and redraw

document.onkeypress = keyhandler;

var maxx=10;
var maxy=21;
var miniscore=3;

var grid=new Array(maxx);
var shadow=new Array(maxx);
var scgs=new Array(9);
var scdigs=new Array(4);
var stgs=new Array(2);
var bings=new Array(26);
var piece=new Array(2);
var px=0;
var py=0;
var level=3;
var pcount=0;
var droprate=0;
var found=false;
var score=0;
var lastscore=0;
var pscore=0;
var allowmove=false;
var gamemode=0;
var checksum=0;
var now;

for (i=0; i<=26; i++) {
 bings[i]=new Image();
 bings[i].src=bing(i);
}
for (i=0; i<=9; i++) {
 scgs[i]=new Image();
 scgs[i].src=scg(i);
}
for (i=0; i<=2; i++)
 stgs[i]=new Image();
stgs[0].src="glyphs/dstop.gif";
stgs[1].src="glyphs/dplay.gif";
stgs[2].src="glyphs/dpause.gif";
for (i=0; i<=maxx; i++) {
 grid[i]=new Array(maxy);
 shadow[i]=new Array(maxy);
};

function bing(id) {
 return "glyphs/c"+id+".gif";
}

function scg(id) {
 return "glyphs/d"+id+".gif";
}

function keyhandler(e) {
 var key=0;
 if (navigator.appName == "Microsoft Internet Explorer")
  key = window.event.keyCode;
 else
  key = e.which;
 if ((key==122) || (key==90)) Left();
 if ((key==120) || (key==88)) Right();
 if ((key==109) || (key==77)) Drop();
 if ((key==107) || (key==75)) Turn();
 if (key==49) Pause();
 if (key==50) UnPause();
}

function Prepare() {
 document.getElementById("UISubmitScoreButton").style.color="#440000";
 for (y=1; y<=maxy; y++)
  for (x=1;x<maxx; x++)
   grid[x][y]=0;
// PaintGrid();
}

function NewGame() {
 for (y=1; y<=maxy; y++)
  for (x=1; x<maxx; x++)
   grid[x][y]=0;
 pcount=0;
 score=-miniscore;
 spepiece=0;
 NewPiece();
 PaintGrid();
 gamemode=1;
 document.getElementById("UISubmitScoreButton").style.color="#440000";
 document.getElementById("UINewGameButton").style.color="#440000";
 PaintStatus();
}

function EndGame() {
 gamemode=0;
 checksum=Math.floor(Math.random()*10000000);
 now=new Date();
 PaintStatus();
 for (y=1; y<=maxy; y++)
  for (x=1; x<maxx; x++)
   grid[x][y]=18;
 PaintGrid();
 document.getElementById("UISubmitScoreButton").style.color="#ff0000";
 document.getElementById("UINewGameButton").style.color="#ff0000";
}

function Left() {
 if ((allowmove==false) || (gamemode!=1)) return;
 if ((px>1) && (grid[px-1][py]==0) && (grid[px-1][py+1]==0) && (grid[px-1][py+2]==0)) {
  ErasePiece();
  px-=1;
  PaintPiece();
 }
}

function Right() {
 if ((allowmove==false) || (gamemode!=1)) return;
 if ((px<(maxx-1)) && (grid[px+1][py]==0) && (grid[px+1][py+1]==0) && (grid[px+1][py+2]==0)) {
  ErasePiece();
  px+=1;
  PaintPiece();
 }
}

function Turn() {
 if ((allowmove==false) || (gamemode!=1)) return;
 tp = piece[0];
 piece[0]=piece[1];
 piece[1]=piece[2];
 piece[2]=tp;
 PaintPiece();
}

function Drop() {
 if ((allowmove==false) || (gamemode!=1)) return;
 droprate=10;
}

function Pause() {
 if (gamemode==1) {
  gamemode=2;
  PaintStatus();
  allowmove=false;
 }
}

function UnPause() {
 if (gamemode==2) {
  gamemode=1;
  allowmove=true;
  PaintStatus();
 }
}

function Down() {
 if ((py>1) && (grid[px][py-1]==0)) {
  ErasePiece();
  if (gamemode==1) py-=1;
  PaintPiece();
  setTimeout("Down()",droprate);
 }
 else {
  allowmove=false;
  for (i=0; i<=2; i++)
   grid[px][py+i]=piece[i];
  ScanGrid();
 }
}

function TryBomb(x,y) {
 if ((x>0) && (x<maxx) && (y>0) && (y<=maxy)) {
  shadow[x][y]=1;
  grid[x][y]=24;
 }
}

function ScanGrid() {
 found=false;
// clear shadow buffer
 for (y=1; y<=maxy; y++)
  for (x=1; x<maxx; x++)
   shadow[x][y]=0;
// check for specials
 for (y=1; y<=maxy; y++)
  for (x=1; x<maxx; x++) {
   if ((grid[x][y]==24) && (shadow[x][y]==0)) {
    for (xx=x-1; xx<=x+1; xx++)
     for (yy=y-1; yy<=y+1; yy++)
      TryBomb(xx,yy);
    TryBomb(x-2,y);
    TryBomb(x+2,y);
    TryBomb(x,y-2);
    TryBomb(x,y+2);
    found=true;
   }
   if ((grid[x][y]==22) && (shadow[x][y]==0)) {
    for (xx=1; xx<maxx; xx++) {
     shadow[xx][y]=1;
     grid[xx][y]=22;
    }
    found=true;
   }
   if ((grid[x][y]==23) && (shadow[x][y]==0)) {
    under=grid[x][y-1];
    for (xx=1; xx<maxx; xx++)
     for (yy=1; yy<=maxy; yy++)
      if (grid[xx][yy]==under) {
       grid[xx][yy]=23;
       shadow[xx][yy]=1;
      }
    found=true;
    shadow[x][y]=1;
   }
   if ((grid[x][y]==19) && (shadow[x][y]==0)) {
    under=grid[x][y-1];
    for (xx=1; xx<maxx; xx++)
     for (yy=1; yy<=maxy; yy++)
      if (grid[xx][yy]==under)
       if (Math.random()<0.4) grid[xx][yy]=18;
    found=true;
    grid[x][y]=18;
   }
   if (grid[x][y]==20) {
    grid[x][1]==20;
    found=true;
    shadow[x][y]=1;
    shadow[x][1]=1;
   }
  }
// check for lines
 for (x=1; x<maxx; x++)
  for (y=1; y<=maxy; y++) {
   if ((grid[x][y]==grid[x-1][y]) && (grid[x][y]==grid[x+1][y]) && (grid[x][y]!=0) && (grid[x][y]<18)) {
    shadow[x][y]=1;
    shadow[x-1][y]=1;
    shadow[x+1][y]=1;
    found=true;
   };
   if ((grid[x][y]==grid[x][y-1]) && (grid[x][y]==grid[x][y+1]) && (grid[x][y]!=0) && (grid[x][y]<18)) {
    shadow[x][y]=1;
    shadow[x][y-1]=1;
    shadow[x][y+1]=1;
    found=true;
   };
   if ((grid[x][y]==grid[x-1][y-1]) && (grid[x][y]==grid[x+1][y+1]) && (grid[x][y]!=0) && (grid[x][y]<18)) {
    shadow[x][y]=1;
    shadow[x-1][y-1]=1;
    shadow[x+1][y+1]=1;
    found=true;
   };
   if ((grid[x][y]==grid[x+1][y-1]) && (grid[x][y]==grid[x-1][y+1]) && (grid[x][y]!=0) && (grid[x][y]<18)) {
    shadow[x][y]=1;
    shadow[x-1][y+1]=1;
    shadow[x+1][y-1]=1;
    found=true;
   };
  }
 if (found==true) SmileyGrid()
 else NewPiece();
}

function SmileyGrid() {
 agrid=0;
 for (y=1; y<=maxy; y++)
  for (x=1; x<maxx; x++)
   if (shadow[x][y]==1) {
    agrid=grid[x][y];
    if (agrid<17) {
     ascore+=1;
     if (agrid>=11) ascore+=1;
     if (agrid>=14) ascore+=1;
     if (agrid>=16) ascore+=1;
     grid[x][y]=25;
    }
   }
 pscore=(ascore*ascore);
 score=lastscore+pscore;
 PaintScore();
 PaintGrid();
 setTimeout("ZapGrid()",100);
}

function ZapGrid() {
 for (y=1; y<=maxy; y++)
  for (x=1; x<maxx; x++)
   if (shadow[x][y]==1) grid[x][y]=26;
 PaintGrid();
 setTimeout("GravGrid()",100);
}

function GravGrid() {
 for (x=1; x<maxx; x++)
  for (y=1; y<maxy; y++)
   while (grid[x][y]==26)
    for (z=y; z<maxy; z++) {
     grid[x][z]=grid[x][z+1];
     grid[x][maxy]=0;
    };
 PaintGrid();
 if (found==true) setTimeout("ScanGrid()",100)
 else NewPiece();
}

function NewPiece() {
 px=maxx/2;
 py=maxy-2;
 if (grid[px][py]!=0) EndGame()
 else {
  pcount+=1;
  level=Math.floor(pcount/9)+4;
  if (level>18) level=18;
  {
   for (i=0; i<=2; i++)
    piece[i]=NewPieceBit();
   if (Math.random()>0.9) {
    a=Math.random();
    if (a<0.2) piece[0]=22
    else if (a<0.55) piece[0]=23
    else if (a<0.8) piece[0]=20
    else piece[0]=24;
   };
   if ((level>6) && (Math.random()>0.90)) piece[1]=18;
   if ((level>13) && (Math.random()>0.95)) piece[2]=19;
  };
  droprate=350-level*15;
  setTimeout("Down()",droprate);
  PaintPiece();
  allowmove=true;
  score+=miniscore;
  lastscore=score;
  ascore=0;
  PaintScore();
 }
}

function NewPieceBit() {
 return Math.ceil(Math.random()*level)
}

function PaintGrid() {
 for (y=1; y<=maxy; y++)
  for (x=1; x<maxx; x++)
   PaintGlyph(x,y,grid[x][y]);
}

function PaintPiece() {
 for (i=0; i<=2; i++)
  PaintGlyph(px,py+i,piece[i]);
}

function ErasePiece() {
 for (i=0; i<=2; i++)
  PaintGlyph(px,py+i,0);
}

function PaintGlyph(x,y,z) {
 xelement=document.getElementById("x"+x+"y"+y);
 if (xelement.src != bings[z].src)
  xelement.src=bings[z].src;
}

function PaintScore() {
 q=score;
 scdigs[0]=Math.floor(q/10000);
 q=q-scdigs[0]*10000;
 scdigs[1]=Math.floor(q/1000);
 q=q-scdigs[1]*1000;
 scdigs[2]=Math.floor(q/100);
 q=q-scdigs[2]*100;
 scdigs[3]=Math.floor(q/10);
 q=q-scdigs[3]*10;
 scdigs[4]=q;
 for (i=0; i<=4; i++) {
  xelement=document.getElementById("s"+i);
  xelement.src=scgs[scdigs[i]].src;
 };
 q=pscore;
 scdigs[0]=Math.floor(q/1000);
 q=q-scdigs[0]*1000;
 scdigs[1]=Math.floor(q/100);
 q=q-scdigs[1]*100;
 scdigs[2]=Math.floor(q/10);
 q=q-scdigs[2]*10;
 scdigs[3]=q;
 for (i=0; i<=3; i++) {
  xelement=document.getElementById("p"+i);
  xelement.src=scgs[scdigs[i]].src;
 };
 q=level-3;
 scdigs[0]=Math.floor(q/10);
 q=q-scdigs[0]*10;
 scdigs[1]=q;
 for (i=0; i<=1; i++) {
  xelement=document.getElementById("l"+i);
  xelement.src=scgs[scdigs[i]].src;
 };
}

function PaintStatus() {
 xelement=document.getElementById("status");
 xelement.src=stgs[gamemode].src;
}

function UINewGame() {
 if (gamemode==0) NewGame();
}

function UIHelp() {
 help=window.open("help.shtml","help","");
}

function UISubmitScore() {
 if ((score>0) && (gamemode==0)) {
  document.getElementById("UISubmitScoreButton").style.color="#440000";
  mysubmitname=document.getElementById("submitname").value;
  if (now==null) now=new Date();
  days=now.getDate();
  mont=now.getMonth()+1;
  year=now.getYear();
  hour=now.getHours();
  mins=now.getMinutes();
  cdate=""+((days<10)?"0":"")+days+"/";
  cdate+=((mont<10)?"0":"")+mont+"/";
  cdate+=year+" ";
  cdate+=((hour<10)?"0":"")+hour+":";
  cdate+=((mins<10)?"0":"")+mins;
  action="http://pinkmongoose.co.uk/cgi-bin/submitscore.cgi?";
  action+="submitname="+escape(mysubmitname);
  action+="&submitdate="+escape(cdate)+"&checksum=";
  action+=escape(checksum)+"&submitscore="+escape(score);
  wsubmitted=window.open(action,"submitted", "toolbar=no,menubar=no,resizable=no,scrollbars=no,width=250,height=150");
 }
}

function UIViewScores() {
 scores=window.open("highscores.shtml","highscores","");
}

