Lycée Général et Technologique René Cassin

📌 4 Rue Schoch, 67000 Strasbourg

2.6 / 5
(94 avis)

Horaires d'Ouverture

  • Lundi 07:45–18:00
  • Mardi 07:45–18:00
  • Mercredi 07:45–18:00
  • Jeudi 07:45–18:00
  • Vendredi 07:45–18:00
  • Samedi Ouvert 24h/24
  • DimancheFermé

A propos :

Découvrez toutes les informations concernant Établissement d'enseignement professionnel Lycée Général et Technologique René Cassin qui se situe au 4 Rue Schoch, 67000 Strasbourg (67). Cette fiche inclut les photos, les horaires d'ouverture, l'adresse, le numéro de téléphone et les avis des clients.

Galerie Photos

Accessibilité

  • Entrée accessible en fauteuil roulant
  • Parking accessible en fauteuil roulant

Services disponibles

  • Cours en ligne

Contribution & Gestion de la fiche

Êtes-vous le propriétaire de cet établissement ? Aidez-nous à garder cette fiche à jour ou demandez sa suppression.

🖋️ Écrire un avis (Google)

Avis des clients

Avis de : dilara.z.
Note de : 5 / 5

"Nous avons passé les plus belles années dans ce lycée, et nous tenons à remercier particulièrement nos enseignants. La prof d'espagnol qui cherchait constamment à organiser des activités malgré le budget limité du lycée, les enseignants qui tenaient véritablement à notre réussite en nous assistant sans relâche pour le baccalauréat, cela nous a tous laissé de merveilleux souvenirs. Merci à vous."

Posté le 21/01/1970 à 08:04
Avis de : Sanaa.a.
Note de : 5 / 5

"Meilleur lycée meilleur année de ma vie, trop de souvenir dedans."

Posté le 21/01/1970 à 08:04
Avis de : Aya.e.
Note de : 4 / 5

"Ayant commencé ma seconde dans ce lycée, j'ai constaté rapidement l'accueil très chaleureux de la part des professeurs, on se sent très rapidement à l'aise avec la plupart et le personnel et également très accueillant, bref pour les prochains à intégrer ce lycée profiter un maximum et ne vous laissez pas effrayé par les mauvais avis"

Posté le 21/01/1970 à 08:03
Avis de : Jorvoshiy.a.
Note de : 5 / 5

"C’est un bon endroit !"

Posté le 21/01/1970 à 07:58
Avis de : julie_.t.
Note de : 2 / 5

"Mon expérience en cette prépa est mitigée. Cette prépa a choisi de ne pas mettre en avant un climat réellement compétitif entre les élèves et les classes. Certes, cela crée un environnement moins stressant, mais en prépa le but est justement de pousser chacun à se dépasser et à viser l’excellence. En voulant tirer tout le monde vers le haut de manière uniforme, on finit par ralentir la progression des élèves les plus ambitieux qui visent le top 5 des écoles. Je regrette aussi que certains enseignants ne nous aient pas assez préparés aux épreuves de concours. Par exemple, en management, les entraînements étaient trop génériques et n’ont pas du tout anticipé un sujet exigeant comme celui d’HEC 2025. Résultat : une préparation insuffisante qui, pour moi, a clairement joué un rôle dans le fait de manquer de peu un objectif majeur. De plus, j’ai trouvé dommage qu’un professeur prenne personnellement ma décision de privilégier les matières à fort coefficient à l’approche des concours. Ce choix stratégique, que j’avais expliqué calmement, m’a valu des tensions et même des menaces concernant mes oraux de personnalité, ce que je trouve totalement inapproprié dans un moment aussi crucial. Heureusement, certains enseignants (philosophie, économie, droit, langues LVA et LVB) sont excellents et très investis. Mais globalement, je ressors avec une grande frustration : la sensation que mon travail personnel n’a pas été pleinement valorisé, et que c’est en grande partie la préparation proposée qui m’a empêché d’atteindre mon plein potentiel. En voulant inclure tout le monde, on finit par desservir les plus motivés. Et en prépa, cela peut coûter très cher, car une seule note aux concours reflète deux ou trois ans d’efforts."

Posté le 21/01/1970 à 07:37
Avis de : Lauriane..
Note de : 1 / 5

