Files
HexaHost-Web-Prod/public/assets/js/contact.js

240 lines
9.3 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
(function () {
"use strict";
function initFaqAccordion() {
const faqItems = document.querySelectorAll(".faq-item");
faqItems.forEach(faqItem => {
const faqQuestion = faqItem.querySelector(".faq-question");
const faqAnswer = faqItem.querySelector(".faq-answer");
const faqToggle = faqItem.querySelector(".faq-toggle");
faqQuestion.addEventListener("click", function () {
const isOpen = faqItem.classList.contains("open");
faqItems.forEach(otherItem => {
if (otherItem !== faqItem) {
otherItem.classList.remove("open");
const otherAnswer = otherItem.querySelector(".faq-answer");
const otherToggle = otherItem.querySelector(".faq-toggle");
otherAnswer.style.maxHeight = null;
otherToggle.textContent = "+";
}
});
if (isOpen) {
faqItem.classList.remove("open");
faqAnswer.style.maxHeight = null;
faqToggle.textContent = "+";
} else {
faqItem.classList.add("open");
faqAnswer.style.maxHeight = faqAnswer.scrollHeight + "px";
faqToggle.textContent = "";
}
});
});
}
function initContactForm() {
const contactForm = document.getElementById("contactForm");
if (!contactForm) {
return;
}
contactForm.addEventListener("submit", function (submitEvent) {
submitEvent.preventDefault();
const formData = new FormData(contactForm);
const payload = {};
for (let [key, value] of formData.entries()) {
payload[key] = value;
}
if (!validateFormData(payload)) {
return;
}
const submitButton = contactForm.querySelector("button[type=\"submit\"]");
const originalButtonText = submitButton.textContent;
submitButton.textContent = "Wird gesendet...";
submitButton.disabled = true;
const requestOptions = {
method: "POST",
body: formData
};
fetch("contact-handler.php", requestOptions).then(response => response.json()).then(result => {
submitButton.textContent = originalButtonText;
submitButton.disabled = false;
if (result.success) {
contactForm.reset();
showNotification(result.message, "success");
window.scrollTo({
top: 0,
behavior: "smooth"
});
} else {
showNotification(result.message, "error");
if (result.missing_fields) {
result.missing_fields.forEach(missingFieldId => {
const missingField = document.getElementById(missingFieldId);
if (missingField) {
missingField.style.borderColor = "#ff4d6d";
setTimeout(() => {
missingField.style.borderColor = "";
}, 3000);
}
});
}
}
}).catch(error => {
console.error("Error:", error);
showNotification("Ein Fehler ist aufgetreten. Bitte versuchen Sie es später erneut.", "error");
submitButton.textContent = originalButtonText;
submitButton.disabled = false;
});
});
}
function validateFormData(formValues) {
const requiredKeys = ["firstName", "lastName", "email", "subject", "message"];
const errors = [];
requiredKeys.forEach(fieldName => {
if (!formValues[fieldName] || formValues[fieldName].trim() === "") {
errors.push("Das Feld \"" + getFieldLabel(fieldName) + "\" ist erforderlich.");
}
});
if (formValues.email && !isValidEmail(formValues.email)) {
errors.push("Bitte geben Sie eine gültige E-Mail-Adresse ein.");
}
if (!formValues.privacy) {
errors.push("Sie müssen der Datenschutzerklärung zustimmen.");
}
if (errors.length > 0) {
showNotification(errors.join("\n"), "error");
return false;
}
return true;
}
function getFieldLabel(keyName) {
const fieldLabels = {
firstName: "Vorname",
lastName: "Nachname",
email: "E-Mail-Adresse",
subject: "Betreff",
message: "Nachricht"
};
return fieldLabels[keyName] || keyName;
}
function isValidEmail(email) {
const emailPattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
return emailPattern.test(email);
}
function showNotification(message, type = "info") {
if (window.HexaHost && window.HexaHost.showNotification) {
window.HexaHost.showNotification(message, type);
} else {
alert(message);
}
}
window.openLiveChat = function () {
showNotification("Live Chat wird geöffnet... (Demo-Funktion)", "info");
};
function prefillFromQueryParams() {
const queryParams = new URLSearchParams(window.location.search);
const packageParam = queryParams.get("package");
const productParam = queryParams.get("product");
if (packageParam || productParam) {
const subjectField = document.getElementById("subject");
const messageField = document.getElementById("message");
if (packageParam) {
const packageLabels = {
"vpc-starter": "Virtual Private Container - Starter Paket",
"vpc-business": "Virtual Private Container - Business Paket",
"vpc-professional": "Virtual Private Container - Professional Paket",
"vpc-enterprise": "Virtual Private Container - Enterprise Paket",
"vps-basic": "Virtual Private Server - Basic Paket",
"vps-standard": "Virtual Private Server - Standard Paket",
"vps-premium": "Virtual Private Server - Premium Paket",
"vps-enterprise": "Virtual Private Server - Enterprise Paket",
"mail-starter": "Mail Gateway - Starter Paket",
"mail-business": "Mail Gateway - Business Paket",
"mail-professional": "Mail Gateway - Professional Paket",
"mail-enterprise": "Mail Gateway - Enterprise Paket",
"web-starter": "Webhosting - Starter Paket",
"web-business": "Webhosting - Business Paket",
"web-professional": "Webhosting - Professional Paket",
"web-enterprise": "Webhosting - Enterprise Paket"
};
if (packageLabels[packageParam]) {
messageField.value = "Hallo,\n\nich interessiere mich für das " + packageLabels[packageParam] + ".\n\nBitte senden Sie mir weitere Informationen und ein individuelles Angebot.\n\nVielen Dank!";
if (packageParam.startsWith("vpc-")) {
subjectField.value = "vpc-anfrage";
} else if (packageParam.startsWith("vps-")) {
subjectField.value = "vps-anfrage";
} else if (packageParam.startsWith("mail-")) {
subjectField.value = "mail-gateway-anfrage";
} else if (packageParam.startsWith("web-")) {
subjectField.value = "webhosting-anfrage";
}
}
} else if (productParam) {
const productSubjects = {
vpc: "vpc-anfrage",
vps: "vps-anfrage",
"mail-gateway": "mail-gateway-anfrage",
webhosting: "webhosting-anfrage"
};
if (productSubjects[productParam]) {
subjectField.value = productSubjects[productParam];
messageField.value = "Hallo,\n\nich interessiere mich für Ihre " + productParam.replace("-", " ") + " Lösungen.\n\nBitte kontaktieren Sie mich für eine persönliche Beratung.\n\nVielen Dank!";
}
}
}
}
function initFieldUiEnhancements() {
const inputElements = document.querySelectorAll("input, select, textarea");
inputElements.forEach(inputEl => {
inputEl.addEventListener("focus", function () {
this.parentElement.classList.add("focused");
});
inputEl.addEventListener("blur", function () {
if (!this.value) {
this.parentElement.classList.remove("focused");
}
});
if (inputEl.value) {
inputEl.parentElement.classList.add("focused");
}
});
const phoneInput = document.getElementById("phone");
if (phoneInput) {
phoneInput.addEventListener("input", function () {
let digitsOnly = this.value.replace(/\D/g, "");
if (digitsOnly.startsWith("49")) {
digitsOnly = "+" + digitsOnly;
} else if (digitsOnly.startsWith("0")) {
digitsOnly = "+49" + digitsOnly.substring(1);
}
this.value = digitsOnly;
});
}
}
function initAccessibility() {
const requiredInputs = document.querySelectorAll("input[required], select[required], textarea[required]");
requiredInputs.forEach(requiredInput => {
requiredInput.setAttribute("aria-required", "true");
});
const faqQuestions = document.querySelectorAll(".faq-question");
faqQuestions.forEach(questionEl => {
questionEl.setAttribute("tabindex", "0");
questionEl.setAttribute("role", "button");
questionEl.setAttribute("aria-expanded", "false");
questionEl.addEventListener("keydown", function (keyboardEvent) {
if (keyboardEvent.key === "Enter" || keyboardEvent.key === " ") {
keyboardEvent.preventDefault();
this.click();
}
});
});
}
document.addEventListener("DOMContentLoaded", function () {
initFaqAccordion();
initContactForm();
prefillFromQueryParams();
initFieldUiEnhancements();
initAccessibility();
setTimeout(() => {
showNotification("💬 Haben Sie Fragen? Wir helfen gerne!", "info");
}, 2000);
});
})();