<!--
function onPageLoaded() {
    initPuzzle();
}

var tilemap = new Array(16);      // lists tiles 1-15 in order
var shufflemap = new Array(16);   // defines a permuation of 0-15
var permmap = new Array(16);	  // used in calculating the parity of shufflemap
var nummoves = 0;       // current number of moves in the game (puzzle attempt)
var curscore = 0;       // current number of correct tile positions in the game
var playing = false;    // play is currently ongoing iff true
var winningscore = 18;
var bonus = 12;
var totalPossibleScore = winningscore + bonus;

var primaryParent;
var statisticsdiv;

var msgsdiv;
var openCell

	// called from common.js: hideAndSetInitStopStart:
function initialStartGame()
{
  var textdiv = document.getElementById('intro_text');
  textdiv.style.display='none';
  var statisticsdiv = document.getElementById('tried_correct_statistics');
  statisticsdiv.style.display='block';
  var containerdiv = document.getElementById('puzzle15_container');
  containerdiv.style.display='block'; 
  var msgsdiv = document.getElementById('user_messages');
  msgsdiv.style.display='none';
  
  setupStartStop();
  startGame();
}

function startGame()
{
  var msgsdiv = document.getElementById('user_messages');
  msgsdiv.style.display='none';
  initPuzzle();
  init_current();
  var parity = randomMap();
  playing = true;
  while (parity == 0){
    parity = randomMap();
  }
  showMap();
  setStopStartBtns(false, true);
  start_timer();
}

function init_current()
{
    nummoves = 0;
    curscore = 0;
    nummovesdiv = document.getElementById('numtried_div');
    nummovesdiv.innerHTML = nummoves;
    numcorrectdiv = document.getElementById('numcorrect_div');
    numcorrectdiv.innerHTML = curscore;
}

function stopGame()
{
    stop_play();
}

function stop_play()
{
    var cur_time = new Date();
    elapsed_time = cur_time.getTime() - start_time.getTime();
    stop_timer();
    playing = false;
    setStopStartBtns(true, false);
    if (curscore == winningscore){
      curscore += 12;
      numcorrectdiv = document.getElementById('numcorrect_div');
      numcorrectdiv.innerHTML = curscore;

      var msgsdiv = document.getElementById('user_messages');
      msgsdiv.innerHTML = 'Puzzle Solved!';
      msgsdiv.style.display='block'; 
    } 
    var userNum = sbCookieData.usernum;
    Record.recordNumCorrectPlusMoves(taskId, nummoves, curscore, elapsed_time, userNum);
}


    /* Returns a random integer k such that: 0 <= k < n */
function rnd(n) 
{
  var k = Math.floor(Math.random() * n);
  while (k == n){
    k = Math.floor(Math.random() * n);
  }
  return k;
}

function randomMap()
{
  var smap = new Array(16);
  for (var n = 0; n<16; n++){
    smap[n] = n;
  }
  var c;
  var n;
  shufflemap[15] = smap[0];
  smap[0] = -1;

  for (n = 0; n<15; n++)
  {
    var d = -1;
    var u = 15 -n;
    c = rnd(u);

    for (var i = 0; i<c+1; i++){
        d++;
      while (smap[d] == -1){
        d++;
      }
    }
    shufflemap[n] = smap[d];
    smap[d] = -1;
    permmap[n] = shufflemap[n];
    for (var j = 0; j<n; j++){
      if (shufflemap[j] < shufflemap[n]){
	 permmap[n]--;
      }
    }
  }
  var psum = 0;
  for (n = 0; n<15; n++)
  {
    psum += permmap[n];
  }
  var parity = (psum % 2);
  return parity;
}

function dispRM()
{
  var xx = "";
  for (var k=0; k<16; k++){
  xx += " " + k + "->" + shufflemap[k];
  }
  document.write(xx+"<br>");
}

