///////////////////////////////////
//copyright Marcus Scholz 2005-06 
//Author:  MJ Scholz
//Date: March 2006
//Revised: March 2007
///////////////////////////////////

var driverLapTime; var driverLapTimeConv; var delay = 10; var timescale = 2; var oldscale = 2; var time = 0; var timeOne = 0; var timeTwo = 0; var raceLap = 1; var raceLeader; var raceOrder; var currLap; var prevLap; var fastestLap = 1000; var currentPosition; var string; var x; var y; var pit; var pitIn; var pitLane; var raceFinished = 0; var pause = 1; var posX = new Array(); var posY = new Array(); var pitX = new Array(); var pitY = new Array(); var leadDuration = new Array(); var driverFastestLap = new Array(); var index; var blinker = 0; var button = new Array("","play","pause","reset","skip","speeddown2","speeddown1","speed1","speedup1","speedup2"); var positions; var pitEntryDist; var pitEntry; var pitExit; var skiptime; function hiliteKey(x) { document.getElementById(button[x] + "Button").src = button[x] + "_2.gif"; } function loliteKey(x) { document.getElementById(button[x] + "Button").src = button[x] + ".gif"; } function adjustments() { for(i=0;i<posaX.length;i++) { posX[i*2] = Math.round((MoveX + posaX[i]*StretchX),0); posY[i*2] = Math.round((MoveY - posaY[i]*StretchY),0); pitX[i*2] = Math.round((MoveX + pitaX[i]*StretchX),0); pitY[i*2] = Math.round((MoveY - pitaY[i]*StretchY),0); } for(i=0;i<posaX.length;i++) { posX[i*2+1] = Math.round((MoveX + (posaX[i]*StretchX + posaX[i+1]*StretchX)/2),0); posY[i*2+1] = Math.round((MoveY - (posaY[i]*StretchY + posaY[i+1]*StretchY)/2),0); pitX[i*2+1] = Math.round((MoveX + (pitaX[i]*StretchX + pitaX[i+1]*StretchX)/2),0); pitY[i*2+1] = Math.round((MoveY - (pitaY[i]*StretchY + pitaY[i+1]*StretchY)/2),0); } positions = posaX.length*2; pitExit = 0; pitEntry = 0; for(i=0;i<positions;i++) { if(i<positions/2 && pitExit==0 && posX[i]==pitX[i] && posY[i]==pitY[i]) { pitExit=i; } else{} if(i>positions/2 && pitEntry==0 && posX[i]!=pitX[i] && posY[i]!=pitY[i]) { pitEntry=i; } else{} } positions = positions-4; pitEntryDist = positions-pitEntry; } function calcLeadDuration() { for(i=0;i<drivers;i++) { for(j=1;j<driverCumTime[i].length;j++) { if((driverCumTime[i][j] < leadDuration[j] && driverCumTime[i][j] != driverCumTime[i][j-1]) || leadDuration[j] == null ) { leadDuration[j] = driverCumTime[i][j]; }else{} } } raceDuration = leadDuration[laps]; } function initArrays() { calcLeadDuration(); var lta = new Array(); var ltac = new Array(); for(i=0;i<drivers;i++) { var dla = new Array(); var dlac = new Array(); for(j=1;j<driverCumTime[i].length;j++) { if(driverCumTime[i][j] == driverCumTime[i][j-1] && driverCumTime[i][j] < raceDuration) { dla[j] = -1; dlac[j] = "STOP"; } else if(driverCumTime[i][j] == driverCumTime[i][j-1] && driverCumTime[i][j] >= raceDuration ) { dla[j] = 0; dlac[j] = "FINISH"; } else { dla[j] = driverCumTime[i][j] - driverCumTime[i][j-1]; dlac[j] = convertTime(dla[j],2); } } lta[i] = dla; ltac[i] = dlac; } driverLapTime = lta; driverLapTimeConv = ltac; } function test() { for(i=0;i<drivers;i++) { document.write(driverName[i] + "<BR>"); for(j=1;j<driverCumTime[i].length;j++) { document.write(j + " - " + driverLapTimeConv[i][j] + " - " + driverLapTime[i][j] + "<BR>"); } } } function updateComments() { if(lapComments[raceLap]*1<=99 && lapComments[raceLap]*1 >= 0) { document.getElementById("lapcomments1").innerHTML = " "; } else { document.getElementById("lapcomments1").innerHTML = lapComments[raceLap] + " <br>"; } } function engine() { for(var i=0;i<drivers;i++) { pitLane = 0; pitIn = 0; currLap = driverLap[i]; if(driverRetired[i] || driverFinished[i]) { } else if(driverCumTime[i][currLap]<time) { currLap++; driverLap[i] = currLap; if(currLap>raceLap) { document.getElementById("clock").innerHTML = "Elapsed Time: " + convertTime(driverCumTime[i][currLap-1],1); driverDot[i] = "lead_dot.GIF"; racePos[i] = 1; raceOrder = 1; raceLeader = i; raceLap++; updateComments(); if(raceLap <= laps) { document.getElementById("lapcurr").innerHTML = "Race - Lap " + raceLap + " of " + laps; document.getElementById("lapend").innerHTML = "Positions End of Lap " + (raceLap-1); document.getElementById("lapcurr").innerHTML = "Race - Lap " + raceLap + " of " + laps; } else { document.getElementById("lapend").innerHTML = "FINAL STANDINGS"; } } else if(currLap == raceLap) { driverDot[i] = "dot.GIF"; raceOrder++; racePos[i] = raceOrder; } else { driverDot[i] = "lapped_dot.GIF"; } updateDot(i); updateData(i); for(k=0;k<drivers;k++) { if(driverRetired[k]) { updateData(k); } } } else{} prevLap = currLap-1; if(driverRetired[i] || driverFinished[i]) { } else if(driverPitTime[i][currLap]>0) { pitIn=1; if(time>(driverCumTime[i][currLap]-pitEntryAdj)) { pitLane=1; currentPosition = pitEntry + Math.round((time-(driverCumTime[i][currLap]-pitEntryAdj))/(pitEntryAdj)*pitEntryDist,0); } else { if(driverPitTime[i][prevLap]>0) { if(time<(driverCumTime[i][prevLap]+driverPitTime[i][prevLap]+pitExitAdj)) { pitLane=1; currentPosition = Math.round((time-driverCumTime[i][prevLap])/(driverPitTime[i][prevLap]+pitExitAdj)*pitExit,0); } else { currentPosition = pitExit + Math.round((time-(driverCumTime[i][prevLap]+(driverPitTime[i][prevLap]+pitExitAdj)))/(driverLapTime[i][currLap]-(driverPitTime[i][prevLap]+pitExitAdj))*(positions-pitExit),0); } } else { currentPosition = Math.round((time-driverCumTime[i][prevLap])/(driverLapTime[i][currLap]-pitEntryAdj)*pitEntry,0); } } } else if(driverPitTime[i][prevLap]>0) { document.getElementById(driverNumber[i]).style.visibility = "visible"; if(time<(driverCumTime[i][prevLap]+driverPitTime[i][prevLap]+pitExitAdj)) { pitLane=1; currentPosition = Math.round((time-driverCumTime[i][prevLap])/(driverPitTime[i][prevLap]+pitExitAdj)*pitExit,0); } else { currentPosition = pitExit + Math.round((time-(driverCumTime[i][prevLap]+(driverPitTime[i][prevLap]+pitExitAdj)))/(driverLapTime[i][currLap]-(driverPitTime[i][prevLap]+pitExitAdj))*(positions-pitExit),0); } } else { currentPosition = Math.round((time-driverCumTime[i][prevLap])/(driverLapTime[i][currLap])*positions,0); } if(driverRetired[i] || driverFinished[i]) { } else if(pitLane) { document.getElementById(driverNumber[i]).style.left = pitX[currentPosition]; document.getElementById(driverNumber[i]).style.top = pitY[currentPosition]; } else { document.getElementById(driverNumber[i]).style.left = posX[currentPosition]; document.getElementById(driverNumber[i]).style.top = posY[currentPosition]; } if(pitIn) { if(blinker<20) { document.getElementById(driverNumber[i]).style.visibility = "hidden"; } else { document.getElementById(driverNumber[i]).style.visibility = "visible"; } } else{} } if(!pause) { timeOne = getTime(); } else { timeTwo = getTime(); if(time==0) { time = time + delay/1000*timescale; } else { time = time + (timeTwo-timeOne)*timescale; } timeOne = timeTwo; } if(time > (skiptime-2)) { timescale = oldscale; } if(time<(raceDuration + 180)) { setTimeout("engine()", (delay)); blinker++; if(blinker>40){blinker=0} if(blinker<20) { document.getElementById("legendFlash").style.visibility = "hidden"; } else { document.getElementById("legendFlash").style.visibility = "visible"; } } else { finish(); } } function getTime() { var now = new Date(); var t = now.getHours()*3600 + now.getMinutes()*60 + now.getSeconds() + now.getMilliseconds()/1000; t.toFixed(3); return t; } function updateTime() { document.getElementById("clock").innerHTML = "Elapsed Time: " + convertTime(time,1); } function showExpl() { if (document.getElementById("explanation").style.visibility == "hidden") { document.getElementById("explanation").style.visibility = "visible"; document.getElementById("buttonExpl").value = "<<"; } else { document.getElementById("explanation").style.visibility = "hidden"; document.getElementById("buttonExpl").value = ">>"; } } function showDDControl() { if (document.getElementById("ddcontrol").style.visibility == "hidden") { document.getElementById("ddcontrol").style.visibility = "visible"; document.getElementById("buttondd").value = "<<"; } else { document.getElementById("ddcontrol").style.visibility = "hidden"; document.getElementById("buttondd").value = ">>"; } } function clearData() { for(var i=0; i<drivers; i++) { document.getElementById("pa" + racePos[i]).innerHTML = "-"; document.getElementById("pb" + racePos[i]).innerHTML = "-"; document.getElementById("pbb" + racePos[i]).innerHTML = "-"; document.getElementById("pc" + racePos[i]).innerHTML = "-"; document.getElementById("pd" + racePos[i]).innerHTML = "-"; document.getElementById("qf1").innerHTML = "LAST"; document.getElementById("qf2").innerHTML = "GAP"; document.getElementById("qf3").innerHTML = "(PREV)"; document.getElementById("qf4").innerHTML = "STOPS"; if(driverRetired[i]) { document.getElementById(driverNumber[i]).innerHTML = ""; } } } function setup() { adjustments(); initArrays(); for(var i=0; i<drivers; i++) { document.write("<span id='" + driverNumber[i] + "' class='start'><IMG SRC='dot.GIF' ALT='' BORDER='NO'>" + driverNameAbb[i] + "</span>"); document.getElementById(driverNumber[i]).style.left = posX[0]; document.getElementById(driverNumber[i]).style.top = posY[0]; } document.write("<div class='dotlegend'>"); document.write("<span class='datah'>KEY<br></span>"); document.write("<span class='data'><IMG SRC='lead_dot.GIF' ALT='' BORDER='NO'>Leader<br><IMG SRC='dot.GIF' ALT='' BORDER='NO'>Lead Lap<br><IMG SRC='lapped_dot.GIF' ALT='' BORDER='NO'>Lapped<br><IMG id='legendFlash' SRC='dot.GIF' ALT='' BORDER='NO'>Pit In Lap</span>"); document.write("</div>"); document.write("<div class='databox'>"); document.write("<span class='lap' id='lapend'>Qualifying Results</span><br>"); document.write("<span class='clock'><span id='clock'>-</span></span><br>"); document.write("<table border='0' cellpadding='0' cellspacing='0' background='moongreen.gif' >"); document.write("<tr height='20' style='background-color:#CCCCCC'>"); document.write("<td class='datah' width='30'>POS</td>"); document.write("<td class='datah' width='90'>DRIVER</td>"); document.write("<td class='datah' width='50' align='center'><span id='qf1'>QF1</span></td>"); document.write("<td class='datah' width='50' align='center'><span id='qf2'>QF2</span></td>"); document.write("<td class='datah' width='50' align='center'><span id='qf3'>QF3</span></td>"); document.write("<td class='datah' width='50' align='center'><span id='qf4'>-</span></td>"); document.write("</tr>"); var flick = 0; for(var i=0; i<drivers; i++) { var temp = " style='background-color:#EEEEEE'"; if(flick) { temp = " style='background-color:#FFFFFF'"; flick = 0; } else { temp = " style='background-color:#EEEEEE'"; flick = 1; } document.write("<tr" + temp + ">"); document.write("<td class='data'>P" + (i+1) + " :</td>"); document.write("<td class='data' id='pa" + (i+1) + "'>-</td>"); document.write("<td class='data' align='center' id='pc" + (i+1) + "'>-</td>"); document.write("<td class='data' align='center' id='pb" + (i+1) + "'>-</td>"); document.write("<td class='data' align='center' id='pbb" + (i+1) + "'>-</td>"); document.write("<td class='data' align='center' id='pd" + (i+1) + "'>-</td>"); document.write("</tr>"); } document.write("<tr style='background-color:#CCCCCC'>"); document.write("<td class='data' colspan='6' align='center' height='10'></td>"); document.write("</tr>"); document.write("<tr>"); document.write("<td class='data' colspan='6' align='left'><INPUT class='datah' type='button' value='>>' id='buttonExpl' onClick='showExpl()'>&nbsp&nbsp&nbsp<span id='explanation' style='visibility:hidden'><span style='color:#0099FF'>Personal Best&nbsp&nbsp&nbsp</span><span style='color:#FF00FF'>Fastest Lap&nbsp&nbsp&nbsp</span><span style='color:#00CC00'>Gap Close&nbsp&nbsp&nbsp</span><span style='color:#FF0000'>Gap Open</span></span></td>"); document.write("</tr>"); document.write("<tr>"); document.write("<td class='data' colspan='6' align='center' height='20'></td>"); document.write("</tr>"); document.write("<tr>"); document.write("<td colspan='6' align='center'>"); document.write("<table id='ddcontrol' style='visibility:visible' cellpadding='0' cellspacing='0' border='0' background='moongreen.gif'>"); document.write("<tr>"); document.write("<td class='datah' align='center' colspan='6'>Display Driver Dots</td>"); document.write("</tr>"); var tempcount = 0; for(var r=0; r<4; r++) { document.write("<tr>"); for(var c=0; c<6; c++) { if(tempcount<drivers) { document.write("<td width='50' class='data' align='left'><input type='checkbox' class='data' id='cb" + (r*6 + c) + "' onClick='view(" + (r*6 + c) + ")' CHECKED>" + driverNameAbb[(r*6 + c)] + "</input></td>"); tempcount++; } else { document.write("<td width='50' class='data' align='left'><input type='checkbox' class='data' id='cb" + (r*6 + c) + "' onClick='view(" + (r*6 + c) + ")' DISABLED></input></td>"); } } document.write("</tr>"); } document.write("<tr>"); document.write("<td class='datah' align='center' colspan='6' height='20'><input type='checkbox' id='hideLapped' onClick='hide()'>HIDE LAPPED DRIVERS</input></td>"); document.write("</tr>"); document.write("</table>"); document.write("</td>"); document.write("</tr>"); document.write("</table>"); document.write("</div>"); for(var i=0; i<drivers; i++) { document.getElementById("pa" + racePos[i]).innerHTML = driverName[i]; document.getElementById("pc" + racePos[i]).innerHTML = driverQfTime1[i]; document.getElementById("pb" + racePos[i]).innerHTML = driverQfTime2[i]; document.getElementById("pbb" + racePos[i]).innerHTML = driverQfTime3[i]; } document.write("<div class='controls'>"); document.write("<table cellpadding='0' cellspacing='0'>"); document.write("<tr>"); document.write("<td valign='top' align='center' height='22'>"); document.write("<span class='comments1' id='lapcomments1'>" + " <br>" + "</span>"); document.write("</td>"); document.write("</tr>"); document.write("<tr>"); document.write("<td valign='top' align='center' height='22' style='color:#000000'>"); document.write("<span class='lap' id='lapcurr'>Press Play</span>"); document.write("</td>"); document.write("</tr>"); document.write("<tr>"); document.write("<td valign='top' align='center' height='22' style='color:#FF0000'>"); document.write("<span class='lap' id='fastest'>Fastest Lap: -</span>"); document.write("</td>"); document.write("</tr>"); document.write("<tr>"); document.write("<td align='center'>"); document.write("<img border='0' alt='start race' id='playButton' src='play.gif' onClick='play()' onMouseOut='loliteKey(1)' onMouseOver='hiliteKey(1)'>"); document.write("<img border='0' alt='pause race' id='pauseButton' src='pause.gif' onClick='pauseReplay()' onMouseOut='loliteKey(2)' onMouseOver='hiliteKey(2)'>"); document.write("<img border='0' alt='reset race' id='resetButton' src='reset.gif' onClick='reset()' onMouseOut='loliteKey(3)' onMouseOver='hiliteKey(3)'>"); document.write("<img border='0' alt='skip to next lap' id='skipButton' src='skip.gif' onClick='nextLap()' onMouseOut='loliteKey(4)' onMouseOver='hiliteKey(4)'><br>"); document.write("</td>"); document.write("</tr>"); document.write("<tr>"); document.write("<td align='center'>"); document.write("<img border='0' alt='reduce speed x2' id='speeddown2Button' src='speeddown2.gif' onClick='speed(-2)' onMouseOut='loliteKey(5)' onMouseOver='hiliteKey(5)'>"); document.write("<img border='0' alt='reduce speed' id='speeddown1Button' src='speeddown1.gif' onClick='speed(-1)' onMouseOut='loliteKey(6)' onMouseOver='hiliteKey(6)'>"); document.write("<img border='0' alt='normal speed' id='speed1Button' src='speed1.gif' onClick='speed(0)' onMouseOut='loliteKey(7)' onMouseOver='hiliteKey(7)'>"); document.write("<img border='0' alt='increase speed' id='speedup1Button' src='speedup1.gif' onClick='speed(1)' onMouseOut='loliteKey(8)' onMouseOver='hiliteKey(8)'>"); document.write("<img border='0' alt='increase speed x2' id='speedup2Button' src='speedup2.gif' onClick='speed(2)' onMouseOut='loliteKey(9)' onMouseOver='hiliteKey(9)'>"); document.write("</td>"); document.write("</tr>"); document.write("<tr>"); document.write("<td align='center'>"); document.write("<span class='clock'>Speed Factor: real time <span id='speedfactor'>x" + timescale + "</span></span><br>"); document.write("</td>"); document.write("</tr>"); document.write("</table>"); document.write("</div>"); } function updateDot(i) { if(driverDot[i]=="lapped_dot.GIF" && document.getElementById("hideLapped").checked) { document.getElementById("cb" + i).checked = false; document.getElementById("cb" + i).disabled = true; } else if(driverDot[i]=="lapped_dot.GIF" && !document.getElementById("hideLapped").checked) { document.getElementById("cb" + i).checked = true; document.getElementById("cb" + i).disabled = false; } else { if(document.getElementById("cb" + i).disabled) { document.getElementById("cb" + i).checked = true; document.getElementById("cb" + i).disabled = false; }else{} } view(i); } function hide() { for(var i=0; i<drivers; i++) { if(driverDot[i] == "lapped_dot.GIF" && document.getElementById("hideLapped").checked) { document.getElementById("cb" + i).checked = false; document.getElementById("cb" + i).disabled = true; view(i); } else if(driverDot[i] == "lapped_dot.GIF" && !document.getElementById("hideLapped").checked) { document.getElementById("cb" + i).checked = true; document.getElementById("cb" + i).disabled = false; view(i); } else{} } } function view(x) { if(driverRetired[x]) { document.getElementById(driverNumber[x]).innerHTML = ""; } else if(document.getElementById("cb" + x).checked == true) { document.getElementById(driverNumber[x]).innerHTML = "<IMG SRC='" + driverDot[x] + "' ALT='' BORDER='NO'>" + driverNameAbb[x]; } else { document.getElementById(driverNumber[x]).innerHTML = ""; } } function play() { if(time>0 && !pause) { pause=1; } else if(time>0 && pause) {} else { clearData(); updateComments(); document.getElementById("lapcurr").innerHTML = "Race - Lap 1 of " + laps; document.getElementById("lapend").innerHTML = "GO!"; engine(); } } function pauseReplay() { if(pause) { pause=0; } else { pause=1; } } function speed(x) { if(x==-1 && timescale<=1){} else if(x==-2 && timescale/2<1){} else if(x==-1 || x==1){timescale=timescale+x;} else if(x==-2){timescale=Math.round(timescale/2);} else if(x==2){timescale=Math.round(timescale*2);} else if(x==0){timescale=1;} oldscale=timescale; document.getElementById("speedfactor").innerHTML = "x" + timescale; } function finish() { } function nextLap() { skiptime = leadDuration[raceLap]; if(timescale!=100) { oldscale = timescale; timescale = 100; } } function reset() { window.location.reload(); } function updateData(i) { var gap; var gapFormatted; var driversAhead = 0; var gapcolor; var timecolor; if(driverLapTime[i][driverLap[i]] == -1 && !driverRetired[i]) { document.getElementById(driverNumber[i]).innerHTML = ""; driverRetired[i] = 1; } else if(driverLapTime[i][driverLap[i]] == 0 && !driverFinished[i]) { document.getElementById(driverNumber[i]).innerHTML = ""; driverFinished[i] = 1; }else{} gap = driverCumTime[i][driverLap[i]-1] - driverCumTime[raceLeader][driverLap[raceLeader]-1]; if(driverLap[i] == raceLap) { gapFormatted = "+" + gap.toFixed(1); } else { gapFormatted = "+" + (driverLap[raceLeader] - driverLap[i]) + "L"; for(j=0; j<drivers; j++) { if(!driverRetired[i] && driverLap[j]>=driverLap[i] && i!=j) { driversAhead++; } else if(driverRetired[i] && driverLap[j]>driverLap[i] && i!=j) { driversAhead++; } else if(driverRetired[i] && driverRetired[j] && driverLap[i]==driverLap[j] &&driverNumber[j]<driverNumber[i] && i!=j) { driversAhead++; } } racePos[i] = driversAhead + 1; } document.getElementById("pc" + racePos[i]).style.color = "#000000"; if((driverLapTime[i][driverLap[i]-1] < driverFastestLap[i] && driverLapTime[i][driverLap[i]-1]>0) || (driverFastestLap[i] == null && driverLapTime[i][driverLap[i]-1] != 0)) { driverFastestLap[i] = driverLapTime[i][driverLap[i]-1]; document.getElementById("pc" + racePos[i]).style.color = "#0099FF"; }else{} if(driverLapTime[i][driverLap[i]-1]<fastestLap && driverLapTime[i][driverLap[i]-1]>0) { fastestLap = driverLapTime[i][driverLap[i]-1]; document.getElementById("fastest").innerHTML = "Fastest Lap: " + driverName[i] + " " + driverLapTimeConv[i][driverLap[i]-1] + " (Lap " + (driverLap[i]-1) + ")"; document.getElementById("pc" + racePos[i]).style.color = "#FF00FF"; }else{} if(driverPitTime[i][driverLap[i]-1]>0 && !driverRetired[i]) { driverStops[i]++; }else{} if(gap<prevGap[i]) { document.getElementById("pb" + racePos[i]).style.color = "#00CC00"; } else if(gap>prevGap[i]) { document.getElementById("pb" + racePos[i]).style.color = "#FF0000"; } else { document.getElementById("pb" + racePos[i]).style.color = "#000000"; } document.getElementById("pa" + racePos[i]).innerHTML = driverName[i]; document.getElementById("pb" + racePos[i]).innerHTML = gapFormatted; document.getElementById("pbb" + racePos[i]).innerHTML = "(" + prevGapFormatted[i] + ")"; if(driverRetired[i] || driverFinished[i]) { document.getElementById("pc" + racePos[i]).innerHTML = driverLapTimeConv[i][driverLap[i]]; document.getElementById("pb" + racePos[i]).style.color = "#000000"; document.getElementById("pc" + racePos[i]).style.color = "#000000"; } else { document.getElementById("pc" + racePos[i]).innerHTML = driverLapTimeConv[i][driverLap[i]-1]; } document.getElementById("pd" + racePos[i]).innerHTML = driverStops[i]; prevGap[i] = gap; prevGapFormatted[i] = gapFormatted; } function convertTime(t,type) { if(isNaN(t)) { return t; } else { var hr = Math.round(t/3600-0.5); var min = Math.round(((t - hr*3600)/60) - 0.5); var sec = t - hr*3600 - min*60; if(type==1) { sec = sec.toFixed(0); if(min<10) { min = "0" + min; } if(sec<10) { sec = "0" + sec; } t = hr + "h " + min + "m " + sec + "s "; return t; } else if(type==2) { sec = sec.toFixed(3); if(sec<10) { sec = "0" + sec; } t = min + ":" + sec; return t; } else{} }}

