/** * French Stream - Scripts principaux * Ce fichier contient tous les scripts JavaScript du site */ // Attendre que le DOM soit complètement chargé document.addEventListener('DOMContentLoaded', function() { // === MODAL DE CONNEXION === initLoginModal(); // === FILTRAGE FILMS/SÉRIES === initContentFiltering(); // === FAVORIS === initFavorites(); // === LAZY LOADING === initLazyLoading(); // === BOUTON DE CONNEXION ANIMÉ === initLoginButton(); }); /** * Initialisation du modal de connexion */ function initLoginModal() { // Fonction pour basculer l'affichage du modal window.toggleLoginModal = function() { const modal = document.getElementById('loginModal'); if (!modal) return; if (modal.classList.contains('modal-show')) { modal.classList.remove('modal-show'); setTimeout(() => { modal.style.display = 'none'; }, 300); } else { modal.style.display = 'block'; setTimeout(() => { modal.classList.add('modal-show'); }, 10); } }; // Gestion du formulaire de connexion window.handleLogin = function(event) { event.preventDefault(); const loader = document.getElementById('loginLoader'); if (loader) { loader.style.display = 'flex'; } setTimeout(() => { event.target.submit(); }, 1500); return false; }; // Fermeture du modal en cliquant en dehors window.onclick = function(event) { const modal = document.getElementById('loginModal'); if (modal && event.target == modal) { toggleLoginModal(); } }; } /** * Initialisation du filtrage de contenu (films/séries) */ function initContentFiltering() { // Détection des types de contenu const fiches = document.querySelectorAll(".short"); fiches.forEach(function(fiche) { let isSerie = false; let isFilm = false; // Vérification des badges const badges = fiche.querySelectorAll(".badge"); badges.forEach(function(badge) { const badgeText = badge.textContent.toLowerCase(); if (badgeText.includes("saison") || badgeText.match(/\d+/)) { isSerie = true; } if (badgeText.includes("film") || badgeText.includes("vostfr")) { isFilm = true; } }); // Vérification des liens const links = fiche.querySelectorAll("a"); links.forEach(function(link) { const href = link.getAttribute("href") ? link.getAttribute("href").toLowerCase() : ''; if (href.includes("saison") || href.includes("episode")) { isSerie = true; } if (href.includes("film")) { isFilm = true; } }); // Ajout de la classe appropriée if (isSerie) { fiche.classList.add("serie"); } else if (isFilm) { fiche.classList.add("film"); } }); // Sélection du bouton par défaut const showAllBtn = document.getElementById("showAll"); if (showAllBtn) { showAllBtn.classList.add("selected-button"); } // Fonction de filtrage window.filterContent = function(type) { const allFiches = document.querySelectorAll(".short"); // Mise à jour des boutons document.querySelectorAll("button").forEach(function(button) { button.classList.remove("selected-button"); }); if (type === 'film') { const filmBtn = document.getElementById("showFilms"); if (filmBtn) filmBtn.classList.add("selected-button"); } else if (type === 'serie') { const serieBtn = document.getElementById("showSeries"); if (serieBtn) serieBtn.classList.add("selected-button"); } else { const allBtn = document.getElementById("showAll"); if (allBtn) allBtn.classList.add("selected-button"); } // Filtrage des fiches allFiches.forEach(function(fiche) { fiche.style.display = "block"; if (type === 'film' && !fiche.classList.contains("film")) { fiche.style.display = "none"; } else if (type === 'serie' && !fiche.classList.contains("serie")) { fiche.style.display = "none"; } }); }; } /** * Initialisation des favoris */ function initFavorites() { // Chargement des favoris pour les invités const guestFavContainer = document.getElementById('guest-favorites-container'); if (guestFavContainer) { let favorites = localStorage.getItem('dle_guest_favorites') ? JSON.parse(localStorage.getItem('dle_guest_favorites')) : []; if (favorites.length === 0) { guestFavContainer.innerHTML = '

Vous n\'avez pas encore de favoris

