Offre Limitée : Économisez 44% sur tous les cours

Executive Certificate in Cyberbullying Research Studies

-- ViewingNow

The Executive Certificate in Cyberbullying Research Studies is a comprehensive course designed to equip learners with essential skills to address the rapidly growing issue of cyberbullying. This program emphasizes the importance of understanding the psychological, social, and legal implications of cyberbullying, making it highly relevant in today's digital age.

5,0
Based on 6 384 reviews

3 204+

Students enrolled

GBP £ 149

GBP £ 215

Save 44% with our special offer

Start Now

À propos de ce cours

With the increasing demand for experts who can effectively manage cyberbullying incidents, this certificate course provides a unique opportunity for career advancement. Learners will gain critical insights into the latest research, trends, and best practices for preventing and responding to cyberbullying, thereby enhancing their professional capabilities and marketability. By the end of this course, learners will be able to develop and implement evidence-based cyberbullying intervention strategies, counsel victims and perpetrators, and contribute to a safer online environment. This expertise is highly sought after in various industries, including education, healthcare, law enforcement, and technology, offering learners diverse and rewarding career opportunities.

100% en ligne

Apprenez de n'importe où

Certificat partageable

Ajoutez à votre profil LinkedIn

2 mois pour terminer

à 2-3 heures par semaine

Commencez à tout moment

Aucune période d'attente

Détails du cours

Executive Certificate in Cyberbullying Research Studies

  • • Understanding Cyberbullying: Definition, Types, and Impact
  • • Prevalence and Trends in Cyberbullying: A Global Perspective
  • • Legal and Policy Frameworks for Cyberbullying Research
  • • Theories and Models of Cyberbullying Behavior
  • • Psychological and Social Factors in Cyberbullying
  • • Cyberbullying Interventions and Prevention Strategies
  • • Technology and Tools for Cyberbullying Research
  • • Ethical Considerations in Cyberbullying Research
  • • Research Methods and Data Analysis in Cyberbullying Studies
  • • Communicating Research Findings: Reports, Presentations, and Publications

Parcours professionnel

