// 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;
}

// set if differences can be clicked on
var canspot=true;
var okdelay=-3000;
function badspot(forceok)
{
	o=GetObject("welldone");
	if (!forceok)
	{
		okdelay+=1000;
		if (okdelay>5000) okdelay=5000;
		if (okdelay>0)
			setTimeout("badspot(true);",okdelay);
	}
	var dok=(forceok||(okdelay<=0));
	if (o)
	{
		o.innerHTML='\
		<TABLE style="position:relative; left:200px; top:150px;" BGCOLOR="#F0F0FF" WIDTH="196" \
			BORDER="1" BORDERCOLOR="#808080" CELLSPACING="0" CELLPADDING="0" HSPACE="0" VSPACE="0">\
		<TR><TD align="center" width="196">\
			There is no difference at<BR>that position!<BR>'+
			(dok?'<A href="javascript:setcanspot();">OK</A>':'&nbsp;')+
		'</TD></TR>\
		</TABLE>';
		canspot=false;
	}
}

function clrwelldone()
{
	o=GetObject("welldone");
	if (o)
	{
		o.innerHTML='\
		<TABLE style="position:relative; left:0px; top:0px;" BGCOLOR="#F0F0FF" WIDTH="0" \
			BORDER="0"CELLSPACING="0" CELLPADDING="0">\
		</TABLE>';
	}
}

function setcanspot()
{
	canspot=true;
	clrwelldone();
}

function gamecomplete()
{
	o=GetObject("welldone");
	if (o)
	{
		o.innerHTML='\
		<TABLE style="position:relative; left:200px; top:370px;" BGCOLOR="#F0F0FF" WIDTH="196" \
			BORDER="1" BORDERCOLOR="#808080" CELLSPACING="0" CELLPADDING="0">\
		<TR><TD align="center">\
			Completed!\
		</TD></TR>\
		</TABLE>';
	}
}


function normaldiff(spot) // called in non-text games
{
	if (!canspot) 
		return false;
	if (spot>=0)
	{
		if (xy[spot][1]>=0)
		{
			if (okdelay>=0)
				okdelay=-1000;
			show(spot,img0.src);
			xy[spot][1]=-1;
			var o=GetObject("find"+(ndiff-nleft));
			nleft-=1;

			if (o!=null)
			{
				o.src=img3.src;
			}
			if (nleft==0)
			{
				endgame(1);
			}
			else
			{
				var p=nleft;
				if (p>7) p=7;
				fx("t"+(7-p)+".wav");
			}
		}
		return false;
	}
	fx("oops.wav");
	if (badspot!=null)
		badspot(false);
	return false;
}

var allimgsloaded=false;
var animate=true;
var jig=0;
function jiggle()
{
	var JMAX=8;
	++jig;
	if (jig==8*JMAX) jig=0;
	var jx=0,jy=0;
	if (animate)
	{
		if (jig<=2*JMAX)
		{
			jx=jig-JMAX;
			jy=-JMAX;
		}
		else if (jig<=4*JMAX)
		{
			jx=JMAX;
			jy=jig-3*JMAX;
		}
		else if (jig<6*JMAX)
		{
			jx=5*JMAX-jig;
			jy=JMAX;
		}
		else
		{
			jx=-JMAX;
			jy=7*JMAX-jig;
		}
	}

	if (allimgsloaded)
	{
		var o=GetObject("frame0");
		var left=10-jx;
		var top=10-jy;
		o.style.left=left+"px";
		o.style.top=top+"px";

		o=GetObject("frame1");
		left=10+jx;
		top=10+jy;
		o.style.left=left+"px";
		o.style.top=top+"px";
	}

	if (animate)
		setTimeout("jiggle();",50);
	else
		jig=0;
}


function rndc(dir)
{
	do
	{
		var m=60;
		var s=m>>1;
		if (dir!=0)
		{
			m=s;
			s=0;
			if (dir<0)
				m=-m;
		}
		m=Math.floor(Math.random()*m-s);
	}
	while (m==0);
	return m;
}

