// Copyright (c) 2000 - Gregor Rayman - Internet Technology DE GmbH
// Copyrighted is the implementation of the game "Wired". It can be
// distributed only as part of this HTML-Page. Every other usage
// requires written permission from me (Gregor Rayman)
//
// I do not claim copyright for the game "Wired" itself. I did not
// invent it. We used to play it at school years ago...

var EmptyImg = new Image(); EmptyImg.src = "img/games/emptypoint.gif";

var BtnUpHoverImg = new Image(); BtnUpHoverImg.src = "img/games/tileUB.gif";
var BtnStHoverImg = new Image(); BtnStHoverImg.src = "img/games/tileSB.gif";
var BtnDnHoverImg = new Image(); BtnDnHoverImg.src = "img/games/tileDB.gif";
var BtnUpNormalImg = new Image(); BtnUpNormalImg.src = "img/games/tileUW.gif";
var BtnStNormalImg = new Image(); BtnStNormalImg.src = "img/games/tileSW.gif";
var BtnDnNormalImg = new Image(); BtnDnNormalImg.src = "img/games/tileDW.gif";

var TileNoImg = new Image(); TileNoImg.src = "img/games/tileEW.gif";
var TileUpImg = new Image(); TileUpImg.src = "img/games/tileU.gif";
var TileStImg = new Image(); TileStImg.src = "img/games/tileS.gif";
var TileDnImg = new Image(); TileDnImg.src = "img/games/tileD.gif";

var Tiles = new Array(TileNoImg, TileUpImg, TileStImg, TileDnImg);

var DotInRedRImg = new Image(); DotInRedRImg.src = "img/games/tileRR.gif";
var DotInRedLImg = new Image(); DotInRedLImg.src = "img/games/tileRL.gif";
var DotInRedDImg = new Image(); DotInRedDImg.src = "img/games/tileRD.gif";
var DotInRedUImg = new Image(); DotInRedUImg.src = "img/games/tileRU.gif";

var DotInGreenRImg = new Image(); DotInGreenRImg.src = "img/games/tileGR.gif";
var DotInGreenLImg = new Image(); DotInGreenLImg.src = "img/games/tileGL.gif";
var DotInGreenDImg = new Image(); DotInGreenDImg.src = "img/games/tileGD.gif";
var DotInGreenUImg = new Image(); DotInGreenUImg.src = "img/games/tileGU.gif";

var DotOutRedRImg = new Image(); DotOutRedRImg.src = "img/games/outRR.gif";
var DotOutRedLImg = new Image(); DotOutRedLImg.src = "img/games/outRL.gif";
var DotOutRedDImg = new Image(); DotOutRedDImg.src = "img/games/outRD.gif";
var DotOutRedUImg = new Image(); DotOutRedUImg.src = "img/games/outRU.gif";

var DotOutGreenRImg = new Image(); DotOutGreenRImg.src = "img/games/outGR.gif";
var DotOutGreenLImg = new Image(); DotOutGreenLImg.src = "img/games/outGL.gif";
var DotOutGreenDImg = new Image(); DotOutGreenDImg.src = "img/games/outGD.gif";
var DotOutGreenUImg = new Image(); DotOutGreenUImg.src = "img/games/outGU.gif";

var DotOutNoRImg = new Image(); DotOutNoRImg.src = "img/games/outER.gif";
var DotOutNoLImg = new Image(); DotOutNoLImg.src = "img/games/out.gif";
var DotOutNoDImg = new Image(); DotOutNoDImg.src = "img/games/outED.gif";
var DotOutNoUImg = new Image(); DotOutNoUImg.src = "img/games/out.gif";

var DotInImages = new Array(
  new Array(DotInRedRImg, DotInRedLImg, DotInRedDImg, DotInRedUImg),
  new Array(DotInGreenRImg, DotInGreenLImg, DotInGreenDImg, DotInGreenUImg)
);