The Executive Certificate in Cyberbullying Research Studies offers a comprehensive understanding of the job market trends, salary ranges, and skill demand in the UK. This 3D pie chart visually represents the industry-relevant roles and their respective representation in the cyberbullying research field. 1. Cyberbullying Researcher: With a 45% share, cyberbullying researchers form the largest segment of this industry. They investigate the causes, effects, and prevention strategies related to cyberbullying. 2. Policy Maker: In the second place, policy makers (20%) are responsible for creating and implementing laws and regulations to protect internet users from cyberbullying. 3. Online Safety Consultant: Online safety consultants (15%) evaluate and enhance the online safety measures of organizations to minimize the risk of cyberbullying. 4. Educator & Trainer: Educators and trainers (10%) play a crucial role in raising awareness and educating people about the consequences of cyberbullying. 5. Mental Health Professional: With a 10% share, mental health professionals deal with the psychological impact of cyberbullying on victims and guide them towards recovery. This responsive and engaging 3D pie chart highlights the importance of understanding the cyberbullying landscape and the various roles professionals can undertake to address this issue. <div style="width: 100%; height: 400px; margin-bottom: 20px;"> <div id="chart_div"></div> </div> <script src='https://www.gstatic.com/charts/loader.js'></script> <script> google.charts.load('current', {'packages':['corechart']}); google.charts.setOnLoadCallback(drawChart); function drawChart() { var data = google.visualization.arrayToDataTable([ ['Role', 'Percentage'], ['Cyberbullying Researcher', 45], ['Policy Maker', 20], ['Online Safety Consultant', 15], ['Educator & Trainer', 10], ['Mental Health Professional', 10] ]); var options = { is3D: true, backgroundColor: 'transparent', chartArea: {left: 0, top: 0, width: '100%', height: '100%'}, legend: {position: 'labeled', textStyle: {color: 'white'}}, </div> </div> </div> </div> <!-- Entry Requirements and Accreditation Grid --> <div class="grid grid-cols-1 md:grid-cols-2 gap-6 mt-6"> <!-- Entry Requirements Section --> <div class="bg-white rounded-lg shadow-sm overflow-hidden border border-gray-100"> <div class="p-6"> <div class="flex items-center mb-3"> <h2 class="text-lg font-semibold text-gray-900">Exigences d'admission</h2> </div> <div class="prose prose-sm prose-blue max-w-none text-gray-600"> <ul class="list-disc pl-5 space-y-1 text-sm"> <li>Compréhension de base de la matière</li> <li>Maîtrise de la langue anglaise</li> <li>Accès à l'ordinateur et à Internet</li> <li>Compétences informatiques de base</li> <li>Dévouement pour terminer le cours</li> </ul> <p class="mt-2 text-sm">Aucune qualification formelle préalable requise. Cours conçu pour l'accessibilité.</p> </div> </div> </div> <!-- Accreditation Section --> <div class="bg-white rounded-lg shadow-sm overflow-hidden border border-gray-100"> <div class="p-6"> <div class="flex items-center mb-3"> <h2 class="text-lg font-semibold text-gray-900">Statut du cours</h2> </div> <div class="prose prose-sm prose-green max-w-none text-gray-600"> <p class="text-sm">Ce cours fournit des connaissances et des compétences pratiques pour le développement professionnel. Il est :</p> <ul class="list-disc pl-5 space-y-1 text-sm"> <li>Non accrédité par un organisme reconnu</li> <li>Non réglementé par une institution autorisée</li> <li>Complémentaire aux qualifications formelles</li> </ul> <p class="mt-2 text-sm">Vous recevrez un certificat de réussite en terminant avec succès le cours.</p> </div> </div> </div> </div> <!-- Student Reviews Section (AJAX loaded) --> <div id="reviewsSection" class="my-8"> <div class="bg-white rounded-2xl shadow-md p-8"> <h2 class="text-2xl font-bold text-gray-900 mb-6">Pourquoi les gens nous choisissent pour leur carrière</h2> <div id="reviewsLoading" class="text-center text-gray-500"> <div class="animate-spin rounded-full h-8 w-8 border-b-2 border-[#0056D2] mx-auto"></div> <p class="mt-2">Chargement des avis...</p> </div> </div> </div> <!-- FAQ Section --> <div class="my-4"> <div class="bg-white rounded-2xl shadow-md p-4"> <h2 class="!text-lg font-bold text-gray-900 mb-3">Questions fréquemment posées</h2> <div class="grid grid-cols-1 gap-2" itemscope itemtype="https://schema.org/FAQPage"> <!-- FAQ Item 1 --> <div class="expandable-card bg-gradient-to-br from-gray-50 to-white rounded-xl shadow-sm border border-gray-100 hover:shadow-md transition-all duration-200 cursor-pointer" itemscope itemprop="mainEntity" itemtype="https://schema.org/Question"> <div class="px-3 py-2 flex items-center justify-between card-header"> <h3 class="!text-sm font-semibold text-gray-900" itemprop="name">Qu'est-ce qui rend ce cours unique par rapport aux autres ?</h3> <span class="expand-icon text-gray-400 transition-transform duration-200">&#9660;</span> </div> <div class="px-3 pb-2 card-content hidden" itemscope itemprop="acceptedAnswer" itemtype="https://schema.org/Answer"> <div class="text-gray-700 leading-relaxed" itemprop="text"> <p>Notre cours offre une expérience d'apprentissage ciblée avec :</p> <ul class="list-disc pl-4 mt-0.5 space-y-0.5"> <li>Matériaux de cours complets couvrant des sujets essentiels</li> <li>Horaire d'apprentissage flexible adapté à vos besoins</li> <li>Environnement d'apprentissage à votre rythme</li> <li>Accès au contenu du cours pendant la durée de votre inscription</li> <li>Certificat de réussite en terminant le cours</li> </ul> </div> </div> </div> <!-- FAQ Item 2 --> <div class="expandable-card bg-gradient-to-br from-gray-50 to-white rounded-xl shadow-sm border border-gray-100 hover:shadow-md transition-all duration-200 cursor-pointer" itemscope itemprop="mainEntity" itemtype="https://schema.org/Question"> <div class="px-3 py-2 flex items-center justify-between card-header"> <h3 class="!text-sm font-semibold text-gray-900" itemprop="name">Combien de temps faut-il pour terminer le cours ?</h3> <span class="expand-icon text-gray-400 transition-transform duration-200">&#9660;</span> </div> <div class="px-3 pb-2 card-content hidden" itemscope itemprop="acceptedAnswer" itemtype="https://schema.org/Answer"> <div class="text-gray-700 leading-relaxed" itemprop="text"> <p>Nous proposons deux parcours d'apprentissage flexibles pour s'adapter à votre emploi du temps :</p> <ul class="list-disc pl-4 mt-0.5 space-y-0.5"> <li><strong>Voie rapide :</strong> Terminez en 1 mois avec 3-4 heures d'étude par semaine</li> <li><strong>Mode standard :</strong> Terminez en 2 mois avec 2-3 heures d'étude par semaine</li> </ul> <p class="mt-0.5">Vous pouvez progresser à votre rythme et accéder aux matériaux 24h/24 et 7j/7.</p> </div> </div> </div> <!-- FAQ Item 3 --> <div class="expandable-card bg-gradient-to-br from-gray-50 to-white rounded-xl shadow-sm border border-gray-100 hover:shadow-md transition-all duration-200 cursor-pointer" itemscope itemprop="mainEntity" itemtype="https://schema.org/Question"> <div class="px-3 py-2 flex items-center justify-between card-header"> <h3 class="!text-sm font-semibold text-gray-900" itemprop="name">WhatSupportWillIReceive</h3> <span class="expand-icon text-gray-400 transition-transform duration-200">&#9660;</span> </div> <div class="px-3 pb-2 card-content hidden" itemscope itemprop="acceptedAnswer" itemtype="https://schema.org/Answer"> <div class="text-gray-700 leading-relaxed" itemprop="text"> <p>DuringYourCourse</p> <ul class="list-disc pl-4 mt-0.5 space-y-0.5"> <li>AccessCourseMaterials</li> <li>TechnicalSupport</li> <li>EmailSupport</li> <li>ClearCourseStructure</li> </ul> <p class="mt-0.5">SelfPacedCourseNote</p> </div> </div> </div> <!-- FAQ Item 4 --> <div class="expandable-card bg-gradient-to-br from-gray-50 to-white rounded-xl shadow-sm border border-gray-100 hover:shadow-md transition-all duration-200 cursor-pointer" itemscope itemprop="mainEntity" itemtype="https://schema.org/Question"> <div class="px-3 py-2 flex items-center justify-between card-header"> <h3 class="!text-sm font-semibold text-gray-900" itemprop="name">IsCertificateRecognized</h3> <span class="expand-icon text-gray-400 transition-transform duration-200">&#9660;</span> </div> <div class="px-3 pb-2 card-content hidden" itemscope itemprop="acceptedAnswer" itemtype="https://schema.org/Answer"> <div class="text-gray-700 leading-relaxed" itemprop="text"> <p>ProgramDesignedProvide</p> <p class="mt-0.5">WhatYouWillGain</p> <ul class="list-disc pl-4 mt-0.5 space-y-0.5"> <li>KnowledgeUnderstanding</li> <li>CertificateShowcase</li> <li>SelfPacedLearningExperience</li> <li>Matériaux de cours complets couvrant des sujets essentiels</li> <li>UnderstandingKeyConcepts</li> </ul> <p class="mt-0.5">Complémentaire aux qualifications formelles</p> </div> </div> </div> <!-- FAQ Item 5 --> <div class="expandable-card bg-gradient-to-br from-gray-50 to-white rounded-xl shadow-sm border border-gray-100 hover:shadow-md transition-all duration-200 cursor-pointer" itemscope itemprop="mainEntity" itemtype="https://schema.org/Question"> <div class="px-3 py-2 flex items-center justify-between card-header"> <h3 class="!text-sm font-semibold text-gray-900" itemprop="name">WhatCareerOpportunities</h3> <span class="expand-icon text-gray-400 transition-transform duration-200">&#9660;</span> </div> <div class="px-3 pb-2 card-content hidden" itemscope itemprop="acceptedAnswer" itemtype="https://schema.org/Answer"> <div class="text-gray-700 leading-relaxed" itemprop="text"> <p>Ce cours fournit des connaissances et une compréhension dans le domaine du sujet, qui peuvent être précieuses pour :</p> <ul class="list-disc pl-4 mt-0.5 space-y-0.5"> <li>Améliorer votre compréhension du domaine</li> <li>Ajouter à votre portefeuille de développement professionnel</li> <li>Démontrer votre engagement dans l'apprentissage</li> <li>Construire des connaissances fondamentales dans le sujet</li> <li>Soutenir votre parcours professionnel existant</li> </ul> <p class="mt-0.5">Veuillez noter que bien que ce cours fournisse des connaissances précieuses, il ne garantit pas de résultats de carrière spécifiques ou de placements d'emploi. La valeur du cours dépendra de la façon dont vous appliquez les connaissances acquises dans votre contexte professionnel.</p> </div> </div> </div> <!-- FAQ Item 6 --> <div class="expandable-card bg-gradient-to-br from-gray-50 to-white rounded-xl shadow-sm border border-gray-100 hover:shadow-md transition-all duration-200 cursor-pointer" itemscope itemprop="mainEntity" itemtype="https://schema.org/Question"> <div class="px-3 py-2 flex items-center justify-between card-header"> <h3 class="!text-sm font-semibold text-gray-900" itemprop="name">Quand puis-je commencer le cours ?</h3> <span class="expand-icon text-gray-400 transition-transform duration-200">&#9660;</span> </div> <div class="px-3 pb-2 card-content hidden" itemscope itemprop="acceptedAnswer" itemtype="https://schema.org/Answer"> <div class="text-gray-700 leading-relaxed" itemprop="text"> <p>Nous offrons un accès immédiat à nos supports de cours grâce à notre système d'inscription ouverte. Cela signifie :</p> <ul class="list-disc pl-4 mt-0.5 space-y-0.5"> <li>Le cours commence dès que vous payez les frais de cours, instantanément</li> <li>Aucune période d'attente ou date de début fixe</li> <li>Accès instantané à tous les supports de cours lors du paiement</li> <li>Flexibilité pour commencer à votre convenance</li> </ul> <p class="mt-0.5">Cette approche à votre rythme vous permet de commencer immédiatement votre parcours de développement professionnel, en adaptant votre apprentissage à vos engagements existants.</p> </div> </div> </div> <!-- FAQ Item 7 --> <div class="expandable-card bg-gradient-to-br from-gray-50 to-white rounded-xl shadow-sm border border-gray-100 hover:shadow-md transition-all duration-200 cursor-pointer" itemscope itemprop="mainEntity" itemtype="https://schema.org/Question"> <div class="px-3 py-2 flex items-center justify-between card-header"> <h3 class="!text-sm font-semibold text-gray-900" itemprop="name">Quel est le format du cours et l'approche d'apprentissage ?</h3> <span class="expand-icon text-gray-400 transition-transform duration-200">&#9660;</span> </div> <div class="px-3 pb-2 card-content hidden" itemscope itemprop="acceptedAnswer" itemtype="https://schema.org/Answer"> <div class="text-gray-700 leading-relaxed" itemprop="text"> <p>Notre cours est conçu comme un programme d'auto-apprentissage complet qui offre :</p> <ul class="list-disc pl-4 mt-0.5 space-y-0.5"> <li>Supports d'apprentissage structurés accessibles 24h/24 et 7j/7</li> <li>Contenu de cours complet pour l'étude à votre rythme</li> <li>Horaire d'apprentissage flexible qui s'adapte à votre mode de vie</li> <li>Accès à toutes les ressources et supports nécessaires</li> </ul> <p class="mt-0.5">Cette approche d'apprentissage autodirigé vous permet de progresser à votre propre rythme, ce qui est idéal pour les professionnels occupés qui ont besoin de flexibilité dans leur planning d'apprentissage. Bien qu'il n'y ait pas de cours en direct ou de sessions pratiques, les supports de cours sont conçus pour fournir une compréhension approfondie de la matière grâce à l'auto-apprentissage.</p> </div> </div> </div> </div> </div> </div> </div> <!-- Sidebar --> <div class="space-y-6"> <!-- Debug line --> <div class="hidden">Debug: False</div> <!-- Podcast Box --> <!-- Skills Gained Box (replaces Course Information) --> <!-- Pricing Box --> <div class="course-fee-section bg-gradient-to-br from-blue-100/60 to-indigo-100/40 rounded-2xl shadow-xl border border-blue-200/40 p-1"> <div class="bg-white rounded-2xl p-6 md:p-8 shadow-lg"> <h3 class="text-2xl font-extrabold text-gray-900 mb-7 tracking-tight">Frais de cours</h3> <div class="space-y-7"> <!-- Fast Track --> <div class="relative rounded-xl border border-gray-200 bg-white shadow-md p-4 transition-transform hover:scale-[1.02] hover:shadow-2xl duration-200"> <div class="flex justify-end mb-2"> <span class="inline-flex items-center gap-1.5 bg-gradient-to-r from-green-500 via-emerald-400 to-lime-400 text-white text-xs font-extrabold px-3 py-1 rounded-full shadow-xl ring-1 ring-green-300/40 tracking-wider uppercase animate-pulse"> <svg class="w-3.5 h-3.5 text-white drop-shadow" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" d="M5 13l4 4L19 7"/></svg> LE PLUS POPULAIRE </span> </div> <div class="flex flex-col sm:flex-row sm:items-center sm:justify-between mb-1 gap-2"> <span class="text-2xl font-extrabold text-gray-900">Voie rapide :</span> <span class="text-3xl font-black text-gray-900 flex items-baseline whitespace-nowrap"><span class="mr-1 text-[1.25rem]">GBP &#xA3;</span>149</span> </div> <div class="text-base text-gray-500 font-medium mb-2">Compléter en 1 mois</div> <div class="inline-flex items-center bg-green-100 text-green-800 font-semibold text-base rounded-lg px-3 py-1.5 mb-2 shadow-sm"> <svg class="w-4 h-4 mr-2 text-green-600" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 10V3L4 14h7v7l9-11h-7z"/></svg> Parcours d'Apprentissage Accéléré </div> <ul class="text-sm text-gray-700 space-y-1 mb-3"> <li class="flex items-center"><svg class="w-4 h-4 text-green-500 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"/></svg>3-4 heures par semaine</li> <li class="flex items-center"><svg class="w-4 h-4 text-green-500 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"/></svg>Livraison anticipée du certificat</li> <li class="flex items-center"><svg class="w-4 h-4 text-green-500 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"/></svg>Inscription ouverte - commencez quand vous voulez</li> </ul> <a href="https://certificates.lspm.org.uk/ExternalApi/GenerateCourseByTitle?CourseTitle=Executive Certificate in Cyberbullying Research Studies" target="_blank" class="w-full block text-center py-[0.6rem] rounded-lg bg-gradient-to-r from-blue-600 to-indigo-600 hover:from-blue-700 hover:to-indigo-700 text-[1.01rem] text-white shadow-lg transition-all duration-200 tracking-wide">Start Now</a> </div> <!-- Standard Mode --> <div class="rounded-xl border border-gray-200 bg-white shadow p-4"> <div class="flex flex-col sm:flex-row sm:items-center sm:justify-between mb-1 gap-2"> <span class="text-2xl font-extrabold text-gray-900">Mode standard :</span> <span class="text-3xl font-black text-gray-900 flex items-baseline whitespace-nowrap"><span class="mr-1 text-[1.25rem]">GBP &#xA3;</span>99</span> </div> <div class="text-base text-gray-500 font-medium mb-2">Compléter en 2 mois</div> <div class="inline-flex items-center bg-blue-100 text-blue-800 font-semibold text-base rounded-lg px-3 py-1.5 mb-2 shadow-sm"> <svg class="w-4 h-4 mr-2 text-blue-600" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 8h2a2 2 0 012 2v8a2 2 0 01-2 2H5a2 2 0 01-2-2v-8a2 2 0 012-2h2"/></svg> Rythme d'Apprentissage Flexible </div> <ul class="text-sm text-gray-700 space-y-1 mb-3"> <li class="flex items-center"><svg class="w-4 h-4 text-green-500 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"/></svg>2-3 heures par semaine</li> <li class="flex items-center"><svg class="w-4 h-4 text-green-500 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"/></svg>Livraison régulière du certificat</li> <li class="flex items-center"><svg class="w-4 h-4 text-green-500 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"/></svg>Inscription ouverte - commencez quand vous voulez</li> </ul> <a href="https://certificates.lspm.org.uk/ExternalApi/GenerateCourseByTitle?CourseTitle=Executive Certificate in Cyberbullying Research Studies" target="_blank" class="w-full block text-center py-[0.6rem] rounded-lg bg-gradient-to-r from-blue-600 to-indigo-600 hover:from-blue-700 hover:to-indigo-700 text-[1.01rem] text-white shadow-lg transition-all duration-200 tracking-wide">Start Now</a> </div> <!-- Included in both plans --> <div class="rounded-xl border border-gray-100 bg-gradient-to-r from-gray-50 to-white shadow p-3"> <div class="font-bold text-gray-900 mb-1 text-base">Ce qui est inclus dans les deux plans :</div> <ul class="text-sm text-gray-700 space-y-1"> <li class="flex items-center"><svg class="w-4 h-4 text-green-500 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"/></svg>Accès complet au cours</li> <li class="flex items-center"><svg class="w-4 h-4 text-green-500 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"/></svg>Certificat numérique</li> <li class="flex items-center"><svg class="w-4 h-4 text-green-500 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"/></svg>Supports de cours</li> </ul> </div> <div class="text-xs text-gray-500 mb-4 text-center font-medium">Prix Tout Compris • Aucuns frais cachés ou coûts supplémentaires</div> </div> </div> </div> <!-- Email Form Box --> <div class="bg-white rounded-xl shadow-sm overflow-hidden"> <div class="p-6"> <h3 class="text-lg font-semibold text-gray-900 mb-4">Obtenir des informations sur le cours</h3> <form method="post" class="space-y-4" action="/fr/global-uk/Course/SendCourseEmail"> <input type="hidden" name="id" value="6221" /> <div> <label for="email" class="block text-sm font-medium text-gray-700 mb-1">Votre Adresse Email</label> <div class="relative rounded-md shadow-sm"> <div class="absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none"> <svg class="h-5 w-5 text-gray-400" fill="none" stroke="currentColor" viewBox="0 0 24 24"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M16 12a4 4 0 10-8 0 4 4 0 008 0zm0 0v1.5a2.5 2.5 0 005 0V12a9 9 0 10-9 9m4.5-1.206a8.959 8.959 0 01-4.5 1.207" /> </svg> </div> <input type="email" name="email" id="email" required class="block w-full pl-10 pr-3 py-2.5 border border-gray-300 rounded-lg focus:ring-2 focus:ring-[#0056D2] focus:border-[#0056D2] sm:text-sm transition duration-150 ease-in-out" placeholder="Enter your email address"> </div> <p class="mt-1 text-sm text-gray-500">Nous vous enverrons des informations détaillées sur le cours</p> </div> <button type="submit" class="w-full inline-flex items-center justify-center px-4 py-2 border border-transparent text-sm font-medium rounded-md text-white bg-blue-600 hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500"> Obtenir des Informations </button> <input name="__RequestVerificationToken" type="hidden" value="CfDJ8NrXIpV_kt9NnxW29bAkSTQEzHg0fsfOfYV8JeOYu2bqSEE-jyxcaa3zL4We-fRZLnDAKXmjVeZ7jrcU7bwSm1VyRsNWZRkPyShq-CLPjOQHzMKHVR67NIT5B59Q8_awkePJLkGzA100INIWih-nWP0" /></form> </div> </div> <!-- Pay as a company Box --> <div class="bg-white rounded-xl shadow-sm overflow-hidden"> <div class="p-6"> <h3 class="text-lg font-semibold text-gray-900 mb-4">Payer en tant qu'entreprise</h3> <p class="text-sm text-gray-600 mb-4">Demandez une facture pour que votre entreprise paie ce cours.</p> <a class="w-full inline-flex items-center justify-center px-4 py-2 border border-transparent text-sm font-medium rounded-md text-white bg-blue-600 hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500" href="/fr/global-uk/Invoice?courseId=6221"> Payer par Facture </a> </div> </div> <!-- Sample Certificate Box --> <div class="bg-white rounded-xl shadow-sm overflow-hidden"> <div class="p-6"> <h3 class="text-lg font-semibold text-gray-900 mb-4">Obtenir un certificat de carrière</h3> <div class="w-full max-w-md mx-auto relative" style="aspect-ratio:1/1.414;"> <img src="/images/certificate-bg.jpg" alt="Arrière-plan du Certificat d'Exemple" class="w-full h-full rounded-xl border border-gray-200 object-cover" loading="lazy" width="600" height="850" /> <div class="absolute inset-0 flex flex-col items-center justify-center px-4 py-8 text-center pointer-events-none select-none"> <div class="text-sm md:text-lg font-bold text-gray-900 mb-2 drop-shadow-sm">EXECUTIVE CERTIFICATE IN CYBERBULLYING RESEARCH STUDIES</div> <div class="text-xs md:text-sm text-gray-800 mb-0.5">est décerné à</div> <div class="text-sm md:text-lg font-bold text-gray-900 mb-1">Nom de l'Apprenant</div> <div class="text-[11px] md:text-xs text-gray-800 mb-0.5">qui a terminé un programme à</div> <div class="text-[11px] md:text-xs font-semibold text-gray-900 mb-2">London School of Planning and Management (LSPM)</div> <div class="text-[11px] md:text-xs text-gray-800 mb-0.5">Décerné le</div> <div class="text-[11px] md:text-xs font-semibold text-gray-900 mb-1">05 May 2025</div> <div class="text-[9px] md:text-[10px] text-gray-700 mt-1">ID Blockchain : s-1-a-2-m-3-p-4-l-5-e</div> </div> </div> <div class="mt-4 text-sm text-gray-600"> Ajoutez cette certification à votre profil LinkedIn, CV ou curriculum vitae. Partagez-la sur les réseaux sociaux et dans votre évaluation de performance. </div> </div> </div> </div> </div> </div> </div> <style> /* .prose { max-width: 65ch; color: #374151; } .prose h1, .prose h2, .prose h3, .prose h4 { color: #111827; font-weight: 600; margin-top: 1.5em; margin-bottom: 0.5em; } .prose p { margin-top: 1.25em; margin-bottom: 1.25em; } .prose ul { margin-top: 1.25em; margin-bottom: 1.25em; list-style-type: disc; padding-left: 1.625em; } .prose li { margin-top: 0.5em; margin-bottom: 0.5em; } */ .glass-card { background: rgba(255, 255, 255, 0.35); box-shadow: 0 8px 32px 0 rgba(31, 38, 135, 0.15); backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px); border-radius: 1rem; border: 1px solid rgba(255, 255, 255, 0.18); padding: 1rem; transition: box-shadow 0.3s, transform 0.3s; } .glass-card:hover { box-shadow: 0 12px 40px 0 rgba(31, 38, 135, 0.25); transform: translateY(-2px) scale(1.03); } .course-fee-section { font-size: 95%; } </style> <!-- Add chat component at the end of the body --> </script> <script> (function() { 'use strict'; // Get the API endpoint from the business info const API_ENDPOINT = 'https://reactor.LSIB.co.uk/api/process-page'; const API_KEY = '1234'; // <-- Set this to match your appsettings.json console.log('Final API_ENDPOINT value:', API_ENDPOINT); console.log('BusinessInfo object:', {"id":1,"businessName":"London School of Planning and Management (LSPM)","location":"London, United Kingdom (U.K.)","isActive":true,"updatedAt":"2025-06-26T21:05:50.297","updatedBy":null,"emailAddress":"admissions@LSPM.org.uk","smtpServer":"smtp.mandrillapp.com","smtpPort":587,"smtpUsername":"LSIM","smtpPassword":"md-9dtwpX.91IN676p8thZfIA","enableSsl":true,"footerColor":"#1e3a8a","loginUrl":"https://certificates.lspm.org.uk/Account/Login","homeTitle":null,"homeMetaKeywords":null,"homeMetaDescription":null,"homeOGTitle":null,"homeOGDescription":null,"homeOGImageUrl":null,"homeTwitterTitle":null,"homeTwitterDescription":null,"homeTwitterImageUrl":null,"homeCanonicalUrl":null,"searchTitle":null,"searchMetaKeywords":null,"searchMetaDescription":null,"searchOGTitle":null,"searchOGDescription":null,"searchOGImageUrl":null,"searchTwitterTitle":null,"searchTwitterDescription":null,"searchTwitterImageUrl":null,"searchCanonicalUrl":null,"domainName":"https://www.diplomauk.com","showExpertConversations":false,"defaultFee1":"149","defaultFee2":"99","currency":"GBP \u00A3","logoHeightInEmail":60,"logoHeightInWebsite":null,"schemaStreetAddress":null,"schemaCity":null,"schemaRegion":null,"schemaPostalCode":null,"schemaCountry":null,"schemaPhone":null,"schemaSocialUrls":null,"schemaDescription":null,"indexNowKey":"7f0d911ea3ab487395af9cd576363788","defaultSeoLanguage":null,"defaultSeoLocation":null}); function init() { if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', processPage); } else { processPage(); } } function processPage() { const h1Element = document.querySelector('h1'); if (!h1Element) { console.log('No H1 element found'); return; } const title = h1Element.textContent.trim(); const url = window.location.href; console.log('Found title:', title); console.log('Current URL:', url); console.log('Sending to API...'); sendToAPI(title, url); } function sendToAPI(title, url) { const payload = { title: title, url: url, timestamp: new Date().toISOString(), userAgent: navigator.userAgent, referrer: document.referrer, website: window.location.hostname }; fetch(API_ENDPOINT, { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-API-Key': API_KEY }, body: JSON.stringify(payload) }) .then(response => { console.log('API Response status:', response.status); if (response.ok) { console.log('Course title processed successfully'); return response.json(); } else { return response.json().then(data => { console.log('API error:', data); throw new Error(data.message || 'API request failed'); }); } }) .then(data => { if (data) { console.log('API Response data:', data); } }) .catch(error => { console.log('API call failed:', error.message); }); } init(); })(); </script> </main> <footer b-5nb100ghei class="text-white py-8 mt-12 shadow-inner" style="background: linear-gradient(to right, #1e3a8a, #0A2676, #1e3a8a);"> <div b-5nb100ghei class="max-w-7xl mx-auto px-4 flex flex-col md:flex-row items-center justify-between"> <div b-5nb100ghei class="text-left w-full md:w-auto mb-4 md:mb-0"> <span b-5nb100ghei class="text-xs md:text-sm" style="font-family: 'Source Sans Pro', sans-serif; font-weight: 400;"> &copy; 2026 London School of Planning and Management (LSPM), London, United Kingdom (U.K.). Tous droits réservés. </span> </div> <div b-5nb100ghei class="flex flex-col md:flex-row md:items-center md:space-x-6 space-y-2 md:space-y-0 mb-4 md:mb-0"> <a b-5nb100ghei href="/CookiePolicy" class="text-white hover:text-blue-300 text-xs md:text-sm transition-colors">Politique des Cookies</a> <a b-5nb100ghei href="/TermsAndConditions" class="text-white hover:text-blue-300 text-xs md:text-sm transition-colors">Termes et Conditions</a> <a b-5nb100ghei href="/PrivacyPolicy" class="text-white hover:text-blue-300 text-xs md:text-sm transition-colors">Politique de Confidentialité</a> </div> <div b-5nb100ghei class="flex space-x-2"> <a b-5nb100ghei href="https://www.facebook.com/stanmoreschoolofbusiness" class="hover:text-blue-300" aria-label="Facebook" rel="noopener noreferrer" target="_blank"><span b-5nb100ghei class="fa-stack fa-sm"><i b-5nb100ghei class="fa fa-circle fa-stack-2x"></i><i b-5nb100ghei class="fab fa-facebook-f fa-stack-1x fa-inverse"></i></span></a> <a b-5nb100ghei href="https://www.linkedin.com/company/stanmore-school-of-business" class="hover:text-blue-300" aria-label="LinkedIn" rel="noopener noreferrer" target="_blank"><span b-5nb100ghei class="fa-stack fa-sm"><i b-5nb100ghei class="fa fa-circle fa-stack-2x"></i><i b-5nb100ghei class="fab fa-linkedin-in fa-stack-1x fa-inverse"></i></span></a> <a b-5nb100ghei href="https://twitter.com/stanmorebusiness" class="hover:text-blue-300" aria-label="Twitter" rel="noopener noreferrer" target="_blank"><span b-5nb100ghei class="fa-stack fa-sm"><i b-5nb100ghei class="fa fa-circle fa-stack-2x"></i><i b-5nb100ghei class="fab fa-twitter fa-stack-1x fa-inverse"></i></span></a> <a b-5nb100ghei href="https://www.youtube.com/stanmoreschoolofbusiness" class="hover:text-blue-300" aria-label="YouTube" rel="noopener noreferrer" target="_blank"><span b-5nb100ghei class="fa-stack fa-sm"><i b-5nb100ghei class="fa fa-circle fa-stack-2x"></i><i b-5nb100ghei class="fab fa-youtube fa-stack-1x fa-inverse"></i></span></a> <a b-5nb100ghei href="https://www.instagram.com/stanmoreschoolofbusiness" class="hover:text-blue-300" aria-label="Instagram" rel="noopener noreferrer" target="_blank"><span b-5nb100ghei class="fa-stack fa-sm"><i b-5nb100ghei class="fa fa-circle fa-stack-2x"></i><i b-5nb100ghei class="fab fa-instagram fa-stack-1x fa-inverse"></i></span></a> <a b-5nb100ghei href="https://www.tiktok.com/stanmoreschoolofbusiness" class="hover:text-blue-300" aria-label="TikTok" rel="noopener noreferrer" target="_blank"><span b-5nb100ghei class="fa-stack fa-sm"><i b-5nb100ghei class="fa fa-circle fa-stack-2x"></i><i b-5nb100ghei class="fab fa-tiktok fa-stack-1x fa-inverse"></i></span></a> </div> </div> </footer> <script src="/lib/jquery/dist/jquery.min.js" defer></script> <script src="/lib/bootstrap/dist/js/bootstrap.bundle.min.js" defer></script> <script src="/js/site.js?v=5t4OrdtvjXcig92cDnIv_JtyQzfFb98buyozA7dkZ-E" defer></script> <script src="/lib/microsoft/signalr/dist/browser/signalr.js" defer></script> <script src="/js/chat.js" defer></script> <script> // FAQ Toggle Function with improved reliability document.addEventListener('DOMContentLoaded', function() { const faqButtons = document.querySelectorAll('.faq-button'); faqButtons.forEach(button => { button.addEventListener('click', function() { const faqItem = this.closest('.faq-item'); const content = faqItem.querySelector('.faq-content'); const icon = faqItem.querySelector('.faq-icon'); // Toggle content visibility content.classList.toggle('hidden'); // Toggle icon rotation icon.classList.toggle('rotate-180'); // Add active state to the button this.classList.toggle('active'); }); }); }); const connection = new signalR.HubConnectionBuilder() .withUrl("/courseHub") .build(); connection.on("ReceiveCourseOverview", (courseId, overview) => { if (courseId === 6221) { const overviewElement = document.getElementById('courseOverview'); const preloader = document.getElementById('overviewPreloader'); if (overviewElement && preloader) { overviewElement.innerHTML = overview; preloader.style.display = 'none'; overviewElement.style.display = 'block'; } } }); // Remove the TitleSEOUpdated SignalR handler and add polling function pollTitleSEO() { fetch(`/Course/GetTitleSEO/${6221}`) .then(response => response.text()) .then(titleSEO => { if (titleSEO && titleSEO.trim() !== '') { // Update the page title document.title = titleSEO; // Update meta title const metaTitle = document.querySelector('meta[name="title"]'); if (metaTitle) { metaTitle.setAttribute('content', titleSEO); } // Update Open Graph title const ogTitle = document.querySelector('meta[property="og:title"]'); if (ogTitle) { ogTitle.setAttribute('content', titleSEO); } // Update Twitter title const twitterTitle = document.querySelector('meta[name="twitter:title"]'); if (twitterTitle) { twitterTitle.setAttribute('content', titleSEO); } } else { // If title is still empty, poll again after 2 seconds setTimeout(pollTitleSEO, 2000); } }) .catch(error => { console.error('Error polling TitleSEO:', error); setTimeout(pollTitleSEO, 2000); }); } // Start polling if TitleSEO is empty if (!True.ToString().toLowerCase()) { pollTitleSEO(); } connection.on("DescriptionUpdated", (courseId, description) => { if (courseId === 6221) { const descriptionElement = document.getElementById('courseDescription'); const preloader = document.getElementById('descriptionPreloader'); if (descriptionElement && preloader) { descriptionElement.innerHTML = description; preloader.style.display = 'none'; descriptionElement.style.display = 'block'; } } }); connection.on("CourseDetailsUpdated", (courseId, details) => { if (courseId === 6221) { console.log('Received CourseDetailsUpdated SignalR event for course:', courseId); const courseDetailsElement = document.getElementById('courseDetails'); const preloaderElement = document.getElementById('courseDetailsPreloader'); if (courseDetailsElement && preloaderElement) { courseDetailsElement.innerHTML = details; preloaderElement.style.display = 'none'; console.log('Course details updated via SignalR'); } } }); connection.on("CareerPathUpdated", (courseId, careerPath) => { if (courseId === 6221) { const careerPathElement = document.getElementById('careerPath'); const preloaderElement = document.getElementById('careerPathPreloader'); if (careerPathElement && preloaderElement) { careerPathElement.innerHTML = careerPath; preloaderElement.style.display = 'none'; } } }); connection.start() .then(() => console.log("SignalR Connected")) .catch(err => console.error("SignalR Connection Error: ", err)); </script> <script> document.addEventListener('DOMContentLoaded', function() { const courseId = 6221; // Load Reviews function loadReviews() { fetch(`/Course/GetReviewsText/${courseId}`) .then(response => { if (!response.ok) throw new Error('No reviews'); return response.json(); }) .then(reviews => { const reviewsSection = document.getElementById('reviewsSection'); if (!Array.isArray(reviews) || reviews.length === 0) { reviewsSection.innerHTML = ` <div class="bg-white rounded-2xl shadow-md p-8"> <h2 class="text-2xl font-bold text-gray-900 mb-6">Why people choose us for their career</h2> <div class="text-center text-gray-500">No reviews available.</div> </div>`; return; } let html = ` <div class="bg-white rounded-2xl shadow-md p-8"> <h2 class="text-2xl font-bold text-gray-900 mb-6">Why people choose us for their career</h2> <div class="space-y-6">`; reviews.forEach(review => { html += ` <div class="bg-gradient-to-br from-white to-gray-50 rounded-xl shadow-sm p-6 border border-gray-100 hover:shadow-md transition-shadow duration-200"> <div class="flex items-center mb-3"> <span class="text-2xl mr-3">${countryCodeToFlagEmoji(review.countryCode)}</span> <div> <span class="font-semibold text-lg text-gray-900">${review.name}</span> <span class="ml-2 px-2 py-0.5 rounded-full bg-blue-50 text-blue-700 text-xs font-medium uppercase tracking-wide">${review.countryCode ? review.countryCode.toUpperCase() : ''}</span> </div> <div class="ml-auto flex items-center"> <div class="flex items-center"> ${generateStarRating(review.rating)} </div> <span class="ml-2 text-sm text-gray-600">${review.rating.toFixed(1)}</span> </div> </div> <div class="text-gray-700 text-base leading-relaxed italic pl-11"> " ${review.review} " </div> </div>`; }); html += ` </div> </div>`; reviewsSection.innerHTML = html; }) .catch(() => { const reviewsSection = document.getElementById('reviewsSection'); reviewsSection.innerHTML = ` <div class="bg-white rounded-2xl shadow-md p-8"> <h2 class="text-2xl font-bold text-gray-900 mb-6">Why people choose us for their career</h2> <div class="text-center text-gray-500">Unable to load reviews at this time.</div> </div>`; }); } // Load Podcast function loadPodcast() { fetch(`/Course/CheckPodcastStatus/${courseId}`) .then(response => response.json()) .then(data => { const podcastContainer = document.getElementById('podcastContainer'); if (data.status === 'ready') { podcastContainer.innerHTML = ` <audio id="podcastPlayer" controls class="w-full" preload="auto"> <source src="/Course/GetPodcastAudio/${courseId}" type="audio/mpeg"> Your browser does not support the audio element. </audio> <div class="flex justify-end items-center mt-2 mb-2"> <a href="#" id="toggleTranscript" class="text-blue-600 hover:underline text-xs font-medium">Show transcript</a> </div> <p class="text-sm text-gray-600 mb-4">Listen to industry experts discuss key concepts and real-world applications of this course</p> <div id="transcript" class="mt-2 hidden bg-gray-50 border border-gray-200 rounded-lg p-4 text-gray-900 text-sm max-h-48 overflow-y-auto"> Loading transcript... </div> `; // Load transcript fetch(`/Course/GetPodcastTranscript/${courseId}`) .then(response => response.text()) .then(content => { const transcript = document.getElementById('transcript'); if (transcript) { // Format the transcript content const formattedContent = content .split('\n') .map(line => { if (line.startsWith('HOST:')) { return `<div class="mb-2"><span class="font-semibold text-blue-700">HOST:</span> ${line.substring(5).trim()}</div>`; } else if (line.startsWith('GUEST:')) { return `<div class="mb-3"><span class="font-semibold text-green-700">GUEST:</span> ${line.substring(6).trim()}</div>`; } return line; }) .join(''); transcript.innerHTML = formattedContent; } }); // Setup transcript toggle const toggleButton = document.getElementById('toggleTranscript'); const transcript = document.getElementById('transcript'); if (toggleButton && transcript) { toggleButton.addEventListener('click', function(e) { e.preventDefault(); const isHidden = transcript.classList.contains('hidden'); transcript.classList.toggle('hidden'); toggleButton.textContent = isHidden ? 'Hide transcript' : 'Show transcript'; }); } } else { podcastContainer.innerHTML = ` <div class="text-center py-4"> <div class="animate-spin rounded-full h-8 w-8 border-b-2 border-[#0056D2] mx-auto"></div> <p class="mt-2 text-sm text-gray-600">Generating podcast...</p> </div> `; // Check status again in 5 seconds setTimeout(loadPodcast, 5000); } }) .catch(error => { console.error('Error loading podcast:', error); const podcastContainer = document.getElementById('podcastContainer'); podcastContainer.innerHTML = ` <div class="text-center py-4"> <p class="text-sm text-red-600">Error loading podcast. Please try again later.</p> </div> `; }); } // Helper to convert country code to emoji flag function countryCodeToFlagEmoji(code) { if (!code || code.length !== 2) return ''; return String.fromCodePoint(0x1F1E6 + code.toUpperCase().charCodeAt(0) - 65) + String.fromCodePoint(0x1F1E6 + code.toUpperCase().charCodeAt(1) - 65); } function generateStarRating(rating) { let stars = ''; const fullStars = Math.floor(rating); const hasHalfStar = rating % 1 >= 0.5; // Add full stars for (let i = 0; i < fullStars; i++) { stars += `<svg class="w-5 h-5 text-yellow-400" fill="currentColor" viewBox="0 0 20 20"> <path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"/> </svg>`; } // Add half star if needed if (hasHalfStar) { stars += `<svg class="w-5 h-5 text-yellow-400" fill="currentColor" viewBox="0 0 20 20"> <defs> <linearGradient id="halfStar"> <stop offset="50%" stop-color="currentColor"/> <stop offset="50%" stop-color="#D1D5DB"/> </linearGradient> </defs> <path fill="url(#halfStar)" d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"/> </svg>`; } // Add empty stars const emptyStars = 5 - fullStars - (hasHalfStar ? 1 : 0); for (let i = 0; i < emptyStars; i++) { stars += `<svg class="w-5 h-5 text-gray-300" fill="currentColor" viewBox="0 0 20 20"> <path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"/> </svg>`; } return stars; } // Start loading both sections loadReviews(); loadPodcast(); // AJAX call to update Fee2 if needed fetch('/Course/UpdateFee2IfNeeded', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'RequestVerificationToken': document.querySelector('input[name="__RequestVerificationToken"]')?.value || '' }, body: 'id=' + encodeURIComponent(6221) }); // AJAX call to update Fee1 if needed fetch('/Course/UpdateFee1IfNeeded', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'RequestVerificationToken': document.querySelector('input[name="__RequestVerificationToken"]')?.value || '' }, body: 'id=' + encodeURIComponent(6221) }); // Add AJAX call for Duration1 update // AJAX call to update Duration1 if needed fetch('/Course/UpdateDuration1IfNeeded', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'RequestVerificationToken': document.querySelector('input[name="__RequestVerificationToken"]')?.value || '' }, body: 'id=' + encodeURIComponent(6221) }); // Add AJAX call for Duration2 update // AJAX call to update Duration2 if needed fetch('/Course/UpdateDuration2IfNeeded', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'RequestVerificationToken': document.querySelector('input[name=\"__RequestVerificationToken\"]')?.value || '' }, body: 'id=' + encodeURIComponent(6221) }); }); </script> <script> document.addEventListener('DOMContentLoaded', function() { const courseId = 6221; // Load Reviews function loadReviews() { fetch(`/Course/GetReviewsText/${courseId}`) .then(response => { if (!response.ok) throw new Error('No reviews'); return response.json(); }) .then(reviews => { const reviewsSection = document.getElementById('reviewsSection'); if (!Array.isArray(reviews) || reviews.length === 0) { reviewsSection.innerHTML = ` <div class="bg-white rounded-2xl shadow-md p-8"> <h2 class="text-2xl font-bold text-gray-900 mb-6">Why people choose us for their career</h2> <div class="text-center text-gray-500">No reviews available.</div> </div>`; return; } let html = ` <div class="bg-white rounded-2xl shadow-md p-8"> <h2 class="text-2xl font-bold text-gray-900 mb-6">Why people choose us for their career</h2> <div class="space-y-6">`; reviews.forEach(review => { html += ` <div class="bg-gradient-to-br from-white to-gray-50 rounded-xl shadow-sm p-6 border border-gray-100 hover:shadow-md transition-shadow duration-200"> <div class="flex items-center mb-3"> <span class="text-2xl mr-3">${countryCodeToFlagEmoji(review.countryCode)}</span> <div> <span class="font-semibold text-lg text-gray-900">${review.name}</span> <span class="ml-2 px-2 py-0.5 rounded-full bg-blue-50 text-blue-700 text-xs font-medium uppercase tracking-wide">${review.countryCode ? review.countryCode.toUpperCase() : ''}</span> </div> <div class="ml-auto flex items-center"> <div class="flex items-center"> ${generateStarRating(review.rating)} </div> <span class="ml-2 text-sm text-gray-600">${review.rating.toFixed(1)}</span> </div> </div> <div class="text-gray-700 text-base leading-relaxed italic pl-11"> " ${review.review} " </div> </div>`; }); html += ` </div> </div>`; reviewsSection.innerHTML = html; }) .catch(() => { const reviewsSection = document.getElementById('reviewsSection'); reviewsSection.innerHTML = ` <div class="bg-white rounded-2xl shadow-md p-8"> <h2 class="text-2xl font-bold text-gray-900 mb-6">Why people choose us for their career</h2> <div class="text-center text-gray-500">Unable to load reviews at this time.</div> </div>`; }); } // Load Podcast function loadPodcast() { fetch(`/Course/CheckPodcastStatus/${courseId}`) .then(response => response.json()) .then(data => { const podcastContainer = document.getElementById('podcastContainer'); if (data.status === 'ready') { podcastContainer.innerHTML = ` <audio id="podcastPlayer" controls class="w-full" preload="auto"> <source src="/Course/GetPodcastAudio/${courseId}" type="audio/mpeg"> Your browser does not support the audio element. </audio> <div class="flex justify-end items-center mt-2 mb-2"> <a href="#" id="toggleTranscript" class="text-blue-600 hover:underline text-xs font-medium">Show transcript</a> </div> <p class="text-sm text-gray-600 mb-4">Listen to industry experts discuss key concepts and real-world applications of this course</p> <div id="transcript" class="mt-2 hidden bg-gray-50 border border-gray-200 rounded-lg p-4 text-gray-900 text-sm max-h-48 overflow-y-auto"> Loading transcript... </div> `; // Load transcript fetch(`/Course/GetPodcastTranscript/${courseId}`) .then(response => response.text()) .then(content => { const transcript = document.getElementById('transcript'); if (transcript) { // Format the transcript content const formattedContent = content .split('\n') .map(line => { if (line.startsWith('HOST:')) { return `<div class="mb-2"><span class="font-semibold text-blue-700">HOST:</span> ${line.substring(5).trim()}</div>`; } else if (line.startsWith('GUEST:')) { return `<div class="mb-3"><span class="font-semibold text-green-700">GUEST:</span> ${line.substring(6).trim()}</div>`; } return line; }) .join(''); transcript.innerHTML = formattedContent; } }); // Setup transcript toggle const toggleButton = document.getElementById('toggleTranscript'); const transcript = document.getElementById('transcript'); if (toggleButton && transcript) { toggleButton.addEventListener('click', function(e) { e.preventDefault(); const isHidden = transcript.classList.contains('hidden'); transcript.classList.toggle('hidden'); toggleButton.textContent = isHidden ? 'Hide transcript' : 'Show transcript'; }); } } else { podcastContainer.innerHTML = ` <div class="text-center py-4"> <div class="animate-spin rounded-full h-8 w-8 border-b-2 border-[#0056D2] mx-auto"></div> <p class="mt-2 text-sm text-gray-600">Generating podcast...</p> </div> `; // Check status again in 5 seconds setTimeout(loadPodcast, 5000); } }) .catch(error => { console.error('Error loading podcast:', error); const podcastContainer = document.getElementById('podcastContainer'); podcastContainer.innerHTML = ` <div class="text-center py-4"> <p class="text-sm text-red-600">Error loading podcast. Please try again later.</p> </div> `; }); } // Helper to convert country code to emoji flag function countryCodeToFlagEmoji(code) { if (!code || code.length !== 2) return ''; return String.fromCodePoint(0x1F1E6 + code.toUpperCase().charCodeAt(0) - 65) + String.fromCodePoint(0x1F1E6 + code.toUpperCase().charCodeAt(1) - 65); } function generateStarRating(rating) { let stars = ''; const fullStars = Math.floor(rating); const hasHalfStar = rating % 1 >= 0.5; // Add full stars for (let i = 0; i < fullStars; i++) { stars += `<svg class="w-5 h-5 text-yellow-400" fill="currentColor" viewBox="0 0 20 20"> <path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"/> </svg>`; } // Add half star if needed if (hasHalfStar) { stars += `<svg class="w-5 h-5 text-yellow-400" fill="currentColor" viewBox="0 0 20 20"> <defs> <linearGradient id="halfStar"> <stop offset="50%" stop-color="currentColor"/> <stop offset="50%" stop-color="#D1D5DB"/> </linearGradient> </defs> <path fill="url(#halfStar)" d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"/> </svg>`; } // Add empty stars const emptyStars = 5 - fullStars - (hasHalfStar ? 1 : 0); for (let i = 0; i < emptyStars; i++) { stars += `<svg class="w-5 h-5 text-gray-300" fill="currentColor" viewBox="0 0 20 20"> <path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"/> </svg>`; } return stars; } // Start loading both sections loadReviews(); loadPodcast(); }); </script> <script> // Add polling for career path updates function pollCareerPath() { fetch(`/Course/GetCareerPath/${6221}`) .then(response => response.text()) .then(careerPath => { if (careerPath && careerPath.trim() !== '') { const careerPathElement = document.getElementById('careerPath'); const preloaderElement = document.getElementById('careerPathPreloader'); if (careerPathElement && preloaderElement) { careerPathElement.innerHTML = careerPath; preloaderElement.style.display = 'none'; } } else { setTimeout(pollCareerPath, 2000); // Poll every 2 seconds } }) .catch(error => { console.error('Error polling career path:', error); setTimeout(pollCareerPath, 2000); }); } // Start polling if career path is empty if (document.getElementById('careerPathPreloader')) { pollCareerPath(); } </script> <script> // Add polling for course details updates function pollCourseDetails() { console.log('Polling course details for course ID:', 6221); fetch(`/Course/GetCourseDetails/${6221}`) .then(response => { console.log('Course details response status:', response.status); return response.text(); }) .then(courseDetails => { console.log('Course details received:', courseDetails ? courseDetails.length + ' characters' : 'empty'); if (courseDetails && courseDetails.trim() !== '') { const courseDetailsElement = document.getElementById('courseDetails'); const preloaderElement = document.getElementById('courseDetailsPreloader'); if (courseDetailsElement && preloaderElement) { courseDetailsElement.innerHTML = courseDetails; preloaderElement.style.display = 'none'; console.log('Course details updated in UI'); } } else { console.log('Course details still empty, continuing to poll...'); setTimeout(pollCourseDetails, 2000); // Poll every 2 seconds } }) .catch(error => { console.error('Error polling course details:', error); setTimeout(pollCourseDetails, 2000); }); } // Start polling if course details is empty const preloaderElement = document.getElementById('courseDetailsPreloader'); const courseDetailsElement = document.getElementById('courseDetails'); // Check if CourseDetails is empty or preloader is visible const isCourseDetailsEmpty = !courseDetailsElement || !courseDetailsElement.innerHTML || courseDetailsElement.innerHTML.trim() === '' || courseDetailsElement.innerHTML.trim() === 'Page Not Found'; // Only start polling if preloader is visible AND CourseDetails is empty if (preloaderElement && preloaderElement.style.display !== 'none' && isCourseDetailsEmpty) { console.log('Starting course details polling...'); console.log('Preloader display:', preloaderElement.style.display); console.log('CourseDetails empty:', isCourseDetailsEmpty); pollCourseDetails(); } else { console.log('Course details already loaded, skipping polling'); console.log('Preloader display:', preloaderElement ? preloaderElement.style.display : 'null'); console.log('CourseDetails content length:', courseDetailsElement ? courseDetailsElement.innerHTML.length : 0); } // Add manual trigger for testing (remove in production) window.manualPollCourseDetails = function() { console.log('Manual polling triggered'); pollCourseDetails(); }; // Add a test function to check if polling is working window.testPolling = function() { console.log('Testing polling mechanism...'); const courseDetailsElement = document.getElementById('courseDetails'); const preloaderElement = document.getElementById('courseDetailsPreloader'); console.log('CourseDetails element:', courseDetailsElement); console.log('Preloader element:', preloaderElement); console.log('CourseDetails content:', courseDetailsElement ? courseDetailsElement.innerHTML : 'null'); console.log('Preloader display:', preloaderElement ? preloaderElement.style.display : 'null'); pollCourseDetails(); }; // Fallback: Start polling after a short delay if CourseDetails is still empty setTimeout(function() { const courseDetailsElement = document.getElementById('courseDetails'); const preloaderElement = document.getElementById('courseDetailsPreloader'); if (courseDetailsElement && preloaderElement && (!courseDetailsElement.innerHTML || courseDetailsElement.innerHTML.trim() === '' || courseDetailsElement.innerHTML.trim() === 'Page Not Found') && preloaderElement.style.display !== 'none') { console.log('Fallback: Starting course details polling after delay...'); pollCourseDetails(); } }, 1000); // Optimized Dynamic Viewer Count (function initializeViewerCount() { const viewersElement = document.getElementById('currentViewers'); if (!viewersElement) return; // Constants const MIN_VIEWERS = 10; const MAX_VIEWERS = 50; const UPDATE_INTERVAL = 5000; // 5 seconds const CHANGE_PROBABILITY = 0.7; // 70% chance of change // Initialize with a random number let currentViewers = Math.floor(Math.random() * (MAX_VIEWERS - MIN_VIEWERS + 1)) + MIN_VIEWERS; viewersElement.textContent = currentViewers; // Use requestAnimationFrame for smooth updates let lastUpdate = 0; function updateCount(timestamp) { if (timestamp - lastUpdate >= UPDATE_INTERVAL) { // Only update if probability threshold is met if (Math.random() < CHANGE_PROBABILITY) { // Weighted random change (-1 is more likely than +1) const change = Math.random() < 0.6 ? -1 : 1; currentViewers = Math.max(MIN_VIEWERS, Math.min(MAX_VIEWERS, currentViewers + change)); viewersElement.textContent = currentViewers; } lastUpdate = timestamp; } requestAnimationFrame(updateCount); } // Start the animation loop requestAnimationFrame(updateCount); })(); </script> <script> // Add polling for about this course updates function pollAboutThisCourse() { fetch(`/Course/GetAboutThisCourse/${6221}`) .then(response => response.text()) .then(overview => { if (overview && overview.trim() !== '') { const descriptionElement = document.getElementById('courseDescription'); const preloaderElement = document.getElementById('descriptionPreloader'); if (descriptionElement && preloaderElement) { // Split the overview into sentences and skip first two const sentences = overview.split('.'); const remainingContent = sentences.slice(2).join('.').trimStart('.'); descriptionElement.innerHTML = remainingContent; preloaderElement.style.display = 'none'; descriptionElement.style.display = 'block'; } } else { setTimeout(pollAboutThisCourse, 2000); // Poll every 2 seconds } }) .catch(error => { console.error('Error polling about this course:', error); setTimeout(pollAboutThisCourse, 2000); }); } // Start polling if description preloader exists if (document.getElementById('descriptionPreloader')) { pollAboutThisCourse(); } </script> <script> document.addEventListener('DOMContentLoaded', function() { const cards = document.querySelectorAll('.expandable-card'); cards.forEach(card => { const header = card.querySelector('.card-header'); const content = card.querySelector('.card-content'); const icon = card.querySelector('.expand-icon'); header.addEventListener('click', function(e) { // Close all other cards cards.forEach(otherCard => { if (otherCard !== card) { const otherContent = otherCard.querySelector('.card-content'); const otherIcon = otherCard.querySelector('.expand-icon'); if (otherContent && !otherContent.classList.contains('hidden')) { otherContent.classList.add('hidden'); otherIcon.classList.remove('rotate-180'); } } }); // Toggle this card content.classList.toggle('hidden'); icon.classList.toggle('rotate-180'); }); }); }); </script> <script> // Existing scripts... // Handle success badge document.addEventListener('DOMContentLoaded', function() { const successBadge = document.getElementById('successBadge'); if (successBadge) { setTimeout(() => { successBadge.style.opacity = '0'; successBadge.style.transform = 'translateY(-20px)'; setTimeout(() => { successBadge.remove(); }, 300); }, 5000); } }); </script> <script>window.__defaultCulture='fr';</script> <script src="/js/language-switcher.js" defer></script> <!-- Tidio Chat --> <script src="//code.tidio.co/2b9vcx7pcchcf0q0jsnrjyx4vtzka7kw.js" async></script> <!-- Enrollment Notification Popup --> <div b-5nb100ghei id="enrollmentNotification" class="fixed bottom-4 left-4 bg-gradient-to-r from-white to-blue-50 rounded-lg shadow-lg p-4 max-w-md transform transition-all duration-500 translate-y-full opacity-0 flex items-start space-x-4 z-50 border border-blue-100 hover:shadow-xl cursor-pointer group hover:bg-blue-50/50 notification-container"> <!-- Full notification content --> <div b-5nb100ghei id="fullNotification" class="flex items-start space-x-4 w-full"> <div b-5nb100ghei class="flex-shrink-0 relative"> <img b-5nb100ghei src="/uploads/logos/a3db3bd2-2393-4928-8697-68d280575c22.png" alt="London School of Planning and Management (LSPM) Logo" class="h-12 w-12 object-contain transition-all duration-300 group-hover:scale-105" width="48" height="48" loading="lazy"> <div b-5nb100ghei class="absolute -top-1 -right-1 w-4 h-4 bg-green-500 rounded-full border-2 border-white"></div> </div> <div b-5nb100ghei class="flex-1 min-w-0"> <div b-5nb100ghei class="flex items-center space-x-2"> <div b-5nb100ghei class="flex-1"> <p b-5nb100ghei class="text-sm font-semibold text-gray-900 line-clamp-2 group-hover:text-blue-700 transition-colors" id="notificationText"></p> <div b-5nb100ghei class="mt-0.5 flex items-center space-x-2"> <span b-5nb100ghei class="inline-flex items-center text-xs"> <svg b-5nb100ghei class="w-3 h-3 text-yellow-400 mr-1" fill="currentColor" viewBox="0 0 20 20"> <path b-5nb100ghei d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"/> </svg> <span b-5nb100ghei id="courseRating" class="text-yellow-600 font-medium">4.8</span> </span> <span b-5nb100ghei class="inline-flex items-center text-xs text-gray-500"> <svg b-5nb100ghei class="w-3 h-3 text-gray-400 mr-1" fill="currentColor" viewBox="0 0 20 20"> <path b-5nb100ghei fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm1-12a1 1 0 10-2 0v4a1 1 0 00.293.707l2.828 2.829a1 1 0 101.415-1.415L11 9.586V6z" clip-rule="evenodd"></path> </svg> <span b-5nb100ghei id="notificationTime" class="group-hover:text-blue-600 transition-colors"></span> </span> </div> </div> </div> <div b-5nb100ghei class="mt-2 flex items-center justify-between"> <div b-5nb100ghei class="flex items-center space-x-2"> <span b-5nb100ghei class="inline-flex items-center px-2 py-0.5 rounded text-xs font-medium bg-blue-100 text-blue-800 group-hover:bg-blue-200 transition-colors"> Nouvelle Inscription </span> <span b-5nb100ghei id="courseLevelBadge" class="inline-flex items-center px-2 py-0.5 rounded text-xs font-medium bg-purple-100 text-purple-800 group-hover:bg-purple-200 transition-colors"></span> </div> <div b-5nb100ghei class="flex items-center space-x-2"> <a b-5nb100ghei id="courseLink" href="#" class="inline-flex items-center text-xs text-blue-600 hover:text-blue-800 font-medium"> <span b-5nb100ghei class="group-hover:inline mr-1">→</span> Voir le Cours </a> <button b-5nb100ghei id="muteNotification" class="inline-flex items-center text-xs text-gray-500 hover:text-gray-700 font-medium"> <svg b-5nb100ghei class="w-3 h-3 mr-1" fill="currentColor" viewBox="0 0 20 20"> <path b-5nb100ghei fill-rule="evenodd" d="M9.383 3.076A1 1 0 0110 4v12a1 1 0 01-1.707.707L4.586 13H2a1 1 0 01-1-1V8a1 1 0 011-1h2.586l3.707-3.707a1 1 0 011.09-.217zM12.293 7.293a1 1 0 011.414 0L15 8.586l1.293-1.293a1 1 0 111.414 1.414L16.414 10l1.293 1.293a1 1 0 01-1.414 1.414L15 11.414l-1.293 1.293a1 1 0 01-1.414-1.414L13.586 10l-1.293-1.293a1 1 0 010-1.414z" clip-rule="evenodd"></path> </svg> Muet </button> </div> </div> <div b-5nb100ghei class="mt-2 w-full bg-gray-200 rounded-full h-1.5 overflow-hidden"> <div b-5nb100ghei id="courseProgress" class="bg-blue-600 h-1.5 rounded-full w-0 transition-all duration-1000 ease-out transform scale-x-0 origin-left"></div> </div> </div> </div> <!-- Muted notification content (compact) --> <div b-5nb100ghei id="mutedNotification" class="flex items-center justify-between w-full hidden py-0"> <div b-5nb100ghei class="flex items-center space-x-1"> <span b-5nb100ghei id="mutedCountryFlag" class="text-xs"></span> <span b-5nb100ghei class="inline-flex items-center px-1 py-0 rounded text-xs font-medium bg-blue-100 text-blue-800"> Nouvelle Inscription </span> <span b-5nb100ghei class="text-xs font-medium text-gray-900 truncate max-w-32" id="mutedCourseTitle"></span> </div> <button b-5nb100ghei id="unmuteNotification" class="inline-flex items-center text-xs text-blue-600 hover:text-blue-800 font-medium ml-1"> <svg b-5nb100ghei class="w-2.5 h-2.5 mr-0" fill="currentColor" viewBox="0 0 20 20"> <path b-5nb100ghei fill-rule="evenodd" d="M9.383 3.076A1 1 0 0110 4v12a1 1 0 01-1.707.707L4.586 13H2a1 1 0 01-1-1V8a1 1 0 011-1h2.586l3.707-3.707a1 1 0 011.09-.217zM12.293 7.293a1 1 0 011.414 0L15 8.586l1.293-1.293a1 1 0 111.414 1.414L16.414 10l1.293 1.293a1 1 0 01-1.414 1.414L15 11.414l-1.293 1.293a1 1 0 01-1.414-1.414L13.586 10l-1.293-1.293a1 1 0 010-1.414z" clip-rule="evenodd"></path> </svg> Activer le Son </button> </div> </div> <script>window.__localizedStrings={enrolledIn:'inscrit à',ago:'il y a'};</script> <script src="/js/enrollment-notification.js" defer></script> <!-- Back to Top Button --> <button b-5nb100ghei id="backToTop" class="fixed bottom-20 right-4 w-10 h-10 bg-blue-600 text-white rounded-full shadow-lg flex items-center justify-center opacity-0 pointer-events-none transition-all duration-300 hover:bg-blue-700 hover:scale-110 z-40" aria-label="Back to top"> <svg b-5nb100ghei class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path b-5nb100ghei stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 15l7-7 7 7"/></svg> </button> <!-- Exit Intent Popup --> <div b-5nb100ghei id="exitIntentPopup" class="fixed inset-0 z-[100] flex items-center justify-center bg-black/50 opacity-0 pointer-events-none transition-opacity duration-300"> <div b-5nb100ghei class="bg-white rounded-2xl shadow-2xl max-w-md w-full mx-4 p-8 text-center relative transform scale-95 transition-transform duration-300" id="exitIntentModal"> <button b-5nb100ghei id="closeExitPopup" class="absolute top-3 right-3 text-gray-400 hover:text-gray-600 p-1"> <svg b-5nb100ghei class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path b-5nb100ghei stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"/></svg> </button> <div b-5nb100ghei class="w-14 h-14 bg-blue-100 rounded-full flex items-center justify-center mx-auto mb-4"> <svg b-5nb100ghei class="w-7 h-7 text-blue-600" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path b-5nb100ghei stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/></svg> </div> <h3 b-5nb100ghei class="text-xl font-bold text-gray-900 mb-2">Wait! Don't miss out</h3> <p b-5nb100ghei class="text-gray-600 mb-4">Save <span b-5nb100ghei class="font-bold text-blue-600">44%</span> on all courses — our biggest discount this year.</p> <a b-5nb100ghei href="/fr/Search?query=all" class="inline-block w-full bg-blue-600 text-white font-semibold py-3 px-6 rounded-lg hover:bg-blue-700 transition-colors mb-3"> Browse Courses Now </a> <button b-5nb100ghei id="exitPopupDismiss" class="text-sm text-gray-500 hover:text-gray-700">No thanks, I'll pass</button> </div> </div> <script> (function() { // Announcement bar countdown + dismiss var bar = document.getElementById('announcementBar'); if (bar && !localStorage.getItem('announcementDismissed')) { var endDate = new Date(); endDate.setDate(endDate.getDate() + 3); endDate.setHours(23, 59, 59, 0); function updateCountdown() { var now = new Date(); var diff = endDate - now; if (diff <= 0) { bar.style.display = 'none'; return; } var d = Math.floor(diff / 86400000); var h = Math.floor((diff % 86400000) / 3600000); var m = Math.floor((diff % 3600000) / 60000); var el = document.getElementById('announcementCountdown'); if (el) el.textContent = (d > 0 ? d + 'd ' : '') + h + 'h ' + m + 'm'; } updateCountdown(); setInterval(updateCountdown, 60000); document.getElementById('dismissAnnouncement').addEventListener('click', function() { bar.style.display = 'none'; localStorage.setItem('announcementDismissed', Date.now()); }); } else if (bar) { var dismissed = parseInt(localStorage.getItem('announcementDismissed')); if (dismissed && Date.now() - dismissed > 86400000 * 7) { localStorage.removeItem('announcementDismissed'); } else { bar.style.display = 'none'; } } // Back to top button var btn = document.getElementById('backToTop'); if (btn) { window.addEventListener('scroll', function() { if (window.scrollY > 400) { btn.classList.remove('opacity-0', 'pointer-events-none'); btn.classList.add('opacity-100'); } else { btn.classList.add('opacity-0', 'pointer-events-none'); btn.classList.remove('opacity-100'); } }); btn.addEventListener('click', function() { window.scrollTo({ top: 0, behavior: 'smooth' }); }); } // Exit intent popup var exitShown = false; var popup = document.getElementById('exitIntentPopup'); var modal = document.getElementById('exitIntentModal'); function showExitPopup() { if (exitShown || localStorage.getItem('exitPopupDismissed')) return; exitShown = true; popup.classList.remove('opacity-0', 'pointer-events-none'); popup.classList.add('opacity-100'); modal.classList.remove('scale-95'); modal.classList.add('scale-100'); } function hideExitPopup() { popup.classList.add('opacity-0', 'pointer-events-none'); popup.classList.remove('opacity-100'); modal.classList.add('scale-95'); modal.classList.remove('scale-100'); localStorage.setItem('exitPopupDismissed', Date.now()); } if (popup) { document.addEventListener('mouseout', function(e) { if (e.clientY < 5 && !e.relatedTarget && !e.toElement) showExitPopup(); }); var inactivityTimer; function resetInactivity() { clearTimeout(inactivityTimer); inactivityTimer = setTimeout(showExitPopup, 60000); } document.addEventListener('mousemove', resetInactivity); document.addEventListener('keydown', resetInactivity); document.addEventListener('scroll', resetInactivity); resetInactivity(); document.getElementById('closeExitPopup').addEventListener('click', hideExitPopup); document.getElementById('exitPopupDismiss').addEventListener('click', hideExitPopup); popup.addEventListener('click', function(e) { if (e.target === popup) hideExitPopup(); }); } // Page fade-in document.body.style.opacity = '0'; document.body.style.transition = 'opacity 0.3s ease-in'; window.addEventListener('DOMContentLoaded', function() { document.body.style.opacity = '1'; }); if (document.readyState !== 'loading') document.body.style.opacity = '1'; })(); </script> </body> </html>