var r=0xFF,g=0xFF,b=0,dr=rndc(-1),dg=rndc(-1),db=rndc(-1);
var jx2=0;
var jy2=0;
var jm2=0;
function jiggle2()
{
	setTimeout("jiggle2();",128); // try to sync with the music!
	var JMAX=8;

	jig+=JMAX*2;
	if (jig==8*JMAX) jig=0;
	var jx=0,jy=0;
	if (jig<=2*JMAX)
	{
		jx=jig-JMAX;
		jy=-JMAX;
	}
	else if (jig<=4*JMAX)
	{
		jx=JMAX;
		jy=jig-3*JMAX;
	}
	else if (jig<6*JMAX)
	{
		jx=5*JMAX-jig;
		jy=JMAX;
	}
	else
	{
		jx=-JMAX;
		jy=7*JMAX-jig;
	}

	if (Math.random()<0.02) jm2=Math.floor(Math.random()*8);

	var left=10;
	var top=10;
	var o=GetObject("frame0");
	switch (jm2)
	{
	case 0:
		left+=jx; top-=jy; break;
	case 1:
		left+=jx; top-=jy; break;
	case 2:
		left+=jx; top+=jy; break;
	case 3:
		left+=jx; top+=jy; break;
	case 4:
		left+=jx; break;
	case 5:
		left-=jx; break;
	case 6:
		top+=jy; break;
	case 7:
		top-=jy; break;
	}
	o.style.left=left+"px";
	o.style.top=top+"px";

	left=10;
	top=10;
	o=GetObject("frame1");
	switch (jm2)
	{
	case 0:
		left+=jx; top-=jy; break;
	case 1:
		left+=jx; top+=jy; break;
	case 2:
		left+=jx; top-=jy; break;
	case 3:
		left-=jx; top-=jy; break;
	case 4:
		left+=jx; break;
	case 5:
		top+=jy; break;
	case 6:
		left+=jx; break;
	case 7:
		top+=jy; break;
	}
	o.style.left=left+"px";
	o.style.top=top+"px";

	o=GetObject("welldone")
	if (o!=null)
	{
		var mx=400;
		var my=375;
		jx2=(jx2+10)%(mx*2);
		jy2=(jy2+10)%(my*2);
		left=(jx2<mx/2)?jx2:(jx2<(mx+mx/2)?(mx-jx2):jx2-(mx*2));
		top=(jy2<my)?jy2:(my*2-jy2);
		o.style.left=left+"px";
		o.style.top=-top+"px";
	}

	var c="#";
	r+=dr; 
	g+=dg; 
	b+=db; 

	if (r>255) {r=510-r; dr=rndc(-1);} else if (r<0) {r=-r; dr=rndc(1);}
	if (g>255) {g=510-g; dg=rndc(-1);} else if (g<0) {g=-g; dg=rndc(1);}
	if (b>255) {b=510-b; db=rndc(-1);} else if (b<0) {b=-b; db=rndc(1);}
	var clr=(r*65536)+(g*256)+b;
	for (var i=0; i<6; i++)
	{
		var v=(clr>>20)&0x0F;
		clr=clr<<4;
		if (v<10) v+=48;
		else v+=65-10;
		c+=String.fromCharCode(v);
	}
	document.bgColor=c;
}

var imgcache=new Array();
var imgflags=new Array();
var imgidx=new Array();
function addimg(img)
{
	var x=imgcache.length;
	var idx=0;
	for (var i=0; i<x; i++)
	{
		// check if tail part of url is same
		if(imgcache[i].src.slice(-img.length)==img)
		{
			break;
		}
	}
	imgidx[imgidx.length]=i;
	if (i==x)
	{
		imgcache[x]=new Image();
		imgflags[x]=false;
		imgcache[x].onload=imgcache[x].onabort=imgcache[x].onerror=new Function("imgflags["+x+"]=true;");
		imgcache[x].src=img;
	}
}

