var sc;
var li;
var lvl;
var spin;
var shape;
var speed;
var dropId;
var exId;
var gameon = 0;
var nxtshape;
var full;
var filled = new Array(4);
var col;
var run;
var running = 1;
var offon = new Array("Exercise: Off", "Exercise: On");
var count = new Array(21);
var coords = new Array(8);
var board = new Array(264);
var points = new Array(0, 400, 1000, 3000, 12000);
var data = new Array(0, -1, 0, 1, 0, 2, -1, 0, 1, 0, 2, 0, 0, -1, 0, 1, 0, -2, 1, 0, -1, 0, -2, 0,
                     0, 1, 0, -1, 1, -1, 1, 0, -1, 0, -1, -1, 0, -1, 0, 1, -1, 1, -1, 0, 1, 0, 1, 1,
                     0, -1, 0, 1, 1, 1, -1, 0, 1, 0, 1, -1, 0, 1, 0, -1, -1, -1, 1, 0, -1, 0, -1, 1,
                     0, -1, 1, 0, 1, 1, -1, 0, 0, -1, 1, -1, 0, 1, -1, 0, -1, -1, 1, 0, 0, 1, -1, 1,
                     0, 1, 1, 0, 1, -1, 1, 0, 0, -1, -1, -1, 0, -1, -1, 0, -1, 1, -1, 0, 0, 1, 1, 1,
                     0, 1, 1, 0, 0, -1, 1, 0, 0, -1, -1, 0, 0, -1, -1, 0, 0, 1, -1, 0, 0, 1, 1, 0,
                     0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0);
