Android Radio Konfigurator: Unterschied zwischen den Versionen

Aus Wiki rund um Android-Navis für BMW E38/E39/E46/E53
Wechseln zu: Navigation, Suche
 
(11 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
<html><div id="nvk">
<big><big> '''Mit diesem Tool kann auf Basis von Fahrzeug und vorhandenen Komponenten eine Liste nötiger Komponenten erstellt werden.</big></big><br>
<big>Zu den gewählten Komponenten werden Links in den I-BUS Shop gezeigt und abschließend kann mit der Auswahl eine Anfrage-Mail an das I-BUS App Team gesendet werden.<br>'''</big>
 
<html>
<div id="nvk">
<style>
<style>
#nvk{max-width:900px;line-height:1.45}
#nvk{max-width:900px;line-height:1.45}
Zeile 17: Zeile 21:
#nvk .nvk-card{border:1px solid rgba(128,128,128,.45);border-left:5px solid #36c;border-radius:4px;padding:9px 12px;margin:8px 0}
#nvk .nvk-card{border:1px solid rgba(128,128,128,.45);border-left:5px solid #36c;border-radius:4px;padding:9px 12px;margin:8px 0}
#nvk .nvk-card.opt{border-left-color:#14866d}
#nvk .nvk-card.opt{border-left-color:#14866d}
#nvk .nvk-card.rad{border-left-color:#d9400b}
#nvk .nvk-card.rad{border-left-color:#fff;background:rgba(255,255,255,.08)}
#nvk .nvk-card b{display:block}
#nvk .nvk-card b{display:block}
#nvk .nvk-links{margin-top:4px;font-weight:600}
#nvk .nvk-links{margin-top:4px;font-weight:600}
Zeile 26: Zeile 30:
#nvk .nvk-card .nvk-img{max-width:230px;max-height:150px}
#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 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-card.hl{border:2px solid #36c;border-left-width:8px;background:rgba(51,102,204,.12);padding:12px 14px}
#nvk .nvk-card.hl b{font-size:1.1em}
#nvk .nvk-row{display:flex;flex-wrap:wrap;gap:4px 12px;align-items:baseline;padding:2px 0;border-bottom:1px solid rgba(128,128,128,.3)}
#nvk .nvk-row label{flex:1;margin:0;min-width:240px}
#nvk .nvk-row a{white-space:nowrap;font-weight:600}
#nvk .nvk-img.wide{max-width:min(100%,460px);max-height:none}
#nvk #nvk-form{margin-top:22px}
#nvk #nvk-form{margin-top:22px}
</style>
</style>
Zeile 37: Zeile 47:
<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-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-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 class="nvk-f"><label for="nvk-size">Gewünschte Displaygröße (optional)</label><select id="nvk-size"><option value="">Keine Angabe / Beratung gewünscht</option><option>7"</option><option>8.8"</option><option>9"</option><option>10.25"</option><option>12.3"</option><option>14.9"</option><option>Andere Größe (bitte im Kommentar nennen)</option></select><div class="nvk-help">Diagonale in Zoll. Nicht jede Größe gibt es für jede Baureihe, das prüfen wir für Dich.</div></div>
<div class="nvk-f"><label for="nvk-vin">VIN oder FGN (optional)</label><input id="nvk-vin" type="text" maxlength="17" placeholder="AB12345 oder 17-stellige FGN"></div>
</div>
</div>
<div class="nvk-f"><label for="nvk-msg">Kommentar *</label><textarea id="nvk-msg" rows="4"></textarea></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>
<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">
<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>
<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.<span id="nvk-dslink"></span> *</label>
<button type="button" class="nvk-btn" id="nvk-send">Anfrage senden</button>
<button type="button" class="nvk-btn" id="nvk-send">Anfrage senden</button>
<div id="nvk-status" class="nvk-note" style="display:none"></div>
<div id="nvk-status" class="nvk-note" style="display:none"></div>
</fieldset>
</fieldset>
<div id="nvk-legal" class="nvk-help" style="margin-top:20px"><b>Hinweis:</b> Der Konfigurator gibt eine unverbindliche Orientierung zu passenden Artikeln. Ausstattung und Anschlüsse können je nach Baujahr, Modell und Umbauten abweichen. Bitte gleiche Deine Auswahl vor der Bestellung mit Deinem Fahrzeug ab. Im Zweifel nutze die Anfrage-Funktion, wir prüfen die Zusammenstellung gern für Dich.<div id="nvk-legal-links" style="margin-top:4px"></div></div>
<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 74: Zeile 85:
   noexl6:  IM + "7/7b/No_EXL006.jpg/180px-No_EXL006.jpg",
   noexl6:  IM + "7/7b/No_EXL006.jpg/180px-No_EXL006.jpg",
   halter:  IM + "3/3b/Halter_Alu.webp/92px-Halter_Alu.webp.png",
   halter:  IM + "3/3b/Halter_Alu.webp/92px-Halter_Alu.webp.png",
  deepobd: "https://xtrons.ibus-app.de/images/d/d4/DeepOBD_Interface_1.png",
  n43:    IM + "e/e4/Navi4_3.jpg/240px-Navi4_3.jpg",
  n169:    IM + "8/8a/Navi16_9.jpg/240px-Navi16_9.jpg",
  radio:  IM + "9/96/E39_Radio.jpg/240px-E39_Radio.jpg",
  idrive:  "https://xtrons.ibus-app.de/images/0/02/MASK-CCC-CIC-NBT-EVO-iDrive.jpg",
  iris:    "https://xtrons.ibus-app.de/images/b/be/BusinessKas_IRISG.jpg",
  resler:  "https://xtrons.ibus-app.de/images/d/d1/Resler_Modul_01.png",
  can:    "https://xtrons.ibus-app.de/images/6/69/CAN_Interface.png",
   funktr:  IM + "7/7e/E46_Funktionstraeger.png/240px-E46_Funktionstraeger.png"
   funktr:  IM + "7/7e/E46_Funktionstraeger.png/240px-E46_Funktionstraeger.png"
};
};
Zeile 80: Zeile 99:
var MAIL_TO = "info@ibus-app.de";
var MAIL_TO = "info@ibus-app.de";
var MAIL_SUBJECT = "Anfrage aus Android Radio Konfigurator";
var MAIL_SUBJECT = "Anfrage aus Android Radio Konfigurator";
var SEND_URL = "";
var SEND_URL = "https://xtrons.ibus-app.de/send-anfrage.php";
/* Shop-Anbindung: API = radios.php (liefert Radio-Liste und Artikelnummern). Warenkorb = Shopware-Link pro Artikelnummer. */
var API = "https://xtrons.ibus-app.de/radios.php";
/* CART_TRANSFER = true: Warenkorb-Button öffnet den Shop mit ?nvk=ARTIKELNUMMERN. Das funktioniert nur, wenn im Shop das Skript shop-warenkorb-uebergabe.js eingebunden ist. */
var CART_TRANSFER = true;
/* Ziel der Übergabe: Shop-Controller aus Plugin 1.1.0 (serverseitig, unabhängig vom Browser-Cache).
  Älterer Weg über das Theme-Skript: var TRANSFER_URL = CART + "?nvk=";  */
