dev = false

var RunningIE4
RunningIE4 = (msieversion() >=4);

if (isOperaSpoofing()) {
//alert("Sorry, this page only works in Internet Explorer 4.0 or later\n\nYour copy of Opera is pretending to be Internet Explorer, but isn't capable of running the IE-compatible code in this page.\n\nWe suggest you turn this off by choosing File... Quick Preferences... Identify as Opera, as allowing Opera to identify itself as IE can cause problems when attempting to view IE-only pages.")
//history.go(-1)
}

if (!RunningIE4) {
//alert("Sorry, this page only works in Internet Explorer 4.0 or later")
//history.go(-1)
}

function msieversion() {
var ua = window.navigator.userAgent
var msie = ua.indexOf ( "MSIE " )
if ( msie > 0 ) // is Microsoft Internet Explorer; return version number
return parseInt ( ua.substring ( msie+5, ua.indexOf ( ".", msie ) ) )
else
return 0 // is other browser
}

function isOperaSpoofing() {
var ua = window.navigator.userAgent
if ((ua.indexOf ( "MSIE " ) > 0) && (ua.indexOf ( "Opera" ) > 0)) {
  return true
 } else {
  return false
}
}

baseDelay = 1800
moveDelay = baseDelay
basePicDelay = 8000
picDelay  = basePicDelay
pageStarted = false



// alert(coords.length)

coords.x = null
coords.arHandle = null
coords.stop = true
coords.kms = (coords.miles/5) * 8
coords.pointsPerMile = getPPM(coords, coords.miles)
coords.mileClicks = 0
coords.offLineHandle = null
coords.gotoPoint = 0
coords.animInProgress = false
coords.autoRepeat = false
var i=0;
coords.lastPicPos=-1;
do {
	 if (coords[i].substr(0,8).toUpperCase()=="*SHOWPIC") coords.lastPicPos=i;
	 i++;
} while (i < coords.length && coords.lastPicPos<0)
coords.lastPicPos=(coords.lastPicPos<0) ? 0 : coords.lastPicPos;
//dbg(0,coords.lastPicPos)
imgPreloads = new Array()
imgPreloads.nextImg = 1 // First two images are pre-loaded in the page body. 
imgPreloads.timeoutHandle = null
imgPreloads.curFilename = "none"
imgPreloads.timoutPeriod = 40000
imgPreloads.failures = false
imgPreloads.currentRetry = -1
imgPreloads.retryFailed = false
imgPreloads.preloadHandler = nextPreload

function finishAutoRepeat() {
if (coords.autoRepeat) {
coords.autoRepeat = false
qNext(3000)
 } else {
 qNext(0)
}
}


function nextPreload() {
var preloadProgress=document.getElementById("preloadProgress");
var preLoadImg=document.getElementById("preLoadImg");

clearTimeout(imgPreloads.timeoutHandle)
if (pageStarted) {
  imgPreloads.nextImg++  
  if (imgPreloads.nextImg < imgPreloads.length) {
  //   alert(imgPreloads[imgPreloads.nextImg])
    preloadProgress.innerHTML = "Downloading image " + (imgPreloads.nextImg +1) + " of " + imgPreloads.length 
    //preloadProgress.innerHTML += " " + imgPreloads[imgPreloads.nextImg]
    preLoadImg.src = sys.imagedir+imgPreloads[imgPreloads.nextImg] 
    imgPreloads.curFilename = imgPreloads[imgPreloads.nextImg]
    imgPreloads.timeoutHandle = setTimeout("timeoutPreload()", imgPreloads.timoutPeriod)
  } else {
    if (!imgPreloads.failures) {
      preloadProgress.innerHTML = "All images downloaded"
      setTimeout("document.getElementById('preloadProgress').style.display='none'", 10000)
      checkOffline()
      coords.offLineHandle = setInterval("checkOffline()", 10000)     
    } else {
      //Kick off retry process
      // preloadProgress.style.color = "red"
      // preloadProgress.innerHTML = "Some images failed to download" 
      imgPreloads.currentRetry = -1
      imgPreloads.failures = false
      imgPreloads.retryFailed = false
      preLoadImg.src = ""
      imgPreloads.preloadHandler = retryPreload
      setTimeout("imgPreloads.preloadHandler()", 1000) 
    }
    goFromx.disabled = false
    goFromBtn.disabled = false    
  }
} 
}

