| 
 | 1 | +// Create Template Variables  | 
 | 2 | +const INTERVAL_MS = 1000 / 60;  | 
 | 3 | +let timerID;  | 
 | 4 | +let lastTimerStartTime = 0;  | 
 | 5 | +let millisElapsedBeforeLastStart = 0;  | 
 | 6 | + | 
 | 7 | +// Get Our Data From The DOM  | 
 | 8 | +const timer = document.getElementById("timer");  | 
 | 9 | +const startButton = document.getElementById("start-button");  | 
 | 10 | +const stopButton = document.getElementById("stop-button");  | 
 | 11 | +const resetButton = document.getElementById("reset-button");  | 
 | 12 | + | 
 | 13 | +// USE EVENTS  | 
 | 14 | +startButton.addEventListener("click", startTimer);  | 
 | 15 | +stopButton.addEventListener("click", stopTimer);  | 
 | 16 | +resetButton.addEventListener("click", resetTimers);  | 
 | 17 | + | 
 | 18 | +// ---- CREATING A FUNCTIONS ----  | 
 | 19 | + | 
 | 20 | +// 1. startTimer  | 
 | 21 | +function startTimer() {  | 
 | 22 | +  startButton.disabled = true;  | 
 | 23 | +  stopButton.disabled = false;  | 
 | 24 | +  resetButton.disabled = true;  | 
 | 25 | + | 
 | 26 | +  lastTimerStartTime = Date.now();  | 
 | 27 | +  timerID = setInterval(updateTimer, INTERVAL_MS);  | 
 | 28 | +}  | 
 | 29 | + | 
 | 30 | +// 2. stopTimer  | 
 | 31 | +function stopTimer() {  | 
 | 32 | +  startButton.disabled = false;  | 
 | 33 | +  stopButton.disabled = true;  | 
 | 34 | +  resetButton.disabled = false;  | 
 | 35 | + | 
 | 36 | +  millisElapsedBeforeLastStart += Date.now() - lastTimerStartTime;  | 
 | 37 | +  clearInterval(timerID);  | 
 | 38 | +}  | 
 | 39 | + | 
 | 40 | +// 3. resetTimer  | 
 | 41 | +function resetTimers() {  | 
 | 42 | +  resetButton.disabled = true;  | 
 | 43 | +  timer.textContent = "00:00:00";  | 
 | 44 | +  millisElapsedBeforeLastStart = 0;  | 
 | 45 | +}  | 
 | 46 | + | 
 | 47 | +// 4. updateTimer  | 
 | 48 | +function updateTimer() {  | 
 | 49 | +  const milllisElapsed =  | 
 | 50 | +    Date.now() - lastTimerStartTime + millisElapsedBeforeLastStart;  | 
 | 51 | +  const secondsElapsed = milllisElapsed / 1000;  | 
 | 52 | +  const minutesElapsed = secondsElapsed / 60;  | 
 | 53 | + | 
 | 54 | +  const millisText = formateNumber(milllisElapsed % 1000, 3);  | 
 | 55 | +  const secondsText = formateNumber(Math.floor(secondsElapsed) % 60, 2);  | 
 | 56 | +  const minutesText = formateNumber(Math.floor(minutesElapsed), 2);  | 
 | 57 | +  timer.textContent = `${minutesText}:${secondsText}:${millisText}`;  | 
 | 58 | +}  | 
 | 59 | + | 
 | 60 | +// 5. formatNumber  | 
 | 61 | +function formateNumber(number, desiredLength) {  | 
 | 62 | +  const stringNumber = String(number);  | 
 | 63 | +  if (stringNumber.length > desiredLength) {  | 
 | 64 | +    return stringNumber.slice(0, desiredLength);  | 
 | 65 | +  }  | 
 | 66 | + | 
 | 67 | +  return stringNumber.padStart(desiredLength, "0");  | 
 | 68 | +}  | 
0 commit comments