GS-IT France | Expert Informatique, Infogérance & Cybersécurité à Rennes (35) depuis 1988
Partenaire informatique en Bretagne

Votre Partenaire Informatique à Rennes

Distribution Informatique/Audiovisuelle - Infogérance, Cybersécurité, Téléphonie 3CX et Intégration IA/Automatisation en entreprise

Spécialiste de la distribution de TERRA LENOVO HP DELL ASUS IIYAMA APPLE LG MICROSOFT ADOBE, les meilleurs prix de France et des stock monstrueux livrable en J+1 sur toute la France

Depuis notre agence basée à Rennes, nous équipons et accompagnons nos clients en distribution - infogérance, cybersécurité, solutions cloud - IA. Bénéficiez d'un service de proximité réactif, soutenu par la puissance de notre réseau national de 150 agences et plus de 1000 collaborateurs.

Services & Expertises

Vente de matériel informatique/audiovisuel,/imprimantes/logiciels

Accédez à notre bibliothèque complète de catalogues PDF pour tous vos besoins en matériel et accessoires informatiques.

En savoir plus

Téléphonie IP 3CX

Une plateforme de communication unifiée pour les entreprises, intégrant téléphonie (voix et vidéo), chat en direct et messagerie instantanée. Flexible et complète, elle améliore la collaboration et l'efficacité des communications.

En savoir plus

Infogérance & Cybersécurité

Découvrez nos solutions d'infogérance basées sur nos agents RMM et nos services de cybersécurité pour protéger votre infrastructure. 1 150 techniciens agréés en France disponible a coté de chez vous

En savoir plus

EPSON EPP

La solution Epson EPP (Epson Print Performance) offre aux entreprises un contrôle précis et une gestion optimisée de leur parc d'impression. Elle permet de réduire les coûts grâce à une facturation basée sur l'usage réel

En savoir plus

IA pour Entreprise

Transformez votre entreprise avec nos agents IA spécialisés pour la téléphonie, le service client, la formation et le marketing.

En savoir plus

Nos produits informatiques

Consultez notre sélection complète de catalogues PDF pour trouver les produits et solutions adaptés à vos besoins.

Catalogue matériel réseau GS-IT France - Solutions professionnelles d'infrastructure IT, équipements Cisco, HPE et Dell, matériel réseau haute performance pour PME et grands comptes
Catalogue PDF

Offre Cloud 2025

Depuis 1988, GS-IT Cloud est spécialisée dans l'hébergement et la sécurité des données informatiques . GSITBackUp et GSITCloud, c’est toute une équipe de techniciens, basée en France, à l’écoute l’écoute permanente de ses clients

Mis à jour le 28 Mars 2025
Catalogue complet de périphériques informatiques professionnels : écrans haute résolution, claviers ergonomiques, souris sans fil, casques audio et accessoires de bureau, disposés dans un environnement de travail moderne
Catalogue PDF

Catalogue Périphériques Professionnels

Écrans, claviers, souris et autres périphériques pour optimiser votre environnement de travail. Distributeur en infrastructure réseau, AV, communications unifiées et sécurité. Plus de 15 000 produits disponibles en J+1 chez vous

Mis à jour le 15 Mars 2025
Catalogue de solutions de stockage professionnelles : systèmes NAS, baies de stockage SAN, serveurs de données et solutions de sauvegarde pour entreprises, avec indicateurs LED bleus montrant leur état de fonctionnement
Catalogue PDF

Catalogue Solutions de Stockage

NAS, SAN et autres solutions de stockage pour sécuriser et optimiser vos données. Depuis 1986, GS-IT est spécialiste et distributeur à valeur ajoutée spécialisé en solutions de stockage et mémoires dont l'objectif principal est d'offrir un portfolio solide de produits leaders. Le stockage, la sauvegarde et l'archivage l'information sont indispensables au sein de chaque entreprise.

Mis à jour le 2 Avril 2025
Catalogue de serveurs d'entreprise : baies de serveurs lames, systèmes de gestion de câbles, équipements de centre de données avec voyants LED d'état, présentant une infrastructure IT professionnelle complète
Catalogue PDF

Catalogue Serveurs Entreprise

Serveurs rack, tour et solutions cloud pour tous types d'entreprises et d'applications. Fabricant de serveurs professionnels, de serveurs au format rack et tour. Construisez votre serveur personnalisé à partir du 1U, du 2U ou du 4U. Puissance de calcul élevée, configuration personnalisée, support GPU et réseau redondant disponibles avec les serveurs haute performance de GS-IT Europe

Mis à jour le 20 Mars 2025
Catalogue de solutions de sécurité IT : pare-feux nouvelle génération, passerelles de sécurité, systèmes de prévention des intrusions avec indicateurs d'état, illustrant une protection réseau complète pour entreprises
Catalogue PDF

Catalogue Sécurité IT

Firewalls, antivirus et solutions de protection pour sécuriser votre infrastructure informatique. Protégez votre entreprise avec une évaluation gratuite en temps réel des vulnérabilités. Nous pouvons assurer la gestion complète de votre infrastructure, de la maintenance quotidienne à la supervision 24/7 de vos serveurs

Mis à jour le 1 Avril 2025
Catalogue d'accessoires informatiques professionnels : câbles réseau, adaptateurs, connecteurs et périphériques soigneusement organisés, présentant une gamme complète de composants techniques pour l'infrastructure IT
Catalogue PDF

Catalogue Accessoires Informatiques

Câbles, adaptateurs et accessoires divers pour compléter votre équipement informatique. Distributeur en infrastructure réseau, AV, communications unifiées et sécurité. Plus de 15 000 produits disponibles en J+1 chez vous

Mis à jour le 25 Mars 2025

Solutions d'Impression EPSON EPP

Gestion professionnelle de votre parc d'impression

Une solution complète pour la gestion de votre parc d'impression, incluant la fourniture des consommables, la maintenance et le suivi analytique.

Solution d'impression EPSON EPP - Gestion professionnelle de parc d'impression, maintenance préventive et suivi analytique, partenaire officiel EPSON pour l'optimisation des coûts d'impression en entreprise
Interface EPSON EPP
Consommables EPSON EPP

FOURNITURE DES CONSOMMABLES

  • GPA / Envoi des consommables à J+1
  • Gestion des stocks tampon
  • Stocks d'avance optimisés

MAINTENANCE DU PARC

  • Engagement des GTI / GTR
  • Prestation préventive et curative
  • Rapport détaillé des interventions

RAPPORTS D'ACTIVITÉS

  • Suivi analytique des consommations
  • Clés de refacturation interne
  • Statistiques de maintenance détaillées

RAPPORTS AUTOMATISÉS

  • Création de rapports trimestriels
  • Suivi facilité au quotidien
  • Tableaux de bord personnalisés

Gestion Cloud

Supervision et gestion à distance de votre parc d'impression via une interface cloud sécurisée

Sécurité Avancée

Protection des données et des documents avec authentification utilisateur et impression sécurisée

Éco-responsable

Solution d'impression respectueuse de l'environnement avec consommation d'énergie optimisée

Solutions d'Infogérance

Centre de support technique GS-IT France - Service d'infogérance 24/7, équipe de 1150 experts certifiés, supervision proactive et assistance utilisateur premium pour entreprises

Solutions d'Infogérance
Premium pour Entreprises

24/7 Support
ISO 27001

Une solution d'infogérance complète incluant la supervision proactive, la sécurité avancée et le support premium. Optimisez votre infrastructure IT tout en réduisant vos coûts d'exploitation.

Bénéficiez d'une expertise technique de haut niveau et d'un accompagnement personnalisé pour transformer votre système d'information en avantage compétitif.

À partir de
5€ HT
par poste
et par mois

Excellence & Innovation depuis 1988

Fort de 35 ans d'expertise dans les services IT, GS-IT France s'impose comme le partenaire de confiance des entreprises exigeantes. Notre engagement qualité et notre maîtrise des dernières technologies nous permettent de délivrer des solutions d'infogérance hautement performantes.

Une solution tout-en-un pour votre parc informatique

PC MAC LINUX

Notre plateforme unifiée combine gestion des endpoints, sécurité et support utilisateur en une seule interface intuitive. Fini les outils multiples et la complexité - gérez tout votre environnement IT depuis un seul endroit.

Sécurité intégrée

Protection antivirus, gestion des correctifs et sauvegarde des données en standard

Support à distance

Assistance rapide et sécurisée sur tous vos appareils

Supervision 24/7

Monitoring continu et alertes en temps réel

Rapports détaillés

Visibilité complète sur votre infrastructure

Pourquoi choisir notre solution ?

Gain de temps

Automatisation des tâches répétitives et résolution rapide des problèmes

Réduction des coûts

Jusqu'à 30% d'économies sur vos dépenses IT

Sécurité renforcée

Protection proactive contre les menaces modernes

Support premium

Assistance experte et réactive 24/24

Informations supplémentaires Trouver un technicien près de chez vous

Installation de Matériel

Mise en place de nouveaux équipements, configurations et tests pour assurer leur bon fonctionnement dans votre environnement.

Maintenance Préventive et Corrective

Entretien régulier de vos systèmes informatiques pour prévenir les pannes et interventions rapides en cas de dysfonctionnement.

Dépannage Informatique

Résolution des problèmes techniques, qu'ils soient matériels ou logiciels, pour minimiser les interruptions de service.

Pourquoi Choisir Notre Solution d'Infogérance ?

Gain de Temps

Concentrez-vous sur votre cœur de métier pendant que nous gérons votre infrastructure IT.

Sécurité Renforcée

Protection proactive contre les menaces et conformité aux normes de sécurité.

Réduction des Coûts

Optimisez vos dépenses IT grâce à un service prévisible et adapté à vos besoins.

Performance Optimisée

Maintenez vos systèmes à leur niveau optimal de performance pour une productivité accrue.

Solutions de Cybersécurité pour votre Entreprise

Protection complète de votre infrastructure IT avec nos solutions de cybersécurité avancées

Protection Complète

Notre approche de la cybersécurité combine technologies avancées, expertise humaine et processus rigoureux pour offrir une protection complète contre les cybermenaces actuelles et émergentes.

  • Audit de sécurité et évaluation des vulnérabilités
  • Protection contre les ransomwares et malwares
  • Sécurisation des accès et gestion des identités
  • Formation et sensibilisation des utilisateurs

Protection Antivirus

Solutions antivirus de nouvelle génération pour détecter et neutraliser les menaces connues et inconnues.

Pare-feu Avancé

Protection de votre réseau contre les intrusions avec des pare-feu de dernière génération.

Sécurité Email

Filtrage des emails malveillants, protection contre le phishing et les tentatives d'hameçonnage.

Authentification MFA

Renforcement de la sécurité des accès grâce à l'authentification multi-facteurs.

Nos Partenaires