function Block(a,b) {
  this.dx=a;
  this.dy=b;
}
function BlockObj() {
  this.Blocks = new Array(4);
}
function SpinObj() {
  this.Spins = new Array(4);
}
var Shapes = new Array(7);
shape=0;
for (iloop=0; iloop<7; iloop++) {
  Shapes[iloop]=new SpinObj();
  for (jloop=0; jloop<4; jloop++) {
    Shapes[iloop].Spins[jloop]=new BlockObj();
    for (kloop=1; kloop<4; kloop++) {
      Shapes[iloop].Spins[jloop].Blocks[kloop] = new Block(data[shape],data[shape+1]);
      shape+=2;
    }
  }
}
var bId = new Array;
for (iloop=1; iloop<21; iloop++) {
  for (jloop=1; jloop<11; jloop++) {
    bId[iloop*12+jloop]="b"+iloop+"_"+jloop;
  }
}
for (iloop=0; iloop<22; iloop++) {
  board[iloop*12]=1;
  board[iloop*12+11]=1;
}
for (jloop=1; jloop<11; jloop++) {
  board[jloop]=1;
  board[jloop+252]=1;
}
function draw() {
  for (iloop=0; iloop<4; iloop++) {
    document.getElementById("m"+iloop).style.top=coords[iloop*2]*20+"px";
    document.getElementById("m"+iloop).style.left=coords[iloop*2+1]*20+"px";
  }
}
function set() {
  for (iloop=0; iloop<4; iloop++) {
    document.getElementById(bId[(coords[iloop*2])*12+coords[iloop*2+1]]).style.backgroundImage =
      "url(caloris/cal"+shape+".gif)";
  }
}
function drawnxt() {
  for (iloop=1; iloop<3; iloop++) {
    for (jloop=1; jloop<5; jloop++) {
      document.getElementById("n"+iloop+"_"+jloop).style.backgroundImage = "url(caloris/cal204.gif)";
    }
  }
  document.getElementById("n1_2").style.backgroundImage = "url(caloris/cal"+nxtshape+".gif)";
  for (iloop=1; iloop<4; iloop++) {
    document.getElementById("n"+(1+Shapes[nxtshape].Spins[0].Blocks[iloop].dx)+"_"
      +(2+Shapes[nxtshape].Spins[0].Blocks[iloop].dy)).style.backgroundImage = "url(caloris/cal"+nxtshape+".gif)";
  }
}
function next() {
  shape=nxtshape;
  spin=0;
  nxtshape=Math.floor(Math.random()*7);
  drawnxt();
  coords[0]=1;
  coords[1]=5;
  for (iloop=1; iloop<4; iloop++) {
    coords[iloop*2]=1+Shapes[shape].Spins[0].Blocks[iloop].dx;
    coords[iloop*2+1]=5+Shapes[shape].Spins[0].Blocks[iloop].dy;
  }
  draw();
  for (iloop=0; iloop<4; iloop++) {
    document.getElementById("m"+iloop).style.backgroundImage = "url(caloris/cal"+shape+".gif)";
  }
  var done=0;
  for (iloop=0; iloop<4; iloop++) {
    if (board[coords[iloop*2]*12+coords[iloop*2+1]]<10) done=1;
  }
  if (done==1) {
    gameon=0;
    document.getElementById("end").firstChild.nodeValue = sc;
    document.getElementById("go").style.visibility = "visible";
  }
}
function Move(dir) {
  if (gameon==0) return;
  var done=0
  for (iloop=0; iloop<4; iloop++) {
    if (board[coords[iloop*2]*12+coords[iloop*2+1]+dir]<10) done=1;
  }
  if (done) return;
  for (iloop=0; iloop<4; iloop++) {
    coords[iloop*2+1]+=dir;
  }
  draw();
}
function Turn(dir) {
  if (gameon==0) return;
  var tmpspin=(spin+dir);
  if (tmpspin==4) tmpspin=0;
  if (tmpspin==-1) tmpspin=3;
  var done=0;
  for (iloop=1; iloop<4; iloop++) {
    if (board[(coords[0]+Shapes[shape].Spins[tmpspin].Blocks[iloop].dx)*12
      +coords[1]+Shapes[shape].Spins[tmpspin].Blocks[iloop].dy]<10) done=1;
  }
  if (done) return;
  spin=tmpspin;
  for (iloop=1; iloop<4; iloop++) {
    coords[iloop*2]=coords[0]+Shapes[shape].Spins[spin].Blocks[iloop].dx;
    coords[iloop*2+1]=coords[1]+Shapes[shape].Spins[spin].Blocks[iloop].dy;
  }
  draw();
}
function shoonk() {
  iloop=21;
  done=0;
  while (done==0) {
    done=1;
    iloop--;
    if (iloop>0) {
      if (count[iloop]<10) done=0;
    }
  }
  if (iloop>1) {
    kloop=iloop-1;
    while (kloop>0) {
      if (count[kloop]<10) {
        for (jloop=1; jloop<11; jloop++) {
          board[iloop*12+jloop]=board[kloop*12+jloop];
          document.getElementById(bId[iloop*12+jloop]).style.backgroundImage =
            document.getElementById(bId[kloop*12+jloop]).style.backgroundImage;
          board[kloop*12+jloop]=10;
          document.getElementById(bId[kloop*12+jloop]).style.backgroundImage = "url(caloris/cal204.gif)";
        }
        count[iloop]=count[kloop];
        count[kloop]=10;
        iloop--;
      }
      kloop--;
    }
  }
  sc+=points[full];
  document.getElementById("sc").firstChild.nodeValue=sc;
  li+=full;
  document.getElementById("li").firstChild.nodeValue=li;
  if (Math.floor(li/10)>(Math.floor((li-full)/10))) {
    lvl++;
    speed=Math.max(100,speed-100);
    document.getElementById("le").firstChild.nodeValue=lvl;
  }
  if (run==1) {
    gameon=1;
    for (iloop=0; iloop<4; iloop++) {
      document.getElementById("m"+iloop).style.visibility = "visible";
    }
    dropId=window.setTimeout("drop();", speed);
  }
  next();
}
function exercise() {
  col++;
  for (iloop=0; iloop<full; iloop++) {
    document.getElementById(bId[filled[iloop]*12+col-1]).style.backgroundImage = "url(caloris/cal204.gif)";
    if (col!=11) document.getElementById(bId[filled[iloop]*12+col]).style.backgroundImage = "url(caloris/calex.gif)";
  }
  if (col!=11) exId=window.setTimeout("exercise();", 250);
  else shoonk();
}
function Down() {
  if (gameon==0) return;
  var done=0;
  for (iloop=0; iloop<4; iloop++) {
    if (board[(coords[iloop*2]+1)*12+coords[iloop*2+1]]<10) done=1;
  }
  if (done!=1) {
    for (iloop=0; iloop<4; iloop++) {
      coords[iloop*2]++;
    }
    draw();
  }
  else {
    set();
    sc=sc+1;
    document.getElementById("sc").firstChild.nodeValue=sc;
    for (iloop=0; iloop<4; iloop++) {
      board[coords[iloop*2]*12+coords[iloop*2+1]]=shape;
      count[coords[iloop*2]]--;
    }
    full=0;
    for (iloop=1; iloop<21; iloop++) {
      if (count[iloop]==0) {
        filled[full]=iloop;
        full++;
        count[iloop]=10;
        for (jloop=1; jloop<11; jloop++) {
          board[iloop*12+jloop]=10;
          if (running==0) document.getElementById(bId[iloop*12+jloop]).style.backgroundImage = "url(caloris/cal204.gif)";
        }
        if (running==1) document.getElementById(bId[iloop*12+1]).style.backgroundImage = "url(caloris/calex.gif)";
      }
    }
    if (full!=0) {
      run = 0;
      if (running==1) {
        run = 1;
        gameon=0;
        for (iloop=0; iloop<4; iloop++) {
          document.getElementById("m"+iloop).style.visibility = "hidden";
        }
        window.clearTimeout(dropId);
        col=1;
        exId=window.setTimeout("exercise();", 250);
      }
      else shoonk();
    }
    else next();
  }
}
function drop() {
  if (gameon==0) return;
  Down();
  dropId=window.setTimeout("drop();", speed);
}
function runoffon() {
  var c;
  running = 1-running;
  c = "url(caloris/calex" + running + ".gif)";
  document.getElementById("runner").style.backgroundImage = c;
  document.getElementById("exonoff").firstChild.nodeValue = offon[running];
}
function getKey(e) {
  if (e.keyCode) keycode=e.keyCode;
  else keycode=e.which;
  switch (keycode) {
  case 112:
    alert("Pause");
    break;
  case 114:
    Start();
    break;
  case 49:
    Move(-1);
    break;
  case 50:
    Down();
    break;
  case 51:
    Move(1);
    break;
  case 44:
    Turn(-1);
    break;
  case 46:
    Turn(1);
    break;
  case 48:
    Turn(1);
    break;
  case 53:
    Turn(-1);
    break;
  }
}
function Start() {
  document.getElementById("go").style.visibility = "hidden";
  for (iloop=1; iloop<21; iloop++) {
    for (jloop=1; jloop<11; jloop++) {
      board[iloop*12+jloop]=10;
      document.getElementById(bId[iloop*12+jloop]).style.backgroundImage = "url(caloris/cal204.gif)";
    }
    count[iloop]=10;
  }
  window.clearTimeout(dropId);
  window.clearTimeout(exId);
  sc=0;
  document.getElementById("sc").firstChild.nodeValue=sc;
  li=0;
  document.getElementById("li").firstChild.nodeValue=li;
  lvl=0;
  document.getElementById("le").firstChild.nodeValue=lvl;
  speed=1000;
  gameon=1;
  for (iloop=0; iloop<4; iloop++) {
    document.getElementById("m"+iloop).style.visibility = "visible";
  }
  nxtshape=Math.floor(Math.random()*7);
  next();
  dropId=window.setTimeout("drop();", speed);
}