var n_xscrn=0;
xscrn=new Array();

//screen 1-10:
xscrn[n_xscrn++]=
"  #######!"+    
"###     #!"+
"#   $ $ #####!"+
"#     $    .#!"+
"#    ##    .#!"+
"#         @.#!"+
"# #####  ####!"+
"###   ####!";

xscrn[n_xscrn++]=
"  #######!"+      
"###     #!"+      
"#   $$$ #####!"+  
"#     $   ..#!"+  
"#    ##    .#!"+  
"#         @.#!"+  
"# #####  ####!"+  
"###   ####!";     
                
xscrn[n_xscrn++]=
"  #######!"+      
"###     #!"+      
"#   $$$ #####!"+  
"# $#@ $   ..#!"+  
"# $ $##$  ..#!"+  
"#.        ..#!"+  
"#.#####  ####!"+  
"###   ####!";     

xscrn[n_xscrn++]=
"  #######!"+      
"###     #!"+      
"#   $$$ #####!"+  
"# $#@ $   ..#!"+  
"# $ $##   ..#!"+  
"#         ..#!"+  
"#.#####  ####!"+  
"###   ####!";     

xscrn[n_xscrn++]=
"  #######!"+      
"###     #!"+      
"#   $$$ #####!"+  
"# $#@ $   ..#!"+  
"# $  ##$  ..#!"+  
"#         ..#!"+  
"#.#####  ####!"+  
"###   ####!";     

xscrn[n_xscrn++]=
"  #######!"+      
"###     #!"+      
"#   $$$ #####!"+  
"# $#@ $   ..#!"+  
"# $  ##   *.#!"+  
"#        $.*#!"+  
"#.#####..####!"+  
"###   ####!";     


var newwin;
function OpenWindow(AppName,ww,hh)
{
 window.open("index.html?40","Soko","width=650,height=435,menubar=no,locationbar=no,resizable=yes,status=no,scrollbars=no");
 return false;
}

var i, j, I_Sel, J_Sel, XPos, YPos, StartTime, EndTime, TimeString="00:00:00", IsOver, XMax=13, YMax=9, imglen=0;
var Level=1, MoveCount, MaxMoveCount, MaxMove=4949;
var IsNetscape = false;
if(navigator.appName == "Netscape") IsNetscape = true;
var ie = (navigator.appName.indexOf("Microsoft") != -1) ? 1 : 0;
if(!ie)
{
	document.addEventListener("keydown", KeyDown, true);
}
else
{
	document.attachEvent("onkeydown", KeyDown);
}

History=new Array(MaxMove);

Fld = new Array(XMax);
for (i=0; i < XMax; i++)
{ Fld[i]=new Array(YMax);
}

Pic= new Array(7);
for (i=0; i<7; i++)
{ Pic[i] = new Image();
  Pic[i].src = "pix/sokoban"+i+".gif";
}

function Timer()
{ var ii, jj, ss="";
  if (IsOver) return;
  Now = new Date();
  EndTime = Now.getTime() / 1000;
  ii=Math.floor(EndTime - StartTime);
  jj=ii%60;
  ss=eval(jj);
  if (jj<10) ss="0"+ss;
  ii-=jj;
  ii/=60;
  jj=ii%60;
  ss=eval(jj)+":"+ss;
  if (jj<10) ss="0"+ss;
  ii-=jj;
  ii/=60;
  jj=ii%24;
  ss=eval(jj)+":"+ss;
  if (jj<10) ss="0"+ss;
  document.getElementById("Time").value=ss;
  TimeString=ss;
}

function KeyDown(e)
{
	var whichkey = (!ie) ? e.which : window.event.keyCode;
  if (whichkey == 37) Move(-1,0);
  if (whichkey == 38) Move(0,-1);
  if (whichkey == 39) Move(1,0);
  if (whichkey == 40) Move(0,1);

  if (whichkey == 50) Move(0,1);
  if (whichkey == 52) Move(-1,0);
  if (whichkey == 53) Move(0,1);
  if (whichkey == 54) Move(1,0);
  if (whichkey == 56) Move(0,-1);

  if (whichkey == 65458) Move(0,1);
  if (whichkey == 65460) Move(-1,0);
  if (whichkey == 65461) Move(0,1);
  if (whichkey == 65462) Move(1,0);
  if (whichkey == 65464) Move(0,-1);
}

function NumStr(nn)
{ if (nn<10) return("   "+eval(nn)+"   ");
  if (nn<100) return("  "+eval(nn)+"  ");
  if (nn<1000) return(" "+eval(nn)+" ");
  return(eval(nn));
}

function ChangeLevel(dd)
{ Level+=dd;
  if (Level<1) Level=1;
  if (Level>n_xscrn) Level=n_xscrn;
  Init(Level-1);
}

