//FG1.2

///////////////////////////////////////
//                                   //
//   Frogger v1.2 by brothercake     //
//   http://www.brothercake.com/     //
//                                   //
///////////////////////////////////////






//game speed (greater is slightly faster [1 - 10])
var gameSpeed = 4;

//animation resolution (greater is smoother [1|2|4|8|16])
var gameResolution = 4;

//frog error tolerance (smaller fraction is less tolerance [1/1 - 1/32])
var frogTolerance = 1/4;






//which round [1+]
var whichRound = 1;

//randomization factor (greater is more difficult [0.1 - 3.0 but cars max out at 1.0])
var randomFactor = 0.4;

//starting theme [0-3];
var startingTheme = 0;






//frog lives
var frogLives = 5;

//grid position and square size
var gridPos = [4,4];
var gridDim = 32;

//relative floater speed
var floaterSpeed = 40;

//remember initial values
var remLives=frogLives;
var remRandom = randomFactor;

//game score
var gameScore = 0;



//browsers
var ie = (typeof document.all!="undefined"&&typeof window.opera=="undefined") ? true : false;
var dom = (typeof document.getElementById!="undefined"&&typeof window.opera=="undefined") ? true : false;
if(ie&&!dom) { ie=false; }

//adjust for relative performance in moz
if(!ie) { 
	gameSpeed=2; 
	gameResolution=3.5;
	}

//show message
var msgObj=null;
var msgData;
function createMessageLayer(msgHTML) {

	//create message div
	msgObj=document.createElement("div");
	document.body.appendChild(msgObj);

	//layer formatting
	msgData='<table cellpadding="0" cellspacing="0" border="0" style="width:'+(gridDim*23)+'px;height:'+(gridDim*12)+'px;position:absolute;left:'+(gridPos[0])+'px;top:'+(gridPos[1])+'px;z-index:150;"><tr><td align="center" valign="middle">';
	msgData+='<table cellpadding="0" cellspacing="12" border="0" style="-moz-box-sizing:border-box;font:15px comic sans ms,arial;color:#cc6600;font-weight:bold;background-color:#f8fbd0;border:4px double #ff9600;width:250px;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135,strength=5);">';
	msgData+='<tr>';
	msgData+='<td align="center">'+msgHTML+'</td>';
	msgData+='</tr>';
	msgData+='</table>';
	msgData+='</td></tr></table>';

	//write to div
	msgObj.innerHTML = msgData;

	}

//write loading message
if(dom) { createMessageLayer(dialogue[0]); }



//delete message
function deleteMessageLayer() {
	document.body.removeChild(msgObj);
	msgObj=null;
	}



//music control
var themePlaying = false;
function toggleMusic()
{
	var themeHolder = document.getElementById('themeHolder');
	if(!themePlaying)
	{	
		themeHolder.innerHTML = '<embed id="themePlayer" src="theme.mid" autostart="true" loop="true"></embed>';
		themePlaying = true;
	}
	else
	{
		themeHolder.innerHTML = '';
		themePlaying = false;
	}
}



//default page zoom
var pageZoom;

//if a query string is present
if(location.search) {
	//if size is set to auto
	if(qStr["size"] == "auto") {
		//set zoom based on window dimensions 
		pageZoom = document.body.clientWidth/((gridDim*23)+(gridPos[0]*2));
		pageZoom = Math.round(pageZoom*100)/100;
		document.body.style.zoom = pageZoom;
		}
	}
//resize/reload
window.onresize = new Function("window.location.reload()");



//scoring frame
document.write('<iframe name="scoreframe" id="score" src="" width="'+(gridDim*11)+'" height="'+(gridDim*11)+'" frameborder="0" style="display:none;border:4px double #ff9600;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135,strength=5);position:absolute;left:'+(gridPos[0]+gridDim*5.5)+'px;top:'+(gridPos[1]*2)+'px;z-index:500;"></iframe>');



//water surface images
var water = new Array;
for(var i=0;i<4;i++){
	water[i] = new Image;
	water[i].src = "water"+i+".jpg";
	}
//surface number
var waterNum = startingTheme;

//road surface images
var roads = new Array;
for(i=0;i<4;i++){
	roads[i] = new Image;
	roads[i].src = "road"+i+".jpg";
	}
//surface number
var roadNum = startingTheme;

//bank surface images
var banks = new Array;
for(i=0;i<4;i++){
	banks[i] = new Image;
	banks[i].src = "bank"+i+".jpg";
	}
//surface number
var bankNum = startingTheme;


//create backgrounds
var gridStr = '';
for(i=0;i<12;i++){

	//grass borders on first, center and last row
	if(i==0) {
		gridStr+='<div style="-moz-box-sizing:border-box;border-bottom:2px solid #339933;background-color:#88bb88;position:absolute;left:'+(gridPos[0])+'px;top:'+(gridPos[1]+(gridDim*i))+'px;width:'+(gridDim*23)+'px;height:'+gridDim+'px;z-index:15;">';
		gridStr+='</div>';
		}
	if(i==5) {
		gridStr+='<div id="banksurface0" style="background-image:url('+banks[bankNum].src+');background-color:#99cc99;position:absolute;left:'+(gridPos[0])+'px;top:'+(gridPos[1]+(gridDim*i))+'px;width:'+(gridDim*23)+'px;height:'+gridDim+'px;z-index:15;">';
		gridStr+='</div>';
		}
	if(i==10) {
		gridStr+='<div id="banksurface1" style="background-image:url('+banks[bankNum].src+');background-color:#99cc99;position:absolute;left:'+(gridPos[0])+'px;top:'+(gridPos[1]+(gridDim*i))+'px;width:'+(gridDim*23)+'px;height:'+(gridDim+4)+'px;z-index:15;">';
		gridStr+='</div>';
		}

	//home squares
	if(i==0) {
		for(var j=0;j<5;j++){
			gridStr+='<div id="home'+j+'" style="-moz-box-sizing:border-box;background-image:url(bank0.jpg);background-color:#99cc99;border-left:2px solid #339933;border-right:2px solid #339933;position:absolute;left:'+(gridPos[0]+(gridDim*1.5)+(j*(gridDim*4.5)))+'px;top:'+(gridPos[1]+(gridDim*i))+'px;width:'+(gridDim*2)+'px;height:'+gridDim+'px;z-index:15;">';
			gridStr+='</div>';
			}
		}

	//water between first and center rows
	if(i==1) {
		gridStr+='<div id="watersurface" style="-moz-box-sizing:border-box;background-image:url('+water[waterNum].src+');border-bottom:2px ridge #f6f6f6;background-color:#99cccc;position:absolute;left:'+(gridPos[0])+'px;top:'+(gridPos[1]+(gridDim*i))+'px;width:'+(gridDim*23)+'px;height:'+(gridDim*4)+'px;z-index:10;">';
		gridStr+='</div>';
		}

	//roads between center and last rows
	if(i==6) {
		gridStr+='<div id="roadsurface" style="-moz-box-sizing:border-box;border-top:2px ridge #f6f6f6;border-bottom:2px ridge #f6f6f6;background-image:url('+roads[roadNum].src+');background-color:#cccccc;position:absolute;left:'+(gridPos[0])+'px;top:'+(gridPos[1]+(gridDim*i))+'px;width:'+(gridDim*23)+'px;height:'+(gridDim*4)+'px;z-index:10;">';

		//road markings
		gridStr+='<table cellpadding="0" cellspacing="0" border="0" style="height:'+gridDim+'px;">';
		gridStr+='<tr><td style="width:'+(gridDim*1.5)+'px">&nbsp;</td>';
		for(j=0;j<8;j++){
			gridStr+='<td style="border-bottom:3px solid #f6f6f6;width:'+gridDim+'px"><img src="blank.gif" width="1" height="1" alt="" border="0"></td>';
			gridStr+='<td style="width:'+(gridDim*2)+'px">&nbsp;</td>';
			}
		gridStr+='</tr>';
		gridStr+='</table>';
		gridStr+='<table cellpadding="0" cellspacing="0" border="0" style="height:'+gridDim+'px;">';
		gridStr+='<tr><td style="border-bottom:3px double #f6f6f6;width:'+(gridDim*23)+'px"><img src="blank.gif" width="1" height="1" alt="" border="0"></td></tr>';
		gridStr+='</table>';
		gridStr+='<table cellpadding="0" cellspacing="0" border="0" style="height:'+gridDim+'px;">';
		gridStr+='<tr><td style="width:'+(gridDim*1.5)+'px">&nbsp;</td>';
		for(j=0;j<8;j++){
			gridStr+='<td style="border-bottom:3px solid #f6f6f6;width:'+gridDim+'px"><img src="blank.gif" width="1" height="1" alt="" border="0"></td>';
			gridStr+='<td style="width:'+(gridDim*2)+'px">&nbsp;</td>';
			}
		gridStr+='</tr>';
		gridStr+='</table>';

		gridStr+='</div>';
		}

	}