var TRANSFER_URL = "https://shop.ibus-app.de/nvk?add=";
var CART = "https://shop.ibus-app.de/checkout/cart";
/* Rechtliche Seiten (Links unter dem Konfigurator und beim Datenschutz-Haken). Leer = Link wird nicht angezeigt. */
var LEGAL = { agb: "https://shop.ibus-app.de/allgemeine-geschaeftsbedingungen", widerruf: "https://shop.ibus-app.de/widerrufsrecht", datenschutz: "https://shop.ibus-app.de/datenschutz" };
/* ---- 1) Baureihen --------------------------------------------------------
/* ---- 1) Baureihen --------------------------------------------------------
   v = Shop-Kategorie (Link: SHOP + bmw-radios/ + v + /)
   v = Shop-Kategorie (Link: SHOP + bmw-radios/ + v + /)
Zeile 111: Zeile 140:
   { v: "x5-f15", t: "X5 F15", gen: "c", body: "suv" },
   { v: "x5-f15", t: "X5 F15", gen: "c", body: "suv" },
   { v: "x6-e71", t: "X6 E71", gen: "b", body: "suv" },
   { v: "x6-e71", t: "X6 E71", gen: "b", body: "suv" },
   { v: "z4-e85e86", t: "Z4 E85/E86", gen: "b", body: "roadster,coupe" }
   { v: "z4-e85e86", t: "Z4 E85/E86", gen: "b", body: "roadster,coupe" },
  { v: "z4-e89", t: "Z4 E89", gen: "c", body: "roadster", noCat: true }
];
];
/* Fahrzeuge mit K-CAN App (Beta) */
var KCAN = ["1er-e8x", "3er-e9x", "5er-e6x", "6er-e6x", "7er-e65", "x1-e84", "x5-e70", "x6-e71", "z4-e89"];
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 121: Zeile 153:
var FIELDS = [
var FIELDS = [
   { 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", pre: { when: { gen: ["b", "c"] }, html: "[b]So erkennst Du Dein System:[/b][br][imgw=" + P.idrive + "]" }, values: [
     { v: "iris",  t: "Radio mit IRIS", only: { vehicle: ["3er-e46", "5er-e39", "7er-e38", "x5-e53"] } },
     { v: "iris",  t: "Radio mit IRIS", only: { vehicle: ["3er-e46", "5er-e39", "7er-e38", "x5-e53"] }, info: "[img=" + P.iris + "]" },
     { v: "mid",  t: "Radio mit MID",  only: { gen: ["alt"] } },
     { v: "mid",  t: "Radio mit MID",  only: { gen: ["alt"] }, info: "[img=" + P.radio + "]" },
     { v: "n43",  t: "4:3 Navi",      only: { vehicle: ["5er-e39", "7er-e38"] } },
     { v: "n43",  t: "4:3 Navi",      only: { vehicle: ["5er-e39", "7er-e38"] }, info: "[img=" + P.n43 + "]" },
     { v: "n169",  t: "16:9 Navi",      only: { gen: ["alt"] } },
     { v: "n169",  t: "16:9 Navi",      only: { gen: ["alt"] }, info: "[img=" + P.n169 + "]" },
     { v: "pfeil", t: "Pfeilnavi",      only: { vehicle: ["3er-e46"] } },
     { v: "pfeil", t: "Pfeilnavi",      only: { vehicle: ["3er-e46"] }, info: "[img=" + P.pfeil + "]" },
     { v: "mask",  t: "M-ASK",          only: { gen: ["b"] } },
     { v: "mask",  t: "M-ASK",          only: { gen: ["b"] } },
     { v: "ccc",  t: "CCC",            only: { gen: ["b"] } },
     { v: "ccc",  t: "CCC",            only: { gen: ["b"] } },
Zeile 143: Zeile 175:
     { v: "stereo", t: "Stereo" },
     { v: "stereo", t: "Stereo" },
     { v: "hifi",  t: "Hifi" },
     { v: "hifi",  t: "Hifi" },
     { v: "dsp",    t: "DSP", only: { vehicle: ["7er-e38", "5er-e39", "x5-e53", "x3-e83"] } },
     { v: "dsp",    t: "DSP", only: { vehicle: ["7er-e38", "5er-e39", "x5-e53", "x3-e83"] }, info: "[a=" + WIKI + "Habe_ich_DSP%3F]Habe ich DSP?[/a]" },
     { v: "hk",    t: "Harman Kardon", only: { vehicle: ["3er-e46", "z4-e85e86"] } },
     { 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: "logic7", t: "Logic7", only: { vehicle: ["3er-e9x", "5er-e6x", "6er-e6x", "7er-e65", "1er-e8x"] } },
Zeile 165: Zeile 197:
   { id: "ibus",    t: "I-BUS App", show: { gen: ["alt"] }, items: ["ibus", "resler", "bclic"] },
   { id: "ibus",    t: "I-BUS App", show: { gen: ["alt"] }, items: ["ibus", "resler", "bclic"] },
   { id: "deepobd", t: "DeepOBD (Diagnose)", items: ["deepobd"] },
   { id: "deepobd", t: "DeepOBD (Diagnose)", items: ["deepobd"] },
   { id: "can",    t: "CAN Interface", sub: "Addon - nur mit I-BUS App", requires: ["ibus"], items: ["can"] },
   { id: "can",    t: "CAN Interface", sub: "Addon - nur mit I-BUS App", show: { gen: ["alt"] }, requires: ["ibus"], items: ["can"] },
  { id: "kcan",    t: "K-CAN App (Beta)", sub: "Pendant zur I-BUS App", show: { vehicle: KCAN }, items: ["kcan", "kcanlic", "can"] },
   { id: "tpms",    t: "TPMS (Reifendruck)", items: ["tpms"] },
   { id: "tpms",    t: "TPMS (Reifendruck)", items: ["tpms"] },
   { id: "dab1",    t: "DAB+ (Single Receiver)", excl: "dab", items: ["dab1"] },
   { id: "dab1",    t: "DAB+ (Single Receiver)", excl: "dab", items: ["dab1"] },
Zeile 187: Zeile 220:
             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",
            w: WIKI + "Habe_ich_DSP%3F", wt: "Wiki: Habe ich DSP?" },
   halter:  { t: "Alu-Halter zur Radio-Montage im BMW E39", d: "Empfohlen bei Radios, die nicht von AVIN stammen.", img: [P.halter],
   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", hl: true,
            d: "Die I-BUS App ist eine Android Applikation, die dazu dient Ihren Bordcomputer auf einem Android Gerät darzustellen und in Ihrem Fahrzeug viele Comfort-/Codierfunktionen integriert. Der Download der App ist kostenlos und es kann eine Verbindung zum Interface/Modul hergestellt werden. Um alle Funktionen der App nutzen zu können, wird eine I-BUS App Lizenz benötigt.",
             u: SHOP + "cat/index/sCategory/42",
             u: SHOP + "cat/index/sCategory/42",
             w: WIKI + "Was_brauche_ich_um_die_I-BUS_App_nutzen_zu_k%C3%B6nnen%3F", wt: "Wiki: Was brauche ich für die I-BUS App?" },
             links: [
   resler:  { t: "Resler USB I-BUS Modul inkl. Anschlusskabel", d: "Verbindet I-BUS App und Fahrzeug.",
              { u: WIKI + "Was_brauche_ich_um_die_I-BUS_App_nutzen_zu_k%C3%B6nnen%3F", t: "Wiki: Was brauche ich für die I-BUS App?" },
              { u: WIKI + "Funktionen", t: "Liste aller I-BUS App Funktionen (BMW E38|E39|E46|E53|E83)" },
              { u: WIKI + "Was_geht_beim_BMW_E46_nicht", t: "Was geht beim BMW E46, E83, E85,.. nicht? (da werkseitig nicht verbaut)" },
              { u: WIKI + "Funktionseinschr%C3%A4nkungen_nach_Baujahr/Ausstattung/Modell", t: "Funktionseinschränkungen nach Baujahr/Ausstattung/Modell" } ] },
   resler:  { t: "Resler USB I-BUS Modul inkl. Anschlusskabel", d: "Verbindet I-BUS App und Fahrzeug.", img: [P.resler],
             u: SHOP + "i-bus-app/zubehoer/interfaces-module/191/resler-usb-i-bus-modul-inkl.-anschlusskabel",
             u: SHOP + "i-bus-app/zubehoer/interfaces-module/191/resler-usb-i-bus-modul-inkl.-anschlusskabel",
             w: "https://wiki.ibus-app.de/index.php?title=Hauptseite#Einbauanleitung_f.C3.BCr_Resler_Modul_und_Resler_Interface", wt: "Einbauanleitung Resler Modul" },
             w: "https://wiki.ibus-app.de/index.php?title=Hauptseite#Einbauanleitung_f.C3.BCr_Resler_Modul_und_Resler_Interface", wt: "Einbauanleitung Resler Modul" },
   bclic:  { t: "I-BUS App - BC Lizenz", d: "Schaltet u. a. die BC-Daten der App frei.", skipIf: "bcdsp",
   bclic:  { t: "I-BUS App - BC Lizenz", d: "Schaltet u. a. die BC-Daten der App frei.", skipIf: "bcdsp",
             u: SHOP + "i-bus-app/lizenzen/167/i-bus-app-bc-lizenz" },
             u: SHOP + "i-bus-app/lizenzen/167/i-bus-app-bc-lizenz" },
   deepobd: { t: "Deep OBD OBD-II Bluetooth-Adapter", d: "Live-Werte auslesen, Fehler lesen und löschen.",
   deepobd: { t: "Deep OBD OBD-II Bluetooth-Adapter", d: "Live-Werte auslesen, Fehler lesen und löschen.", img: [P.deepobd],
             u: SHOP + "i-bus-app/zubehoer/interfaces-module/258/deep-obd-obd-ii-bluetooth-adapter?c=54",
             u: SHOP + "i-bus-app/zubehoer/interfaces-module/258/deep-obd-obd-ii-bluetooth-adapter?c=54",
             w: "https://xtrons.ibus-app.de/index.php?title=DeepOBD_-_Adapter_und_App_einrichten", wt: "Wiki: DeepOBD einrichten" },
             w: "https://xtrons.ibus-app.de/index.php?title=DeepOBD_-_Adapter_und_App_einrichten", wt: "Wiki: DeepOBD einrichten" },
   can:    { t: "CAN-Bus Interface inkl. Anschlusskabel", d: "Addon, funktioniert nur zusammen mit der I-BUS App.",
   can:    { t: "CAN-Bus Interface inkl. Anschlusskabel", d: "Addon, funktioniert nur zusammen mit der I-BUS App bzw. der K-CAN App.", img: [P.can],
             u: SHOP + "i-bus-app/zubehoer/interfaces-module/346/can-bus-interface-inkl.-anschlusskabel",
             u: SHOP + "i-bus-app/zubehoer/interfaces-module/346/can-bus-interface-inkl.-anschlusskabel",
             w: WIKI + "Einbauanleitung_CAN-Bus_Interface", wt: "Einbauanleitung CAN-Bus Interface" },
             w: WIKI + "Einbauanleitung_CAN-Bus_Interface", wt: "Einbauanleitung CAN-Bus Interface" },
  kcan:    { t: "K-CAN App (Beta)", d: "Pendant zur I-BUS App für Fahrzeuge mit K-CAN, aktuell als Betaversion.",
            w: "https://wiki.kcan-app.de/", wt: "Wiki zur K-CAN App" },
  kcanlic: { t: "K-CAN App - Lizenz Betaversion", d: "Beta-Lizenz für die K-CAN App.",
            u: SHOP + "i-bus-app/lizenzen/358/k-can-app-lizenz-betaversion" },
   tpms:    { t: "TPMS - Reifendruckkontrolle", d: "", u: SHOP + "radiozubehoer/tpms/" },
   tpms:    { t: "TPMS - Reifendruckkontrolle", d: "", u: SHOP + "radiozubehoer/tpms/" },
   dab1:    { t: "DAB+ Empfänger inkl. Antenne (Single)", d: "", u: SHOP + "radiozubehoer/dab/291/dab-empfaenger-inkl.-antenne-usbdab04" },
   dab1:    { t: "DAB+ Empfänger inkl. Antenne (Single)", d: "", w: "https://xtrons.ibus-app.de/index.php?title=Installation_der_DAB%2B_Antenne", wt: "Installation der DAB+ Antenne", u: SHOP + "radiozubehoer/dab/291/dab-empfaenger-inkl.-antenne-usbdab04" },
   dab2:    { t: "Dual DAB+ Empfänger-Stick inkl. 2 Antennen", d: "", u: SHOP + "radiozubehoer/dab/391/dual-dab-empfaenger-stick-inkl.-2-antennen-acusbdab05t?c=75" },
   dab2:    { t: "Dual DAB+ Empfänger-Stick inkl. 2 Antennen", d: "", w: "https://xtrons.ibus-app.de/index.php?title=Installation_der_DAB%2B_Antenne", wt: "Installation der DAB+ Antenne", u: SHOP + "radiozubehoer/dab/391/dual-dab-empfaenger-stick-inkl.-2-antennen-acusbdab05t?c=75" },
   rcam:    { t: "Rückfahrkamera", d: "", u: SHOP + "radiozubehoer/kameras/", ut: "Kameras im Shop ansehen →" },
   rcam:    { t: "Rückfahrkamera", d: "", u: SHOP + "radiozubehoer/kameras/", ut: "Kameras im Shop ansehen →" },
   fcam:    { t: "Front-Kamera", d: "", u: SHOP + "radiozubehoer/kameras/", ut: "Kameras im Shop ansehen →" },
   fcam:    { t: "Front-Kamera", d: "", u: SHOP + "radiozubehoer/kameras/", ut: "Kameras im Shop ansehen →" },
Zeile 230: Zeile 273:
   { type: "need", when: { sound: ["dsp"] }, items: ["bcdsp"] },
   { type: "need", when: { sound: ["dsp"] }, items: ["bcdsp"] },
   { type: "hint", when: { sound: ["dsp"] },
   { type: "hint", when: { sound: ["dsp"] },
     html: "[b]DSP:[/b] Damit das Werks-DSP überhaupt arbeitet, wird die I-BUS App mit BC+DSP Lizenz benötigt." },
     html: "[b]DSP:[/b] Damit das Werks-DSP überhaupt arbeitet, wird die I-BUS App mit BC+DSP Lizenz benötigt. Ob Dein Fahrzeug ein DSP hat: [a=" + WIKI + "Habe_ich_DSP%3F]Habe ich DSP?[/a]" },
   { type: "hint", when: { sound: ["hk"], gen: ["alt"] },
   { type: "hint", when: { sound: ["hk"], gen: ["alt"] },
     html: "[b]Harman Kardon:[/b] Benötigt [b]keine[/b] DSP-Lizenz. Das Remote-Signal (+12 V, wenn Radio an) genügt zum Starten." },
     html: "[b]Harman Kardon:[/b] Benötigt [b]keine[/b] DSP-Lizenz. Das Remote-Signal (+12 V, wenn Radio an) genügt zum Starten." },
Zeile 247: Zeile 290:
   { type: "hint", when: { factory: ["mask", "ccc", "cic", "nbt", "nbtevo"] },
   { 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." },
     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: ["kcan"], when: {},
    html: "[b]K-CAN App (Beta):[/b] Zur App benötigst Du das CAN-Bus Interface und die Beta-Lizenz. Einbauerklärung: [a=https://wiki.kcan-app.de/index.php?title=Hauptseite#Wo_wird_das_CAN_BUS_Interface_angeschlossen?]Wo wird das CAN-Bus Interface angeschlossen?[/a] Weitere Infos im [a=https://wiki.kcan-app.de/]Wiki zur K-CAN App[/a]." },
   { 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 256: Zeile 301:
   ===================================================================== */
   ===================================================================== */
var $ = function (id) { return document.getElementById(id); };
var $ = function (id) { return document.getElementById(id); };
var sel = {}, picked = {}, summary = "", capA = 0, capB = 0;
var sel = {}, picked = {}, summary = "", capA = 0, capB = 0, radioCache = {}, chosenRadio = null, cartFill = null;
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 full(u) { return u.indexOf("/thumb/") === -1 ? u : u.replace("/thumb/", "/").replace(/\/[^\/]+$/, ""); }
function fmt(t) {
function fmt(t) {
   return t.replace(/\[img=([^\x5D]+)\]/g, function (m, u) {
   return t.replace(/\[imgw=([^\x5D]+)\]/g, function (m, u) {
    return "\u003Ca href=\"" + full(u) + "\" target=\"_blank\" rel=\"noopener\"\u003E\u003Cimg class=\"nvk-img wide\" src=\"" + u + "\" alt=\"\"\u003E\u003C/a\u003E";
  }).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";
     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(/\[b\]/g, "\u003Cb\u003E").replace(/\[\/b\]/g, "\u003C/b\u003E").replace(/\[br\]/g, "\u003Cbr\u003E")
Zeile 329: Zeile 376:
     el.value = sel[f.id] || "";
     el.value = sel[f.id] || "";
     var cur = allowed.filter(function (v) { return v.v === sel[f.id]; })[0];
     var cur = allowed.filter(function (v) { return v.v === sel[f.id]; })[0];
     $("nvk-i-" + f.id).innerHTML = cur ? (cur.info ? fmt(cur.info) : "") : "";
    var pre = f.pre ? (match(f.pre.when, s, false) ? fmt(f.pre.html) : "") : "";
     $("nvk-i-" + f.id).innerHTML = pre + (cur ? (cur.info ? fmt(cur.info) : "") : "");
   });
   });
}
}
Zeile 360: Zeile 408:
}
}
function card(item, cls) {
function card(item, cls) {
   var d = document.createElement("div"); d.className = "nvk-card " + (cls || "");
   var d = document.createElement("div"); d.className = "nvk-card " + (cls || "") + (item.hl ? " hl" : "");
   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); }
