// Author - J. Brett Wilson
// Dependancies: maze.htm, options.htm, inst.htm, and trans.gif
// Updated: Wed Apr  3 14:03:17 MST 2002
status = "Buiding Arrays ...";
var scalep, cols, rows, interp, play, dyna;
var date, dwait, inter, scale, f, mposx, mposy;
var finished=0;
var params = 0;
var timer = new Array();
var pcolors = new Array('#ffaa55','#55ffaa','#aa55ff','#55aaff','#000000');
var bgs = new Array('e','6','8','a','c', '4');
var bg = "#";
for (x=0;x<6;x++)
{	bg+=bgs[Math.round(Math.random()*5)];
}
var began=false;
var divs = 1;
var hash = new Array();
var s = window.location.search;
var spos = s.indexOf("scalep=")+7;
var cpos = s.indexOf("cols=")+5;
var rpos = s.indexOf("rows=")+5;
var ipos = s.indexOf("interp=")+7;
var ppos = s.indexOf("play=")+5;
var dpos = s.indexOf("dyna=")+5;
var xoff = 135;
var yoff = 40
//var best = new Array();
if (s.length>spos+1)
{	scalep = parseInt(s.substring(spos,spos+1));
} else {
	scalep = 5;
}
scale = scalep*2;
if (s.length>cpos+2)
{	cols = parseInt(s.substring(cpos, cpos+2));
} else {
	cols = 40;
}
if (s.length>rpos+2)
{	rows = parseInt(s.substring(rpos, rpos+2));
} else {
	rows = 30;
}
if (s.length>ipos+1)
{	interp = parseInt(s.substring(ipos,ipos+1));
} else {
	interp = 5;
}
inter = interp*20;
if (s.length>dpos+1)
{	dyna = parseInt(s.substring(dpos,dpos+1));
} else {
	dyna = 0;
}
var adv = .17-(dyna/50);
if (s.length>ppos)
{	play = parseInt(s.substring(ppos,ppos+1));
} else {
	play = 1;
}
// -----------------------------------
var coord = new Array(cols);
for (c=0;c<coord.length;c++)
{	coord[c] = new Array(rows);
}
status = "Generating Maze ...";
for (x=0;x<coord.length;x+=2)
{	for (y=0;y<coord[0].length;y+=2)
	{	coord[x][y]=1;
		params++;
	}
}
for (x=1;x<coord.length;x+=2)
{	for (y=0;y<coord[0].length;y+=2)
	{	params += coord[x][y] = Math.round(Math.random()+adv);
	}
}
for (x=0;x<coord.length;x+=2)
{	for (y=1;y<coord[0].length;y+=2)
	{	params += coord[x][y] = Math.round(Math.random()+adv);
	}
}
for (x=1;x<6;x++)
{	for (y=1;y<6;y++)
	{	coord[x-1][y-1] = 1;
		coord[coord.length-x][coord[0].length-y] = 1;
	}
}
if (play>2)
{	for (x=1;x<6;x++)
	{	for (y=1;y<6;y++)
		{	coord[x-1][coord[0].length-y] = 1;
			coord[coord.length-x][y-1] = 1;
		}
	}
	params+=19;
}
params = cols*rows-params-19;
//-----------------------------------
var fposx = new Array(coord.length-1,0,0,coord.length-1);
var fposy = new Array(coord[0].length-1,0,coord[0].length-1,0);
var html = '<div id="d'+0+'" class="m" style="left:'+ xoff +'px;top:'+ yoff +'px"><img src="trans.gif" width=1 height=1></div>';
html+='<div id="bg" style="background:#000000;position:absolute;left:'+(xoff-1)+'px;top:'+(yoff-1)+'px"><img src="trans.gif" width='+(scale*cols+4)+' height='+(scale*rows+4)+'></div>';
function draw()
{	if (document.all)
	{	for (x=0;x<coord.length;x++)
		{	for (y=0;y<coord[0].length;y++)
			{	if (!coord[x][y])
				{	status = "Building HTML Element "+divs+" of "+params;
					document.write('<div id="d'+divs+'" class="m" style="background:'+bg+';left:'+ ((x*scale)+xoff) +'px;top:'+ ((y*scale)+yoff) +'px"><img scr="trans.gif" width='+scale+' height='+scale+' border=1></div>');
                                             hash[divs] = x+":"+y;
                                             divs++;
				}
			}
		}
	} else if (document.layers)
	{	for (x=0;x<coord.length;x++)
		{	for (y=0;y<coord[0].length;y++)
			{	if (!coord[x][y])
				{	status = "Building HTML Element "+divs+" of "+params;
					html+='<div id="d'+divs+'" class="m" style="left:'+ ((x*scale)+xoff) +'px;top:'+ ((y*scale)+yoff) +'px"><img scr="trans.gif" width='+scale+' height='+scale+'></div>';
					hash[divs] = x+":"+y;
                                             divs++;
				}
			}
		}
	}
}
draw();
html+='<div id="point0" style="background:'+pcolors[0]+';visibility:hidden;position:absolute;z-index:2;top:'+yoff+'px;left:'+xoff+'px"><img src="trans.gif" width='+scale+' height='+scale+' border=1></div>';
html+='<div id="point1" style="background:'+pcolors[1]+';visibility:hidden;position:absolute;z-index:2;top:'+(yoff+scale*(coord[0].length-1))+'px;left:'+(xoff+scale*(coord.length-1))+'"><img src="trans.gif" border=1 width='+(scale)+' height='+(scale)+'></div>';
html+='<div id="point2" style="background:'+pcolors[2]+';visibility:hidden;position:absolute;z-index:2;top:'+(yoff)+'px;left:'+(xoff+scale*(coord.length-1))+'px"><img src="trans.gif" border=1 width='+(scale)+' height='+(scale)+'></div>';
html+='<div id="point3" style="background:'+pcolors[3]+';visibility:hidden;position:absolute;z-index:2;top:'+(yoff+scale*(coord[0].length-1))+'px;left:'+(xoff)+'px"><img src="trans.gif" border=1 width='+(scale)+' height='+(scale)+'></div>';
html+='<div id="go" style="color:#009944;font-style:bold;font-size:44pt;position:absolute;visibility:hidden;top:'+(yoff+100)+'px;left:'+(xoff+scale*coord.length+10)+'px">GO !</div>';
html+='<div id="ready" style="color:#999900;font-style:bold;font-size:44pt;position:absolute;visibility:visible;top:'+(yoff+100)+'px;left:'+(xoff+scale*coord.length+10)+'px">Get<br>Ready</div>';
status = "Displaying Maze ...";
document.write(html);
function ready()
{	if (!finished)
	{	if (document.layers)
		{	status = "Finalizing Maze. Get Ready ...";
			for (x=0;x<play;x++)
			{	document["point"+x].bgColor = pcolors[x];
			}
			for (x=1;x<divs;x++)
			{	document["d"+x].bgColor = bg;
			}
			document.bg.bgColor = "#000000";
			window.captureEvents(Event.KEYDOWN);
			window.onKeyDown = manageEvent;
			inter=parseInt(inter*2);
		}
		if (dyna)
		{    dwait = parseInt(500/(dyna*dyna));
		}
	} else {
		clearInterval(timer[5]);
		if (dyna)
		{	if (document.all)
			{	for (x=1;x<divs;x++)
				{	document.all["d"+x].style.background = bg;
				}
			} else if (document.layers)
			{	for (x=1;x<divs;x++)
				{	document["d"+x].bgColor = bg;
				}
			} else if (document.getElementById)
			{	for (x=1;x<divs;x++)
				{	document.getElementById("d"+x).style.background = bg;
				}
			}
		}
	}
	set();
}
function set()
{	mposx = new Array(0, coord.length-1,coord.length-1,0);
	mposy = new Array(0, coord[0].length-1, 0, coord[0].length-1);
	f = new Array(0,0,0,0);
	finished=0;
	if (document.all)
	{	for (x=0;x<play;x++)
		{	document.all["point"+x].style.left = (mposx[x]*scale+xoff)+"";
			document.all["point"+x].style.top = (mposy[x]*scale+yoff)+"";
			document.all["point"+x].style.visibility="visible";
			document.forms[0]["time"+x].value="0";
		}
		document.all.go.style.visibility = "hidden";
		document.all.ready.style.visibility = "visible";
	} else if (document.layers)
	{	for (x=0;x<play;x++)
		{	document["point"+x].left = (mposx[x]*scale+xoff);
			document["point"+x].top = (mposy[x]*scale+yoff);
			document["point"+x].visibility="visible";
			document.forms[0]["time"+x].value="0";
		}
		document.go.visibility = "hidden";
		document.ready.visibility = "visible";
	} else if (document.getElementbyId)
	{	for (x=0;x<play;x++)
		{	document.getElementById("point"+x).style.left = (mposx[x]*scale+xoff);
			document.getElementById("point"+x).style.top = (mposy[x]*scale+yoff);
			document.getElementById("point"+x).style.visibility="visible";
			document.forms[0]["time"+x].value="0";
		}
		document.getElementById("go").style.visibility = "hidden";
		document.getElementById("ready").style.visibility = "visible";
	}
	document.forms[0].time0.focus();
	/*if (best[(cols * rows)/100])
	{	document.forms[0].best.value = best[(cols * rows)/100];
	}//*/
	timer[0] = setTimeout("start()",1500);
}
function start()
{	if (dyna)
	{	timer[4] = setInterval("change()",dwait);
	}
	if (document.all)
	{	document.all.ready.style.visibility = "hidden";
		document.all.go.style.visibility = "visible";
	} else if (document.layers)
	{	document.ready.visibility = "hidden";
		document.go.visibility = "visible";
	} else if (document.getElementById)
	{	document.getElementById("ready").style.visiblity="hidden";
		document.getElementById("go").style.visiblity="visible";
	}
	status = " Go !";
	began=true;
	clearTimeout(timer[0]);
	date = new Date();
	timer[5] = setInterval("updateTime()",10);
}
function getNew()
{	var fields = new Array('play','interp','cols','rows','scalep','dyna');
	var qs = "?";
	for (x=0;x<fields.length;x++)
	{	qs+=fields[x]+"="+eval(fields[x])+"&";
	}
	window.location.href="index.htm"+qs;
}
function opts( file )
{	var win = window.open( file,"I","top=150,left=150,width=300,height=300,resize=yes,scrollbars=yes");
}
function change()
{	var d = parseInt(Math.random()*(divs-1)+1);
	var wall = Math.round(Math.random());
	var str = hash[d];
	var delimit = str.indexOf(":");
	var x = parseInt(str.substring(0,delimit));
	var y = parseInt(str.substring(delimit+1,str.length));
	coord[x][y] = wall;
	var c;
	wall?c="#000000":c=bg;
	if (document.layers)
	{    document["d"+d].bgColor = c;
	} else if (document.all)
	{    document.all["d"+d].style.background = c;
	} else if (document.getElementById)
	{	document.getElementById("d"+d).style.background = c;
	}
}
function updateTime()
{	for (c=0;c<play;c++)
	{	if (!f[c])
		{	document.forms[0]["time"+c].value= (new Date().getTime()-date.getTime())/1000;
		}
	}
}
/*function setBest(tm)
{	if (!best[(cols * rows)/100])
	{	alert(tm);
		best[(cols * rows)/100] =tm;
	} else if (tm<best[(cols * rows)/100])
	{	alert(tm);
		best[(cols * rows)/100] =tm;
	}
}//*/
function finish()
{	clearInterval(timer[4]);
	clearInterval(timer[5]);
	//flash(4);
	var times = new Array(document.forms[0].time0.value);
	var min = 0;
	var msg ="";
	for (x=1;x<play;x++)
	{	times[x] = document.forms[0]["time"+x].value;
		if (Math.min(times[x],times[min])==times[x])
		{	min = x;
		}
	}
	if (document.all)
	{	document.all.go.style.visibility = "hidden";
	} else if (document.layers)
	{	document.go.visibility = "hidden";
	} else if (document.getElementById)
	{	document.getElementById("go").style.visibility="hidden";
	}
	if (play>1)
	{	msg+="Winner: Player "+(min+1)+" \n";
	}
	msg+="Time: "+times[min]+" seconds. \n";
	//setBest(times[min]);
	if (confirm(msg+"\n  Race again?"))
	{	getNew();
	}//*/
}
function flash(pl)
{	if (document.all)
	{	document.all.bg.style.background=pcolors[pl];
		//document.all.bg.style.background="#000000";
	} else if (document.layers)
	{	document.bg.bgColor=pcolors[pl];
		//document.bg.bgColor="#000000";
	} else if (document.getElementById)
	{	document.getElementById("bg").style.background=pcolors[pl];
		//document.getElementById("bg").style.background="#000000";
	}
}
function movePoint(p,x,y)
{	if (document.all)
	{	document.all["point"+p].style.left = ((x*scale)+xoff)+"";
		document.all["point"+p].style.top = ((y*scale)+yoff)+"";
	} else if (document.layers)
	{	document["point"+p].left = x*scale+xoff;
		document["point"+p].top = y*scale+yoff;
	} else if (document.getElementById)
	{	document.getElementById("point"+p).style.top=y*scale+yoff;
		document.getElementById("point"+p).style.top=x*scale+xoff;
	}
}
function move(p,x,y)
{	x += mposx[p];
	y += mposy[p];
	if (x<coord.length && y<coord[0].length && x>=0 && y>=0 && coord[x][y])
	{	mposx[p] = x;
		mposy[p] = y;
		movePoint(p,x,y);
		if (!f[p] && x==fposx[p] && y==fposy[p])
		{	clearInterval(timer[p]);
			//clearInterval(timer[p+10]);
			document.forms[0]["time"+p].value = (new Date().getTime()-date.getTime())/1000;
			f[p] = true;
			flash(p);
			timer[6] = setTimeout("flash(4)",300);
			finished++;
			if (finished==play)
			{	finish();
			}
		}
	} else {
		clearInterval(timer[p]);
	}
}
function manageEvent(e)
{	if (document.layers && began)
	{	switch (e.which)
		{	case 97:
				clearInterval(timer[0]);
				timer[0] = setInterval("move(0,-1,0)",inter);
				break;
			case 119:
				clearInterval(timer[0]);
				timer[0] = setInterval("move(0,0,-1)",inter);
				break;
			case 100:
				clearInterval(timer[0]);
				timer[0] = setInterval("move(0,1,0)",inter);
				break;
			case 115:
				clearInterval(timer[0]);
				timer[0] = setInterval("move(0,0,1)",inter);
				break;
			case 52:
				clearInterval(timer[1]);
				timer[1] = setInterval("move(1,-1,0)",inter);
				break;
			case 56:
				clearInterval(timer[1]);
				timer[1] = setInterval("move(1,0,-1)",inter);
				break;
			case 54:
				clearInterval(timer[1]);
				timer[1] = setInterval("move(1,1,0)",inter);
				break;
			case 53:
				clearInterval(timer[1]);
				timer[1] = setInterval("move(1,0,1)",inter);
				break;
			case 106:
				clearInterval(timer[2]);
				timer[2] = setInterval("move(2,-1,0)",inter);
				break;
			case 105:
				clearInterval(timer[2]);
				timer[2] = setInterval("move(2,0,-1)",inter);
				break;
			case 108:
				clearInterval(timer[2]);
				timer[2] = setInterval("move(2,1,0)",inter);
				break;
			case 107:
				clearInterval(timer[2]);
				timer[2] = setInterval("move(2,0,1)",inter);
				break;
			case 102:
				clearInterval(timer[3]);
				timer[3] = setInterval("move(3,-1,0)",inter);
				break;
			case 116:
				clearInterval(timer[3]);
				timer[3] = setInterval("move(3,0,-1)",inter);
				break;
			case 104:
				clearInterval(timer[3]);
				timer[3] = setInterval("move(3,1,0)",inter);
				break;
			case 103:
				clearInterval(timer[3]);
				timer[3] = setInterval("move(3,0,1)",inter);
				break;
			default:
				break;
		}//end switch
	} else if ((document.all || document.getElementById) && began)
	{	switch (e.keyCode)
		{	case 65:
				clearInterval(timer[0]);
				timer[0] = setInterval("move(0,-1,0)",inter);
				break;
			case 87:
				clearInterval(timer[0]);
				timer[0] = setInterval("move(0,0,-1)",inter);
				break;
			case 68:
				clearInterval(timer[0]);
				timer[0] = setInterval("move(0,1,0)",inter);
				break;
			case 83:
				clearInterval(timer[0]);
				timer[0] = setInterval("move(0,0,1)",inter);
				break;
			case 100:
				clearInterval(timer[1]);
				timer[1] = setInterval("move(1,-1,0)",inter);
				break;
			case 104:
				clearInterval(timer[1]);
				timer[1] = setInterval("move(1,0,-1)",inter);
				break;
			case 102:
				clearInterval(timer[1]);
				timer[1] = setInterval("move(1,1,0)",inter);
				break;
			case 101:
				clearInterval(timer[1]);
				timer[1] = setInterval("move(1,0,1)",inter);
				break;
			case 74:
				clearInterval(timer[2]);
				timer[2] = setInterval("move(2,-1,0)",inter);
				break;
			case 73:
				clearInterval(timer[2]);
				timer[2] = setInterval("move(2,0,-1)",inter);
				break;
			case 76:
				clearInterval(timer[2]);
				timer[2] = setInterval("move(2,1,0)",inter);
				break;
			case 75:
				clearInterval(timer[2]);
				timer[2] = setInterval("move(2,0,1)",inter);
				break;
			case 70:
				clearInterval(timer[3]);
				timer[3] = setInterval("move(3,-1,0)",inter);
				break;
			case 84:
				clearInterval(timer[3]);
				timer[3] = setInterval("move(3,0,-1)",inter);
				break;
			case 72:
				clearInterval(timer[3]);
				timer[3] = setInterval("move(3,1,0)",inter);
				break;
			case 71:
				clearInterval(timer[3]);
				timer[3] = setInterval("move(3,0,1)",inter);
				break;
			default:
				break;
		}//end switch
	}//end if/else
}