var cur_pos = 15;
var img_offset = 1;
var bStarted;
var ximages = new Array(16);
var imgmaps = new Array(16);
// preload
for (var i = 0; i < 16; i++)
{
  ximages[i] = new Image();
  ximages[i].src = "http://trade.torus.com.tw/test/images/jigsaw_puzzle_50_" + i + ".jpg";
}

function checkwin()
{
  for (var i = 0; i < 16; i++)
  {
    if (document.images[img_offset + i].src != ximages[i].src)
    {
      return false;
    }
  }
  return true;
}

function resetme()
{
  for (var i = 0; i < 16; i++)
  {
    document.images[img_offset + i].src = ximages[i].src;
    imgmaps[i] = i;
  }
  bStarted = false;
  cur_pos = 15;
}

function swap(i)
{
  // check if legal event
  switch (cur_pos)
  {
    case 0: // 
      if (i != 1 && i != 4)
      {
        return;
      }
      break;  
    case 1:
      if (i != 0 && i != 2 && i != 5)
      {
        return;
      }
      break; 
    case 2:
      if (i != 1 && i != 3 && i != 6)
      {
        return;
      }
      break; 
    case 3:
      if (i != 2 && i != 7)
      {
        return;
      }
      break; 
    case 4:
      if (i != 0 && i != 5 && i != 8)
      {
        return;
      }
      break; 
    case 5:
      if (i != 1 && i != 4 && i != 6 && i != 9)
      {
        return;
      }
      break; 
    case 6:
      if (i != 2 && i != 5 && i != 7 && i != 10)
      {
        return;
      }
      break; 
    case 7:
      if (i != 3 && i != 6 && i != 11)
      {
        return;
      }
      break;
    case 8:
      if (i != 4 && i != 9 && i != 12)
      {
        return;
      }
      break; 
    case 9:
      if (i != 5 && i != 8 && i != 10 && i != 13)
      {
        return;
      }
      break; 
    case 10:
      if (i != 6 && i != 9 && i != 11 && i != 14)
      {
        return;
      }
      break; 
    case 11:
      if (i != 7 && i != 10 && i != 15)
      {
        return;
      }
      break; 
    case 12: // 
      if (i != 8 && i != 13)
      {
        return;
      }
      break;  
    case 13:
      if (i != 9 && i != 12 && i != 14)
      {
        return;
      }
      break; 
    case 14:
      if (i != 10 && i != 13 && i != 15)
      {
        return;
      }
      break; 
    case 15:
      if (i != 11 && i != 14)
      {
        return;
      }
      break; 
  }
  var s = document.images[img_offset + i].src;
  document.images[img_offset + i].src = document.images[img_offset + cur_pos].src;
  document.images[img_offset + cur_pos].src = s;
  cur_pos = i;
  // check if win
  if (bStarted && checkwin())
  {
    window.open("congratulations.htm", "Congratulations", "width=560,height=220,top=40,left=100,resizable=yes");
    bStarted = false;
  }
}

function scramble()
{
  var r, i;
  var nLevel;
  
  resetme();
  if (document.frmMain.Level[2].checked)
    nLevel = 5000;
  else if (document.frmMain.Level[1].checked)
    nLevel = 100;
  else 
    nLevel = 10;
      
  i = 0;
  do 
  {
    switch (cur_pos)
    {
      case 0:
        r = Math.floor(2 * Math.random());
        if (r == 0)
          swap_mem(1);
        else
          swap_mem(4);
        break;
      case 1:
        r = Math.floor(3 * Math.random());  
        if (r == 0)
          swap_mem(0);
        else if (r == 1)
          swap_mem(2);
        else
          swap_mem(5);
        break;
      case 2:
        r = Math.floor(3 * Math.random());  
        if (r == 0)
          swap_mem(1);
        else if (r == 1)
          swap_mem(3);
        else
          swap_mem(6);
        break;
      case 3:
        r = Math.floor(2 * Math.random());
        if (r == 0)
          swap_mem(2);
        else
          swap_mem(7);
        break;
      case 4:
        r = Math.floor(3 * Math.random());  
        if (r == 0)
          swap_mem(0);
        else if (r == 1)
          swap_mem(5);
        else
          swap_mem(8);
        break;
      case 5:
        r = Math.floor(4 * Math.random());  
        if (r == 0)
          swap_mem(1);
        else if (r == 1)
          swap_mem(4);
        else if (r == 2)
          swap_mem(6);
        else
          swap_mem(9);
        break;
      case 6:
        r = Math.floor(4 * Math.random());  
        if (r == 0)
          swap_mem(2);
        else if (r == 1)
          swap_mem(5);
        else if (r == 2)
          swap_mem(7);
        else
          swap_mem(10);
        break;
      case 7:
        r = Math.floor(3 * Math.random());  
        if (r == 0)
          swap_mem(3);
        else if (r == 1)
          swap_mem(6);
        else
          swap_mem(11);
        break;
      case 8:
        r = Math.floor(3 * Math.random());  
        if (r == 0)
          swap_mem(4);
        else if (r == 1)
          swap_mem(9);
        else
          swap_mem(12);
        break;
      case 9:
        r = Math.floor(4 * Math.random());  
        if (r == 0)
          swap_mem(5);
        else if (r == 1)
          swap_mem(8);
        else if (r == 2)
          swap_mem(10);
        else
          swap_mem(13);
        break;
      case 10:
        r = Math.floor(4 * Math.random());  
        if (r == 0)
          swap_mem(6);
        else if (r == 1)
          swap_mem(9);
        else if (r == 2)
          swap_mem(11);
        else
          swap_mem(14);
        break;
      case 11:
        r = Math.floor(3 * Math.random());  
        if (r == 0)
          swap_mem(7);
        else if (r == 1)
          swap_mem(10);
        else
          swap_mem(15);
        break;
      case 12:
        r = Math.floor(2 * Math.random());  
        if (r == 0)
          swap_mem(8);
        else
          swap_mem(13);
        break;
      case 13:
        r = Math.floor(3 * Math.random());  
        if (r == 0)
          swap_mem(9);
        else if (r == 1)
          swap_mem(12);
        else
          swap_mem(14);
        break;
      case 14:
        r = Math.floor(3 * Math.random());  
        if (r == 0)
          swap_mem(10);
        else if (r == 1)
          swap_mem(13);
        else
          swap_mem(15);
        break;
      case 15:
        r = Math.floor(2 * Math.random());  
        if (r == 0)
          swap_mem(11);
        else
          swap_mem(14);
        break;
    } 
    i++;
  }
  while (i < nLevel); // until white in corner again  
  for (i = 0; i < 16; i++)
  {
    document.images[img_offset + i].src = ximages[imgmaps[i]].src;
  }
  bStarted = true;
}

function swap_mem(i)
{
  var r = imgmaps[i];
  imgmaps[i] = imgmaps[cur_pos];
  imgmaps[cur_pos] = r;
  cur_pos = i;
}
