Android Radio Konfigurator: Unterschied zwischen den Versionen

Aus Wiki rund um Android-Navis für BMW E38/E39/E46/E53
Wechseln zu: Navigation, Suche
Zeile 23: Zeile 23:
#nvk .nvk-note{border:1px solid rgba(128,128,128,.45);border-left:5px solid #fc3;border-radius:4px;padding:9px 12px;margin:8px 0}
#nvk .nvk-note{border:1px solid rgba(128,128,128,.45);border-left:5px solid #fc3;border-radius:4px;padding:9px 12px;margin:8px 0}
#nvk .nvk-miss{opacity:.8;font-style:italic}
#nvk .nvk-miss{opacity:.8;font-style:italic}
#nvk .nvk-img{max-width:150px;max-height:110px;height:auto;margin:4px 8px 0 0;border:1px solid rgba(128,128,128,.4);border-radius:3px;background:#fff}
#nvk .nvk-card .nvk-img{max-width:230px;max-height:150px}
#nvk input[type=text],#nvk input[type=email],#nvk textarea{width:100%;padding:9px 8px;font:inherit;color:#202122;background:#fff;border:1px solid #a2a9b1;border-radius:4px}
#nvk #nvk-form{margin-top:22px}
</style>
</style>
<div class="nvk-grid" id="nvk-fields"></div>
<div class="nvk-grid" id="nvk-fields"></div>
Zeile 28: Zeile 32:
<button type="button" class="nvk-btn" id="nvk-reset">Auswahl zurücksetzen</button>
<button type="button" class="nvk-btn" id="nvk-reset">Auswahl zurücksetzen</button>
<div id="nvk-out" aria-live="polite"></div>
<div id="nvk-out" aria-live="polite"></div>
<fieldset id="nvk-form" style="display:none"><legend>Anfrage senden</legend>
<p class="nvk-help">Deine Auswahl und die Liste oben werden automatisch mitgesendet. Alle Felder mit * sind Pflicht.</p>
<div class="nvk-grid">
<div class="nvk-f"><label for="nvk-name">Name *</label><input id="nvk-name" type="text" autocomplete="name"></div>
<div class="nvk-f"><label for="nvk-mail">E-Mail *</label><input id="nvk-mail" type="email" autocomplete="email"></div>
<div class="nvk-f"><label for="nvk-vin">VIN (optional)</label><input id="nvk-vin" type="text" maxlength="17"></div>
</div>
<div class="nvk-f"><label for="nvk-msg">Kommentar *</label><textarea id="nvk-msg" rows="4"></textarea></div>
<div class="nvk-f" style="max-width:300px"><label for="nvk-cap" id="nvk-capq">Sicherheitsfrage *</label><input id="nvk-cap" type="text" inputmode="numeric"></div>
<input id="nvk-hp" type="text" tabindex="-1" autocomplete="off" aria-hidden="true" style="position:absolute;left:-9999px;width:1px">
<label class="nvk-o"><input type="checkbox" id="nvk-dsgvo"> Ich stimme zu, dass meine Angaben zur Bearbeitung der Anfrage per E-Mail verarbeitet werden. *</label>
<button type="button" class="nvk-btn" id="nvk-send">Anfrage senden</button>
<div id="nvk-status" class="nvk-note" style="display:none"></div>
</fieldset>
<noscript>Für den Konfigurator wird JavaScript benötigt.</noscript>
<noscript>Für den Konfigurator wird JavaScript benötigt.</noscript>
<script>
<script>
var SEND_URL = "https://xtrons.ibus-app.de/send-anfrage.php";
(function () {
(function () {
"use strict";
"use strict";
Zeile 40: Zeile 59:
var SHOP = "https://shop.ibus-app.de/";
var SHOP = "https://shop.ibus-app.de/";
var WIKI = "https://wiki.ibus-app.de/index.php?title=";
var WIKI = "https://wiki.ibus-app.de/index.php?title=";
/* Bilder aus dem Wiki (Thumbnail-Adressen; Klick öffnet automatisch das Originalbild) */
var IM = "https://xtrons.ibus-app.de/images/thumb/";
var P = {
  schema:  IM + "e/ea/BMW_E39_Verl%C3%A4ngerungen_EXL005%2BFAKRA_.png/135px-BMW_E39_Verl%C3%A4ngerungen_EXL005%2BFAKRA_.png",
  exl005:  IM + "7/70/Exl005-1.webp/257px-Exl005-1.webp.png",
  fakra6m: IM + "d/d8/FM-extension_01_1.png/270px-FM-extension_01_1.png",
  isofakra: IM + "4/4e/ISO-FAKRA_1.png/270px-ISO-FAKRA_1.png",
  bm24:    IM + "8/82/BM24.png/130px-BM24.png",
  iso:    IM + "d/dd/Iso.jpg/69px-Iso.jpg",
  bm54:    IM + "3/34/BM54.png/135px-BM54.png",
  fakra:  IM + "b/b3/Fakra.jpg/100px-Fakra.jpg",
  pfeil:  IM + "e/ee/Navi_E46.jpg/239px-Navi_E46.jpg",
  noquad:  IM + "6/68/No_elongation.jpg/180px-No_elongation.jpg",
  noexl6:  IM + "7/7b/No_EXL006.jpg/180px-No_EXL006.jpg",
  halter:  IM + "3/3b/Halter_Alu.webp/92px-Halter_Alu.webp.png",
  funktr:  IM + "7/7e/E46_Funktionstraeger.png/240px-E46_Funktionstraeger.png"
};
/* Anfrage-Formular: MAIL_TO = Empfänger. SEND_URL leer = E-Mail-Programm des Kunden öffnen (mailto).
  SEND_URL = Adresse des Server-Skripts send-anfrage.php = Versand direkt vom Server (mit CC an den Kunden). */
var MAIL_TO = "info@ibus-app.de";
var MAIL_SUBJECT = "Anfrage aus Android Radio Konfigurator";
var SEND_URL = "";
/* ---- 1) Baureihen --------------------------------------------------------
/* ---- 1) Baureihen --------------------------------------------------------
   v = Shop-Kategorie (Link: SHOP + bmw-radios/ + v + /)
   v = Shop-Kategorie (Link: SHOP + bmw-radios/ + v + /)
Zeile 72: Zeile 113:
   { v: "z4-e85e86", t: "Z4 E85/E86", gen: "b", body: "roadster,coupe" }
   { v: "z4-e85e86", t: "Z4 E85/E86", gen: "b", body: "roadster,coupe" }
];
];
var DSPV = ["5er-e39", "7er-e38", "x5-e53","x3-e83"];
function allIds() { return VEHICLES.map(function (x) { return x.v; }); }
var HKV = allIds().filter(function (v) { return DSPV.indexOf(v) === -1; });
var bodyValues = Object.keys(BODY).map(function (k) {
var bodyValues = Object.keys(BODY).map(function (k) {
   return { v: k, t: BODY[k], only: { vehicle: VEHICLES.filter(function (x) { return x.body.split(",").indexOf(k) !== -1; }).map(function (x) { return x.v; }) } };
   return { v: k, t: BODY[k], only: { vehicle: VEHICLES.filter(function (x) { return x.body.split(",").indexOf(k) !== -1; }).map(function (x) { return x.v; }) } };
Zeile 84: Zeile 122:
   { id: "vehicle", label: "Fahrzeug", values: VEHICLES.map(function (x) { return { v: x.v, t: "BMW " + x.t }; }) },
   { id: "vehicle", label: "Fahrzeug", values: VEHICLES.map(function (x) { return { v: x.v, t: "BMW " + x.t }; }) },
   { id: "factory", label: "Verbaut ab Werk", values: [
   { id: "factory", label: "Verbaut ab Werk", values: [
     { v: "iris",  t: "Radio mit IRIS", only: { gen: ["alt"] } },
     { v: "iris",  t: "Radio mit IRIS", only: { vehicle: ["3er-e46", "5er-e39", "7er-e38", "x5-e53"] } },
     { v: "mid",  t: "Radio mit MID",  only: { gen: ["alt"] } },
     { v: "mid",  t: "Radio mit MID",  only: { gen: ["alt"] } },
     { v: "n43",  t: "4:3 Navi",      only: { vehicle: ["5er-e39", "7er-e38"] } },
     { v: "n43",  t: "4:3 Navi",      only: { vehicle: ["5er-e39", "7er-e38"] } },
Zeile 94: Zeile 132:
     { v: "nbt",  t: "NBT",            only: { gen: ["c"] } },
     { v: "nbt",  t: "NBT",            only: { gen: ["c"] } },
     { v: "nbtevo", t: "NBT EVO",      only: { gen: ["c"] } } ] },
     { v: "nbtevo", t: "NBT EVO",      only: { gen: ["c"] } } ] },
   { id: "trunk", label: "Befindet sich im Kofferraum ein Radiomodul?", optional: true, show: { factory: ["pfeil"] }, values: [
   { id: "trunk", label: "Wo sitzt das Radiomodul des Pfeilnavis?", optional: true, show: { factory: ["pfeil"] },
     { v: "ja", t: "Ja, Radio-/Navimodul im Kofferraum" },
    help: "Bitte prüfen: Sitzt das Modul im Kofferraum, oder im Pfeilnavi selbst (Quadlock hinten neben dem Antennenstecker)?[br][img=" + P.pfeil + "]",
     { v: "nein", t: "Nein, Anschlüsse nur hinter dem Radio" },
    values: [
     { v: "ja", t: "Im Kofferraum (Verlängerungen nötig)" },
     { v: "nein", t: "Im Pfeilnavi, Quadlock hinten (keine Verlängerung)" },
     { v: "unk", t: "Weiß ich nicht" } ] },
     { v: "unk", t: "Weiß ich nicht" } ] },
   { id: "aux", label: "AUX-IN verfügbar?", show: { gen: ["b", "c"] }, values: [
   { id: "aux", label: "AUX-IN verfügbar?", show: { gen: ["b", "c"] }, values: [
Zeile 103: Zeile 143:
     { v: "stereo", t: "Stereo" },
     { v: "stereo", t: "Stereo" },
     { v: "hifi",  t: "Hifi" },
     { v: "hifi",  t: "Hifi" },
     { v: "dsp",    t: "DSP", only: { vehicle: DSPV } },
     { v: "dsp",    t: "DSP", only: { vehicle: ["7er-e38", "5er-e39", "x5-e53", "x3-e83"] } },
     { v: "hk",    t: "Harman Kardon", only: { vehicle: HKV } } ] },
     { v: "hk",    t: "Harman Kardon", only: { vehicle: ["3er-e46", "z4-e85e86"] } },
    { v: "logic7", t: "Logic7", only: { vehicle: ["3er-e9x", "5er-e6x", "6er-e6x", "7er-e65", "1er-e8x"] } },
    { v: "hksur",  t: "Harman Kardon Surround", only: { vehicle: ["1er-f2x", "2er-f2x", "3er-f3x", "4er-f3x", "5er-f1x"] } } ] },
   { id: "current", label: "Aktuell verbaut", values: [
   { id: "current", label: "Aktuell verbaut", values: [
     { v: "werk", t: "Werksradio / Werksnavi" },
     { v: "werk", t: "Werksradio / Werksnavi" },
Zeile 110: Zeile 152:
   { id: "body", label: "Karosserie", auto: true, values: bodyValues },
   { id: "body", label: "Karosserie", auto: true, values: bodyValues },
   { id: "ant", label: "Antennenstecker am Radio (optional)", optional: true, def: "unk",
   { id: "ant", label: "Antennenstecker am Radio (optional)", optional: true, def: "unk",
     help: "BM24 (Rundpin) = ISO-Antennenstecker, ggf. Adapter nötig. BM54 = FAKRA, kein Adapter nötig.",
     show: { vehicle: ["7er-e38", "5er-e39", "3er-e46", "x5-e53"] },
     values: [
     values: [
     { v: "unk",  t: "Weiß ich nicht" },
     { v: "unk",  t: "Weiß ich nicht", info: "[b]BM24[/b] (Rundpin) = ISO-Antennenstecker:[br][img=" + P.bm24 + "][img=" + P.iso + "][br][b]BM54[/b] = FAKRA:[br][img=" + P.bm54 + "][img=" + P.fakra + "]" },
     { v: "iso",  t: "ISO (BM24, Rundpin (OG))" },
     { v: "iso",  t: "ISO (BM24, Rundpin)", info: "[img=" + P.bm24 + "][img=" + P.iso + "]" },
     { v: "fakra", t: "FAKRA (BM54, Flachpin (Quadlock))" } ] }
     { v: "fakra", t: "FAKRA (BM54)", info: "[img=" + P.bm54 + "][img=" + P.fakra + "]" } ] }
];
];
/* ---- 3) Zusatzoptionen (Mehrfachauswahl) ---------------------------------
/* ---- 3) Zusatzoptionen (Mehrfachauswahl) ---------------------------------
Zeile 139: Zeile 181:
   skipIf = Artikel entfällt, wenn der genannte Artikel schon in der Liste steht */
   skipIf = Artikel entfällt, wenn der genannte Artikel schon in der Liste steht */
var ITEMS = {
var ITEMS = {
   exl005:  { t: "Verlängerung EXL005", d: "Ersetzt das Radiomodul im Kofferraum.", u: SHOP + "detail/index/sArticle/212/" },
   exl005:  { t: "Verlängerung EXL005", d: "Ersetzt das Radiomodul im Kofferraum.", u: SHOP + "detail/index/sArticle/212/", img: [P.exl005, P.schema] },
   fakra6m: { t: "Verlängerung 6 m FAKRA(m) auf FAKRA(f), gewinkelt", d: "Antennenverlängerung vom Kofferraum nach vorn.",
   fakra6m: { t: "Verlängerung 6 m FAKRA(m) auf FAKRA(f), gewinkelt", d: "Antennenverlängerung vom Kofferraum nach vorn.", img: [P.fakra6m],
             u: SHOP + "shop/zubehoer/adapterkabel/192/verlaengerung-6m-fakra-m-auf-fakra-f-kurz-gewinkelt" },
             u: SHOP + "shop/zubehoer/adapterkabel/192/verlaengerung-6m-fakra-m-auf-fakra-f-kurz-gewinkelt" },
   isoada:  { t: "Adapter ISO-Stecker auf FAKRA, gewinkelt (15 cm)", d: "Nötig bei ISO-Antennenstecker (BM24, Rundpin).",
   isoada:  { t: "Adapter ISO-Stecker auf FAKRA, gewinkelt (15 cm)", d: "Nötig bei ISO-Antennenstecker (BM24, Rundpin).", img: [P.isofakra],
             u: SHOP + "shop/zubehoer/adapterkabel/193/adapter-kabel-iso-f-auf-fakra-f-kurz-gewinkelt-15cm" },
             u: SHOP + "shop/zubehoer/adapterkabel/193/adapter-kabel-iso-f-auf-fakra-f-kurz-gewinkelt-15cm" },
   bcdsp:  { t: "I-BUS App - BC+DSP Lizenz", d: "Ohne DSP-Lizenz arbeitet das Werks-DSP nicht.",
   bcdsp:  { t: "I-BUS App - BC+DSP Lizenz", d: "Ohne DSP-Lizenz arbeitet das Werks-DSP nicht.",
             u: SHOP + "i-bus-app/lizenzen/171/i-bus-app-bc-dsp-lizenz" },
             u: SHOP + "i-bus-app/lizenzen/171/i-bus-app-bc-dsp-lizenz" },
   halter:  { t: "Alu-Halter zur Radio-Montage im BMW E39", d: "Empfohlen bei Radios, die nicht von AVIN stammen.",
   halter:  { t: "Alu-Halter zur Radio-Montage im BMW E39", d: "Empfohlen bei Radios, die nicht von AVIN stammen.", img: [P.halter],
             u: SHOP + "i-bus-app/zubehoer/radiohalter/185/alu-halter-zur-radio-montage-im-bmw-e39" },
             u: SHOP + "i-bus-app/zubehoer/radiohalter/185/alu-halter-zur-radio-montage-im-bmw-e39" },
   ibus:    { t: "I-BUS App", d: "Erhält die Bordcomputer-Funktionen und steuert z. B. den Original-CD-Wechsler.",
   ibus:    { t: "I-BUS App", d: "Erhält die Bordcomputer-Funktionen und steuert z. B. den Original-CD-Wechsler.",
Zeile 176: Zeile 218:
   { type: "need", when: { current: ["werk"], module: ["ja"] }, items: ["exl005", "fakra6m"] },
   { type: "need", when: { current: ["werk"], module: ["ja"] }, items: ["exl005", "fakra6m"] },
   { type: "hint", when: { current: ["nach"], module: ["ja"] },
   { type: "hint", when: { current: ["nach"], module: ["ja"] },
     html: "[b]Verlängerungen prüfen:[/b] Bei einem bereits verbauten Nachrüst-Radio sollten EXL005 und FAKRA-Verlängerung schon vorhanden sein. [b]Ungeeignet[/b] sind die Standard-Quad-Lock-Verlängerung kombiniert mit Antennenverlängerung und die EXL006 (kein BUS-Signal)." },
     html: "[b]Verlängerungen prüfen:[/b] Bei einem bereits verbauten Nachrüst-Radio sollten EXL005 und FAKRA-Verlängerung schon vorhanden sein. [b]Ungeeignet[/b] sind die Standard-Quad-Lock-Verlängerung kombiniert mit Antennenverlängerung und die EXL006 (kein BUS-Signal).[br][img=" + P.noquad + "][img=" + P.noexl6 + "]" },
   { type: "hint", when: { module: ["ja"] },
   { type: "hint", when: { module: ["ja"] },
     html: "[b]Kabelwege:[/b] Die Technik sitzt im Kofferraum. Mindestens Radioanschluss und FM-Antenne müssen nach vorn verlegt werden. Optional zusätzlich: GPS (OEM-Antenne), Verlängerung für DAB+, Anschluss OEM-CD-Wechsler, Cinch für Subwoofer." },
     html: "[b]Kabelwege:[/b] Die Technik sitzt im Kofferraum. Mindestens Radioanschluss und FM-Antenne müssen nach vorn verlegt werden. Optional zusätzlich: GPS (OEM-Antenne), Verlängerung für DAB+, Anschluss OEM-CD-Wechsler, Cinch für Subwoofer." },
Zeile 182: Zeile 224:
     html: "[b]Kabelwege:[/b] Alle Anschlüsse befinden sich direkt hinter dem Radio, es müssen [b]keine[/b] Kabel verlegt werden. Optional ggf. für: GPS (OEM-Antenne), DAB+, OEM-CD-Wechsler, Cinch für Subwoofer." },
     html: "[b]Kabelwege:[/b] Alle Anschlüsse befinden sich direkt hinter dem Radio, es müssen [b]keine[/b] Kabel verlegt werden. Optional ggf. für: GPS (OEM-Antenne), DAB+, OEM-CD-Wechsler, Cinch für Subwoofer." },
   { type: "hint", when: { module: ["unk"] },
   { type: "hint", when: { module: ["unk"] },
     html: "[b]Bitte prüfen:[/b] Schau nach, ob im Kofferraum ein Radiomodul sitzt. Manche E46 mit Pfeilnavi (vermutlich Vorfacelift) haben das Radio hinten und benötigen dann EXL005 und FAKRA-Verlängerung." },
     html: "[b]Bitte prüfen:[/b] Schau nach, ob im Kofferraum ein Radiomodul sitzt. Bei E46 mit Pfeilnavi gibt es zwei Varianten: Radiomodul im Kofferraum = EXL005 und FAKRA-Verlängerung nötig. Radiomodul im Pfeilnavi (Quadlock hinten neben dem Antennenstecker) = keine Verlängerung nötig." },
   { type: "need", when: { ant: ["iso"] }, items: ["isoada"] },
   { type: "need", when: { ant: ["iso"] }, items: ["isoada"] },
   { type: "hint", when: { ant: ["unk"] },
   { type: "hint", when: { ant: ["unk"] },
Zeile 200: Zeile 242:
     html: "[b]Montage E46 ohne großes Navi:[/b] Das Klimabedienteil muss nach unten versetzt werden. Dafür brauchst Du den passenden [b]Funktionsträger[/b] (neu ca. 100 €, ggf. beim Teileverwerter günstiger):[br]" +
     html: "[b]Montage E46 ohne großes Navi:[/b] Das Klimabedienteil muss nach unten versetzt werden. Dafür brauchst Du den passenden [b]Funktionsträger[/b] (neu ca. 100 €, ggf. beim Teileverwerter günstiger):[br]" +
           "Einzelschalter (eher VFL): [a=https://www.leebmann24.de/trager-3er-51168202186.html]ohne Raucher 51168202186[/a] / [a=https://www.leebmann24.de/trager-3er-51168230902.html]mit Raucher 51168230902[/a][br]" +
           "Einzelschalter (eher VFL): [a=https://www.leebmann24.de/trager-3er-51168202186.html]ohne Raucher 51168202186[/a] / [a=https://www.leebmann24.de/trager-3er-51168230902.html]mit Raucher 51168230902[/a][br]" +
           "Schaltzentrum (eher FL): [a=https://www.leebmann24.de/funktionstrager-schaltzentrum-3er-51167001408.html]ohne Raucher 51167001408[/a] / [a=https://www.leebmann24.de/funktionstrager-schaltzentrum-3er-51167001410.html]mit Raucher 51167001410[/a]" },
           "Schaltzentrum (eher FL): [a=https://www.leebmann24.de/funktionstrager-schaltzentrum-3er-51167001408.html]ohne Raucher 51167001408[/a] / [a=https://www.leebmann24.de/funktionstrager-schaltzentrum-3er-51167001410.html]mit Raucher 51167001410[/a][br][img=" + P.funktr + "]" },
  { type: "hint", when: { factory: ["cic", "nbt", "nbtevo"] },
    html: "[b]Lichtleiter:[/b] Ggf. vorhandene Lichtleiter (MOST) müssen aus dem BMW-Stecker in den Xtrons-Adapter umgesteckt werden." },
  { type: "hint", when: { factory: ["mask", "ccc", "cic", "nbt", "nbtevo"] },
    html: "[b]Originales Radiomodul bleibt erhalten:[/b] Bei M-ASK, CCC, CIC, NBT und NBT EVO bleibt das originale Radiomodul im Fahrzeug und muss funktionieren! Ersetzt wird nur der Bildschirm." },
   { type: "hint", opts: ["ibus"], when: {},
   { type: "hint", opts: ["ibus"], when: {},
     html: "[b]I-BUS App:[/b] Siehe [a=https://wiki.ibus-app.de/index.php?title=Was_brauche_ich_um_die_I-BUS_App_nutzen_zu_k%C3%B6nnen%3F]Was brauche ich, um die I-BUS App nutzen zu können?[/a] und die [a=https://wiki.ibus-app.de/index.php?title=Hauptseite#Einbauanleitung_f.C3.BCr_Resler_Modul_und_Resler_Interface]Einbauanleitung für Resler Modul und Interface[/a]." },
     html: "[b]I-BUS App:[/b] Siehe [a=https://wiki.ibus-app.de/index.php?title=Was_brauche_ich_um_die_I-BUS_App_nutzen_zu_k%C3%B6nnen%3F]Was brauche ich, um die I-BUS App nutzen zu können?[/a] und die [a=https://wiki.ibus-app.de/index.php?title=Hauptseite#Einbauanleitung_f.C3.BCr_Resler_Modul_und_Resler_Interface]Einbauanleitung für Resler Modul und Interface[/a]." },
Zeile 210: Zeile 256:
   ===================================================================== */
   ===================================================================== */
var $ = function (id) { return document.getElementById(id); };
var $ = function (id) { return document.getElementById(id); };
var sel = {}, picked = {};
var sel = {}, picked = {}, summary = "", capA = 0, capB = 0;
var fieldsEl = $("nvk-fields"), optsEl = $("nvk-opts"), outEl = $("nvk-out");
var fieldsEl = $("nvk-fields"), optsEl = $("nvk-opts"), outEl = $("nvk-out");
function full(u) { return u.indexOf("/thumb/") === -1 ? u : u.replace("/thumb/", "/").replace(/\/[^\/]+$/, ""); }
function fmt(t) {
function fmt(t) {
   return t.replace(/\[b\]/g, "\u003Cb\u003E").replace(/\[\/b\]/g, "\u003C/b\u003E").replace(/\[br\]/g, "\u003Cbr\u003E")
   return t.replace(/\[img=([^\x5D]+)\]/g, function (m, u) {
    return "\u003Ca href=\"" + full(u) + "\" target=\"_blank\" rel=\"noopener\"\u003E\u003Cimg class=\"nvk-img\" src=\"" + u + "\" alt=\"\"\u003E\u003C/a\u003E";
  }).replace(/\[b\]/g, "\u003Cb\u003E").replace(/\[\/b\]/g, "\u003C/b\u003E").replace(/\[br\]/g, "\u003Cbr\u003E")
     .replace(/\[a=([^\x5D]+)\]/g, "\u003Ca href=\"$1\" target=\"_blank\" rel=\"noopener\"\u003E").replace(/\[\/a\]/g, "\u003C/a\u003E");
     .replace(/\[a=([^\x5D]+)\]/g, "\u003Ca href=\"$1\" target=\"_blank\" rel=\"noopener\"\u003E").replace(/\[\/a\]/g, "\u003C/a\u003E");
}
}
Zeile 258: Zeile 307:
   s.addEventListener("change", function () { sel[f.id] = s.value; update(); });
   s.addEventListener("change", function () { sel[f.id] = s.value; update(); });
   wrap.appendChild(lab); wrap.appendChild(s);
   wrap.appendChild(lab); wrap.appendChild(s);
   if (f.help) { var h = document.createElement("div"); h.className = "nvk-help"; h.textContent = f.help; wrap.appendChild(h); }
   if (f.help) { var h = document.createElement("div"); h.className = "nvk-help"; h.innerHTML = fmt(f.help); wrap.appendChild(h); }
  var inf = document.createElement("div"); inf.id = "nvk-i-" + f.id; wrap.appendChild(inf);
   fieldsEl.appendChild(wrap);
   fieldsEl.appendChild(wrap);
});
});
Zeile 278: Zeile 328:
     });
     });
     el.value = sel[f.id] || "";
     el.value = sel[f.id] || "";
    var cur = allowed.filter(function (v) { return v.v === sel[f.id]; })[0];
    $("nvk-i-" + f.id).innerHTML = cur ? (cur.info ? fmt(cur.info) : "") : "";
   });
   });
}
}
Zeile 311: Zeile 363:
   var b = document.createElement("b"); b.textContent = item.t; d.appendChild(b);
   var b = document.createElement("b"); b.textContent = item.t; d.appendChild(b);
   if (item.d) { var p = document.createElement("span"); p.textContent = item.d; d.appendChild(p); }
   if (item.d) { var p = document.createElement("span"); p.textContent = item.d; d.appendChild(p); }
  if (item.img) {
    var im = document.createElement("div");
    item.img.forEach(function (u) {
      var a = document.createElement("a"); a.href = full(u); a.target = "_blank"; a.rel = "noopener";
      var g = document.createElement("img"); g.className = "nvk-img"; g.src = u; g.alt = item.t; a.appendChild(g); im.appendChild(a);
    });
    d.appendChild(im);
  }
   if (item.u || item.w) {
   if (item.u || item.w) {
     var l = document.createElement("div"); l.className = "nvk-links";
     var l = document.createElement("div"); l.className = "nvk-links";
Zeile 330: Zeile 390:
     var m = document.createElement("p"); m.className = "nvk-miss";
     var m = document.createElement("p"); m.className = "nvk-miss";
     m.textContent = "Bitte noch auswählen: " + missing.map(function (f) { return f.label; }).join(", ");
     m.textContent = "Bitte noch auswählen: " + missing.map(function (f) { return f.label; }).join(", ");
     outEl.appendChild(m); return;
     outEl.appendChild(m); $("nvk-form").style.display = "none"; return;
   }
   }
  $("nvk-form").style.display = "";
   var needs = [], hints = [], seen = {};
   var needs = [], hints = [], seen = {};
   RULES.forEach(function (r) {
   RULES.forEach(function (r) {
Zeile 362: Zeile 423:
   outEl.appendChild(card({ t: "BMW Radios für " + veh.t, d: "Alle Radios, die für Deinen BMW " + veh.t + " im Shop erhältlich sind.",
   outEl.appendChild(card({ t: "BMW Radios für " + veh.t, d: "Alle Radios, die für Deinen BMW " + veh.t + " im Shop erhältlich sind.",
     u: SHOP + "bmw-radios/" + veh.v + "/", ut: "Zu den passenden Radios →", w: SHOP + "bmw-radios/", wt: "Alle BMW Radios" }, "rad"));
     u: SHOP + "bmw-radios/" + veh.v + "/", ut: "Zu den passenden Radios →", w: SHOP + "bmw-radios/", wt: "Alle BMW Radios" }, "rad"));
  var L = ["KONFIGURATION"];
  FIELDS.forEach(function (f) {
    if (!sel[f.id]) return;
    var v = f.values.filter(function (x) { return x.v === sel[f.id]; })[0];
    if (v) L.push("- " + f.label + ": " + v.t);
  });
  L.push("", "BENÖTIGT");
  needs.forEach(function (i) { L.push("- " + i.t + (i.u ? "  " + i.u : "")); });
  if (opt.length) { L.push("", "ZUSATZOPTIONEN"); opt.forEach(function (i) { L.push("- " + i.t + (i.u ? "  " + i.u : "")); }); }
  L.push("", "Radios: " + SHOP + "bmw-radios/" + veh.v + "/");
  summary = L.join("\n");
}
}
function update() { renderFields(); renderOpts(); renderResult(); }
function update() { renderFields(); renderOpts(); renderResult(); }
function newCaptcha() {
  capA = 1 + Math.floor(Math.random() * 9); capB = 1 + Math.floor(Math.random() * 9);
  $("nvk-capq").textContent = "Sicherheitsfrage: Was ist " + capA + " + " + capB + "? *"; $("nvk-cap").value = "";
}
function status(msg, ok) { var e = $("nvk-status"); e.style.display = ""; e.textContent = msg; e.style.borderLeftColor = ok ? "#14866d" : "#d33"; }
$("nvk-send").addEventListener("click", function () {
  var name = $("nvk-name").value.trim(), mail = $("nvk-mail").value.trim(), vin = $("nvk-vin").value.trim(), msg = $("nvk-msg").value.trim();
  if (!name || !mail || !msg) return status("Bitte Name, E-Mail und Kommentar ausfüllen.", false);
  if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(mail)) return status("Bitte eine gültige E-Mail-Adresse eingeben.", false);
  if (vin) { if (!/^[A-HJ-NPR-Za-hj-npr-z0-9]{17}$/.test(vin)) return status("Die VIN muss 17 Zeichen haben (ohne I, O, Q) - oder das Feld leer lassen.", false); }
  if (parseInt($("nvk-cap").value, 10) !== capA + capB) return status("Die Sicherheitsfrage wurde nicht richtig beantwortet.", false);
  if (!$("nvk-dsgvo").checked) return status("Bitte der Verarbeitung Deiner Daten zustimmen.", false);
  if ($("nvk-hp").value) return;
  var text = "Name: " + name + "\nE-Mail: " + mail + "\nVIN: " + (vin || "-") + "\n\nKommentar:\n" + msg + "\n\n" + summary;
  if (SEND_URL) {
    var p = new URLSearchParams();
    p.append("name", name); p.append("mail", mail); p.append("vin", vin); p.append("msg", msg); p.append("summary", summary);
    p.append("hp", $("nvk-hp").value); p.append("ca", capA); p.append("cb", capB); p.append("cv", $("nvk-cap").value);
    fetch(SEND_URL, { method: "POST", body: p }).then(function (r) {
      if (!r.ok) throw new Error("send");
      status("Danke! Deine Anfrage wurde gesendet, eine Kopie geht an " + mail + ".", true); newCaptcha();
    }).catch(function () { status("Das Senden hat nicht geklappt. Bitte versuche es später noch einmal oder schreibe direkt an " + MAIL_TO + ".", false); });
  } else {
    var AMP = "\u0026";
    window.location.href = "mailto:" + MAIL_TO + "?cc=" + encodeURIComponent(mail) + AMP + "subject=" + encodeURIComponent(MAIL_SUBJECT) + AMP + "body=" + encodeURIComponent(text);
    status("Dein E-Mail-Programm wurde mit der fertigen Anfrage geöffnet. Bitte dort noch auf Senden klicken.", true);
  }
});
$("nvk-reset").addEventListener("click", function () { sel = {}; picked = {}; update(); });
$("nvk-reset").addEventListener("click", function () { sel = {}; picked = {}; update(); });
newCaptcha();
update();
update();
})();
})();

Version vom 21. Oktober 2026, 13:50 Uhr

Zusatzoptionen