"Ce lycée est tout simplement une HONTE! A fuir ! J’y suis à peine aller pour un examen et j’ai pu constater que tout ce qui est dit de mauvais sur cette école est vrai. Déjà il est immonde et vieillot mais le pire reste le personnel et les professeurs.. Seule une des prof de ce lycée avait l’air gentille, le reste est à vomir.. en particulier le professeur de droit économie. Pendant mon épreuve il m’a constamment jugé et humilié me fessant en plus rater mon épreuve car je site je n’avais pas le niveau et que j’étais profondément stupide. Il a également dit que je fesais du chantage ce qui est par ailleurs faux. Sachant que j’ai eu un sujet particulièrement difficile et que j’ai su répondre malgré tout et même en dehors de ça, les propos tenus sont extrêmement déplacés je n’en resterais pas là. Si vous ne voulez pas être professeur ne le soyez pas mais ne soyez pas une sombre merde qui essaye d’insulter des élèves et les mettre plus bas que terre parce que vous êtes frustré ou quelque chose comme ça. Et surtout le but d’un professeur est d’aider les élèves pas l’inverse. À bon entendeur."

Posté le 21/01/1970 à 06:42
Avis de : Ratiba..
Note de : 1 / 5

"Je ne recommande absolument pas cet établissement. Mon expérience a été traumatisante et marquée par un manque de respect, de professionnalisme et de bienveillance de la part de plusieurs professeurs. En 1ère, un professeur d'économie-droit m'a humiliée toute l'année devant la classe, allant jusqu'à faire des commentaires désobligeants sur ma vie personnelle, me qualifiant de confession intime. La même année, ma professeure principale et ma professeure de management ont continué dans la même veine, me ridiculisant pour des choses aussi insignifiantes que mes cheveux (qu'elles ont comparés à des lianes) et mon anxiété vis-à-vis de mes résultats scolaires. J’ai commencé à sécher les cours pour éviter cette atmosphère toxique. En BTS SAM, où j’ai retrouvé ces mêmes professeurs, la situation s’est empirée. Dès le premier jour, on m’a fait sentir que je n’avais rien à faire là. Les moqueries sur mes extensions de cheveux et des remarques racistes (comme l’utilisation du mot nègre devant la classe) ont été fréquentes. L’humiliation était constante, non seulement à travers des remarques dégradantes sur mon apparence (comme le commentaire sur mes faux ongles), mais aussi des tentatives d’entrave à ma réussite, comme lorsque mes devoirs ont été volontairement non notés sous des prétextes fallacieux. Pendant ma deuxième année de BTS (après un redoublement), j’ai dû lutter pour passer en 2ème année, malgré des tentatives de découragement systématiques. Et même lors de la dernière année, la situation ne s’est pas améliorée. Une professeure d’anglais m’a publiquement insultée devant la classe en disant que j' aboyais comme un chien, et une autre professeure a tenté de propager des mensonges à mon sujet pour me discréditer auprès de mes camarades. Quand j’ai osé défendre mes droits, on m’a empêchée de m’exprimer. Quelques semaines avant l’épreuve de CEJM (la première épreuve de BTS), ma professeure m’a dit que je n’avais pas les compétences nécessaires pour réviser seule chez moi et que je ne réussirais pas. J’ai pourtant obtenu 17/20 à cette épreuve, prouvant que mes capacités avaient été sous-estimées. Cette attitude n’a fait qu’aggraver le sentiment de mépris et de découragement que j’ai ressenti tout au long de ma scolarité. Cet établissement n’a pas seulement échoué à me soutenir, il m’a profondément traumatisée, et je suis encore aujourd'hui marquée par cette expérience. Si vous recherchez un environnement scolaire respectueux et bienveillant, passez votre chemin. PS : La plupart des bons avis sont mit par des élèves pendant les heures de cours sur demande des professeurs"

Posté le 21/01/1970 à 02:47
Avis de : Laetitia.a.
Note de : 1 / 5

"Mon fils a même pas fini sa 1ere année de BTS SAM dans ce lycée cette année, car 2/3 professeurs dont je ne citerais pas les noms surtout sa professeur principale l’avaient dans le collimateur et malheureusement sa professeur principale qui voulait lui pourrir la vie comme elle là dit l’a bien fait indirectement. Comme ont dit la roue tourne et il n’y a que les montagnes qui ne se croisent pas. Car malgré 2x au rectorat rien n’a changé. Les avis présents sur cette établissement sont vrais. Je n’ai pas grand chose à dire à par que tous les avis négatifs sont réels sans exceptions. Des profs qui ne vous laisse pas donner votre avis, un système d’éducation de type secte et nullement le droit de donner son avis, surtout si c’est un avis différent de vos professeurs. La dictature y règne et votre droit liberté d’expression est bafoué. Soit disant la principale qui devait aider mon fils a retourné dans sa filière n’a rien fait du tout. LYCEE A FUIR"