Nous collaborons avec les leaders du marché pour vous offrir les meilleures solutions technologiques

HP Enterprise Logo

HP Enterprise

Partenaire Platinium

Dell Logo

Dell

Partenaire Platinum

Microsoft Logo

Microsoft

Partenaire Gold

Lenovo Logo

Lenovo

Partenaire Platinum

Adobe Logo

Terra Wortmann

Partenaire France

Epson Logo

Epson

Partenaire EPP

Certifications

  • HP Platinium Partner
  • Dell Platinum Partner
  • Microsoft Gold Certified
  • LENOVO distributeur premium
  • EPSON partenaire agréé EPP
  • ADOBE partenaire agréé

Expertise

  • Distributeur informatique à forte valeur ajoutée, expert en solutions technologiques innovantes et accompagnement personnalisé
  • Solutions Cloud Enterprise
  • Infrastructure Data Center
  • Sécurité Avancée

Support

  • Support Technique 24/7
  • Intervention Sur Site
  • Maintenance Préventive

Solutions de Téléphonie 3CX | Communications Unifiées Professionnelles | Partenaire Platinum

En tant que partenaire Platinum 3CX, GS-IT vous propose des solutions de téléphonie d'entreprise innovantes et performantes.

Partenaire Platinum 3CX

GS-IT est fier d'être partenaire Platinum 3CX, le plus haut niveau de certification. Notre expertise nous permet de vous offrir des solutions de téléphonie d'entreprise complètes, flexibles et économiques.

  • Système téléphonique professionnel basé sur IP
  • Communications unifiées : appels, vidéo, chat, SMS
  • Déploiement sur site, cloud ou hybride
  • Intégration avec Microsoft Teams, CRM et autres outils
Plus d'informations ?
Solution de téléphonie professionnelle 3CX - Interface unifiée multi-appareils avec téléphones fixes, smartphones et ordinateurs connectés pour une communication d'entreprise optimale

Réduction des Coûts

Réduisez jusqu'à 80% vos frais de téléphonie grâce à la technologie VoIP et aux communications unifiées de 3CX.

Service Client Amélioré

Offrez une expérience client exceptionnelle avec des fonctionnalités avancées de centre d'appels et de gestion des files d'attente.

Mobilité Totale

Travaillez de n'importe où avec les applications mobiles et web 3CX, idéales pour le télétravail et les équipes distribuées.

Fonctionnalités Principales de 3CX

Téléphonie Avancée

Standard automatique, transferts d'appels, enregistrement des appels, messagerie vocale par email, et bien plus.

Visioconférence Web

Organisez des réunions vidéo HD sans plugins, avec partage d'écran et enregistrement des sessions.

Chat d'Entreprise

Messagerie instantanée sécurisée pour vos équipes et vos clients, avec historique et partage de fichiers.

Intégration Microsoft

Intégration native avec Microsoft Teams, Office 365, Exchange et autres services Microsoft.

Centre de Contact

Fonctionnalités avancées de centre d'appels avec rapports détaillés, supervision en temps réel et tableaux de bord.

Sécurité Renforcée

Protection contre les fraudes téléphoniques, chiffrement des communications et conformité RGPD.

3CX en action

Notre Expertise 3CX

En tant que partenaire Platinum 3CX, GS-IT vous accompagne à chaque étape de votre projet téléphonique, de l'audit initial à la maintenance en passant par le déploiement et la formation.

Audit et Conseil

Analyse de vos besoins et de votre infrastructure existante pour vous proposer la solution optimale.

Installation et Configuration

Déploiement sur mesure de votre solution 3CX, sur site, dans le cloud ou en mode hybride.

Formation et Support

Formation de vos équipes et support technique réactif pour une utilisation optimale de votre système.

Maintenance Proactive

Surveillance continue, mises à jour régulières et interventions rapides pour garantir la disponibilité de votre téléphonie.

Obtenir un devis personnalisé

Intelligence Artificielle pour Entreprise

Transformez votre entreprise grâce à nos solutions d'IA spécialisées et notre expertise en intégration d'agents intelligents.

Agents IA Spécialisés

GS-IT est partenaire officiel du Département IA GS-IT Europe et d'autres plateformes d'IA de pointe. Nous distribuons et intégrons des agents IA spécialisés qui révolutionnent les processus métier et améliorent l'efficacité opérationnelle de votre entreprise.

  • Agents IA pour service client et support technique
  • Solutions IA pour la formation et l'onboarding
  • Assistants IA pour le marketing et les ventes
  • Intégration sur mesure avec vos systèmes existants
Solutions IA GS-IT France - Agents intelligents pour service client, formation et marketing, intégration sur mesure d'intelligence artificielle pour l'optimisation des processus métier et l'amélioration de la productivité

IA pour la Téléphonie d'Entreprise

Notre expertise en intégration d'IA dans les systèmes de téléphonie d'entreprise permet d'optimiser vos communications et d'améliorer l'expérience client.

Service Client IA

Agents virtuels capables de gérer les demandes clients 24/7, réduisant les temps d'attente et améliorant la satisfaction.

Formation Assistée

Solutions d'IA pour former vos équipes et faciliter l'onboarding avec des assistants virtuels personnalisés.

Support Technique

Agents IA capables de diagnostiquer et résoudre les problèmes techniques courants, libérant vos équipes pour des tâches à plus forte valeur ajoutée.

Marketing Intelligent

Solutions d'IA pour optimiser vos campagnes marketing et améliorer la conversion grâce à des interactions personnalisées.

Intégration IA en entreprise

Notre Expertise en Intégration

Chez GS-IT, nous ne nous contentons pas de distribuer des solutions IA, nous vous accompagnons dans leur intégration complète au sein de votre infrastructure existante.

Intégration sur Mesure

Adaptation des agents IA à vos processus métier spécifiques et à votre infrastructure technique.

Connexion aux Données

Intégration sécurisée avec vos bases de données et systèmes d'information pour des réponses contextualisées.

Personnalisation Vocale

Adaptation de la voix, du ton et du style de communication pour refléter l'identité de votre marque.

Analyse et Optimisation

Suivi des performances et amélioration continue de vos agents IA basée sur les données réelles d'utilisation.

Cas d'Utilisation

Secteur de la formation

Une grande entreprise française a réduit de 40% le temps de traitement des demandes clients grâce à nos agents IA intégrés à leur centre d'appels.

"L'intégration des agents IA a transformé notre service client, avec une satisfaction client en hausse de 35%."

Santé

Un réseau de cliniques utilise nos agents IA pour la prise de rendez-vous et le suivi patient, libérant le personnel médical pour les soins.

"Nos équipes peuvent désormais se concentrer sur les patients plutôt que sur l'administration, c'est une révolution."

Commerce

Une chaîne de distribution a déployé nos agents IA pour le service après-vente, réduisant les coûts de 30% tout en améliorant la réactivité.

"Nos clients obtiennent des réponses instantanées 24/7, ce qui a considérablement réduit les retours et amélioré la fidélité."

À Propos de GS-IT France

Notre Histoire

Situé au cœur de Rennes (35000), GS-IT France est votre expert local en vente et réparation de matériel informatique. Notre société propose un large choix d'ordinateurs, composants et accessoires, ainsi qu'un service de réparation rapide et professionnel pour tous vos équipements.

GS-IT France est intégré dans le Groupe EURABIS. Avec EURABIS, GS-IT France dispose de 150 agences et 1490 collaborateurs répartis dans toute la France, reconnus pour leurs qualifications, leurs savoir-faire, leurs compétences, leurs soucis permanents de toujours apporter aux clients la réponse la mieux qualifiée. Nos ingénieurs commerciaux, nos techniciens sont à l'écoute permanente des clients pour satisfaire des besoins en constante évolution.

Depuis notre création, nous nous efforçons d'offrir des services de haute qualité, adaptés aux besoins spécifiques de chaque client. Notre équipe d'experts qualifiés est dédiée à la satisfaction client et à l'excellence technique.

Nous croyons en l'établissement de partenariats à long terme avec nos clients, en comprenant leurs défis commerciaux et en fournissant des solutions technologiques qui les aident à atteindre leurs objectifs.

+80 000

clients réguliers, constitués de TPE, de PME/PMI, d’administrations (Mairie, Ecoles, Universités, Hôpitaux…), ou de grands comptes régionaux et nationaux, etc…

+38

Années d'expérience, Au fil des ans, GS-IT France & EURABIS est devenu le premier réseau national des professionnels de l’Informatique et de la Bureautique au service des entreprises.

+150

Agences en France et plus de 1250 collaborateurs

99.9%

Taux de disponibilité

Nos Valeurs

Excellence

Nous visons l'excellence dans tous nos services et solutions.

Client au Centre

La satisfaction client est notre priorité absolue.

Innovation

Nous adoptons les dernières technologies pour offrir des solutions innovantes.

Collaboration

Nous travaillons en étroite collaboration avec nos clients pour atteindre leurs objectifs.

Message envoyé avec succès

Merci de nous avoir contacté. Nous vous répondrons dans les plus brefs délais.

Mentions Légales

Éditeur du site

GS-IT SARL
54 rue Alain Colas
35520 La Mézières, France
SIRET : 82107435700014
Capital social : 10 000 €
N° TVA : FR 95 821074357
Téléphone : 02 34 52 52 52
Email : contact@gs-it.fr

Directeur de la publication

Monsieur Christophe BENECH, Gérant

Hébergement

OVH SAS
2 rue Kellermann
59100 Roubaix, France
Téléphone : 09 72 10 10 07

Propriété intellectuelle

L'ensemble du contenu de ce site (textes, images, vidéos, etc.) est la propriété exclusive de GS-IT SARL ou de ses partenaires. Toute reproduction, représentation, modification, publication, adaptation de tout ou partie des éléments du site, quel que soit le moyen ou le procédé utilisé, est interdite, sauf autorisation écrite préalable de GS-IT SARL.

Protection des données personnelles

Conformément à la loi Informatique et Libertés du 6 janvier 1978 modifiée, et au Règlement Général sur la Protection des Données (RGPD), vous disposez d'un droit d'accès, de rectification, d'effacement, de limitation, d'opposition et de portabilité des données vous concernant. Pour exercer ces droits, vous pouvez nous contacter à l'adresse email suivante : rgpd@gs-it.fr.

Cookies

Ce site utilise des cookies pour améliorer l'expérience utilisateur. En naviguant sur ce site, vous acceptez l'utilisation de cookies conformément à notre politique de confidentialité.

Loi applicable et juridiction

Les présentes mentions légales sont soumises au droit français. En cas de litige, les tribunaux français seront seuls compétents.

Médiation

Conformément aux dispositions du Code de la consommation concernant le règlement amiable des litiges, GS-IT SARL adhère au Service du Médiateur du e-commerce de la FEVAD. Pour tout litige de nature contractuelle, vous pouvez contacter le médiateur à l'adresse suivante : Médiateur du e-commerce de la FEVAD, 60 rue la Boétie, 75008 Paris.