//lives container
gridStr+='<div id="lives" style="position:absolute;left:'+(gridPos[0]-2)+'px;top:'+(gridPos[1]+(gridDim*12)-24)+'px;z-index:120;">';
gridStr+='</div>';

//control panel
gridStr+='<table cellpadding=0 cellspacing=0 border=0 style="-moz-box-sizing:border-box;cursor:default;border:2px solid #336633;background-color:#88bb88;position:absolute;right:' + (document.body.clientWidth - (gridDim*24) + 26) + 'px;top:'+(gridPos[1]+(gridDim*12)-24)+'px;z-index:120;">';
gridStr+='<form name="controlform"><tr>';
gridStr+='<td style="width:20px;" class="conlabel">&nbsp;<img style="margin:4px 0 0 5px;cursor:hand;" onmousedown="this.style.marginLeft=\'6px\'" onmouseup="this.style.marginLeft=\'5px\'" onclick="toggleMusic()" src="audio.gif" width="6" height="11" alt=""></td>';
gridStr+='<td style="width:50px;" class="conlabel">&nbsp;' + dialogue[1] + '</td>';
gridStr+='<td><input type="text" name="rounds" value="" class="coninput" readonly style="width:35px;margin-right:4px;"></td>';
gridStr+='<td style="width:46px;" class="conlabel">&nbsp;' + dialogue[2] + '</td>';
gridStr+='<td><input type="text" name="score" value="" class="coninput" readonly style="width:45px;margin-right:4px;"></td>';
gridStr+='</tr></form>';
gridStr+='</table>';

//write backgrounds
if(dom) { document.write(gridStr); }


//control panel form object
var con = document.forms["controlform"];

if(dom) { 
	//lives container object
	var livesObj = document.getElementById("lives"); 

	//surface objects
	var waterSurface = document.getElementById("watersurface");
	var roadSurface = document.getElementById("roadsurface");
	var bankSurface = new Array;
	for(i=0;i<4;i++){
		bankSurface[i] = document.getElementById("banksurface"+i);
		}

	}


//restrict gridPos to minimum 2
for(i=0;i<2;i++){
	if(gridPos[i]<2) { gridPos[i]=2; }
	}
//mask overlays
var docDim;
if(ie) { docDim = [document.body.clientWidth,document.body.clientHeight]; }
else { docDim = [window.innerWidth,window.innerHeight]; }

var maskStr='';
//left
maskStr+='<div class="mask" style="left:0px;top:0px;width:'+gridPos[0]+'px;height:'+docDim[1]+'px;"></div>';
//top
maskStr+='<div class="mask" style="left:0px;top:0px;width:'+docDim[0]+'px;height:'+gridPos[1]+'px;"></div>';
//right
maskStr+='<div class="mask" style="left:'+(gridPos[0]+(23*gridDim))+'px;top:0px;width:'+(docDim[0]-(gridPos[0]+(23*gridDim)))+'px;height:'+docDim[1]+'px;"></div>';
//bottom
maskStr+='<div class="mask" style="left:0px;top:'+(gridPos[1]+(11*gridDim)+4)+'px;width:'+docDim[0]+'px;height:'+(docDim[1]-(gridPos[1]+(11*gridDim)))+'px;"></div>';

//outer border
var obSize=2;
maskStr+='<div style="-moz-box-sizing:border-box;border:'+obSize+'px solid #336633;position:absolute;left:'+(gridPos[0]-obSize)+'px;top:'+(gridPos[1]-obSize)+'px;width:'+((gridDim*23)+(obSize*2))+'px;height:'+((gridDim*11)+(obSize*2)+4)+'px;z-index:110;"></div>';

//write overlays
if(dom) { document.write(maskStr); }




//log image arrays
var logNames=["","_leftcroc","_rightcroc"];
var logs = new Array;
for(i=0;i<3;i++){
	logs[i] = new Image;
	logs[i].src = "log"+logNames[i]+".gif";
	}
var logLen = logs.length;

//leaf image arrays
var leafs = new Array;
leafs[0] = new Image;
leafs[0].src = "leaf0.gif";


//obstacle image arrays
var leftTrucks = new Array;
for(i=0;i<5;i++){
	leftTrucks[i] = new Image;
	leftTrucks[i].src = "truck_left"+i+".gif";
	}
var lTLen = leftTrucks.length;
var rightTrucks = new Array;
for(i=0;i<5;i++){
	rightTrucks[i] = new Image;
	rightTrucks[i].src = "truck_right"+i+".gif";
	}
var rTLen = rightTrucks.length;
var leftCars = new Array;
for(i=0;i<5;i++){
	leftCars[i] = new Image;
	leftCars[i].src = "car_left"+i+".gif";
	}
