var iRowsInPuzzle = 4;
var iColsInPuzzle = 4;
var iFreeImgRow = 0;
var iFreeImgCol = 0;
//freeImg = document.bild00;

var PuzzleImagePath = "bild";
var PuzzleImageType = ".jpg"
var FreeImgSrc = PuzzleImagePath + iFreeImgRow + iFreeImgCol + PuzzleImageType;
var iImagesInPuzzle = iRowsInPuzzle * iColsInPuzzle;
var iFirstPuzzleImageInDocument = 0;

// definiere Zielpuzzle und temporaeres Puzzle
var aPuzzleComplete = new Array(iRowsInPuzzle);
var aPuzzle = new Array(iRowsInPuzzle);

function PuzzleInit()
{
for( var iRow = 0; iRow < iRowsInPuzzle ; iRow ++ )
{
   aPuzzleComplete[iRow] = new Array(iColsInPuzzle);
   aPuzzle[iRow] = new Array(iColsInPuzzle);   
}
//----------------------------------------------

// initialisiere ZielPuzzle
for( var iRow = 0; iRow < iRowsInPuzzle ; iRow++ )
{  
 
   for( var iCol = 0; iCol < iColsInPuzzle; iCol++ )  
   {    
      aPuzzleComplete[iRow][iCol] = new Image();
      aPuzzleComplete[iRow][iCol].src = PuzzleImagePath + iRow + iCol + PuzzleImageType;
   }	  	 
} 

// initialisiere temporaeres Puzzle mit ZielPuzzle
for( var iRow = 0; iRow < iRowsInPuzzle ; iRow ++ )
{   
   for( var iCol = 0; iCol < iColsInPuzzle; iCol++ )
   {      
      aPuzzle[iRow][iCol] = new Image();
      aPuzzle[iRow][iCol].src = aPuzzleComplete[iRow][iCol].src;	    
   }	  	 
} 

// Suche Startindex des ersten Puzzelbildes
for( var iImg = 0; ; iImg++ )
{
   if( iImg > document.images.length -iImagesInPuzzle)
   {
      alert("Erstes Bild des Puzzles nicht gefunden:" + iImg);
      break;
   }
   
   if( ExtractFileNameFromURL(document.images[iImg].src) == PuzzleImagePath + "00" + PuzzleImageType)
   {
      iFirstPuzzleImageInDocument = iImg;
	  break;
   }     
   
   // fehlerbehandlung ( kein Bild gefunden )!! fehlt hier
}

   MixPuzzle();

} // end PuzzleInit()

function ExtractFileNameFromURL( strURL )
{
 	strFile=strURL;
    pos = (strFile.lastIndexOf("\/"))+1;
    if (pos > 0)
	{
       strFile = strFile.substring(pos,strFile.length);
    }
	//alert (strFile);
    return strFile;
}

function EvalNewPuzzle( iRow, iCol )
{
  if( iRow == iFreeImgRow )     // Schieben in einer Zeile ?
  {               
	  if( iCol > iFreeImgCol ) // links schieben ?
	  {
         for( i = iFreeImgCol +1; i <= iCol; i++ )
		   chgImage( iRow, i);
	  }	
	  else // rechts schieben
	  {
	  	 for( i = iFreeImgCol -1; i >= iCol; i-- )
		   chgImage( iRow, i);
	  }	    		 	    
   }
   
  if( iCol == iFreeImgCol )     // Schieben in einer Zeile ?
  {               
	  if( iRow > iFreeImgRow ) // links schieben ?
	  {
         for( i = iFreeImgRow +1; i <= iRow; i++ )
		   chgImage( i, iCol);
	  }	
	  else // rechts schieben
	  {
	  	 for( i = iFreeImgRow -1; i >= iRow; i-- )
		   chgImage( i, iCol);
	  }	    		 	    
   }
   
   if(TestPuzzleComplete())
     alert("fertig");
   //iFreeImgCol = iCol;
   //iFreeImgRow = iRow;
   
}