function showMap()
{
  var cn = 0;
  for (var y = 0; y <= 3; y++)
  {
    for (var x = 0; x <= 3; x++)
    {
      var cell = document.getElementById("cell-"+x+"-"+y);
      var tile = tilemap[shufflemap[cn]];
      while (cell.childNodes.length > 0) {
        cell.removeChild(cell.childNodes.item(0));
      }
      if (x < 3 || y < 3)
      {
          if (cell != null){
            cell.appendChild(tile);
          }
          cn++;
      }
    }
  }
}

function score() 
{
  var correctcount = 0;
  for (var x = 0; x < 4; x++) 
  {
    for (var y = 0; y < 4; y++) 
    {
      var ids = ""+x+"-"+y;
      if (document.getElementById("tile-"+ids)){
	if (document.getElementById("tile-"+ids).parentNode.id == "cell-"+ids){
	  correctcount++;
	} 
      }
    }
  }
  var value = correctcount;
  if (correctcount > 12){
    value = 12 + (correctcount - 12) * 2;
  }
  return value;
}

function updateStats()
{
    nummoves++;
    curscore = score();
    nummovesdiv = document.getElementById('numtried_div');
    nummovesdiv.innerHTML = nummoves;
    numcorrectdiv = document.getElementById('numcorrect_div');
    numcorrectdiv.innerHTML = curscore;

    if (curscore == winningscore){
      stop_play();
    }
}

function makeTile(x, y) {
  var cellNum = x + y * 4 + 1;
  var tile = document.createElement('div');
  tile.className = 'puzzletile';
  tile.id = "tile-"+x+"-"+y;
  tile.appendChild(document.createTextNode(""+cellNum));
  tile.onclick = clickTile;
  tile.style.cursor = "pointer";
  tilemap[cellNum] = tile;
  return tile;
}

function initPuzzle () {
  openCell = "cell-3-3";
  for (var cX = 0; cX < 4; cX++) {
    for (var cY = 0; cY < 4; cY++) {
      var cell = document.getElementById("cell-"+cX+"-"+cY);
      while (cell.childNodes.length > 0) {
        cell.removeChild(cell.childNodes.item(0));
      }
      
      if (cX == 3 && cY == 3) continue;
      cell.appendChild(makeTile(cX, cY));
    }
  }
}

function isLegalMove(myX, myY) 
{
    var openInfo = openCell.split("-");
    var openX = parseInt(openInfo[1]), openY = parseInt(openInfo[2]);
    return ((myX==openX && myY==openY+1) || (myX==openX && myY==openY-1) ||
            (myX==openX+1 && myY==openY) || (myX==openX-1 && myY==openY));
}

function makeMove(myX, myY) 
{
    var openCellObj = document.getElementById(openCell);
    var targetCellObj = document.getElementById("cell-"+myX+"-"+myY);
    var targetTileObj = targetCellObj.childNodes.item(0);
    targetCellObj.removeChild(targetTileObj);
    openCellObj.appendChild(targetTileObj);
    openCell = "cell-"+myX+"-"+myY;
    updateStats();
}

function clickTile(e) 
{
    if (!playing) {
        alert("Press the Start button to begin the puzzle.");
        return;
    }
    var evt;
    if (e){
       evt = e;
    } else {
       evt = event;
    }
    var myInfo = this.parentNode.id.split("-");
    var myX = parseInt(myInfo[1]), myY = parseInt(myInfo[2]);
    var legal = isLegalMove(myX, myY);
    if (legal) {
        makeMove(myX, myY);
    } 
}

    function hasWon() {
      for (var cX = 0; cX < 4; cX++) {
        for (var cY = 0; cY < 4; cY++) {
          var ids = ""+cX+"-"+cY;
          
          if (
            document.getElementById("tile-"+ids)
            && (document.getElementById("tile-"+ids).parentNode.id != "cell-"+ids)
          ) return 0;
        }
      }
      return 1;
    }

function showInstructions()
{
    var ipath= "15-puzzle-instructions";
    var entry_win=window.open(
                     ipath,
                     '15_Puzzle_Instructions',
                     'height=380,width=650');
    return false;
}



	//-------- Performance Display code -------------

function displayPerfData(taskDisplayData)
{
    genericDisplayPerfData('15 Puzzle', taskDisplayData);
    return false;
}

// -->
