var name

var screenContent=new Array(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15)
var selectedPosition=-1
var selectedX=-1
var selectedY=-1
var hiddenThumb=false
var steps=0
var reset=false
var solved=true
var currentMessage=""

function updateMessage(message)
{
  currentMessage=message
  document.MessageForm.MessageBox.value=currentMessage
}

function restoreMessage()
{
  document.MessageForm.MessageBox.value=currentMessage
}

function updateScreen()
{
  var index

  for (index=0;index<16;index++)
  {
    content=screenContent[index]
    document.images["field"+index].src="./sh"+((content<10)?"0":"")+content+name
  }
}

function toggleThumb()
{
  document.images["thumb"].src="./shtn"+(hiddenThumb?name:"xxxx.gif")
  hiddenThumb=!hiddenThumb
}

function checkSolved()
{
  var index

  for (index=0;index<16;index++)
    if (screenContent[index]!=index)
      return false
  return true
}

function doReset()
{
  var index

  if (!reset)
  {
    for (index=0;index<16;index++)
      screenContent[index]=index
    selectedPosition=-1
    selectedX=-1
    selectedY=-1
    steps=0
    reset=true
    updateMessage("Click on a number to start; 2 is easy, 16 is difficult.")
    if (hiddenThumb)
      toggleThumb()
    updateScreen()
    solved=false
  }
}

function doExit()
{
  history.back()
}

function doShuffle(number)
{
  var count
  var selector
  var x1
  var y1
  var x2
  var y2
  var temp

  if (reset)
  {
    while (checkSolved())
    {
      for (count=0;count<number;count++)
      {
        selector=Math.random()*4
        if (selector<1)
        {
          x1=(Math.round(2*Math.random()+0.5)-1)%2
          y1=(Math.round(3*Math.random()+0.5)-1)%3+1
          x2=x1+2
          y2=y1-1
        }
        else if (selector<2)
        {
          x1=(Math.round(2*Math.random()+0.5)-1)%2
          y1=(Math.round(3*Math.random()+0.5)-1)%3
          x2=x1+2
          y2=y1+1
        }
        else if (selector<3)
        {
          x1=(Math.round(3*Math.random()+0.5)-1)%3
          y1=(Math.round(2*Math.random()+0.5)-1)%2
          x2=x1+1
          y2=y1+2
        }
        else
        {
          x1=(Math.round(3*Math.random()+0.5)-1)%3+1
          y1=(Math.round(2*Math.random()+0.5)-1)%2
          x2=x1-1
          y2=y1+2
        }
        temp=screenContent[4*y1+x1]
        screenContent[4*y1+x1]=screenContent[4*y2+x2]
        screenContent[4*y2+x2]=temp
      }
    }
    reset=false
    toggleThumb()
    updateMessage("Click on the first image part to swap.")
    updateScreen()
  }
}

function doSelect(position)
{
  var deltaX
  var deltaY
  var temp

  if (!reset&&!solved)
  {
    if (selectedPosition==-1)
    {
      selectedPosition=position
      selectedX=position%4
      selectedY=Math.round(position/4-0.375)
      updateMessage("Click on the second image part to swap.")
    }
    else
    {
      deltaX=Math.abs(position%4-selectedX)
      deltaY=Math.abs(Math.round(position/4-0.375)-selectedY)
      if (((deltaX==1)&&(deltaY==2))||((deltaX==2)&&(deltaY==1)))
      {
        temp=screenContent[position]
        screenContent[position]=screenContent[selectedPosition]
        screenContent[selectedPosition]=temp
        steps++
        solved=checkSolved()
        updateScreen()
      }
      else
        alert("The selected image parts can not be swapped, because they are not a knight's move apart.")
      selectedPosition=-1
      selectedX=-1
      selectedY=-1
      if (solved)
      {
        if (hiddenThumb)
          toggleThumb()
        updateMessage("Puzzle solved in "+steps+" moves! Click on 'reset' or 'exit'.")
      }
      else
        updateMessage("Click on the first image part to swap.")
    }
  }
}

function doThumb()
{
  if (!reset&&!solved)
    toggleThumb()
}

function enableScript(imageName)
{
  name=imageName
  doReset()
}