// update display when all images loaded
function drawimgs()
{
	var nok=0;
	var tot=imgcache.length
	for (var i=0; i<tot; i++)
	{
//		if (imgcache[i].complete) 
		if (imgflags[i])
			nok++;
	}
	if (nok==tot)
	{
		for (var i=0; i<imgidx.length; i++)
		{
			var idx=imgidx[i];
			var o=GetObject("icache"+i);
			if (o) o.src=imgcache[idx].src;
		}
		setcanspot();
		allimgsloaded=true;
	}
	else
	{
		allimgsloaded=false;
		var pct=Math.floor(100*nok/tot);
		o=GetObject("welldone");
		if (o)
		{
			o.innerHTML='\
			<TABLE style="position:relative; left:200px; top:150px;" BGCOLOR="#F0F0FF" WIDTH="196" \
				BORDER="1" BORDERCOLOR="#808080" CELLSPACING="0" CELLPADDING="0">\
			<TR><TD align="center">\
				<TABLE BORDER="0">\
				<TR><TD>\
					Loading: '+pct+'%<BR>\
				</TD></TR>\
				</TABLE>\
			</TD></TR>\
			</TABLE>';
		}
		canspot=false;

		setTimeout("drawimgs();",200);
	}
}

function clrprog(y)
{
	setcanspot();
	if (y)
	{
		var dlt=new Date((new Date()).getTime()-365*24*60*60000); // 1 year ago
		var exp=dlt.toGMTString();
		document.cookie="stage=1; expires="+exp;
		document.cookie="spots=0; expires="+exp;
		document.cookie="exptimes=0; expires="+exp;
		document.cookie="besttimes=0; expires="+exp;
		document.cookie="pgbest=0; expires="+exp;
		document.cookie="master=0; expires="+exp;
		document.location="default.asp";
	}
}

function clearprogress()
{
	o=GetObject("welldone");
	if (o)
	{
		o.innerHTML='\
		<TABLE style="position:relative; left:175px; top:150px;" BGCOLOR="#F0F0FF" WIDTH="246" \
			BORDER="1" BORDERCOLOR="#808080" CELLSPACING="0" CELLPADDING="0">\
		<TR><TD align="center">\
			<TABLE BORDER="0">\
			<TR><TD colspan="2" align="center">\
				This will delete all your Explorer Game progress\
				and Practice Puzzle and Photo Puzzle times.<BR>...Continue?<BR>\
			</TD></TR>\
			<TR><TD align="left">\
				<A href="javascript:clrprog(1);">OK</A>\
			</TD>\
			<TD align="right">\
				<A href="javascript:clrprog(0);">Cancel</A>\
			</TD></TR>\
			</TABLE>\
		</TD></TR>\
		</TABLE>';
	}
	canspot=false;
}

function getPraise(t,t1,t2,t0)
{
	if (t==10000)
		return "Completed by Magic Spot.";

	var a=new Array("Brilliant!!","Amazing!!","Stunning!!",
					"Excellent!","Fantastic!","Very fast!",
					"Fast time.","Wonderful.","Terrific.",
					"Well done.","Nice one.","Good play.");
	var r0=0;// prev rank
	var r1=0;// this rank
	if (t0<0) r0=-1;
	else if (t0<t1) r0=2;
	else if (t0<t2) r0=1;
	if (t<t1) r1=2;
	else if (t<t2) r1=1;

	var r=Math.floor(Math.random()*3);
	if (r1<2)
	{
		if (r1==1)
		{
			r=Math.floor(6*(t-t1)/(t2-t1))+3;
		}
		else
		{
			r+=9;
		}
	}
	var txt="";
	var c="<FONT>";
	if (r1>r0)
	{
		txt=["&nbsp;&nbsp;","&nbsp;&nbsp;Silver speed!","&nbsp;&nbsp;Gold speed!!"][r1];
		c=["","<FONT color='#6070B0'>","<FONT color='#C08000'>"][r1]
	}
	return("<B>"+c+a[r]+txt+"</FONT></B>");
}

function fx(s,lp)
{
	if (document.all)
	{
		if (String(lp)=="undefined") lp=0;
		var o=GetObject("snd");
		if (o)
		{
			o.loop=lp;
			o.src="fx/"+s;
			o.volume=0;
		}
	}
}

