PageSourceSearch

https://www.iatropedia.gr/wp-content/cache/min/1/wp-content/plugin…-public-60591f756a3d87592d214bccad2d5a34.js

js iatropedia.gr collected 2026-10-02 07:09:00 UTC 8,521 bytes, 187 lines download raw bytes

1document.addEventListener('DOMContentLoaded', function() {
2
3    /**
4     * Helper function to validate email format.
5     * @param {string} email - The email address to test.
6     * @returns {boolean} - True if the email format is valid, false otherwise.
7     */
8    function isValidEmail(email) {
9        const re = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
10        return re.test(String(email).toLowerCase());
11    }
12
13    /**
14     * Displays a feedback message (success, error, warning) on the form.
15     * @param {string} messageType - The type of message ('success', 'failed', 'warning').
16     * @param {string} messageText - The text to display.
17     */
18    function displayFormFeedbackMessage(messageType, messageText) {
19        let form = document.getElementById('political-ad-form');
20        if (!form) return;
21
22        let feedbackMessage = form.querySelector('.feedback-message');
23        let feedbackText = feedbackMessage ? feedbackMessage.querySelector('.feedback-message-text') : null;
24
25        if (feedbackMessage && feedbackText) {
26            feedbackText.textContent = messageText;
27            feedbackMessage.classList.remove('success', 'failed', 'warning', 'hidden');
28            feedbackMessage.classList.add(messageType);
29
30            setTimeout(function() {
31                feedbackMessage.classList.add('hidden');
32            }, 5000);
33        }
34    }
35
36    const form = document.getElementById('political-ad-form');
37    if (!form) {
38        return; // Exit if the form doesn't exist on this page
39    }
40
41    form.addEventListener('submit', function(e) {
42        e.preventDefault();
43
44        // Check if pcfData is defined. If not, show an error and stop.
45        if (typeof pcfData === 'undefined') {
46            console.error('Form data object (pcfData) is not defined. This script cannot submit the form.');
47            console.error('This object is usually created by wp_localize_script in WordPress.');
48            displayFormFeedbackMessage('failed', 'Σφάλμα διαμόρφωσης. Η φόρμα δεν μπορεί να υποβληθεί.');
49            return;
50        }
51
52        const submitBtn = form.querySelector('button[type="submit"]');
53        const messageDiv = form.querySelector('.message');
54        let isValid = true;
55
56        // --- Start Validation ---
57
58        // General required fields
59        const requiredFields = form.querySelectorAll('input[required], textarea[required], input[placeholder*="*"], textarea[placeholder*="*"]');
60
61        requiredFields.forEach(function(field) {
62            const value = field.value.trim();
63            const column = field.closest('.column');
64            const errorMsg = column ? column.querySelector('.validation-error') : null;
65
66            if (value === '') {
67                if (errorMsg) errorMsg.classList.remove('hidden');
68                isValid = false;
69            } else {
70                if (errorMsg) errorMsg.classList.add('hidden');
71            }
72        });
73
74        // Special validation for email format
75        const emailField = form.querySelector('#email');
76        if (emailField) {
77            const emailValue = emailField.value.trim();
78            const emailColumn = emailField.closest('.column');
79            const emailError = emailColumn ? emailColumn.querySelector('.validation-error') : null;
80
81            if (emailError) {
82                if (emailValue === '') {
83                    emailError.textContent = 'Το πεδίο είναι υποχρεωτικό';
84                    emailError.classList.remove('hidden');
85                    isValid = false;
86                } else if (!isValidEmail(emailValue)) {
87                    emailError.textContent = 'Παρακαλώ εισάγετε έγκυρο email';
88                    emailError.classList.remove('hidden');
89                    isValid = false;
90                } else {
91                    emailError.classList.add('hidden');
92                }
93            } else if (emailValue === '' || !isValidEmail(emailValue)) {
94                // Fallback if error message element isn't found
95                isValid = false;
96            }
97        }
98        // --- End Validation ---
99
100        if (!isValid) {
101            return false;
102        }
103
104        submitBtn.disabled = true;
105        submitBtn.textContent = 'Αποστολή...';
106        if (messageDiv) {
107            messageDiv.style.display = 'none';
108        }
109
110        /**
111         * Handles the actual form submission via fetch.
112         * @param {string} token - The reCAPTCHA token (can be empty).
113         */
114        function submitForm(token) {
115            // We use URLSearchParams to format the data like a standard form submission,
116            // which is what jQuery.ajax does by default.
117            const formData = new URLSearchParams();
118            formData.append('action', 'submit_contact_form');
119            formData.append('nonce', pcfData.nonce);
120            formData.append('fullname', form.querySelector('#fullname') ? form.querySelector('#fullname').value : '');
121            formData.append('email', form.querySelector('#email') ? form.querySelector('#email').value : '');
122            formData.append('phone', form.querySelector('#phone') ? form.querySelector('#phone').value : '');
123            formData.append('info', form.querySelector('#info') ? form.querySelector('#info').value : '');
124            formData.append('message', form.querySelector('#message') ? form.querySelector('#message').value : '');
125            formData.append('recaptcha_token', token);
126
127            fetch(pcfData.ajaxurl, {
128                method: 'POST',
129                headers: {
130                    'Content-Type': 'application/x-www-form-urlencoded',
131                },
132                body: formData,
133            })
134                .then(response => {
135                    if (!response.ok) {
136                        // Throw an error to be caught by the .catch block
137                        throw new Error('Network response was not ok: ' +  response.statusText);
138                    }
139                    return response.json(); // Assuming the server responds with JSON
140                })
141                .then(data => {
142                    // WordPress AJAX sends { success: true, ... } or { success: false, ... }
143                    if (data.success) {
144                        displayFormFeedbackMessage('success', 'Το μήνυμα σας υποβλήθηκε με επιτυχια.');
145                        form.reset(); // Optionally reset the form on success
146                    } else {
147                        console.log('error', data);
148                        displayFormFeedbackMessage('failed', 'Παρουσιάστηκε σφάλμα. Παρακαλώ δοκιμάστε ξανά.');
149                    }
150                })
151                .catch(error => {
152                    console.log('error', error);
153                    displayFormFeedbackMessage('failed', 'Παρουσιάστηκε σφάλμα. Παρακαλώ δοκιμάστε ξανά.');
154                })
155                .finally(() => {
156                    // This runs whether the fetch succeeded or failed
157                    submitBtn.disabled = false;
158                    submitBtn.textContent = 'Υποβολή';
159                });
160        }
161
162        // --- reCAPTCHA Execution ---
163        // Check if grecaptcha is defined and a site key is provided
164        // We already know pcfData exists from the check at the start of the submit handler.
165        if (typeof grecaptcha !== 'undefined' && grecaptcha.execute && pcfData.siteKey) {
166            grecaptcha.ready(function() {
167                grecaptcha.execute(pcfData.siteKey, { action: 'submit' })
168                    .then(function(token) {
169                        console.log('reCAPTCHA token generated:', token);
170                        submitForm(token);
171                    })
172                    .catch(function(error) {
173                    console.error('reCAPTCHA error:', error);
174                    displayFormFeedbackMessage('failed', 'reCAPTCHA error. Παρακαλώ δοκιμάστε ξανά.');
175                    submitBtn.disabled = false;
176                    submitBtn.textContent = 'Υποβολή';
177                });
178            });
179        } else {
180            console.log('reCAPTCHA not configured. Submitting without token.');
181            console.log('grecaptcha defined:', typeof grecaptcha !== 'undefined');
182            console.log('siteKey:', pcfData.siteKey);
183            submitForm('');
184        }
185    });
186});
187

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.