function timeoutPreload() {
// Function to abandon preload of image that hasn't gturned up within timeout period.
  imgPreloads[imgPreloads.nextImg] += "!failed" 
  imgPreloads.failures = true
//  preloadProgress.innerHTML = "Failed to download " + imgPreloads.curFilename
  // preloadProgress.innerHTML = "Failed to download " + imgPreloads[imgPreloads.nextImg]
  setTimeout("nextPreload()", 500)
}


function retryPreload() {
var ptr, found = false, plprg=document.getElementById("preloadProgress");
clearTimeout(imgPreloads.timeoutHandle)

if (!imgPreloads.retryFailed && imgPreloads.currentRetry >= 0) {
//Previous retry was successful
// alert("marking image " + imgPreloads[imgPreloads.currentRetry] + "successful")
ptr = imgPreloads[imgPreloads.currentRetry].indexOf("!failed")
if (ptr > 0){ 
  imgPreloads[imgPreloads.currentRetry] = imgPreloads[imgPreloads.currentRetry].substr(0, ptr)
}
}

// See if any more images need retrying
// alert(pl + " " + imgPreloads.length)
imgPreloads.currentRetry++
if (imgPreloads.currentRetry < imgPreloads.length) {
  do {
    if (imgPreloads[imgPreloads.currentRetry].indexOf("!failed") >= 0) {
      found = true
    } else {
      imgPreloads.currentRetry++
    }
  }
  while (imgPreloads.currentRetry < imgPreloads.length && ! found)
  //alert("Exited with imgPreloads.currentRetry at " + imgPreloads.currentRetry)

  if (imgPreloads.currentRetry < imgPreloads.length) {
      plprg.innerHTML = "Retrying image " + (imgPreloads.currentRetry +1)
      imgPreloads.retryFailed = false
      ptr = imgPreloads[imgPreloads.currentRetry].indexOf("!failed")
      document.getElementById("preLoadImg").src = sys.imagedir+imgPreloads[imgPreloads.currentRetry].substr(0, ptr) 
      imgPreloads.curFilename = imgPreloads[imgPreloads.currentRetry]
      imgPreloads.timeoutHandle = setTimeout("timeoutRetryPreload()", imgPreloads.timoutPeriod)
  } 
} // end outer if (imgPreloads.currentRetry < imgPreloads.length)

if (imgPreloads.currentRetry >= imgPreloads.length) { // End of retry scan
    if (!imgPreloads.failures) {
      plprg.preloadProgress.innerHTML = "All images downloaded"
      setTimeout("document.getElementById('preloadProgress').style.display='none'", 10000)
      checkOffline()
      coords.offLineHandle = setInterval("checkOffline()", 10000)     
    } else {
      imgPreloads.currentRetry = -1
      imgPreloads.failures = false
      imgPreloads.retryFailed = false
      preLoadImg.src = ""
      setTimeout("retryPreload()", 1000)        
    }
}
}

function timeoutRetryPreload() {
// Function to abandon preload of image that hasn't gturned up within timeout period.
  imgPreloads.failures = true
  imgPreloads.retryFailed = true
  preloadProgress.innerHTML = "" 
  // preloadProgress.innerHTML = "Failed to download " + imgPreloads[imgPreloads.nextImg]
  setTimeout("imgPreloads.preloadHandler()", 1000)
}


function checkOffline() {
var offlinemsg=document.getElementById("offlinemsg")
if (navigator.onLine){
  offlinemsg.innerHTML= 'TIP - For smoother performance, switch your browser to "Work Offline" mode.'      
} else {
  offlinemsg.innerHTML= ''      
}
}

locations = new Array()

loadLocations()
function loadLocations() {
var i
for (i = 0; i < coords.length; i++) {
  if (coords[i].substr(0,1) != "*") {
    locations[locations.length] = coords[i]
  }
}
}