Zeile 377: Zeile 425:
     d.appendChild(l);
     d.appendChild(l);
   }
   }
  if (item.links) item.links.forEach(function (x) {
    var r = document.createElement("div"); r.className = "nvk-links"; r.appendChild(link(x.u, x.t + " →")); d.appendChild(r);
  });
   return d;
   return d;
}
}
function heading(txt) { var h = document.createElement("h3"); h.textContent = txt; outEl.appendChild(h); }
function heading(txt) { var h = document.createElement("h3"); h.textContent = txt; outEl.appendChild(h); }
function aidOf(u) {
  if (u.indexOf(SHOP) !== 0) return "";
  var m = u.match(/sArticle\/(\d+)/);
  if (!m) m = u.split("?")[0].match(/\/(\d+)\/[^\/]+$/);
  return m ? m[1] : "";
}
function renderRadioList(veh) {
  if (veh.noCat) return;
  if (chosenRadio) { if (chosenRadio.cat !== veh.v) chosenRadio = null; }
  var data = radioCache[veh.v];
  if (data === undefined) {
    radioCache[veh.v] = "loading";
    fetch(API + "?cat=" + encodeURIComponent(veh.v)).then(function (r) { return r.json(); }).then(function (j) {
      radioCache[veh.v] = (j.items || []).map(function (it) { it.cat = veh.v; return it; });
      renderResult();
    }).catch(function () { radioCache[veh.v] = []; renderResult(); });
  }
  if (data === undefined || data === "loading") {
    var m = document.createElement("p"); m.className = "nvk-miss"; m.textContent = "Verfügbare Radios werden geladen …"; outEl.appendChild(m); return;
  }
  if (!data.length) return;
  var want = { mask: /M-?ASK/i, ccc: /\bCCC\b/i, cic: /\bCIC\b/i, nbt: /\bNBT\b/i, nbtevo: /EVO/i }[sel.factory];
  function fits(it) { return want ? want.test(it.name) : false; }
  var list = data.slice().sort(function (a, b) { return (fits(b) ? 1 : 0) - (fits(a) ? 1 : 0); });
  var det = document.createElement("details"); det.open = Math.max(list.length, 8) === 8;
  var sm = document.createElement("summary"); sm.style.cursor = "pointer"; sm.style.fontWeight = "700";
  sm.textContent = "Verfügbare Radios für Deinen BMW " + veh.t + " (" + list.length + ")"; det.appendChild(sm);
  list.forEach(function (it) {
    var row = document.createElement("div"); row.className = "nvk-row";
    var lab = document.createElement("label"); lab.className = "nvk-o";
    var rb = document.createElement("input"); rb.type = "radio"; rb.name = "nvk-radio";
    rb.checked = chosenRadio ? chosenRadio.sku === it.sku : false;
    rb.addEventListener("change", function () { chosenRadio = it; if (cartFill) cartFill(); });
    lab.appendChild(rb);
    lab.appendChild(document.createTextNode(" " + it.name + (it.price ? "  -  " + it.price : "") + (fits(it) ? "  (passt zu Deiner Auswahl)" : "")));
    row.appendChild(lab); row.appendChild(link(it.url, "Shop →"));
    det.appendChild(row);
  });
  outEl.appendChild(det);
}
function cartBlock(needs, opt) {
  var items = [];
  needs.concat(opt).forEach(function (i) { var id = aidOf(i.u || ""); if (id) items.push({ t: i.t, aid: id }); });
  heading("In den Warenkorb");
  var box = document.createElement("div"); box.className = "nvk-card opt";
  var p = document.createElement("div");
  p.textContent = "Das oben gewählte Radio (falls ausgewählt) und diese Artikel werden direkt im Shop in den Warenkorb gelegt:";
  box.appendChild(p);
  var listEl = document.createElement("div"); box.appendChild(listEl);
  cartFill = function () {
    listEl.innerHTML = "";
    var lines = (chosenRadio ? ["Radio: " + chosenRadio.type] : []).concat(items.map(function (x) { return x.t; }));
    lines.forEach(function (t) { var r = document.createElement("div"); r.textContent = "- " + t; listEl.appendChild(r); });
  };
  cartFill();
  var n = document.createElement("div"); n.className = "nvk-help";
  n.textContent = "Kameras, TPMS, Werkzeug und Artikel ohne Direktlink wählst Du bitte über die Links oben im Shop aus.";
  box.appendChild(n);
  var all = needs.concat(opt);
  var has = function (k) { return all.indexOf(ITEMS[k]) !== -1; };
  var l17 = has("kcanlic"), l7 = has("bclic") || has("bcdsp");
  if (l17 || l7) {
    var vb = document.createElement("div"); vb.className = "nvk-f"; vb.style.marginTop = "12px";
    var vlab = document.createElement("label"); vlab.htmlFor = "nvk-licvin";
    vlab.textContent = l17 ? "Fahrgestellnummer (17 Zeichen) für die Lizenz" : "VIN für die Lizenz (7 Zeichen, z. B. AB12345)";
    var vin = document.createElement("input"); vin.type = "text"; vin.id = "nvk-licvin"; vin.maxLength = 17;
    vin.value = $("nvk-vin").value.toUpperCase();
    var ta = document.createElement("textarea"); ta.rows = 3; ta.readOnly = true; ta.style.display = "none"; ta.style.marginTop = "6px";
    var cb = document.createElement("button"); cb.type = "button"; cb.className = "nvk-btn"; cb.style.marginTop = "6px";
    cb.textContent = "Kommentartext für die Kasse kopieren";
    var ls = document.createElement("div"); ls.className = "nvk-help";
    cb.addEventListener("click", function () {
      var v = vin.value.trim().toUpperCase(), v7 = "", v17 = "";
      if (/^[A-HJ-NPR-Z0-9]{17}$/.test(v)) { v17 = v; v7 = v.slice(10); }
      else if (/^[A-Z]{2}[0-9]{5}$/.test(v)) v7 = v;
      if (l17 ? !v17 : !v7) { ls.textContent = l17 ? "Bitte die vollständige 17-stellige Fahrgestellnummer eingeben." : "Bitte die VIN im Format AB12345 (oder die 17-stellige FGN) eingeben."; return; }
      var L = [];
      if (has("bclic")) L.push("I-BUS App BC Lizenz: VIN " + v7);
      if (has("bcdsp")) L.push("I-BUS App BC+DSP Lizenz: VIN " + v7);
      if (l17) L.push("K-CAN App Beta Lizenz: FGN " + v17);
      ta.value = L.join("\n"); ta.style.display = ""; ta.select();
      var hint = "Bitte an der Shop-Kasse in das Feld Kommentar einfügen.";
      if (navigator.clipboard) navigator.clipboard.writeText(ta.value).then(function () { ls.textContent = "Text kopiert. " + hint; }).catch(function () { ls.textContent = "Bitte den Text markieren und kopieren. " + hint; });
      else ls.textContent = "Bitte den Text markieren und kopieren. " + hint;
    });
    vb.appendChild(vlab); vb.appendChild(vin); vb.appendChild(cb); vb.appendChild(ta); vb.appendChild(ls); box.appendChild(vb);
  }
  if (!CART_TRANSFER) { outEl.appendChild(box); return; }
  var btn = document.createElement("button"); btn.type = "button"; btn.className = "nvk-btn"; btn.style.marginTop = "8px";
  btn.textContent = "Auswahl in den Warenkorb legen";
  var st = document.createElement("div"); st.className = "nvk-help";
  btn.addEventListener("click", function () { addToCart(items, st); });
  box.appendChild(btn); box.appendChild(st); outEl.appendChild(box);
}
function addToCart(items, st) {
  var list = items.slice();
  if (chosenRadio) list.unshift({ t: chosenRadio.type, sku: chosenRadio.sku });
  if (!list.length) { st.textContent = "Es ist noch nichts zum Bestellen ausgewählt."; return; }
  var w = window.open("", "_blank");
  st.textContent = "Artikelnummern werden ermittelt …";
  var ids = list.filter(function (x) { return x.aid; }).map(function (x) { return x.aid; });
  var get = ids.length ? fetch(API + "?aid=" + ids.join(",")).then(function (r) { return r.json(); }).then(function (j) { return j.skus || {}; }) : Promise.resolve({});
  get.then(function (map) {
    var skus = [];
    list.forEach(function (x) { var k = x.sku || map[x.aid]; if (k) skus.push(k); });
    if (!skus.length) throw new Error("none");
    var url = TRANSFER_URL + encodeURIComponent(skus.join(","));
    if (w) {
      w.location.href = url;
      st.textContent = "Der Shop wurde in einem neuen Tab geöffnet (" + skus.length + " von " + list.length + " Artikeln übergeben). Bitte dort den Warenkorb kontrollieren. Ist ein Artikel nicht bestellbar, weist der Shop darauf hin.";
    } else {
      st.textContent = "Der neue Tab wurde blockiert. Bitte Pop-ups erlauben oder diesen Link nutzen: ";
      st.appendChild(link(url, "Warenkorb im Shop öffnen →"));
    }
  }).catch(function () { if (w) w.close(); st.textContent = "Das hat leider nicht geklappt. Bitte nutze die Shop-Links oben."; });
}
function renderResult() {
function renderResult() {
   var s = derive(), st = onSet(s);
   var s = derive(), st = onSet(s);
Zeile 393: Zeile 560:
   }
   }
   $("nvk-form").style.display = "";
   $("nvk-form").style.display = "";
  var veh = vehicleOf(sel.vehicle);
  var ru = veh.noCat ? SHOP + "bmw-radios/" : SHOP + "bmw-radios/" + veh.v + "/";
  heading("Passende Radios");
  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: ru, ut: "Zu den passenden Radios →", w: SHOP + "bmw-radios/", wt: "Alle BMW Radios" }, "rad"));
  renderRadioList(veh);
   var needs = [], hints = [], seen = {};
   var needs = [], hints = [], seen = {};
   RULES.forEach(function (r) {
   RULES.forEach(function (r) {
Zeile 419: Zeile 592:
     hints.forEach(function (t) { var d = document.createElement("div"); d.className = "nvk-note"; d.innerHTML = fmt(t); outEl.appendChild(d); });
     hints.forEach(function (t) { var d = document.createElement("div"); d.className = "nvk-note"; d.innerHTML = fmt(t); outEl.appendChild(d); });
   }
   }
  var veh = vehicleOf(sel.vehicle);
  heading("Passende Radios");
  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"));
   var L = ["KONFIGURATION"];
   var L = ["KONFIGURATION"];
   FIELDS.forEach(function (f) {
   FIELDS.forEach(function (f) {
Zeile 432: Zeile 601:
   needs.forEach(function (i) { L.push("- " + i.t + (i.u ? "  " + i.u : "")); });
   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 : "")); }); }
   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 + "/");
   L.push("", "Radios: " + ru);
   summary = L.join("\n");
   summary = L.join("\n");
  cartBlock(needs, opt);
}
}
function update() { renderFields(); renderOpts(); renderResult(); }
function update() { renderFields(); renderOpts(); renderResult(); }
Zeile 442: Zeile 612:
function status(msg, ok) { var e = $("nvk-status"); e.style.display = ""; e.textContent = msg; e.style.borderLeftColor = ok ? "#14866d" : "#d33"; }
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 () {
$("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();
   var name = $("nvk-name").value.trim(), mail = $("nvk-mail").value.trim(), vin = $("nvk-vin").value.trim().toUpperCase(), msg = $("nvk-msg").value.trim();
   if (!name || !mail || !msg) return status("Bitte Name, E-Mail und Kommentar ausfüllen.", false);
   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 (!/^[^\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 (vin) { if (!/^[A-Z]{2}[0-9]{5}$/.test(vin)) { if (!/^[A-HJ-NPR-Z0-9]{17}$/.test(vin)) return status("Bitte die VIN im Format AB12345 oder die 17-stellige FGN eingeben - oder das Feld leer lassen.", false); } }
   if (parseInt($("nvk-cap").value, 10) !== capA + capB) return status("Die Sicherheitsfrage wurde nicht richtig beantwortet.", 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-dsgvo").checked) return status("Bitte der Verarbeitung Deiner Daten zustimmen.", false);
   if ($("nvk-hp").value) return;
   if ($("nvk-hp").value) return;
   var text = "Name: " + name + "\nE-Mail: " + mail + "\nVIN: " + (vin || "-") + "\n\nKommentar:\n" + msg + "\n\n" + summary;
  var sz = $("nvk-size").value;
  var rad = chosenRadio ? "\n\nGEWÄHLTES RADIO\n- " + chosenRadio.type + "  " + chosenRadio.url : "";
  var sum2 = summary + rad + (sz ? "\n\nGewünschte Displaygröße: " + sz : "");
   var text = "Name: " + name + "\nE-Mail: " + mail + "\nVIN: " + (vin || "-") + "\n\nKommentar:\n" + msg + "\n\n" + sum2;
   if (SEND_URL) {
   if (SEND_URL) {
     var p = new URLSearchParams();
     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("name", name); p.append("mail", mail); p.append("vin", vin); p.append("msg", msg); p.append("summary", sum2);
     p.append("hp", $("nvk-hp").value); p.append("ca", capA); p.append("cb", capB); p.append("cv", $("nvk-cap").value);
     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) {
     fetch(SEND_URL, { method: "POST", body: p }).then(function (r) {
Zeile 464: Zeile 637:
   }
   }
});
});
$("nvk-reset").addEventListener("click", function () { sel = {}; picked = {}; update(); });
$("nvk-reset").addEventListener("click", function () { sel = {}; picked = {}; chosenRadio = null; update(); });
var legalEl = $("nvk-legal-links"), firstLink = true;
[ ["agb", "AGB"], ["widerruf", "Widerrufsbelehrung"], ["datenschutz", "Datenschutzerklärung"] ].forEach(function (x) {
  var key = x[0];
  if (!LEGAL[key]) return;
  if (!firstLink) legalEl.appendChild(document.createTextNode(" | "));
  firstLink = false; legalEl.appendChild(link(LEGAL[key], x[1]));
});
if (LEGAL.datenschutz) {
  var dl = $("nvk-dslink");
  dl.appendChild(document.createTextNode(" (")); dl.appendChild(link(LEGAL.datenschutz, "Datenschutzerklärung")); dl.appendChild(document.createTextNode(")"));
}
newCaptcha();
newCaptcha();
update();
update();
Zeile 470: Zeile 654:
</script>
</script>
</div>
</div>
</html>
</html>
<small>Stand: 21.10.2026</small><br>

Aktuelle Version vom 22. Oktober 2026, 13:46 Uhr

Mit diesem Tool kann auf Basis von Fahrzeug und vorhandenen Komponenten eine Liste nötiger Komponenten erstellt werden.
Zu den gewählten Komponenten werden Links in den I-BUS Shop gezeigt und abschließend kann mit der Auswahl eine Anfrage-Mail an das I-BUS App Team gesendet werden.

Zusatzoptionen

Stand: 21.10.2026