var lCLen = leftCars.length;
var rightCars = new Array;
for(i=0;i<5;i++){
	rightCars[i] = new Image;
	rightCars[i].src = "car_right"+i+".gif";
	}
var rCLen = rightCars.length;
rightCars["cop"] = new Image;
rightCars["cop"].src = "cop_car.gif";


//relative difficulty, adjusted by number of objects
var relativeDifficulty;


//write moving objects into node
var obsStr,thisPos,minCounts,logSrc;
function createMovingObjects(nodeObj) {

	//ensure at least one of each object
	minCounts = [0,0,0,0,0,0,0,0];

	//relative difficulty
	relativeDifficulty = 50;

	obsStr='';
	for(i=0;i<12;i++){
		for(j=0;j<23;j++){

			//starting position of object
			thisPos = [(gridPos[0]+(gridDim*j)),(gridPos[1]+(gridDim*i))]

			switch(i) {

				//mid-speed right-moving leaf
				case 1 :    //max proximity        //50/50+weighted chance of object           //minimum of 1
					if(( (parseInt(j/4)==j/4 && (Math.random()*(2/(1/randomFactor)))<1) || (j==22&&minCounts[0]==0) ) ) {
						obsStr+='<div style="position:absolute;left:'+thisPos[0]+'px;top:'+thisPos[1]+'px;width:'+gridDim+'px;height:'+gridDim+'px;z-index:20;">';
						obsStr+='<img obtype="rightLeafs" src="'+leafs[0].src+'" height="'+gridDim+'" alt="" border="0">';
						obsStr+='</div>';
						minCounts[0]++;
						relativeDifficulty--;
						}
					break;

				//high-speed left-moving log
				case 2 :    //max proximity        //50/50+weighted chance of object           //minimum of 1
					if(( (parseInt(j/5)==j/5 && (Math.random()*(2/(1/randomFactor)))<1) || (j==22&&minCounts[1]==0) ) ) {
						obsStr+='<div style="position:absolute;left:'+thisPos[0]+'px;top:'+thisPos[1]+'px;width:'+gridDim+'px;height:'+gridDim+'px;z-index:20;">';
						obsStr+='<img obtype="leftLogs" src="'+logs[0].src+'" height="'+gridDim+'" alt="" border="0">';
						obsStr+='</div>';
						relativeDifficulty--;
						minCounts[1]++;
						}
					break;

				//mid-speed left-moving leaf
				case 3 :     //max proximity        //50/50+weighted chance of object          //minimum of 1
					if(( (parseInt(j/4)==j/4 && (Math.random()*(2/(1/randomFactor)))<1) || (j==22&&minCounts[2]==0) ) ) {
						obsStr+='<div style="position:absolute;left:'+thisPos[0]+'px;top:'+thisPos[1]+'px;width:'+gridDim+'px;height:'+gridDim+'px;z-index:20;">';
						obsStr+='<img obtype="leftLeafs" src="'+leafs[0].src+'" height="'+gridDim+'" alt="" border="0">';
						obsStr+='</div>';
						relativeDifficulty--;
						minCounts[2]++;
						}
					break;

				//low-speed right-moving log
				case 4 :     //max proximity         //50/50+weighted chance of object         //minimum of 1
					if(( (parseInt(j/5)==j/5 && (Math.random()*(2/(1/randomFactor)))<1) || (j==22&&minCounts[3]==0) ) ) {
						obsStr+='<div style="position:absolute;left:'+thisPos[0]+'px;top:'+thisPos[1]+'px;width:'+gridDim+'px;height:'+gridDim+'px;z-index:20;">';
						obsStr+='<img obtype="rightLogs" src="'+logs[0].src+'" height="'+gridDim+'" alt="" border="0">';
						obsStr+='</div>';
						relativeDifficulty--;
						minCounts[3]++;
						}
					break;

				//low-speed right-facing trucks
				case 6 :     //max proximity        //50/50+weighted chance of object    //minimum of 1                //constrain by round number
					//not round 9
					if(( (parseInt(j/4)==j/4 && Math.random()*(1/randomFactor)<1) || (j==22&&minCounts[4]==0) ) && minCounts[4]<=(whichRound)) {
						obsStr+='<div class="car" style="position:absolute;left:'+thisPos[0]+'px;top:'+thisPos[1]+'px;width:'+gridDim+'px;height:'+gridDim+'px;z-index:40;">';
						obsStr+='<img obtype="rightTrucks" src="'+rightTrucks[parseInt(Math.random()*rTLen)].src+'" height="'+gridDim+'" alt="" border="0">';
						obsStr+='</div>';
						relativeDifficulty++;
						minCounts[4]++;
						}
					break;

				//high-speed right-facing cars
				case 7 :     //max proximity        //50/50+weighted chance of object    //minimum of 1                //maximum of 6     //constrain by round number
					if(( (parseInt(j/3)==j/3 && Math.random()*(1/randomFactor)<1) || (j==22&&minCounts[5]==0) ) && minCounts[5]<=6 && minCounts[5]<=(whichRound)) {
						obsStr+='<div class="car" style="position:absolute;left:'+thisPos[0]+'px;top:'+thisPos[1]+'px;width:'+gridDim+'px;height:'+gridDim+'px;z-index:40;">';
						obsStr+='<img obtype="rightCars" src="'+rightCars[parseInt(Math.random()*rCLen)].src+'" height="'+gridDim+'" alt="" border="0">';
						obsStr+='</div>';
						relativeDifficulty++;
						minCounts[5]++;
						}
					break;

				//mid-speed left-facing cars
				case 8 :     //max proximity        //50/50+weighted chance of object    //minimum of 1                //maximum of 6     //constrain by round number
					if(( (parseInt(j/3)==j/3 && Math.random()*(1/randomFactor)<1) || (j==22&&minCounts[6]==0) ) && minCounts[6]<=6  && minCounts[6]<=(whichRound)) {
						obsStr+='<div class="car" style="position:absolute;left:'+thisPos[0]+'px;top:'+thisPos[1]+'px;width:'+gridDim+'px;height:'+gridDim+'px;z-index:40;">';
						obsStr+='<img obtype="leftCars" src="'+leftCars[parseInt(Math.random()*lCLen)].src+'" height="'+gridDim+'" alt="" border="0">';
						obsStr+='</div>';
						relativeDifficulty++;
						minCounts[6]++;
						}
					break;

				//low-speed left-facing trucks
				case 9 :     //max proximity        //50/50+weighted chance of object    //minimum of 1                //constrain by round number
					if(( (parseInt(j/4)==j/4 && Math.random()*(1/randomFactor)<1) || (j==22&&minCounts[7]==0) ) && minCounts[7]<=(whichRound)) {
							obsStr+='<div class="car" style="position:absolute;left:'+thisPos[0]+'px;top:'+thisPos[1]+'px;width:'+gridDim+'px;height:'+gridDim+'px;z-index:40;">';
							obsStr+='<img obtype="leftTrucks" src="'+leftTrucks[parseInt(Math.random()*lTLen)].src+'" height="'+gridDim+'" alt="" border="0">';
							obsStr+='</div>';
							relativeDifficulty++;
							minCounts[7]++;
						}
					break;

				}

			}
		}

	//write to page
	nodeObj.innerHTML = obsStr;

	return obsStr;
	}




