var IE = document.all;
var moving = 0;
var moveD = -204;
var mX = 0;
var mY = 0;
var dX = new Array(30);
var dY = new Array(30);
var dMAX = new Array(30);
var clumps = new Array(30);
var score = 0;
var done = 0;

for (i=0; i<30; i++) {
  clumps[i] = new Array(31);
  for (j=1; j<31; j++) {
    clumps[i][j] = -204;
  }
  clumps[i][0] = i;
  dX[i] = 0;
  dY[i] = 0;
  dMAX[i] = 1;
}

function drag(d) {
  var tD = "";
  moving = 1-moving;
  if (moving==1) {
    if (moveD!=-204) {
      for (i=0; i<dMAX[moveD]; i++) {
        tD = "d"+clumps[moveD][i];
        document.getElementById(tD).style.zIndex = "";
      }
    }
    moveD = d;
    if (pieces[moveD*3+2]==1) score -= dMAX[moveD];
    for (i=0; i<dMAX[moveD]; i++) {
      tD = "d"+clumps[moveD][i];
      document.getElementById(tD).style.zIndex = 1;
      document.getElementById(tD).style.cursor = "move";
      dX[i] = parseInt(document.getElementById(tD).style.left);
      dY[i] = parseInt(document.getElementById(tD).style.top);
      pieces[clumps[moveD][i]*3+2] = 0;
    }
  }
  else {
    for (i=0; i<dMAX[moveD]; i++) {
      tD = "d"+clumps[moveD][i];
      document.getElementById(tD).style.cursor = "hand";
    }
    var tS = dMAX[moveD];
    var found = 0;
    var tM;
    var tX = 0;
    var tY = 0;
    if (moveD>5) {
      for (i=0; i<dMAX[moveD]; i++) {
        if (clumps[moveD][i]==moveD-6) found = 1;
      }
      tD = "d"+(moveD-6);
      tX = parseInt(document.getElementById(tD).style.left);
      tY = parseInt(document.getElementById(tD).style.top);
      if (found==0 && Math.abs(pieces[moveD*3]-pieces[(moveD-6)*3]-dX[0]+tX)<10 && 
          Math.abs(pieces[moveD*3+1]-pieces[(moveD-6)*3+1]-dY[0]+tY)<10) {
        tM = dMAX[moveD];
        for (i=0; i<tM; i++) {
          tD = "d"+clumps[moveD][i];
          document.getElementById(tD).style.left = parseInt(document.getElementById(tD).style.left) + pieces[moveD*3]-pieces[(moveD-6)*3]-dX[0]+tX + "px";
          document.getElementById(tD).style.top = parseInt(document.getElementById(tD).style.top) + pieces[moveD*3+1]-pieces[(moveD-6)*3+1]-dY[0]+tY + "px";
          for (j=0; j<dMAX[moveD-6]; j++) {
            clumps[clumps[moveD][i]][dMAX[clumps[moveD][i]]] = clumps[moveD-6][j];
            dMAX[clumps[moveD][i]]++;
          }
        }
        tD = "d"+moveD;
        dX[0] = parseInt(document.getElementById(tD).style.left);
        dY[0] = parseInt(document.getElementById(tD).style.top);
        tX = dMAX[moveD-6];
        for (i=0; i<tX; i++) {
          for (j=0; j<tM; j++) {
            clumps[clumps[moveD-6][i]][dMAX[clumps[moveD-6][i]]] = clumps[moveD][j];
            dMAX[clumps[moveD-6][i]]++;
          }
        }
      }
    }
    if (moveD<24) {
      found = 0;
      for (i=0; i<dMAX[moveD]; i++) {
        if (clumps[moveD][i]==moveD+6) found = 1;
      }
      tD = "d"+(moveD+6);
      tX = parseInt(document.getElementById(tD).style.left);
      tY = parseInt(document.getElementById(tD).style.top);
      if (found==0 && Math.abs(pieces[moveD*3]-pieces[(moveD+6)*3]-dX[0]+tX)<10 && 
          Math.abs(pieces[moveD*3+1]-pieces[(moveD+6)*3+1]-dY[0]+tY)<10) {
        tM = dMAX[moveD];
        for (i=0; i<tM; i++) {
          tD = "d"+clumps[moveD][i];
          document.getElementById(tD).style.left = parseInt(document.getElementById(tD).style.left) + pieces[moveD*3]-pieces[(moveD+6)*3]-dX[0]+tX + "px";
          document.getElementById(tD).style.top = parseInt(document.getElementById(tD).style.top) + pieces[moveD*3+1]-pieces[(moveD+6)*3+1]-dY[0]+tY + "px";
          for (j=0; j<dMAX[moveD+6]; j++) {
            clumps[clumps[moveD][i]][dMAX[clumps[moveD][i]]] = clumps[moveD+6][j];
            dMAX[clumps[moveD][i]]++;
          }
        }
        tD = "d"+moveD;
        dX[0] = parseInt(document.getElementById(tD).style.left);
        dY[0] = parseInt(document.getElementById(tD).style.top);
        tX = dMAX[moveD+6];
        for (i=0; i<tX; i++) {
          for (j=0; j<tM; j++) {
            clumps[clumps[moveD+6][i]][dMAX[clumps[moveD+6][i]]] = clumps[moveD][j];
            dMAX[clumps[moveD+6][i]]++;
          }
        }
      }
    }
    if (Math.floor(moveD/6)!=moveD/6) {
      found = 0;
      for (i=0; i<dMAX[moveD]; i++) {
        if (clumps[moveD][i]==moveD-1) found = 1;
      }
      tD = "d"+(moveD-1);
      tX = parseInt(document.getElementById(tD).style.left);
      tY = parseInt(document.getElementById(tD).style.top);
      if (found==0 && Math.abs(pieces[moveD*3]-pieces[(moveD-1)*3]-dX[0]+tX)<10 && 
          Math.abs(pieces[moveD*3+1]-pieces[(moveD-1)*3+1]-dY[0]+tY)<10) {
        tM = dMAX[moveD];
        for (i=0; i<tM; i++) {
          tD = "d"+clumps[moveD][i];
          document.getElementById(tD).style.left = parseInt(document.getElementById(tD).style.left) + pieces[moveD*3]-pieces[(moveD-1)*3]-dX[0]+tX + "px";
          document.getElementById(tD).style.top = parseInt(document.getElementById(tD).style.top) + pieces[moveD*3+1]-pieces[(moveD-1)*3+1]-dY[0]+tY + "px";
          for (j=0; j<dMAX[moveD-1]; j++) {
            clumps[clumps[moveD][i]][dMAX[clumps[moveD][i]]] = clumps[moveD-1][j];
            dMAX[clumps[moveD][i]]++;
          }
        }
        tD = "d"+moveD;
        dX[0] = parseInt(document.getElementById(tD).style.left);
        dY[0] = parseInt(document.getElementById(tD).style.top);
        tX = dMAX[moveD-1];
        for (i=0; i<tX; i++) {
          for (j=0; j<tM; j++) {
            clumps[clumps[moveD-1][i]][dMAX[clumps[moveD-1][i]]] = clumps[moveD][j];
            dMAX[clumps[moveD-1][i]]++;
          }
        }
      }
    }
    if (Math.floor((moveD+1)/6)!=(moveD+1)/6) {
      found = 0;
      for (i=0; i<dMAX[moveD]; i++) {
        if (clumps[moveD][i]==moveD+1) found = 1;
      }
      tD = "d"+(moveD+1);
      tX = parseInt(document.getElementById(tD).style.left);
      tY = parseInt(document.getElementById(tD).style.top);
      if (found==0 && Math.abs(pieces[moveD*3]-pieces[(moveD+1)*3]-dX[0]+tX)<10 && 
          Math.abs(pieces[moveD*3+1]-pieces[(moveD+1)*3+1]-dY[0]+tY)<10) {
        tM = dMAX[moveD];
        for (i=0; i<tM; i++) {
          tD = "d"+clumps[moveD][i];
          document.getElementById(tD).style.left = parseInt(document.getElementById(tD).style.left) + pieces[moveD*3]-pieces[(moveD+1)*3]-dX[0]+tX + "px";
          document.getElementById(tD).style.top = parseInt(document.getElementById(tD).style.top) + pieces[moveD*3+1]-pieces[(moveD+1)*3+1]-dY[0]+tY + "px";
          for (j=0; j<dMAX[moveD+1]; j++) {
            clumps[clumps[moveD][i]][dMAX[clumps[moveD][i]]] = clumps[moveD+1][j];
            dMAX[clumps[moveD][i]]++;
          }
        }
        tD = "d"+moveD;
        dX[0] = parseInt(document.getElementById(tD).style.left);
        dY[0] = parseInt(document.getElementById(tD).style.top);
        tX = dMAX[moveD+1];
        for (i=0; i<tX; i++) {
          for (j=0; j<tM; j++) {
            clumps[clumps[moveD+1][i]][dMAX[clumps[moveD+1][i]]] = clumps[moveD][j];
            dMAX[clumps[moveD+1][i]]++;
          }
        }
      }
    }
    if (Math.abs(dX[0]-pieces[d*3])<10 && Math.abs(dY[0]-pieces[d*3+1])<10) {
      for (i=0; i<dMAX[moveD]; i++) {
        tD = "d"+clumps[moveD][i];
        document.getElementById(tD).style.left = pieces[clumps[moveD][i]*3] + "px";
        document.getElementById(tD).style.top = pieces[clumps[moveD][i]*3+1] + "px";
        pieces[clumps[moveD][i]*3+2] = 1;
      }
      score += tS;
    }
    if (score==30 && done==0) {
      alert("Finished!");
      done = 1;
    }
  }
}

