Android Radio Konfigurator: Unterschied zwischen den Versionen
Aus Wiki rund um Android-Navis für BMW E38/E39/E46/E53
Andre (Diskussion | Beiträge) |
Andre (Diskussion | Beiträge) |
||
| 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-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- | #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 | 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) | var SHOP = "https://shop.ibus-app.de/"; | ||
v = | var WIKI = "https://wiki.ibus-app.de/index.php?title="; | ||
only = Wert nur anbieten, wenn Bedingung passt | /* ---- 1) Baureihen -------------------------------------------------------- | ||
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 }; }) }, | ||
{ 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", | { 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: [" | { 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"] } }, | ||
{ 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", | { v: "dsp", t: "DSP", only: { vehicle: DSPV } }, | ||
{ v: "hk", t: "Harman Kardon", only: { vehicle: | { 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", | { id: "body", label: "Karosserie", auto: true, values: bodyValues }, | ||
{ 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.", | |||
values: [ | |||
{ 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 ( | { v: "iso", t: "ISO (BM24, Rundpin)" }, | ||
{ v: "fakra", t: "FAKRA ( | { v: "fakra", t: "FAKRA (BM54)" } ] } | ||
]; | ]; | ||
/* ---- | /* ---- 3) Zusatzoptionen (Mehrfachauswahl) --------------------------------- | ||
show | show = nur sichtbar wenn Bedingung passt requires = nur sichtbar wenn diese Optionen gewählt sind | ||
excl = Optionen derselben Gruppe schließen sich aus items = Artikel aus ITEMS */ | |||
excl | |||
var OPTS = [ | var OPTS = [ | ||
{ id: "halter", t: "Radio-Halter", sub: "nur BMW E39", show: { vehicle: [" | { id: "halter", t: "Radio-Halter", sub: "nur BMW E39", show: { vehicle: ["5er-e39"] }, items: ["halter"] }, | ||
{ id: "ibus", t: "I-BUS App", | { id: "ibus", t: "I-BUS App", show: { gen: ["alt"] }, items: ["ibus", "resler", "bclic"] }, | ||
{ id: "deepobd", t: "DeepOBD (Diagnose)", | { id: "deepobd", t: "DeepOBD (Diagnose)", items: ["deepobd"] }, | ||
{ id: "can", t: "CAN Interface", sub: "Addon | { id: "can", t: "CAN Interface", sub: "Addon - nur mit I-BUS App", requires: ["ibus"], items: ["can"] }, | ||
{ id: "tpms", t: "TPMS (Reifendruck)", | { id: "tpms", t: "TPMS (Reifendruck)", items: ["tpms"] }, | ||
{ id: "dab1", t: "DAB+ (Single Receiver)", excl: "dab", | { id: "dab1", t: "DAB+ (Single Receiver)", excl: "dab", items: ["dab1"] }, | ||
{ id: "dab2", t: "DAB+ (Dual Receiver)", excl: "dab", | { id: "dab2", t: "DAB+ (Dual Receiver)", excl: "dab", items: ["dab2"] }, | ||
{ id: "rcam", t: "Rückfahrkamera", | { id: "rcam", t: "Rückfahrkamera", items: ["rcam"] }, | ||
{ id: "fcam", t: "Front-Kamera", | { id: "fcam", t: "Front-Kamera", items: ["fcam"] }, | ||
{ id: "tool", t: "Einbau-Werkzeug (Kunststoffheber)", | { id: "tool", t: "Einbau-Werkzeug (Kunststoffheber)", items: ["tool"] } | ||
]; | ]; | ||
/* | /* 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" } | ||
]; | ]; | ||
/* ---- | /* ---- 4) Artikel ------------------------------------------------------------ | ||
u = 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 | exl005: { t: "Verlängerung EXL005", d: "Ersetzt das Radiomodul im Kofferraum.", u: SHOP + "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: " | 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 | isoada: { t: "Adapter ISO-Stecker auf FAKRA, gewinkelt (15 cm)", d: "Nötig bei ISO-Antennenstecker (BM24, Rundpin).", | ||
u: " | 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.", | |||
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: " | 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: " | ibus: { t: "I-BUS App", d: "Erhält die Bordcomputer-Funktionen und steuert z. B. den Original-CD-Wechsler.", | ||
deepobd: { t: " | u: SHOP + "cat/index/sCategory/42", | ||
can: { t: "CAN Interface | 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 | resler: { t: "Resler USB I-BUS Modul inkl. Anschlusskabel", d: "Verbindet I-BUS App und Fahrzeug.", | ||
dab1: { t: "DAB+ Single | u: SHOP + "i-bus-app/zubehoer/interfaces-module/191/resler-usb-i-bus-modul-inkl.-anschlusskabel", | ||
dab2: { t: "DAB+ | 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/" } | |||
}; | }; | ||
/* ---- | /* ---- 5) Regeln -------------------------------------------------------------- | ||
type | type: need (Das brauchst Du) oder hint (Hinweise) when = Bedingung auf die Felder | ||
opts = diese Zusatzoptionen müssen gewählt sein items = Artikel html = Text | |||
opts | Abgeleitete Werte: gen (alt/b/c) und module (ja/nein/unk = Radiomodul im Kofferraum, nur gen alt) */ | ||
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: " | 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: " | 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: " | 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: " | 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: " | 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: [" | { type: "need", when: { sound: ["dsp"] }, items: ["bcdsp"] }, | ||
{ type: "hint", when: { sound: ["dsp"] }, | { type: "hint", when: { sound: ["dsp"] }, | ||
html: " | 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: " | 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: [" | { type: "hint", when: { aux: ["nein"] }, | ||
html: " | 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: [" | { type: "hint", when: { vehicle: ["7er-e38", "x5-e53"] }, | ||
html: " | html: "[b]Montage:[/b] Radios für BMW E38/E53 benötigen keine extra Halterungen." }, | ||
{ type: "hint", when: { vehicle: [" | { type: "hint", when: { vehicle: ["5er-e39"] }, | ||
html: " | 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): | { type: "hint", when: { vehicle: ["3er-e46"], factory: ["iris", "mid", "pfeil"], current: ["werk"] }, | ||
"Schaltzentrum (eher FL): | 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: " | 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: {} | { type: "hint", when: {}, | ||
html: " | 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); | ||
if (veh) s.gen = veh.gen; | |||
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]; }); | ||
} | } | ||
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() { | ||
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) | 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] | 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); | ||
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); | ||
lab.appendChild(document.createTextNode(" " + o.t)); | |||
lab.appendChild(document.createTextNode( | 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 | var l = document.createElement("div"); l.className = "nvk-links"; | ||
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 | var missing = FIELDS.filter(function (f) { | ||
var w = $("nvk-w-" + f.id); | |||
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 ( | 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); | ||
}); | }); | ||
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]) | OPTS.forEach(function (o) { | ||
if (opt.length) { | if (!st.on[o.id]) return; | ||
if (!optVisible(o, s, st.on)) return; | |||
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) { | ||
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(); } | ||