//obstacle speeds
var obstacleSpeeds = [480,140,360,280,400,100,180,500];

//obstacle groups
var obstacleGroups = ["rightLeafs","leftLogs","leftLeafs","rightLogs","rightTrucks","rightCars","leftCars","leftTrucks"];
//obstacle objects
var obstacleObjects = new Array;
for(i=0;i<8;i++){
	obstacleObjects[obstacleGroups[i]] = new Array;
	}
//obstacle timers
var obstacleTimers = new Array;


//score value (extrapolated from relative difficulty)
var scoreValue = 0;


//create obstacles
var obsDiv;
function createObstacles() {

	//create node
	obsDiv = document.createElement("div");
	document.body.appendChild(obsDiv);

	//write moving objects into node
	createMovingObjects(obsDiv);

	//set score value
	scoreValue = Math.round((relativeDifficulty*2)/10);

	//double for every completed loop of 8 rounds
	if(whichRound>=9) { scoreValue=scoreValue*(parseInt(whichRound/8)+1); }
	}


//initialise moving obstacles
function initialiseObstacles() {

	//restop obstacles - this *might* prevent multiple-timer problem
	paused=false;
	stopObstacles();

	//find each obstacle row and start timer
	for(i=0;i<8;i++){
		animateObstacleRow(i,obstacleSpeeds[i],obstacleGroups[i]);
		}

	//"paused" boolean
	paused=false;
	}


//pause moving obstacles
var paused=false;
function stopObstacles(){

	//if not already paused
	if(!paused) {

		//"paused" boolean
		paused=true;

		//stop timers
		for(i=0;i<8;i++){
			if(typeof obstacleTimers[i]!="undefined") {
				clearInterval(obstacleTimers[i]);
				}
			}

		//stop floaters
		if(floatNum>0){
			for(i=0;i<floatNum;i++){
				clearInterval(floatTimers[i]);
				}
			}

		}

	}

//reinitialise moving obstacles
var df;
function restartObstacles(){

	//if already paused
	if(paused) {

		//"paused" boolean
		paused=false;

		//restart timers
		initialiseObstacles();

		//restart floaters
		if(floatNum>0){
			for(i=0;i<floatNum;i++){
				floatTimers[i] = setInterval("animateFloaters()",500/gameSpeed);
				}
			}

		}

	}



//animate obstacle rows
var dImg,imgsLen;
function animateObstacleRow(aniNum,aniSpeed,aniGroup) {

	//images array
	dImg = document.images;
	imgsLen = dImg.length;
	var obi = 0;

	//build object groups
	for(j=0;j<imgsLen;j++){
		if(dImg[j].getAttribute("obtype")==aniGroup){
			obstacleObjects[aniGroup][obi++] = dImg[j].parentNode;
			}
		}

	//start timers
	obstacleTimers[aniNum] = setInterval("moveObstacleRow('"+aniGroup+"')",aniSpeed/gameSpeed);
	}



//move obstacle row
var groupLen,obstacleObj,obstaclePos,obstacleTop,obstacleSrc,crocChance;
var doneTopCop=false;
var doneBottomCop=false;
var doneLeftCroc=false;
var doneRightCroc=false;
function moveObstacleRow(moveGroup) {

	//number of objects in group
	groupLen = obstacleObjects[moveGroup].length;

	if(moveGroup.indexOf("right")!=-1) {
		for(i=0;i<groupLen;i++){

			//obstacle object
			obstacleObj = obstacleObjects[moveGroup][i];

			//calculate new position
			obstaclePos = (obstacleObj.offsetLeft+(gridDim/gameResolution));
			//if object is past the edge
			if(obstaclePos>(gridPos[0]+(gridDim*23))) {
				//loop position
				obstaclePos = gridPos[0]-(obstacleObj.firstChild.offsetWidth);
				//change image
				switch(moveGroup){
					case "rightLogs" :
						//random 1 in 12-weighted chance of crocodile log from round 2 onwards //always at first instance
						logSrc = logs[0].src;
						crocChance = (12-whichRound);if(crocChance<2) { crocChance=2; }
						if(whichRound>=2 && ((Math.random()*crocChance)<1 || !doneRightCroc) ) {
							logSrc = logs[2].src;
							doneRightCroc=true;
							}
						//set and change src
						obstacleObj.firstChild.src = logSrc;
						break;
					case "rightTrucks" :
						//set and change src
						obstacleObj.firstChild.src = rightTrucks[parseInt(Math.random()*rTLen)].src;
						break;
					case "rightCars" :
						//random 1 in 50-weighted chance of police car from round 4 onwards //always happens at first instance
						if(whichRound>=4 &&  ((Math.random()*(50-(whichRound*2)))<1 || !doneTopCop) ) {
							doneTopCop=true;
							//set src
							obstacleSrc = rightCars["cop"].src;
							//shift top position
							obstacleTop = gridPos[1]+(gridDim*5);
							}
						//if !paused and frog not about to get home //do not create if frog is higher than center  //random 1 in 80-weighted chance of police car from round 6 onwards //always happens at first instance
						else if(!paused&&!forceBlocked&&(frogPos[1]>(gridPos[1]+(gridDim*4)))&&((whichRound>=6 &&  ((Math.random()*(80-(whichRound*2)))<1 || !doneBottomCop) ))) {
							doneBottomCop=true;
							//set src
							obstacleSrc = rightCars["cop"].src;
							//shift top position
							obstacleTop = gridPos[1]+(gridDim*10);
							}
						else {
							//set src
							obstacleSrc = rightCars[parseInt(Math.random()*rCLen)].src;
							//normal top position
							obstacleTop = gridPos[1]+(gridDim*7);
							}
						//move car
						obstacleObj.style.top = obstacleTop+"px";
						//change src
						obstacleObj.firstChild.src = obstacleSrc;
						break;
					}
				}
			//move object left
			obstacleObj.style.left = obstaclePos+"px";

			//if not paused
			if(!paused){
				//check for road contact
				if(moveGroup.indexOf("Trucks")!=-1||moveGroup.indexOf("Cars")!=-1) {
					checkRoadStatus(obstaclePos,obstacleObj,"right");
					}

				//check for frog being in the water
				else {
					checkWaterStatus(obstaclePos,obstacleObj,groupLen,"right");
					}
				}

			}

		//move frog if it's in a water row
		if(frogMover==moveGroup){

			//move frog
			frogPos[0] += (gridDim/gameResolution);
			frogObj.style.left = frogPos[0]+"px";

			//if there's a fly, check for frog contact
			if(flyLive) { checkFlyStatus(); }

			//lose life if it goes over the edge
			if(frogPos[0]>gridPos[0]+(gridDim*23)+toleranceNum) {
				frogMover="";
				loseFrogLife();
				}
			}

		}
	if(moveGroup.indexOf("left")!=-1) {
		for(i=0;i<groupLen;i++){

			//obstacle object
			obstacleObj = obstacleObjects[moveGroup][i];

			//calculate new position
			obstaclePos = (obstacleObj.offsetLeft-(gridDim/gameResolution));
			//if object is past the edge
			if(obstaclePos<(gridPos[0]-(obstacleObj.firstChild.offsetWidth))) {
				//loop position
				obstaclePos = gridPos[0]+(gridDim*23);
				//change image
				switch(moveGroup){
					case "leftLogs" :
						//random 1 in 10-weighted chance of crocodile log from round 2 onwards
						logSrc = logs[0].src;
						crocChance = (10-whichRound);if(crocChance<2) { crocChance=2; }
						if(whichRound>=2 && ((Math.random()*crocChance)<1 || !doneLeftCroc)) {
							logSrc = logs[1].src;
							doneLeftCroc=true;
							}
						//set and change src
						obstacleObj.firstChild.src = logSrc;
						break;
					case "leftTrucks" :
						//set and change src
						obstacleObj.firstChild.src = leftTrucks[parseInt(Math.random()*lTLen)].src;
						break;
					case "leftCars" :
						//set and change src
						obstacleObj.firstChild.src = leftCars[parseInt(Math.random()*lCLen)].src;
						break;
					}
				}
			//move object
			obstacleObj.style.left = obstaclePos+"px";

			//check for road contact
			if(moveGroup.indexOf("Trucks")!=-1||moveGroup.indexOf("Cars")!=-1) {
				checkRoadStatus(obstaclePos,obstacleObj,"left");
				}

			//check for frog being in the water
			else {
				checkWaterStatus(obstaclePos,obstacleObj,groupLen,"left");
				}

			}

		//move frog if it's in a water row
		if(frogMover==moveGroup){

			//move frog
			frogPos[0] -= (gridDim/gameResolution);
			frogObj.style.left = frogPos[0]+"px";

			//if there's a fly, check for frog contact
			if(flyLive) { checkFlyStatus(); }

			//lose life if it goes over the edge
			if(frogPos[0]<(gridPos[0]-gridDim-toleranceNum)) {
				frogMover="";
				loseFrogLife();
				}
			}

		}


	}







