// StampJongg by H.A. Camp

var   iPath = "/images/games/stampjongg/";
var      HL = "";
var   xSize = 35;
var   ySize = 55;
var xOffset =  35;
var yOffset =  30;
var zOffset = 3;
var   board = new Array();
var     cnt = 1;
var   Undo1 = new Array();
var   Undo2 = new Array();
var timerID = 0;
var tStart  = null;
var   Undid = 0;
var tiles = BoardSetup()-1;

// a-z = 97-122; A-Z = 65-90
// TileList runs 97-122 & 65-75
var TileList = "aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyzzzzAAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJ";
//var ascii = TileList.charCodeAt(3);

document.write('<div style="position: relative; border: 2px solid #333333; width: 645px; height: 480px;">');

for (cnt = 1; cnt <= board.length-1; cnt++)
{
  var  xyz = board[cnt];
  var xPos = xyz.indexOf(',');
  var   yz = xyz.substring(xPos+1, xyz.length);
  var yPos = yz.indexOf(',');
  var    x = xyz.substring(0, xPos);
  var    y = yz.substring(0, yPos);
  var    z = yz.substring(yPos+1, yz.length);

  var       TP = randnum(0, TileList.length-1);
  var       TL = TileList.substring(TP,TP+1);
  var TileList = TileList.substring(0,TP) + TileList.substring(TP+1,TileList.length);  
  
  xPos = x * xSize + xOffset + z * zOffset;
  yPos = y * ySize - yOffset - z * zOffset;

  document.write('  <div style="position: absolute; left:' + xPos + 'px; top: ' + yPos + 'px; z-index:' + z + '">');
  document.write('    <img id="' + x + '_' + y + '_' + z + '" src=' + iPath + 'tile_' + TL.charCodeAt(0) + '.gif alt="" onclick="ClickMe(' + x + ',' + y + ',' + z + ');"/>');
  document.write('  </div>');
}

document.write('</div>');
document.write('<div style="position: relative; border: 2px solid #333333; width: 645px; height: 140px; margin-top: 10px;">');

var TL2 = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJ";
var xMargin = 630;
for (tmp = TL2.length - 1; tmp >= 0; tmp--)
{
  yPos = 10;
  xPos = tmp * xSize + 10;
  while (xPos > xMargin){xPos=xPos-xMargin; yPos=yPos + ySize + 10;}
  document.write('  <div style="position: absolute; left:' + xPos + 'px; top: ' + yPos + 'px;">');
  document.write('    <img style="display: none" id="found_' + tmp + '" src=' + iPath + 'tile_' + TL2.charCodeAt(tmp) + '.gif alt="" onclick="ClickMe(' + x + ',' + y + ',' + z + ');"/>');
  document.write('  </div>');
}

document.write('</div>');


// ----------------------------------------------------------------------------
// Function: ClickMe
// ----------------------------------------------------------------------------

function ClickMe(x,y,z)
{
  var imgName = x + '_' + y + '_' + z;
  var CheckLegalMove = LegalMove(x, y, z);
  var comp1 = document.getElementById(imgName);

  if (CheckLegalMove)
  {
    if (HL!="")
    {
      // Previously highlighted tile exists
      togHL(imgName);
      var comp2 = document.getElementById(HL);
      if ((comp1.src==comp2.src) && (imgName != HL))
      {
        // Match
        comp1.style.display = 'none';
        comp2.style.display = 'none';
        HL="";
        tiles = tiles - 2;
        document.frmToggler.TLeft.value = tiles;
        for (tval=0; tval <= TL2.length-1; tval++)
        {
          var comp3 = document.getElementById('found_' + tval);
          if (comp3.src == comp1.src) 
          {
            if (comp3.style.display != 'block') {comp3.style.display = 'block';} 
            else {comp3.alt='2';}
          }
        }
        Undo1.push(comp1.id);
        Undo2.push(comp2.id);
        
        if (tiles <= 0) {EndGame();}
      }
      else
      {
        // Not a match
        togHL(HL);
        togHL(imgName);
        HL="";
      }
    }
    else
    {
      // No previously highlighted tiles
      togHL(imgName);
      HL=imgName;
    }
  }
}

function preload()
{
  document.frmToggler.TLeft.value = tiles;
  tStart   = new Date();
  document.frmToggler.Time.value = "0m 0s";
  timerID  = setTimeout("UpdateTimer()", 1000);
}

