//Pre loads the audio files const hooterSound = new Audio('/racetime/static/sounds/hooter.mp3'); const tenSecBeeper = new Audio('/racetime/static/sounds/9beeps9seconds.mp3'); hooterSound.load(); tenSecBeeper.load(); // reset the tool function reset(){ if (confirm("This will clear all entries and close your session.\nIt cannot be un-done.")) { window.location.reload(true); } else { return false } } //Submit the form to users. function processForm(){ if (document.getElementById("raceNameInput").value == "") {return}; if (document.getElementById("ood").value == "") {return}; if (document.getElementById("crew1").value == "") {return}; if (navigator.onLine == true){}; var xhr = new XMLHttpRequest(); var url = '/racetime'; xhr.open("POST", url, true); xhr.setRequestHeader("Content-Type", "application/JSON"); xhr.onerror = function(){ console.log("error"); alert("Your results were not transmitted. \n\ Please check your internet connection and try again.\n\n\ If this problem persists please save them manually using the \"Download results as CSV file\" button."); return false; } xhr.onreadystatechange = function () { if (this.readyState == 4 && this.status == 200) { alert("Your results were sent successfully."); return true; } }; var inputs = document.getElementsByTagName("input"); var notes = document.getElementById("OodNotesTextArea").value; var payload = [{}]; for(i=0;i (data[key] = value)); console.log(data); return data; }; // make the CSV file locally function makeCSV(){ var csv = []; var csvFile; var downloadLink; var startTime = document.getElementById("raceStartTime").value; var raceName = document.getElementById("raceNameInput").value; var notes = document.getElementById("OodNotesTextArea").value; var OOD = document.getElementById("ood").value; var Crew1 = document.getElementById("crew1").value; var Crew2 = document.getElementById("crew2").value; csv.push(["Race Name",raceName,"","","",""+"\r\n"]); csv.push(["OOD",OOD,"","","",""+"\r\n"]); csv.push(["Crew 1",Crew1,"","","",""+"\r\n"]); csv.push(["Crew 2",Crew2,"","","",""+"\r\n"]); csv.push(["Race Satrted at",startTime,"","","",""+"\r\n"]); csv.push(["Division","Boat Class","Yardstick","Sail Number","Helm Name","finish Time","elapsed Time","Corrected Time"+"\r\n"]); var entries = document.getElementsByTagName("tr"); for(a=1;a\ \ \ \
\
Division
\
Boat Class
\
Boat Yardstick
\
Sail Number
\
Helm Name
\ \
\
\
\ Finish Time\ \
\
\ Elapsed Time\ \ \
\
\
Corrected Time
\
\ \ \ \
\
\
\ '; element.insertAdjacentHTML( 'afterend', newElement ); }; // Records a start time function recordStartTime(){ const d = new Date(); let startTime = d.toLocaleTimeString(); document.getElementById("raceStartTime").value = startTime; }; //records a lap split function split(id){ console.log(id); const d = new Date(); //let time = d.getTime(); let time = d.toLocaleTimeString(); var e = id.split(",") console.log(e) var targetID = e[0]+e[2] console.log(targetID) document.getElementById(targetID).value = time; console.log(time,id); }; //records a finish time function finish(id){ const d = new Date(); let time = d.toLocaleTimeString(); var e = id.split(","); var targetID = e[0]+e[2]; var start = document.getElementById("raceStartTime").value; var elapsed = document.getElementById("raceTimer").innerHTML; var elapsedSeconds = document.getElementById("raceTimerSeconds").value; document.getElementById(targetID).value = time; document.getElementById("elapsedTime"+e[2]).value = elapsed; document.getElementById("elapsedSeconds"+e[2]).value = elapsedSeconds; // document.getElementById("finishTimeDeets"+e[2]).setAttribute('style', "display: inline-block;"); document.getElementById("finishTime,Button,"+e[2]).innerHTML = "Re-Take"; horn(); calcCorrected(id); document.getElementById("finishTimeDeetsTypeA_No"+e[2]).setAttribute('style', ""); document.getElementById("competitorDetailsPane"+e[2]).setAttribute('style', "transform: translateY(0);"); }; //calculates the corected time function calcCorrected(x){ var targetIDnumber = x.split(",")[2]; var elapsedSeconds = document.getElementById("elapsedSeconds"+targetIDnumber).value; var yardStick = document.getElementById("yardStick"+targetIDnumber).value; var correctedTimeSeconds = Math.floor((((elapsedSeconds*100)*1000)/yardStick)/1000);//*1000 for miliseconds in the time module document.getElementById("correctedTimeSeconds"+targetIDnumber).value = correctedTimeSeconds; document.getElementById("correctedTime"+targetIDnumber).value = secondsToTime(correctedTimeSeconds); } //rank the finished competitors function rank(){ var results = {}; var entries = document.getElementsByTagName("td"); var ranking = []; for(var i = 0; i < entries.length-1; i++){ var dict = {}; if (Math.abs(document.getElementById("correctedTimeSeconds"+(i+1)).value) > 0){ ranking.push(Math.abs(document.getElementById("correctedTimeSeconds"+(i+1)).value)); results[Math.abs(document.getElementById("correctedTimeSeconds"+(i+1)).value)] = document.getElementById("HelmName"+(i+1)).value; }; }; ranking.sort(function(a, b){return a-b}); console.log(ranking); var resultsWindow = window.open("", "Corrected Time preliinary results", "width=1024,height=768"); resultsWindow.document.write('
'); // resultsWindow.document.getElementById('content').innerHTML = ""; var html = ""; for(var i = 0; i < ranking.length; i++){ console.log(i+1, results[ranking[i]], secondsToTime(ranking[i])); html += (""); }; console.log(html); console.log(ranking.length); if(ranking.length == 0){ html += "There are no valid yardstick results to display."; }; html += '
"+(i+1)+""+results[ranking[i]]+""+secondsToTime(ranking[i])+"
'; resultsWindow.document.getElementById('content').innerHTML = html; }; //turn seconds into a time format function secondsToTime(sec) { var seconds = parseInt(sec, 10); // don't forget the second param var hours = Math.floor(seconds / 3600); var minutes = Math.floor((seconds - (hours * 3600)) / 60); seconds = seconds - (hours * 3600) - (minutes * 60); if (hours < 10) {hours = "0"+hours;} if (minutes < 10) {minutes = "0"+minutes;} if (seconds < 10) {seconds = "0"+seconds;} var time = hours+':'+minutes+':'+seconds; return time; } //locks the entry list and displays the start/stop/lap/finish functions function raceView(){ document.getElementById("startStopControls").setAttribute('style', 'display: block'); document.getElementById("lateEntriesControl").setAttribute('style', 'display: block'); toggleDiv("inRaceControls",true); toggleDiv("metaDeets",false); document.getElementById("downLoadControls").setAttribute('style', 'display: none'); document.getElementById("crew").setAttribute('style', 'display: None'); document.getElementById("raceName").setAttribute('style', 'display: None'); // document.getElementById("downLoadControls").setAttribute('style', 'display: block'); }; //resets the start and finish times and buttons function doReset(){ if (confirm("Pressing OK to clear the finish time details or cancel to retain them.")){ hideFinishtimeDeets(); } document.getElementById("startStopControls").setAttribute('style', 'display: block'); document.getElementById("raceViewButton").innerHTML = "Enter Race View"; toggleDiv("inRaceControls",true); toggleDiv("metaDeets",true); document.getElementById("startSequenceButton").disabled = false; document.getElementById("startTimer").innerHTML = '--:--:--'; var toggleClassDivs = document.getElementsByClassName("inRaceControls"); for(var i = 0; i < toggleClassDivs.length; i++){ toggleClassDivs[i].disabled = false; }; var timeDivs = document.getElementsByClassName("finishTimeDeets"); for(var i = 0; i < timeDivs.length; i++){ document.getElementById("finishTime"+(i+1)).value=""; document.getElementById("elapsedTime"+(i+1)).value=""; // }; // var timeDivs = document.getElementsByClassName("finishTimeDeets"); // for(var i = 0; i < timeDivs.length; i++){ var d = document.getElementById(timeDivs[i].id); var b = document.getElementById('finishTime,Button,'+(i+1)); if(b === null) { console.log("Value is null"); } else { b.innerHTML = "Finish"; d.setAttribute('style', 'display: none;'); }; }; resetFinishButtons(); // var finButtons = document.getElementsByClassName("finishButton"); // for(var i = 0; i < finButtons.length; i++){ // var t = document.getElementById(finButtons[i].id); // if(t === null) { // console.log("Value is null"); // } else { // t.setAttribute('style', 'display: inline-block;'); // }; // }; document.getElementById("flag1").setAttribute('style', 'transform: translateX(-25vw);'); document.getElementById("flag2").setAttribute('style', 'transform: translateX(-25vw);'); document.getElementById("flagContainer").setAttribute('style', 'display: none;'); document.getElementById("mainContainer").setAttribute('style', 'width: 100%; margin-left: 0;'); }; // resets the finish buttons to say "Finish" function resetFinishButtons (){ var timeDivs = document.getElementsByClassName("finishTimeDeetsTypeA"); for(var i = 0; i < timeDivs.length; i++){ var d = document.getElementById(timeDivs[i].id); var b = document.getElementById('finishTime,Button,'+(i+1)); if(b === null) { console.log("Value is null"); } else { b.innerHTML = "Finish"; // d.setAttribute('style', 'display: none;'); }; }; }; //event listeners document.getElementById('raceNameInput').onchange = function() { document.title = document.getElementById('raceNameInput').value; }; //stops the timer function stopTimer(){ var sessionID = document.getElementById("RaceID").value; uploadStartTime(sessionID, "null"); document.getElementById("downLoadControls").setAttribute('style', 'display: block'); document.getElementById("raceName").setAttribute('style', 'display: block'); document.getElementById("crew").setAttribute('style', 'display: block; '); document.getElementById("raceViewButton").innerHTML = "Enter Race View"; document.getElementById("lateEntriesControl").setAttribute('style', 'display: none;'); toggleDiv("metaDeets",true); try {window.clearInterval(timeoutID);} catch(e) {}; document.getElementById("signal").innerHTML = "Get Ready..."; document.getElementById("raceTimer").innerHTML = "--:--:--"; document.getElementById("startSequenceButton").disabled = false; document.getElementById("reset").disabled = false; document.getElementById("sequenceTimeSelector").setAttribute('style', 'visibility: visible'); document.getElementById("flag1").setAttribute('style', 'transform: translateX(-25vw);'); document.getElementById("flag2").setAttribute('style', 'transform: translateX(-25vw);'); var finButtons = document.getElementsByClassName("finishButton"); for(var i = 0; i < finButtons.length; i++){ console.log(i); var et = document.getElementById('elapsedTime'+(i+1)).value; var ft = document.getElementById('finishTime'+(i+1)).value; var t = document.getElementById('finishTimeDeetsTypeA_No'+(i+1)); if(ft == null||ft == ""||ft == "--:--:--"||ft== "DNF") { document.getElementById('finishTime'+(i+1)).value = "DNF"; document.getElementById('elapsedTime'+(i+1)).value = "DNF"; document.getElementById('correctedTime'+(i+1)).value = "DNF"; }; t.setAttribute('style', ''); }; }; //hides the finish time details pane function hideFinishtimeDeets(){ var t = document.getElementsByClassName("finishTimeDeetsTypeA"); for(i=0;i 0){ let m = addZero(countDown.getMinutes()); let s = addZero(countDown.getSeconds()); document.getElementById("startTimer").innerHTML = m+":"+s; }; if (elapsedSeconds > 0){ var elapsed = secondsToHms(elapsedSeconds); document.getElementById("raceTimer").innerHTML = elapsed; document.getElementById("raceTimerSeconds").value = elapsedSeconds; }; // console.log(now); // console.log(now,sequenceStart,now-sequenceStart); // console.log(now,prepUp,now-prepUp); // console.log(now,prepDown,now-prepDown); // console.log(now,classDownStart,now-classDownStart); if ((now > getReadyTime)&&(now < sequenceStart)){ document.getElementById("signal").innerHTML = "Get Ready..."; console.log("ready time"); }; if ((now > sequenceStart-offset)&&(now < prepUp)){ document.getElementById("signal").innerHTML = "Class pennant up"; document.getElementById("flag1").setAttribute('style', 'transform: translateX(0vw);'); if (ClassPennantUpHorn == false){ hooterSound.play(); ClassPennantUpHorn = true; }; console.log("Class pennant up"); }; if ((now > prepUp-offset)&&(now < prepDown)){ document.getElementById("signal").innerHTML = "Preparatory signal up"; document.getElementById("flag2").setAttribute('style', 'transform: translateX(0vw);'); if (PreparatorySignalUpHorn == false){ hooterSound.play(); PreparatorySignalUpHorn = true; }; console.log("Preparatory signal up",sequenceStart-(sequenceStart+signals[1]*60*1000)); }; console.log(document.getElementById("trainingBeeps").checked); if (document.getElementById("trainingBeeps").checked == true){ if ((now >= (classDownStart - 10000))&&(now < classDownStart)){ if (trainingBeeps == false){ tenSecBeeper.play(); trainingBeeps = true; }; console.log("Play training beeps."); }; }; if ((now > prepDown-offset)&&(now < classDownStart)){ document.getElementById("signal").innerHTML = "Preparatory signal Down"; document.getElementById("flag2").setAttribute('style', 'transform: translateX(-25vw);'); if (PreparatorySignalDownHorn == false){ hooterSound.play(); PreparatorySignalDownHorn = true; }; console.log("Preparatory signal Down",sequenceStart-(sequenceStart+signals[2]*60*1000)); }; if (now > classDownStart-offset){ document.getElementById("signal").innerHTML = "Class pennant down (Race has started)"; document.getElementById("flag1").setAttribute('style', 'transform: translateX(-25vw);'); document.getElementById("flagContainer").setAttribute('style', 'display: none;'); document.getElementById("mainContainer").setAttribute('style', 'margin-left: 0; width: 100vw;'); console.log("Class pennant down",sequenceStart-(sequenceStart+signals[3]*60*1000)); if (startHorn == false){ hooterSound.play(); startHorn = true; }; if (startRecorded == false){ recordStartTime(); startRecorded = true; }; console.log("Class pennant down",sequenceStart-(sequenceStart+signals[3]*60*1000)); }; } , 1000,sequenceStart,signals); }; //sends the sequence start time to the server for syncing with the flags on the boat function uploadStartTime(sessionID,CountDownStart){ var sequenceType = document.getElementById("chosenSequence").value; var beeps = document.getElementById("trainingBeeps").checked; var xhr = new XMLHttpRequest(); var url = '/racetime/sessiondeets/sessionNumber?action=write&sessionID='+sessionID+'&sequenceStartAt='+CountDownStart+'&sequenceType='+sequenceType+'&beeps='+beeps; xhr.open("GET", url, true); xhr.onreadystatechange = function () { if (this.readyState == 4 && this.status == 200) { console.log(this.responseText); document.getElementById("sessionInitiateButton").setAttribute("style","display:none;"); document.getElementById("sessionInfoLabel").setAttribute("style","display:block;"); }; }; xhr.send(); };