//change score
function increaseScore(incBy) {
	gameScore+=incBy;
	con["score"].value = gameScore;
	}





//frog position
var frogPos = [gridPos[0]+(gridDim*11),gridPos[1]+(gridDim*10)];


//create frog
var frogNames = ["left","up","right","down"];
var frogs = new Array;
for(i=0;i<4;i++){
	frogs[frogNames[i]]=new Image;
	frogs[frogNames[i]].src="frog_"+frogNames[i]+".gif";
	}
var frogStr = '';
frogStr='<div id="frog" style="visibility:hidden;position:absolute;left:'+frogPos[0]+'px;top:'+frogPos[1]+'px;z-index:30;">';
frogStr+='<img src="'+frogs["up"].src+'" width="'+gridDim+'" height="'+gridDim+'" alt="" border="0">';
frogStr+='</div>';
document.write(frogStr);


//block interval - the delay after death/win when keyboard is temporarily unresponsive
var blockInterval = 650;
//block timer
var blockTimer;
//unblock
function unblock() {
	clearInterval(blockTimer);
	forceBlocked=false;
	paused=false;
	//show frog if you've not just won
	if(winFrog<5) { frogObj.style.visibility="visible"; }
	}

//create frog object vars
if(dom) {
	var frogObj = document.getElementById("frog");
	var frogImg = frogObj.firstChild;
	}

//which frogs are home
var frogsHome = [false,false,false,false,false];
var homeFrogs = new Array;

var homePos = [gridPos[0]+(gridDim*11),gridPos[1]+(gridDim*10)];

//move frog to start position
function frogToStart() {
	frogObj.style.visibility="hidden";
	frogPos = [homePos[0],homePos[1]];
	frogObj.style.left = frogPos[0]+"px";
	frogObj.style.top = frogPos[1]+"px";
	frogImg.src = frogs["up"].src;
	}


//forced block var to override pause control being pressed
var forceBlocked=false;

//frog made it home
var winFrog=0;
var homeFrog,winStr;
function frogHome(fhNum) {

	//create duplicate frog
	homeFrogs[fhNum] = document.createElement("div");
	document.body.appendChild(homeFrogs[fhNum]);
	homeFrogs[fhNum].innerHTML = '<img style="-moz-opacity:0.4;filter:alpha(opacity=40);position:absolute;left:'+frogObj.offsetLeft+'px;top:'+(frogObj.offsetTop-gridDim)+'px;z-index:25;" src="'+frogs["up"].src+'" width="'+gridDim+'" height="'+gridDim+'" alt="" border="0">';

	//mark frog as home
	frogsHome[fhNum] = true;

	//force block
	forceBlocked=true;
	//temporarily block keypresses
	paused=true;
	//set timer to release
	blockTimer = setInterval("unblock()",blockInterval);

	//move main frog to start position
	frogToStart();

	//increase score
	increaseScore(scoreValue);

	//look for a winner
	winFrog=0;
	for(i=0;i<5;i++){
		if(frogsHome[i]) { winFrog++; }
		}

	//win this round
	if(winFrog==5) {

		//temporarily hide frog
		frogObj.style.visibility="hidden";

		//show message
		winStr=dialogue[3]+'<br>'+dialogue[4].replace('$',whichRound);
		winStr+='<p><input id="ok" type="button" onclick="okButton=null;newGame(\'win\')" value="' + dialogue[5] + '" class="prefbutton">';
		createMessageLayer(winStr);
		document.getElementById("ok").focus();

		}

	}



//translate frog tolerance to pixel value
var toleranceNum = gridDim*frogTolerance;