'; } else { favorites.reverse(); let html = ''; favorites.forEach(article => { html += `
${article.title}
${article.title}
`; }); guestFavContainer.innerHTML = html; } } // Fonction pour basculer les favoris (utilisateur connecté) window.toggleFavorite = function(id, element) { let favs = JSON.parse(localStorage.getItem('favorites')) || []; if (favs.includes(id)) { favs = favs.filter(item => item !== id); element.className = 'far fa-heart'; element.style.color = 'gray'; element.title = 'Ajouter aux favoris'; } else { favs.push(id); element.className = 'fas fa-heart'; element.style.color = 'orange'; element.title = 'Retirer des favoris'; } localStorage.setItem('favorites', JSON.stringify(favs)); const counter = document.getElementById('fav-count'); if (counter) counter.textContent = favs.length; }; // Fonction pour basculer les favoris (invité) window.toggleGuestFavorite = function(id, title, poster, link, element) { let favs = localStorage.getItem('dle_guest_favorites'); favs = favs ? JSON.parse(favs) : []; const index = favs.findIndex(fav => fav.id === id); if (index === -1) { favs.push({id, title, poster, link}); element.style.color = 'orange'; } else { favs.splice(index, 1); element.style.color = '#fdfdfd'; } localStorage.setItem('dle_guest_favorites', JSON.stringify(favs)); }; // Initialisation des icônes de favoris sur la page actuelle const favs = localStorage.getItem('dle_guest_favorites'); if (favs) { const favorites = JSON.parse(favs); const path = window.location.pathname; const idMatch = path.match(/(\d+)/); if (idMatch && idMatch[0]) { const id = idMatch[0]; const favIcon = document.querySelector(`#fav-${id} i`); if (favorites.find(fav => fav.id === id) && favIcon) { favIcon.style.color = 'orange'; } } } } /** * Initialisation du lazy loading pour les images et blocs */ function initLazyLoading() { if ('IntersectionObserver' in window) { const options = { root: null, rootMargin: '50px 0px', threshold: 0.1 }; const observer = new IntersectionObserver((entries, observer) => { entries.forEach(entry => { if (entry.isIntersecting) { const block = entry.target; block.style.opacity = '1'; block.style.transform = 'translateY(0)'; const lazyImage = block.querySelector('img.lazy'); if (lazyImage) { lazyImage.src = lazyImage.dataset.src; lazyImage.classList.remove('lazy'); } observer.unobserve(block); } }); }, options); document.querySelectorAll('.lazy-block').forEach(block => { block.style.opacity = '0'; block.style.transform = 'translateY(20px)'; block.style.transition = 'opacity 0.3s ease, transform 0.3s ease'; observer.observe(block); }); } else { // Fallback pour les navigateurs ne supportant pas IntersectionObserver document.querySelectorAll('.lazy-block').forEach(block => { block.style.opacity = '1'; const lazyImage = block.querySelector('img.lazy'); if (lazyImage) { lazyImage.src = lazyImage.dataset.src; lazyImage.classList.remove('lazy'); } }); } } /** * Animation du bouton de connexion */ function initLoginButton() { const buttonText = document.getElementById('buttonText'); if (!buttonText) return; const texts = ['CONNEXION', 'INSCRIPTION', 'GRATUITEMENT']; let currentTextIndex = 0; const maxLength = Math.max(...texts.map(text => text.length)); function animateText(newText, flashColor = '#FFA500') { let currentIndex = 0; function changeNextLetter() { if (currentIndex < newText.length) { buttonText.innerHTML = newText.slice(0, currentIndex + 1).padEnd(maxLength, ' ') .split('') .map((char, index) => index === currentIndex ? `${char}` : char ) .join(''); currentIndex++; setTimeout(changeNextLetter, 100); } else { setTimeout(changeText, 2000); } } changeNextLetter(); } function changeText() { currentTextIndex = (currentTextIndex + 1) % texts.length; animateText(texts[currentTextIndex]); } buttonText.style.display = 'inline-block'; buttonText.style.minWidth = `${maxLength * 10}px`; buttonText.style.textAlign = 'center'; animateText(texts[0]); } $(document).ready(function(){ $("body").on("click", "[data-ajaxc]:not(.current)", function() { var $castom = $(this).attr("data-ajaxc"), $targetBox = $(this).closest('.sect').children('.sect-c'); $targetBox.html(''); $.post(dle_root + "engine/ajax/custom.php", { castom: $castom }, function(data) { $targetBox.html(data); }); $(this).addClass('current').siblings().removeClass('current'); }); $(".st-filt").click(function() { $("#filter-wrap").fadeToggle(0); }); }); (function() { function initCustomMobileMenu() { const seriesBtn = document.getElementById('custom-mb-series-btn'); const filmsBtn = document.getElementById('custom-mb-films-btn'); const seriesSubmenu = document.getElementById('custom-mb-series-submenu'); const filmsSubmenu = document.getElementById('custom-mb-films-submenu'); const overlay = document.getElementById('custom-mb-overlay'); const categoriesBtn = document.getElementById('custom-mb-categories-btn'); const categoriesSubmenu = document.getElementById('custom-mb-categories-submenu'); const categoriesBackBtn = document.getElementById('custom-mb-categories-back'); function openSubmenu(button, submenu) { closeAllSubmenus(); button.classList.add('custom-mb-submenu-active'); submenu.classList.add('custom-mb-submenu-visible'); overlay.classList.add('custom-mb-overlay-visible'); } function closeAllSubmenus() { seriesBtn.classList.remove('custom-mb-submenu-active'); filmsBtn.classList.remove('custom-mb-submenu-active'); seriesSubmenu.classList.remove('custom-mb-submenu-visible'); filmsSubmenu.classList.remove('custom-mb-submenu-visible'); categoriesSubmenu.classList.remove('custom-mb-submenu-visible'); overlay.classList.remove('custom-mb-overlay-visible'); } seriesBtn.addEventListener('click', function(e) { e.preventDefault(); if (seriesBtn.classList.contains('custom-mb-submenu-active')) { closeAllSubmenus(); } else { openSubmenu(seriesBtn, seriesSubmenu); } }); filmsBtn.addEventListener('click', function(e) { e.preventDefault(); if (filmsBtn.classList.contains('custom-mb-submenu-active')) { closeAllSubmenus(); } else { openSubmenu(filmsBtn, filmsSubmenu); } }); categoriesBtn.addEventListener('click', function(e) { e.preventDefault(); e.stopPropagation(); seriesSubmenu.classList.remove('custom-mb-submenu-visible'); categoriesSubmenu.classList.add('custom-mb-submenu-visible'); }); categoriesBackBtn.addEventListener('click', function(e) { e.preventDefault(); e.stopPropagation(); categoriesSubmenu.classList.remove('custom-mb-submenu-visible'); seriesSubmenu.classList.add('custom-mb-submenu-visible'); }); overlay.addEventListener('click', closeAllSubmenus); seriesSubmenu.addEventListener('click', function(e) { e.stopPropagation(); }); filmsSubmenu.addEventListener('click', function(e) { e.stopPropagation(); }); categoriesSubmenu.addEventListener('click', function(e) { e.stopPropagation(); }); } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', initCustomMobileMenu); } else { initCustomMobileMenu(); } })(); document.addEventListener('DOMContentLoaded', function() { const filmCategoriesBtn = document.getElementById('custom-mb-film-categories-btn'); const filmCategoriesSubmenu = document.getElementById('custom-mb-film-categories-submenu'); const filmCategoriesBackBtn = document.getElementById('custom-mb-film-categories-back'); const filmsSubmenu = document.getElementById('custom-mb-films-submenu'); if (filmCategoriesBtn) { filmCategoriesBtn.addEventListener('click', function(e) { e.preventDefault(); e.stopPropagation(); filmsSubmenu.classList.remove('custom-mb-submenu-visible'); filmCategoriesSubmenu.classList.add('custom-mb-submenu-visible'); }); } if (filmCategoriesBackBtn) { filmCategoriesBackBtn.addEventListener('click', function(e) { e.preventDefault(); e.stopPropagation(); filmCategoriesSubmenu.classList.remove('custom-mb-submenu-visible'); filmsSubmenu.classList.add('custom-mb-submenu-visible'); }); } if (filmCategoriesSubmenu) { filmCategoriesSubmenu.addEventListener('click', function(e) { e.stopPropagation(); }); } }); document.addEventListener('DOMContentLoaded', function() { function calculateRating(totalVotes, positiveVotesNet) { if (totalVotes <= 0) return 0; return (Math.round((totalVotes - (totalVotes - positiveVotesNet)/2)/totalVotes * 100)) / 10; } document.querySelectorAll('.vote-circle').forEach(function(circle) { var newsId = circle.getAttribute('data-id') || ''; var totalVotesElement = document.getElementById('vote-num-id-' + newsId); var ratingElement = document.querySelector('#ratig-layer-' + newsId + ' .ratingplus'); var totalVotes = totalVotesElement ? parseInt(totalVotesElement.textContent) : 0; var positiveVotes = ratingElement ? parseInt(ratingElement.textContent.replace('+', '')) : 0; if (totalVotes > 0) { var rating = calculateRating(totalVotes, positiveVotes); var scoreElement = circle.querySelector('.vote-score'); if (scoreElement) { scoreElement.textContent = rating.toFixed(1); } if (rating >= 7) { circle.classList.add('high'); } else if (rating >= 5) { circle.classList.add('medium'); } else { circle.classList.add('low'); } } }); }); function marquerTri(typeTri) { localStorage.setItem('tri_active', 'oui'); localStorage.setItem('option_tri', typeTri); } document.addEventListener('DOMContentLoaded', function() { var triActif = localStorage.getItem('tri_active'); if (triActif === 'oui') { var triActuel = localStorage.getItem('option_tri'); if (triActuel) { var marqueurTri = document.getElementById('tri-boite'); if (marqueurTri) { var posY = marqueurTri.getBoundingClientRect().top + window.pageYOffset - 100; window.scrollTo(0, posY); var liens = document.querySelectorAll('.st-tabs a'); for (var i = 0; i < liens.length; i++) { if (liens[i].getAttribute('onclick') && liens[i].getAttribute('onclick').includes(triActuel)) { var parent = liens[i].parentNode; if (parent) { var styleOriginal = parent.getAttribute('style') || ''; parent.setAttribute('style', 'outline: 1px solid orange !important; border-radius: 4px !important;'); setTimeout(function() { parent.setAttribute('style', styleOriginal); }, 5000); } break; } } } } localStorage.removeItem('tri_active'); } });