var DotOutImages = new Array(
  new Array(DotOutRedRImg, DotOutRedLImg, DotOutRedDImg, DotOutRedUImg),
  new Array(DotOutGreenRImg, DotOutGreenLImg, DotOutGreenDImg, DotOutGreenUImg)
);

var eNo = 0;
var eUp = 1;
var eSt = 2;
var eDn = 3;

var BoardWidth = 5;

var Player = 0;

var PlayAllowed = true;
var PlayingDemo = false;

function AllowPlay() {
  PlayAllowed = true;
  HiBtn('Up', false);
  HiBtn('St', false);
  HiBtn('Dn', false);
}

function DisallowPlay() {
  PlayAllowed = false;
  document.images['btnUpImg'].src = EmptyImg.src;
  document.images['btnStImg'].src = EmptyImg.src;
  document.images['btnDnImg'].src = EmptyImg.src;
}

var Board = new Array(
  new Array( eSt, eNo, eNo, eNo, eNo),
  new Array( eNo, eNo, eNo, eNo, eNo),
  new Array( eNo, eNo, eNo, eNo, eNo),
  new Array( eNo, eNo, eNo, eNo, eNo),
  new Array( eNo, eNo, eNo, eNo, eNo))

var pX = 1;
var pY = 0;
var dX = 1;
var dY = 0;

var Pending = 0;

function ResetGame() {
  pX = 1;
  pY = 0;
  dX = 1;
  dY = 0;
  for(var X=0; X<BoardWidth; ++X) {
    for(var Y=0; Y<BoardWidth; ++Y) {
      Board[X][Y] = eNo;
      ShowTile(X,Y);
    }
  }
  for(X=1; X<=BoardWidth; ++X) {
    if (X>1)
      document.images['D'+X.toString()+'0'].src = DotOutNoLImg.src;
    document.images['D0'+X.toString()].src = DotOutNoUImg.src;
    document.images['D6'+X.toString()].src = DotOutNoDImg.src;
    document.images['D'+X.toString()+'6'].src = DotOutNoRImg.src;
  }
  Board[0][0] = eSt;
  ShowTile(0,0);
  window.clearTimeout(Pending);
  Player = 1;
  PosDot();
  if (typeof(CollectGarbage) == "function") CollectGarbage();
  AllowPlay();
  PlayingDemo = false;
}

function TryMove(Depth, Tile) {
  if (Depth < 0) return 0;
  var OldPX = pX;
  var OldPY = pY;
  var OldDX = dX;
  var OldDY = dY;
  var Result = 0;
  Board[pX][pY] = Tile;
  if (!MoveNext()) Result = -1
  else {
    var Result = 100;
    for(var NextTile = eUp; NextTile <= eDn; ++NextTile) {
      var OneResult = -TryMove(Depth-1, NextTile);
      if (OneResult > 0) ++OneResult
      else if (OneResult < 0) --OneResult;
      if (Result > OneResult) Result = OneResult;
    }
  }
  pX = OldPX;
  pY = OldPY;
  dX = OldDX;
  dY = OldDY;
  Board[pX][pY] = eNo;
  return (Result == 100) ? 0 : Result;
}

var MaxDepth = 3;

var RadioOffImg = new Image(); RadioOffImg.src = 'img/games/radioE.gif';
var RadioOnImg = new Image(); RadioOnImg.src = 'img/games/radioF.gif';

function Difficulty(Level) {
  for(var i = 0; i<=Level; ++i)
    document.images['LevelImg'+i.toString()].src = RadioOnImg.src;
  for(;i<=5; ++i)
    document.images['LevelImg'+i.toString()].src = RadioOffImg.src;
  MaxDepth = Level + 2;
}