//check for road contact
function checkRoadStatus(obsLeft,obsObj,obsDir) {

	//if vehicle is in frog row
	if(obsObj.offsetTop==frogPos[1]) {

		//vehicles moving left
		if(obsDir=="left"){
			if(
				//vehicle front entered frog space
				obsLeft>=frogPos[0] && obsLeft<=(frogPos[0]+gridDim-toleranceNum)
				||
				//frog entered vehicle space
				obsLeft<=frogPos[0] && (obsLeft+obsObj.firstChild.offsetWidth)>=(frogPos[0]+toleranceNum)
				) {
				frogContact();
				}
			}

		//vehicles moving right
		if(obsDir=="right"){
			//create left point which is += width
			obsLeft+=obsObj.offsetWidth;
			if(
				//vehicle front entered frog space
				obsLeft>=(frogPos[0]+toleranceNum) && obsLeft<=(frogPos[0]+gridDim-toleranceNum)
				||
				//frog entered vehicle space
				obsLeft>=(frogPos[0]+gridDim) && (obsLeft-obsObj.firstChild.offsetWidth)<=(frogPos[0]+gridDim-toleranceNum)
				) {
				frogContact();
				}
			}

		}

	}


//counting vars for frog on water obstacle
var dryFrog = false;
var obsCount = 0;
//cause of death var
var deathType = "";

//check for frog being in the water
function checkWaterStatus(obsLeft,obsObj,obsLen,obsDir) {

	//if floater is in frog row
	if(obsObj.offsetTop==frogPos[1]) {

		//floaters moving left
		if(obsDir=="left"){
			obsCount++;
			//frog entered floating space
			if(obsLeft<=(frogPos[0]+toleranceNum) && (obsLeft+obsObj.firstChild.offsetWidth)>=(frogPos[0]+gridDim-toleranceNum)) {
				dryFrog=true;
				//check for crocodile log
				if(obsObj.firstChild.src.indexOf("croc")!=-1) {
					//die if frog is in head area
					if((frogPos[0]+toleranceNum)<obsLeft+(26*(gridDim/32))) {
						dryFrog=false;
						deathType="croc";
						}
					}
				}
			}

		//floaters moving right
		if(obsDir=="right"){
			obsCount++;
			//frog entered floating space
			if((obsLeft+obsObj.firstChild.offsetWidth)>=(frogPos[0]+gridDim-toleranceNum) && obsLeft<=(frogPos[0]+toleranceNum)) {
				dryFrog=true;
				//check for crocodile log
				if(obsObj.firstChild.src.indexOf("croc")!=-1) {
					//die if frog is in head area
					if((frogPos[0]+gridDim-toleranceNum)>obsLeft+obsObj.firstChild.offsetWidth-(26*(gridDim/32))) {
						dryFrog=false;
						deathType="croc";
						}
					}
				}
			}

		//lose life if frog is not on an object
		if(obsCount==obsLen && !dryFrog) {
			frogMover="";
			frogSplash(deathType);
			}

		}

	else {
		obsCount=0;
		dryFrog=false;
		}
	}



//check for floater touching frog
function checkFloaterStatus(bx,by) {
	//if not paused
	if(!paused){
		if( (bx+(gridDim/2-4))>=(frogPos[0])&&(bx+gridDim/2-4)<=(frogPos[0]+gridDim/2-4) && (by+gridDim/2-4)>=(frogPos[1])&&(by+gridDim/2-4)<=(frogPos[1]+gridDim) ) {

			//if frog is visible, not paused and still has lives
			if(!paused&&frogLives>-1&&frogObj.style.visibility=="visible") {
				//if frog is not on start square
				if(!(frogPos[0]==homePos[0]&&frogPos[1]==homePos[1])) {
					//death when butterfly touches
					frogMover="";
					deathType="butterfly";
					frogSplash(deathType);
					}
				}
			}
		}

	}




//check for frog fly contact
function checkFlyStatus() {
	//if they're touching
	if(
		(frogPos[0]<=(flyPos[0]+gridDim-toleranceNum) && (frogPos[0]+gridDim)>=(flyPos[0]+toleranceNum))
		&&
		(frogPos[1]<=(flyPos[1]+gridDim-toleranceNum) && (frogPos[1]+gridDim)>=(flyPos[1]+toleranceNum))
		) {
		//increase score
		increaseScore(scoreValue);
		//delete fly
		deleteFly();
		}

	}


//create fly
var flyImg = new Image;
flyImg.src = "fly.gif";
var flyObj,flyStr,flyTimer;
var flyNum = 0;
var flyLive=false;
var flyPos = new Array;
function createFly() {

	//create fly div
	flyObj = document.createElement("div");
	document.body.appendChild(flyObj);
	flyLive=true;

	//fly html
	flyStr='';
	flyStr+='<div style="filter:progid:DXImageTransform.Microsoft.MotionBlur(strength=3,direction=135);position:absolute;left:'+(gridPos[0]+gridDim+( parseInt(Math.random()*(gridDim*20)) ))+'px;top:'+(gridPos[1]+gridDim+( parseInt(Math.random()*(gridDim*9)) ))+'px;z-index:45">';
	flyStr+='<img src="'+flyImg.src+'" width="'+gridDim+'" height="'+gridDim+'" alt="" border="0">';
	flyStr+='</div>';

	//write to fly div
	flyObj.innerHTML = flyStr;

	//store fly position
	flyPos = [flyObj.firstChild.offsetLeft,flyObj.firstChild.offsetTop];

	//fly only lives for 20 seconds!
	flyTimer=setInterval("deleteFly()",20000);

	}

//delete fly
function deleteFly() {
	clearInterval(flyTimer);
	document.body.removeChild(flyObj);
	flyLive=false;
	}





//frog got hit by something
var deadFrogs = new Array;
var dfNum=0;
function frogContact() {

	//if you still have lives to lose
	if(frogLives>-1){
		//create embossed frog
		deadFrogs[dfNum] = document.createElement("div");
		document.body.appendChild(deadFrogs[dfNum]);
		deadFrogs[dfNum].innerHTML = '<div style="-moz-opacity:0.3;filter:alpha(opacity=40);position:absolute;left:'+frogObj.offsetLeft+'px;top:'+frogObj.offsetTop+'px;z-index:25;"><img style="filter:progid:DXImageTransform.Microsoft.Emboss(enabled=true);" src="'+frogImg.src+'" width="'+gridDim+'" height="'+gridDim+'" alt="" border="0"></div>';
		dfNum++;

		//lose a life
		loseFrogLife();
		}

	}


