-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathscript.js
More file actions
182 lines (137 loc) · 5.77 KB
/
Copy pathscript.js
File metadata and controls
182 lines (137 loc) · 5.77 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
//storing elements as constants to reduce dom writing everytime
const counterFormArea = document.querySelector('.form-area');
const counterForm = document.getElementById('counter-form');
const counterEl = document.getElementById('counter');
const counterTitleEl = document.getElementById('counter-title');
const counterResetBtn = document.getElementById('counter-reset');
const datePicker = document.getElementById('counter-date');
const daysEl = document.getElementById('days');
const hoursEl = document.getElementById('hours');
const minutesEl = document.getElementById('minutes');
const secondsEl = document.getElementById('seconds');
const complete = document.getElementById('complete');
const completeInfo = document.getElementById('complete-info');
const completeBtn = document.getElementById('complete-button');
const progressBar = document.getElementById('progress-bar'); // Add progress bar reference
const timerSound = document.getElementById('timer-sound');
let countdownValue = Date; //date type variable
let countdownActive;
//all time in milli sec
const second = 1000; //1s = 1000ms
const minute = second * 60; //1min = 60s
const hour = minute * 60; //1h = 60min
const day = hour * 24; //1d = 24h
let title ='';
let date = '';
let startDate; // Add start date variable
let endDate; // Add end date variable
// Set minimum selectable date and time dynamically
let now = new Date().toISOString().slice(0, 16); // Includes time up to minutes
datePicker.setAttribute('min', now); // Set min attribute to current datetime
function updateDom() {
countdownActive = setInterval(() => {
let now = new Date().getTime();
let distance = countdownValue - now;
const days = Math.floor(distance / day);
const hours = Math.floor((distance % day) / hour);
const mins = Math.floor((distance % hour) / minute);
const secs = Math.floor((distance % minute) / second);
// Calculate progress percentage correctly
const totalDistance = endDate - startDate;
const distanceCovered = now - startDate;
const percentageDistance = (distanceCovered / totalDistance) * 100;
// Ensure percentage stays within 0-100%
const progressPercentage = Math.min(Math.max(percentageDistance, 0), 100);
// Save the correct progress value as a string
localStorage.setItem('countdownProgress', progressPercentage.toFixed(2)); // Ensures 2 decimal places
progressBar.style.width = `${progressPercentage}%`;
if (distance < 0) {
counterEl.hidden = true;
counterFormArea.hidden = true;
complete.hidden = false;
clearInterval(countdownActive);
completeInfo.textContent = `${title} completed on ${date}`;
progressBar.style.width = "100%";
localStorage.setItem('countdownProgress', "100");
// Play the sound when the timer expires
timerSound.play();
}
else
{
daysEl.textContent = days;
hoursEl.textContent = hours;
minutesEl.textContent = mins;
secondsEl.textContent = secs;
counterTitleEl.textContent = title;
counterFormArea.hidden = true;
counterEl.hidden = false;
}
}, 1000);
}
function updateCountdown(e){
e.preventDefault();
title = e.srcElement[0].value;
date = e.srcElement[1].value;
if(date === ""){
alert('Please Enter a date and time!');
return;
}
startDate = new Date().getTime(); // Capture the start date only once
endDate = new Date(date).getTime();
countdownValue = endDate;
const savedCountdown = {
title: title,
date: date,
startDate: startDate // Store start date in localStorage
};
localStorage.setItem('countdown', JSON.stringify(savedCountdown));
updateDom();
}
function reset() {
localStorage.removeItem('countdown');
localStorage.removeItem('countdownProgress');
counterEl.hidden = true;
complete.hidden = true;
clearInterval(countdownActive);
title = '';
date = '';
counterFormArea.hidden = false;
progressBar.style.width = "0%";
// Stop and reset the sound
timerSound.pause(); // Stop the sound
timerSound.currentTime = 0; // Reset the sound to the beginning
}
function restoreCountdown() {
const savedCountdownData = localStorage.getItem('countdown');
if (savedCountdownData) {
counterFormArea.hidden = true;
let countdownData = JSON.parse(savedCountdownData);
title = countdownData.title;
date = countdownData.date;
startDate = countdownData.startDate;
endDate = new Date(date).getTime();
countdownValue = endDate;
const savedProgress = parseFloat(localStorage.getItem('countdownProgress'));
if (!isNaN(savedProgress)) {
progressBar.style.width = savedProgress + "%"; // Apply correct progress
console.log(`Restored Progress Bar Width: ${progressBar.style.width}`);
}
updateDom();
}
}
counterForm.addEventListener('submit', updateCountdown);
counterResetBtn.addEventListener('click', reset);
completeBtn.addEventListener('click', reset);
datePicker.addEventListener('input', () => {
let selectedDateTime = new Date(datePicker.value);
let now = new Date();
// Ensure the selected time is not in the past
if (selectedDateTime < now) {
alert("You cannot select a past time!");
datePicker.value = ""; // Reset the input field
}
});
restoreCountdown();
//TO DO after learning backend:
// send mail to user that 5 min left, 1 min left , expired mail
// -----> requires backend knowledge