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) |
||
| (20 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
| Zeile 1: | Zeile 1: | ||
< | <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"> | <html> | ||
<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 18: | 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:#fff;background:rgba(255,255,255,.08)} | |||
#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} | ||
#nvk .nvk-img{max-width:150px;max-height:110px;height:auto;margin:4px 8px 0 0;border:1px solid rgba(128,128,128,.4);border-radius:3px;background:#fff} | |||
#nvk .nvk-card .nvk-img{max-width:230px;max-height:150px} | |||
#nvk input[type=text],#nvk input[type=email],#nvk textarea{width:100%;padding:9px 8px;font:inherit;color:#202122;background:#fff;border:1px solid #a2a9b1;border-radius:4px} | |||
#nvk .nvk-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} | |||
</style> | </style> | ||
<div id="nvk-lang" style="text-align:right;margin-bottom:6px"></div> | |||
<div class="nvk-grid" id="nvk-fields"></div> | <div class="nvk-grid" id="nvk-fields"></div> | ||
<fieldset id="nvk-optset"><legend>Zusatzoptionen</legend><div id="nvk-opts"></div></fieldset> | <fieldset id="nvk-optset"><legend data-en="Additional options">Zusatzoptionen</legend><div id="nvk-opts"></div></fieldset> | ||
<button type="button" class="nvk-btn" id="nvk-reset">Auswahl zurücksetzen</button> | <button type="button" class="nvk-btn" id="nvk-reset" data-en="Reset selection">Auswahl zurücksetzen</button> | ||
<div id="nvk-out" aria-live="polite"></div> | <div id="nvk-out" aria-live="polite"></div> | ||
<noscript>Für den Konfigurator wird JavaScript benötigt.</noscript> | <fieldset id="nvk-form" style="display:none"><legend data-en="Send request">Anfrage senden</legend> | ||
<p class="nvk-help" data-en="Your selection and the list above are sent automatically. All fields marked * are required.">Deine Auswahl und die Liste oben werden automatisch mitgesendet. Alle Felder mit * sind Pflicht.</p> | |||
<div class="nvk-grid"> | |||
<div class="nvk-f"><label for="nvk-name">Name *</label><input id="nvk-name" type="text" autocomplete="name"></div> | |||
<div class="nvk-f"><label for="nvk-mail" data-en="Email *">E-Mail *</label><input id="nvk-mail" type="email" autocomplete="email"></div> | |||
<div class="nvk-f"><label for="nvk-size" data-en="Desired display size (optional)">Gewünschte Displaygröße (optional)</label><select id="nvk-size"><option value="" data-en="No preference / advice wanted">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 data-en="Other size (please state in comment)">Andere Größe (bitte im Kommentar nennen)</option></select><div class="nvk-help" data-en="Diagonal in inches. Not every size is available for every model - we will check this for you.">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" data-en="VIN (optional)">VIN oder FGN (optional)</label><input id="nvk-vin" type="text" maxlength="17" placeholder="AB12345 oder 17-stellige FGN" data-en-ph="AB12345 or full 17-character VIN"></div> | |||
</div> | |||
<div class="nvk-f"><label for="nvk-msg" data-en="Comment *">Kommentar *</label><textarea id="nvk-msg" rows="4"></textarea></div> | |||
<div class="nvk-f" style="max-width:300px"><label for="nvk-cap" id="nvk-capq">Sicherheitsfrage *</label><input id="nvk-cap" type="text" inputmode="numeric"></div> | |||
<input id="nvk-hp" type="text" tabindex="-1" autocomplete="off" aria-hidden="true" style="position:absolute;left:-9999px;width:1px"> | |||
<label class="nvk-o"><input type="checkbox" id="nvk-dsgvo"> <span data-en="I agree that my details may be processed by email to handle this request.">Ich stimme zu, dass meine Angaben zur Bearbeitung der Anfrage per E-Mail verarbeitet werden.</span><span id="nvk-dslink"></span> *</label> | |||
<button type="button" class="nvk-btn" id="nvk-send" data-en="Send request">Anfrage senden</button> | |||
<div id="nvk-status" class="nvk-note" style="display:none"></div> | |||
</fieldset> | |||
<div id="nvk-legal" class="nvk-help" style="margin-top:20px"><b data-en="Note:">Hinweis:</b> <span data-en="The configurator gives a non-binding orientation on suitable items. Equipment and connections may differ depending on year, model and modifications. Please check your selection against your vehicle before ordering. If in doubt, use the request form - we are happy to check the combination for you.">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.</span><div id="nvk-legal-links" style="margin-top:4px"></div></div> | |||
<noscript>Für den Konfigurator wird JavaScript benötigt. / JavaScript is required for the configurator.</noscript> | |||
<script> | <script> | ||
(function () { | (function () { | ||
"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). | |||
===================================================================== */ | ===================================================================== */ | ||
var SHOP = "https://shop.ibus-app.de/"; | |||
/* ---- 1) | var WIKI = "https://wiki.ibus-app.de/index.php?title="; | ||
v = | /* Bilder aus dem Wiki (Thumbnail-Adressen; Klick öffnet automatisch das Originalbild) */ | ||
only = Wert nur anbieten, wenn Bedingung passt | var IM = "https://xtrons.ibus-app.de/images/thumb/"; | ||
var P = { | |||
schema: IM + "e/ea/BMW_E39_Verl%C3%A4ngerungen_EXL005%2BFAKRA_.png/135px-BMW_E39_Verl%C3%A4ngerungen_EXL005%2BFAKRA_.png", | |||
exl005: IM + "7/70/Exl005-1.webp/257px-Exl005-1.webp.png", | |||
fakra6m: IM + "d/d8/FM-extension_01_1.png/270px-FM-extension_01_1.png", | |||
isofakra: IM + "4/4e/ISO-FAKRA_1.png/270px-ISO-FAKRA_1.png", | |||
bm24: IM + "8/82/BM24.png/130px-BM24.png", | |||
iso: IM + "d/dd/Iso.jpg/69px-Iso.jpg", | |||
bm54: IM + "3/34/BM54.png/135px-BM54.png", | |||
fakra: IM + "b/b3/Fakra.jpg/100px-Fakra.jpg", | |||
pfeil: IM + "e/ee/Navi_E46.jpg/239px-Navi_E46.jpg", | |||
noquad: IM + "6/68/No_elongation.jpg/180px-No_elongation.jpg", | |||
noexl6: IM + "7/7b/No_EXL006.jpg/180px-No_EXL006.jpg", | |||
halter: IM + "3/3b/Halter_Alu.webp/92px-Halter_Alu.webp.png", | |||
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" | |||
}; | |||
/* Anfrage-Formular: MAIL_TO = Empfänger. SEND_URL leer = E-Mail-Programm des Kunden öffnen (mailto). | |||
SEND_URL = Adresse des Server-Skripts send-anfrage.php = Versand direkt vom Server (mit CC an den Kunden). */ | |||
var MAIL_TO = "info@ibus-app.de"; | |||
var MAIL_SUBJECT = "Anfrage aus Android Radio Konfigurator"; | |||
var SEND_URL = "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; | |||
/* CART_CLEAR = true: Der Warenkorb im Shop wird vor der Übergabe geleert (benötigt Plugin 1.4.0). false = Artikel werden zum vorhandenen Warenkorb hinzugefügt. */ | |||
var CART_CLEAR = 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="; | |||
/* ---- Sprache / English ---------------------------------------------------- | |||
DEFAULT_LANG: de oder en. Umschalten per Knopf DE/EN oder per Adresse ?uselang=en */ | |||
var DEFAULT_LANG = "de"; | |||
var SHOP_EN = "https://shop.ibus-app.de/en/"; | |||
var TRANSFER_URL_EN = SHOP_EN + "nvk?add="; | |||
var MAIL_SUBJECT_EN = "Request from Android Radio Configurator"; | |||
/* Rechtliche Seiten EN (fehlt ein Eintrag, wird der deutsche Link genommen) */ | |||
var LEGAL_EN = { agb: SHOP_EN + "general-terms-and-conditions", widerruf: SHOP_EN + "revocation-right", datenschutz: SHOP_EN + "privacy-policy" }; | |||
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 -------------------------------------------------------- | |||
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 BODY_EN = { limo: "Sedan", touring: "Touring (wagon)", coupe: "Coupe", cabrio: "Convertible", schraeg: "Hatchback", | |||
compact: "Compact", gt: "Gran Turismo", gc: "Gran Coupe", suv: "SUV / SAV", roadster: "Roadster" }; | |||
function vname(x) { return LANG === "en" ? x.t.replace(/^(\d)er /, "$1 Series ") : x.t; } | |||
function enSlug(v) { return v.replace(/^(\d)er-/, "$1-series-"); } | |||
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" }, | |||
{ 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) { | |||
return { v: k, t: BODY[k], t_en: BODY_EN[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", label_en: "Vehicle", values: VEHICLES.map(function (x) { return { v: x.v, t: "BMW " + x.t, t_en: "BMW " + x.t.replace(/^(\d)er /, "$1 Series ") }; }) }, | ||
{ id: "factory", label: "Verbaut ab Werk", label_en: "Factory-fitted system", | |||
{ | pre: { when: { gen: ["b", "c"] }, html: "[b]So erkennst Du Dein System:[/b][br][imgw=" + P.idrive + "]", html_en: "[b]How to identify your system:[/b][br][imgw=" + P.idrive + "]" }, values: [ | ||
{ v: "iris", t: "Radio mit IRIS", t_en: "Radio with IRIS", only: { vehicle: ["3er-e46", "5er-e39", "7er-e38", "x5-e53"] }, info: "[img=" + P.iris + "]" }, | |||
{ v: "mid", t: "Radio mit MID", t_en: "Radio with MID", only: { gen: ["alt"] }, info: "[img=" + P.radio + "]" }, | |||
{ v: "iris", t: "Radio mit IRIS" }, | { v: "n43", t: "4:3 Navi", t_en: "4:3 navi", only: { vehicle: ["5er-e39", "7er-e38"] }, info: "[img=" + P.n43 + "]" }, | ||
{ v: "mid", t: "Radio mit MID" }, | { v: "n169", t: "16:9 Navi", t_en: "16:9 navi", only: { gen: ["alt"] }, info: "[img=" + P.n169 + "]" }, | ||
{ v: "n43", t: "4:3 Navi", | { v: "pfeil", t: "Pfeilnavi", t_en: "Arrow navi", only: { vehicle: ["3er-e46"] }, info: "[img=" + P.pfeil + "]" }, | ||
{ v: "n169", t: "16:9 Navi" }, | { v: "mask", t: "M-ASK", only: { gen: ["b"] } }, | ||
{ v: "pfeil", t: "Pfeilnavi", only: { vehicle: [" | { v: "ccc", t: "CCC", only: { gen: ["b"] } }, | ||
{ v: "cic", t: "CIC", only: { gen: ["b", "c"] } }, | |||
{ id: "trunk", label: " | { v: "nbt", t: "NBT", only: { gen: ["c"] } }, | ||
{ v: "nbtevo", t: "NBT EVO", only: { gen: ["c"] } } ] }, | |||
{ v: "ja", t: " | { id: "trunk", label: "Wo sitzt das Radiomodul des Pfeilnavis?", label_en: "Where is the radio module of the arrow navi?", optional: true, show: { factory: ["pfeil"] }, | ||
{ v: "nein", t: " | help: "Bitte prüfen: Sitzt das Modul im Kofferraum, oder im Pfeilnavi selbst (Quadlock hinten neben dem Antennenstecker)?[br][img=" + P.pfeil + "]", | ||
{ v: "unk", t: "Weiß ich nicht" } ] }, | help_en: "Please check: is the module in the trunk, or inside the arrow navi itself (Quadlock at the back next to the antenna connector)?[br][img=" + P.pfeil + "]", | ||
values: [ | |||
{ id: "sound", label: "Soundsystem", values: [ | { v: "ja", t: "Im Kofferraum (Verlängerungen nötig)", t_en: "In the trunk (extensions required)" }, | ||
{ v: "nein", t: "Im Pfeilnavi, Quadlock hinten (keine Verlängerung)", t_en: "In the arrow navi, Quadlock at the back (no extension)" }, | |||
{ v: "unk", t: "Weiß ich nicht", t_en: "I don't know" } ] }, | |||
{ id: "aux", label: "AUX-IN verfügbar?", label_en: "AUX-IN available?", show: { gen: ["b", "c"] }, values: [ | |||
{ v: "ja", t: "Ja", t_en: "Yes" }, { v: "nein", t: "Nein", t_en: "No" } ] }, | |||
{ id: "sound", label: "Soundsystem", label_en: "Sound system", values: [ | |||
{ v: "stereo", t: "Stereo" }, | { v: "stereo", t: "Stereo" }, | ||
{ v: "hifi", t: "Hifi" }, | { v: "hifi", t: "Hifi", t_en: "Hi-Fi" }, | ||
{ v: "dsp", t: "DSP", | { 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]", info_en: "[a=" + WIKI + "Habe_ich_DSP%3F]Do I have DSP?[/a]" }, | ||
{ v: "hk", t: "Harman Kardon", only: { vehicle: [" | { v: "hk", t: "Harman Kardon", only: { vehicle: ["3er-e46", "z4-e85e86"] } }, | ||
{ v: "logic7", t: "Logic7", only: { vehicle: ["3er-e9x", "5er-e6x", "6er-e6x", "7er-e65", "1er-e8x"] } }, | |||
{ v: "hksur", t: "Harman Kardon Surround", only: { vehicle: ["1er-f2x", "2er-f2x", "3er-f3x", "4er-f3x", "5er-f1x"] } } ] }, | |||
{ id: "current", label: "Aktuell verbaut", label_en: "Currently installed", values: [ | |||
{ v: "werk", t: "Werksradio / Werksnavi", t_en: "Factory radio / factory navi" }, | |||
{ v: "nach", t: "Nachrüst-Radio / -Navi", t_en: "Aftermarket radio / navi" } ] }, | |||
{ id: "body", label: "Karosserie", label_en: "Body type", auto: true, values: bodyValues }, | |||
{ id: "ant", label: "Antennenstecker am Radio (optional)", label_en: "Antenna connector on the radio (optional)", optional: true, def: "unk", | |||
show: { vehicle: ["7er-e38", "5er-e39", "3er-e46", "x5-e53"] }, | |||
{ v: " | values: [ | ||
{ v: " | { v: "unk", t: "Weiß ich nicht", t_en: "I don't know", | ||
info: "[b]BM24[/b] (Rundpin) = ISO-Antennenstecker:[br][img=" + P.bm24 + "][img=" + P.iso + "][br][b]BM54[/b] = FAKRA:[br][img=" + P.bm54 + "][img=" + P.fakra + "]", | |||
info_en: "[b]BM24[/b] (round pin) = ISO antenna connector:[br][img=" + P.bm24 + "][img=" + P.iso + "][br][b]BM54[/b] = FAKRA:[br][img=" + P.bm54 + "][img=" + P.fakra + "]" }, | |||
{ id: "ant", label: "Antennenstecker am Radio (optional)", optional: true, def: "unk", values: [ | { v: "iso", t: "ISO (BM24, Rundpin)", t_en: "ISO (BM24, round pin)", info: "[img=" + P.bm24 + "][img=" + P.iso + "]" }, | ||
{ v: "unk", t: "Weiß ich nicht" }, | { v: "fakra", t: "FAKRA (BM54)", info: "[img=" + P.bm54 + "][img=" + P.fakra + "]" } ] } | ||
{ v: "iso", t: "ISO ( | |||
{ v: "fakra", t: "FAKRA ( | |||
]; | ]; | ||
/* ---- 3) Zusatzoptionen (Mehrfachauswahl) --------------------------------- | |||
/* ---- | show = nur sichtbar wenn Bedingung passt requires = nur sichtbar wenn diese Optionen gewählt sind | ||
show | excl = Optionen derselben Gruppe schließen sich aus items = Artikel aus ITEMS | ||
Englisch: Felder mit Endung _en (t_en, sub_en, ...). Fehlt ein _en-Feld, wird der deutsche Text gezeigt. */ | |||
excl | |||
var OPTS = [ | var OPTS = [ | ||
{ id: "halter", t: "Radio-Halter", sub: "nur BMW E39", show: { vehicle: [" | { id: "halter", t: "Radio-Halter", t_en: "Radio holder", sub: "nur BMW E39", sub_en: "BMW E39 only", 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)", t_en: "DeepOBD (diagnostics)", items: ["deepobd"] }, | ||
{ id: "can", t: "CAN Interface", sub: "Addon | { id: "can", t: "CAN Interface", sub: "Addon - nur mit I-BUS App", sub_en: "Add-on - only with I-BUS App", show: { gen: ["alt"] }, requires: ["ibus"], items: ["can"] }, | ||
{ id: "tpms", t: "TPMS (Reifendruck)", | { id: "kcan", t: "K-CAN App (Beta)", sub: "Pendant zur I-BUS App", sub_en: "Counterpart to the I-BUS App", show: { vehicle: KCAN }, items: ["kcan", "kcanlic", "can"] }, | ||
{ id: "dab1", t: "DAB+ (Single Receiver)", excl: "dab", | { id: "tpms", t: "TPMS (Reifendruck)", t_en: "TPMS (tire pressure)", items: ["tpms"] }, | ||
{ id: "dab2", t: "DAB+ (Dual Receiver)", excl: "dab", | { id: "dab1", t: "DAB+ (Single Receiver)", excl: "dab", items: ["dab1"] }, | ||
{ id: "rcam", t: "Rückfahrkamera", | { id: "dab2", t: "DAB+ (Dual Receiver)", excl: "dab", items: ["dab2"] }, | ||
{ id: "fcam", t: "Front-Kamera", | { id: "rcam", t: "Rückfahrkamera", t_en: "Rear-view camera", items: ["rcam"] }, | ||
{ id: "tool", t: "Einbau-Werkzeug (Kunststoffheber)", | { id: "fcam", t: "Front-Kamera", t_en: "Front camera", items: ["fcam"] }, | ||
{ id: "tool", t: "Einbau-Werkzeug (Kunststoffheber)", t_en: "Installation tool (plastic pry tool)", 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", why_en: "required because of DSP" } | ||
]; | ]; | ||
/* ---- 4) Artikel ------------------------------------------------------------ | |||
/* ---- | u = Shop-Link DE, ue = Shop-Link EN (leer = wie DE) ut/wt = Linktexte w = Wiki-Link leer = kein Link | ||
u = Link | skipIf = Artikel entfällt, wenn der genannte Artikel schon in der Liste steht | ||
Die Lizenzen sind im EN-Shop andere Artikel (BC = OBC): ue zeigt auf den EN-Artikel. */ | |||
var ITEMS = { | var ITEMS = { | ||
exl005: { t: "Verlängerung EXL005", d: "Ersetzt das Radiomodul im Kofferraum | exl005: { t: "Verlängerung EXL005", t_en: "Extension EXL005", d: "Ersetzt das Radiomodul im Kofferraum.", d_en: "Replaces the radio module in the trunk.", | ||
u: " | u: SHOP + "detail/index/sArticle/212/", ue: SHOP_EN + "accessories-for-head-units/adapter-elongations/212/bmw-radio-extension-6-meters-exl005", img: [P.exl005, P.schema] }, | ||
fakra6m: { t: "Verlängerung 6 m FAKRA(m) auf FAKRA(f), gewinkelt", d: "Antennenverlängerung vom Kofferraum nach vorn.", | fakra6m: { t: "Verlängerung 6 m FAKRA(m) auf FAKRA(f), gewinkelt", t_en: "Extension 6 m FAKRA(m) to FAKRA(f), angled", | ||
u: " | d: "Antennenverlängerung vom Kofferraum nach vorn.", d_en: "Antenna extension from the trunk to the front.", img: [P.fakra6m], | ||
isoada: { t: "Adapter ISO-Stecker auf FAKRA, gewinkelt (15 cm)", d: "Nötig | u: SHOP + "shop/zubehoer/adapterkabel/192/verlaengerung-6m-fakra-m-auf-fakra-f-kurz-gewinkelt", | ||
u: " | ue: SHOP_EN + "i-bus-app/accessories/cable-adapters/192/extension-6m-fakra-m-to-fakra-f-short-angled" }, | ||
isoada: { t: "Adapter ISO-Stecker auf FAKRA, gewinkelt (15 cm)", t_en: "Adapter ISO plug to FAKRA, angled (15 cm)", | |||
halter: { t: "Halter zur Radio-Montage im BMW E39", d: "Empfohlen bei Radios, die nicht von AVIN stammen.", | d: "Nötig bei ISO-Antennenstecker (BM24, Rundpin).", d_en: "Required with an ISO antenna connector (BM24, round pin).", img: [P.isofakra], | ||
u: " | u: SHOP + "shop/zubehoer/adapterkabel/193/adapter-kabel-iso-f-auf-fakra-f-kurz-gewinkelt-15cm", | ||
ibus: { t: "I-BUS App", d: " | ue: SHOP_EN + "i-bus-app/accessories/cable-adapters/193/adapter-cable-iso-f-to-fakra-f-short-angled-15cm" }, | ||
bcdsp: { t: "I-BUS App - BC+DSP Lizenz", t_en: "I-BUS App - OBC+DSP License", | |||
deepobd: { t: " | d: "Ohne DSP-Lizenz arbeitet das Werks-DSP nicht.", d_en: "Without the DSP license the factory DSP will not work.", | ||
can: { t: "CAN Interface | u: SHOP + "i-bus-app/lizenzen/171/i-bus-app-bc-dsp-lizenz", ue: SHOP_EN + "i-bus-app/licenses/172/i-bus-app-obc-dsp-license", | ||
w: WIKI + "Habe_ich_DSP%3F", wt: "Wiki: Habe ich DSP?", wt_en: "Wiki: Do I have DSP?" }, | |||
dab1: { t: "DAB+ Single | halter: { t: "Alu-Halter zur Radio-Montage im BMW E39", t_en: "Alu holder for radio installation in BMW E39", | ||
dab2: { t: "DAB+ Dual | d: "Empfohlen bei Radios, die nicht von AVIN stammen.", d_en: "Recommended for radios not made by AVIN.", img: [P.halter], | ||
rcam: { t: "Rückfahrkamera", d: "", u: "" }, | u: SHOP + "i-bus-app/zubehoer/radiohalter/185/alu-halter-zur-radio-montage-im-bmw-e39", | ||
fcam: { t: "Front-Kamera", d: "", u: "" }, | ue: SHOP_EN + "i-bus-app/accessories/fittings-for-radio/185/fittings-for-radio-in-bmw-e39" }, | ||
tool: { t: "Einbau-Werkzeug (Kunststoffheber)", d: "Zum schonenden Lösen der Verkleidungen.", u: "" } | 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.", | |||
d_en: "The I-BUS App is an Android application that displays your on-board computer on an Android device and integrates many comfort and coding functions in your vehicle. The app download is free and a connection to the interface/module can be established. To use all functions of the app, an I-BUS App license is required.", | |||
u: SHOP + "cat/index/sCategory/42", ue: SHOP_EN + "cat/index/sCategory/45", | |||
links: [ | |||
{ 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?", t_en: "Wiki: What do I need for the I-BUS App?", ue: WIKI + "What_do_I_need_to_use_the_I-BUS_app%3F" }, | |||
{ u: WIKI + "Funktionen", t: "Liste aller I-BUS App Funktionen (BMW E38|E39|E46|E53|E83)", t_en: "List of all I-BUS App functions (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)", t_en: "What does not work on BMW E46, E83, E85,..? (not fitted at the factory)" }, | |||
{ u: WIKI + "Funktionseinschr%C3%A4nkungen_nach_Baujahr/Ausstattung/Modell", t: "Funktionseinschränkungen nach Baujahr/Ausstattung/Modell", t_en: "Function restrictions by year / equipment / model" } ] }, | |||
resler: { t: "Resler USB I-BUS Modul inkl. Anschlusskabel", t_en: "Resler USB I-BUS module incl. cable", | |||
d: "Verbindet I-BUS App und Fahrzeug.", d_en: "Connects the I-BUS App and the vehicle.", img: [P.resler], | |||
u: SHOP + "i-bus-app/zubehoer/interfaces-module/191/resler-usb-i-bus-modul-inkl.-anschlusskabel", | |||
ue: SHOP_EN + "i-bus-app/accessories/interfaces-modules/191/resler-usb-i-bus-module-incl.-cable", | |||
w: "https://wiki.ibus-app.de/index.php?title=Hauptseite#Einbauanleitung_f.C3.BCr_Resler_Modul_und_Resler_Interface", wt: "Einbauanleitung Resler Modul", wt_en: "Installation guide Resler module" }, | |||
bclic: { t: "I-BUS App - BC Lizenz", t_en: "I-BUS App - OBC License", d: "Schaltet u. a. die BC-Daten der App frei.", d_en: "Unlocks e.g. the OBC data of the app.", skipIf: "bcdsp", | |||
u: SHOP + "i-bus-app/lizenzen/167/i-bus-app-bc-lizenz", ue: SHOP_EN + "i-bus-app/licenses/173/i-bus-app-obc-license", sku_en: "App04" }, | |||
deepobd: { t: "Deep OBD OBD-II Bluetooth-Adapter", t_en: "Deep OBD OBD-II Bluetooth adapter", | |||
d: "Live-Werte auslesen, Fehler lesen und löschen.", d_en: "Read live values, read and clear fault codes.", img: [P.deepobd], | |||
u: SHOP + "i-bus-app/zubehoer/interfaces-module/258/deep-obd-obd-ii-bluetooth-adapter?c=54", | |||
ue: SHOP_EN + "i-bus-app/accessories/interfaces-modules/258/deep-obd-obd-ii-bluetooth-adapter", | |||
w: "https://xtrons.ibus-app.de/index.php?title=DeepOBD_-_Adapter_und_App_einrichten", wt: "Wiki: DeepOBD einrichten", wt_en: "Wiki: Setting up DeepOBD" }, | |||
can: { t: "CAN-Bus Interface inkl. Anschlusskabel", t_en: "CAN bus interface incl. connection cable", | |||
d: "Addon, funktioniert nur zusammen mit der I-BUS App bzw. der K-CAN App.", d_en: "Add-on, only works together with the I-BUS App or the K-CAN App.", img: [P.can], | |||
u: SHOP + "i-bus-app/zubehoer/interfaces-module/346/can-bus-interface-inkl.-anschlusskabel", | |||
ue: SHOP_EN + "i-bus-app/accessories/interfaces-modules/346/can-bus-interface-incl.-connection-cable", | |||
w: WIKI + "Einbauanleitung_CAN-Bus_Interface", wt: "Einbauanleitung CAN-Bus Interface", wt_en: "Installation guide CAN bus interface" }, | |||
kcan: { t: "K-CAN App (Beta)", d: "Pendant zur I-BUS App für Fahrzeuge mit K-CAN, aktuell als Betaversion.", | |||
d_en: "Counterpart to the I-BUS App for vehicles with K-CAN, currently in beta.", | |||
w: "https://wiki.kcan-app.de/", wt: "Wiki zur K-CAN App", wt_en: "K-CAN App wiki" }, | |||
kcanlic: { t: "K-CAN App - Lizenz Betaversion", t_en: "K-CAN App - License Beta Version", d: "Beta-Lizenz für die K-CAN App.", d_en: "Beta license for the K-CAN App.", | |||
u: SHOP + "i-bus-app/lizenzen/358/k-can-app-lizenz-betaversion", ue: SHOP_EN + "i-bus-app/licenses/358/k-can-app-license-beta-version" }, | |||
tpms: { t: "TPMS - Reifendruckkontrolle", t_en: "TPMS - tire pressure monitoring", d: "", u: SHOP + "radiozubehoer/tpms/", ue: SHOP_EN + "accessories-for-head-units/tpms/" }, | |||
dab1: { t: "DAB+ Empfänger inkl. Antenne (Single)", t_en: "DAB+ receiver incl. antenna (single)", d: "", | |||
w: "https://xtrons.ibus-app.de/index.php?title=Installation_der_DAB%2B_Antenne", wt: "Installation der DAB+ Antenne", wt_en: "Installing the DAB+ antenna", | |||
u: SHOP + "radiozubehoer/dab/291/dab-empfaenger-inkl.-antenne-usbdab04", ue: SHOP_EN + "accessories-for-head-units/dab/", ut_en: "DAB+ receivers in the shop →" }, | |||
dab2: { t: "Dual DAB+ Empfänger-Stick inkl. 2 Antennen", t_en: "Dual DAB+ receiver stick incl. 2 antennas", d: "", | |||
w: "https://xtrons.ibus-app.de/index.php?title=Installation_der_DAB%2B_Antenne", wt: "Installation der DAB+ Antenne", wt_en: "Installing the DAB+ antenna", | |||
u: SHOP + "radiozubehoer/dab/391/dual-dab-empfaenger-stick-inkl.-2-antennen-acusbdab05t?c=75", ue: SHOP_EN + "accessories-for-head-units/dab/", ut_en: "DAB+ receivers in the shop →" }, | |||
rcam: { t: "Rückfahrkamera", t_en: "Rear-view camera", d: "", u: SHOP + "radiozubehoer/kameras/", ue: SHOP_EN + "accessories-for-head-units/cameras/", | |||
ut: "Kameras im Shop ansehen →", ut_en: "View cameras in the shop →" }, | |||
fcam: { t: "Front-Kamera", t_en: "Front camera", d: "", u: SHOP + "radiozubehoer/kameras/", ue: SHOP_EN + "accessories-for-head-units/cameras/", | |||
ut: "Kameras im Shop ansehen →", ut_en: "View cameras in the shop →" }, | |||
tool: { t: "Einbau-Werkzeug (Kunststoffheber)", t_en: "Installation tool (plastic pry tool)", d: "Zum schonenden Lösen der Verkleidungen.", d_en: "For gently removing trim panels.", | |||
u: SHOP + "radiozubehoer/einbauwerkzeug/", ue: SHOP_EN + "accessories-for-head-units/installation-tools/" } | |||
}; | }; | ||
/* ---- 5) Regeln -------------------------------------------------------------- | |||
/* ---- | type: need (Das brauchst Du) oder hint (Hinweise) when = Bedingung auf die Felder | ||
type | opts = diese Zusatzoptionen müssen gewählt sein items = Artikel html / html_en = Text (DE / EN) | ||
Abgeleitete Werte: gen (alt/b/c) und module (ja/nein/unk = Radiomodul im Kofferraum, nur gen alt) */ | |||
opts | |||
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).[br][img=" + P.noquad + "][img=" + P.noexl6 + "]", | ||
html_en: "[b]Check the extensions:[/b] If an aftermarket radio is already installed, EXL005 and the FAKRA extension should already be in place. [b]Not suitable[/b] are the standard Quad-Lock extension combined with an antenna extension and the EXL006 (no BUS signal).[br][img=" + P.noquad + "][img=" + P.noexl6 + "]" }, | |||
{ 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.", | ||
html_en: "[b]Cable routing:[/b] The electronics are in the trunk. At least the radio connection and the FM antenna have to be routed to the front. Optionally also: GPS (OEM antenna), extension for DAB+, connection for the OEM CD changer, RCA for a 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.", | ||
html_en: "[b]Cable routing:[/b] All connections are directly behind the radio, [b]no[/b] cables need to be routed. Optionally if needed for: GPS (OEM antenna), DAB+, OEM CD changer, RCA for a 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. Bei E46 mit Pfeilnavi gibt es zwei Varianten: Radiomodul im Kofferraum = EXL005 und FAKRA-Verlängerung nötig. Radiomodul im Pfeilnavi (Quadlock hinten neben dem Antennenstecker) = keine Verlängerung nötig.", | ||
html_en: "[b]Please check:[/b] Look whether a radio module is located in the trunk. E46 with arrow navi come in two variants: radio module in the trunk = EXL005 and FAKRA extension required. Radio module inside the arrow navi (Quadlock at the back next to the antenna connector) = no extension required." }, | |||
{ 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.", | ||
html_en: "[b]Antenna connector:[/b] [b]BM24[/b] (round pin) = ISO antenna connector, you may need the [a=" + SHOP_EN + "i-bus-app/accessories/cable-adapters/193/adapter-cable-iso-f-to-fakra-f-short-angled-15cm]ISO to FAKRA adapter[/a]. [b]BM54[/b] = FAKRA, no adapter required." }, | |||
{ 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. Ob Dein Fahrzeug ein DSP hat: [a=" + WIKI + "Habe_ich_DSP%3F]Habe ich DSP?[/a]", | ||
{ type: "hint", when: { sound: ["hk"] }, | html_en: "[b]DSP:[/b] For the factory DSP to work at all, the I-BUS App with OBC+DSP license is required. To find out whether your vehicle has a DSP: [a=" + WIKI + "Habe_ich_DSP%3F]Do I have DSP?[/a]" }, | ||
html: " | { 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.", | |||
{ type: "hint", when: { vehicle: [" | html_en: "[b]Harman Kardon:[/b] Does [b]not[/b] need a DSP license. The remote signal (+12 V when the radio is on) is enough to start it." }, | ||
html: " | { type: "hint", when: { aux: ["nein"] }, | ||
{ type: "hint", when: { vehicle: [" | html: "[b]AUX-IN:[/b] Der AUX-IN muss codiert werden. Optional kann ein FM-Transmitter genutzt werden - das ist nicht empfohlen.", | ||
html: " | html_en: "[b]AUX-IN:[/b] The AUX-IN has to be coded. Optionally an FM transmitter can be used - this is not recommended." }, | ||
{ 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.", | ||
"Einzelschalter (eher VFL): | html_en: "[b]Installation:[/b] Radios for BMW E38/E53 do not need extra brackets." }, | ||
"Schaltzentrum (eher FL): | { type: "hint", when: { vehicle: ["5er-e39"] }, | ||
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].", | |||
html_en: "[b]Installation:[/b] For radios not made by AVIN we recommend a holder (see additional options) or modifying the supplied mounting brackets. Instructions: [a=https://xtrons.ibus-app.de/index.php?title=Montageanleitungen]Installation guides[/a]." }, | |||
{ type: "hint", when: { vehicle: ["3er-e46"], factory: ["iris", "mid", "pfeil"], current: ["werk"] }, | |||
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][br][img=" + P.funktr + "]", | |||
html_en: "[b]E46 installation without the large navi:[/b] The climate control unit has to be moved down. For this you need the matching [b]function carrier[/b] (about 100 EUR new, possibly cheaper from a parts recycler):[br]" + | |||
"Single switches (rather pre-facelift): [a=https://www.leebmann24.de/trager-3er-51168202186.html]without smoker 51168202186[/a] / [a=https://www.leebmann24.de/trager-3er-51168230902.html]with smoker 51168230902[/a][br]" + | |||
"Switch center (rather facelift): [a=https://www.leebmann24.de/funktionstrager-schaltzentrum-3er-51167001408.html]without smoker 51167001408[/a] / [a=https://www.leebmann24.de/funktionstrager-schaltzentrum-3er-51167001410.html]with smoker 51167001410[/a][br][img=" + P.funktr + "]" }, | |||
{ type: "hint", when: { factory: ["cic", "nbt", "nbtevo"] }, | |||
html: "[b]Lichtleiter:[/b] Ggf. vorhandene Lichtleiter (MOST) müssen aus dem BMW-Stecker in den Xtrons-Adapter umgesteckt werden.", | |||
html_en: "[b]Fiber optic cables:[/b] Any existing fiber optic cables (MOST) have to be moved from the BMW connector to the Xtrons adapter." }, | |||
{ 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_en: "[b]The original radio module stays:[/b] With M-ASK, CCC, CIC, NBT and NBT EVO the original radio module stays in the vehicle and must work! Only the screen is replaced." }, | |||
{ 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].", | |||
html_en: "[b]K-CAN App (Beta):[/b] For the app you need the CAN bus interface and the beta license. Installation instructions: [a=https://wiki.kcan-app.de/index.php?title=Hauptseite#Wo_wird_das_CAN_BUS_Interface_angeschlossen?]Where is the CAN bus interface connected?[/a] More information in the [a=https://wiki.kcan-app.de/]K-CAN App wiki[/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: {} | html_en: "[b]I-BUS App:[/b] See [a=https://wiki.ibus-app.de/index.php?title=What_do_I_need_to_use_the_I-BUS_app%3F]What do I need to use the I-BUS App?[/a] and the [a=https://wiki.ibus-app.de/index.php?title=Hauptseite#Einbauanleitung_f.C3.BCr_Resler_Modul_und_Resler_Interface]installation guide for the Resler module and interface[/a]." }, | ||
html: " | { type: "hint", when: {}, | ||
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].", | |||
html_en: "[b]Important:[/b] Always compare the connections with your own radio. Which radio fits? [a=https://xtrons.ibus-app.de/index.php?title=Entscheidungshilfe%3A_AVIN_oder_XTRONS%3F]Decision guide AVIN or XTRONS[/a] - Costs: [a=https://xtrons.ibus-app.de/index.php?title=Grobe_Kosten%C3%BCbersicht]Rough cost overview[/a]." } | |||
]; | ]; | ||
/* ===================================================================== | /* ===================================================================== | ||
PROGRAMMLOGIK | PROGRAMMLOGIK | ||
===================================================================== */ | ===================================================================== */ | ||
var $ = function (id) { return document.getElementById(id); }; | var $ = function (id) { return document.getElementById(id); }; | ||
var sel = {}, picked = {}; | var sel = {}, picked = {}, summary = "", capA = 0, capB = 0, 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"); | ||
var LANG = DEFAULT_LANG; | |||
var AMP = "\u0026"; | |||
function T(de, en) { return LANG === "en" ? en : de; } | |||
function LT(o, k) { var v = LANG === "en" ? o[k + "_en"] : ""; return v ? v : o[k]; } | |||
function itemUrl(i) { var v = LANG === "en" ? i.ue : ""; return v ? v : i.u; } | |||
function full(u) { return u.indexOf("/thumb/") === -1 ? u : u.replace("/thumb/", "/").replace(/\/[^\/]+$/, ""); } | |||
function fmt(t) { | |||
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"; | |||
}).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; | ||
for (var k in cond) { | for (var k in cond) { | ||
if (!s[k]) { if (lenient) continue; return false; } | if (!s[k]) { if (lenient) continue; return false; } | ||
if (cond[k].indexOf(s[k]) | if (cond[k].indexOf(s[k]) === -1) return false; | ||
} | } | ||
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; | ||
} | } | ||
function forced(s) { | function forced(s) { | ||
var f = {}; | var f = {}; | ||
FORCED.forEach(function (r) { if (match(r.when, s)) r.opts.forEach(function (o) { f[o] = r | FORCED.forEach(function (r) { if (match(r.when, s)) r.opts.forEach(function (o) { f[o] = LT(r, "why"); }); }); | ||
return f; | return f; | ||
} | } | ||
| Zeile 211: | Zeile 415: | ||
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; | ||
var lab = document.createElement("label"); lab.htmlFor = "nvk-" + f.id; lab.textContent = f | var lab = document.createElement("label"); lab.htmlFor = "nvk-" + f.id; lab.id = "nvk-l-" + f.id; lab.textContent = LT(f, "label"); | ||
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.id = "nvk-h-" + f.id; h.innerHTML = fmt(LT(f, "help")); wrap.appendChild(h); } | |||
var inf = document.createElement("div"); inf.id = "nvk-i-" + f.id; wrap.appendChild(inf); | |||
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) | $("nvk-l-" + f.id).textContent = LT(f, "label"); | ||
if (f.help) { $("nvk-h-" + f.id).innerHTML = fmt(LT(f, "help")); } | |||
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 (!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 = T("– bitte wählen –", "– please select –"); el.appendChild(p); } | ||
allowed.forEach(function (v) { | allowed.forEach(function (v) { | ||
var o = document.createElement("option"); o.value = v.v; o.textContent = v | var o = document.createElement("option"); o.value = v.v; o.textContent = LT(v, "t"); el.appendChild(o); | ||
}); | }); | ||
el.value = sel[f.id] || ""; | el.value = sel[f.id] || ""; | ||
var cur = allowed.filter(function (v) { return v.v === sel[f.id]; })[0]; | |||
var pre = f.pre ? (match(f.pre.when, s, false) ? fmt(LT(f.pre, "html")) : "") : ""; | |||
$("nvk-i-" + f.id).innerHTML = pre + (cur ? (cur.info ? fmt(LT(cur, "info")) : "") : ""); | |||
}); | }); | ||
} | } | ||
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 255: | Zeile 463: | ||
cb.addEventListener("change", function () { | cb.addEventListener("change", function () { | ||
picked[o.id] = cb.checked; | picked[o.id] = cb.checked; | ||
if (cb.checked | if (cb.checked) { if (o.excl) OPTS.forEach(function (x) { if (x.excl === o.excl) { if (x.id !== o.id) picked[x.id] = false; } }); } | ||
update(); | update(); | ||
}); | }); | ||
lab.appendChild(cb); | lab.appendChild(cb); | ||
lab.appendChild(document.createTextNode(" " + LT(o, "t"))); | |||
lab.appendChild(document.createTextNode( | var sub = [LT(o, "sub"), isForced ? st.forced[o.id] : ""].filter(Boolean).join(" - "); | ||
var sub = [o | |||
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) { | ||
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 | var b = document.createElement("b"); b.textContent = LT(item, "t"); d.appendChild(b); | ||
var dd = LT(item, "d"); | |||
if (item. | if (dd) { var p = document.createElement("span"); p.textContent = dd; d.appendChild(p); } | ||
var | if (item.img) { | ||
var im = document.createElement("div"); | |||
item.img.forEach(function (u) { | |||
var a = document.createElement("a"); a.href = full(u); a.target = "_blank"; a.rel = "noopener"; | |||
var g = document.createElement("img"); g.className = "nvk-img"; g.src = u; g.alt = LT(item, "t"); a.appendChild(g); im.appendChild(a); | |||
}); | |||
d.appendChild(im); | |||
} | |||
var iu = itemUrl(item); | |||
if (iu || item.w) { | |||
var l = document.createElement("div"); l.className = "nvk-links"; | |||
if (iu) l.appendChild(link(iu, LT(item, "ut") || T("Im Shop ansehen →", "View in shop →"))); | |||
if (item.w) l.appendChild(link(item.w, (LT(item, "wt") || T("Zum Wiki", "Open wiki")) + " →")); | |||
d.appendChild(l); | |||
} | } | ||
if (item.links) item.links.forEach(function (x) { | |||
var r = document.createElement("div"); r.className = "nvk-links"; r.appendChild(link(LANG === "en" ? (x.ue || x.u) : x.u, LT(x, "t") + " →")); d.appendChild(r); | |||
}); | |||
return d; | return d; | ||
} | } | ||
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 ck = veh.v + "-" + LANG; | |||
var data = radioCache[ck]; | |||
if (data === undefined) { | |||
radioCache[ck] = "loading"; | |||
fetch(API + "?cat=" + encodeURIComponent(veh.v) + AMP + "lang=" + LANG).then(function (r) { return r.json(); }).then(function (j) { | |||
radioCache[ck] = (j.items || []).map(function (it) { it.cat = veh.v; return it; }); | |||
renderResult(); | |||
}).catch(function () { radioCache[ck] = []; renderResult(); }); | |||
} | |||
if (data === undefined || data === "loading") { | |||
var m = document.createElement("p"); m.className = "nvk-miss"; m.textContent = T("Verfügbare Radios werden geladen …", "Loading available radios …"); 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 = T("Verfügbare Radios für Deinen BMW ", "Available radios for your BMW ") + vname(veh) + " (" + 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) ? T(" (passt zu Deiner Auswahl)", " (matches your selection)") : ""))); | |||
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(itemUrl(i) || ""); if (id) items.push({ t: LT(i, "t"), aid: id, sku: LANG === "en" ? i.sku_en : i.sku }); }); | |||
heading(T("In den Warenkorb", "Add to cart")); | |||
var box = document.createElement("div"); box.className = "nvk-card opt"; | |||
var p = document.createElement("div"); | |||
p.textContent = T("Das oben gewählte Radio (falls ausgewählt) und diese Artikel werden direkt im Shop in den Warenkorb gelegt:", "The radio selected above (if any) and these items will be added to your cart in the shop:"); | |||
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 = T("Kameras, TPMS, Werkzeug und Artikel ohne Direktlink wählst Du bitte über die Links oben im Shop aus.", "Cameras, TPMS, tools and items without a direct link: please pick them in the shop using the links above."); | |||
box.appendChild(n); | |||
if (CART_CLEAR) { | |||
var cn = document.createElement("div"); cn.className = "nvk-help"; | |||
cn.textContent = T("Hinweis: Ein bereits vorhandener Warenkorb im Shop wird dabei ersetzt.", "Note: An existing cart in the shop will be replaced."); | |||
box.appendChild(cn); | |||
} | |||
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 ? T("Fahrgestellnummer (17 Zeichen) für die Lizenz", "Full VIN (17 characters) for the license") : T("VIN für die Lizenz (7 Zeichen, z. B. AB12345)", "VIN for the license (7 characters, e.g. 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 = T("Kommentartext für die Kasse kopieren", "Copy comment text for checkout"); | |||
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 ? T("Bitte die vollständige 17-stellige Fahrgestellnummer eingeben.", "Please enter the full 17-character VIN.") : T("Bitte die VIN im Format AB12345 (oder die 17-stellige FGN) eingeben.", "Please enter the VIN as AB12345 (or the full 17-character VIN)."); return; } | |||
var L = []; | |||
if (has("bclic")) L.push(T("I-BUS App BC Lizenz: VIN ", "I-BUS App OBC License: VIN ") + v7); | |||
if (has("bcdsp")) L.push(T("I-BUS App BC+DSP Lizenz: VIN ", "I-BUS App OBC+DSP License: VIN ") + v7); | |||
if (l17) L.push(T("K-CAN App Beta Lizenz: FGN ", "K-CAN App Beta License: VIN ") + v17); | |||
ta.value = L.join("\n"); ta.style.display = ""; ta.select(); | |||
var hint = T("Bitte an der Shop-Kasse in das Feld Kommentar einfügen.", "Please paste it into the Comment field at the shop checkout."); | |||
var manual = T("Bitte den Text markieren und kopieren. ", "Please select and copy the text. "); | |||
if (navigator.clipboard) navigator.clipboard.writeText(ta.value).then(function () { ls.textContent = T("Text kopiert. ", "Text copied. ") + hint; }).catch(function () { ls.textContent = manual + hint; }); | |||
else ls.textContent = manual + 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 = T("Auswahl in den Warenkorb legen", "Add selection to cart"); | |||
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 = T("Es ist noch nichts zum Bestellen ausgewählt.", "Nothing has been selected to order yet."); return; } | |||
var w = window.open("", "_blank"); | |||
st.textContent = T("Artikelnummern werden ermittelt …", "Looking up item numbers …"); | |||
var ids = list.filter(function (x) { return x.aid; }).map(function (x) { return x.aid; }); | |||
var get = ids.length ? fetch(API + "?aid=" + ids.join(",") + AMP + "lang=" + LANG).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 = (LANG === "en" ? TRANSFER_URL_EN : TRANSFER_URL) + encodeURIComponent(skus.join(",")) + (CART_CLEAR ? AMP + "clear=1" : ""); | |||
if (w) { | |||
w.location.href = url; | |||
st.textContent = T("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.", "The shop was opened in a new tab (" + skus.length + " of " + list.length + " items transferred). Please check the cart there. If an item cannot be ordered, the shop will tell you."); | |||
} else { | |||
st.textContent = T("Der neue Tab wurde blockiert. Bitte Pop-ups erlauben oder diesen Link nutzen: ", "The new tab was blocked. Please allow pop-ups or use this link: "); | |||
st.appendChild(link(url, T("Warenkorb im Shop öffnen →", "Open cart in the shop →"))); | |||
} | |||
}).catch(function () { if (w) w.close(); st.textContent = T("Das hat leider nicht geklappt. Bitte nutze die Shop-Links oben.", "Sorry, that did not work. Please use the shop links above."); }); | |||
} | |||
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 = T("Bitte noch auswählen: ", "Please still select: ") + missing.map(function (f) { return LT(f, "label"); }).join(", "); | ||
outEl.appendChild(m); return; | outEl.appendChild(m); $("nvk-form").style.display = "none"; return; | ||
} | } | ||
$("nvk-form").style.display = ""; | |||
var veh = vehicleOf(sel.vehicle); | |||
var rbase = LANG === "en" ? SHOP_EN + "bmw-head-units/" : SHOP + "bmw-radios/"; | |||
var ru = veh.noCat ? rbase : rbase + (LANG === "en" ? enSlug(veh.v) : veh.v) + "/"; | |||
heading(T("Passende Radios", "Matching radios")); | |||
outEl.appendChild(card({ t: T("BMW Radios für " + veh.t, "BMW radios for " + vname(veh)), d: T("Alle Radios, die für Deinen BMW " + veh.t + " im Shop erhältlich sind.", "All radios available in the shop for your BMW " + vname(veh) + "."), | |||
u: ru, ut: T("Zu den passenden Radios →", "To the matching radios →"), w: rbase, wt: T("Alle BMW Radios", "All BMW radios") }, "rad")); | |||
renderRadioList(veh); | |||
var needs = [], hints = [], seen = {}; | var needs = [], hints = [], seen = {}; | ||
RULES.forEach(function (r) { | RULES.forEach(function (r) { | ||
if (!match(r.when, s)) return; | if (!match(r.when, s)) return; | ||
if (r.opts | if (r.opts) { if (!r.opts.every(function (o) { return st.on[o]; })) return; } | ||
if (r.type === "need") (r.items || []).forEach(function (id) { if (!seen[id]) { seen[id] = 1; needs.push(ITEMS[id]); } }); | if (r.type === "need") (r.items || []).forEach(function (id) { if (!seen[id]) { seen[id] = 1; needs.push(ITEMS[id]); } }); | ||
else hints.push(r | else hints.push(LT(r, "html")); | ||
}); | }); | ||
heading(T("Das brauchst Du", "What you need")); | |||
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 = T("Für die Grundinstallation sind keine zusätzlichen Verlängerungen oder Adapter nötig.", "No additional extensions or adapters are needed for the basic installation."); 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(T("Deine Zusatzoptionen", "Your additional options")); opt.forEach(function (i) { outEl.appendChild(card(i, "opt")); }); } | |||
if (hints.length) { | if (hints.length) { | ||
heading(T("Hinweise", "Notes")); | |||
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 L = [T("KONFIGURATION", "CONFIGURATION"), "Language: " + LANG]; | |||
FIELDS.forEach(function (f) { | |||
if (!sel[f.id]) return; | |||
var v = f.values.filter(function (x) { return x.v === sel[f.id]; })[0]; | |||
if (v) L.push("- " + LT(f, "label") + ": " + LT(v, "t")); | |||
}); | |||
L.push("", T("BENÖTIGT", "REQUIRED")); | |||
needs.forEach(function (i) { L.push("- " + LT(i, "t") + (itemUrl(i) ? " " + itemUrl(i) : "")); }); | |||
if (opt.length) { L.push("", T("ZUSATZOPTIONEN", "ADDITIONAL OPTIONS")); opt.forEach(function (i) { L.push("- " + LT(i, "t") + (itemUrl(i) ? " " + itemUrl(i) : "")); }); } | |||
L.push("", "Radios: " + ru); | |||
summary = L.join("\n"); | |||
cartBlock(needs, opt); | |||
} | } | ||
function update() { renderFields(); renderOpts(); renderResult(); } | function update() { renderFields(); renderOpts(); renderResult(); } | ||
$("nvk-reset").addEventListener("click", function () { sel = {}; picked = {}; update(); }); | function capText() { $("nvk-capq").textContent = T("Sicherheitsfrage: Was ist ", "Security question: What is ") + capA + " + " + capB + "? *"; } | ||
function newCaptcha() { | |||
capA = 1 + Math.floor(Math.random() * 9); capB = 1 + Math.floor(Math.random() * 9); | |||
capText(); $("nvk-cap").value = ""; | |||
} | |||
function status(msg, ok) { var e = $("nvk-status"); e.style.display = ""; e.textContent = msg; e.style.borderLeftColor = ok ? "#14866d" : "#d33"; } | |||
$("nvk-send").addEventListener("click", function () { | |||
var name = $("nvk-name").value.trim(), mail = $("nvk-mail").value.trim(), vin = $("nvk-vin").value.trim().toUpperCase(), msg = $("nvk-msg").value.trim(); | |||
if (!name || !mail || !msg) return status(T("Bitte Name, E-Mail und Kommentar ausfüllen.", "Please fill in name, email and comment."), false); | |||
if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(mail)) return status(T("Bitte eine gültige E-Mail-Adresse eingeben.", "Please enter a valid email address."), false); | |||
if (vin) { if (!/^[A-Z]{2}[0-9]{5}$/.test(vin)) { if (!/^[A-HJ-NPR-Z0-9]{17}$/.test(vin)) return status(T("Bitte die VIN im Format AB12345 oder die 17-stellige FGN eingeben - oder das Feld leer lassen.", "Please enter the VIN as AB12345 or the full 17-character VIN - or leave the field empty."), false); } } | |||
if (parseInt($("nvk-cap").value, 10) !== capA + capB) return status(T("Die Sicherheitsfrage wurde nicht richtig beantwortet.", "The security question was not answered correctly."), false); | |||
if (!$("nvk-dsgvo").checked) return status(T("Bitte der Verarbeitung Deiner Daten zustimmen.", "Please agree to the processing of your data."), false); | |||
if ($("nvk-hp").value) return; | |||
var sz = $("nvk-size").value; | |||
var rad = chosenRadio ? "\n\n" + T("GEWÄHLTES RADIO", "SELECTED RADIO") + "\n- " + chosenRadio.type + " " + chosenRadio.url : ""; | |||
var sum2 = summary + rad + (sz ? "\n\n" + T("Gewünschte Displaygröße: ", "Desired display size: ") + sz : ""); | |||
var text = "Name: " + name + "\n" + T("E-Mail: ", "Email: ") + mail + "\nVIN: " + (vin || "-") + "\n\n" + T("Kommentar:", "Comment:") + "\n" + msg + "\n\n" + sum2; | |||
if (SEND_URL) { | |||
var p = new URLSearchParams(); | |||
p.append("name", name); p.append("mail", mail); p.append("vin", vin); p.append("msg", msg); p.append("summary", sum2); | |||
p.append("hp", $("nvk-hp").value); p.append("ca", capA); p.append("cb", capB); p.append("cv", $("nvk-cap").value); p.append("lang", LANG); | |||
fetch(SEND_URL, { method: "POST", body: p }).then(function (r) { | |||
if (!r.ok) throw new Error("send"); | |||
status(T("Danke! Deine Anfrage wurde gesendet, eine Kopie geht an " + mail + ".", "Thank you! Your request has been sent, a copy goes to " + mail + "."), true); newCaptcha(); | |||
}).catch(function () { status(T("Das Senden hat nicht geklappt. Bitte versuche es später noch einmal oder schreibe direkt an " + MAIL_TO + ".", "Sending failed. Please try again later or write directly to " + MAIL_TO + "."), false); }); | |||
} else { | |||
window.location.href = "mailto:" + MAIL_TO + "?cc=" + encodeURIComponent(mail) + AMP + "subject=" + encodeURIComponent(T(MAIL_SUBJECT, MAIL_SUBJECT_EN)) + AMP + "body=" + encodeURIComponent(text); | |||
status(T("Dein E-Mail-Programm wurde mit der fertigen Anfrage geöffnet. Bitte dort noch auf Senden klicken.", "Your email program was opened with the finished request. Please click Send there."), true); | |||
} | |||
}); | |||
$("nvk-reset").addEventListener("click", function () { sel = {}; picked = {}; chosenRadio = null; update(); }); | |||
function renderLegal() { | |||
var le = $("nvk-legal-links"), dl = $("nvk-dslink"), first = true; | |||
le.innerHTML = ""; dl.innerHTML = ""; | |||
[ ["agb", T("AGB", "Terms and conditions")], ["widerruf", T("Widerrufsbelehrung", "Right of withdrawal")], ["datenschutz", T("Datenschutzerklärung", "Privacy policy")] ].forEach(function (x) { | |||
var key = x[0], url = LANG === "en" ? (LEGAL_EN[key] || LEGAL[key]) : LEGAL[key]; | |||
if (!url) return; | |||
if (!first) le.appendChild(document.createTextNode(" | ")); | |||
first = false; le.appendChild(link(url, x[1])); | |||
if (key === "datenschutz") { | |||
dl.appendChild(document.createTextNode(" (")); dl.appendChild(link(url, x[1])); dl.appendChild(document.createTextNode(")")); | |||
} | |||
}); | |||
} | |||
function applyStatic() { | |||
Array.prototype.forEach.call(document.querySelectorAll("#nvk [data-en]"), function (e) { | |||
if (e.getAttribute("data-de") === null) e.setAttribute("data-de", e.textContent); | |||
e.textContent = LANG === "en" ? e.getAttribute("data-en") : e.getAttribute("data-de"); | |||
}); | |||
Array.prototype.forEach.call(document.querySelectorAll("#nvk [data-en-ph]"), function (e) { | |||
if (e.getAttribute("data-de-ph") === null) e.setAttribute("data-de-ph", e.placeholder); | |||
e.placeholder = LANG === "en" ? e.getAttribute("data-en-ph") : e.getAttribute("data-de-ph"); | |||
}); | |||
} | |||
function markLang() { | |||
["de", "en"].forEach(function (l) { | |||
var b = $("nvk-lang-" + l); | |||
b.style.fontWeight = LANG === l ? "700" : "400"; | |||
b.style.borderColor = LANG === l ? "#f26522" : "#a2a9b1"; | |||
}); | |||
} | |||
function setLang(l) { | |||
LANG = l; | |||
try { localStorage.setItem("nvk-lang", l); } catch (e) { } | |||
markLang(); applyStatic(); renderLegal(); capText(); update(); | |||
} | |||
["de", "en"].forEach(function (l) { | |||
var b = document.createElement("button"); b.type = "button"; b.className = "nvk-btn"; b.id = "nvk-lang-" + l; | |||
b.textContent = l.toUpperCase(); b.style.marginLeft = "6px"; b.style.padding = "3px 12px"; | |||
b.addEventListener("click", function () { setLang(l); }); | |||
$("nvk-lang").appendChild(b); | |||
}); | |||
(function () { | |||
var m = location.search.match(/[?\x26](?:uselang|lang)=(\w+)/), l = m ? m[1].toLowerCase() : ""; | |||
if (!l) { try { l = localStorage.getItem("nvk-lang") || ""; } catch (e) { l = ""; } } | |||
if (l === "en" || l === "de") LANG = l; | |||
})(); | |||
markLang(); applyStatic(); renderLegal(); | |||
newCaptcha(); | |||
update(); | update(); | ||
})(); | })(); | ||
</script> | </script> | ||
</div> | </div> | ||
</html> | </html> | ||
<small>Stand: 23.10.2026</small><br> | |||
Aktuelle Version vom 23. Oktober 2026, 14:01 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.
Hinweis: 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.
Stand: 23.10.2026