-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathscript.js
More file actions
365 lines (306 loc) · 10.5 KB
/
script.js
File metadata and controls
365 lines (306 loc) · 10.5 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
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
// DOM Content Loaded Event
document.addEventListener('DOMContentLoaded', function() {
// Navigation functionality
initNavigation();
// Form handling
initFormHandling();
// Interactive buttons
initInteractiveFeatures();
// Welcome animation
showWelcomeMessage();
});
// Navigation between sections
function initNavigation() {
const navLinks = document.querySelectorAll('nav a');
const sections = document.querySelectorAll('.section');
navLinks.forEach(link => {
link.addEventListener('click', function(e) {
e.preventDefault();
// Remove active class from all sections
sections.forEach(section => {
section.classList.remove('active');
});
// Get target section
const targetId = this.getAttribute('href').substring(1);
const targetSection = document.getElementById(targetId);
if (targetSection) {
// Add active class to target section
targetSection.classList.add('active');
// Smooth scroll to section
targetSection.scrollIntoView({
behavior: 'smooth',
block: 'start'
});
}
// Update active nav link
navLinks.forEach(navLink => {
navLink.classList.remove('active');
});
this.classList.add('active');
});
});
}
// Form handling with validation
function initFormHandling() {
const form = document.getElementById('userForm');
if (form) {
form.addEventListener('submit', function(e) {
e.preventDefault();
// Get form data
const formData = new FormData(this);
const name = formData.get('name');
const email = formData.get('email');
const message = formData.get('message');
// Validate form
if (validateForm(name, email, message)) {
// Show loading state
showLoadingState();
// Simulate form submission (replace with actual PHP submission)
setTimeout(() => {
showSuccessMessage(name);
form.reset();
}, 1500);
}
});
// Real-time validation
const inputs = form.querySelectorAll('input, textarea');
inputs.forEach(input => {
input.addEventListener('blur', function() {
validateField(this);
});
input.addEventListener('input', function() {
clearFieldError(this);
});
});
}
}
// Form validation
function validateForm(name, email, message) {
let isValid = true;
// Name validation
if (!name || name.trim().length < 2) {
showFieldError('name', 'Name must be at least 2 characters long');
isValid = false;
}
// Email validation
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
if (!email || !emailRegex.test(email)) {
showFieldError('email', 'Please enter a valid email address');
isValid = false;
}
// Message validation
if (!message || message.trim().length < 10) {
showFieldError('message', 'Message must be at least 10 characters long');
isValid = false;
}
return isValid;
}
// Individual field validation
function validateField(field) {
const value = field.value.trim();
const fieldName = field.name;
switch(fieldName) {
case 'name':
if (value.length < 2) {
showFieldError(fieldName, 'Name must be at least 2 characters long');
return false;
}
break;
case 'email':
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
if (!emailRegex.test(value)) {
showFieldError(fieldName, 'Please enter a valid email address');
return false;
}
break;
case 'message':
if (value.length < 10) {
showFieldError(fieldName, 'Message must be at least 10 characters long');
return false;
}
break;
}
clearFieldError(field);
return true;
}
// Show field error
function showFieldError(fieldName, message) {
const field = document.getElementById(fieldName);
const formGroup = field.parentElement;
// Remove existing error
const existingError = formGroup.querySelector('.error-message');
if (existingError) {
existingError.remove();
}
// Add error message
const errorDiv = document.createElement('div');
errorDiv.className = 'error-message';
errorDiv.style.color = '#e53e3e';
errorDiv.style.fontSize = '0.875rem';
errorDiv.style.marginTop = '0.25rem';
errorDiv.textContent = message;
formGroup.appendChild(errorDiv);
field.style.borderColor = '#e53e3e';
}
// Clear field error
function clearFieldError(field) {
const formGroup = field.parentElement;
const errorMessage = formGroup.querySelector('.error-message');
if (errorMessage) {
errorMessage.remove();
}
field.style.borderColor = '#e2e8f0';
}
// Interactive features
function initInteractiveFeatures() {
// Color change button
const colorBtn = document.getElementById('colorBtn');
if (colorBtn) {
colorBtn.addEventListener('click', changeBackgroundColor);
}
// Time display button
const timeBtn = document.getElementById('timeBtn');
if (timeBtn) {
timeBtn.addEventListener('click', displayCurrentTime);
}
}
// Change background color
function changeBackgroundColor() {
const body = document.body;
const variants = ['bg-variant-1', 'bg-variant-2', 'bg-variant-3', 'bg-variant-4'];
// Remove all existing variant classes
variants.forEach(variant => {
body.classList.remove(variant);
});
// Add random variant
const randomVariant = variants[Math.floor(Math.random() * variants.length)];
body.classList.add(randomVariant);
// Show notification
showNotification('Background color changed!', 'success');
}
// Display current time
function displayCurrentTime() {
const timeDisplay = document.getElementById('timeDisplay');
const now = new Date();
const options = {
weekday: 'long',
year: 'numeric',
month: 'long',
day: 'numeric',
hour: '2-digit',
minute: '2-digit',
second: '2-digit'
};
const formattedTime = now.toLocaleDateString('en-US', options);
if (timeDisplay) {
timeDisplay.innerHTML = `
<div style="text-align: center;">
<strong>Current Date & Time:</strong><br>
${formattedTime}
</div>
`;
// Add animation
timeDisplay.style.transform = 'scale(0.95)';
setTimeout(() => {
timeDisplay.style.transform = 'scale(1)';
}, 100);
}
}
// Show loading state
function showLoadingState() {
const submitBtn = document.querySelector('.btn-primary');
if (submitBtn) {
submitBtn.disabled = true;
submitBtn.textContent = 'Submitting...';
submitBtn.style.opacity = '0.7';
}
}
// Show success message
function showSuccessMessage(name) {
const submitBtn = document.querySelector('.btn-primary');
if (submitBtn) {
submitBtn.disabled = false;
submitBtn.textContent = 'Submit';
submitBtn.style.opacity = '1';
}
showNotification(`Thank you ${name}! Your form has been submitted successfully.`, 'success');
}
// Show notification
function showNotification(message, type = 'info') {
// Remove existing notifications
const existingNotifications = document.querySelectorAll('.notification');
existingNotifications.forEach(notification => notification.remove());
// Create notification element
const notification = document.createElement('div');
notification.className = 'notification';
notification.textContent = message;
// Styling based on type
const baseStyles = {
position: 'fixed',
top: '20px',
right: '20px',
padding: '1rem 2rem',
borderRadius: '8px',
color: 'white',
fontWeight: '600',
zIndex: '1000',
transform: 'translateX(100%)',
transition: 'transform 0.3s ease',
maxWidth: '400px',
wordWrap: 'break-word'
};
const typeStyles = {
success: { backgroundColor: '#48bb78' },
error: { backgroundColor: '#e53e3e' },
info: { backgroundColor: '#4299e1' }
};
// Apply styles
Object.assign(notification.style, baseStyles, typeStyles[type]);
// Add to document
document.body.appendChild(notification);
// Animate in
setTimeout(() => {
notification.style.transform = 'translateX(0)';
}, 100);
// Remove after 4 seconds
setTimeout(() => {
notification.style.transform = 'translateX(100%)';
setTimeout(() => {
if (notification.parentNode) {
notification.parentNode.removeChild(notification);
}
}, 300);
}, 4000);
}
// Welcome message
function showWelcomeMessage() {
setTimeout(() => {
showNotification('Welcome to our web application! Explore the features below.', 'info');
}, 1000);
}
// Smooth scrolling for all internal links
document.addEventListener('click', function(e) {
if (e.target.tagName === 'A' && e.target.getAttribute('href').startsWith('#')) {
e.preventDefault();
const targetId = e.target.getAttribute('href').substring(1);
const targetElement = document.getElementById(targetId);
if (targetElement) {
targetElement.scrollIntoView({
behavior: 'smooth',
block: 'start'
});
}
}
});
// Add some interactive hover effects
document.addEventListener('mouseover', function(e) {
if (e.target.classList.contains('form-group')) {
e.target.style.transform = 'translateX(5px)';
e.target.style.transition = 'transform 0.2s ease';
}
});
document.addEventListener('mouseout', function(e) {
if (e.target.classList.contains('form-group')) {
e.target.style.transform = 'translateX(0)';
}
});