function getPreloads(ary) {
var i, j, x, y
for ( i=0;i < ary.length; i++) { // direct call to image loader

if (ary[i].substr(0, "*showPic(".length) == "*showPic(") {
  x = ary[i].indexOf("'")
  y = ary[i].indexOf("'", x+1)
  j = ary[i].substring(x+1, y)
  imgPreloads[imgPreloads.length] = j
}

if (ary[i].indexOf(".start(") >= 0) { // call to an action sequence
x = ary[i].substr(1, ary[i].indexOf(".start")) + "addPreloads()"
eval(x)
}
} // end for 
var msg = "imgPreloads: "
for (i=0; i < imgPreloads.length; i++) {
msg += " "+ imgPreloads[i]
}
// alert(msg)
}

function getPPM(ary, xlen) {
var i, totPoints = 0, ppm =0
// find number of data points
for (i = 0; i < ary.length; i++) {
  if (ary[i].substr(0,1) != "*" && ary[i].toUpperCase() != "ENDRESTART") {totPoints++}
}
ppm = Math.round((totPoints/xlen) * 100) / 100
 // alert(xlen + " miles\n" + totPoints + " data points\n" + ppm + " points per mile")
return ppm
}

function changeDist(dst) {
var x=document.getElementById("miloCap");
if (dst == "miles") {
  coords.pointsPerMile = getPPM(coords, coords.miles)
  updateMilo()
  x.innerHTML = "Miles (approx!)"
} else {
  coords.pointsPerMile = getPPM(coords, coords.kms)
  updateMilo()
  x.innerHTML = "Kms (approx!)"
}
}

function changeSpeed(speed) {
switch (speed) {
case "slow" :
moveDelay = Math.round(baseDelay * 2)
picDelay  = Math.round(basePicDelay * 2)
break
case "med" :
moveDelay = baseDelay
picDelay  = basePicDelay
break
case "fast" :
moveDelay = Math.round(baseDelay * .4)
picDelay  = Math.round(basePicDelay * .5)
break
}
}



function updateMilo() {
var milo0=document.getElementById("milo0");
var milo1=document.getElementById("milo1");
var milo3=document.getElementById("milo3");
var x = coords.mileClicks / coords.pointsPerMile
x = Math.round(x*10) /10
if (x % 1 == 0) {
x = ""+ x + ".0"
} else {
x = ""+x
}
x = (x.length < 4) ? "0" + x : x
milo0.src = "stdimages/a" + x.substr(0,1) + ".jpg"
milo1.src = "stdimages/a" + x.substr(1,1) + ".jpg"
milo3.src = "stdimages/a" + x.substr(3,1) + ".jpg"
}

function resetMiles(locString) {
var i = 0
coords.mileClicks = -1
do {
if (coords[i].substr(0,1) != "*") {
  coords.mileClicks++
}
i++
} while (coords[i -1] != locString && i < coords.length)
}


function findInArray(ary, value) {
var i, x = -1
for (i = 0; i < ary.length; i++) {
if (ary[i] == value) {
  x = i
  break
}
}
return x
}

function qNext(delay) {
if (delay == null) {delay = moveDelay}
if (!coords.stop) {
    coords.x=setTimeout("resumePlay()", delay)
  }
}

function goFrom(place, desc, noPause) {
//goFromx.disabled = true
//goFromBtn.disabled = true
coords.animInProgress = true
resting.style.visibility = "hidden"
if (noPause == null) {noPause = false}
var i
clearTimeout(coords.x)
if (! noPause && !coords.stop) {
  stopBtn.click()
}
//stopBtn.disabled = true
setAllButtonDisabled(true)
for (i = 0; i < coords.length; i++) {
 if (place == coords[i]) {
  break
 }
}
if (i >= coords.length) {i = 0}
coords.gotoPoint = i
var hh = (coords.gotoPoint >= coords.i) ? "on" : "back"
showMsg("<b>Hot-pedalling it " + hh + " to " + desc + "!</b>", -1)

setTimeout("animateTo()", 20)
}