function MixPuzzle()
{
   iPicturesAvail = new Array(iImagesInPuzzle);
   
   // initialisiere verfügbare Bilder
   for(iPicture= 0; iPicture < iPicturesAvail.length; iPicture++)
   {
      iPicturesAvail[iPicture] = iPicture;
   }
   
   while(1) // mixe bis nicht vollstaendig !
   {
      for( iPicture = 0; iPicture < iImagesInPuzzle; )
      {
         // random
         iPictureSelected = Math.round(iPicturesAvail.length * Math.random());

	     // schau, ob Bild noch verfuegbar
         for( b = 0; b < iPicturesAvail.length; b++)
         {
            if( iPicturesAvail[b] == iPictureSelected )
		    {// bild war noch verfuegbar !
		       iRowSrc = Math.floor(iPictureSelected/iRowsInPuzzle);
			   iColSrc = iPictureSelected%iRowsInPuzzle;
			   iRowDest = Math.floor(iPicture/iRowsInPuzzle);
			   iColDest = iPicture%iRowsInPuzzle;
		       aPuzzle[iRowDest][iColDest].src = aPuzzleComplete[iRowSrc][iColSrc].src; 
			   if (ExtractFileNameFromURL( aPuzzle[iRowDest][iColDest].src ) == FreeImgSrc)
			   {
			   	  iFreeImgRow = iRowDest;
				  iFreeImgCol = iColDest;
			   }
			   iPicturesAvail[b]=-1; // loesche Bild aus Liste
			   iPicture++;           // naechstes Bild
			   break;			     		
		    } 		 
	     }	 
      }
	  if( !TestPuzzleComplete() ) break;
   }
   
   // update display
   CopyPuzzleToDisplay();        
}

function SortPuzzle()
{
   for( var iRow = 0; iRow < iRowsInPuzzle ; iRow ++ )
   {   
      for( var iCol = 0; iCol < iColsInPuzzle; iCol++ )
      {      
         aPuzzle[iRow][iCol] = new Image();
         aPuzzle[iRow][iCol].src = aPuzzleComplete[iRow][iCol].src;
		 if (ExtractFileNameFromURL(aPuzzle[iRow][iCol].src) == FreeImgSrc)
		 {
		 	iFreeImgRow = iRow;
			iFreeImgCol = iCol;
		 }
      }	  	 
   } 
   
   // update display
   CopyPuzzleToDisplay();
}


function chgImage( iRow, iCol )
{  
     
   ImageSave = aPuzzle[iFreeImgRow][iFreeImgCol];
   
   // Setzte Bild auf freien Platz
   aPuzzle[iFreeImgRow][iFreeImgCol] = aPuzzle[iRow][iCol];
   // setze freies Bild auf iRow iCol  
   //aPuzzle[iRow][iCol].src = PuzzleImagePath + "00" + PuzzleImageType;
   aPuzzle[iRow][iCol] = ImageSave;
   // update display
   document.images[iFirstPuzzleImageInDocument + iRow*iColsInPuzzle + iCol].src = aPuzzle[iRow][iCol].src;
   document.images[iFirstPuzzleImageInDocument + iFreeImgRow*iColsInPuzzle + iFreeImgCol].src = aPuzzle[iFreeImgRow][iFreeImgCol].src;
   //document.images[iFirstPuzzleImageInDocument + iRow*iColsInPuzzle + iCol ].src = PuzzleImagePath + "00" + PuzzleImageType;       
   
   iFreeImgCol = iCol;
   iFreeImgRow = iRow;      
   return;	
}

function CopyPuzzleToDisplay()
{
  // update display
   for (iRow = 0; iRow < iRowsInPuzzle; iRow++)
   {
      for( iCol = 0; iCol < iColsInPuzzle; iCol++)
	  {  
         document.images[iFirstPuzzleImageInDocument + iRow*iColsInPuzzle + iCol].src = aPuzzle[iRow][iCol].src;
         document.images[iFirstPuzzleImageInDocument + iFreeImgRow*iColsInPuzzle + iFreeImgCol].src = aPuzzle[iFreeImgRow][iFreeImgCol].src;
	  }	 
   }
}

function TestPuzzleComplete()
{
 	for( iRow = 0; iRow < iRowsInPuzzle; iRow++)
	{
       for( iCol = 0; iCol < iColsInPuzzle; iCol++)
	   { 	
          if( aPuzzle[iRow][iCol].src != aPuzzleComplete[iRow][iCol].src )
		    return 0;
	   }		    
   }
   return 1;
   //alert("fertig");
}