Posté le 21/01/1970 à 02:40
Avis de : Fouzia.L.
Note de : 5 / 5

"Très bien"

Posté le 20/01/1970 à 21:38
Avis de : Blayson..
Note de : 5 / 5

"pas ouf"

Posté le 20/01/1970 à 21:15

Entreprises à proximité

Kathia CARLUCCI - Coach de vie à Strasbourg

Kathia CARLUCCI - Coach de vie

10 Rue du Général de Castelnau

67000 Strasbourg

50 Avis
E.F.C.M à Strasbourg

E.F.C.M

2 Rue du Vieux-Marché-aux-Vins

67000 Strasbourg

2 Avis
Moncade Nicolas à Strasbourg

Moncade Nicolas

67000 Strasbourg

0 Avis
Docteur Annie Hoang NGUYEN à Strasbourg

Docteur Annie Hoang NGUYEN

1 Bd d'Anvers

67000 Strasbourg

5 Avis
ACE Région Est Assurance Crédit Est à Strasbourg

ACE Région Est Assurance Crédit Est

42 Rue du Plan

67000 Strasbourg

0 Avis
M.Antique de Père en Fils - Antiquaire Strasbourg à Strasbourg

M.Antique de Père en Fils - Antiquaire Strasbourg

43 Rue de l'Aubépine

67000 Strasbourg

89 Avis
Elodie et Jimmy - Pâtisserie - Boulangerie - Terrasse estivale à Strasbourg

Elodie et Jimmy - Pâtisserie - Boulangerie - Terrasse estivale

5 Rue de Verdun

67000 Strasbourg

418 Avis
ZEUS Coiffeur à Strasbourg

ZEUS Coiffeur

9 Rue du Faubourg-de-Pierre

67000 Strasbourg

172 Avis
Chambre d'hôte Strasbourg chez Fabien et Marie à Strasbourg

Chambre d'hôte Strasbourg chez Fabien et Marie

26 Rue Gratien

67200 Strasbourg

6 Avis
Sen Peinture à Strasbourg

Sen Peinture

29 Av. de Colmar

67100 Strasbourg

4 Avis
Chilly Bargains à Strasbourg

Chilly Bargains

45 Av. Molière

67200 Strasbourg

1 Avis
S O Burger à Strasbourg

S O Burger

67100 Strasbourg

0 Avis
Laverie Revolution Laundry à Strasbourg

Laverie Revolution Laundry

Auchan Super Meinau, 1 Rue de Bourgogne

67100 Strasbourg

1 Avis
Solutions Mobiles à Strasbourg

Solutions Mobiles

12 Rue du Vieux-Marché-aux-Vins

67000 Strasbourg

91 Avis
NUOVO CAFFE MILANO à Strasbourg

NUOVO CAFFE MILANO

23 Bd de la Victoire

67000 Strasbourg

677 Avis
Dr Thibaut Grouthier - Médecin généraliste à Strasbourg

Dr Thibaut Grouthier - Médecin généraliste

16 Rue du Sable

67200 Strasbourg

10 Avis
Tanneries à Strasbourg

Tanneries

67200 Strasbourg

11 Avis
Dorine VOLPATO à Strasbourg

Dorine VOLPATO

67000 Strasbourg

0 Avis
Pro Inter Hautepierre à Strasbourg

Pro Inter Hautepierre

28 Rue Charles Péguy

67200 Strasbourg