Accès à distance NinjaOne

Accès à distance NinjaOne

Accès à distance rapide, facile et performant pour tous vos terminaux

Connexion rapide et fiable aux appareils

Accédez instantanément à n'importe quel appareil Mac, Windows ou Linux avec une connexion en un clic depuis la console NinjaOne. Nos techniciens peuvent intervenir immédiatement, sans temps d'attente ni installation complexe.

Sécurité de niveau entreprise

Notre solution utilise un chiffrement TLS 1.2 de bout en bout, l'authentification à deux facteurs et des tunnels sécurisés pour garantir que vos données et votre infrastructure restent protégées pendant les sessions d'assistance.

Fonctionnalités avancées

Profitez du transfert de fichiers bidirectionnel, du partage d'écran, de la prise de contrôle complète, du redémarrage à distance et de la connexion même en mode sans échec. Notre solution fonctionne derrière les pare-feu et NAT sans configuration complexe.

Support multi-sessions

Nos techniciens peuvent gérer plusieurs sessions simultanément, collaborer entre eux sur un même appareil et basculer facilement entre différents systèmes pour une résolution plus rapide et efficace des problèmes.

// Initialize the application if(typeof EventManager !== 'undefined') { EventManager.init(); } const chatInput = document.getElementById('chatInput'); if (chatInput) { chatInput.addEventListener('keypress', (e) => { if (e.key === 'Enter') { e.preventDefault(); const sendButton = document.querySelector('.send-chat-message'); if (sendButton) { sendButton.click(); } } }); } // Modal buttons setup const modalButtons = { 'sitemapBtn': openSitemap, 'privacyPolicyBtn': openPrivacyPolicy, 'termsOfUseBtn': openTermsOfUse, 'mentionsLegalesBtn': openMentionsLegales, 'closeModalBtn': closeModal }; Object.entries(modalButtons).forEach(([btnId, handler]) => { const btn = document.getElementById(btnId); if (btn && typeof handler === 'function') { btn.addEventListener('click', (e) => { e.preventDefault(); handler(); }); } }); // Close buttons for modals document.querySelectorAll('.close-privacy-policy, .close-mentions-legales, .close-sitemap, .close-gravity-zone-modal, .close-eurabis-modal').forEach(button => { button.addEventListener('click', () => { const modal = button.closest('.fixed'); if (modal) { modal.classList.add('hidden'); } }); }); // Use event delegation for better performance document.addEventListener('click', function(e) { if(e.target.closest('.close-sitemap')) { closeSitemap(); } else if(e.target.closest('.chat-modal-close')) { closeChatModal(); } else if(e.target.closest('.open-map-modal')) { openTechnicianMap(); } }); } catch(error) { console.error('Error initializing:', error); } }); // Add missing catch blocks try { const partnersButton = document.getElementById('partnersButton'); const partnersMenu = document.getElementById('partnersMenu'); let isMenuOpen = false; if (partnersButton && partnersMenu) { partnersButton.addEventListener('click', function(e) { e.stopPropagation(); isMenuOpen = !isMenuOpen; if (isMenuOpen) { partnersMenu.classList.remove('invisible', 'opacity-0'); partnersMenu.classList.add('opacity-100'); partnersButton.classList.add('bg-primary', 'text-white'); } else { partnersMenu.classList.add('invisible', 'opacity-0'); partnersMenu.classList.remove('opacity-100'); partnersButton.classList.remove('bg-primary', 'text-white'); } }); document.addEventListener('click', function(e) { if (!partnersButton.contains(e.target) && !partnersMenu.contains(e.target) && isMenuOpen) { isMenuOpen = false; partnersMenu.classList.add('invisible', 'opacity-0'); partnersMenu.classList.remove('opacity-100'); partnersButton.classList.remove('bg-primary', 'text-white'); } }); } } catch(error) { console.error('Error in partners menu setup:', error); } // Initialize modals try { const modalButtons = { 'mentionsLegalesBtn': openMentionsLegales, 'privacyPolicyBtn': openPrivacyPolicy, 'termsOfUseBtn': openTermsOfUse }; Object.entries(modalButtons).forEach(([btnId, handler]) => { const btn = document.getElementById(btnId); if (btn) { btn.addEventListener('click', (e) => { e.preventDefault(); handler(); }); } }); } catch(error) { console.error('Error initializing modals:', error); } // Load RSS feed if container exists try { if (document.getElementById('rss-feed')) { loadRSSFeed(); } } catch(error) { console.error('Error loading RSS feed:', error); } }); function initializeEventListeners() { const mobileMenuBtn = document.getElementById('mobileMenuBtn'); if(mobileMenuBtn) { mobileMenuBtn.addEventListener('click', toggleMobileMenu); } const chatInput = document.getElementById('chatInput'); if(chatInput) { chatInput.addEventListener('keypress', function(e) { if(e.key === 'Enter') { sendChatMessage(); } }); } } function setupModals() { // Setup modal event listeners document.querySelectorAll('[data-modal-trigger]').forEach(trigger => { trigger.addEventListener('click', (e) => { e.preventDefault(); const modalId = trigger.getAttribute('data-modal-target'); const modal = document.getElementById(modalId); if(modal) { modal.classList.remove('hidden'); } }); }); } function setupMobileMenu() { const mobileMenu = document.getElementById('mobileMenu'); if(mobileMenu) { document.addEventListener('click', (e) => { const mobileMenuBtn = document.getElementById('mobileMenuBtn'); if(!mobileMenuBtn?.contains(e.target) && !mobileMenu.contains(e.target)) { mobileMenu.classList.add('hidden'); } }); } } function showInfogeranceModal() { document.getElementById('infogeranceModal').classList.remove('hidden'); // Initialize particles.js particlesJS('particles-js', { "particles": { "number": { "value": 300, "density": { "enable": true, "value_area": 800 } }, "color": { "value": "#e2e8f0" }, "shape": { "type": "circle" }, "opacity": { "value": 0.3, "random": true, "anim": { "enable": false } }, "size": { "value": 3, "random": true, "anim": { "enable": false } }, "line_linked": { "enable": false }, "move": { "enable": true, "speed": 6, "direction": "right", "random": true, "straight": false, "out_mode": "out", "bounce": false, "attract": { "enable": false } } }, "interactivity": { "detect_on": "canvas", "events": { "onhover": { "enable": false }, "onclick": { "enable": false }, "resize": true } }, "retina_detect": true }); } function closeInfogeranceModal() { document.getElementById('infogeranceModal').classList.add('hidden'); } let technicianMapModalInstance = null; function openTechnicianMapModal() { try { if(technicianMapModalInstance) { return; } const modal = document.createElement('div'); modal.id = 'technicianMapModal'; modal.className = 'fixed inset-0 bg-black bg-opacity-50 z-50 flex items-center justify-center'; modal.innerHTML = `

Implantation de nos techniciens

`; document.body.appendChild(modal); technicianMapModalInstance = modal; const closeBtn = modal.querySelector('.close-modal-btn'); if(closeBtn) { closeBtn.addEventListener('click', () => { modal.classList.add('opacity-0'); setTimeout(() => { modal.remove(); technicianMapModalInstance = null; }, 300); }); } modal.addEventListener('click', (e) => { if(e.target === modal) { modal.classList.add('opacity-0'); setTimeout(() => { modal.remove(); technicianMapModalInstance = null; }, 300); } }); } catch(error) { console.error('Error opening technician map:', error); } } document.addEventListener('DOMContentLoaded', function() { const technicianMapBtn = document.getElementById('technicianMapBtn'); if(technicianMapBtn) { technicianMapBtn.addEventListener('click', openTechnicianMapModal); } }); document.addEventListener('DOMContentLoaded', function() { if (window.EventManager) { return; } window.EventManager = { init() { try { this.setupMobileMenu(); this.setupModals(); this.setupChat(); this.setupGlobalEvents(); this.setupPartnersMenu(); } catch(error) { console.error('Error initializing EventManager:', error); } }, setupMobileMenu() { try { const mobileMenuBtn = document.getElementById('mobileMenuBtn'); const mobileMenu = document.getElementById('mobileMenu'); if (!mobileMenuBtn || !mobileMenu) return; mobileMenuBtn.addEventListener('click', () => { mobileMenu.classList.toggle('hidden'); }); document.addEventListener('click', (e) => { if (!mobileMenuBtn.contains(e.target) && !mobileMenu.contains(e.target) && !mobileMenu.classList.contains('hidden')) { mobileMenu.classList.add('hidden'); } }); } catch(error) { console.error('Error in setupMobileMenu:', error); } }, setupMobileMenu() { try { const mobileMenuBtn = document.getElementById('mobileMenuBtn'); const mobileMenu = document.getElementById('mobileMenu'); if (!mobileMenuBtn || !mobileMenu) return; mobileMenuBtn.addEventListener('click', () => { mobileMenu.classList.toggle('hidden'); }); document.addEventListener('click', (e) => { if (!mobileMenuBtn.contains(e.target) && !mobileMenu.contains(e.target) && !mobileMenu.classList.contains('hidden')) { mobileMenu.classList.add('hidden'); } }); } catch(error) { console.error('Error in setupMobileMenu:', error); } }, setupModals() { try { const modalTriggers = { 'sitemapBtn': window.openSitemap, 'privacyPolicyBtn': window.openPrivacyPolicy, 'termsOfUseBtn': window.openTermsOfUse, 'mentionsLegalesBtn': window.openMentionsLegales }; Object.entries(modalTriggers).forEach(([id, handler]) => { const element = document.getElementById(id); if (element && typeof handler === 'function') { element.addEventListener('click', (e) => { e.preventDefault(); handler(); }); } }); document.querySelectorAll('.close-modal-btn').forEach(btn => { btn.addEventListener('click', () => { const modal = btn.closest('.fixed'); if (modal) { modal.classList.add('hidden'); document.body.style.overflow = ''; } }); }); } catch(error) { console.error('Error in setupModals:', error); } }, setupChat() { const chatInput = document.getElementById('chatInput'); if (chatInput) { chatInput.addEventListener('keypress', (e) => { if (e.key === 'Enter') { e.preventDefault(); const message = chatInput.value.trim(); if (message) { sendChatMessage(); } } }); } }, setupGlobalEvents() { document.addEventListener('click', (e) => { if (e.target.closest('.close-modal-btn')) { const modal = e.target.closest('.fixed'); if (modal) { modal.classList.add('hidden'); document.body.style.overflow = ''; } } }); }, setupPartnersMenu() { const partnersButton = document.getElementById('partnersButton'); const partnersMenu = document.getElementById('partnersMenu'); if (!partnersButton || !partnersMenu) return; const togglePartnersMenu = (show) => { partnersMenu.classList.toggle('invisible', !show); partnersMenu.classList.toggle('opacity-0', !show); partnersMenu.classList.toggle('opacity-100', show); partnersButton.classList.toggle('bg-primary', show); partnersButton.classList.toggle('text-white', show); }; partnersButton.addEventListener('click', (e) => { e.stopPropagation(); const isOpen = !partnersMenu.classList.contains('invisible'); togglePartnersMenu(!isOpen); }); document.addEventListener('click', (e) => { if (!partnersButton.contains(e.target) && !partnersMenu.contains(e.target)) { togglePartnersMenu(false); } }); } }; EventManager.init(); }); setupMobileMenu() { const mobileMenuBtn = document.getElementById('mobileMenuBtn'); const mobileMenu = document.getElementById('mobileMenu'); if (!mobileMenuBtn || !mobileMenu) return; mobileMenuBtn.addEventListener('click', () => { mobileMenu.classList.toggle('hidden'); }); document.addEventListener('click', (e) => { if (!mobileMenuBtn.contains(e.target) && !mobileMenu.contains(e.target) && !mobileMenu.classList.contains('hidden')) { mobileMenu.classList.add('hidden'); } }); } }; // Initialize EventManager EventManager.init(); setupModals() { try { const modalTriggers = { 'sitemapBtn': window.openSitemap, 'privacyPolicyBtn': window.openPrivacyPolicy, 'termsOfUseBtn': window.openTermsOfUse, 'mentionsLegalesBtn': window.openMentionsLegales }; Object.entries(modalTriggers).forEach(([id, handler]) => { const element = document.getElementById(id); if (element && typeof handler === 'function') { element.addEventListener('click', (e) => { e.preventDefault(); handler(); }); } }); document.querySelectorAll('.close-modal-btn').forEach(btn => { btn.addEventListener('click', () => { const modal = btn.closest('.fixed'); if (modal) { const modalId = modal.id; if (modalId) { ModalManager.closeModal(modalId); } } }); }); } catch(error) { console.error('Error in setupModals:', error); } } setupChat() { const chatInput = document.getElementById('chatInput'); if (chatInput) { chatInput.addEventListener('keypress', (e) => { if (e.key === 'Enter') { e.preventDefault(); const message = chatInput.value.trim(); if (message) { sendChatMessage(); } } }); } }, setupGlobalEvents() { try { document.addEventListener('click', (e) => { if (e.target.closest('.close-modal-btn')) { const modal = e.target.closest('.fixed'); if (modal) { modal.classList.add('hidden'); document.body.style.overflow = ''; if (window.appState) { window.appState.isModalOpen = false; } } } }); } catch(error) { console.error('Error in setupGlobalEvents:', error); } } }; // Initialize EventManager if (typeof EventManager !== 'undefined') { EventManager.init(); } // Initialize EventManager if (typeof EventManager !== 'undefined') { EventManager.init(); } EventManager.init(); }); function closeTechnicianMapModal() { const modal = document.getElementById('technicianMapModal'); if(modal) { modal.classList.add('opacity-0'); setTimeout(() => modal.remove(), 300); } }

Implantation de nos techniciens

`; document.body.appendChild(modal); const closeBtn = modal.querySelector('.close-modal-btn'); if(closeBtn) { closeBtn.addEventListener('click', () => modal.remove()); } modal.addEventListener('click', (e) => { if(e.target === modal) { modal.remove(); } });