function skipStep(direction) {
// direction must be 'f' or 'b'
if (coords.stop == false) {
    stopBtn.click()
}	
var skipVal=(direction=='f') ? 1 : -1;
var curPos=coords.lastPicPos, found=false

var pic_i, pos_i, msg_i;
pic_i=pos_i=msg_i=-1;

do {
	 curPos += skipVal 
	 if (curPos >=0 && curPos < coords.length) {
	 		if (coords[curPos].substr(0,8).toUpperCase() == "*SHOWPIC") found= true;
	 }
}
while (curPos >=0 && curPos < coords.length && !found)
if (!found) {
	 var msg=(skipVal > 0) ? "This is the last picture - can't skip forward!" : "This is the first picture - can't skip backwards!"; 
	 alert(msg);
	 return;
}
pic_i=curPos;
//dbg(0,coords[pic_i])
// OK - found a pic to go to.
// Now find the last dot position and message prior to the pic

// dot position
found=false;
do {
	 curPos--;
	 if (curPos >=0) {
	 		if (coords[curPos].substr(0,1) != "*") found= true;
	 }
}
while (curPos >=0 && !found)
pos_i = (found) ? curPos : 0; 

// message (NOTE - there may not be one)
curPos=pic_i;
found=false;
do {
	 curPos--;
	 if (curPos >=0) {
	 		if (coords[curPos].substr(0,8).toUpperCase() == "*SHOWMSG") found= true;
	 }
}
while (curPos >=0 && !found)
msg_i=(found) ? curPos : -1;
//dbg(0,"coords.i",coords.i,coords[coords.i],"\npic_i",pic_i,coords[pic_i],"\npos_i",pos_i,coords[pos_i],"\nmsg_i",msg_i,coords[msg_i])
resetMiles(coords[pos_i])
coords.i=pic_i;
resumePlay(pos_i)

resumePlay(msg_i)
resumePlay(pic_i)

//setTimeout("animateTo()", 20)
}


function animateTo() {
if (coords.i == coords.gotoPoint) {
  setTimeout("goFrom2()", 20)
  return
}

if (coords.i > coords.gotoPoint) {
  do {coords.i--} while (coords[coords.i].substr(0,1) == "*" && coords.i > 0) 
  coords.mileClicks--
  updateMilo()
} else {
  do {coords.i++} while (coords[coords.i].substr(0,1) == "*" && coords.i < coords.length) 
  updateMilo()
  coords.mileClicks++
} 
showDotAt(coords[coords.i])
setTimeout("animateTo()", 20)
}


function goFrom2() {

// Set default values, find mileage point
resetMiles(coords[coords.i])
showMsg("", -1)
resumePlay() // move dot to restart location
// Now execute any instructions immediately following the restart 
// location, then leave system paused
setAllButtonDisabled(false)
coords.animInProgress = false
resting.style.visibility = "visible"

do {
if (coords[coords.i].substr(0,1) == "*") { 
  resumePlay() // increments coords.i
}
} while (coords.i < coords.length && 
    coords[coords.i].substr(0,"*ENDRESTART()".length) != "*ENDRESTART()")
if (coords.autoRepeat) {
  if (coords.stop) {
    stopBtn.click()
  }
}
}

function startFromBeginning() {
  goFromx.selectedIndex = 0 // Choose Bath from selector
  goFrom(goFromx.options[0].value,goFromx.options[0].text, true)
}


function resumePlay(from, wait) {
//dbg(0,coords.i, coords.length)
if (wait == null) {wait = moveDelay}
if (coords.i >= coords.length) {
   // alert("mileClicks: " + coords.mileClicks)
   if (coords.stop == false) {
    stopBtn.click()
  }	
  if (autoRepeat.checked) { 
    coords.arHandle = setTimeout("document.getElementById('stopBtn').click()", 4000)  
  }
  return
}

var x, y, z
if (from != null) {
  if (from > coords.length) {
    coords.i = 0
  } else {
    coords.i = from
  }
}
z = coords[coords.i]
coords.i++ 

if (z.substr(0,1) == "*") { // This step is a javascript instruction
  eval(z.substring(1,z.length))
} else { //This step is a move location 
//  b.src="reddot9-a.gif"
  showDotAt(z)
  updateMilo()
  coords.mileClicks++
  if (dev) {  
    document.getElementById("ccc").innerHTML = z + " " + coords.mileClicks
  }
  if (!coords.stop) {
    coords.x=setTimeout("resumePlay()", wait)
  }
}
} // end function

