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 1: Zeile 1:
<html>
<html><div id="nvk">
<div id="nvk">
<style>
<style>
#nvk{max-width:900px;line-height:1.45}
#nvk{max-width:900px;line-height:1.45}
#nvk *{box-sizing:border-box}
#nvk *{box-sizing:border-box}
#nvk .nvk-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:14px;margin:12px 0}
#nvk .nvk-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:14px;margin:12px 0}
#nvk .nvk-f label,#nvk .nvk-h{display:block;font-weight:700;margin-bottom:4px}
#nvk .nvk-f label{display:block;font-weight:700;margin-bottom:4px}
#nvk select{width:100%;padding:9px 8px;font:inherit;color:#202122;background:#fff;border:1px solid #a2a9b1;border-radius:4px}
#nvk select{width:100%;padding:9px 8px;font:inherit;color:#202122;background:#fff;border:1px solid #a2a9b1;border-radius:4px}
#nvk .nvk-help{font-size:.85em;opacity:.75;margin-top:3px}
#nvk fieldset{border:1px solid rgba(128,128,128,.45);border-radius:6px;padding:10px 14px;margin:14px 0}
#nvk fieldset{border:1px solid rgba(128,128,128,.45);border-radius:6px;padding:10px 14px;margin:14px 0}
#nvk legend{font-weight:700;padding:0 6px}
#nvk legend{font-weight:700;padding:0 6px}
Zeile 17: Zeile 17:
#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 b{display:block}
#nvk .nvk-card b{display:block}
#nvk .nvk-card a.nvk-shop{display:inline-block;margin-top:4px;font-weight:600}
#nvk .nvk-links{margin-top:4px;font-weight:600}
#nvk .nvk-links a{margin-right:14px}
#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}
Zeile 31: Zeile 33:
"use strict";
"use strict";
/* =====================================================================
/* =====================================================================
   KONFIGURATION – hier wird gepflegt. Kein weiterer Code nötig.
   KONFIGURATION - hier wird gepflegt.
  Textformat in Hinweisen: [b]fett[/b]  [br] Zeilenumbruch  [a=URL]Linktext[/a]
  Bitte im Skript KEIN kaufmännisches Und, kein Kleiner-/Größer-Zeichen
  und keine Leerzeilen verwenden (das Wiki wandelt sie um).
   ===================================================================== */
   ===================================================================== */
/* ---- 1) Auswahlfelder -------------------------------------------------
var SHOP = "https://shop.ibus-app.de/";
   v = interner Wert, t = Anzeigetext,
var WIKI = "https://wiki.ibus-app.de/index.php?title=";
   only = Wert nur anbieten, wenn Bedingung passt (z. B. nur bestimmte Fahrzeuge)
/* ---- 1) Baureihen --------------------------------------------------------
   show = ganzes Feld nur zeigen, wenn Bedingung passt                      */
   v = Shop-Kategorie (Link: SHOP + bmw-radios/ + v + /)
  gen: alt = I-BUS-Fahrzeuge (E38/E39/E46/E53/E83)
        b  = M-ASK / CCC / CIC    c = CIC / NBT / NBT EVO
  body = Karosserieformen (siehe BODY)                                      */
var BODY = { limo: "Limousine", touring: "Touring", coupe: "Coupé", cabrio: "Cabrio", schraeg: "Schrägheck",
  compact: "Compact", gt: "Gran Turismo", gc: "Gran Coupé", suv: "SUV / SAV", roadster: "Roadster" };
var VEHICLES = [
  { v: "1er-e8x", t: "1er E8x", gen: "b", body: "schraeg,coupe,cabrio" },
  { v: "1er-f2x", t: "1er F2x", gen: "c", body: "schraeg" },
  { v: "2er-f2x", t: "2er F2x", gen: "c", body: "coupe,cabrio" },
  { v: "3er-e46", t: "3er E46", gen: "alt", body: "limo,touring,coupe,cabrio,compact" },
  { v: "3er-e9x", t: "3er E9x", gen: "b", body: "limo,touring,coupe,cabrio" },
  { v: "3er-f3x", t: "3er F3x", gen: "c", body: "limo,touring,gt" },
  { v: "4er-f3x", t: "4er F3x", gen: "c", body: "coupe,cabrio,gc" },
  { v: "5er-e39", t: "5er E39", gen: "alt", body: "limo,touring" },
  { v: "5er-e6x", t: "5er E6x", gen: "b", body: "limo,touring" },
  { v: "5er-f1x", t: "5er F1x", gen: "c", body: "limo,touring,gt" },
  { v: "6er-e6x", t: "6er E6x", gen: "b", body: "coupe,cabrio" },
  { v: "7er-e38", t: "7er E38", gen: "alt", body: "limo" },
  { v: "7er-e65", t: "7er E65", gen: "b", body: "limo" },
  { v: "7er-f01", t: "7er F01", gen: "c", body: "limo" },
  { v: "x1-e84", t: "X1 E84", gen: "c", body: "suv" },
  { v: "x1-f48", t: "X1 F48", gen: "c", body: "suv" },
  { v: "x3-e83", t: "X3 E83", gen: "alt", body: "suv" },
  { v: "x3-f25", t: "X3 F25", gen: "c", body: "suv" },
  { v: "x5-e53", t: "X5 E53", gen: "alt", body: "suv" },
  { v: "x5-e70", t: "X5 E70", gen: "b", body: "suv" },
  { v: "x5-f15", t: "X5 F15", gen: "c", body: "suv" },
  { v: "x6-e71", t: "X6 E71", gen: "b", body: "suv" },
  { v: "z4-e85e86", t: "Z4 E85/E86", gen: "b", body: "roadster,coupe" }
];
var DSPV = ["5er-e39", "7er-e38", "x5-e53"];
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) {
  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; }) } };
});
/* ---- 2) Auswahlfelder ------------------------------------------------------
   only = Wert nur anbieten, wenn Bedingung passt   show = Feld nur dann zeigen
   optional = muss nicht gewählt werden            auto = bei nur einem Wert vorwählen */