function ChoseMove() {
  var Values = new Array(0,0,0,0);
  var MinValue = -1;
  var MinCount = 0;
  var Value;
  for(var Tile = eUp; Tile <= eDn; ++Tile) {
    Value = TryMove(MaxDepth, Tile);
    Values[Tile] = Value;
    if (Value == MinValue) ++MinCount
    else if (
		    ((Value > 0) && (Value <= MinValue)) ||
		    ((Value == 0) && (MinValue < 0)) ||
		    ((MinValue < 0) && (Value < MinValue)) ||
		    ((Value > 0) && (MinValue <= 0))) {
		  MinValue = Value;
		  MinCount = 1;
		}
  }

  if ((MinCount > 0) && (MinCount < 3)) {
    var Chosen = Math.floor(Math.random()*MinCount);
    if (Chosen < MinCount) ++Chosen;
    for (Tile = eUp; Tile <= eDn; ++Tile) {
    	if (Values[Tile] == MinValue) {
    	  if (Chosen==1) return Tile;
    	  --Chosen;
    	}
    }
  } else {
    var Chosen = Math.floor(Math.random()*(eDn-eUp));
    if (Chosen < eDn) Chosen += eUp;
    return Chosen;
  }
}

function HiBtn(Tile, Hover) {
  if (PlayAllowed)
    document.images['btn'+Tile+'Img'].src =
      Hover ? eval("Btn"+Tile+"HoverImg.src") : eval("Btn"+Tile+"NormalImg.src");
}

function MoveNext() {
  do {
    var Tile = Board[pX][pY];
    var Tmp;
    if (Tile == eNo) return true;
    if (Tile == eDn) {
      Tmp = dY; dY = dX; dX = Tmp;
    } else if (Tile == eUp) {
      Tmp = dY; dY = -dX; dX = -Tmp;
    }
    pX += dX; pY += dY;
    if ((pX<0) || (pX>=BoardWidth) || (pY<0) || (pY>=BoardWidth)) return false;
  } while (true);
  return false;
}

function ShowTile(X,Y) {
  var Tile = Board[X][Y];
  if ((X>=0) && (X<BoardWidth) && (Y>=0) && (Y<BoardWidth))
    document.images['D'+(Y+1).toString()+(X+1).toString()].src = Tiles[Tile].src;
}

function PosDot() {
  var Dir = (dX > 0) ? 0 : (dX < 0) ? 1 : (dY > 0) ? 2 : 3;
  var DotImages = ((pX >= 0) && (pX < BoardWidth) && (pY >= 0) && (pY < BoardWidth))?
    DotInImages : DotOutImages;
  Player = 1-Player;
  document.images['D'+(pY+1).toString()+(pX+1).toString()].src = DotImages[Player][Dir].src;
}

var PlayerNames = new Array('The red', 'The green')
function Play(TileType) {
  if (!PlayAllowed) return;
  Board[pX][pY] = TileType;
  ShowTile(pX,pY);
  var GoOn = MoveNext();
  PosDot();
  DisallowPlay();
  if (GoOn) Pending = window.setTimeout("ComputerPlay()", 1000)
  else window.alert('Nice try. Better luck next time.');
}

function ComputerPlay() {
  var Tile = ChoseMove();
  Board[pX][pY] = Tile;
  ShowTile(pX,pY);
  var GoOn = MoveNext();
  PosDot();
  if (!GoOn)
    window.alert(PlayingDemo
      ? PlayerNames[Player] + ' payer wins.'
      : 'Congratulations!');
  if (!PlayingDemo) AllowPlay();
  return GoOn;
}

function ComputerStarts() {
  ResetGame();
  DisallowPlay();
  ComputerPlay();
}

function DemoPlay() {
  if (ComputerPlay())
    Pending = window.setTimeout("DemoPlay()", 1000)
  else
    PlayingDemo = false;
}

function StartDemo() {
  if (PlayingDemo) return;
  DisallowPlay();
  window.clearTimeout(Pending);
  if ((pX < 0) || (pX >= BoardWidth) || (pY < 0) || (pY >= BoardWidth))
    ResetGame();
  PlayingDemo = true;
  Pending = window.setTimeout("DemoPlay()", 1000);
}