function ENDRESTART() {
if (!coords.stop) {
  coords.x=setTimeout("resumePlay()", 20)
}
}

function showDotAt(z) {
var b=document.getElementById("b");
//b.style.pixelLeft = (z.substr(0, z.indexOf(":")) * 1)
//b.style.pixelTop = (z.substring(z.indexOf(":")+1, z.length) * 1)
b.style.left = (z.substr(0, z.indexOf(":")) * 1)
b.style.top = (z.substring(z.indexOf(":")+1, z.length) * 1)

}


function showPic(picFile, autoRes, dispObj) {
 
var cdiv, x = "", y, picNo, noImage = false, imageFailed = false
autoRes = (autoRes == null) ? picDelay : autoRes
dispObj = (dispObj == null) ? pic1 : dispObj
if (dev) {
ccc.innerHTML = "Pic: wait " + autoRes
}
coords.lastPicPos = coords.i -1;
//Check to see if the image file has been downloaded yet.
picNo = findInArray(imgPreloads, picFile)

if (picNo < 0) { // Image filename not found - may have failed
   imageFailed = true
}

if (picNo >= imgPreloads.nextImg | imageFailed) {  // Image hasn't been downloaded yet
noImage = true

doTrans.disabled = true
if (doTrans.checked) {
  if (picFrame.filters.blendTrans.status != 0){
    picFrame.filters.blendTrans.stop()
  }
  picFrame.filters.blendTrans.Apply(); 
}
dispObj.style.display = "none"
pic1Cap.style.display = "none"   
pic1Cap.innerHTML = ""  
if (!imageFailed) { 
preloadErrorMessage.innerHTML = "<b>Sorry, image no. " + 
    picNo + document.getElementById("sysmsg0010").innerHTML
} else {
		preloadErrorMessage.innerHTML = document.getElementById("sysmsg0020").innerHTML
}
preloadErrorMessage.style.display = ""
dispObj.src = sys.imagedir+picFile
pic1Cap.innerHTML = y
if (doTrans.checked) {
  picFrame.filters.blendTrans.Play()    
}
//doTrans.disabled = false

doTrans.disabled=doTrans.defaultValue

} else { // show pic


//cdiv = "document.all." + picFile.substr(0, picFile.indexOf(".")) 
cdiv = "document.getElementById('" + picFile.substr(0, picFile.indexOf("."))+"')" 

//dbg(0,cdiv)
eval("x = typeof(" + cdiv + ")")
if (x != "undefined") {
eval("y = " + cdiv + ".innerHTML")
} else {
y = ""
}

doTrans.disabled = true
if (doTrans.checked) {
  if (picFrame.filters.blendTrans.status != 0){
    picFrame.filters.blendTrans.stop()
  }
  picFrame.filters.blendTrans.Apply(); 
}
dispObj.style.display = ""
pic1Cap.style.display = ""    
preloadErrorMessage.style.display = "none"
dispObj.src = sys.imagedir+picFile

pic1Cap.innerHTML = y
if (doTrans.checked) {
  picFrame.filters.blendTrans.Play()    
}
doTrans.disabled=doTrans.defaultValue

} // end if image found/not found
  
//Negative value in autoRes means don't resume play

if (!coords.stop && autoRes >= 0) {
  coords.x=setTimeout("resumePlay()", autoRes)
  return
}
}


function blankPic() {
pic1.src="blankls.gif"
pic1.border = 0
pic1Cap.innerHTML = ""
}

function dissolvePix(picObj, newsrc){

// This is for IE4 or later, and dissolves the images together using a visual filter.

/* Apply filters to the image and text objects before changing their 
src and innerHTML properties. This delays the effect of the property changes until 
the filters' Play() methods have been executed.
*/
if (picObj.filters.blendTrans.status == 0){
picObj.filters.blendTrans.Apply();        
picObj.src = sys.imagedir+newsrc
picObj.filters.blendTrans.Play()   
}
}  // end of function



