var prev=null;
var previdx=0;
var curidx=0;
var stepidx=true;
var finalletter='Z';
var txta="";

var visited = new Array(26);
var step = new Array(26);
var images = new Array(25);

var ntry=-1;

var playing=false;
var timeout_id=null;
var frame=0;
var spiral=[
0,0, 1,0, 2,0, 3,0, 4,0, 4,1, 4,2, 4,3, 4,4, 3,4, 2,4, 1,4, 0,4, 0,3, 0,2, 0,1,
1,1, 2,1, 3,1, 3,2, 3,3, 2,3, 1,3, 1,2, 2,2
];


// Get named HTML object
function GetObject(name)
{
	var o=null;
	if(document.getElementById)
		o=document.getElementById(name);
	else if(document.all)
		o=document.all.item(name);
	else if(document.layers)
		o=document.layers[name];
	return o;
}

function restart()
{
	ntry=-1;

	prev=null;
	previdx=0;
	curidx=0;
	stepidx=true;
	playing=false;
	safe=true;

	for (var i=0; i<26; i++)
	{
		visited[i]=0;
		step[i]=Math.floor(Math.random()*100);
	}

	for (var i=0; i<25; i++)
	{
		images[i] = new Image();
		var x = i%5;
		var y = (i-x)/5;
		images[i].src = imgroot+"_"+(y+1)+"x"+(x+1)+".jpg";
	}

	o=GetObject('tog');
	if(o) o.innerHTML="";

	o=GetObject('nolink');
	if(o) o.innerHTML="";

	o=GetObject('praise');
	if(o) o.innerHTML="";

	if (txta=="")
	{
		o=GetObject('img0');
		if(o) txta=o.innerHTML;
	}

	prev='A';
	previdx=0;
	backtrack();
	mosaic();
}

function backtrack()
{
	if (prev!=null)
	{
		o=GetObject('here');
		if (o)
		{
			var cur=o.innerHTML.charCodeAt(0)-"A".charCodeAt(0);
			if (cur>=0 && cur<26)
				if (visited[cur]>0) visited[cur]--;
			o=GetObject('0');
			if (o) o.innerHTML=prev;
			stepidx=false;
			curidx=previdx;
			move('0');
			stepidx=true;
			prev=null;
			o=GetObject('bk');
			if (o) o.innerHTML="";
		}
	}

}

var safe=true;
function move(id)
{
	if (!safe) // avoid reentrancy
		return;
	safe=false;

	domove(id);

	safe=true;
}

function domove(id)
{
	if (timeout_id!=null)
	{
		clearTimeout(timeout_id);
		timeout_id=null;
	}
	var o=GetObject(id);
	var nxta=[""];
	if (o==null)
		return;
	var t=o.innerHTML;
	if (t==null)
		return;

	var idx=t.charCodeAt(0)-("A".charCodeAt(0));

	if (idx!=0 && t!=finalletter && !images[idx].complete)
		return; // can't go here yet as image not in cache

	++ntry;

	if (t==finalletter)
	{
		togglevol();
		o=GetObject('praise');
		if(o) o.innerHTML='<FONT size="4">Continue</FONT>';
		o=GetObject('nolink');
		if(o) o.innerHTML='none!';
		animate();
	}

	nxta=nxtaa[idx];
	var key=keys[idx];
	visited[idx]++;

	previdx=curidx;
	if (stepidx)
	{
		curidx=step[idx]%nxta.length;
		step[idx]++;
	}
	var nxt=nxta[curidx];

	for (var i=0; i<6; i++)
	{
		var ch=nxt.charAt(i);
		var ob=""+i;
		o=GetObject(ob);
		if (o) o.innerHTML=ch;
		o=GetObject(ob+'a');
		if (o)
		{
			if (ch=="")
				o.innerHTML="";
			else
				o.innerHTML="&nbsp;";
		}
	}

	o=GetObject('try');
	if (o) o.innerHTML=ntry;

	o=GetObject('here');
	if(o) 
	{
		prev=o.innerHTML;
		o.innerHTML=t;
		o=GetObject('bk');
		if (o)
		{
			o.innerHTML="backtrack";
			if (t==finalletter)
				o.innerHTML="";
		}
	}
	o=GetObject('initial');
	if (o) o.innerHTML=t + " is for " + key;
	mosaic();
}

// set a tile to either image or text
function tile(x, y, dispimg)
{
	var i=x+5*y;
	var txt=String.fromCharCode(("A".charCodeAt(0)) + i);
	if (dispimg)
	{
		if (i==0 && txta!="")
			txt=txta;
		else if (images[i].complete)
			txt='<IMG src="'+images[i].src+'">';
	}
	o=GetObject('img'+i);
	if (o!=null && (txt.length<=1 || o.innerHTML.length<=1))
	{
		o.innerHTML=txt;
	}
}

function mosaic()
{
	var ch=0;
	for (var y=0; y<5; y++)
	{
		for (var x=0; x<5; x++)
		{
			tile(x, y, (visited[ch]>0));
			ch++;
		}
	}
}

function togglevol()
{
	if (navigator.appName!="Microsoft Internet Explorer")
	{
		return;
	}

	playing=!playing;
	if (playing)
	{
		o=GetObject('tune');
		o.src="turk.mid";
		o=GetObject('tog');
		o.innerHTML="Sound off";
	}
	else
	{
		o=GetObject('tune');
		o.src="";
		o=GetObject('tog');
		o.innerHTML="Sound on";
	}
}

function done()
{
	o=GetObject('here');
	if (o.innerHTML != finalletter)
		return; // no cheating!
	var n=ntry*1113+31415;
	var n1=n&0xAAAAAAAA;
	var n2=n&0x55555555;
	n=(n1/2)+(n2*2);
	location="gottoz.asp?n="+n;
}

function animate()
{
	if (timeout_id==null)
	{
		frame=0;
	}
	if (frame<18)
	{
		var f=frame%6;
		for (var x=0; x<5; x++)
		{
			for (var y=0; y<5; y++)
			{
				var b=(Math.abs(x-2)+Math.abs(y-2));
				tile(x, y, (b!=f));
			}
		}
		timeout_id=setTimeout("animate()", 200);
	}
	else if (frame<48)
	{
		var f=(frame-18);
		var phase=Math.floor(f/10)%2;
		f=f%10;
		for (var x=0; x<5; x++)
		{
			for (var y=0; y<5; y++)
			{
				tile(x, y, ((phase==0 && x+y<f) || (phase==1 && x+y>=f)))
			}
		}
		timeout_id=setTimeout("animate()", 100);
	}
	else
	{
		var f=frame-48;
		var phase=(Math.floor(f/25))%2;
		var n=f%25;
		if (phase==1)
			n=24-n;
		var x=spiral[n*2];
		var y=spiral[n*2+1];
		if (phase==1)
			x=4-x;
		tile(x, y, (phase==1));
		timeout_id=setTimeout("animate()", 100);
	}
	frame++;
	if (frame==148)
	{
		frame=1;
	}
}

