// === SCROLL MENU === const pageLink = document.querySelectorAll('.menu-scroll'); pageLink.forEach((elem) => { elem.addEventListener('click', (e) => { e.preventDefault(); document.querySelector(elem.getAttribute('href')).scrollIntoView({ behavior: 'smooth', offsetTop: 1 - 60, }); }); }); // section menu active function onScroll(event) { const sections = document.querySelectorAll('.menu-scroll'); const scrollPos = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop; for (let i = 0; i < sections.length; i++) { const currLink = sections[i]; const val = currLink.getAttribute('href'); const refElement = document.querySelector(val); const scrollTopMinus = scrollPos + 73; if (refElement.offsetTop <= scrollTopMinus && refElement.offsetTop + refElement.offsetHeight > scrollTopMinus) { document.querySelector('.menu-scroll').classList.remove('active'); currLink.classList.add('active'); } else { currLink.classList.remove('active'); } } } window.document.addEventListener('scroll', onScroll); // === FOOTER DYNAMIC === // Sélectionnez le footer par son ID const footer = document.getElementById('leFooter'); // Fonction pour positionner le footer en bas de la page function positionFooter() { const windowHeight = window.innerHeight; const bodyHeight = document.body.clientHeight; const footerHeight = footer.clientHeight; if (bodyHeight < windowHeight) { footer.style.position = 'absolute'; footer.style.bottom = '0'; } else { footer.style.position = 'static'; } } // Appelez la fonction lors du chargement de la page et lorsque la fenêtre est redimensionnée window.addEventListener('load', positionFooter); window.addEventListener('resize', positionFooter); // === MODE SOMBRE +> LOCAL STORAGE === // Fonction pour lire la valeur du thème depuis localStorage function getThemeLocalStorage() { return localStorage.getItem('theme'); } // Fonction pour définir le thème dans localStorage function setThemeLocalStorage(theme) { localStorage.setItem('theme', theme); } // Fonction pour mettre à jour la classe sur le en fonction du thème function updateThemeClass() { const darkTogglerCheckbox = document.querySelector('#darkToggler'); const html = document.querySelector('html'); const theme = getThemeLocalStorage(); // Appliquer la classe en fonction de la valeur de localStorage if (theme === 'dark') { darkTogglerCheckbox.checked = true; html.classList.add('dark'); } else { darkTogglerCheckbox.checked = false; html.classList.remove('dark'); } } // Appeler la fonction d'initialisation de la gestion du thème updateThemeClass(); // Gérer le changement de thème lorsque l'utilisateur clique sur la case à cocher const darkTogglerCheckbox = document.querySelector('#darkToggler'); darkTogglerCheckbox.addEventListener('click', function () { if (darkTogglerCheckbox.checked) { setThemeLocalStorage('dark'); } else { setThemeLocalStorage('light'); } }); // === ENVOIE FORMULAIRE AVEC AJAX === // Attendre que le document soit prêt $(document).ready(function () { // Sélectionnez le formulaire de COMPARAISON par son ID $('#formulaire-comp').submit(function (e) { // Fait scroll une fois le formulaire envoyé $(document).ready(function () { // Sélectionnez le lien par son ID $('html, body').animate({ scrollTop: $('#resultat').offset().top }, 1000); // 1000 millisecondes (1 seconde) pour l'animation }); // Empêchez la soumission normale du formulaire e.preventDefault(); // Affiche le chargement $('#loading').removeClass('hidden'); $('#articleIntrouvable').addClass('hidden'); $('#articleContainer1').addClass('hidden'); $('#articleContainer2').addClass('hidden'); // Reste du code pour gérer la soumission du formulaire //console.log('Formulaire soumis !'); // Récupérez les valeurs des champs du formulaire const articleTitle1 = $('#articleTitle1').val(); const articleTitle2 = $('#articleTitle2').val(); // Créez un objet JavaScript avec les données à envoyer au serveur const formData = { articleTitle1: articleTitle1, articleTitle2: articleTitle2 }; // Utilisez AJAX pour envoyer les données au serveur $.ajax({ type: 'POST', url: '/search', data: formData, dataType: 'json', success: function (response) { console.log(response); $('#loading').addClass('hidden'); $('#articleIntrouvable').removeClass('hidden'); // Mettez à jour la section HTML avec les données reçues ici // Vérifiez si response.articleInfo1 existe et contient les informations nécessaires if (response.articleInfo1) { $('#articleInfo1Title').html(response.articleInfo1.title); // Article 1 $('#articleInfo1Title').html(response.articleInfo1.title); $('#articleInfo1url').attr('href', response.articleInfo1.url); $('#articleInfo1extract').html(response.articleInfo1.extract); $('#articleInfo1lastEdit').html(response.articleInfo1.lastEdit); $('#articleInfo1numRevisions').html(response.articleInfo1.numRevisions); $('#articleInfo1pageSize').html(response.articleInfo1.pageSize); $('#articleInfo1firstRevisionUser').html(response.articleInfo1.firstRevisionUser); $('#articleInfo1latestRevisionId').html(response.articleInfo1.latestRevisionId); $('#articleInfo1pageId').html(response.articleInfo1.pageId); $('#articleInfo1latestVersion').html(response.articleInfo1.latestVersion); $('#articleInfo1wordCount').html(response.articleInfo1.wordCount); $('#articleInfo1charCount').html(response.articleInfo1.charCount); $('#articleInfo1lastContributor').html(response.articleInfo1.lastContributor); $('#articleInfo1image').attr('href', response.articleInfo1.image); $('#articleInfo1image img').attr('src', response.articleInfo1.image); // Récupérez la valeur de l'image const articleInfo1ImageValue = response.articleInfo1.image; // Récupérez l'élément image par son ID const articleInfo1Image = document.getElementById("articleInfo1image"); if (articleInfo1ImageValue === "Non disponible") { // Si la valeur est "Non disponible", masquez l'élément articleInfo1Image.style.display = "none"; } else { // Sinon, affichez l'élément articleInfo1Image.style.display = "block"; // Vous pouvez utiliser "inline" si nécessaire // Assurez-vous de définir la source de l'image ici en fonction de votre logique articleInfo1Image.src = articleInfo1ImageValue; } const infoboxContainer1 = document.getElementById("infoboxcontainer1"); // Supprimer le contenu précédent de l'infobox while (infoboxContainer1.firstChild) { infoboxContainer1.removeChild(infoboxContainer1.firstChild); } // Ajouter les nouvelles informations pour articleInfo1 const infoboxData1 = response.articleInfo1.infobox; Object.entries(infoboxData1).forEach(([key, value]) => { const ligne = document.createElement("tr"); ligne.innerHTML = `${key} ${value}`; infoboxContainer1.appendChild(ligne); }); } else { // Traitez le cas où response.articleInfo1 n'existe pas } // Vérifiez si response.articleInfo2 existe et contient les informations nécessaires if (response.articleInfo2) { $('#articleInfo2Title').html(response.articleInfo2.title); // Article 2 $('#articleInfo2Title').html(response.articleInfo2.title); $('#articleInfo2url').attr('href', response.articleInfo2.url); $('#articleInfo2extract').html(response.articleInfo2.extract); $('#articleInfo2lastEdit').html(response.articleInfo2.lastEdit); $('#articleInfo2numRevisions').html(response.articleInfo2.numRevisions); $('#articleInfo2pageSize').html(response.articleInfo2.pageSize); $('#articleInfo2firstRevisionUser').html(response.articleInfo2.firstRevisionUser); $('#articleInfo2latestRevisionId').html(response.articleInfo2.latestRevisionId); $('#articleInfo2pageId').html(response.articleInfo2.pageId); $('#articleInfo2latestVersion').html(response.articleInfo2.latestVersion); $('#articleInfo2wordCount').html(response.articleInfo2.wordCount); $('#articleInfo2charCount').html(response.articleInfo2.charCount); $('#articleInfo2lastContributor').html(response.articleInfo2.lastContributor); $('#articleInfo2image').attr('href', response.articleInfo2.image); $('#articleInfo2image img').attr('src', response.articleInfo2.image); // Récupérez la valeur de l'image const articleInfo2ImageValue = response.articleInfo2.image; // Récupérez l'élément image par son ID const articleInfo2Image = document.getElementById("articleInfo2image"); if (articleInfo2ImageValue === "Non disponible") { // Si la valeur est "Non disponible", masquez l'élément articleInfo2Image.style.display = "none"; } else { // Sinon, affichez l'élément articleInfo2Image.style.display = "block"; // Vous pouvez utiliser "inline" si nécessaire // Assurez-vous de définir la source de l'image ici en fonction de votre logique articleInfo2Image.src = articleInfo2ImageValue; } const infoboxContainer2 = document.getElementById("infoboxcontainer2"); // Supprimer le contenu précédent de l'infobox while (infoboxContainer2.firstChild) { infoboxContainer2.removeChild(infoboxContainer2.firstChild); } // Ajouter les nouvelles informations pour articleInfo2 const infoboxData2 = response.articleInfo2.infobox; Object.entries(infoboxData2).forEach(([key, value]) => { const ligne = document.createElement("tr"); ligne.innerHTML = `${key} ${value}`; infoboxContainer2.appendChild(ligne); }); } else { // Traitez le cas où response.articleInfo2 n'existe pas } // Vérifiez si toutes les informations nécessaires sont disponibles const allInfoAvailable = checkIfAllInfoAvailable(response); if (allInfoAvailable) { $('#articleContainer1').removeClass('hidden'); $('#articleContainer2').removeClass('hidden'); $('#articleIntrouvable').addClass('hidden'); $(document).ready(function () { // Sélectionnez le lien par son ID $('html, body').animate({ scrollTop: $('#resultat').offset().top }, 1000); // 1000 millisecondes (1 seconde) pour l'animation }); } else { // Traitez le cas où certaines informations ne sont pas disponibles const articleIntrouvable = document.getElementById("articleIntrouvable"); let errorMessage = ""; if (!response.articleInfo1 && !response.articleInfo2) { errorMessage += "Les articles " + '' + articleTitle1 + " et " + '' + articleTitle2 + " sont introuvables."; } else { if (!response.articleInfo1) { errorMessage += "L'article " + '' + articleTitle1 + " est introuvable."; } if (!response.articleInfo2) { errorMessage += "L'article " + '' + articleTitle2 + " est introuvable."; } } articleIntrouvable.innerHTML = errorMessage; } }, error: function (error) { console.error('Erreur lors de la recherche d\'informations sur les articles :', error); // Ajoutez une console.log pour vérifier si cette partie du code est exécutée console.log('Erreur AJAX'); // Sélectionnez le div d'erreur par son ID const articleIntrouvable = document.getElementById("articleIntrouvable"); // Mettez à jour le contenu du div avec un message d'erreur articleIntrouvable.textContent = "Aucun article n'a été trouvé."; // Assurez-vous de masquer les conteneurs d'articles $('#articleContainer1').addClass('hidden'); $('#articleContainer2').addClass('hidden'); } }); }); // Sélectionnez le formulaire d'INSCRIPTION par son ID $('#formulaire-connexion').submit(function (e) { // Empêchez la soumission normale du formulaire e.preventDefault(); // Reste du code pour gérer la soumission du formulaire //console.log('Formulaire soumis !'); // Récupérez les valeurs des champs du formulaire const email = $('#email').val(); const password = $('#password').val(); // Créez un objet JavaScript avec les données à envoyer au serveur const formData = { email: email, password: password }; // Utilisez AJAX pour envoyer les données au serveur $.ajax({ type: 'POST', url: '/connexion', data: formData, dataType: 'json', success: function (response) { console.log(response); // Mettez à jour la section HTML avec les données reçues ici }, error: function (error) { console.error('Erreur lors de la connexion :', error); // Ajoutez une console.log pour vérifier si cette partie du code est exécutée console.log('Erreur AJAX'); } }); }); // Sélectionnez le formulaire de CONNEXION par son ID $('#formulaire-inscription').submit(function (e) { // Empêchez la soumission normale du formulaire e.preventDefault(); // Reste du code pour gérer la soumission du formulaire //console.log('Formulaire soumis !'); // Récupérez les valeurs des champs du formulaire const name = $('#name').val(); const email = $('#email').val(); const password = $('#password').val(); // Créez un objet JavaScript avec les données à envoyer au serveur const formData = { name: name, email: email, password: password }; // Utilisez AJAX pour envoyer les données au serveur $.ajax({ type: 'POST', url: '/inscription', data: formData, dataType: 'json', success: function (response) { console.log(response); // Mettez à jour la section HTML avec les données reçues ici // Rediriger l'utilisateur vers la page de connexion window.location.href = "/connexion"; }, error: function (error) { console.error('Erreur lors de la connexion :', error); // Ajoutez une console.log pour vérifier si cette partie du code est exécutée console.log('Erreur AJAX'); } }); }); // Sélectionnez le formulaire de CONNEXION par son ID $('#formulaire-inscription').submit(function (e) { // Empêchez la soumission normale du formulaire e.preventDefault(); // Reste du code pour gérer la soumission du formulaire //console.log('Formulaire soumis !'); // Récupérez les valeurs des champs du formulaire const name = $('#name').val(); const email = $('#email').val(); const password = $('#password').val(); // Créez un objet JavaScript avec les données à envoyer au serveur const formData = { name: name, email: email, password: password }; // Utilisez AJAX pour envoyer les données au serveur $.ajax({ type: 'GET', url: '/connexion', data: formData, dataType: 'json', success: function (response) { console.log(response); // Vérifiez si la réponse contient le token (utilisez la clé appropriée) if (response.token) { // Récupérez le token de la réponse JSON const token = response.token; console.log(token); // Définissez le cookie avec un chemin approprié // Par exemple, le chemin '/' signifie que le cookie est valide pour tout le site document.cookie = `token=${token}`; } else { console.error('Token non trouvé dans la réponse JSON.'); } // Mettez à jour la section HTML avec les données reçues ici }, error: function (error) { console.error('Erreur :', error); // Ajoutez une console.log pour vérifier si cette partie du code est exécutée console.log('Erreur AJAX'); } }); }); }); function checkIfAllInfoAvailable(response) { // Vérifiez si response.articleInfo1 contient toutes les informations nécessaires const articleInfo1 = response.articleInfo1; if (!articleInfo1) { return false; // Si articleInfo1 est absent, retournez false } // Ajoutez ici des vérifications spécifiques pour les propriétés nécessaires dans articleInfo1 if (!articleInfo1.title || !articleInfo1.url || !articleInfo1.extract || !articleInfo1.lastEdit) { return false; // Si l'une des propriétés nécessaires est absente, retournez false } // Vérifiez si response.articleInfo2 contient toutes les informations nécessaires const articleInfo2 = response.articleInfo2; if (!articleInfo2) { return false; // Si articleInfo2 est absent, retournez false } // Ajoutez ici des vérifications spécifiques pour les propriétés nécessaires dans articleInfo2 if (!articleInfo2.title || !articleInfo2.url || !articleInfo2.extract || !articleInfo2.lastEdit) { return false; // Si l'une des propriétés nécessaires est absente, retournez false } // Si toutes les vérifications sont passées, cela signifie que toutes les informations nécessaires sont disponibles return true; } // === SMOOTH SCROLL ~(^^)~ // Fait scroll jusqu'au formulaire de comparaison $(document).ready(function () { // Sélectionnez le lien par son ID $('#letzgooo').click(function (e) { e.preventDefault(); // Empêchez le comportement de clic par défaut $('html, body').animate({ scrollTop: $('#comparaison').offset().top }, 1000); // 1000 millisecondes (1 seconde) pour l'animation }); }); // === BANNIERE LES COOKIES === var config = { "primaryColor": "#4A6CF7", "darkColor": "#3b3e4a", "lightColor": "#ffffff", "themeMode": "dark", "showSettingsBtn": false, "showCloseIcon": false, "showDeclineBtn": true, "fullWidth": false, "displayPosition": "left", "settingsBtnLabel": "Customize", "delay": 1400, "expires": 365, "title": "Acceptez nos délicieux cookies !", "description": "Nous utilisons des cookies pour améliorer votre expérience sur notre site web. En continuant à naviguer, vous acceptez notre utilisation de cookies. Découvrez comment nous utilisons les cookies dans notre politique de confidentialité.", "acceptBtnLabel": "Accepter", "declineInfoBtnLabel": "Refuser", "moreInfoBtnLink": "/privacy-policy/", "moreInfoBtnLabel": "Politique de Confidentialité", }; function appendScriptInHead(e) { headerScripts.forEach(function (c) { c.type === e && $("head").append(c.value); }); } var injectScripts = function () { "undefined" != typeof headerScripts && (cookieBanner.isPreferenceAccepted("analytics") === !0 && appendScriptInHead("analytics"), cookieBanner.isPreferenceAccepted("marketing") === !0 && appendScriptInHead("marketing"), cookieBanner.isPreferenceAccepted("preferences") === !0 && appendScriptInHead("preferences")); }; !function (e) { var c = this e.fn.cookieBanner = function () { e(":root").css("--cookieBannerLight", config.lightColor), e(":root").css("--cookieBannerDark", config.darkColor) var c = i("cookieConsent") // Bloquer le scroll document.body.style.overflow = 'hidden'; if (c) injectScripts() else { e("#cookieBanner").remove() var n = '
  • " e.each(config.cookieTypes, function (e, c) { if ("" !== c.type && "" !== c.value) { var i = "" c.description !== !1 && (i = ' title="' + c.description + '"'), n += '
  • " } }) var p = '
    ' + s + '
    ' + a + "

    " + config.title + '

    ' + config.description + ' ' + config.moreInfoBtnLabel + '

    ' + l + config.settingsBtnLabel + '
    " setTimeout(function () { e("body").append(p), e("#cookieBanner").hide().fadeIn("slow"), config.showSettingsBtn || e("#cookieSettings").hide(), config.showDeclineBtn || e("#cookieReject").hide(), config.showCloseIcon || e("#closeIcon").hide(); // Gestionnaire d'événement pour le bouton "Accepter" e("body").on("click", "#cookieAccept", function () { r(!0, config.expires); e(".cookieBlur").fadeOut("fast", function () { e(this).remove(); }); // Réactiver le défillement document.body.style.overflow = 'auto'; var CookieBannerEnd = document.getElementById("cookieBlur"); CookieBannerEnd.id = ""; // Enregistrez un indicateur dans le stockage local localStorage.setItem("EndOfCookieBanner", "true"); e("#cookieBlur").css("opacity", 0); }); // Gestionnaire d'événement pour le bouton "Refuser" e("body").on("click", "#cookieReject", function () { r(!1, config.expires); e(".cookieBlur").fadeOut("fast", function () { e(this).remove(); }); // Réactiver le défillement document.body.style.overflow = 'auto'; var CookieBannerEnd = document.getElementById("cookieBlur"); CookieBannerEnd.id = ""; // Enregistrez un indicateur dans le stockage local localStorage.setItem("EndOfCookieBanner", "true"); e("#cookieBlur").css("opacity", 0); }); }, config.delay); e("body").on("click", "#cookieAccept", function () { r(!0, config.expires), e('input[name="gdprPrefItem"][data-compulsory="on"]').prop("checked", !0) var c = [] e.each(e('input[name="gdprPrefItem"]').serializeArray(), function (e, i) { c.push(i.value) }), t("cookieConsentPrefs", encodeURIComponent(JSON.stringify(c)), { expires: o(365), path: "/" }), injectScripts() }), e("body").on("click", "#cookieSettings", function () { e('input[name="gdprPrefItem"]:not(:disabled)').attr("data-compulsory", "off").prop("checked", !0), e("#cookieTypes").toggle("fast", function () { e("#cookieSettings").prop("disabled", !1) }) }), e("body").on("click", "#closeIcon", function () { e("#cookieBanner").remove() }), e("body").on("click", "#cookieReject", function () { r(!1, config.expires), t("cookieConsentPrefs", "", { expires: o(-365), path: "/" }) }) } } var i = function (e) { return document.cookie.indexOf(e) > -1 ? !0 : !1 }, r = function (i, r) { t("cookieConsent", i, { expires: o(r), path: "/" }), e("#cookieBanner").fadeOut("fast", function () { e(c).remove() }) }, t = function (e, c) { var i = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {} document.cookie = "".concat(e, "=").concat(c).concat(Object.keys(i).reduce(function (e, c) { return e + ";".concat(c.replace(/([A-Z])/g, function (e) { return "-" + e.toLowerCase() }), "=").concat(i[c]) }, "")) }, o = function (e) { var c = new Date return c.setTime(c.getTime() + 24 * e * 60 * 60 * 1e3), c.toUTCString() }, n = function (e) { var c = document.cookie.split(";").reduce(function (e, c) { var i = c.split("=").map(function (e) { return e.trim() }), r = _slicedToArray(i, 2), t = r[0], o = r[1] return t && o && (e[t] = decodeURIComponent(o)), e }, {}) return e ? c[e] || !1 : c }, l = '', a = ' ', s = '' return window.cookieBanner = { init: function () { e.fn.cookieBanner() }, isAccepted: function () { var e = n("cookieConsent") return JSON.parse(e) }, getPreferences: function () { var e = n("cookieConsentPrefs") return JSON.parse(e) }, isPreferenceAccepted: function (e) { var c = n("cookieConsent"), i = n("cookieConsentPrefs") return i = JSON.parse(i), c === !1 ? !1 : i === !1 || -1 === i.indexOf(e) ? !1 : !0 } } }(jQuery) // Lorsque la page se charge, vérifier le stockage local $(document).ready(function () { var CookieBannerEnd = document.getElementById("cookieBlur"); if (localStorage.getItem("EndOfCookieBanner") === "true") { CookieBannerEnd.id = ""; // Pour réactiver le défilement document.body.style.overflow = 'auto'; } });