// copyright (c) Mads E. Hauberg 2004. 
//Send me a mail if you wan to use the script on your site.

var d, i=0, j=0, k, t, m, sa, sb, sc, mo=1, ms, wrongmoves, first, last, tbm, alertMsg;

var isSolving = 0

nt=new Array("", 2, 1, 4, 3, 6, 5);
ntt=new Array("", 6, 4, 5, 2, 3, 1);
from= new Array("", 1, 1, 2, 2, 3, 3);
to= new Array("", 2, 3, 1, 3, 1, 2);

function put()
{
	d=document.getElementById("d").value*1;
	sa=new Array(d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
	sb=new Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
	sc=new Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
	for(k = 1; k <=12; k++)
		{
			changeBrick("a",k,0)
			changeBrick("b",k,0)
			changeBrick("c",k,0)
		}
	for (k = 1; k <=d; k++)
		{
			sa[k]=d+1-k
			changeBrick("a",k,d-k+1)
		}
	tbm= Math.pow(2,d) -1;
	document.getElementById('tmoves').innerHTML= tbm;
	modus()
} 

function solve()
{
i=0; j=0;
t=new Array("2");
m=new Array();

f();
} 

function f()
{
	if(d==1)
	{
		// Skriv flyt
		m[i]=t[j]; i++;	
	}
	else
	{
		//rekursion
		j++; d--;
		t[j]=nt[t[j-1]];
		f();
		j--; 
			
		// Skriv flyt
		m[i]=t[j]; i++;	
		
		// Oprydning
		t[j]=ntt[t[j]];
		f();	
		d++;
	}
	
}

function modus()
{
		if(sb[0]+sc[0]!=0)
			put();
	mo=document.getElementById("m").value*1;
	if(mo<4)
	{
		wrongmoves=0;
		
		document.getElementById("starter").value="Start";
		document.getElementById("starter").disabled=true;	
		document.getElementById("m1").disabled=false;
		document.getElementById("m2").disabled=false;
		document.getElementById("m3").disabled=false;
		document.getElementById("m4").disabled=false;
		document.getElementById("m5").disabled=false;
		document.getElementById("m6").disabled=false;
		if(mo==2)
		{
			solve();
		}
	}
	else
	{
		if(mo==4)
			ms=5;
		else
		if(mo==5)
			ms=200;
		else
			ms=600;
		
	
		document.getElementById("starter").disabled=false;
		document.getElementById("m1").disabled=true;
		document.getElementById("m2").disabled=true;
		document.getElementById("m3").disabled=true;
		document.getElementById("m4").disabled=true;
		document.getElementById("m5").disabled=true;
		document.getElementById("m6").disabled=true;
		solve();	
	}
	i=0; document.getElementById('tmoved').innerHTML= i;
}

function um(temp)
{
	document.getElementById("starter").value="Restart";
	document.getElementById("starter").disabled=false;	
	tm=temp*1
	if(mo==3)
	{
		if( ((from[tm]==1)&&(sa[sa[0]]>0))   || ((from[tm]==2)&&(sb[sb[0]]>0))    || ((from[tm]==3)&&(sc[sc[0]]>0))   )
			dm();
	}
	else
	if(mo==2)
	{
		if(tm==m[i])
		{
			dm();
		}
		else
		{
			alert("wrong move")
			wrongmoves++;
		}
	}
	else
	{
		if(from[tm]==1)
			first=sa[sa[0]];
		else
		if(from[tm]==2)
			first=sb[sb[0]];
		else
			first=sc[sc[0]];
		
			
		if(to[tm]==1)
			last=sa[sa[0]];
		else
		if(to[tm]==2)
			last=sb[sb[0]];
		else
			last=sc[sc[0]];
		if((first>0) && ((first<last) || (last==0)))
		{
			dm()
		}
	}
	
	if(sa[0]+sb[0]==0)
	{
		if(mo==1)
		{
			if(i>tbm)
			{
				alertMsg="CONGRATULATIONS! \n\nyou solved the puzzle, but you can do it in fewer moves."
			}
			else
				alertMsg="CONGRATULATIONS! \n\nYou solved the puzzle flawlessly."
		}
		else
		if(mo==2)
			alertMsg="CONGRATULATIONS! \n\nYou solved the puzzle with the teachers help. Try without the teacher when you feel ready.";
		else
			alertMsg="You moved the discs to the right peg, but you cheated!"
			
		document.getElementById("m1").disabled=true;
		document.getElementById("m2").disabled=true;
		document.getElementById("m3").disabled=true;
		document.getElementById("m4").disabled=true;
		document.getElementById("m5").disabled=true;
		document.getElementById("m6").disabled=true;
		
		setTimeout("displayAlert()", 200);
		
	}
}

function displayAlert()
{
alert(alertMsg)
}

function dm()
{
	switch(tm)
	{
		case 1:
			changeBrick("a", sa[0],0)		
			changeBrick("b", sb[0]+1,sa[sa[0]])
			sb[sb[0]+1]=sa[sa[0]];
			sa[0] = sa[0]-1; sb[0] = sb[0]+1; break;
		case 2:
			changeBrick("a", sa[0],0)		
			changeBrick("c", sc[0]+1,sa[sa[0]])
			sc[sc[0]+1]=sa[sa[0]];
			sa[0] = sa[0]-1; sc[0] = sc[0]+1; break;
		case 3:
			changeBrick("b", sb[0],0)		
			changeBrick("a", sa[0]+1,sb[sb[0]])
			sa[sa[0]+1]=sb[sb[0]];
			sb[0] = sb[0]-1; sa[0] = sa[0]+1; break;
		case 4:
			changeBrick("b", sb[0],0)		
			changeBrick("c", sc[0]+1,sb[sb[0]])
			sc[sc[0]+1]=sb[sb[0]];
			sb[0] = sb[0]-1; sc[0] = sc[0]+1; break;
		case 5:
			changeBrick("c", sc[0],0)		
			changeBrick("a", sa[0]+1,sc[sc[0]])
			sa[sa[0]+1]=sc[sc[0]];
			sc[0] = sc[0]-1; sa[0] = sa[0]+1; break;
		case 6:
			changeBrick("c", sc[0],0)		
			changeBrick("b",sb[0]+1,sc[sc[0]])
			sb[sb[0]+1]=sc[sc[0]];
			sc[0] = sc[0]-1; sb[0] = sb[0]+1; break;
	}
	i++;
	document.getElementById('tmoved').innerHTML= i;
}

function cm()
{
	if(document.getElementById('m').value<4)
	{
		//restart
		put()
	}
	else
	{
	if(!isSolving)
		{
			isSolving=1;
			doMoves();
			document.getElementById('starter').value= "Stop";
		}
		else
		{
			isSolving=0;
			document.getElementById('starter').value= "Start";
		}
	}
}


function doMoves()
{
	if(isSolving)
	{	
		if(sa[0]+sb[0]==0)
			put();
	
		tm=m[i]*1; 
		dm();
		if(i<tbm)
			setTimeout("doMoves()", ms)
		else
		{
			isSolving=0;
			document.getElementById('starter').value= "Start";
		}
	}

}

function changeBrick(row,numb,bnumb)
{
			eval('document.getElementById("'+row  +String(numb)+ '").src = "scripts/hanoi/' +String(bnumb)+'.jpg"');		
}