Répartition des techniciens

Île-de-France
345
Auvergne-Rhône-Alpes
288
Nouvelle-Aquitaine
230
Occitanie
172
Autres régions
115
Total techniciens 1150

Répartis dans plus de 150 agences en France

`; modal.innerHTML = modalContent; document.body.appendChild(modal); // Add event listeners const closeButton = modal.querySelector('.close-modal-btn'); if (closeButton) { closeButton.addEventListener('click', () => { closeTechnicianMap(); }); } const iframe = modal.querySelector('iframe'); if (iframe) { iframe.addEventListener('load', function() { const loadingOverlay = modal.querySelector('.loading-overlay'); if (loadingOverlay) { loadingOverlay.style.opacity = '0'; setTimeout(() => loadingOverlay.remove(), 300); } }); } modal.addEventListener('click', function(e) { if (e.target === modal) { closeTechnicianMap(); } }); } catch(error) { console.error('Error opening technician map:', error); } } function closeTechnicianMap() { const modal = document.getElementById('technicianMapModal'); if (modal) { modal.classList.add('opacity-0'); setTimeout(() => modal.remove(), 300); } } } // Removed automatic popup code function submitForm() { try { const name = document.getElementById('name')?.value || ''; const email = document.getElementById('email')?.value || ''; const subject = document.getElementById('subject')?.value || ''; const message = document.getElementById('message')?.value || ''; // Validation simple if (!name || !email || !subject || !message) { // Créer une notification d'erreur const notification = document.createElement('div'); notification.className = 'fixed top-4 right-4 bg-red-500 text-white px-6 py-3 rounded shadow-lg z-50'; notification.innerHTML = 'Veuillez remplir tous les champs du formulaire.'; document.body.appendChild(notification); // Supprimer la notification après 3 secondes setTimeout(() => { notification.remove(); }, 3000); return; } // Préparer le corps du mail const mailBody = ` Nouveau message de contact: Nom: ${name} Email: ${email} Sujet: ${subject} Message: ${message} `; // Envoyer le mail via mailto const mailtoLink = `mailto:c.benech@gs-it.eu?subject=${encodeURIComponent(subject)}&body=${encodeURIComponent(mailBody)}`; window.location.href = mailtoLink; // Simuler l'envoi du formulaire document.getElementById('contactForm').reset(); // Afficher le modal de succès document.getElementById('successModal').classList.remove('hidden'); } catch(error) { console.error('Error submitting form:', error); } } function scrollToTicketing() { // Trouver l'élément Helpdesk dans la section hero const ticketingSection = document.querySelector('.hero-section .bg-white.rounded-lg.shadow-lg'); if (ticketingSection) { ticketingSection.scrollIntoView({ behavior: 'smooth' }); // Ajouter un effet de surbrillance temporaire ticketingSection.classList.add('ring-4', 'ring-primary', 'ring-opacity-50'); setTimeout(() => { ticketingSection.classList.remove('ring-4', 'ring-primary', 'ring-opacity-50'); }, 2000); } } function submitTicket() { const ticketType = document.getElementById('ticketType').value; const ticketSubject = document.getElementById('ticketSubject').value; const ticketDescription = document.getElementById('ticketDescription').value; const ticketPriority = document.querySelector('input[name="priority"]:checked')?.value || 'medium'; const ticketFile = document.getElementById('ticketFile').files; // Validation simple if (!ticketType || !ticketSubject || !ticketDescription) { // Créer une notification d'erreur const notification = document.createElement('div'); notification.className = 'fixed top-4 right-4 bg-red-500 text-white px-6 py-3 rounded shadow-lg z-50'; notification.innerHTML = 'Veuillez remplir tous les champs obligatoires.'; document.body.appendChild(notification); // Supprimer la notification après 3 secondes setTimeout(() => { notification.remove(); }, 3000); return; } // Simuler l'envoi du ticket document.getElementById('ticketType').value = ''; document.getElementById('ticketSubject').value = ''; document.getElementById('ticketDescription').value = ''; document.getElementById('ticketFile').value = ''; // Créer une notification de succès const notification = document.createElement('div'); notification.className = 'fixed top-4 right-4 bg-green-500 text-white px-6 py-3 rounded shadow-lg z-50'; notification.innerHTML = `
Ticket créé avec succès
Référence: #${Math.floor(Math.random() * 100000)}
`; document.body.appendChild(notification); // Supprimer la notification après 5 secondes setTimeout(() => { notification.remove(); }, 5000); } function openTicketHistory(event) { if(!event) return; try { event.preventDefault(); if(document.getElementById('ticketHistoryModal')) { return; } const modal = document.createElement('div'); modal.className = 'fixed inset-0 bg-black bg-opacity-50 z-50 flex items-center justify-center'; modal.id = 'ticketHistoryModal'; modal.innerHTML = `

Historique de mes tickets