function move(e) {
  var tX = mX;
  var tY = mY;
  mX = IE ? event.clientX : e.pageX;
  mY = IE ? event.clientY : e.pageY;
  if (moving!=0) {
    var tD= "";
    for (i=0; i<dMAX[moveD]; i++) {
      dX[i] += mX-tX;
      dY[i] += mY-tY;
      tD = "d"+clumps[moveD][i];
      document.getElementById(tD).style.left = dX[i] + "px";
      document.getElementById(tD).style.top = dY[i] + "px";
    }
  }
}

function getKey(e) {
  if (e.keyCode) keycode=e.keyCode;
  else keycode=e.which;
  switch (keycode) {
  case 100:
    if (moving==1) drag(moveD);
    break;
  case 109:
    var tD;
    moving = 0;
    moveD = -204;
    mX = 0;
    mY = 0;
    score = 0;
    done = 0;
    for (i=0; i<30; i++) {
      clumps[i] = new Array(31);
      for (j=1; j<31; j++) {
        clumps[i][j] = -204;
      }
      clumps[i][0] = i;
      dX[i] = 0;
      dY[i] = 0;
      dMAX[i] = 1;
      pieces[i*3+2] = 0;
      tD = "d"+i;
      document.getElementById(tD).style.left = Math.floor(Math.random()*500);
      document.getElementById(tD).style.top = Math.floor(Math.random()*300);
    }
    break;
  }
}

document.onmousemove = move;