// Email Composer Module class EmailComposer { constructor() { this.modal = document.getElementById('email-modal'); this.form = document.getElementById('email-form'); this.closeBtn = document.getElementById('close-modal'); this.cancelBtn = document.getElementById('cancel-email'); this.messageTextarea = document.getElementById('email-message'); this.charCounter = document.querySelector('.char-counter'); this.currentRecipient = null; this.init(); } init() { // Modal controls this.closeBtn.addEventListener('click', () => this.closeModal()); this.cancelBtn.addEventListener('click', () => this.closeModal()); this.modal.addEventListener('click', (e) => { if (e.target === this.modal) this.closeModal(); }); // Form handling this.form.addEventListener('submit', (e) => this.handleSubmit(e)); // Character counter this.messageTextarea.addEventListener('input', () => this.updateCharCounter()); // Escape key to close modal document.addEventListener('keydown', (e) => { if (e.key === 'Escape' && this.modal.style.display === 'block') { this.closeModal(); } }); } openModal(recipient) { this.currentRecipient = recipient; // Populate recipient info document.getElementById('recipient-email').value = recipient.email; document.getElementById('recipient-info').innerHTML = ` ${recipient.name}
${recipient.office}
${recipient.district}
${recipient.email} `; // Set postal code from current lookup const postalCode = window.postalLookup ? window.postalLookup.currentPostalCode : ''; document.getElementById('sender-postal-code').value = postalCode; // Clear form fields document.getElementById('sender-name').value = ''; document.getElementById('sender-email').value = ''; document.getElementById('email-subject').value = ''; document.getElementById('email-message').value = ''; // Set default subject document.getElementById('email-subject').value = `Message from your constituent in ${postalCode}`; this.updateCharCounter(); this.modal.style.display = 'block'; // Focus on first input document.getElementById('sender-name').focus(); } closeModal() { this.modal.style.display = 'none'; this.currentRecipient = null; } updateCharCounter() { const maxLength = 5000; const currentLength = this.messageTextarea.value.length; const remaining = maxLength - currentLength; this.charCounter.textContent = `${remaining} characters remaining`; if (remaining < 100) { this.charCounter.style.color = '#dc3545'; // Red } else if (remaining < 500) { this.charCounter.style.color = '#ffc107'; // Yellow } else { this.charCounter.style.color = '#666'; // Default } } validateForm() { const errors = []; const senderName = document.getElementById('sender-name').value.trim(); const senderEmail = document.getElementById('sender-email').value.trim(); const subject = document.getElementById('email-subject').value.trim(); const message = document.getElementById('email-message').value.trim(); if (!senderName) { errors.push('Your name is required'); } if (!senderEmail) { errors.push('Your email is required'); } else if (!this.validateEmail(senderEmail)) { errors.push('Please enter a valid email address'); } if (!subject) { errors.push('Subject is required'); } if (!message) { errors.push('Message is required'); } else if (message.length < 10) { errors.push('Message must be at least 10 characters long'); } // Check for suspicious content if (this.containsSuspiciousContent(message) || this.containsSuspiciousContent(subject)) { errors.push('Your message contains content that may not be appropriate'); } return errors; } validateEmail(email) { const regex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; return regex.test(email); } containsSuspiciousContent(text) { const suspiciousPatterns = [ /