Référence Sujet Type Statut Date Actions
#45892 Problème de connexion VPN Incident Résolu 08/04/2025 Voir détails
`; document.body.appendChild(modal); modal.addEventListener('click', function(e) { if (e.target === modal) { closeTicketHistory(); } }); } catch(error) { console.error('Error opening ticket history:', error); } }

Historique de mes tickets

Référence Sujet Type Statut Date Actions
#45892 Problème de connexion VPN Incident Résolu 08/04/2025 Voir détails
#45763 Installation Microsoft Office Demande En cours 07/04/2025 Voir détails
#45621 Écran qui scintille Matériel En attente 05/04/2025 Voir détails
#45498 Accès au serveur FTP Accès Résolu 02/04/2025 Voir détails
#45372 Problème d'impression Incident Résolu 30/03/2025 Voir détails
Affichage de 1 à 5 sur 12 tickets
`; document.body.appendChild(modal); } function closeTicketHistory() { const modal = document.getElementById('ticketHistoryModal'); if (modal) { modal.remove(); } } function openEurabisModal(event) { event.preventDefault(); document.getElementById('eurabisModal').classList.remove('hidden'); } function closeEurabisModal() { document.getElementById('eurabisModal').classList.add('hidden'); } function closeModal() { document.getElementById('successModal').classList.add('hidden'); } function openMentionsLegales() { document.getElementById('mentionsLegalesModal').classList.remove('hidden'); } function closeMentionsLegales() { document.getElementById('mentionsLegalesModal').classList.add('hidden'); } function openPrivacyPolicy() { document.getElementById('privacyPolicyModal').classList.remove('hidden'); } function closePrivacyPolicy() { document.getElementById('privacyPolicyModal').classList.add('hidden'); } function openImageModal(src, alt) { try { const modal = document.getElementById('imageModal'); const modalImage = document.getElementById('modalImage'); if(!modal || !modalImage) return; modalImage.src = src; modalImage.alt = alt; modal.classList.remove('hidden'); const closeBtn = modal.querySelector('button'); if(closeBtn) { closeBtn.addEventListener('click', closeImageModal); } modal.addEventListener('click', (e) => { if(e.target === modal) { closeImageModal(); } }); } catch(error) { console.error('Error opening image modal:', error); } } function closeImageModal() { try { const modal = document.getElementById('imageModal'); if(modal) { modal.classList.add('hidden'); } } catch(error) { console.error('Error closing image modal:', error); } } function closeImageModal() { document.getElementById('imageModal').classList.add('hidden'); } function openCableConfigurator() { const modal = document.createElement('div'); modal.className = 'fixed inset-0 bg-black bg-opacity-50 z-50 flex items-center justify-center transition-opacity duration-300'; modal.innerHTML = `

Configurateur de Cordons

`; document.body.appendChild(modal); modal.addEventListener('click', function(e) { if (e.target === modal) { closeCableConfigurator(); } }); } function openUniversalConfigurator() { const modal = document.createElement('div'); modal.className = 'fixed inset-0 bg-black bg-opacity-50 z-50 flex items-center justify-center transition-opacity duration-300'; modal.innerHTML = `

Configurateur Universel

`; document.body.appendChild(modal); modal.addEventListener('click', function(e) { if (e.target === modal) { closeUniversalConfigurator(); } }); } function closeUniversalConfigurator() { const modal = document.querySelector('.fixed.inset-0.bg-black.bg-opacity-50.z-50.flex'); if (modal) { modal.remove(); } } function closeCableConfigurator() { const modal = document.querySelector('.fixed.inset-0.bg-black.bg-opacity-50.z-50.flex'); if (modal) { modal.remove(); } } function openGravityZoneModal() { document.getElementById('gravityZoneModal').classList.remove('hidden'); } function closeGravityZoneModal() { document.getElementById('gravityZoneModal').classList.add('hidden'); } function openDevisModal() { document.getElementById('devisModal').classList.remove('hidden'); } function closeDevisModal() { document.getElementById('devisModal').classList.add('hidden'); } function submitDevisForm() { const name = document.getElementById('devis-name').value; const company = document.getElementById('devis-company').value; const email = document.getElementById('devis-email').value; const phone = document.getElementById('devis-phone').value; const users = document.getElementById('devis-users').value; const edition = document.querySelector('input[name="edition"]:checked')?.value; const deployment = document.getElementById('devis-deployment').value; const needs = document.getElementById('devis-needs').value; const privacy = document.getElementById('devis-privacy').checked; // Validation simple if (!name || !company || !email || !phone || !users || !edition || !privacy) { // Créer une notification d'erreur const notification = document.createElement('div'); notification.className = 'fixed top-4 right-4 bg-red-500 text-white px-6 py-3 rounded shadow-lg z-50'; notification.innerHTML = 'Veuillez remplir tous les champs obligatoires.'; document.body.appendChild(notification); // Supprimer la notification après 3 secondes setTimeout(() => { notification.remove(); }, 3000); return; } // Préparer le corps du mail const mailBody = ` Nouvelle demande de devis 3CX : Informations du contact : - Nom : ${name} - Entreprise : ${company} - Email : ${email} - Téléphone : ${phone} Détails de la demande : - Nombre d'utilisateurs : ${users} - Edition souhaitée : ${edition} - Type de déploiement : ${deployment || 'Non spécifié'} - Besoins spécifiques : ${needs || 'Non spécifiés'} Date de la demande : ${new Date().toLocaleDateString('fr-FR')} `; // Envoyer le mail via mailto const mailtoLink = `mailto:c.benech@gs-it.eu?subject=${encodeURIComponent('Demande de devis 3CX - ' + company)}&body=${encodeURIComponent(mailBody)}`; window.location.href = mailtoLink; // Réinitialiser le formulaire document.getElementById('devisForm').reset(); closeDevisModal(); // Afficher le modal de succès document.getElementById('successModal').classList.remove('hidden'); // Modifier le contenu du modal de succès pour le devis const successTitle = document.querySelector('#successModal h3'); const successMessage = document.querySelector('#successModal p'); if (successTitle && successMessage) { successTitle.textContent = 'Demande de devis envoyée avec succès'; successMessage.textContent = 'Merci pour votre demande de devis 3CX. Notre équipe commerciale vous contactera dans les 24 heures ouvrées.'; } } function openTermsOfUse() { document.getElementById('termsOfUseModal').classList.remove('hidden'); } function closeTermsOfUse() { document.getElementById('termsOfUseModal').classList.add('hidden'); } function openAgentIAModal(event) { event.preventDefault(); document.getElementById('agentIAModal').classList.remove('hidden'); } function closeAgentIAModal() { document.getElementById('agentIAModal').classList.add('hidden'); } function openDemoModal() { document.getElementById('demoModal').classList.remove('hidden'); // Définir la date minimale au lendemain const tomorrow = new Date(); tomorrow.setDate(tomorrow.getDate() + 1); const formattedDate = tomorrow.toISOString().split('T')[0]; document.getElementById('demo-date').min = formattedDate; } function closeDemoModal() { document.getElementById('demoModal').classList.add('hidden'); } function submitDemoForm() { const name = document.getElementById('demo-name').value; const company = document.getElementById('demo-company').value; const email = document.getElementById('demo-email').value; const phone = document.getElementById('demo-phone').value; const interest = document.getElementById('demo-interest').value; const privacy = document.getElementById('demo-privacy').checked; // Validation simple if (!name || !company || !email || !phone || !interest || !privacy) { // Créer une notification d'erreur const notification = document.createElement('div'); notification.className = 'fixed top-4 right-4 bg-red-500 text-white px-6 py-3 rounded shadow-lg z-50'; notification.innerHTML = 'Veuillez remplir tous les champs obligatoires.'; document.body.appendChild(notification); // Supprimer la notification après 3 secondes setTimeout(() => { notification.remove(); }, 3000); return; } // Simuler l'envoi du formulaire document.getElementById('demoForm').reset(); closeDemoModal(); // Afficher le modal de succès document.getElementById('successModal').classList.remove('hidden'); // Modifier le contenu du modal de succès pour la démo const successTitle = document.querySelector('#successModal h3'); const successMessage = document.querySelector('#successModal p'); if (successTitle && successMessage) { successTitle.textContent = 'Demande de démonstration envoyée avec succès'; successMessage.textContent = 'Merci pour votre demande de démonstration IA. Notre équipe vous contactera dans les 24 heures ouvrées pour planifier votre session.'; } } function openRemoteAccessModal() { document.getElementById('remoteAccessModal').classList.remove('hidden'); } function closeRemoteAccessModal() { document.getElementById('remoteAccessModal').classList.add('hidden'); } function openUpdateVideoModal() { document.getElementById('updateVideoModal').classList.remove('hidden'); } function closeUpdateVideoModal() { document.getElementById('updateVideoModal').classList.add('hidden'); } function openBackupModal() { document.getElementById('backupModal').classList.remove('hidden'); } function closeBackupModal() { document.getElementById('backupModal').classList.add('hidden'); } function openPersonalSpace() { window.open('https://3cx-prim.gs-it.eu/cbenechdirco', '_blank'); } function openChatModal() { try { const chatModal = document.getElementById('chatModal'); if(chatModal) { chatModal.classList.remove('hidden'); } } catch(error) { console.error('Error opening chat modal:', error); } } function closeChatModal() { try { const chatModal = document.getElementById('chatModal'); if(chatModal) { chatModal.classList.add('hidden'); } } catch(error) { console.error('Error closing chat modal:', error); } } function sendChatMessage() { try { const input = document.getElementById('chatInput'); const chatMessages = document.getElementById('chatMessages'); const message = input?.value?.trim(); if (!message || !chatMessages) return; function formatTime(date) { return date.toLocaleTimeString('fr-FR', { hour: '2-digit', minute: '2-digit' }); } function createMessageElement(isUser, content, time) { const element = document.createElement('div'); element.className = `flex items-start ${isUser ? 'justify-end' : ''} mb-4`; element.innerHTML = `

${isUser ? escapeHtml(content) : content}

${time}
`; return element; } function scrollToBottom() { chatMessages.scrollTop = chatMessages.scrollHeight; } // Add user message const userTime = formatTime(new Date()); chatMessages.appendChild(createMessageElement(true, message, userTime)); scrollToBottom(); input.value = ''; // Simulate agent response setTimeout(() => { const responses = [ "Je comprends votre demande. Un conseiller va vous répondre dans quelques instants.", "Merci pour votre message. Je transfère votre demande à l'équipe concernée.", "Votre demande est bien prise en compte. Un expert va vous accompagner.", "Je vous remercie pour votre patience. Un conseiller se connecte pour vous aider." ]; const randomResponse = responses[Math.floor(Math.random() * responses.length)]; const agentTime = formatTime(new Date()); chatMessages.appendChild(createMessageElement(false, randomResponse, agentTime)); scrollToBottom(); }, 1000); } catch(error) { console.error('Error sending chat message:', error); } } } function escapeHtml(unsafe) { return unsafe .replace(/&/g, "&") .replace(//g, ">") .replace(/"/g, """) .replace(/'/g, "'"); } function subscribeNewsletter() { const email = document.getElementById('newsletter-email').value; if (!email || !email.includes('@')) { const notification = document.createElement('div'); notification.className = 'fixed top-4 right-4 bg-red-500 text-white px-6 py-3 rounded shadow-lg z-50'; notification.innerHTML = 'Veuillez saisir une adresse email valide.'; document.body.appendChild(notification); setTimeout(() => notification.remove(), 3000); return; } document.getElementById('newsletter-email').value = ''; const notification = document.createElement('div'); notification.className = 'fixed top-4 right-4 bg-green-500 text-white px-6 py-3 rounded shadow-lg z-50'; notification.innerHTML = 'Merci de votre inscription ! Vous recevrez bientôt nos actualités.'; document.body.appendChild(notification); setTimeout(() => notification.remove(), 3000); } function openChatIframe(event) { event.preventDefault(); window.open('https://3cx-prim.gs-it.eu/cbenechdirco', '_blank'); } function sendChatMessage() { try { const input = document.getElementById('chatInput'); const chatMessages = document.getElementById('chatMessages'); const message = input?.value?.trim(); if (!message || !chatMessages) return; function formatTime(date) { return date.toLocaleTimeString('fr-FR', { hour: '2-digit', minute: '2-digit' }); } function createMessageElement(isUser, content, time) { const element = document.createElement('div'); element.className = `flex items-start ${isUser ? 'justify-end' : ''} mb-4`; element.innerHTML = `

${isUser ? escapeHtml(content) : content}

${time}
`; return element; } function scrollToBottom() { chatMessages.scrollTop = chatMessages.scrollHeight; } // Add user message const userTime = formatTime(new Date()); chatMessages.appendChild(createMessageElement(true, message, userTime)); scrollToBottom(); input.value = ''; // Simulate agent response setTimeout(() => { const responses = [ "Je comprends votre demande. Un conseiller va vous répondre dans quelques instants.", "Merci pour votre message. Je transfère votre demande à l'équipe concernée.", "Votre demande est bien prise en compte. Un expert va vous accompagner.", "Je vous remercie pour votre patience. Un conseiller se connecte pour vous aider." ]; const randomResponse = responses[Math.floor(Math.random() * responses.length)]; const agentTime = formatTime(new Date()); chatMessages.appendChild(createMessageElement(false, randomResponse, agentTime)); scrollToBottom(); }, 1000); } catch(error) { console.error('Error sending chat message:', error); } } } // Menu mobile const mobileMenuState = { isAnimating: false, isOpen: false }; function toggleMobileMenu() { const mobileMenu = document.getElementById('mobileMenu'); const mobileMenuBtn = document.getElementById('mobileMenuBtn'); if (!mobileMenu || !mobileMenuBtn || mobileMenuState.isAnimating) return; mobileMenuState.isAnimating = true; mobileMenuState.isOpen = !mobileMenuState.isOpen; const icon = mobileMenuState.isOpen ? 'close' : 'menu'; mobileMenuBtn.innerHTML = ``; if (mobileMenuState.isOpen) { mobileMenu.classList.remove('hidden'); requestAnimationFrame(() => { mobileMenu.style.maxHeight = `${mobileMenu.scrollHeight}px`; setTimeout(() => { mobileMenuState.isAnimating = false; }, 300); }); } else { mobileMenu.style.maxHeight = '0'; setTimeout(() => { mobileMenu.classList.add('hidden'); mobileMenuState.isAnimating = false; }, 300); } // Close menu when clicking outside if (mobileMenuState.isOpen) { const closeOnClickOutside = (e) => { if (!mobileMenu.contains(e.target) && !mobileMenuBtn.contains(e.target)) { toggleMobileMenu(); document.removeEventListener('click', closeOnClickOutside); } }; setTimeout(() => { document.addEventListener('click', closeOnClickOutside); }, 0); } } // Fonction pour charger le flux RSS de cybersécurité document.addEventListener('DOMContentLoaded', function() { if (window.EventManager) { return; } window.EventManager = { init() { try { this.setupMobileMenu(); this.setupModals(); this.setupChat(); this.setupGlobalEvents(); this.setupPartnersMenu(); } catch(error) { console.error('Error initializing EventManager:', error); } }, setupMobileMenu() { try { const mobileMenuBtn = document.getElementById('mobileMenuBtn'); const mobileMenu = document.getElementById('mobileMenu'); if (!mobileMenuBtn || !mobileMenu) return; mobileMenuBtn.addEventListener('click', () => { mobileMenu.classList.toggle('hidden'); }); document.addEventListener('click', (e) => { if (!mobileMenuBtn.contains(e.target) && !mobileMenu.contains(e.target) && !mobileMenu.classList.contains('hidden')) { mobileMenu.classList.add('hidden'); } }); } catch(error) { console.error('Error in setupMobileMenu:', error); } }, setupMobileMenu() { try { const mobileMenuBtn = document.getElementById('mobileMenuBtn'); const mobileMenu = document.getElementById('mobileMenu'); if (!mobileMenuBtn || !mobileMenu) return; mobileMenuBtn.addEventListener('click', () => { mobileMenu.classList.toggle('hidden'); }); document.addEventListener('click', (e) => { if (!mobileMenuBtn.contains(e.target) && !mobileMenu.contains(e.target) && !mobileMenu.classList.contains('hidden')) { mobileMenu.classList.add('hidden'); } }); } catch(error) { console.error('Error in setupMobileMenu:', error); } }, setupModals() { try { const modalTriggers = { 'sitemapBtn': window.openSitemap, 'privacyPolicyBtn': window.openPrivacyPolicy, 'termsOfUseBtn': window.openTermsOfUse, 'mentionsLegalesBtn': window.openMentionsLegales }; Object.entries(modalTriggers).forEach(([id, handler]) => { const element = document.getElementById(id); if (element && typeof handler === 'function') { element.addEventListener('click', (e) => { e.preventDefault(); handler(); }); } }); document.querySelectorAll('.close-modal-btn').forEach(btn => { btn.addEventListener('click', () => { const modal = btn.closest('.fixed'); if (modal) { modal.classList.add('hidden'); document.body.style.overflow = ''; } }); }); } catch(error) { console.error('Error in setupModals:', error); } }, setupChat() { const chatInput = document.getElementById('chatInput'); if (chatInput) { chatInput.addEventListener('keypress', (e) => { if (e.key === 'Enter') { e.preventDefault(); const message = chatInput.value.trim(); if (message) { sendChatMessage(); } } }); } }, setupGlobalEvents() { document.addEventListener('click', (e) => { if (e.target.closest('.close-modal-btn')) { const modal = e.target.closest('.fixed'); if (modal) { modal.classList.add('hidden'); document.body.style.overflow = ''; } } }); }, setupPartnersMenu() { const partnersButton = document.getElementById('partnersButton'); const partnersMenu = document.getElementById('partnersMenu'); if (!partnersButton || !partnersMenu) return; const togglePartnersMenu = (show) => { partnersMenu.classList.toggle('invisible', !show); partnersMenu.classList.toggle('opacity-0', !show); partnersMenu.classList.toggle('opacity-100', show); partnersButton.classList.toggle('bg-primary', show); partnersButton.classList.toggle('text-white', show); }; partnersButton.addEventListener('click', (e) => { e.stopPropagation(); const isOpen = !partnersMenu.classList.contains('invisible'); togglePartnersMenu(!isOpen); }); document.addEventListener('click', (e) => { if (!partnersButton.contains(e.target) && !partnersMenu.contains(e.target)) { togglePartnersMenu(false); } }); } }; EventManager.init(); }); setupMobileMenu() { const mobileMenuBtn = document.getElementById('mobileMenuBtn'); const mobileMenu = document.getElementById('mobileMenu'); if (!mobileMenuBtn || !mobileMenu) return; mobileMenuBtn.addEventListener('click', () => { mobileMenu.classList.toggle('hidden'); }); document.addEventListener('click', (e) => { if (!mobileMenuBtn.contains(e.target) && !mobileMenu.contains(e.target) && !mobileMenu.classList.contains('hidden')) { mobileMenu.classList.add('hidden'); } }); } }; // Initialize EventManager EventManager.init(); setupModals() { try { const modalTriggers = { 'sitemapBtn': window.openSitemap, 'privacyPolicyBtn': window.openPrivacyPolicy, 'termsOfUseBtn': window.openTermsOfUse, 'mentionsLegalesBtn': window.openMentionsLegales }; Object.entries(modalTriggers).forEach(([id, handler]) => { const element = document.getElementById(id); if (element && typeof handler === 'function') { element.addEventListener('click', (e) => { e.preventDefault(); handler(); }); } }); document.querySelectorAll('.close-modal-btn').forEach(btn => { btn.addEventListener('click', () => { const modal = btn.closest('.fixed'); if (modal) { const modalId = modal.id; if (modalId) { ModalManager.closeModal(modalId); } } }); }); } catch(error) { console.error('Error in setupModals:', error); } } setupChat() { const chatInput = document.getElementById('chatInput'); if (chatInput) { chatInput.addEventListener('keypress', (e) => { if (e.key === 'Enter') { e.preventDefault(); const message = chatInput.value.trim(); if (message) { sendChatMessage(); } } }); } }, setupGlobalEvents() { try { document.addEventListener('click', (e) => { if (e.target.closest('.close-modal-btn')) { const modal = e.target.closest('.fixed'); if (modal) { modal.classList.add('hidden'); document.body.style.overflow = ''; if (window.appState) { window.appState.isModalOpen = false; } } } }); } catch(error) { console.error('Error in setupGlobalEvents:', error); } } }; // Initialize EventManager if (typeof EventManager !== 'undefined') { EventManager.init(); } // Initialize EventManager if (typeof EventManager !== 'undefined') { EventManager.init(); } // Initialize the event manager EventManager.init(); function openSitemap() { const modal = document.getElementById('sitemapModal'); if (modal) { modal.classList.remove('hidden'); document.body.style.overflow = 'hidden'; } } function closeSitemap() { const modal = document.getElementById('sitemapModal'); if (modal) { modal.classList.add('hidden'); document.body.style.overflow = ''; } } function loadRSSFeed() { const rssFeedContainer = document.getElementById('rss-feed'); if (!rssFeedContainer) return; // Cache RSS feed data for 1 hour const cacheKey = 'rssFeedData'; const cacheExpiry = 3600000; // 1 hour in milliseconds const cachedData = localStorage.getItem(cacheKey); if (cachedData) { const {data, timestamp} = JSON.parse(cachedData); if (Date.now() - timestamp < cacheExpiry) { renderRSSFeed(data, rssFeedContainer); return; } } // Use CORS proxy to access RSS feed const corsProxy = 'https://api.allorigins.win/raw?url='; const rssFeedUrl = encodeURIComponent('https://www.cert.ssi.gouv.fr/feed/'); fetch(corsProxy + rssFeedUrl) .then(response => response.text()) .then(str => { const data = new window.DOMParser().parseFromString(str, "text/xml"); // Cache the data localStorage.setItem(cacheKey, JSON.stringify({ data: str, timestamp: Date.now() })); renderRSSFeed(data, rssFeedContainer); }) .catch(error => handleRSSError(error, rssFeedContainer)); } function renderRSSFeed(data, container) { try { const items = data.querySelectorAll('item'); const fragment = document.createDocumentFragment(); const maxItems = Math.min(items.length, 4); let html = ''; for (let i = 0; i < maxItems; i++) { const item = items[i]; const title = item.querySelector('title').textContent; const link = item.querySelector('link').textContent; const description = item.querySelector('description').textContent; const pubDate = new Date(item.querySelector('pubDate').textContent); const formattedDate = pubDate.toLocaleDateString('fr-FR', { day: 'numeric', month: 'long', year: 'numeric' }); // Extraire un court résumé du contenu (limité à 150 caractères) const tempDiv = document.createElement('div'); tempDiv.innerHTML = description; let summary = tempDiv.textContent || tempDiv.innerText || ''; summary = summary.substring(0, 150) + (summary.length > 150 ? '...' : ''); html += `

${title}

${summary}

${formattedDate}
`; } container.innerHTML = html; } catch(error) { console.error('Error rendering RSS feed:', error); container.innerHTML = `

Impossible de charger les actualités

Veuillez réessayer ultérieurement ou consulter directement le site de l'ANSSI.

Visiter le site de l'ANSSI
`; } } } // Ajouter l'event listener pour les mentions légales et politique de confidentialité document.addEventListener('DOMContentLoaded', function() { if (window.EventManager) { return; } window.EventManager = { init() { try { this.setupMobileMenu(); this.setupModals(); this.setupChat(); this.setupGlobalEvents(); this.setupPartnersMenu(); } catch(error) { console.error('Error initializing EventManager:', error); } }, setupMobileMenu() { try { const mobileMenuBtn = document.getElementById('mobileMenuBtn'); const mobileMenu = document.getElementById('mobileMenu'); if (!mobileMenuBtn || !mobileMenu) return; mobileMenuBtn.addEventListener('click', () => { mobileMenu.classList.toggle('hidden'); }); document.addEventListener('click', (e) => { if (!mobileMenuBtn.contains(e.target) && !mobileMenu.contains(e.target) && !mobileMenu.classList.contains('hidden')) { mobileMenu.classList.add('hidden'); } }); } catch(error) { console.error('Error in setupMobileMenu:', error); } }, setupMobileMenu() { try { const mobileMenuBtn = document.getElementById('mobileMenuBtn'); const mobileMenu = document.getElementById('mobileMenu'); if (!mobileMenuBtn || !mobileMenu) return; mobileMenuBtn.addEventListener('click', () => { mobileMenu.classList.toggle('hidden'); }); document.addEventListener('click', (e) => { if (!mobileMenuBtn.contains(e.target) && !mobileMenu.contains(e.target) && !mobileMenu.classList.contains('hidden')) { mobileMenu.classList.add('hidden'); } }); } catch(error) { console.error('Error in setupMobileMenu:', error); } }, setupModals() { try { const modalTriggers = { 'sitemapBtn': window.openSitemap, 'privacyPolicyBtn': window.openPrivacyPolicy, 'termsOfUseBtn': window.openTermsOfUse, 'mentionsLegalesBtn': window.openMentionsLegales }; Object.entries(modalTriggers).forEach(([id, handler]) => { const element = document.getElementById(id); if (element && typeof handler === 'function') { element.addEventListener('click', (e) => { e.preventDefault(); handler(); }); } }); document.querySelectorAll('.close-modal-btn').forEach(btn => { btn.addEventListener('click', () => { const modal = btn.closest('.fixed'); if (modal) { modal.classList.add('hidden'); document.body.style.overflow = ''; } }); }); } catch(error) { console.error('Error in setupModals:', error); } }, setupChat() { const chatInput = document.getElementById('chatInput'); if (chatInput) { chatInput.addEventListener('keypress', (e) => { if (e.key === 'Enter') { e.preventDefault(); const message = chatInput.value.trim(); if (message) { sendChatMessage(); } } }); } }, setupGlobalEvents() { document.addEventListener('click', (e) => { if (e.target.closest('.close-modal-btn')) { const modal = e.target.closest('.fixed'); if (modal) { modal.classList.add('hidden'); document.body.style.overflow = ''; } } }); }, setupPartnersMenu() { const partnersButton = document.getElementById('partnersButton'); const partnersMenu = document.getElementById('partnersMenu'); if (!partnersButton || !partnersMenu) return; const togglePartnersMenu = (show) => { partnersMenu.classList.toggle('invisible', !show); partnersMenu.classList.toggle('opacity-0', !show); partnersMenu.classList.toggle('opacity-100', show); partnersButton.classList.toggle('bg-primary', show); partnersButton.classList.toggle('text-white', show); }; partnersButton.addEventListener('click', (e) => { e.stopPropagation(); const isOpen = !partnersMenu.classList.contains('invisible'); togglePartnersMenu(!isOpen); }); document.addEventListener('click', (e) => { if (!partnersButton.contains(e.target) && !partnersMenu.contains(e.target)) { togglePartnersMenu(false); } }); } }; EventManager.init(); }); setupMobileMenu() { const mobileMenuBtn = document.getElementById('mobileMenuBtn'); const mobileMenu = document.getElementById('mobileMenu'); if (!mobileMenuBtn || !mobileMenu) return; mobileMenuBtn.addEventListener('click', () => { mobileMenu.classList.toggle('hidden'); }); document.addEventListener('click', (e) => { if (!mobileMenuBtn.contains(e.target) && !mobileMenu.contains(e.target) && !mobileMenu.classList.contains('hidden')) { mobileMenu.classList.add('hidden'); } }); } }; // Initialize EventManager EventManager.init(); setupModals() { try { const modalTriggers = { 'sitemapBtn': window.openSitemap, 'privacyPolicyBtn': window.openPrivacyPolicy, 'termsOfUseBtn': window.openTermsOfUse, 'mentionsLegalesBtn': window.openMentionsLegales }; Object.entries(modalTriggers).forEach(([id, handler]) => { const element = document.getElementById(id); if (element && typeof handler === 'function') { element.addEventListener('click', (e) => { e.preventDefault(); handler(); }); } }); document.querySelectorAll('.close-modal-btn').forEach(btn => { btn.addEventListener('click', () => { const modal = btn.closest('.fixed'); if (modal) { const modalId = modal.id; if (modalId) { ModalManager.closeModal(modalId); } } }); }); } catch(error) { console.error('Error in setupModals:', error); } } setupChat() { const chatInput = document.getElementById('chatInput'); if (chatInput) { chatInput.addEventListener('keypress', (e) => { if (e.key === 'Enter') { e.preventDefault(); const message = chatInput.value.trim(); if (message) { sendChatMessage(); } } }); } }, setupGlobalEvents() { try { document.addEventListener('click', (e) => { if (e.target.closest('.close-modal-btn')) { const modal = e.target.closest('.fixed'); if (modal) { modal.classList.add('hidden'); document.body.style.overflow = ''; if (window.appState) { window.appState.isModalOpen = false; } } } }); } catch(error) { console.error('Error in setupGlobalEvents:', error); } } }; // Initialize EventManager if (typeof EventManager !== 'undefined') { EventManager.init(); } // Initialize EventManager if (typeof EventManager !== 'undefined') { EventManager.init(); } // Initialize the event manager EventManager.init(); }); // Initialize event listeners and other functionality initializeEventListeners(); setupModals(); setupMobileMenu(); }); // Add ticket modal functionality window.openTicketModal = function() { console.log('Opening ticket modal'); }; // Close mobile client menu when clicking outside document.addEventListener('click', function(e) { const mobileClientMenu = document.getElementById('mobileClientMenu'); const mobileClientButton = document.querySelector('button[onclick="toggleMobileClientMenu()"]'); if (mobileClientMenu && !mobileClientButton?.contains(e.target) && !mobileClientMenu.contains(e.target)) { mobileClientMenu.classList.add('hidden'); } }); } catch(error) { console.error('Error in mobile menu functionality:', error); } }); // Remove duplicate event listener since it's already handled in EventManager.setupPartnersMenu() // Remove duplicate event listeners since they're already handled in EventManager.setupModals() // Mobile menu const mobileMenuBtn = document.getElementById('mobileMenuBtn'); if (mobileMenuBtn) { mobileMenuBtn.addEventListener('click', toggleMobileMenu); } // Load RSS feed if container exists if (document.getElementById('rss-feed')) { loadRSSFeed(); } } catch(error) { console.error('Error in event listeners:', error); } document.addEventListener('click', function(e) { const partnersButton = document.getElementById('partnersButton'); const partnersMenu = document.getElementById('partnersMenu'); if (partnersButton && partnersMenu && !partnersButton.contains(e.target) && !partnersMenu.contains(e.target) && isMenuOpen) { isMenuOpen = false; partnersMenu.classList.add('invisible', 'opacity-0'); partnersMenu.classList.remove('opacity-100'); partnersButton.classList.remove('bg-primary', 'text-white'); } }); // Add event listeners only if elements exist const mentionsLegalesBtn = document.getElementById('mentionsLegalesBtn'); if (mentionsLegalesBtn) { mentionsLegalesBtn.addEventListener('click', function(e) { e.preventDefault(); openMentionsLegales(); }); } const privacyPolicyBtn = document.getElementById('privacyPolicyBtn'); if (privacyPolicyBtn) { privacyPolicyBtn.addEventListener('click', function(e) { e.preventDefault(); openPrivacyPolicy(); }); } const termsOfUseBtn = document.getElementById('termsOfUseBtn'); if (termsOfUseBtn) { termsOfUseBtn.addEventListener('click', function(e) { e.preventDefault(); openTermsOfUse(); }); } // Mobile menu const mobileMenuBtn = document.getElementById('mobileMenuBtn'); if (mobileMenuBtn) { mobileMenuBtn.addEventListener('click', function() { toggleMobileMenu(); }); } // Load RSS feed if container exists if (document.getElementById('rss-feed')) { loadRSSFeed(); } } catch(error) { console.error('Error in event listeners:', error); } }); document.addEventListener('DOMContentLoaded', function() { try { // Global state management if (!window.appState) { window.appState = { isMenuOpen: false, isModalOpen: false, isChatOpen: false, isAnimating: false }; } // Modal Manager window.ModalManager = { openModal(modalId) { const modal = document.getElementById(modalId); if(modal) { modal.classList.remove('hidden'); document.body.style.overflow = 'hidden'; window.appState.isModalOpen = true; } }, closeModal(modalId) { const modal = document.getElementById(modalId); if(modal) { modal.classList.add('hidden'); document.body.style.overflow = ''; window.appState.isModalOpen = false; } } }; // Modal functions const modalFunctions = { openSitemap: () => ModalManager.openModal('sitemapModal'), closeSitemap: () => ModalManager.closeModal('sitemapModal'), openPrivacyPolicy: () => ModalManager.openModal('privacyPolicyModal'), closePrivacyPolicy: () => ModalManager.closeModal('privacyPolicyModal'), openTermsOfUse: () => ModalManager.openModal('termsOfUseModal'), closeTermsOfUse: () => ModalManager.closeModal('termsOfUseModal'), openMentionsLegales: () => ModalManager.openModal('mentionsLegalesModal'), closeMentionsLegales: () => ModalManager.closeModal('mentionsLegalesModal') }; // Assign functions to window object Object.entries(modalFunctions).forEach(([key, func]) => { window[key] = func; }); // Event Manager const EventManager = { init() { this.setupMobileMenu(); this.setupModals(); this.setupChat(); this.setupGlobalEvents(); this.setupPartnersMenu(); }, setupMobileMenu() { const mobileMenuBtn = document.getElementById('mobileMenuBtn'); const mobileMenu = document.getElementById('mobileMenu'); if (!mobileMenuBtn || !mobileMenu) return; mobileMenuBtn.addEventListener('click', () => { if (window.appState.isAnimating) return; window.appState.isAnimating = true; window.appState.isMenuOpen = !window.appState.isMenuOpen; mobileMenuBtn.innerHTML = ``; if (window.appState.isMenuOpen) { mobileMenu.classList.remove('hidden'); requestAnimationFrame(() => { mobileMenu.style.maxHeight = `${mobileMenu.scrollHeight}px`; setTimeout(() => { window.appState.isAnimating = false; }, 300); }); } else { mobileMenu.style.maxHeight = '0'; setTimeout(() => { mobileMenu.classList.add('hidden'); window.appState.isAnimating = false; }, 300); } }); // Close menu when clicking outside document.addEventListener('click', (e) => { if (!mobileMenuBtn.contains(e.target) && !mobileMenu.contains(e.target) && window.appState.isMenuOpen) { window.appState.isMenuOpen = false; mobileMenu.classList.add('hidden'); } }); }, setupPartnersMenu() { const partnersButton = document.getElementById('partnersButton'); const partnersMenu = document.getElementById('partnersMenu'); if (!partnersButton || !partnersMenu) return; const togglePartnersMenu = (show) => { if(window.appState) { window.appState.isMenuOpen = show; } partnersMenu.classList.toggle('invisible', !show); partnersMenu.classList.toggle('opacity-0', !show); partnersMenu.classList.toggle('opacity-100', show); partnersButton.classList.toggle('bg-primary', show); partnersButton.classList.toggle('text-white', show); }; partnersButton.addEventListener('click', (e) => { e.stopPropagation(); togglePartnersMenu(!window.appState?.isMenuOpen); }); document.addEventListener('click', (e) => { if (!partnersButton.contains(e.target) && !partnersMenu.contains(e.target) && window.appState?.isMenuOpen) { togglePartnersMenu(false); } }); }, setupModals() { const modalTriggers = { 'sitemapBtn': openSitemap, 'privacyPolicyBtn': openPrivacyPolicy, 'termsOfUseBtn': openTermsOfUse, 'mentionsLegalesBtn': openMentionsLegales, 'closeModalBtn': closeModal }; Object.entries(modalTriggers).forEach(([id, handler]) => { const element = document.getElementById(id); if (element && typeof handler === 'function') { element.addEventListener('click', (e) => { e.preventDefault(); handler(); }); } }); document.querySelectorAll('.close-modal-btn').forEach(btn => { btn.addEventListener('click', () => { const modal = btn.closest('.fixed'); if (modal) { modal.classList.add('hidden'); window.appState.isModalOpen = false; } }); }); }, setupChat() { const chatInput = document.getElementById('chatInput'); if (chatInput) { chatInput.addEventListener('keypress', (e) => { if (e.key === 'Enter') { e.preventDefault(); const message = chatInput.value.trim(); if (message) { sendChatMessage(); } } }); } }, setupGlobalEvents() { document.addEventListener('click', (e) => { if (e.target.closest('.close-sitemap')) { closeSitemap(); } else if (e.target.closest('.chat-modal-close')) { closeChatModal(); } else if (e.target.closest('.open-map-modal')) { openTechnicianMap(); } }); } }; // Initialize the application if(typeof EventManager !== 'undefined') { document.addEventListener('DOMContentLoaded', function() { EventManager.init(); }); } setupGlobalEvents() { document.addEventListener('click', (e) => { if (e.target.closest('.close-sitemap')) { closeSitemap(); } else if (e.target.closest('.chat-modal-close')) { closeChatModal(); } else if (e.target.closest('.open-map-modal')) { openTechnicianMap(); } }); } const mobileMenuBtn = document.getElementById('mobileMenuBtn'); const mobileMenu = document.getElementById('mobileMenu'); if (!mobileMenuBtn || !mobileMenu) return; mobileMenuBtn.addEventListener('click', () => { if (appState.isAnimating) return; appState.isAnimating = true; appState.isMenuOpen = !appState.isMenuOpen; mobileMenuBtn.innerHTML = ``; if (appState.isMenuOpen) { mobileMenu.classList.remove('hidden'); requestAnimationFrame(() => { mobileMenu.style.maxHeight = `${mobileMenu.scrollHeight}px`; setTimeout(() => { appState.isAnimating = false; }, 300); }); } else { mobileMenu.style.maxHeight = '0'; setTimeout(() => { mobileMenu.classList.add('hidden'); appState.isAnimating = false; }, 300); } }); document.addEventListener('click', (e) => { if (!mobileMenuBtn.contains(e.target) && !mobileMenu.contains(e.target) && appState.isMenuOpen) { appState.isMenuOpen = false; mobileMenu.classList.add('hidden'); } }); }, setupModals() { try { const modalTriggers = { 'sitemapBtn': () => ModalManager.openModal('sitemapModal'), 'privacyPolicyBtn': () => ModalManager.openModal('privacyPolicyModal'), 'termsOfUseBtn': () => ModalManager.openModal('termsOfUseModal'), 'mentionsLegalesBtn': () => ModalManager.openModal('mentionsLegalesModal') }; Object.entries(modalTriggers).forEach(([id, handler]) => { const element = document.getElementById(id); if (element) { element.addEventListener('click', (e) => { e.preventDefault(); handler(); }); } }); document.querySelectorAll('.close-modal-btn').forEach(btn => { btn.addEventListener('click', () => { const modal = btn.closest('.fixed'); if (modal) { modal.classList.add('hidden'); document.body.style.overflow = ''; window.appState.isModalOpen = false; } }); }); } catch(error) { console.error('Error setting up modal triggers:', error); } }, setupChat() { const chatInput = document.getElementById('chatInput'); if (chatInput) { chatInput.addEventListener('keypress', (e) => { if (e.key === 'Enter') { e.preventDefault(); const message = chatInput.value.trim(); if (message) { sendChatMessage(); } } }); } const sendButton = document.querySelector('.send-chat-message'); if (sendButton) { sendButton.addEventListener('click', () => { const chatInput = document.getElementById('chatInput'); const message = chatInput?.value?.trim(); if (message) { sendChatMessage(); } }); } }, setupPartnersMenu() { const partnersButton = document.getElementById('partnersButton'); const partnersMenu = document.getElementById('partnersMenu'); if (!partnersButton || !partnersMenu) return; const togglePartnersMenu = (show) => { partnersMenu.classList.toggle('invisible', !show); partnersMenu.classList.toggle('opacity-0', !show); partnersMenu.classList.toggle('opacity-100', show); partnersButton.classList.toggle('bg-primary', show); partnersButton.classList.toggle('text-white', show); }; partnersButton.addEventListener('click', (e) => { e.stopPropagation(); appState.isMenuOpen = !appState.isMenuOpen; togglePartnersMenu(appState.isMenuOpen); }); document.addEventListener('click', (e) => { if (!partnersButton.contains(e.target) && !partnersMenu.contains(e.target) && appState.isMenuOpen) { appState.isMenuOpen = false; togglePartnersMenu(false); } }); } }; // Initialize event management EventManager.init(); try { const modalTriggers = { 'sitemapBtn': openSitemap, 'privacyPolicyBtn': openPrivacyPolicy, 'termsOfUseBtn': openTermsOfUse, 'mentionsLegalesBtn': openMentionsLegales, 'closeModalBtn': closeModal }; Object.entries(modalTriggers).forEach(([id, handler]) => { const element = document.getElementById(id); if (element && typeof handler === 'function') { element.addEventListener('click', (e) => { e.preventDefault(); handler(); }); } }); } catch(error) { console.error('Error setting up modal triggers:', error); } finally { // Cleanup if needed } } catch(error) { console.error('Error setting up modal triggers:', error); } // Close buttons for modals document.querySelectorAll('.close-modal-btn').forEach(btn => { btn.addEventListener('click', () => { const modal = btn.closest('.fixed'); if (modal) { modal.classList.add('hidden'); appState.isModalOpen = false; } }); }); }, setupChat() { const chatInput = document.getElementById('chatInput'); if (chatInput) { chatInput.addEventListener('keypress', (e) => { if (e.key === 'Enter') { e.preventDefault(); const message = chatInput.value.trim(); if (message) { sendChatMessage(); } } }); } }, setupGlobalEvents() { try { document.addEventListener('click', (e) => { if (e.target.closest('.close-modal-btn')) { const modal = e.target.closest('.fixed'); if (modal) { modal.classList.add('hidden'); document.body.style.overflow = ''; if (window.appState) { window.appState.isModalOpen = false; } } } }); } catch(error) { console.error('Error in setupGlobalEvents:', error); } } }; // Initialize EventManager if (typeof EventManager !== 'undefined') { EventManager.init(); } const chatInput = document.getElementById('chatInput'); if (chatInput) { chatInput.addEventListener('keypress', (e) => { if (e.key === 'Enter') { e.preventDefault(); const sendButton = document.querySelector('.send-chat-message'); if (sendButton) { sendButton.click(); } } }); } // Modal buttons setup const modalButtons = { 'sitemapBtn': openSitemap, 'privacyPolicyBtn': openPrivacyPolicy, 'termsOfUseBtn': openTermsOfUse, 'mentionsLegalesBtn': openMentionsLegales, 'closeModalBtn': closeModal }; Object.entries(modalButtons).forEach(([btnId, handler]) => { const btn = document.getElementById(btnId); if (btn && typeof handler === 'function') { btn.addEventListener('click', (e) => { e.preventDefault(); handler(); }); } }); // Close buttons for modals document.querySelectorAll('.close-privacy-policy, .close-mentions-legales, .close-sitemap, .close-gravity-zone-modal, .close-eurabis-modal').forEach(button => { button.addEventListener('click', () => { const modal = button.closest('.fixed'); if (modal) { modal.classList.add('hidden'); } }); }); setupPartnersMenu() { const partnersButton = document.getElementById('partnersButton'); const partnersMenu = document.getElementById('partnersMenu'); if (!partnersButton || !partnersMenu) return; const togglePartnersMenu = (show) => { if(window.appState) { window.appState.isMenuOpen = show; } partnersMenu.classList.toggle('invisible', !show); partnersMenu.classList.toggle('opacity-0', !show); partnersMenu.classList.toggle('opacity-100', show); partnersButton.classList.toggle('bg-primary', show); partnersButton.classList.toggle('text-white', show); }; partnersButton.addEventListener('click', (e) => { e.stopPropagation(); togglePartnersMenu(!window.appState?.isMenuOpen); }); document.addEventListener('click', (e) => { if (!partnersButton.contains(e.target) && !partnersMenu.contains(e.target) && window.appState?.isMenuOpen) { togglePartnersMenu(false); } }); } document.addEventListener('DOMContentLoaded', function() { const modalButtons = { 'mentionsLegalesBtn': openMentionsLegales, 'privacyPolicyBtn': openPrivacyPolicy, 'termsOfUseBtn': openTermsOfUse }; Object.entries(modalButtons).forEach(([btnId, handler]) => { const btn = document.getElementById(btnId); if (btn) { btn.addEventListener('click', (e) => { e.preventDefault(); handler(); }); } }); }); // Mobile menu setup const mobileMenuBtn = document.getElementById('mobileMenuBtn'); if (mobileMenuBtn) { mobileMenuBtn.addEventListener('click', () => { if (typeof toggleMobileMenu === 'function') { toggleMobileMenu(); } }); } // Event delegation for common actions document.addEventListener('click', function(e) { if(e.target.closest('.close-sitemap')) { closeSitemap(); } else if(e.target.closest('.chat-modal-close')) { closeChatModal(); } else if(e.target.closest('.open-map-modal')) { openTechnicianMap(); } }); // Load RSS feed if container exists const rssFeedContainer = document.getElementById('rss-feed'); if (rssFeedContainer && typeof loadRSSFeed === 'function') { loadRSSFeed(); } } catch(error) { console.error('Error in DOMContentLoaded event listener:', error); } });