Demander un trajet

Demander un trajet

Communiquez-nous vos données de voyage — nous vous recontacterons dans les plus brefs délais.

Toujours inclus

in ein "HTML-Code"-Widget einfuegen. Cache inkl. Minify danach leeren. CONFIG (Key/API_URL) + ABPREIS oben im Skript-Bereich anpassen. ============================================================ --> .sls-rechner{--gold:#C39A60;--gold-d:#b2884e;--ink:#2b2b2b;--label:#3a3a3a;--muted:#9a958c;--line:#e6e3dd;--field:#ffffff;--soft:#f6f4f0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;color:var(--ink);line-height:1.5;-webkit-font-smoothing:antialiased;} .sls-rechner *{box-sizing:border-box;margin:0;padding:0;} .sls-rechner .widget{max-width:1180px;margin:0 auto;background:#fff;border-radius:16px;overflow:visible;box-shadow:0 30px 70px -30px rgba(0,0,0,.5);} /* Schrittleiste */ .sls-rechner .steps{display:flex;align-items:flex-start;justify-content:space-between;gap:8px;background:var(--soft);padding:22px 6% 18px;position:relative;border-radius:16px 16px 0 0;} .sls-rechner .step{flex:1;text-align:center;position:relative;z-index:2;cursor:default;} .sls-rechner .step .num{width:40px;height:40px;border-radius:50%;margin:0 auto 8px;display:flex;align-items:center;justify-content:center;font-size:16px;font-weight:600;background:#fff;border:2px solid var(--gold);color:var(--gold);transition:.2s;} .sls-rechner .step.active .num,.sls-rechner .step.done .num{background:var(--gold);color:#fff;} .sls-rechner .step.done{cursor:pointer;} .sls-rechner .step .lbl{font-size:13px;color:var(--gold-d);} .sls-rechner .step.active .lbl{font-weight:600;} .sls-rechner .steps .bar{position:absolute;top:43px;left:14%;right:14%;height:2px;background:var(--gold);opacity:.45;z-index:1;} .sls-rechner .body{padding:26px 28px 30px;} .sls-rechner .pane{display:none;} .sls-rechner .pane.on{display:block;animation:slsfade .25s ease;} @keyframes slsfade{from{opacity:0;transform:translateY(6px);}to{opacity:1;transform:none;}} .sls-rechner .pane-h{font-size:20px;font-weight:600;color:var(--ink);} .sls-rechner .pane-sub{font-size:13px;color:var(--muted);margin:3px 0 18px;} .sls-rechner .row{display:grid;grid-template-columns:repeat(4,1fr);gap:22px 26px;} .sls-rechner .row.two{grid-template-columns:1fr 1fr auto;gap:22px 26px;align-items:end;margin-top:22px;} .sls-rechner .f{position:relative;} .sls-rechner .f label{display:block;font-size:14px;color:var(--label);margin-bottom:8px;font-weight:500;} .sls-rechner .ctrl{display:flex;align-items:center;gap:10px;border:1px solid var(--line);border-radius:10px;padding:12px 14px;background:var(--field);} .sls-rechner .ctrl:focus-within{border-color:var(--gold);} .sls-rechner .ctrl svg{flex:0 0 auto;color:var(--gold);} .sls-rechner .ctrl input{border:none;outline:none;font-size:16px;color:var(--ink);width:100%;background:transparent;font-family:inherit;} .sls-rechner .ctrl input[readonly]{cursor:pointer;} .sls-rechner .ctrl input::placeholder{color:var(--muted);} .sls-rechner .selectbox{position:relative;display:flex;align-items:center;gap:10px;border:1px solid var(--line);border-radius:10px;padding:12px 14px;background:var(--field);} .sls-rechner .selectbox svg.lead{color:var(--gold);flex:0 0 auto;} .sls-rechner .selectbox select{appearance:none;border:none;outline:none;background:transparent;font-size:16px;color:var(--ink);width:100%;font-family:inherit;cursor:pointer;} .sls-rechner .selectbox .chev{position:absolute;right:12px;color:#b9b9b9;pointer-events:none;} .sls-rechner .btn{border:none;cursor:pointer;background:var(--gold);color:#fff;font-size:16px;font-weight:600;border-radius:10px;padding:14px 26px;display:inline-flex;align-items:center;justify-content:center;gap:10px;transition:background .15s,transform .1s;font-family:inherit;white-space:nowrap;} .sls-rechner .btn:hover{background:var(--gold-d);} .sls-rechner .btn:active{transform:translateY(1px);} .sls-rechner .btn[disabled]{opacity:.5;cursor:default;} .sls-rechner .btn.ghost{background:#fff;color:var(--gold-d);border:1px solid var(--gold);} .sls-rechner .btn.ghost:hover{background:var(--soft);} .sls-rechner .nav{display:flex;justify-content:space-between;align-items:center;gap:12px;margin-top:28px;} /* Adress-Autocomplete */ .sls-rechner .ac-list{position:absolute;left:0;right:0;top:100%;z-index:50;margin-top:4px;list-style:none;background:#fff;border:1px solid var(--line);border-radius:10px;box-shadow:0 14px 30px -12px rgba(0,0,0,.25);max-height:270px;overflow:auto;padding:4px;} .sls-rechner .ac-item{padding:9px 12px;border-radius:8px;cursor:pointer;} .sls-rechner .ac-item:hover,.sls-rechner .ac-item.on{background:rgba(195,154,96,.12);} .sls-rechner .ac-item .ac-main{font-size:14px;font-weight:600;color:var(--ink);display:block;} .sls-rechner .ac-item .ac-sec{font-size:12px;color:var(--muted);display:block;margin-top:1px;} .sls-rechner .ac-foot{padding:6px 12px 4px;font-size:10px;letter-spacing:.5px;color:#b8b3aa;text-transform:uppercase;text-align:right;} /* Datums-Picker */ .sls-rechner .pick{position:absolute;left:0;top:100%;z-index:60;margin-top:6px;background:#fff;border:1px solid var(--line);border-radius:12px;box-shadow:0 18px 40px -14px rgba(0,0,0,.3);padding:12px;width:320px;max-width:100%;} .sls-rechner .cal-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px;} .sls-rechner .cal-head button{border:none;background:transparent;cursor:pointer;color:var(--gold-d);font-size:20px;line-height:1;width:34px;height:34px;border-radius:8px;font-family:inherit;} .sls-rechner .cal-head button:hover{background:rgba(195,154,96,.14);} .sls-rechner .cal-title{font-weight:600;color:var(--ink);font-size:14px;} .sls-rechner .cal-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;} .sls-rechner .cal-grid .dow{font-size:11px;color:var(--muted);text-align:center;padding:5px 0;} .sls-rechner .cal-grid .day{text-align:center;padding:8px 0;font-size:13px;border-radius:8px;cursor:pointer;color:var(--ink);} .sls-rechner .cal-grid .day:hover{background:rgba(195,154,96,.14);} .sls-rechner .cal-grid .day.muted{cursor:default;} .sls-rechner .cal-grid .day.today{box-shadow:inset 0 0 0 1px var(--gold);} .sls-rechner .cal-grid .day.sel{background:var(--gold);color:#fff;} .sls-rechner .cal-grid .day.disabled{color:#dcd8d0;cursor:not-allowed;} .sls-rechner .cal-grid .day.disabled:hover{background:transparent;} /* Karte + Route */ .sls-rechner .mapwrap{margin-top:26px;border-radius:12px;overflow:hidden;border:1px solid var(--line);} .sls-rechner #map{width:100%;height:300px;display:block;background:#eceae5;} .sls-rechner .routeinfo{display:flex;gap:14px;flex-wrap:wrap;margin-top:18px;} .sls-rechner .routeinfo .b{flex:1 1 0;min-width:180px;display:flex;align-items:center;gap:14px;background:var(--soft);border:1px solid var(--line);border-radius:12px;padding:16px 18px;} .sls-rechner .routeinfo .ic{width:38px;height:38px;border-radius:50%;background:rgba(195,154,96,.14);display:flex;align-items:center;justify-content:center;color:var(--gold);flex:0 0 auto;} .sls-rechner .routeinfo .k{font-size:12px;text-transform:uppercase;letter-spacing:.5px;color:var(--gold-d);} .sls-rechner .routeinfo .v{font-size:22px;font-weight:600;color:var(--ink);} .sls-rechner .routeinfo .v small{font-size:13px;color:var(--muted);font-weight:400;} .sls-rechner .routeinfo .empty{font-size:14px;color:var(--muted);font-style:italic;font-weight:400;} /* Fahrzeuge */ .sls-rechner .sec-h{margin-top:30px;font-size:19px;font-weight:600;color:var(--ink);} .sls-rechner .sec-sub{font-size:13px;color:var(--muted);margin-top:3px;} .sls-rechner .cars{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;margin-top:16px;} .sls-rechner .car{position:relative;border:1.5px solid var(--line);border-radius:14px;padding:20px;text-align:center;cursor:pointer;background:#fff;transition:border-color .15s,box-shadow .15s;} .sls-rechner .car:hover{border-color:var(--gold);} .sls-rechner .car.sel{border-color:var(--gold);box-shadow:0 0 0 3px rgba(195,154,96,.18);} .sls-rechner .car.disabled{opacity:.45;pointer-events:none;filter:grayscale(.35);} .sls-rechner .car .tick{position:absolute;top:12px;right:12px;width:24px;height:24px;border-radius:50%;background:var(--gold);color:#fff;display:none;align-items:center;justify-content:center;font-size:14px;font-weight:700;} .sls-rechner .car.sel .tick{display:flex;} .sls-rechner .car .nm{font-size:18px;font-weight:600;color:var(--ink);} .sls-rechner .car .ab{font-size:13px;color:var(--muted);margin-top:10px;} .sls-rechner .car .pr{font-size:26px;font-weight:700;color:var(--gold);} .sls-rechner .car .un{font-size:12px;color:var(--muted);} .sls-rechner .car .km{display:inline-block;margin-top:10px;font-size:12px;color:var(--gold-d);background:rgba(195,154,96,.10);border:1px solid var(--line);border-radius:999px;padding:4px 11px;} .sls-rechner .hint{font-size:12px;color:var(--muted);text-align:center;margin-top:14px;} /* Checkboxen */ .sls-rechner .checks{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-top:6px;} .sls-rechner .chk{display:flex;align-items:flex-start;gap:11px;border:1px solid var(--line);border-radius:10px;padding:13px 15px;cursor:pointer;transition:border-color .15s;} .sls-rechner .chk:hover{border-color:var(--gold);} .sls-rechner .chk input{flex:0 0 auto;margin-top:1px;width:18px;height:18px;accent-color:var(--gold);cursor:pointer;} .sls-rechner .chk span{font-size:14px;color:var(--ink);} /* Kontakt / Freitext */ .sls-rechner .contact{display:grid;grid-template-columns:1fr 1fr;gap:20px 26px;} .sls-rechner .contact .full{grid-column:1 / -1;} .sls-rechner .contact label{display:block;font-size:14px;color:var(--label);margin-bottom:8px;font-weight:500;} .sls-rechner .contact input,.sls-rechner .contact textarea{width:100%;border:1px solid var(--line);border-radius:10px;padding:12px 14px;font-size:16px;color:var(--ink);font-family:inherit;background:#fff;} .sls-rechner .contact input:focus,.sls-rechner .contact textarea:focus{outline:none;border-color:var(--gold);} .sls-rechner .contact textarea{min-height:96px;resize:vertical;} .sls-rechner .hp{position:absolute;left:-9999px;top:-9999px;height:0;width:0;overflow:hidden;} /* Zusammenfassung */ .sls-rechner .summary{margin-top:6px;border:1px solid var(--line);border-radius:12px;overflow:hidden;} .sls-rechner .summary .srow{display:flex;justify-content:space-between;gap:16px;padding:11px 16px;border-bottom:1px solid var(--soft);font-size:14px;} .sls-rechner .summary .srow:last-child{border-bottom:none;} .sls-rechner .summary .sk{color:var(--muted);} .sls-rechner .summary .sv{color:var(--ink);font-weight:600;text-align:right;} .sls-rechner .errorbox{display:none;margin:0 0 18px;background:#fdeceb;border:1px solid #f0b8b3;border-radius:12px;padding:14px;color:#a23c33;text-align:center;font-size:14px;} .sls-rechner .success{display:none;margin-top:18px;background:#eef7f0;border:1px solid #bcdcc4;border-radius:12px;padding:18px;color:#2e6b43;text-align:center;} /* Theme-Schutz */ .sls-rechner input,.sls-rechner select,.sls-rechner textarea{color:var(--ink) !important;-webkit-text-fill-color:var(--ink) !important;font-family:inherit;box-shadow:none;} .sls-rechner ::placeholder{color:var(--muted) !important;-webkit-text-fill-color:var(--muted) !important;opacity:1;} .sls-rechner #anfrage .contact input,.sls-rechner #anfrage .contact textarea{-webkit-appearance:none !important;appearance:none !important;border:1px solid var(--line) !important;border-radius:10px !important;background:#fff !important;color:var(--ink) !important;-webkit-text-fill-color:var(--ink) !important;padding:12px 14px !important;box-shadow:none !important;} .sls-rechner #anfrage .contact textarea{min-height:96px !important;} .sls-rechner #anfrage .contact input:focus,.sls-rechner #anfrage .contact textarea:focus{border-color:var(--gold) !important;outline:none !important;} .sls-rechner #anfrage .ctrl{border:1px solid var(--line) !important;background:var(--field) !important;border-radius:10px !important;} .sls-rechner #anfrage .selectbox{border:1px solid var(--line) !important;background:var(--field) !important;border-radius:10px !important;} .sls-rechner #anfrage .chk input{-webkit-appearance:checkbox !important;appearance:checkbox !important;accent-color:var(--gold) !important;width:18px !important;height:18px !important;} @media(max-width:1024px){ .sls-rechner .row{grid-template-columns:1fr 1fr;} } @media(max-width:640px){ .sls-rechner .body{padding:20px 15px 24px;} .sls-rechner .steps{padding:18px 4% 14px;} .sls-rechner .step .lbl{font-size:11px;} .sls-rechner .row{grid-template-columns:1fr;} .sls-rechner .row.two{grid-template-columns:1fr;} .sls-rechner .row.two .btn{width:100%;} .sls-rechner .cars{grid-template-columns:1fr;} .sls-rechner .checks{grid-template-columns:1fr;} .sls-rechner .contact{grid-template-columns:1fr;} .sls-rechner #map{height:240px;} .sls-rechner .routeinfo .b{min-width:0;flex:1 1 100%;} .sls-rechner .pick{width:100%;} }
1
Données
2
Trajet
3
Options
4
Récapitulatif
Données personnelles
Afin que nous puissions vous joindre pour la confirmation.
Détails du trajet
La distance et la durée du trajet sont calculées via Google Maps.
Aller simpleAller-retourRéservation à l'heure
1 personne 2 personnes 3 personnes 4 personnes 5 personnes 6 personnes
Distance
pas encore calculée
Durée du trajet (env.)
pas encore calculée
Sélectionner le véhicule
Prix « à partir de » — le prix final dépend du temps et de la distance et sera confirmé individuellement.
✓
Mercedes-Maybach
à partir de
CHF 150.–
par heure
25 km inclus
✓
BMW i7
à partir de
CHF 150.–
par heure
25 km inclus
✓
Mercedes EQV
à partir de
CHF 150.–
par heure
30 km inclus
Options et souhaits
Facultatif — tout sera pris en compte individuellement.
Pas d'attente30 minutes1 heurePlus d'1 heure
Veuillez sélectionner (facultatif)Carte de crédit / carte de débitEspècesTwintBulletin de versement (uniquement pour les clients réguliers)Paiement anticipé avec lien de paiement
Récapitulatif
Veuillez vérifier vos informations et envoyer la demande.
✓ Merci ! Votre demande a été transmise — nous vous contacterons sous peu.
(function(){ 'use strict'; /* ===== SLS i18n (selbstuebersetzend, 2026-07-13) — Woerterbuch DE->EN/FR/IT ===== */ var SLS_LANG = (document.documentElement.lang || 'de').toLowerCase().slice(0,2); var SLS_I18N = {"en":{"Daten":"Details","Fahrt":"Trip","Optionen":"Options","Übersicht":"Summary","Persönliche Daten":"Personal details","Fahrtdetails":"Trip details","Optionen & Wünsche":"Options & requests","Zusammenfassung":"Summary","Damit wir Sie für die Bestätigung erreichen können.":"So we can reach you to confirm your booking.","Name *":"Name *","Telefon *":"Phone *","E-Mail *":"E-mail *","Weiter":"Next","Zurück":"Back","Strecke & Fahrzeit werden über Google Maps berechnet.":"Route & travel time are calculated via Google Maps.","Startadresse":"Pick-up address","Zieladresse":"Drop-off address","Datum":"Date","Uhrzeit (24 Std.)":"Time (24 h)","Transferart":"Transfer type","Nur Hin":"One way","Hin & Zurück":"Round trip","Stundenbuchung":"Hourly booking","Personen":"Passengers","1 Person":"1 person","2 Personen":"2 people","3 Personen":"3 people","4 Personen":"4 people","5 Personen":"5 people","6 Personen":"6 people","Strecke & Fahrzeit anzeigen":"Show route & travel time","Strecke":"Route","noch nicht berechnet":"not calculated yet","Fahrzeit (ca.)":"Travel time (approx.)","Fahrzeug auswählen":"Select vehicle","pro Stunde":"per hour","inkl. 25 km":"incl. 25 km","inkl. 30 km":"incl. 30 km","Ab 5 Personen steht nur der Mercedes EQV zur Verfügung.":"For 5 or more passengers, only the Mercedes EQV is available.","ab":"from","Optional — alles wird individuell berücksichtigt.":"Optional — everything is taken into account individually.","Zusätzliche Wartezeiten":"Additional waiting time","Kein Warten":"No waiting","30 Minuten":"30 minutes","1 Stunde":"1 hour","Mehr als 1 Stunde":"More than 1 hour","Gewünschte Zahlungsart":"Preferred payment method","Bitte wählen (optional)":"Please select (optional)","Bar":"Cash","Kreditkarte / Debitkarte":"Credit / debit card","Einzahlungsschein (nur für Stammkunden)":"Invoice (regular clients only)","Vorauszahlung mit Zahlungslink":"Prepayment via payment link","Zusätzliche Optionen":"Additional options","Diskretion gewünscht":"Discretion requested","Kindersitz benötigt":"Child seat required","Hilfe beim Gepäck / Ein- & Aussteigen":"Assistance with luggage / boarding & exiting","Namensschild bei Abholung":"Name sign at pick-up","Bemerkungen":"Remarks","Bitte prüfen Sie Ihre Angaben und senden Sie die Anfrage ab.":"Please review your details and submit your request.","Anfrage senden":"Send request","✓ Vielen Dank! Ihre Anfrage wurde übermittelt – wir melden uns in Kürze bei Ihnen.":"✓ Thank you! Your request has been sent – we will get back to you shortly.","BMW i7":"BMW i7","Mercedes EQV":"Mercedes EQV","„ab“-Preise — der Endpreis hängt von Zeit & Distanz ab und wird individuell bestätigt.":"“From” prices — the final price depends on time & distance and will be confirmed individually.","Vor- und Nachname":"First and last name","name@beispiel.ch":"name@example.com","Startadresse eintragen":"Enter pick-up address","Zieladresse eintragen":"Enter drop-off address","Datum auswählen":"Select date","Flugnummer, Zwischenstopps, Sonderwünsche …":"Flight number, stopovers, special requests …","Bitte eine gültige E-Mail-Adresse angeben.":"Please enter a valid e-mail address.","Bitte alle Pflichtfelder ausfüllen.":"Please fill in all required fields.","Bitte die Uhrzeit im Format HH:MM angeben (z. B. 14:30).":"Please enter the time in HH:MM format (e.g. 14:30).","Bitte Pflichtfelder ausfüllen und ein Fahrzeug wählen.":"Please fill in the required fields and select a vehicle.","Google Maps konnte nicht geladen werden. Bitte API-Key & aktivierte APIs prüfen.":"Google Maps could not be loaded. Please check the API key & enabled APIs.","Google Maps wurde nicht rechtzeitig geladen.":"Google Maps did not load in time.","Bitte Start- und Zieladresse eintragen.":"Please enter pick-up and drop-off address.","Karte lädt noch – bitte einen Moment warten.":"Map is still loading – please wait a moment.","). Bitte Adressen präzisieren.":"). Please refine the addresses.","Vorschläge von Google":"Suggestions from Google","Es ist ein Fehler aufgetreten. Bitte später erneut versuchen oder anrufen.":"An error occurred. Please try again later or call us.","Verbindung fehlgeschlagen. Bitte Internetverbindung prüfen oder telefonisch anfragen.":"Connection failed. Please check your internet connection or contact us by phone.","ab CHF 150.– / Std. (inkl. 25 km)":"from CHF 150.– / h (incl. 25 km)","ab CHF 150.– / Std. (inkl. 30 km)":"from CHF 150.– / h (incl. 30 km)"," Std. ":" h "," Min.":" min.","auf Anfrage":"on request","Wird gesendet …":"Sending …","Zahlungsart: ":"Payment method: ","Route konnte nicht berechnet werden (Status: ":"The route could not be calculated (status: ","Name":"Name","Telefon":"Phone","E-Mail":"E-mail","Uhrzeit":"Time","Wartezeiten":"Waiting time","Zahlungsart":"Payment method","Fahrzeit":"Travel time","Fahrzeug":"Vehicle","Tarif":"Rate","__MONTHS":["January","February","March","April","May","June","July","August","September","October","November","December"],"__DOWS":["Mo","Tu","We","Th","Fr","Sa","Su"]},"fr":{"Daten":"Coordonnées","Fahrt":"Trajet","Optionen":"Options","Übersicht":"Résumé","Persönliche Daten":"Données personnelles","Fahrtdetails":"Détails du trajet","Optionen & Wünsche":"Options & souhaits","Zusammenfassung":"Résumé","Damit wir Sie für die Bestätigung erreichen können.":"Pour que nous puissions vous joindre pour la confirmation.","Name *":"Nom *","Telefon *":"Téléphone *","E-Mail *":"E-mail *","Weiter":"Suivant","Zurück":"Retour","Strecke & Fahrzeit werden über Google Maps berechnet.":"L’itinéraire et la durée sont calculés via Google Maps.","Startadresse":"Adresse de départ","Zieladresse":"Adresse de destination","Datum":"Date","Uhrzeit (24 Std.)":"Heure (24 h)","Transferart":"Type de transfert","Nur Hin":"Aller simple","Hin & Zurück":"Aller-retour","Stundenbuchung":"Réservation à l’heure","Personen":"Personnes","1 Person":"1 personne","2 Personen":"2 personnes","3 Personen":"3 personnes","4 Personen":"4 personnes","5 Personen":"5 personnes","6 Personen":"6 personnes","Strecke & Fahrzeit anzeigen":"Afficher l’itinéraire et la durée","Strecke":"Itinéraire","noch nicht berechnet":"pas encore calculé","Fahrzeit (ca.)":"Durée (env.)","Fahrzeug auswählen":"Choisir un véhicule","pro Stunde":"par heure","inkl. 25 km":"25 km inclus","inkl. 30 km":"30 km inclus","Ab 5 Personen steht nur der Mercedes EQV zur Verfügung.":"À partir de 5 personnes, seul le Mercedes EQV est disponible.","ab":"dès","Optional — alles wird individuell berücksichtigt.":"Facultatif — tout est pris en compte individuellement.","Zusätzliche Wartezeiten":"Temps d’attente supplémentaire","Kein Warten":"Pas d’attente","30 Minuten":"30 minutes","1 Stunde":"1 heure","Mehr als 1 Stunde":"Plus d’une heure","Gewünschte Zahlungsart":"Mode de paiement souhaité","Bitte wählen (optional)":"Veuillez choisir (facultatif)","Bar":"Espèces","Kreditkarte / Debitkarte":"Carte de crédit / débit","Einzahlungsschein (nur für Stammkunden)":"Bulletin de versement (clients réguliers uniquement)","Vorauszahlung mit Zahlungslink":"Prépaiement par lien de paiement","Zusätzliche Optionen":"Options supplémentaires","Diskretion gewünscht":"Discrétion souhaitée","Kindersitz benötigt":"Siège enfant requis","Hilfe beim Gepäck / Ein- & Aussteigen":"Aide pour les bagages / monter & descendre","Namensschild bei Abholung":"Panneau nominatif à l’arrivée","Bemerkungen":"Remarques","Bitte prüfen Sie Ihre Angaben und senden Sie die Anfrage ab.":"Veuillez vérifier vos informations et envoyer votre demande.","Anfrage senden":"Envoyer la demande","✓ Vielen Dank! Ihre Anfrage wurde übermittelt – wir melden uns in Kürze bei Ihnen.":"✓ Merci ! Votre demande a été transmise – nous vous répondrons sous peu.","BMW i7":"BMW i7","Mercedes EQV":"Mercedes EQV","„ab“-Preise — der Endpreis hängt von Zeit & Distanz ab und wird individuell bestätigt.":"Prix « à partir de » — le prix final dépend du temps et de la distance et sera confirmé individuellement.","Vor- und Nachname":"Prénom et nom","name@beispiel.ch":"nom@exemple.ch","Startadresse eintragen":"Saisir l’adresse de départ","Zieladresse eintragen":"Saisir l’adresse de destination","Datum auswählen":"Choisir la date","Flugnummer, Zwischenstopps, Sonderwünsche …":"Numéro de vol, arrêts intermédiaires, demandes particulières …","Bitte eine gültige E-Mail-Adresse angeben.":"Veuillez saisir une adresse e-mail valide.","Bitte alle Pflichtfelder ausfüllen.":"Veuillez remplir tous les champs obligatoires.","Bitte die Uhrzeit im Format HH:MM angeben (z. B. 14:30).":"Veuillez indiquer l’heure au format HH:MM (p. ex. 14:30).","Bitte Pflichtfelder ausfüllen und ein Fahrzeug wählen.":"Veuillez remplir les champs obligatoires et choisir un véhicule.","Google Maps konnte nicht geladen werden. Bitte API-Key & aktivierte APIs prüfen.":"Google Maps n’a pas pu être chargé. Veuillez vérifier la clé API.","Google Maps wurde nicht rechtzeitig geladen.":"Google Maps n’a pas été chargé à temps.","Bitte Start- und Zieladresse eintragen.":"Veuillez saisir les adresses de départ et de destination.","Karte lädt noch – bitte einen Moment warten.":"La carte se charge – veuillez patienter un instant.","). Bitte Adressen präzisieren.":"). Veuillez préciser les adresses.","Vorschläge von Google":"Suggestions de Google","Es ist ein Fehler aufgetreten. Bitte später erneut versuchen oder anrufen.":"Une erreur s’est produite. Veuillez réessayer plus tard ou nous appeler.","Verbindung fehlgeschlagen. Bitte Internetverbindung prüfen oder telefonisch anfragen.":"Échec de la connexion. Veuillez vérifier votre connexion Internet ou nous contacter par téléphone.","ab CHF 150.– / Std. (inkl. 25 km)":"dès CHF 150.– / h (25 km inclus)","ab CHF 150.– / Std. (inkl. 30 km)":"dès CHF 150.– / h (30 km inclus)"," Std. ":" h "," Min.":" min.","auf Anfrage":"sur demande","Wird gesendet …":"Envoi en cours …","Zahlungsart: ":"Mode de paiement : ","Route konnte nicht berechnet werden (Status: ":"L’itinéraire n’a pas pu être calculé (statut : ","Name":"Nom","Telefon":"Téléphone","E-Mail":"E-mail","Uhrzeit":"Heure","Wartezeiten":"Temps d’attente","Zahlungsart":"Mode de paiement","Fahrzeit":"Durée","Fahrzeug":"Véhicule","Tarif":"Tarif","__MONTHS":["Janvier","Février","Mars","Avril","Mai","Juin","Juillet","Août","Septembre","Octobre","Novembre","Décembre"],"__DOWS":["Lu","Ma","Me","Je","Ve","Sa","Di"]},"it":{"Daten":"Dati","Fahrt":"Viaggio","Optionen":"Opzioni","Übersicht":"Riepilogo","Persönliche Daten":"Dati personali","Fahrtdetails":"Dettagli del viaggio","Optionen & Wünsche":"Opzioni e desideri","Zusammenfassung":"Riepilogo","Damit wir Sie für die Bestätigung erreichen können.":"Per poterla contattare per la conferma.","Name *":"Nome *","Telefon *":"Telefono *","E-Mail *":"E-mail *","Weiter":"Avanti","Zurück":"Indietro","Strecke & Fahrzeit werden über Google Maps berechnet.":"Percorso e durata vengono calcolati tramite Google Maps.","Startadresse":"Indirizzo di partenza","Zieladresse":"Indirizzo di destinazione","Datum":"Data","Uhrzeit (24 Std.)":"Ora (24 h)","Transferart":"Tipo di trasferimento","Nur Hin":"Solo andata","Hin & Zurück":"Andata e ritorno","Stundenbuchung":"Prenotazione a ore","Personen":"Persone","1 Person":"1 persona","2 Personen":"2 persone","3 Personen":"3 persone","4 Personen":"4 persone","5 Personen":"5 persone","6 Personen":"6 persone","Strecke & Fahrzeit anzeigen":"Mostra percorso e durata","Strecke":"Percorso","noch nicht berechnet":"non ancora calcolato","Fahrzeit (ca.)":"Durata (ca.)","Fahrzeug auswählen":"Scegliere il veicolo","pro Stunde":"all’ora","inkl. 25 km":"incl. 25 km","inkl. 30 km":"incl. 30 km","Ab 5 Personen steht nur der Mercedes EQV zur Verfügung.":"A partire da 5 persone è disponibile solo il Mercedes EQV.","ab":"da","Optional — alles wird individuell berücksichtigt.":"Facoltativo — tutto viene considerato individualmente.","Zusätzliche Wartezeiten":"Tempi di attesa aggiuntivi","Kein Warten":"Nessuna attesa","30 Minuten":"30 minuti","1 Stunde":"1 ora","Mehr als 1 Stunde":"Più di 1 ora","Gewünschte Zahlungsart":"Metodo di pagamento preferito","Bitte wählen (optional)":"Selezionare (facoltativo)","Bar":"Contanti","Kreditkarte / Debitkarte":"Carta di credito / debito","Einzahlungsschein (nur für Stammkunden)":"Polizza di versamento (solo clienti abituali)","Vorauszahlung mit Zahlungslink":"Pagamento anticipato tramite link","Zusätzliche Optionen":"Opzioni aggiuntive","Diskretion gewünscht":"Discrezione richiesta","Kindersitz benötigt":"Seggiolino per bambini richiesto","Hilfe beim Gepäck / Ein- & Aussteigen":"Aiuto con i bagagli / salita e discesa","Namensschild bei Abholung":"Cartello con nome al ritiro","Bemerkungen":"Osservazioni","Bitte prüfen Sie Ihre Angaben und senden Sie die Anfrage ab.":"Verifichi i suoi dati e invii la richiesta.","Anfrage senden":"Invia richiesta","✓ Vielen Dank! Ihre Anfrage wurde übermittelt – wir melden uns in Kürze bei Ihnen.":"✓ Grazie! La sua richiesta è stata inviata – la contatteremo a breve.","BMW i7":"BMW i7","Mercedes EQV":"Mercedes EQV","„ab“-Preise — der Endpreis hängt von Zeit & Distanz ab und wird individuell bestätigt.":"Prezzi “a partire da” — il prezzo finale dipende da tempo e distanza e sarà confermato individualmente.","Vor- und Nachname":"Nome e cognome","name@beispiel.ch":"nome@esempio.ch","Startadresse eintragen":"Inserire l’indirizzo di partenza","Zieladresse eintragen":"Inserire l’indirizzo di destinazione","Datum auswählen":"Selezionare la data","Flugnummer, Zwischenstopps, Sonderwünsche …":"Numero di volo, soste intermedie, richieste speciali …","Bitte eine gültige E-Mail-Adresse angeben.":"Inserire un indirizzo e-mail valido.","Bitte alle Pflichtfelder ausfüllen.":"Compilare tutti i campi obbligatori.","Bitte die Uhrzeit im Format HH:MM angeben (z. B. 14:30).":"Indicare l’ora nel formato HH:MM (es. 14:30).","Bitte Pflichtfelder ausfüllen und ein Fahrzeug wählen.":"Compilare i campi obbligatori e scegliere un veicolo.","Google Maps konnte nicht geladen werden. Bitte API-Key & aktivierte APIs prüfen.":"Impossibile caricare Google Maps. Verificare la chiave API.","Google Maps wurde nicht rechtzeitig geladen.":"Google Maps non è stato caricato in tempo.","Bitte Start- und Zieladresse eintragen.":"Inserire l’indirizzo di partenza e di destinazione.","Karte lädt noch – bitte einen Moment warten.":"La mappa si sta caricando – attendere un momento.","). Bitte Adressen präzisieren.":"). Precisare gli indirizzi.","Vorschläge von Google":"Suggerimenti di Google","Es ist ein Fehler aufgetreten. Bitte später erneut versuchen oder anrufen.":"Si è verificato un errore. Riprovare più tardi o chiamarci.","Verbindung fehlgeschlagen. Bitte Internetverbindung prüfen oder telefonisch anfragen.":"Connessione non riuscita. Verificare la connessione Internet o contattarci telefonicamente.","ab CHF 150.– / Std. (inkl. 25 km)":"da CHF 150.– / h (incl. 25 km)","ab CHF 150.– / Std. (inkl. 30 km)":"da CHF 150.– / h (incl. 30 km)"," Std. ":" h "," Min.":" min.","auf Anfrage":"su richiesta","Wird gesendet …":"Invio in corso …","Zahlungsart: ":"Metodo di pagamento: ","Route konnte nicht berechnet werden (Status: ":"Impossibile calcolare il percorso (stato: ","Name":"Nome","Telefon":"Telefono","E-Mail":"E-mail","Uhrzeit":"Ora","Wartezeiten":"Tempi di attesa","Zahlungsart":"Metodo di pagamento","Fahrzeit":"Durata","Fahrzeug":"Veicolo","Tarif":"Tariffa","__MONTHS":["Gennaio","Febbraio","Marzo","Aprile","Maggio","Giugno","Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre"],"__DOWS":["Lu","Ma","Me","Gi","Ve","Sa","Do"]}}; var SLS_T = SLS_I18N[SLS_LANG] || null; function sls_tr(s){ return (SLS_T && Object.prototype.hasOwnProperty.call(SLS_T, s)) ? SLS_T[s] : s; } (function slsDomSwap(){ if (!SLS_T) return; var scope = document.querySelector('.sls-rechner'); if (!scope) return; var w = document.createTreeWalker(scope, NodeFilter.SHOW_TEXT, null, false), tn; var nodes = []; while ((tn = w.nextNode())) nodes.push(tn); nodes.forEach(function(n){ var raw = n.textContent, t = raw.trim(); if (t && Object.prototype.hasOwnProperty.call(SLS_T, t)) n.textContent = raw.replace(t, SLS_T[t]); }); scope.querySelectorAll('[placeholder]').forEach(function(el){ var v = el.getAttribute('placeholder'); if (Object.prototype.hasOwnProperty.call(SLS_T, v)) el.setAttribute('placeholder', SLS_T[v]); }); scope.querySelectorAll('[data-opt]').forEach(function(el){ var v = el.getAttribute('data-opt'); if (Object.prototype.hasOwnProperty.call(SLS_T, v)) el.setAttribute('data-opt', SLS_T[v]); }); })(); var CONFIG = { GOOGLE_MAPS_API_KEY: 'AIzaSyDLmMEfBGInMOVl1KRVVrkL0W8ynb5lGfA', API_URL: '/wp-json/swisslimo/v1/anfrage', MAP_CENTER: { lat: 47.0502, lng: 8.3093 }, REGION: 'CH', AC_REGIONS: ['ch','de','at','li'] }; var ABPREIS = { 'Mercedes-Maybach': 'ab CHF 150.– / Std. (inkl. 25 km)', 'BMW i7': 'ab CHF 150.– / Std. (inkl. 25 km)', 'Mercedes EQV': 'ab CHF 150.– / Std. (inkl. 30 km)' }; var root = document.querySelector('.sls-rechner'); if (!root) return; function $(id){ return root.querySelector('#' + id) || document.getElementById(id); } function pad(n){ return (n maxReached) maxReached = n; hideError(); root.querySelectorAll('.pane').forEach(function(p){ p.classList.toggle('on', parseInt(p.dataset.step,10) === n); }); root.querySelectorAll('.step').forEach(function(s){ var sn = parseInt(s.dataset.step,10); s.classList.toggle('active', sn === n); s.classList.toggle('done', sn < maxReached && sn !== n); }); if (n === 4) buildSummary(); if (n === 2 && map && window.google){ setTimeout(function(){ google.maps.event.trigger(map, 'resize'); if (routeKm == null) map.setCenter(CONFIG.MAP_CENTER); }, 180); } var w = root.querySelector('.widget'); if (w && w.scrollIntoView) w.scrollIntoView({ behavior:'smooth', block:'start' }); } function markRequired(ids){ var ok = true; ids.forEach(function(id){ var el = $(id); var val = (id === 'datum') ? (el.dataset.iso || '') : el.value.trim(); var box = fieldBox(el); if (!val){ box.style.borderColor = '#cf6b61'; ok = false; } else { box.style.borderColor = ''; } }); return ok; } var RE_MAIL = /^[^@\s]+@[^@\s]+\.[^@\s]+$/; var RE_TIME = /^([01]?\d|2[0-3]):[0-5]\d$/; function validateStep(n){ if (n === 1){ var ok = markRequired(['name','tel','mail']); var m = $('mail'); if (m.value.trim() && !RE_MAIL.test(m.value.trim())){ fieldBox(m).style.borderColor = '#cf6b61'; showError('Bitte eine gültige E-Mail-Adresse angeben.'); return false; } if (!ok) showError('Bitte alle Pflichtfelder ausfüllen.'); return ok; } if (n === 2){ var ok2 = markRequired(['abhol','ziel','datum','zeit']); var z = $('zeit'); if (z.value.trim() && !RE_TIME.test(z.value.trim())){ fieldBox(z).style.borderColor = '#cf6b61'; showError('Bitte die Uhrzeit im Format HH:MM angeben (z. B. 14:30).'); return false; } if (!$('fahrzeug').value){ var cs = root.querySelector('.cars'); if (cs){ cs.style.outline = '2px solid #cf6b61'; cs.style.outlineOffset = '6px'; } ok2 = false; } else { var cs2 = root.querySelector('.cars'); if (cs2) cs2.style.outline = ''; } if (!ok2) showError('Bitte Pflichtfelder ausfüllen und ein Fahrzeug wählen.'); return ok2; } return true; } /* Schritt 1: "Weiter" nur aktiv, wenn alles ausgefüllt */ function refreshStep1(){ var ok = ['name','tel','mail'].every(function(id){ return $(id).value.trim() !== ''; }); var b = null, bl = root.querySelectorAll('[data-next]'); for (var qi = 0; qi < bl.length; qi++){ if (bl[qi].getAttribute('data-next') === '1'){ b = bl[qi]; break; } } if (b) b.disabled = !ok; } /* ===== Uhrzeit frei eintippbar (24h) – sanfte Normalisierung ===== */ function normalizeTime(){ var z = $('zeit'); var v = z.value.trim(); if (!v) return; v = v.replace(/[.\-,h ]/g, ':').replace(/::+/g, ':'); var m = v.match(/^(\d{1,2}):?(\d{1,2})?$/); if (!m){ return; } var h = Math.min(23, parseInt(m[1], 10) || 0); var mi = m[2] ? Math.min(59, parseInt(m[2], 10)) : 0; z.value = pad(h) + ':' + pad(mi); clearBox(z); } /* ===== Maps / Route ===== */ function mapsReady(){ return window.google && window.google.maps; } function loadMaps(){ if (mapsReady()){ initMap(); return; } var existing = null, scl = document.getElementsByTagName('script'); for (var qj = 0; qj 150){ clearInterval(t); showError('Google Maps wurde nicht rechtzeitig geladen.'); } }, 100); return; } window.__slsMapsLoading = true; var s = document.createElement('script'); s.src = 'https://maps.googleapis.com/maps/api/js?key=' + CONFIG.GOOGLE_MAPS_API_KEY + '&libraries=places&v=weekly&loading=async&region=' + CONFIG.REGION + '&language='+SLS_LANG+'&callback=slsInitMap'; s.async = true; s.defer = true; s.onerror = function(){ showError('Google Maps konnte nicht geladen werden. Bitte API-Key & aktivierte APIs prüfen.'); }; document.head.appendChild(s); } function initMap(){ var el = $('map'); if (!el) return; try { map = new google.maps.Map(el, { center: CONFIG.MAP_CENTER, zoom: 9, mapTypeControl: false, streetViewControl: false }); directionsService = new google.maps.DirectionsService(); directionsRenderer = new google.maps.DirectionsRenderer({ map: map, polylineOptions: { strokeColor: '#C39A60', strokeWeight: 5, strokeOpacity: .9 } }); } catch(e){ showError('Karte konnte nicht initialisiert werden.'); return; } setupAutocomplete(); } function fmtDauer(min){ var h = Math.floor(min/60), m = Math.round(min%60); return (h>0 ? h+sls_tr(' Std. ') : '') + m + sls_tr(' Min.'); } function berechneRoute(){ var a = $('abhol').value.trim(), b = $('ziel').value.trim(); if (a.length < 2 || b.length < 2){ showError('Bitte Start- und Zieladresse eintragen.'); return; } if (!directionsService){ showError('Karte lädt noch – bitte einen Moment warten.'); return; } hideError(); directionsService.route({ origin: a, destination: b, travelMode: google.maps.TravelMode.DRIVING, region: CONFIG.REGION }, function(res, status){ if (status === 'OK' && res.routes[0]){ directionsRenderer.setDirections(res); var leg = res.routes[0].legs[0]; routeKm = leg.distance.value / 1000; routeMin = leg.duration.value / 60; $('strecke').innerHTML = Math.round(routeKm) + ' km'; $('fahrzeit').innerHTML = fmtDauer(routeMin); } else { routeKm = routeMin = null; showError(sls_tr('Route konnte nicht berechnet werden (Status: ') + status + sls_tr('). Bitte Adressen präzisieren.')); } }); } /* ===== Personen-Regel: ab 5 nur EQV ===== */ function applyPersonenRegel(){ var sel = $('personen'); var n = parseInt((sel && sel.value) || '1', 10); var cars = root.querySelectorAll('.car'); var hint = $('vklasseHint'); if (n >= 5){ cars.forEach(function(c){ var isV = c.getAttribute('data-car') === 'Mercedes EQV'; c.classList.toggle('disabled', !isV); if (!isV) c.classList.remove('sel'); }); var v = null, cl = root.querySelectorAll('.car'); for (var qk = 0; qk < cl.length; qk++){ if (cl[qk].getAttribute('data-car') === 'Mercedes EQV'){ v = cl[qk]; break; } } if (v){ v.classList.add('sel'); $('fahrzeug').value = 'Mercedes EQV'; } if (hint) hint.style.display = 'block'; } else { cars.forEach(function(c){ c.classList.remove('disabled'); }); if (hint) hint.style.display = 'none'; } } /* ===== Datums-Picker ===== */ function buildDatePicker(input){ if (!input) return; var f = input.closest('.f'); var pop = document.createElement('div'); pop.className = 'pick'; pop.style.display = 'none'; f.appendChild(pop); var MON = (SLS_T && SLS_T.__MONTHS) || ['Januar','Februar','März','April','Mai','Juni','Juli','August','September','Oktober','November','Dezember']; var DOW = (SLS_T && SLS_T.__DOWS) || ['Mo','Di','Mi','Do','Fr','Sa','So']; var today = new Date(); today.setHours(0,0,0,0); var view = new Date(today.getFullYear(), today.getMonth(), 1); var sel = null; function build(){ pop.innerHTML = ''; var head = document.createElement('div'); head.className = 'cal-head'; var prev = document.createElement('button'); prev.type = 'button'; prev.textContent = '‹'; var title = document.createElement('div'); title.className = 'cal-title'; title.textContent = MON[view.getMonth()] + ' ' + view.getFullYear(); var next = document.createElement('button'); next.type = 'button'; next.textContent = '›'; prev.addEventListener('click', function(e){ e.stopPropagation(); view.setMonth(view.getMonth()-1); build(); }); next.addEventListener('click', function(e){ e.stopPropagation(); view.setMonth(view.getMonth()+1); build(); }); head.appendChild(prev); head.appendChild(title); head.appendChild(next); pop.appendChild(head); var grid = document.createElement('div'); grid.className = 'cal-grid'; DOW.forEach(function(d){ var c = document.createElement('div'); c.className = 'dow'; c.textContent = d; grid.appendChild(c); }); var startDow = (new Date(view.getFullYear(), view.getMonth(), 1).getDay() + 6) % 7; var dim = new Date(view.getFullYear(), view.getMonth()+1, 0).getDate(); for (var i = 0; i < startDow; i++){ var em = document.createElement('div'); em.className = 'day muted'; grid.appendChild(em); } for (var d = 1; d <= dim; d++){ var cell = document.createElement('div'); cell.className = 'day'; cell.textContent = d; var dd = new Date(view.getFullYear(), view.getMonth(), d); if (dd.getTime() === today.getTime()) cell.classList.add('today'); if (sel && dd.getTime() === sel.getTime()) cell.classList.add('sel'); if (dd < today){ cell.classList.add('disabled'); } else { (function(dateObj){ cell.addEventListener('click', function(ev){ ev.stopPropagation(); sel = dateObj; input.value = pad(dateObj.getDate()) + '.' + pad(dateObj.getMonth()+1) + '.' + dateObj.getFullYear(); input.dataset.iso = dateObj.getFullYear() + '-' + pad(dateObj.getMonth()+1) + '-' + pad(dateObj.getDate()); clearBox(input); close(); }); })(dd); } grid.appendChild(cell); } pop.appendChild(grid); } function open(){ build(); pop.style.display = 'block'; } function close(){ pop.style.display = 'none'; } input.addEventListener('click', function(e){ e.stopPropagation(); open(); }); input.addEventListener('focus', open); document.addEventListener('click', function(e){ if (!f.contains(e.target)) close(); }); } /* ===== Adress-Autocomplete ===== */ function setupAutocomplete(){ google.maps.importLibrary('places').then(function(lib){ placesLib = lib; attachAutocomplete($('abhol')); attachAutocomplete($('ziel')); }).catch(function(){ /* Places (New) evtl. nicht aktiviert */ }); } function attachAutocomplete(input){ if (!input) return; var cell = input.closest('.f'); var list = document.createElement('ul'); list.className = 'ac-list'; list.style.display = 'none'; cell.appendChild(list); var items = [], active = -1, timer = null; var token = new placesLib.AutocompleteSessionToken(); function close(){ list.style.display = 'none'; list.innerHTML = ''; items = []; active = -1; } function choose(text){ input.value = text; clearBox(input); close(); token = new placesLib.AutocompleteSessionToken(); routeKm = routeMin = null; } function paint(){ Array.prototype.slice.call(list.querySelectorAll('.ac-item')).forEach(function(el,i){ el.classList.toggle('on', i === active); }); } function query(){ var val = input.value.trim(); if (val.length = 0){ e.preventDefault(); choose(items[active].text.text); } else if (e.key === 'Escape'){ close(); } }); input.addEventListener('blur', function(){ setTimeout(close, 150); }); } /* ===== Optionen einsammeln ===== */ function gatherOptionen(){ var out = []; root.querySelectorAll('.chk input:checked').forEach(function(c){ out.push(c.getAttribute('data-opt')); }); return out; } /* ===== Zusammenfassung ===== */ function srow(k, v){ k = sls_tr(k); if (!v || v === '—') return ''; var d = document.createElement('div'); d.className = 'srow'; var a = document.createElement('div'); a.className = 'sk'; a.textContent = k; var b = document.createElement('div'); b.className = 'sv'; b.textContent = v; d.appendChild(a); d.appendChild(b); return d.outerHTML; } function buildSummary(){ var fz = $('fahrzeug').value; var html = ''; html += srow('Name', $('name').value.trim()); html += srow('Telefon', $('tel').value.trim()); html += srow('E-Mail', $('mail').value.trim()); html += srow('Startadresse', $('abhol').value.trim()); html += srow('Zieladresse', $('ziel').value.trim()); html += srow('Datum', $('datum').value.trim()); html += srow('Uhrzeit', $('zeit').value.trim()); html += srow('Transferart', $('art').value); html += srow('Personen', $('personen').value); html += srow('Wartezeiten', $('warten').value); html += srow('Zahlungsart', ($('zahlung') ? $('zahlung').value : '')); html += srow('Strecke', routeKm != null ? Math.round(routeKm) + ' km' : ''); html += srow('Fahrzeit', routeMin != null ? fmtDauer(routeMin) : ''); html += srow('Fahrzeug', sls_tr(fz)); html += srow('Tarif', sls_tr(fz ? (ABPREIS[fz] || '') : '')); html += srow('Optionen', gatherOptionen().join(', ')); html += srow('Bemerkungen', $('bemerkung').value.trim()); $('summary').innerHTML = html; } /* ===== Absenden ===== */ function onSubmit(e){ e.preventDefault(); hideError(); if (!validateStep(1)){ showStep(1); return; } if (!validateStep(2)){ showStep(2); return; } var fz = $('fahrzeug').value; var payload = { lang: SLS_LANG, datum: ($('datum').dataset.iso || ''), zeit: $('zeit').value.trim(), abhol: $('abhol').value.trim(), ziel: $('ziel').value.trim(), art: $('art').value, personen: $('personen').value, warten: $('warten').value, fahrzeug: sls_tr(fz), strecke: (routeKm != null ? Math.round(routeKm) + ' km' : '—'), fahrzeit: (routeMin != null ? fmtDauer(routeMin) : '—'), preis: sls_tr(ABPREIS[fz] || 'auf Anfrage'), optionen: (function(){ var o = gatherOptionen(); var z = ($('zahlung') && $('zahlung').value) ? (sls_tr('Zahlungsart: ') + $('zahlung').value) : ''; if (z) o.push(z); return o.join(', '); })(), name: $('name').value.trim(), tel: $('tel').value.trim(), mail: $('mail').value.trim(), bemerkung: $('bemerkung').value.trim(), website: $('website').value }; var btn = $('submitBtn'); btn.disabled = true; var label = btn.textContent; btn.textContent = sls_tr('Wird gesendet …'); fetch(CONFIG.API_URL, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payload) }) .then(function(r){ return r.json().then(function(d){ return { ok: r.ok, d: d }; }).catch(function(){ return { ok: r.ok, d: {} }; }); }) .then(function(out){ if (out.ok && out.d.ok){ $('anfrage').querySelectorAll('input,select,textarea,button').forEach(function(el){ el.disabled = true; }); root.querySelectorAll('.nav').forEach(function(n){ n.style.display = 'none'; }); var s = $('success'); s.style.display = 'block'; try { if (typeof gtag === 'function') { gtag('event', 'conversion', { 'send_to': 'AW-18479808801/rN7rCKKr-ogdEKGC7utE' }); } } catch(e) {} s.scrollIntoView({ behavior: 'smooth', block: 'center' }); } else { btn.disabled = false; btn.textContent = label; showError((out.d && out.d.error) || 'Es ist ein Fehler aufgetreten. Bitte später erneut versuchen oder anrufen.'); } }) .catch(function(){ btn.disabled = false; btn.textContent = label; showError('Verbindung fehlgeschlagen. Bitte Internetverbindung prüfen oder telefonisch anfragen.'); }); } /* ===== Verdrahtung ===== */ function wire(){ buildDatePicker($('datum')); var z = $('zeit'); if (z){ z.addEventListener('blur', normalizeTime); z.addEventListener('input', function(){ clearBox(z); }); } ['name','tel','mail'].forEach(function(id){ var el = $(id); if (el) el.addEventListener('input', function(){ clearBox(el); refreshStep1(); }); }); refreshStep1(); var sb = $('searchBtn'); if (sb) sb.addEventListener('click', berechneRoute); var pers = $('personen'); if (pers) pers.addEventListener('change', applyPersonenRegel); var cars = root.querySelectorAll('.car'); cars.forEach(function(c){ c.addEventListener('click', function(){ if (c.classList.contains('disabled')) return; cars.forEach(function(x){ x.classList.remove('sel'); }); c.classList.add('sel'); $('fahrzeug').value = c.getAttribute('data-car'); var cs = root.querySelector('.cars'); if (cs) cs.style.outline = ''; }); }); applyPersonenRegel(); root.querySelectorAll('[data-next]').forEach(function(b){ b.addEventListener('click', function(){ var n = parseInt(b.dataset.next,10); if (validateStep(n)) showStep(n + 1); }); }); root.querySelectorAll('[data-prev]').forEach(function(b){ b.addEventListener('click', function(){ showStep(parseInt(b.dataset.prev,10) - 1); }); }); root.querySelectorAll('.step').forEach(function(s){ s.addEventListener('click', function(){ var sn = parseInt(s.dataset.step,10); if (sn < step) showStep(sn); }); }); var form = $('anfrage'); if (form) form.addEventListener('submit', onSubmit); } if (document.readyState === 'loading'){ document.addEventListener('DOMContentLoaded', function(){ wire(); loadMaps(); }); } else { wire(); loadMaps(); } })();