//frog fell in the water
var splashFilter;
function frogSplash(deathFrom) {

	//select transition filter
	splashFilter = "Pixelate(duration=1)";
	if(deathFrom=="croc") { splashFilter = "Iris(duration=0.6)"; }
	if(deathFrom=="butterfly") { splashFilter = "RandomDissolve(duration=0.5)"; }
	//reset death cause var
	deathType="";

	//if you still have lives to lose
	if(frogLives>-1){
		//create splash
		deadFrogs[dfNum] = document.createElement("div");
		document.body.appendChild(deadFrogs[dfNum]);
		deadFrogs[dfNum].innerHTML = '<div style="filter:progid:DXImageTransform.Microsoft.'+splashFilter+';visibility:visible;position:absolute;left:'+frogObj.offsetLeft+'px;top:'+frogObj.offsetTop+'px;z-index:25;"><img src="'+frogImg.src+'" width="'+gridDim+'" height="'+gridDim+'" alt="" border="0"></div>';
		if(ie){if(deadFrogs[dfNum].firstChild.filters&&deadFrogs[dfNum].firstChild.filters[0]) { deadFrogs[dfNum].firstChild.filters[0].apply(); }}
		deadFrogs[dfNum].firstChild.style.visibility = "hidden";
		if(ie){if(deadFrogs[dfNum].firstChild.filters&&deadFrogs[dfNum].firstChild.filters[0]) { deadFrogs[dfNum].firstChild.filters[0].play(); }}
		dfNum++;

		//lose a life
		loseFrogLife(true);
		}

	//move butterfly to top, if it's there
	if(whichRound==9) {
		floatObj.style.top = (gridPos[1]-gridDim)+"px";
		}
	}



//submit hi score
var scoreWin;
function submitHighScore() {

	//submit form
	document.forms["scoreform"].submit();

	//show score frame
	document.getElementById("score").style.display="inline";
	
	//return true
	return true;

	}



//change lifes display
var lifeStr;
function changeLivesDisplay(changeBy) {

	//change frog lives
	frogLives+=changeBy;

	//lives display html
	lifeStr='<table cellpadding=0 cellspacing=0 border=0 style="-moz-box-sizing:border-box;border:2px solid #336633;background-color:#88bb88;">';
	lifeStr+='<tr>';
	for(i=0;i<frogLives;i++){
		lifeStr+='<td><img id="lives'+i+'" src="frog_up.gif" width="18" height="18" alt="" border="0" hspace="1" vspace="1" style="filter:alpha(opacity=75);visibility:visible"></td>';
		}
	lifeStr+='</tr>';
	lifeStr+='</table>';

	//write to container
	livesObj.innerHTML = lifeStr;
	}




//lose a life
function loseFrogLife(seaGrave) {

	//reduce lives
	changeLivesDisplay(-1);

	//reset winFrog
	winFrog=0;

	//if still lives left
	if(frogLives>-1){

		//force block
		forceBlocked=true;
		//temporarily block keypresses
		paused=true;
		//set timer to release
		blockTimer = setInterval("unblock()",blockInterval);

		//move main frog to start position
		frogToStart();

		}

	//else end game
	else {

		//force block
		forceBlocked=true;

		//hide frog if sea grave
		if(seaGrave) { frogObj.style.visibility="hidden"; }

		var langCode = '';
	
		//if a query string is present
		if(location.search) {
			//look for language flag
			if(typeof qStr['lang'] != 'undefined') {
				langCode = qStr['lang'];
				}
			}
			
		//death message
		lifeStr=dialogue[6]+'<br>'+dialogue[7].replace('$',gameScore);
		lifeStr+='<p>';

		lifeStr+='<input type="button" id="ng" onclick="okButton=null;newGame(\'death\')" value="' + dialogue[10] + '" class="prefbutton">';
		createMessageLayer(lifeStr);
		document.getElementById("ng").focus();

		}

	}



//new game
var hfLen;
function newGame(becauseof) {

	//stop timers
	stopObstacles();

	//delete any floaters
	if(floatNum>0){
		for(i=0;i<floatNum;i++){
			clearInterval(floatTimers[i]);
			document.body.removeChild(floaters[i]);
			}
		}

	//reset winFrog
	winFrog=0;

	if(becauseof=="death") {

		//reset frog lives
		changeLivesDisplay(remLives+1);

		//reset random factor
		randomFactor = remRandom;

		//reset rounds
		whichRound=1;
		con["rounds"].value = whichRound;

		//reset score
		gameScore=0;
		con["score"].value = gameScore;

		//reset surfaces
		waterNum=0;
		waterSurface.style.backgroundImage = "url("+water[waterNum].src+")";
		roadNum=0;
		roadSurface.style.backgroundImage = "url("+roads[roadNum].src+")";
		bankNum=0;
		for(i=0;i<2;i++){
			bankSurface[i].style.backgroundImage = "url("+banks[bankNum].src+")";
			}

		//get rid of embossed frogs
		for(i=0;i<dfNum;i++){
			document.body.removeChild(deadFrogs[i]);
			}
		dfNum=0;

		//remove any fly there might be
		if(flyLive) { deleteFly(); }

		}

	//reset float number to create 1 butterfly for every 8 completed rounds
	floatNum=parseInt(whichRound/8)-1;

	//reset obstacle objects
	obstacleObjects = new Array;
	for(i=0;i<8;i++){
		obstacleObjects[obstacleGroups[i]] = new Array;
		}

	//remove home frogs
	frogsHome = [false,false,false,false,false];
	for(i=0;i<5;i++){
		if(typeof homeFrogs[i]=="object") { document.body.removeChild(homeFrogs[i]); }
		}
	homeFrogs = new Array;

	//move main frog to start position
	frogToStart();

	//remove existing obstacles
	document.body.removeChild(obsDiv);

	if(becauseof=="win"){

		//change sufaces every two rounds
		if(parseInt(whichRound/2)==whichRound/2){

			//swap surface image backgrounds
			waterNum++; if(waterNum==water.length) { waterNum=0; }
			waterSurface.style.backgroundImage = "url("+water[waterNum].src+")";
			roadNum++; if(roadNum==roads.length) { roadNum=0; }
			roadSurface.style.backgroundImage = "url("+roads[roadNum].src+")";
			bankNum++; if(bankNum==banks.length) { bankNum=0; }
			for(i=0;i<2;i++){
				bankSurface[i].style.backgroundImage = "url("+banks[bankNum].src+")";
				}

			//get rid of embossed frogs
			for(i=0;i<dfNum;i++){
				document.body.removeChild(deadFrogs[i]);
				}
			dfNum=0;

			//remove any fly there might be
			if(flyLive) { deleteFly(); }

			}

		//bonus life after every 4 rounds
		if(parseInt(whichRound/4)==whichRound/4){
			changeLivesDisplay(1);
			}

		//increase score for round bonus - (score value*lives)
		increaseScore(frogLives*(scoreValue));

		//increase random factor
		randomFactor+=0.1;
		//reset every 8 rounds
		if(parseInt(whichRound/8)==whichRound/8){ randomFactor=0.1; }
		//round off
		randomFactor=Math.round(randomFactor*100)/100;

		//increase rounds
		whichRound++;
		con["rounds"].value = whichRound;

		}

	//create obstacles
	createObstacles();

	//initialise moving obstacles
	initialiseObstacles();

	if(becauseof=="win"){
		//add floaters after round 8
		if(whichRound>=8){
			createFloaters();
			}
		}

	//delete message layer
	deleteMessageLayer();

	//remove force block
	forceBlocked=false;
	//remove pause
	paused=false;

	//show frog
	frogObj.style.visibility="visible";

	}