var FIELDS = [
var FIELDS = [
   { id: "vehicle", label: "Fahrzeug", values: [
   { id: "vehicle", label: "Fahrzeug", values: VEHICLES.map(function (x) { return { v: x.v, t: "BMW " + x.t }; }) },
    { v: "E38", t: "BMW E38" }, { v: "E39", t: "BMW E39" }, { v: "E46", t: "BMW E46" },
    { v: "E53", t: "BMW E53" }, { v: "E83", t: "BMW E83" } ] },
   { id: "factory", label: "Verbaut ab Werk", values: [
   { id: "factory", label: "Verbaut ab Werk", values: [
     { v: "iris",  t: "Radio mit IRIS" },
     { v: "iris",  t: "Radio mit IRIS", only: { gen: ["alt"] } },
     { v: "mid",  t: "Radio mit MID" },
     { v: "mid",  t: "Radio mit MID",  only: { gen: ["alt"] } },
     { v: "n43",  t: "4:3 Navi", only: { vehicle: ["E38", "E39"] } },
     { v: "n43",  t: "4:3 Navi",       only: { vehicle: ["5er-e39", "7er-e38"] } },
     { v: "n169",  t: "16:9 Navi" },
     { v: "n169",  t: "16:9 Navi",      only: { gen: ["alt"] } },
     { v: "pfeil", t: "Pfeilnavi", only: { vehicle: ["E46"] } } ] },
     { v: "pfeil", t: "Pfeilnavi",     only: { vehicle: ["3er-e46"] } },
   { id: "trunk", label: "Befindet sich im Kofferraum ein Radiomodul?",
    { v: "mask",  t: "M-ASK",          only: { gen: ["b"] } },
    show: { factory: ["pfeil"] }, values: [
    { v: "ccc",  t: "CCC",            only: { gen: ["b"] } },
    { v: "cic",  t: "CIC",            only: { gen: ["b", "c"] } },
    { v: "nbt",  t: "NBT",            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: [
     { v: "ja", t: "Ja, Radio-/Navimodul im Kofferraum" },
     { v: "ja", t: "Ja, Radio-/Navimodul im Kofferraum" },
     { v: "nein", t: "Nein, Anschlüsse nur hinter dem Radio" },
     { v: "nein", t: "Nein, Anschlüsse nur hinter dem Radio" },
     { v: "unk", t: "Weiß ich nicht" } ] },
     { v: "unk", t: "Weiß ich nicht" } ] },
  { id: "aux", label: "AUX-IN verfügbar?", show: { gen: ["b", "c"] }, values: [
    { v: "ja", t: "Ja" }, { v: "nein", t: "Nein" } ] },
   { id: "sound", label: "Soundsystem", values: [
   { id: "sound", label: "Soundsystem", values: [
     { v: "stereo", t: "Stereo" },
     { v: "stereo", t: "Stereo" },
     { v: "hifi",  t: "Hifi" },
     { v: "hifi",  t: "Hifi" },
     { v: "dsp",    t: "DSP",         only: { vehicle: ["E38", "E39", "E53"] } },
     { v: "dsp",    t: "DSP", only: { vehicle: DSPV } },
     { v: "hk",    t: "Harman Kardon", only: { vehicle: ["E46", "E83"] } } ] },
     { v: "hk",    t: "Harman Kardon", only: { vehicle: HKV } } ] },
   { id: "current", label: "Aktuell verbaut", values: [
   { id: "current", label: "Aktuell verbaut", values: [
     { v: "werk", t: "Werksradio / Werksnavi" },
     { v: "werk", t: "Werksradio / Werksnavi" },
     { v: "nach", t: "Nachrüst-Radio / -Navi" } ] },
     { v: "nach", t: "Nachrüst-Radio / -Navi" } ] },
   { id: "body", label: "Karosserie", values: [
   { id: "body", label: "Karosserie", auto: true, values: bodyValues },
    { v: "limo",   t: "Limousine", only: { vehicle: ["E38", "E39", "E46"] } },
   { id: "ant", label: "Antennenstecker am Radio (optional)", optional: true, def: "unk",
    { v: "touring", t: "Touring",  only: { vehicle: ["E39", "E46"] } },
    help: "BM24 (Rundpin) = ISO-Antennenstecker, ggf. Adapter nötig. BM54 = FAKRA, kein Adapter nötig.",
    { v: "coupe",  t: "Coupé",    only: { vehicle: ["E46"] } },
    values: [
    { v: "cabrio",  t: "Cabrio",    only: { vehicle: ["E46"] } },
    { v: "suv",    t: "SUV",      only: { vehicle: ["E53", "E83"] } } ] },
   { id: "ant", label: "Antennenstecker am Radio (optional)", optional: true, def: "unk", values: [
     { v: "unk",  t: "Weiß ich nicht" },
     { v: "unk",  t: "Weiß ich nicht" },
     { v: "iso",  t: "ISO (rund, „BM24“)" },
     { v: "iso",  t: "ISO (BM24, Rundpin)" },
     { v: "fakra", t: "FAKRA (eckig, „BM54“)" } ] }
     { v: "fakra", t: "FAKRA (BM54)" } ] }
];
];
/* ---- 2) Zusatzoptionen (Mehrfachauswahl) -----------------------------
/* ---- 3) Zusatzoptionen (Mehrfachauswahl) ---------------------------------
   show     = Option nur sichtbar, wenn Bedingung passt
   show = nur sichtbar wenn Bedingung passt   requires = nur sichtbar wenn diese Optionen gewählt sind
  requires = Option nur sichtbar, wenn diese anderen Optionen gewählt sind
   excl = Optionen derselben Gruppe schließen sich aus   items = Artikel aus ITEMS */
   excl     = Optionen mit gleicher excl-Gruppe schließen sich gegenseitig aus
  item    = Eintrag in ITEMS, der in der Liste erscheint                  */
var OPTS = [
var OPTS = [
   { id: "halter",  t: "Radio-Halter", sub: "nur BMW E39", show: { vehicle: ["E39"] }, item: "halter" },
   { id: "halter",  t: "Radio-Halter", sub: "nur BMW E39", show: { vehicle: ["5er-e39"] }, items: ["halter"] },
   { id: "ibus",    t: "I-BUS App", item: "ibus" },
   { id: "ibus",    t: "I-BUS App", show: { gen: ["alt"] }, items: ["ibus", "resler", "bclic"] },
   { id: "deepobd", t: "DeepOBD (Diagnose)", item: "deepobd" },
   { id: "deepobd", t: "DeepOBD (Diagnose)", items: ["deepobd"] },
   { id: "can",    t: "CAN Interface", sub: "Addon – nur mit I-BUS App", requires: ["ibus"], item: "can" },
   { id: "can",    t: "CAN Interface", sub: "Addon - nur mit I-BUS App", requires: ["ibus"], items: ["can"] },
   { id: "tpms",    t: "TPMS (Reifendruck)", item: "tpms" },
   { id: "tpms",    t: "TPMS (Reifendruck)", items: ["tpms"] },
   { id: "dab1",    t: "DAB+ (Single Receiver)", excl: "dab", item: "dab1" },
   { id: "dab1",    t: "DAB+ (Single Receiver)", excl: "dab", items: ["dab1"] },
   { id: "dab2",    t: "DAB+ (Dual Receiver)",  excl: "dab", item: "dab2" },
   { id: "dab2",    t: "DAB+ (Dual Receiver)",  excl: "dab", items: ["dab2"] },
   { id: "rcam",    t: "Rückfahrkamera", item: "rcam" },
   { id: "rcam",    t: "Rückfahrkamera", items: ["rcam"] },
   { id: "fcam",    t: "Front-Kamera", item: "fcam" },
   { id: "fcam",    t: "Front-Kamera", items: ["fcam"] },
   { id: "tool",    t: "Einbau-Werkzeug (Kunststoffheber)", item: "tool" }
   { id: "tool",    t: "Einbau-Werkzeug (Kunststoffheber)", items: ["tool"] }
];
];
/* Wird eine Option durch eine Auswahl erzwungen, wird sie automatisch gesetzt. */
/* Erzwungene Optionen (werden automatisch gesetzt und gesperrt) */
var FORCED = [
var FORCED = [
   { when: { sound: ["dsp"] }, opts: ["ibus"], why: "wegen DSP erforderlich" }
   { when: { sound: ["dsp"] }, opts: ["ibus"], why: "wegen DSP erforderlich" }
];
];
/* ---- 3) Artikel/Produkte ---------------------------------------------
/* ---- 4) Artikel ------------------------------------------------------------
   u = Link in den Shop (leer lassen = Eintrag ohne Link)                  */
   u = Shop-Link (ut = Linktext)  w = Wiki-Link (wt = Linktext)  leer = kein Link
  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 (Bus-/Stromanschluss nach vorn).",
   exl005:  { t: "Verlängerung EXL005", d: "Ersetzt das Radiomodul im Kofferraum.", u: SHOP + "detail/index/sArticle/212/" },
            u: "https://shop.ibus-app.de/detail/index/sArticle/212/" },
   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.",
             u: "https://shop.ibus-app.de/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, wenn das Fahrzeug einen ISO-Antennenstecker hat.",
   isoada:  { t: "Adapter ISO-Stecker auf FAKRA, gewinkelt (15 cm)", d: "Nötig bei ISO-Antennenstecker (BM24, Rundpin).",
             u: "https://shop.ibus-app.de/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" },
   dsplic: { t: "DSP-Lizenz für die I-BUS App", d: "Ohne diese Lizenz arbeitet das Werks-DSP nicht.", u: "" },
   bcdsp:   { t: "I-BUS App - BC+DSP Lizenz", d: "Ohne DSP-Lizenz arbeitet das Werks-DSP nicht.",
   halter:  { t: "Halter zur Radio-Montage im BMW E39", d: "Empfohlen bei Radios, die nicht von AVIN stammen.",
            u: SHOP + "i-bus-app/lizenzen/171/i-bus-app-bc-dsp-lizenz" },
             u: "https://shop.ibus-app.de/shop/zubehoer/182/halter-zur-radio-montage-im-bmw-e39" },
   halter:  { t: "Alu-Halter zur Radio-Montage im BMW E39", d: "Empfohlen bei Radios, die nicht von AVIN stammen.",
   ibus:    { t: "I-BUS App", d: "Erhält Bordcomputer-Funktionen und steuert z. B. den Original-CD-Wechsler.",
             u: SHOP + "i-bus-app/zubehoer/radiohalter/185/alu-halter-zur-radio-montage-im-bmw-e39" },
             u: "http://www.ibus-app.de" },
   ibus:    { t: "I-BUS App", d: "Erhält die Bordcomputer-Funktionen und steuert z. B. den Original-CD-Wechsler.",
   deepobd: { t: "DeepOBD (Diagnose)", d: "Live-Werte auslesen, Fehler lesen und löschen.", u: "" },
             u: SHOP + "cat/index/sCategory/42",
   can:    { t: "CAN Interface (Addon zur I-BUS App)", d: "Funktioniert nur zusammen mit der I-BUS App.", u: "" },
            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?" },
   tpms:    { t: "TPMS – Reifendruckanzeige", d: "", u: "https://xtrons.co.uk/tyre-pressure-monitoring-system-tpms01" },
  resler:  { t: "Resler USB I-BUS Modul inkl. Anschlusskabel", d: "Verbindet I-BUS App und Fahrzeug.",
   dab1:    { t: "DAB+ Single Receiver", d: "", u: "https://xtrons.co.uk/dab-tuner-usbdab01" },
            u: SHOP + "i-bus-app/zubehoer/interfaces-module/191/resler-usb-i-bus-modul-inkl.-anschlusskabel",
   dab2:    { t: "DAB+ Dual Receiver", d: "", u: "" },
            w: "https://wiki.ibus-app.de/index.php?title=Hauptseite#Einbauanleitung_f.C3.BCr_Resler_Modul_und_Resler_Interface", wt: "Einbauanleitung Resler Modul" },
   rcam:    { t: "Rückfahrkamera", d: "", u: "" },
  bclic:  { t: "I-BUS App - BC Lizenz", d: "Schaltet u. a. die BC-Daten der App frei.", skipIf: "bcdsp",
   fcam:    { t: "Front-Kamera", d: "", u: "" },
            u: SHOP + "i-bus-app/lizenzen/167/i-bus-app-bc-lizenz" },
   tool:    { t: "Einbau-Werkzeug (Kunststoffheber)", d: "Zum schonenden Lösen der Verkleidungen.", u: "" }
   deepobd: { t: "Deep OBD OBD-II Bluetooth-Adapter", d: "Live-Werte auslesen, Fehler lesen und löschen.",
            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" },
   can:    { t: "CAN-Bus Interface inkl. Anschlusskabel", d: "Addon, funktioniert nur zusammen mit der I-BUS App.",
            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" },
   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" },
   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" },
   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 →" },
   tool:    { t: "Einbau-Werkzeug (Kunststoffheber)", d: "Zum schonenden Lösen der Verkleidungen.", u: SHOP + "radiozubehoer/einbauwerkzeug/" }
};
};
/* ---- 4) Regeln --------------------------------------------------------
/* ---- 5) Regeln --------------------------------------------------------------
   type = "need" (Das brauchst Du) | "hint" (Hinweise)
   type: need (Das brauchst Du) oder hint (Hinweise)   when = Bedingung auf die Felder
  when = Bedingung auf die Auswahlfelder (alle Schlüssel müssen passen)
   opts = diese Zusatzoptionen müssen gewählt sein     items = Artikel   html = Text
   opts = (optional) diese Zusatzoptionen müssen gewählt sein
  Abgeleitete Werte: gen (alt/b/c) und module (ja/nein/unk = Radiomodul im Kofferraum, nur gen alt) */
  items = Artikel aus ITEMS      html = Hinweistext (HTML erlaubt)
  Abgeleiteter Wert "module": ja = Radiomodul im Kofferraum, nein = nicht, unk = unklar */
var RULES = [
var RULES = [
   { 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: "\u003Cb\u003EVerlängerungen prüfen:\u003C/b\u003E Bei einem bereits verbauten Nachrüst-Radio sollten EXL005 und FAKRA-Verlängerung schon vorhanden sein. \u003Cb\u003EUngeeignet\u003C/b\u003E 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)." },
   { type: "hint", when: { module: ["ja"] },
   { type: "hint", when: { module: ["ja"] },
     html: "\u003Cb\u003EKabelwege:\u003C/b\u003E Die Technik sitzt im Kofferraum. Es müssen mindestens Kabel für Radioanschluss und FM-Antenne 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." },
   { type: "hint", when: { module: ["nein"] },
   { type: "hint", when: { module: ["nein"] },
     html: "\u003Cb\u003EKabelwege:\u003C/b\u003E Alle Anschlüsse befinden sich direkt hinter dem Radio, es müssen \u003Cb\u003Ekeine\u003C/b\u003E 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: "\u003Cb\u003EBitte prüfen:\u003C/b\u003E Schau nach, ob im Kofferraum ein Radiomodul sitzt. Manche E46 mit Pfeilnavi (vermutlich Vorfacelift) haben das Radio hinten und benötigen dann EXL005 + FAKRA-Verlängerung." },
     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." },
   { type: "need", when: { ant: ["iso"] }, items: ["isoada"] },
   { type: "need", when: { ant: ["iso"] }, items: ["isoada"] },
   { type: "hint", when: { ant: ["unk"] },
   { type: "hint", when: { ant: ["unk"] },
     html: "\u003Cb\u003EAntennenstecker:\u003C/b\u003E Hat Dein Fahrzeug einen ISO-Antennenstecker, brauchst Du zusätzlich den \u003Ca href='https://shop.ibus-app.de/shop/zubehoer/adapterkabel/193/adapter-kabel-iso-f-auf-fakra-f-kurz-gewinkelt-15cm'\u003EAdapter ISO auf FAKRA\u003C/a\u003E. Bei FAKRA ist kein Adapter nötig." },
     html: "[b]Antennenstecker:[/b] [b]BM24[/b] (Rundpin) = ISO-Antennenstecker, ggf. wird der [a=" + SHOP + "shop/zubehoer/adapterkabel/193/adapter-kabel-iso-f-auf-fakra-f-kurz-gewinkelt-15cm]Adapter ISO auf FAKRA[/a] nötig. [b]BM54[/b] = FAKRA, kein Adapter nötig." },
   { type: "need", when: { sound: ["dsp"] }, items: ["dsplic"] },
   { type: "need", when: { sound: ["dsp"] }, items: ["bcdsp"] },
   { type: "hint", when: { sound: ["dsp"] },
   { type: "hint", when: { sound: ["dsp"] },
     html: "\u003Cb\u003EDSP:\u003C/b\u003E Damit das Werks-DSP überhaupt arbeitet, wird die I-BUS App mit 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." },
   { type: "hint", when: { sound: ["hk"] },
   { type: "hint", when: { sound: ["hk"], gen: ["alt"] },
     html: "\u003Cb\u003EHarman Kardon:\u003C/b\u003E Benötigt \u003Cb\u003Ekeine\u003C/b\u003E 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." },
   { type: "hint", when: { vehicle: ["E38", "E53"] },
  { type: "hint", when: { aux: ["nein"] },
     html: "\u003Cb\u003EMontage:\u003C/b\u003E Radios für BMW E38/E53 benötigen keine extra Halterungen." },
    html: "[b]AUX-IN:[/b] Der AUX-IN muss codiert werden. Optional kann ein FM-Transmitter genutzt werden - das ist nicht empfohlen." },
   { type: "hint", when: { vehicle: ["E39"] },
   { type: "hint", when: { vehicle: ["7er-e38", "x5-e53"] },
     html: "\u003Cb\u003EMontage:\u003C/b\u003E Bei Radios, die nicht von AVIN stammen, empfehlen wir einen Halter (siehe Zusatzoptionen) oder das Bearbeiten der beiliegenden Montagewinkel. Anleitungen: \u003Ca href='https://xtrons.ibus-app.de/index.php?title=Montageanleitungen'\u003EMontageanleitungen\u003C/a\u003E." },
     html: "[b]Montage:[/b] Radios für BMW E38/E53 benötigen keine extra Halterungen." },
   { type: "hint", when: { vehicle: ["E46"], factory: ["iris", "mid", "pfeil"], current: ["werk"] },
   { type: "hint", when: { vehicle: ["5er-e39"] },
     html: "\u003Cb\u003EMontage E46 ohne großes Navi:\u003C/b\u003E Das Klimabedienteil muss nach unten versetzt werden. Dafür brauchst Du den passenden \u003Cb\u003EFunktionsträger\u003C/b\u003E (neu ca. 100 €, ggf. beim Teileverwerter günstiger):\u003Cbr\u003E" +
     html: "[b]Montage:[/b] Bei Radios, die nicht von AVIN stammen, empfehlen wir einen Halter (siehe Zusatzoptionen) oder das Bearbeiten der beiliegenden Montagewinkel. Anleitungen: [a=https://xtrons.ibus-app.de/index.php?title=Montageanleitungen]Montageanleitungen[/a]." },
           "Einzelschalter (eher VFL): \u003Ca href='https://www.leebmann24.de/trager-3er-51168202186.html'\u003Eohne Raucher 51168202186\u003C/a\u003E / \u003Ca href='https://www.leebmann24.de/trager-3er-51168230902.html'\u003Emit Raucher 51168230902\u003C/a\u003E\u003Cbr\u003E" +
   { type: "hint", when: { vehicle: ["3er-e46"], factory: ["iris", "mid", "pfeil"], current: ["werk"] },
           "Schaltzentrum (eher FL): \u003Ca href='https://www.leebmann24.de/funktionstrager-schaltzentrum-3er-51167001408.html'\u003Eohne Raucher 51167001408\u003C/a\u003E / \u003Ca href='https://www.leebmann24.de/funktionstrager-schaltzentrum-3er-51167001410.html'\u003Emit Raucher 51167001410\u003C/a\u003E" },
     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]" +
           "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]" },
   { type: "hint", opts: ["ibus"], when: {},
   { type: "hint", opts: ["ibus"], when: {},
     html: "\u003Cb\u003EI-BUS App:\u003C/b\u003E Siehe \u003Ca href='https://wiki.ibus-app.de/index.php?title=Was_brauche_ich_um_die_I-BUS_App_nutzen_zu_k%C3%B6nnen%3F'\u003EWas brauche ich, um die I-BUS App nutzen zu können?\u003C/a\u003E und die \u003Ca href='https://wiki.ibus-app.de/index.php?title=Einbauanleitung_f%C3%BCr_Resler_Modul_und_Resler_Interface'\u003EEinbauanleitung für Resler Modul und Interface\u003C/a\u003E." },
     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]." },
   { type: "hint", when: {}, opts: [],
   { type: "hint", when: {},
     html: "\u003Cb\u003EWichtig:\u003C/b\u003E Bitte immer die Anschlüsse am eigenen Radio abgleichen. Welches Radio passt? → \u003Ca href='https://xtrons.ibus-app.de/index.php?title=Entscheidungshilfe%3A_AVIN_oder_XTRONS%3F'\u003EEntscheidungshilfe AVIN oder XTRONS\u003C/a\u003E, Kosten → \u003Ca href='https://xtrons.ibus-app.de/index.php?title=Grobe_Kosten%C3%BCbersicht'\u003EGrobe Kostenübersicht\u003C/a\u003E." }
     html: "[b]Wichtig:[/b] Bitte immer die Anschlüsse am eigenen Radio abgleichen. Welches Radio passt? [a=https://xtrons.ibus-app.de/index.php?title=Entscheidungshilfe%3A_AVIN_oder_XTRONS%3F]Entscheidungshilfe AVIN oder XTRONS[/a] - Kosten: [a=https://xtrons.ibus-app.de/index.php?title=Grobe_Kosten%C3%BCbersicht]Grobe Kostenübersicht[/a]." }
];
];
/* =====================================================================
/* =====================================================================
Zeile 158: Zeile 212:
var sel = {}, picked = {};
var sel = {}, picked = {};
var fieldsEl = $("nvk-fields"), optsEl = $("nvk-opts"), outEl = $("nvk-out");
var fieldsEl = $("nvk-fields"), optsEl = $("nvk-opts"), outEl = $("nvk-out");
function fmt(t) {
  return t.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");
}
function match(cond, s, lenient) {
function match(cond, s, lenient) {
   if (!cond) return true;
   if (!cond) return true;
Zeile 166: Zeile 224:
   return true;
   return true;
}
}
function vehicleOf(id) { return VEHICLES.filter(function (x) { return x.v === id; })[0]; }
function derive() {
function derive() {
   var s = {}, k;
   var s = {}, k;
   for (k in sel) s[k] = sel[k];
   for (k in sel) s[k] = sel[k];
   if (s.factory === "n43" || s.factory === "n169") s.module = "ja";
   var veh = vehicleOf(sel.vehicle);
  else if (s.factory === "iris" || s.factory === "mid") s.module = "nein";
  if (veh) s.gen = veh.gen;
  else if (s.factory === "pfeil") s.module = s.trunk || "unk";
  if (s.gen === "alt") {
    if (s.factory === "n43" || s.factory === "n169") s.module = "ja";
    else if (s.factory === "iris" || s.factory === "mid") s.module = "nein";
    else if (s.factory === "pfeil") s.module = s.trunk || "unk";
  }
   return s;
   return s;
}
}
Zeile 189: Zeile 252:
   return (o.requires || []).every(function (r) { return on[r]; });
   return (o.requires || []).every(function (r) { return on[r]; });
}
}
/* Felder aufbauen */
FIELDS.forEach(function (f) {
FIELDS.forEach(function (f) {
   var wrap = document.createElement("div"); wrap.className = "nvk-f"; wrap.id = "nvk-w-" + f.id;
   var wrap = document.createElement("div"); wrap.className = "nvk-f"; wrap.id = "nvk-w-" + f.id;
Zeile 195: Zeile 257:
   var s = document.createElement("select"); s.id = "nvk-" + f.id;
   var s = document.createElement("select"); s.id = "nvk-" + f.id;
   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); fieldsEl.appendChild(wrap);
   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); }
  fieldsEl.appendChild(wrap);
});
});
function renderFields() {
function renderFields() {
  var s = derive();
   FIELDS.forEach(function (f) {
   FIELDS.forEach(function (f) {
    var s = derive();
     var wrap = $("nvk-w-" + f.id), el = $("nvk-" + f.id);
     var wrap = $("nvk-w-" + f.id), el = $("nvk-" + f.id);
     var vis = match(f.show, s, false) || !f.show;
     var vis = f.show ? match(f.show, s, false) : true;
     wrap.style.display = vis ? "" : "none";
     wrap.style.display = vis ? "" : "none";
     if (!vis) { sel[f.id] = ""; return; }
     if (!vis) { sel[f.id] = ""; return; }
     var allowed = f.values.filter(function (v) { return match(v.only, s, true); });
     var allowed = f.values.filter(function (v) { return match(v.only, s, true); });
     if (sel[f.id] ? !allowed.some(function (v) { return v.v === sel[f.id]; }) : false) sel[f.id] = "";
     if (sel[f.id]) { if (!allowed.some(function (v) { return v.v === sel[f.id]; })) sel[f.id] = ""; }
     if (!sel[f.id]) { if (f.def) sel[f.id] = f.def; }
     if (!sel[f.id]) { if (f.def) sel[f.id] = f.def; }
    if (!sel[f.id]) { if (f.auto) { if (sel.vehicle) { if (allowed.length === 1) sel[f.id] = allowed[0].v; } } }
     el.innerHTML = "";
     el.innerHTML = "";
     if (!f.def) { var p = document.createElement("option"); p.value = ""; p.textContent = "– bitte wählen –"; el.appendChild(p); }
     if (!f.def) { var p = document.createElement("option"); p.value = ""; p.textContent = "– bitte wählen –"; el.appendChild(p); }
Zeile 217: Zeile 282:
function renderOpts() {
function renderOpts() {
   var s = derive(), st = onSet(s);
   var s = derive(), st = onSet(s);
  /* Gruppen-Ausschluss und nicht mehr sichtbare Optionen bereinigen */
   OPTS.forEach(function (o) { if (!optVisible(o, s, st.on)) picked[o.id] = false; });
   OPTS.forEach(function (o) { if (!optVisible(o, s, st.on)) picked[o.id] = false; });
   st = onSet(s);
   st = onSet(s);
Zeile 234: Zeile 298:
     });
     });
     lab.appendChild(cb);
     lab.appendChild(cb);
    var txt = " " + o.t;
     lab.appendChild(document.createTextNode(" " + o.t));
     lab.appendChild(document.createTextNode(txt));
     var sub = [o.sub, isForced ? st.forced[o.id] : ""].filter(Boolean).join(" - ");
     var sub = [o.sub, isForced ? st.forced[o.id] : ""].filter(Boolean).join(" – ");
     if (sub) { var sm = document.createElement("small"); sm.textContent = " (" + sub + ")"; lab.appendChild(sm); }
     if (sub) { var sm = document.createElement("small"); sm.textContent = " (" + sub + ")"; lab.appendChild(sm); }
     optsEl.appendChild(lab);
     optsEl.appendChild(lab);
   });
   });
}
function link(url, text) {
  var a = document.createElement("a"); a.href = url; a.target = "_blank"; a.rel = "noopener"; a.textContent = text; return a;
}
}
function card(item, cls) {
function card(item, cls) {
Zeile 245: Zeile 311:
   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.u) {
   if (item.u || item.w) {
     var a = document.createElement("a"); a.className = "nvk-shop"; a.href = item.u; a.target = "_blank"; a.rel = "noopener";
     var l = document.createElement("div"); l.className = "nvk-links";
    a.textContent = "Im Shop ansehen →"; d.appendChild(a);
    if (item.u) l.appendChild(link(item.u, item.ut || "Im Shop ansehen →"));
    if (item.w) l.appendChild(link(item.w, (item.wt || "Zum Wiki") + " →"));
    d.appendChild(l);
   }
   }
   return d;
   return d;
}
}
function heading(txt) { var h = document.createElement("h3"); h.textContent = txt; outEl.appendChild(h); }
function renderResult() {
function renderResult() {
   var s = derive(), st = onSet(s);
   var s = derive(), st = onSet(s);
   var required = ["vehicle", "factory", "sound", "current", "body"];
   var missing = FIELDS.filter(function (f) {
  var names = { vehicle: "Fahrzeug", factory: "Verbaut ab Werk", sound: "Soundsystem", current: "Aktuell verbaut", body: "Karosserie" };
    var w = $("nvk-w-" + f.id);
  var missing = required.filter(function (k) { return !sel[k]; });
    return w.style.display !== "none" ? (!f.optional ? !sel[f.id] : false) : false;
  });
   outEl.innerHTML = "";
   outEl.innerHTML = "";
   if (missing.length) {
   if (missing.length) {
     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 (k) { return names[k]; }).join(", ");
     m.textContent = "Bitte noch auswählen: " + missing.map(function (f) { return f.label; }).join(", ");
     outEl.appendChild(m); return;
     outEl.appendChild(m); return;
   }
   }
Zeile 269: Zeile 339:
     else hints.push(r.html);
     else hints.push(r.html);
   });
   });
   var h = document.createElement("h3"); h.textContent = "Das brauchst Du"; outEl.appendChild(h);
   heading("Das brauchst Du");
   if (needs.length) needs.forEach(function (i) { outEl.appendChild(card(i)); });
   if (needs.length) needs.forEach(function (i) { outEl.appendChild(card(i)); });
   else { var n = document.createElement("p"); n.textContent = "Für die Grundinstallation sind keine zusätzlichen Verlängerungen oder Adapter nötig."; outEl.appendChild(n); }
   else { var n = document.createElement("p"); n.textContent = "Für die Grundinstallation sind keine zusätzlichen Verlängerungen oder Adapter nötig."; outEl.appendChild(n); }
   var opt = [];
   var opt = [];
   OPTS.forEach(function (o) { if (st.on[o.id]) { if (optVisible(o, s, st.on)) { if (!seen[o.item]) opt.push(ITEMS[o.item]); } } });
   OPTS.forEach(function (o) {
   if (opt.length) {
    if (!st.on[o.id]) return;
    var h2 = document.createElement("h3"); h2.textContent = "Deine Zusatzoptionen"; outEl.appendChild(h2);
    if (!optVisible(o, s, st.on)) return;
    opt.forEach(function (i) { outEl.appendChild(card(i, "opt")); });
    o.items.forEach(function (id) {
  }
      if (seen[id]) return;
      var sk = ITEMS[id].skipIf;
      if (sk) { if (seen[sk]) return; }
      seen[id] = 1; opt.push(ITEMS[id]);
    });
  });
   if (opt.length) { heading("Deine Zusatzoptionen"); opt.forEach(function (i) { outEl.appendChild(card(i, "opt")); }); }
   if (hints.length) {
   if (hints.length) {
     var h3 = document.createElement("h3"); h3.textContent = "Hinweise"; outEl.appendChild(h3);
     heading("Hinweise");
     hints.forEach(function (t) { var d = document.createElement("div"); d.className = "nvk-note"; d.innerHTML = 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"));
}
}
function update() { renderFields(); renderOpts(); renderResult(); }
function update() { renderFields(); renderOpts(); renderResult(); }

Version vom 21. Oktober 2026, 10:11 Uhr

Zusatzoptionen