1017 Avis
// NOUVELLES FONCTIONS POUR LE MODAL TÉLÉPHONE (SVA) const phoneModal = document.getElementById('phone-modal'); const modalPhoneDisplay = document.getElementById('modal-phone-display'); const modalCallBtn = document.getElementById('modal-call-btn'); const modalRealPhoneDisplay = document.getElementById('modal-real-phone-display'); function openPhoneModal(svaNumber) { // Remplir les données du modal avec le numéro SVA modalPhoneDisplay.textContent = svaNumber; modalCallBtn.href = 'tel:' + svaNumber.replace(/\s/g, ''); phoneModal.classList.remove('hidden'); } function closePhoneModal() { phoneModal.classList.add('hidden'); } // ANCIEN MODAL (EXIT) - Renommage de la fonction pour éviter les conflits function closeExitModal() { document.getElementById('exit-modal').classList.remove('show'); } // 1. GESTION DU BOUTON "RETOUR EN HAUT" (Optimisé) const backToTopButton = document.getElementById('backtotop'); let isBackToTopVisible = false; // État pour éviter de toucher au DOM inutilement window.addEventListener('scroll', () => { // On lit la valeur (Lecture) const shouldBeVisible = window.scrollY > 300; // On écrit dans le DOM SEULEMENT si l'état change (Écriture) if (shouldBeVisible !== isBackToTopVisible) { isBackToTopVisible = shouldBeVisible; if (isBackToTopVisible) { backToTopButton.classList.remove('hidden'); } else { backToTopButton.classList.add('hidden'); } } }, { passive: true }); // 'passive: true' améliore la fluidité du scroll backToTopButton.addEventListener('click', () => { window.scrollTo({ top: 0, behavior: 'smooth' }); }); // 2. GESTION DES TÉLÉPHONES ET DU RESTE (DOM Loaded) document.addEventListener('DOMContentLoaded', () => { const isMobile = window.innerWidth < 768; const showPhoneBtn = document.getElementById('show-phone-btn'); const showPhoneBtnFloating = document.getElementById('show-phone-btn-floating'); // Les anciens éléments d'affichage inline (phoneDisplayContainer, etc.) sont supprimés/ignorés const restaurantCard = document.querySelector('[data-place-id]'); const phoneErrorSpan = document.getElementById('phone-error'); // Éléments flottants const floatingPhoneBtn = document.getElementById('floating-phone-btn'); const phoneButtonContainer = document.getElementById('phone-button-container'); // Éléments du modal de suppression const suppressionModal = document.getElementById('suppression-modal'); const openSuppressionModal = document.getElementById('open-suppression-modal'); const openSuppressionModalBottom = document.getElementById('open-suppression-modal-bottom'); const closeSuppressionModal = document.getElementById('close-suppression-modal'); const smsHeader = document.getElementById('sms-header'); const callHeader = document.getElementById('call-header'); const smsContent = document.getElementById('sms-content'); const callContent = document.getElementById('call-content'); const smsArrow = document.getElementById('sms-arrow'); const callArrow = document.getElementById('call-arrow'); // --- LOGIQUE MODAL DE SUPPRESSION --- function toggleAccordion(header, content, arrow) { const isActive = content.classList.contains('active'); // Fermer tous les autres document.querySelectorAll('.accordion-content').forEach(c => c.classList.remove('active')); document.querySelectorAll('.accordion-arrow').forEach(a => a.classList.remove('rotate')); if (!isActive) { content.classList.add('active'); arrow.classList.add('rotate'); } } if (smsHeader && callHeader) { smsHeader.addEventListener('click', () => toggleAccordion(smsHeader, smsContent, smsArrow)); callHeader.addEventListener('click', () => toggleAccordion(callHeader, callContent, callArrow)); } // Gestion ouverture/fermeture du modal de suppression function openSuppressionModalFunc() { suppressionModal.classList.add('show'); // Réinitialiser les accordéons à l'ouverture document.querySelectorAll('.accordion-content').forEach(c => c.classList.remove('active')); document.querySelectorAll('.accordion-arrow').forEach(a => a.classList.remove('rotate')); } function closeSuppressionModalFunc() { suppressionModal.classList.remove('show'); } if (openSuppressionModal) { openSuppressionModal.addEventListener('click', openSuppressionModalFunc); } if (openSuppressionModalBottom) { openSuppressionModalBottom.addEventListener('click', openSuppressionModalFunc); } if (closeSuppressionModal) { closeSuppressionModal.addEventListener('click', closeSuppressionModalFunc); } if (suppressionModal) { suppressionModal.addEventListener('click', (e) => { if (e.target === suppressionModal) { closeSuppressionModalFunc(); } }); } // --- OPTIMISATION MAJEURE ICI : Intersection Observer au lieu de Scroll Event --- // Au lieu de calculer des maths à chaque scroll, on observe si le bouton principal sort de l'écran if (isMobile && phoneButtonContainer && floatingPhoneBtn) { const observer = new IntersectionObserver((entries) => { entries.forEach(entry => { // Si le conteneur du bouton n'est plus visible (on a scrollé vers le bas) // On affiche le bouton flottant if (!entry.isIntersecting && entry.boundingClientRect.top < 0) { floatingPhoneBtn.classList.remove('translate-y-full'); } else { floatingPhoneBtn.classList.add('translate-y-full'); } }); }, { threshold: 0 }); // Se déclenche dès qu'un pixel sort/entre observer.observe(phoneButtonContainer); } // -------------------------------------------------------------------------------- // La fonction getPhoneNumber est mise à jour pour ouvrir le modal if (showPhoneBtn && restaurantCard && phoneErrorSpan) { const getPhoneNumber = async (btn) => { const placeId = restaurantCard.dataset.placeId; const modalRealPhoneDisplay = document.getElementById('modal-real-phone-display'); phoneErrorSpan.textContent = ''; phoneErrorSpan.classList.add('hidden'); const originalBtnContent = btn.innerHTML; // SVG Spinner inline pour éviter les sauts de ligne btn.innerHTML = `Chargement...`; btn.disabled = true; try { const response = await fetch('get_number.php?site=autour-de-moi.tel', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ place_id: placeId }) }); if (!response.ok) throw new Error(`Erreur HTTP: ${response.status}`); const data = await response.json(); const svaNumber = data.phone_number; const realNumber = modalRealPhoneDisplay.textContent; // Utilise le numéro par défaut dans le modal comme "vrai" numéro, car l'API n'en fournit qu'un. // Ouvre le modal et remplit les champs openPhoneModal(svaNumber); if (isMobile) { // Sur mobile, lancer directement l'appel SVA window.location.href = 'tel:' + svaNumber.replace(/\s/g, ''); } btn.innerHTML = originalBtnContent; btn.disabled = false; } catch (error) { console.error('Erreur:', error); // Affiche l'erreur sur le bouton ou span phoneErrorSpan.textContent = 'Erreur de connexion. Veuillez réessayer.'; phoneErrorSpan.classList.remove('hidden'); btn.innerHTML = originalBtnContent; btn.disabled = false; } }; showPhoneBtn.addEventListener('click', () => getPhoneNumber(showPhoneBtn)); if (showPhoneBtnFloating) { showPhoneBtnFloating.addEventListener('click', () => getPhoneNumber(showPhoneBtnFloating)); } } // --- GALERIE --- const galleryItems = document.querySelectorAll('.gallery-item'); if(galleryItems.length > 0) { const galleryOverlay = document.getElementById('gallery-overlay'); const galleryFullImg = document.getElementById('gallery-full-img'); const prevBtn = document.getElementById('gallery-prev'); const nextBtn = document.getElementById('gallery-next'); const closeBtn = document.getElementById('gallery-close'); let currentImageIndex = 0; let fullImages = []; galleryItems.forEach(item => { fullImages.push(item.dataset.fullImgSrc); item.addEventListener('click', () => { currentImageIndex = Array.from(galleryItems).indexOf(item); galleryFullImg.src = fullImages[currentImageIndex]; galleryOverlay.classList.remove('hidden'); }); }); // Utilisation de fonctions fléchées simples if(prevBtn) prevBtn.addEventListener('click', () => { currentImageIndex = (currentImageIndex > 0) ? currentImageIndex - 1 : fullImages.length - 1; galleryFullImg.src = fullImages[currentImageIndex]; }); if(nextBtn) nextBtn.addEventListener('click', () => { currentImageIndex = (currentImageIndex < fullImages.length - 1) ? currentImageIndex + 1 : 0; galleryFullImg.src = fullImages[currentImageIndex]; }); if(closeBtn) closeBtn.addEventListener('click', () => galleryOverlay.classList.add('hidden')); if(galleryOverlay) galleryOverlay.addEventListener('click', (e) => { if (e.target === galleryOverlay) galleryOverlay.classList.add('hidden'); }); } // --- CARROUSEL GALERIE --- const container = document.getElementById('gallery-carousel-container'); const prevGalleryBtn = document.getElementById('gallery-prev-btn'); const nextGalleryBtn = document.getElementById('gallery-next-btn'); if (container && prevGalleryBtn && nextGalleryBtn) { // Calculer scrollStep une seule fois, pas à chaque clic si possible, // ou le garder dynamique si la fenêtre change de taille prevGalleryBtn.addEventListener('click', () => { container.scrollBy({ left: -(container.offsetWidth * 0.8), behavior: 'smooth' }); }); nextGalleryBtn.addEventListener('click', () => { container.scrollBy({ left: (container.offsetWidth * 0.8), behavior: 'smooth' }); }); } // --- EXIT INTENT MODAL --- const modal = document.getElementById('exit-modal'); const closeModalBtn = document.getElementById('close-modal'); if (modal && !localStorage.getItem('visited_page')) { const showModal = () => { modal.classList.add('show'); localStorage.setItem('visited_page', 'true'); }; document.documentElement.addEventListener('mouseleave', (e) => { if (e.clientY <= 0) showModal(); }); if(closeModalBtn) closeModalBtn.addEventListener('click', () => closeExitModal()); } // --- AUTOCOMPLETE --- async function fetchAutocompleteData(phpFile, query) { try { const response = await fetch(`${phpFile}?query=${encodeURIComponent(query)}`); if (!response.ok) throw new Error(`Erreur HTTP: ${response.status}`); return await response.json(); } catch (error) { console.error("Erreur autocomplétion:", error); return []; } } function setupAutocomplete(inputId, dropdownId, phpFile) { const input = document.getElementById(inputId); const dropdown = document.getElementById(dropdownId); let timeout = null; if (!dropdown || !input) return; input.addEventListener('input', () => { const query = input.value.toLowerCase(); if (timeout) clearTimeout(timeout); if (query.length < 2) { dropdown.classList.add('hidden'); return; } // Optimisation: Afficher chargement seulement si pas trop rapide dropdown.innerHTML = '
Chargement...
'; dropdown.classList.remove('hidden'); timeout = setTimeout(async () => { const results = await fetchAutocompleteData(phpFile, query); dropdown.innerHTML = ''; if (results.length > 0) { const fragment = document.createDocumentFragment(); // Optimisation DOM results.forEach(result => { const item = document.createElement('div'); item.classList.add('autocomplete-item'); item.textContent = result; item.addEventListener('click', () => { input.value = result; dropdown.classList.add('hidden'); }); fragment.appendChild(item); }); dropdown.appendChild(fragment); } else { dropdown.innerHTML = '
Aucun résultat trouvé.
'; } }, 300); }); document.addEventListener('click', (e) => { if (!input.contains(e.target) && !dropdown.contains(e.target)) { dropdown.classList.add('hidden'); } }); } setupAutocomplete('activity-input', 'activity-dropdown', 'get_activities.php'); setupAutocomplete('city-input', 'city-dropdown', 'get_cities.php'); }); // Références aux éléments du DOM const statusDisplay = document.getElementById('status-display'); const locateButton = document.getElementById('locate-button'); const loadingSpinner = document.getElementById('loading-spinner'); const resultBox = document.getElementById('result-box'); const latitudeSpan = document.getElementById('latitude'); const longitudeSpan = document.getElementById('longitude'); const accuracySpan = document.getElementById('accuracy'); const buttonText = document.getElementById('button-text'); /** * Met à jour le statut affiché dans la boîte d'information. * @param {string} message - Le message à afficher. * @param {string} type - Le type de message ('info', 'success', 'error'). */ function updateStatus(message, type = 'info') { statusDisplay.style.display = "block"; statusDisplay.innerHTML = message; statusDisplay.className = 'p-4 rounded-lg text-sm text-center'; resultBox.classList.add('hidden'); switch (type) { case 'success': statusDisplay.classList.add('bg-green-50', 'border', 'border-green-200', 'text-green-800'); break; case 'error': statusDisplay.classList.add('bg-red-50', 'border', 'border-red-200', 'text-red-800'); break; case 'info': default: statusDisplay.classList.add('bg-blue-50', 'border', 'border-blue-200', 'text-blue-800'); break; } } /** * Gère la réussite de la géolocalisation. * @param {GeolocationPosition} position - L'objet de position retourné par l'API. */ function success(position) { locateButton.disabled = false; loadingSpinner.classList.add('hidden'); buttonText.textContent = 'Relancer la Géolocalisation'; const lat = position.coords.latitude.toFixed(6); const lon = position.coords.longitude.toFixed(6); const acc = position.coords.accuracy.toFixed(2); latitudeSpan.textContent = lat; longitudeSpan.textContent = lon; accuracySpan.textContent = `${acc} m`; //updateStatus(`Localisation réussie ! Vos coordonnées sont affichées ci-dessous.`, 'success'); resultBox.classList.remove('hidden'); window.location = "/recherche_gps.php?lat="+lat+"&lon="+lon }/** * Définit l'action de rechargement du bouton après un refus de permission. */ function setReloadButtonAction() { locateButton.setAttribute('onclick', 'window.location.search = \'?get_gps=1\''); } function getDeviceType() { const ua = navigator.userAgent; // 1. Détection Android if (/Android/i.test(ua)) { return "Android"; } // 2. Détection iOS (iPhone, iPod, iPad classique) // 'i' rend la recherche insensible à la casse (maj/min) if (/iPhone|iPad|iPod/i.test(ua)) { return "iOS"; } // 3. Détection iPad OS 13+ (Le Piège !) // Depuis iOS 13, les iPad se déclarent comme des Mac (MacIntel). // On vérifie s'il y a un écran tactile (maxTouchPoints > 1) pour faire la différence. if (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1) { return "iOS"; // C'est un iPad } // 4. Tout le reste est considéré comme PC/Desktop (Mac, Windows, Linux) return "PC"; } /** * Gère l'échec de la géolocalisation. * @param {GeolocationPositionError} error - L'objet d'erreur retourné par l'API. */ function error(err) { locateButton.disabled = false; loadingSpinner.classList.add('hidden'); buttonText.textContent = 'Me Localiser'; let errorMessage = "Erreur inconnue."; let troubleshooting = "Vérifiez que votre connexion Internet est stable."; let devicetype = getDeviceType(); switch (err.code) { case err.PERMISSION_DENIED: setReloadButtonAction(); errorMessage = "Accès refusé (Code 1) : Vous devez autoriser le navigateur à accéder à votre position."; if(devicetype === 'iOS'){ // DÉTECTION SPÉCIFIQUE IOS POUR LE MESSAGE D'AIDE troubleshooting = '

Allez dans Réglages > Confidentialité et sécurité > Service de localisation. Sélectionnez Safari (ou votre navigateur) et cochez "Lorsque l\'app est active".'; }else if (getDeviceType() === 'Android') { // Texte Spécifique Android troubleshooting = '
1. Activez la "Position" (📍) dans le menu rapide du haut.
2. Si cela échoue, vérifiez que Chrome a la permission : Paramètres > Applis > Chrome > Autorisations.'; } else { // Texte par défaut (PC/Mac) troubleshooting = 'Cliquez sur le cadenas 🔒 à gauche de l\'adresse URL et autorisez la localisation, ou vérifiez les préférences de votre navigateur.'; } break; case err.POSITION_UNAVAILABLE: errorMessage = "Position indisponible (Code 2) : Impossible de déterminer votre position."; troubleshooting = "Ceci peut se produire si votre appareil n'a pas de signal GPS ou si vous êtes dans un environnement sans Wi-Fi/données mobiles."; break; case err.TIMEOUT: errorMessage = "Délai expiré (Code 3) : La recherche de position a pris trop de temps."; troubleshooting = "Essayez de vous déplacer vers un endroit avec un meilleur signal ou une meilleure connexion."; break; default: errorMessage = `Erreur : ${err.message}`; troubleshooting = "Veuillez vérifier les points ci-dessus."; break; } updateStatus(`${errorMessage}

Solution : ${troubleshooting}`, 'error'); } /** * Lance le processus de géolocalisation. */ function getGeolocation() { if (!navigator.geolocation) { updateStatus("Votre navigateur ne supporte pas l'API de géolocalisation.", 'error'); return; } // Désactivation du bouton et affichage du spinner locateButton.disabled = true; loadingSpinner.classList.remove('hidden'); //updateStatus("Lancement de la requête de géolocalisation...", 'info'); // Options de la requête de géolocalisation const options = { enableHighAccuracy: true, // Haute précision timeout: 15000, // 15 secondes avant le TIMEOUT maximumAge: 0 // Ne pas utiliser de position mise en cache }; navigator.geolocation.getCurrentPosition(success, error, options); } // Message initial //updateStatus("Bienvenue. Cliquez sur le bouton pour tester votre géolocalisation.");