//move frog
var frogTimer,homeObj;
var frogMover = "";
function leapFrog(frogDir) {

	//change frog image
	frogImg.src = frogs[frogDir].src;

	//get current frog position
	frogPos = [frogObj.offsetLeft,frogObj.offsetTop];

	//apply position change if boundaries would not be exceeded
	switch(frogDir) {
		case "left" :
			if(frogPos[0]>(gridPos[0]+gridDim)) {
				frogPos[0]-=gridDim;
				}
			break;
		case "up" :
			if(frogPos[1]>=(gridPos[1]+gridDim)) {
				//movement lower than top row
				if(frogPos[1]>(gridPos[1]+gridDim)) {
					frogPos[1]-=gridDim;
					}
				//movement into top row home squares
				else {
					for(i=0;i<5;i++){
						homeObj = document.getElementById("home"+i);
						if(frogPos[0]>homeObj.offsetLeft && (frogPos[0]+gridDim)<(homeObj.offsetLeft+homeObj.offsetWidth)) {
							if(!frogsHome[i]) { frogHome(i); }
							break;
							}
						}
					}
				}
			break;
		case "right" :
			if(frogPos[0]<(gridPos[0]+(gridDim*21))) {
				frogPos[0]+=gridDim;
				}
			break;
		case "down" :
			if(frogPos[1]<(gridPos[1]+(gridDim*10))) {
				frogPos[1]+=gridDim;
				}
			break;
		}

	//move frog
	frogObj.style.left = frogPos[0]+"px";
	frogObj.style.top = frogPos[1]+"px";

	//if there's a fly, check for frog contact
	if(flyLive) { checkFlyStatus(); }

	//if there's no fly, 1 in 50 chance to create one from round 1 onwards
	if(whichRound>=1 && !flyLive) {
		if((Math.random()*50)<1) { createFly(); }
		}

	//hide frog shadow
	//if(frogObj.filters) {
		//frogObj.filters[0].enabled=false;
	//	}

	//if frog is in a water row, mark for movement
	frogMover = "";
	if(frogPos[1]==gridPos[1]+(gridDim*1)) { frogMover = "rightLeafs"; }
	if(frogPos[1]==gridPos[1]+(gridDim*2)) { frogMover = "leftLogs"; }
	if(frogPos[1]==gridPos[1]+(gridDim*3)) { frogMover = "leftLeafs"; }
	if(frogPos[1]==gridPos[1]+(gridDim*4)) { frogMover = "rightLogs"; }

	}



//show frog shadow
function frogShadow() {
	//if(frogObj.filters && frogObj.filters[0].enabled==false) {
	//	frogObj.filters[0].enabled=true;
	//	}
	}





//create floaters
var floatImg = new Image;
floatImg.src = "butterfly.gif";
var floaters = new Array;
var floatTimers = new Array;
var floatNum=0;
var floatStr;
function createFloaters() {

	//increase float number
	floatNum++;

	//create floaters
	floatimages=new Array;
	for(i=0;i<floatNum;i++){
		floatStr='<div id="floater'+i+'" style="position:absolute;left:'+(gridPos[0]+((gridDim*23)*Math.random()))+'px;top:'+(gridPos[1]-gridDim)+'px;z-index:50;filter:progid:DXImageTransform.Microsoft.Shadow(color=#663300,direction=135,strength=3);">';
		floatStr+='<img src="'+floatImg.src+'"border="0" width='+gridDim+' height='+gridDim+'>';
		floatStr+='</div>';
		floaters[i] = document.createElement("div");
		document.body.appendChild(floaters[i]);
		floaters[i].innerHTML = floatStr;

		//animate floater
		floatTimers[i] = setInterval("animateFloaters()",500/gameSpeed);
		}

	}



//follow frog
var floatPos,floatObj,floatDiff;
function animateFloaters() {

	for(i=0;i<floatNum;i++){
		//calculate direction from frog
		floatObj = document.getElementById("floater"+i);
		floatPos = [floatObj.offsetLeft,floatObj.offsetTop];
		for(j=0;j<2;j++){
			if(floatPos[j]<frogPos[j]||((Math.random()*4)<1)) { floatPos[j]+=(Math.random()*floaterSpeed)/gameResolution; }
			if(floatPos[j]>frogPos[j]||((Math.random()*4)<1)) { floatPos[j]-=(Math.random()*floaterSpeed)/gameResolution; }
			}
		//move obj
		floatObj.style.left = floatPos[0]+"px";
		floatObj.style.top = floatPos[1]+"px";

		//check for touching frog
		checkFloaterStatus(floatPos[0],floatPos[1]);
		}

	}




//trap arrow keys
var whichKey;
var okButton=null;
function trapArrows(e) {

	//which arrow was pressed
	if(ie) { whichKey = event.keyCode; }
	else { whichKey = e.which; }

	//process keypress if not paused and message window not open
	switch(whichKey) {
		case 37 :
			if(!paused&&msgObj==null) { leapFrog('left'); }
			break;
		case 38 :
			if(!paused&&msgObj==null) { leapFrog('up'); }
			break;
		case 39 :
			if(!paused&&msgObj==null) { leapFrog('right'); }
			break;
		case 40 :
			if(!paused&&msgObj==null) { leapFrog('down'); }
			break;
		case 32 :
			//pause control
			if(!paused&&!forceBlocked) {
				stopObstacles();
				}
			else if(!forceBlocked){
				restartObstacles();
				}
			break;
		}

	}



//event listeners
document.onkeyup = trapArrows;
//document.onkeydown = frogShadow;


//check overall ready state
var allReady,readyTimer;
function checkReadyState() {

	//images array
	dImg = document.images;
	imgsLen = dImg.length;

	//check ready state of images
	allReady=true;
	for(i=0;i<imgsLen;i++){
		if(ie) { if(dImg[i].readyState!="complete") { allReady=false; } }
		else { if(!dImg[i].complete) { allReady=false; } }
		}

	//loop if not ready
	if(!allReady) {
		readyTimer = setTimeout("checkReadyState()",500);
		}

	//else begin play
	else {
		clearTimeout(readyTimer);

		//show frog sequence
		frogToStart();

		//hide loading message
		deleteMessageLayer();

		//unblock keyboard
		forceBlocked=false;
		paused=false;

		//show frog if you've not just won
		frogObj.style.visibility="visible";

		}

	}


//initialise game
function initialiseGame() {

	//show lives
	changeLivesDisplay(0);

	//create obstacles
	createObstacles();

	//initialise moving obstacles
	initialiseObstacles();

	//write default values to control panel form
	con["rounds"].value = whichRound;
	con["score"].value = gameScore;

	//temporarily block until ready
	forceBlocked=true;
	paused=true;

	//check overall ready state
	checkReadyState();

	}

if(dom) { window.onload = initialiseGame; }