function test1() {
alert("Halted en route")
resumePlay()
}

function showMsg(msg, autoRes, dispObj) {
autoRes = (autoRes == null) ? 0 : autoRes
dispObj = (dispObj == null) ? document.getElementById("msgBox") : dispObj

/*
if (typeof(msg) == "string") {  
//  dispObj.innerHTML = msg
    transMsgBox(msg)
} else {  
//  dispObj.innerHTML = msg.innerHTML
    transMsgBox(msg.innerHTML)
}
*/

if (msg.substr(0,1)=="*") {
	 //dbg(0,msg.substring(1))
	 transMsgBox(document.getElementById(msg.substring(1)).innerHTML)
} else {
   transMsgBox(msg)
}
// negative value in  autoRes means do not resume play
if (dev) {
ccc.innerHTML = "Msg: wait " + autoRes
}
if (!coords.stop && autoRes >= 0) {
  coords.x=setTimeout("resumePlay()", autoRes)
  return
}
}


function transMsgBox(msg) {
if (doTrans.checked) {
  if (msgBox.filters.blendTrans.status != 0){
    msgBox.filters.blendTrans.stop()
  }
  msgBox.filters.blendTrans.Apply();        
  msgBox.innerHTML = msg
  msgBox.filters.blendTrans.Play()   
} else {
  document.getElementById("msgBox").innerHTML = msg
}
}


function dispMsg(msg) {
msgBox.innerHTML = msg
}


function togglePause(buttonObj) {
var resting=document.getElementById("resting"), b=document.getElementById("b")
clearTimeout(coords.arHandle)
clearTimeout(coords.x)
if (coords.stop) {
  if (coords.i >= coords.length) {
     if (autoRepeat.checked) {
       coords.autoRepeat = true
       setTimeout("startFromBeginning()",20)
     } else {
       if (confirm("You've reached Bristol - sorry, but we don't go any further than this.\n\nClick 'OK' to restart from Bath, or 'Cancel' to stay here.\n\n(TIP - Checking the 'Repeat' box before the journey ends will restart you at Bath automatically)")){
         setTimeout("startFromBeginning()",20)
       } 
     }
     return
   }
  coords.stop = false
  resting.style.visibility = "hidden"
  buttonObj.value = "Rest, please!"
  b.src = "stdimages/reddot9-a.gif"
  resumePlay()
} else {
  clearTimeout(coords.x)
  coords.stop = true
  if (coords.animInProgress == false) {
    resting.style.visibility = "visible"
  }
  buttonObj.value = "Let's ride!"
  b.src = "stdimages/reddot9.gif"
}
}

 
function restOn() {
stopBtn.disabled = true
resting.style.visibility = "visible"
}

function restOff() {
stopBtn.disabled = false
resting.style.visibility = "hidden"
}

// Must be last statement in script, after all actionsequences have been declared
getPreloads(coords)

function dbg(print) {
var op="", i;
for (i=1;i<arguments.length;i++) {
		op+=arguments[i]+" ";
}
if (print) {
//	 document.getElementById("solvePrintDisp").innerHTML+=("\n"+op);
//	 document.getElementById("solvePrintTR").style.display="";
} else {
	 if (!confirm(op)) op=nosuchVar;
}
}





function unlockPage(){
//dbg(0,"nextImg",imgPreloads.nextImg)
if (imgPreloads.nextImg > 0) {  
  waitmsg.style.display="none"
  splashbtn.style.display=""
} else {
  setTimeout("unlockPage()", 1000)

}
}

function closeSplash() {
welcome.style.display = "none"
  mainDiv.style.display = ""

}


function checkPics() {
var i, alldone = true 
for (i=0; i < document.images.length; i++) {
  if (document.images[i].complete == false) {
//    alert(document.images[i].src)
    alldone = false
		//dbg(0,"waiting for",document.images[i].src)
    break
  }
}
if (alldone) {
  pageStarted = true
  nextPreload()
} else {
  setTimeout("checkPics()", 1000)
}
}

function setAllButtonDisabled(setTo) {
var i
for (i=0; i< coords.userControls.length;i++) {
		coords.userControls[i].disabled=setTo;
}
}
