|
39 | 39 | start_button.disabled = true; |
40 | 40 | pause_button.disabled = false; |
41 | 41 | set_button.disabled = true; |
42 | | - reset_button.disabled = false; |
| 42 | + disableInputs(true); |
43 | 43 |
|
44 | 44 | startTime = new Date().valueOf(); |
45 | 45 |
|
|
55 | 55 | start_button.disabled = false; |
56 | 56 | pause_button.disabled = true; |
57 | 57 | set_button.disabled = false; |
| 58 | + disableInputs(false); |
58 | 59 |
|
59 | 60 | window.clearTimeout(timer); |
60 | 61 | }; |
|
65 | 66 | pause_button.disabled = true; |
66 | 67 | set_button.disabled = false; |
67 | 68 | reset_button.disabled = true; |
| 69 | + disableInputs(false); |
68 | 70 |
|
69 | 71 | hour_input.value = "00"; |
70 | 72 | min_input.value = "00"; |
|
78 | 80 | start_button.disabled = false; |
79 | 81 | pause_button.disabled = true; |
80 | 82 | set_button.disabled = false; |
| 83 | + disableInputs(false); |
81 | 84 |
|
82 | 85 | var hour = hour_input.value; |
83 | 86 | var min = min_input.value; |
|
97 | 100 | window.clearTimeout(timer); |
98 | 101 | }; |
99 | 102 |
|
| 103 | + function disableInputs(disabled) { |
| 104 | + hour_input.disabled = disabled; |
| 105 | + min_input.disabled = disabled; |
| 106 | + sec_input.disabled = disabled; |
| 107 | + const presetButtons = document.querySelectorAll( |
| 108 | + ".preset-btn, .custom-preset-btn" |
| 109 | + ); |
| 110 | + presetButtons.forEach((btn) => (btn.disabled = disabled)); |
| 111 | + } |
| 112 | + |
100 | 113 | function padZero(n) { |
101 | 114 | return n < 10 ? "0" + n : n; |
102 | 115 | } |
|
107 | 120 | let h = Math.floor(t / 3600); |
108 | 121 | let m = Math.floor(t / 60) % 60; |
109 | 122 | let s = Math.floor(t) % 60; |
110 | | - timer_main.innerHTML = `<strong>${padZero(h)}:${padZero(m)}:${padZero( |
111 | | - s |
112 | | - )}</strong>`; |
113 | | - let color = "#a3dafd"; |
| 123 | + timer_main.innerHTML = `${padZero(h)}:${padZero(m)}:${padZero(s)}`; |
| 124 | + let color = "#e0f7ff"; |
114 | 125 | if (duration !== undefined) { |
115 | 126 | if (counter < 0 && counter % 2 === 0) { |
116 | 127 | color = "red"; |
117 | | - } else if (counter < 60) { |
118 | | - color = "yellow"; |
| 128 | + } else if (counter > 0 && counter < 10) { |
| 129 | + color = "#ffc107"; // A warning yellow |
119 | 130 | } |
120 | 131 | } |
121 | 132 | timer_main.style.color = color; |
|
125 | 136 | counter--; |
126 | 137 | updateCounter(); |
127 | 138 | window.clearTimeout(timer); |
128 | | - if (counter <= 0) { |
| 139 | + if (counter < 0) { |
| 140 | + // Changed to < 0 to allow 00:00:00 to show |
129 | 141 | start_button.disabled = true; |
130 | 142 | pause_button.disabled = true; |
131 | 143 | set_button.disabled = false; |
132 | | - reset_button.disabled = false; |
133 | | - timer = window.setTimeout(onTimer, 500); |
| 144 | + disableInputs(false); |
| 145 | + // Flash timer when done |
| 146 | + let flash = true; |
| 147 | + const flashInterval = setInterval(() => { |
| 148 | + timer_main.style.visibility = flash ? "hidden" : "visible"; |
| 149 | + flash = !flash; |
| 150 | + }, 500); |
| 151 | + // Stop flashing after a few seconds |
| 152 | + setTimeout(() => { |
| 153 | + clearInterval(flashInterval); |
| 154 | + timer_main.style.visibility = "visible"; |
| 155 | + }, 5000); |
134 | 156 | return; |
135 | 157 | } |
136 | 158 |
|
|
152 | 174 |
|
153 | 175 | presetButtons.forEach((btn) => { |
154 | 176 | btn.addEventListener("click", function () { |
155 | | - const hours = this.dataset.hours; |
156 | | - const minutes = this.dataset.minutes; |
157 | | - const seconds = this.dataset.seconds; |
| 177 | + const hours = this.dataset.hours.padStart(2, "0"); |
| 178 | + const minutes = this.dataset.minutes.padStart(2, "0"); |
| 179 | + const seconds = this.dataset.seconds.padStart(2, "0"); |
158 | 180 |
|
159 | | - hour_input.value = hours.padStart(2, "0"); |
160 | | - min_input.value = minutes.padStart(2, "0"); |
161 | | - sec_input.value = seconds.padStart(2, "0"); |
| 181 | + hour_input.value = hours; |
| 182 | + min_input.value = minutes; |
| 183 | + sec_input.value = seconds; |
162 | 184 |
|
163 | 185 | setTime(); |
164 | 186 | }); |
165 | 187 | }); |
166 | 188 |
|
167 | 189 | if (savePresetBtn) { |
168 | 190 | savePresetBtn.addEventListener("click", function () { |
169 | | - const name = prompt("Enter a name for this preset:"); |
| 191 | + const h = hour_input.value; |
| 192 | + const m = min_input.value; |
| 193 | + const s = sec_input.value; |
| 194 | + if (h === "00" && m === "00" && s === "00") { |
| 195 | + alert("Please set a time before saving a preset."); |
| 196 | + return; |
| 197 | + } |
| 198 | + const name = prompt( |
| 199 | + `Enter a name for this preset (${h}:${m}:${s}):` |
| 200 | + ); |
170 | 201 | if (name && name.trim()) { |
171 | | - saveCustomPreset(name.trim()); |
| 202 | + saveCustomPreset(name.trim(), h, m, s); |
172 | 203 | } |
173 | 204 | }); |
174 | 205 | } |
175 | 206 | } |
176 | 207 |
|
177 | | - function saveCustomPreset(name) { |
178 | | - const hours = hour_input.value; |
179 | | - const minutes = min_input.value; |
180 | | - const seconds = sec_input.value; |
181 | | - |
182 | | - if (hours === "00" && minutes === "00" && seconds === "00") { |
183 | | - alert("Please set a time before saving a preset."); |
184 | | - return; |
185 | | - } |
186 | | - |
187 | | - const preset = { |
188 | | - name: name, |
189 | | - hours: hours, |
190 | | - minutes: minutes, |
191 | | - seconds: seconds, |
192 | | - }; |
| 208 | + function saveCustomPreset(name, hours, minutes, seconds) { |
| 209 | + const preset = { name, hours, minutes, seconds }; |
193 | 210 |
|
194 | 211 | let customPresets = JSON.parse( |
195 | 212 | localStorage.getItem("customPresets") || "[]" |
|
212 | 229 |
|
213 | 230 | customPresets.forEach((preset, index) => { |
214 | 231 | const presetBtn = document.createElement("button"); |
215 | | - presetBtn.className = "custom-preset-btn"; |
| 232 | + presetBtn.className = "preset-btn custom-preset-btn"; |
216 | 233 | presetBtn.innerHTML = `${preset.name}<br><small>${preset.hours}:${preset.minutes}:${preset.seconds}</small>`; |
217 | 234 |
|
218 | 235 | presetBtn.addEventListener("click", function () { |
|
222 | 239 | setTime(); |
223 | 240 | }); |
224 | 241 |
|
225 | | - const deleteBtn = document.createElement("button"); |
| 242 | + const deleteBtn = document.createElement("span"); |
226 | 243 | deleteBtn.className = "delete-btn"; |
227 | 244 | deleteBtn.innerHTML = "×"; |
| 245 | + deleteBtn.title = "Delete preset"; |
228 | 246 | deleteBtn.addEventListener("click", function (e) { |
229 | 247 | e.stopPropagation(); |
230 | 248 | deleteCustomPreset(index); |
|
0 commit comments