function togHL(target) 
{
  target = document.getElementById(target);

  if (target.style.border == "")
  {target.style.border = "2px dashed #ff0000";}
  else
  {target.style.border = "";}
}

function togON(target) 
{
  target = document.getElementById(target);
  target.style.border = "2px dashed #ff0000";
}

function togOFF(target) 
{
  target = document.getElementById(target);
  target.style.border = "";
}

function BoardSetup()
{
  for (j=13; j>=2; j--){board[cnt] = j + ",1,1"; cnt++}
  for (j=11; j>=4; j--){board[cnt] = j + ",2,1"; cnt++}
  for (j=12; j>=3; j--){board[cnt] = j + ",3,1"; cnt++}
  board[cnt] = "15,4.5,1"; cnt++;
  board[cnt] = "14,4.5,1"; cnt++;
  for (j=13; j>=2; j--){board[cnt] = j + ",4,1"; cnt++}
  for (j=13; j>=2; j--){board[cnt] = j + ",5,1"; cnt++}
  board[cnt] = "1,4.5,1"; cnt++;
  for (j=12; j>=3; j--){board[cnt] = j + ",6,1"; cnt++}
  for (j=11; j>=4; j--){board[cnt] = j + ",7,1"; cnt++}
  for (j=13; j>=2; j--){board[cnt] = j + ",8,1"; cnt++}

  for (j=10; j>=5; j--){board[cnt] = j + ",2,2"; cnt++}
  for (j=10; j>=5; j--){board[cnt] = j + ",3,2"; cnt++}
  for (j=10; j>=5; j--){board[cnt] = j + ",4,2"; cnt++}
  for (j=10; j>=5; j--){board[cnt] = j + ",5,2"; cnt++}
  for (j=10; j>=5; j--){board[cnt] = j + ",6,2"; cnt++}
  for (j=10; j>=5; j--){board[cnt] = j + ",7,2"; cnt++}

  for (j=9; j>=6; j--){board[cnt] = j + ",3,3"; cnt++}
  for (j=9; j>=6; j--){board[cnt] = j + ",4,3"; cnt++}
  for (j=9; j>=6; j--){board[cnt] = j + ",5,3"; cnt++}
  for (j=9; j>=6; j--){board[cnt] = j + ",6,3"; cnt++}

  for (j=8; j>=7; j--){board[cnt] = j + ",4,4"; cnt++}
  for (j=8; j>=7; j--){board[cnt] = j + ",5,4"; cnt++}

  board[cnt] = "7.5,4.5,5"; cnt++;

  return cnt;
}

function UpdateTimer() {
   if(timerID) {
      clearTimeout(timerID);
      clockID  = 0;
   }

   if(!tStart)
      tStart   = new Date();

   var   tDate = new Date();
   var   tDiff = tDate.getTime() - tStart.getTime();

   tDate.setTime(tDiff);

   document.frmToggler.Time.value = "" 
                                   + tDate.getMinutes() + "m " 
                                   + tDate.getSeconds() + "s ";
   
   timerID = setTimeout("UpdateTimer()", 1000);
   return (tDate.getMinutes() * 60 + tDate.getSeconds());
}

function randnum(Min, Max)
{
    var ranNum= Math.round(Math.random()*Max + Min);
    return ranNum;
}

function UndoIt()
{
  if (Undo1.length > 0)
  {
    Undid++;
    var U1 = document.getElementById(Undo1[Undo1.length-1]);
    var U2 = document.getElementById(Undo2[Undo2.length-1]);
    for (tval=0; tval <= TL2.length-1; tval++)
    {
      var temp3 = document.getElementById('found_' + tval);
      if (temp3.src == U1.src) {var U3 = document.getElementById('found_' + tval);}
    }
    U1.style.display="block";
    U2.style.display="block";
    U1.style.border="";
    U2.style.border="";
    tiles = tiles + 2;
    document.frmToggler.TLeft.value = tiles;
    if (U3.alt == '2'){U3.alt='';} else{U3.style.display='none';}
    Undo1.pop();
    Undo2.pop();
  }
}