function Init(ll)
{ var cc, ii, jj, kk;
  for (ii=0; ii < XMax; ii++)
  { for (jj=0; jj < YMax; jj++)
      Fld[ii][jj]=0;
  }
  ii=0; jj=0;
  for (kk=0; kk<xscrn[ll].length; kk++)
  { cc=xscrn[ll].charAt(kk);
    if (cc==".") Fld[ii][jj]=1;
    if (cc=="#") Fld[ii][jj]=2;
    if (cc=="$") Fld[ii][jj]=3;
    if (cc=="*") Fld[ii][jj]=4;
    if (cc=="@") { Fld[ii][jj]=5; PosX=ii; PosY=jj; }
    if ((cc!=" ")&&(cc!="!")&&(Fld[ii][jj]==0)) alert(cc);
    if (cc=="!") { jj++; ii=0; }
    else ii++;
  }
  MoveCount=0;
  MaxMoveCount=0;
  RefreshScreen();
  window.document.images[imglen].src = Pic[5].src;
  Now = new Date();
  StartTime = Now.getTime() / 1000;
  IsOver=false;
}

function OverTest()
{ var ii, jj;
  for (ii=0; ii < XMax; ii++)
  { for (jj=0; jj < YMax; jj++)
    { if (Fld[ii][jj]==3) return(false);
    }
  }
  return(true);
}

function Move(ddX, ddY)
{ var nn;
  if (IsOver) return;
  if (Fld[PosX+ddX][PosY+ddY]>2)
  { if (Fld[PosX+2*ddX][PosY+2*ddY]<2)
    { Fld[PosX+2*ddX][PosY+2*ddY]+=3;
      Fld[PosX+ddX][PosY+ddY]+=2;
      Fld[PosX][PosY]-=5;
      RefreshPic(PosX, PosY);
      RefreshPic(PosX+ddX, PosY+ddY);
      RefreshPic(PosX+2*ddX, PosY+2*ddY);
      PosX+=ddX;
      PosY+=ddY;
      nn=-(ddX+1)-3*(ddY+1);
      if (History[MoveCount]!=nn)
      { History[MoveCount]=nn;
        MaxMoveCount=MoveCount+1;
      }
      MoveCount++;
      if (MaxMoveCount<MoveCount)
        MaxMoveCount=MoveCount;
      IsOver=OverTest();
      if (MoveCount==MaxMove)
      { alert("Sorry, no more moves. Please try again !");
      }
    }
  }
  else
  { if (Fld[PosX+ddX][PosY+ddY]<2)
    { Fld[PosX+ddX][PosY+ddY]+=5;
      Fld[PosX][PosY]-=5;
      RefreshPic(PosX, PosY);
      RefreshPic(PosX+ddX, PosY+ddY);
      PosX+=ddX;
      PosY+=ddY;
      nn=(ddX+1)+3*(ddY+1);
      if (History[MoveCount]!=nn)
      { History[MoveCount]=nn;
        MaxMoveCount=MoveCount+1;
      }
      MoveCount++;
      if (MaxMoveCount<MoveCount)
        MaxMoveCount=MoveCount;
      if (MoveCount==MaxMove)
      { alert("Sorry, no more moves. Please try again !");
      }
    }
  }
  document.getElementById("Moves").value=NumStr(MoveCount);
  if (IsOver) window.document.images[imglen].src = Pic[4].src;
}

function MoveBack(mm)
{ var ii, nn, ddX, ddY;
  for (ii=0; ii<mm; ii++)
  { if (MoveCount==0) return;
    IsOver=false;
    window.document.images[imglen].src = Pic[5].src;
    MoveCount--;
    nn=History[MoveCount];
    if (nn>0)
    { ddX=nn%3;
      ddY=(nn-ddX)/3;
      ddX--;
      ddY--;
      PosX-=ddX;
      PosY-=ddY;
      Fld[PosX+ddX][PosY+ddY]-=5;
      Fld[PosX][PosY]+=5;
      RefreshPic(PosX, PosY);
      RefreshPic(PosX+ddX, PosY+ddY);
    }
    else
    { nn*=-1;
      ddX=nn%3;
      ddY=(nn-ddX)/3;
      ddX--;
      ddY--;
      PosX-=ddX;
      PosY-=ddY;
      Fld[PosX+2*ddX][PosY+2*ddY]-=3;
      Fld[PosX+ddX][PosY+ddY]-=2;
      Fld[PosX][PosY]+=5;
      RefreshPic(PosX, PosY);
      RefreshPic(PosX+ddX, PosY+ddY);
      RefreshPic(PosX+2*ddX, PosY+2*ddY);
    }
    document.getElementById("Moves").value=NumStr(MoveCount);
  }
}

function MoveForward(mm)
{ var ii, nn, ddX, ddY;
  for (ii=0; ii<mm; ii++)
  { if (MoveCount>=MaxMoveCount) return;
    nn=History[MoveCount];
    if (nn<0) nn*=-1;
    ddX=nn%3;
    ddY=(nn-ddX)/3;
    ddX--;
    ddY--;
    Move(ddX, ddY);
  }
}

function RefreshPic(ii, jj)
{ window.document.images[(ii+jj*XMax+1)+imglen].src = Pic[Fld[ii][jj]].src;
}

function RefreshScreen()
{  
var ii, jj;
  for (ii=0; ii < XMax; ii++)
  { for (jj=0; jj < YMax; jj++)
      window.document.images[(ii+jj*XMax+1)+imglen].src = Pic[Fld[ii][jj]].src;
  }
  document.getElementById("Level").value=NumStr(Level);
  document.getElementById("Moves").value=NumStr(MoveCount);
}

function Resize()
{ if(navigator.appName == "Netscape") history.go(0);
}