function LegalMove(x, y, z)
{
  var     ok0 = eval(document.getElementById(x + '_' + y + '_' + z));
  if(ok0)
  {
    var     ok1 = true;
    var     ok2 = true;
    var     ok3 = true;
    var      n1 = x + '_' + y + '_' + (z+1);
    var      n2 = (x+1) + '_' + y + '_' + z;
    var      n3 = (x-1) + '_' + y + '_' + z;
    var    chk1 = eval(document.getElementById(n1));
    var    chk2 = eval(document.getElementById(n2));
    var    chk3 = eval(document.getElementById(n3));

    if(chk1){var c1 = document.getElementById(n1);    if(c1.style.display != 'none'){ok1=false;}}
    if(chk2){var c2 = document.getElementById(n2);    if(c2.style.display != 'none'){ok2=false;}}
    if(chk3){var c3 = document.getElementById(n3);    if(c3.style.display != 'none'){ok3=false;}}

    //Special Checks
    if (x==2 && (y==4 || y==5) && z==1)           {var s1 = document.getElementById("1_4.5_1");   if(s1.style.display != 'none'){ok1=false;}} // 2_4_1, 2_5_1
    if ((x==7 || x==8) && (y==4 || y==5) && z==4) {var s2 = document.getElementById("7.5_4.5_5"); if(s2.style.display != 'none'){ok1=false;}} // 7_4_4, 7_5_4, 8_4_4, 8_5_4
    if (x==14 && y==4.5 && z==1)                  {var s3 = document.getElementById("15_4.5_1");  if(s3.style.display != 'none'){ok1=false;}} // 14_4.5_1
    if (x==13 && (y==4 || y==5) && z==1)          {var s4 = document.getElementById("14_4.5_1");  if(s4.style.display != 'none'){ok1=false;}} // 13_4_1, 13_5_1

    if (ok0.style.display=='none'){ok1=false;}

    if (ok1 && (ok2 || ok3)) {return true;} else {return false;}
  }
  else {return false;}
}

function CheckMoves()
{
  if (confirm("Using the 'check' option reveals all remaining moves, and also has an adverse effect on your final score.  Are you sure you wish to do this?"))
  {
    Undid = Undid+10;
    var legaltile = new Array();;
    var GoodList = new Array();
    var cnt = 0;
  
    for (x=0; x<=15; x++)
    {
      for (y=0; y<=8; y++)
      {
        for (z=0; z<=5; z++)
        {
          if (LegalMove(x,y,z)) {legaltile.push(x + '_' + y + '_' + z);}
        }
      }
    }

    if (LegalMove(1,4.5,1)) {legaltile.push('1_4.5_1');}
    if (LegalMove(14,4.5,1)) {legaltile.push('14_4.5_1');}
    if (LegalMove(15,4.5,1)) {legaltile.push('15_4.5_1');}
    if (LegalMove(7.5,4.5,5)) {legaltile.push('7.5_4.5_5');}
  
    while (legaltile.length > 0)
    {
      for (cnt=1; cnt <= legaltile.length-1; cnt++)
      {
        tile1 = document.getElementById(legaltile[1]);
        tile2 = document.getElementById(legaltile[cnt]);
        if ((tile1.src==tile2.src) && tile1.id != tile2.id)
        {
          togON(tile1.id);
          togON(tile2.id);
          GoodList.push(tile1.id);
          GoodList.push(tile2.id);
        }
      }
      legaltile.reverse();
      legaltile.pop();
      legaltile.reverse();
    }
  
//  var msg = '';
//  for (x=0; x<=GoodList.length-1; x++)
//  {
//    msg = msg + "\n" + GoodList[x];
//  }
//  alert('GoodList: \n' + msg);
  
    if (GoodList.length == 0)
    {
      alert('No more available moves!');
    }
    else
    {
      alert('Available Moves: ' + GoodList.length/2);
      while (GoodList.length > 0)
      {
        togOFF(document.getElementById(GoodList[GoodList.length-1]).id);
        GoodList.pop();
      }
    }
  }
}
function EndGame()
{
  var nPoints = UpdateTimer();
  nPoints = Math.round(150000 / (nPoints/100 + Undid/10));
  var strMsg = "Congratulations!  Your score is " + nPoints + " points. \nPlease enter your name for the scoreboard:";
  var strPlayerName = "";
  strName = prompt(strMsg, strPlayerName);
  if(strName != null && strName != "")
  {
    strPlayerName = strName.substr(0, 20);
    strURL = "/html/games/games_addscore.php" + "?b=stampjongg&n=" + escape(strPlayerName) + "&p=" + nPoints;
    window.open(strURL, "Highscore", "toolbar=no,location=no,status=no,menubar=no,scrollbars=yes,resizable=yes,width=440,height=600");
  }
}
