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 38: | Zeile 38: | ||
#nvk #nvk-form{margin-top:22px} | #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> | ||
<fieldset id="nvk-form" style="display:none"><legend>Anfrage senden</legend> | <fieldset id="nvk-form" style="display:none"><legend data-en="Send request">Anfrage senden</legend> | ||
<p class="nvk-help">Deine Auswahl und die Liste oben werden automatisch mitgesendet. Alle Felder mit * sind Pflicht.</p> | <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-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-name">Name *</label><input id="nvk-name" type="text" autocomplete="name"></div> | ||
<div class="nvk-f"><label for="nvk-mail">E-Mail *</label><input id="nvk-mail" type="email" autocomplete="email"></div> | <div class="nvk-f"><label for="nvk-mail" data-en="Email *">E-Mail *</label><input id="nvk-mail" type="email" autocomplete="email"></div> | ||
<div class="nvk-f"><label for="nvk-size">Gewünschte Displaygröße (optional)</label><select id="nvk-size"><option value="">Keine Angabe / Beratung gewünscht</option><option>7"</option><option>8.8"</option><option>9"</option><option>10.25"</option><option>12.3"</option><option>14.9"</option><option>Andere Größe (bitte im Kommentar nennen)</option></select><div class="nvk-help">Diagonale in Zoll. Nicht jede Größe gibt es für jede Baureihe, das prüfen wir für Dich.</div></div> | <div class="nvk-f"><label for="nvk-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">VIN oder FGN (optional)</label><input id="nvk-vin" type="text" maxlength="17" placeholder="AB12345 oder 17-stellige FGN"></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> | ||
<div class="nvk-f"><label for="nvk-msg">Kommentar *</label><textarea id="nvk-msg" rows="4"></textarea></div> | <div class="nvk-f"><label for="nvk-msg" 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> | <div class="nvk-f" style="max-width:300px"><label for="nvk-cap" id="nvk-capq">Sicherheitsfrage *</label><input id="nvk-cap" type="text" inputmode="numeric"></div> | ||
<input id="nvk-hp" type="text" tabindex="-1" autocomplete="off" aria-hidden="true" style="position:absolute;left:-9999px;width:1px"> | <input id="nvk-hp" type="text" tabindex="-1" autocomplete="off" aria-hidden="true" style="position:absolute;left:-9999px;width:1px"> | ||
<label class="nvk-o"><input type="checkbox" id="nvk-dsgvo"> Ich stimme zu, dass meine Angaben zur Bearbeitung der Anfrage per E-Mail verarbeitet werden.<span id="nvk-dslink"></span> *</label> | <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">Anfrage senden</button> | <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> | <div id="nvk-status" class="nvk-note" style="display:none"></div> | ||
</fieldset> | </fieldset> | ||
<div id="nvk-legal" class="nvk-help" style="margin-top:20px"><b>Hinweis:</b> Der Konfigurator gibt eine unverbindliche Orientierung zu passenden Artikeln. Ausstattung und Anschlüsse können je nach Baujahr, Modell und Umbauten abweichen. Bitte gleiche Deine Auswahl vor der Bestellung mit Deinem Fahrzeug ab. Im Zweifel nutze die Anfrage-Funktion, wir prüfen die Zusammenstellung gern für Dich.<div id="nvk-legal-links" style="margin-top:4px"></div></div> | <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.</noscript> | <noscript>Für den Konfigurator wird JavaScript benötigt. / JavaScript is required for the configurator.</noscript> | ||
<script> | <script> | ||
(function () { | (function () { | ||
| Zeile 107: | Zeile 108: | ||
Älterer Weg über das Theme-Skript: var TRANSFER_URL = CART + "?nvk="; */ | Älterer Weg über das Theme-Skript: var TRANSFER_URL = CART + "?nvk="; */ | ||
var TRANSFER_URL = "https://shop.ibus-app.de/nvk?add="; | 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"; | var CART = "https://shop.ibus-app.de/checkout/cart"; | ||
/* Rechtliche Seiten (Links unter dem Konfigurator und beim Datenschutz-Haken). Leer = Link wird nicht angezeigt. */ | /* Rechtliche Seiten (Links unter dem Konfigurator und beim Datenschutz-Haken). Leer = Link wird nicht angezeigt. */ | ||
| Zeile 117: | Zeile 126: | ||
var BODY = { limo: "Limousine", touring: "Touring", coupe: "Coupé", cabrio: "Cabrio", schraeg: "Schrägheck", | 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" }; | 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 = [ | var VEHICLES = [ | ||
{ v: "1er-e8x", t: "1er E8x", gen: "b", body: "schraeg,coupe,cabrio" }, | { v: "1er-e8x", t: "1er E8x", gen: "b", body: "schraeg,coupe,cabrio" }, | ||
| Zeile 146: | Zeile 159: | ||
var KCAN = ["1er-e8x", "3er-e9x", "5er-e6x", "6er-e6x", "7er-e65", "x1-e84", "x5-e70", "x6-e71", "z4-e89"]; | var KCAN = ["1er-e8x", "3er-e9x", "5er-e6x", "6er-e6x", "7er-e65", "x1-e84", "x5-e70", "x6-e71", "z4-e89"]; | ||
var bodyValues = Object.keys(BODY).map(function (k) { | var bodyValues = Object.keys(BODY).map(function (k) { | ||
return { v: k, t: BODY[k], only: { vehicle: VEHICLES.filter(function (x) { return x.body.split(",").indexOf(k) !== -1; }).map(function (x) { return x.v; }) } }; | return { v: k, t: BODY[k], 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 ------------------------------------------------------ | /* ---- 2) Auswahlfelder ------------------------------------------------------ | ||
| Zeile 152: | Zeile 165: | ||
optional = muss nicht gewählt werden auto = bei nur einem Wert vorwählen */ | optional = muss nicht gewählt werden auto = bei nur einem Wert vorwählen */ | ||
var FIELDS = [ | var FIELDS = [ | ||
{ id: "vehicle", label: "Fahrzeug", values: VEHICLES.map(function (x) { return { v: x.v, t: "BMW " + x.t }; }) }, | { id: "vehicle", label: "Fahrzeug", 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", pre: { when: { gen: ["b", "c"] }, html: "[b]So erkennst Du Dein System:[/b][br][imgw=" + P.idrive + "]" }, values: [ | { id: "factory", label: "Verbaut ab Werk", label_en: "Factory-fitted system", | ||
{ v: "iris", t: "Radio mit IRIS", only: { vehicle: ["3er-e46", "5er-e39", "7er-e38", "x5-e53"] }, info: "[img=" + P.iris + "]" }, | 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: "mid", t: "Radio mit MID", only: { gen: ["alt"] }, info: "[img=" + P.radio + "]" }, | { 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: "n43", t: "4:3 Navi", only: { vehicle: ["5er-e39", "7er-e38"] }, info: "[img=" + P.n43 + "]" }, | { v: "mid", t: "Radio mit MID", t_en: "Radio with MID", only: { gen: ["alt"] }, info: "[img=" + P.radio + "]" }, | ||
{ v: "n169", t: "16:9 Navi", only: { gen: ["alt"] }, info: "[img=" + P.n169 + "]" }, | { v: "n43", t: "4:3 Navi", t_en: "4:3 navi", only: { vehicle: ["5er-e39", "7er-e38"] }, info: "[img=" + P.n43 + "]" }, | ||
{ v: "pfeil", t: "Pfeilnavi", only: { vehicle: ["3er-e46"] }, info: "[img=" + P.pfeil + "]" }, | { v: "n169", t: "16:9 Navi", t_en: "16:9 navi", only: { gen: ["alt"] }, info: "[img=" + P.n169 + "]" }, | ||
{ v: "pfeil", t: "Pfeilnavi", t_en: "Arrow navi", only: { vehicle: ["3er-e46"] }, info: "[img=" + P.pfeil + "]" }, | |||
{ v: "mask", t: "M-ASK", only: { gen: ["b"] } }, | { v: "mask", t: "M-ASK", only: { gen: ["b"] } }, | ||
{ v: "ccc", t: "CCC", only: { gen: ["b"] } }, | { v: "ccc", t: "CCC", only: { gen: ["b"] } }, | ||
| Zeile 164: | Zeile 178: | ||
{ v: "nbt", t: "NBT", only: { gen: ["c"] } }, | { v: "nbt", t: "NBT", only: { gen: ["c"] } }, | ||
{ v: "nbtevo", t: "NBT EVO", only: { gen: ["c"] } } ] }, | { v: "nbtevo", t: "NBT EVO", only: { gen: ["c"] } } ] }, | ||
{ id: "trunk", label: "Wo sitzt das Radiomodul des Pfeilnavis?", optional: true, show: { factory: ["pfeil"] }, | { 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"] }, | ||
help: "Bitte prüfen: Sitzt das Modul im Kofferraum, oder im Pfeilnavi selbst (Quadlock hinten neben dem Antennenstecker)?[br][img=" + P.pfeil + "]", | help: "Bitte prüfen: Sitzt das Modul im Kofferraum, oder im Pfeilnavi selbst (Quadlock hinten neben dem Antennenstecker)?[br][img=" + P.pfeil + "]", | ||
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: [ | values: [ | ||
{ v: "ja", t: "Im Kofferraum (Verlängerungen nötig)" }, | { 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)" }, | { 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" } ] }, | { v: "unk", t: "Weiß ich nicht", t_en: "I don't know" } ] }, | ||
{ id: "aux", label: "AUX-IN verfügbar?", show: { gen: ["b", "c"] }, values: [ | { id: "aux", label: "AUX-IN verfügbar?", label_en: "AUX-IN available?", show: { gen: ["b", "c"] }, values: [ | ||
{ v: "ja", t: "Ja" }, { v: "nein", t: "Nein" } ] }, | { v: "ja", t: "Ja", t_en: "Yes" }, { v: "nein", t: "Nein", t_en: "No" } ] }, | ||
{ id: "sound", label: "Soundsystem", values: [ | { 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", only: { vehicle: ["7er-e38", "5er-e39", "x5-e53", "x3-e83"] }, info: "[a=" + WIKI + "Habe_ich_DSP%3F]Habe ich DSP?[/a]" }, | { 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: ["3er-e46", "z4-e85e86"] } }, | { v: "hk", t: "Harman Kardon", only: { vehicle: ["3er-e46", "z4-e85e86"] } }, | ||
{ v: "logic7", t: "Logic7", only: { vehicle: ["3er-e9x", "5er-e6x", "6er-e6x", "7er-e65", "1er-e8x"] } }, | { v: "logic7", t: "Logic7", only: { vehicle: ["3er-e9x", "5er-e6x", "6er-e6x", "7er-e65", "1er-e8x"] } }, | ||
{ v: "hksur", t: "Harman Kardon Surround", only: { vehicle: ["1er-f2x", "2er-f2x", "3er-f3x", "4er-f3x", "5er-f1x"] } } ] }, | { v: "hksur", t: "Harman Kardon Surround", only: { vehicle: ["1er-f2x", "2er-f2x", "3er-f3x", "4er-f3x", "5er-f1x"] } } ] }, | ||
{ id: "current", label: "Aktuell verbaut", values: [ | { id: "current", label: "Aktuell verbaut", label_en: "Currently installed", values: [ | ||
{ v: "werk", t: "Werksradio / Werksnavi" }, | { v: "werk", t: "Werksradio / Werksnavi", t_en: "Factory radio / factory navi" }, | ||
{ v: "nach", t: "Nachrüst-Radio / -Navi" } ] }, | { v: "nach", t: "Nachrüst-Radio / -Navi", t_en: "Aftermarket radio / navi" } ] }, | ||
{ id: "body", label: "Karosserie", auto: true, values: bodyValues }, | { id: "body", label: "Karosserie", label_en: "Body type", auto: true, values: bodyValues }, | ||
{ id: "ant", label: "Antennenstecker am Radio (optional)", optional: true, def: "unk", | { 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"] }, | show: { vehicle: ["7er-e38", "5er-e39", "3er-e46", "x5-e53"] }, | ||
values: [ | values: [ | ||
{ v: "unk", t: "Weiß ich nicht", info: "[b]BM24[/b] (Rundpin) = ISO-Antennenstecker:[br][img=" + P.bm24 + "][img=" + P.iso + "][br][b]BM54[/b] = FAKRA:[br][img=" + P.bm54 + "][img=" + P.fakra + "]" }, | { v: "unk", t: "Weiß ich nicht", t_en: "I don't know", | ||
{ v: "iso", t: "ISO (BM24, Rundpin)", info: "[img=" + P.bm24 + "][img=" + P.iso + "]" }, | 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 + "]" }, | |||
{ v: "iso", t: "ISO (BM24, Rundpin)", t_en: "ISO (BM24, round pin)", info: "[img=" + P.bm24 + "][img=" + P.iso + "]" }, | |||
{ v: "fakra", t: "FAKRA (BM54)", info: "[img=" + P.bm54 + "][img=" + P.fakra + "]" } ] } | { v: "fakra", t: "FAKRA (BM54)", info: "[img=" + P.bm54 + "][img=" + P.fakra + "]" } ] } | ||
]; | ]; | ||
/* ---- 3) Zusatzoptionen (Mehrfachauswahl) --------------------------------- | /* ---- 3) Zusatzoptionen (Mehrfachauswahl) --------------------------------- | ||
show = nur sichtbar wenn Bedingung passt requires = nur sichtbar wenn diese Optionen gewählt sind | 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 = 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. */ | |||
var OPTS = [ | var OPTS = [ | ||
{ id: "halter", t: "Radio-Halter", sub: "nur BMW E39", show: { vehicle: ["5er-e39"] }, items: ["halter"] }, | { 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", show: { gen: ["alt"] }, items: ["ibus", "resler", "bclic"] }, | { id: "ibus", t: "I-BUS App", show: { gen: ["alt"] }, items: ["ibus", "resler", "bclic"] }, | ||
{ id: "deepobd", t: "DeepOBD (Diagnose)", items: ["deepobd"] }, | { id: "deepobd", t: "DeepOBD (Diagnose)", t_en: "DeepOBD (diagnostics)", items: ["deepobd"] }, | ||
{ id: "can", t: "CAN Interface", sub: "Addon - nur mit I-BUS App", show: { gen: ["alt"] }, requires: ["ibus"], items: ["can"] }, | { 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: "kcan", t: "K-CAN App (Beta)", sub: "Pendant zur I-BUS App", show: { vehicle: KCAN }, items: ["kcan", "kcanlic", "can"] }, | { 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: "tpms", t: "TPMS (Reifendruck)", items: ["tpms"] }, | { id: "tpms", t: "TPMS (Reifendruck)", t_en: "TPMS (tire pressure)", items: ["tpms"] }, | ||
{ id: "dab1", t: "DAB+ (Single Receiver)", excl: "dab", items: ["dab1"] }, | { id: "dab1", t: "DAB+ (Single Receiver)", excl: "dab", items: ["dab1"] }, | ||
{ id: "dab2", t: "DAB+ (Dual Receiver)", excl: "dab", items: ["dab2"] }, | { id: "dab2", t: "DAB+ (Dual Receiver)", excl: "dab", items: ["dab2"] }, | ||
{ id: "rcam", t: "Rückfahrkamera", items: ["rcam"] }, | { id: "rcam", t: "Rückfahrkamera", t_en: "Rear-view camera", items: ["rcam"] }, | ||
{ id: "fcam", t: "Front-Kamera", items: ["fcam"] }, | { id: "fcam", t: "Front-Kamera", t_en: "Front camera", items: ["fcam"] }, | ||
{ id: "tool", t: "Einbau-Werkzeug (Kunststoffheber)", items: ["tool"] } | { id: "tool", t: "Einbau-Werkzeug (Kunststoffheber)", t_en: "Installation tool (plastic pry tool)", items: ["tool"] } | ||
]; | ]; | ||
/* Erzwungene Optionen (werden automatisch gesetzt und gesperrt) */ | /* 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 ------------------------------------------------------------ | /* ---- 4) Artikel ------------------------------------------------------------ | ||
u = Shop-Link (ut = | u = Shop-Link DE, ue = Shop-Link EN (leer = wie DE) ut/wt = Linktexte w = Wiki-Link leer = kein Link | ||
skipIf = Artikel entfällt, wenn der genannte Artikel schon in der Liste steht */ | skipIf = Artikel entfällt, wenn der genannte Artikel schon in der Liste steht | ||
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.", u: SHOP + "detail/index/sArticle/212/", img: [P.exl005, P.schema] }, | exl005: { t: "Verlängerung EXL005", t_en: "Extension EXL005", d: "Ersetzt das Radiomodul im Kofferraum.", d_en: "Replaces the radio module in the trunk.", | ||
fakra6m: { t: "Verlängerung 6 m FAKRA(m) auf FAKRA(f), gewinkelt", d: "Antennenverlängerung vom Kofferraum nach vorn.", img: [P.fakra6m], | 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] }, | ||
u: SHOP + "shop/zubehoer/adapterkabel/192/verlaengerung-6m-fakra-m-auf-fakra-f-kurz-gewinkelt" }, | fakra6m: { t: "Verlängerung 6 m FAKRA(m) auf FAKRA(f), gewinkelt", t_en: "Extension 6 m FAKRA(m) to FAKRA(f), angled", | ||
isoada: { t: "Adapter ISO-Stecker auf FAKRA, gewinkelt (15 cm)", d: "Nötig bei ISO-Antennenstecker (BM24, Rundpin).", img: [P.isofakra], | d: "Antennenverlängerung vom Kofferraum nach vorn.", d_en: "Antenna extension from the trunk to the front.", img: [P.fakra6m], | ||
u: SHOP + "shop/zubehoer/adapterkabel/193/adapter-kabel-iso-f-auf-fakra-f-kurz-gewinkelt-15cm" }, | u: SHOP + "shop/zubehoer/adapterkabel/192/verlaengerung-6m-fakra-m-auf-fakra-f-kurz-gewinkelt", | ||
bcdsp: { t: "I-BUS App - BC+DSP Lizenz", d: "Ohne DSP-Lizenz arbeitet das Werks-DSP nicht.", | ue: SHOP_EN + "i-bus-app/accessories/cable-adapters/192/extension-6m-fakra-m-to-fakra-f-short-angled" }, | ||
u: SHOP + "i-bus-app/lizenzen/171/i-bus-app-bc-dsp-lizenz", | isoada: { t: "Adapter ISO-Stecker auf FAKRA, gewinkelt (15 cm)", t_en: "Adapter ISO plug to FAKRA, angled (15 cm)", | ||
w: WIKI + "Habe_ich_DSP%3F", wt: "Wiki: Habe ich DSP?" }, | d: "Nötig bei ISO-Antennenstecker (BM24, Rundpin).", d_en: "Required with an ISO antenna connector (BM24, round pin).", img: [P.isofakra], | ||
halter: { t: "Alu-Halter zur Radio-Montage im BMW E39", d: "Empfohlen bei Radios, die nicht von AVIN stammen.", img: [P.halter], | u: SHOP + "shop/zubehoer/adapterkabel/193/adapter-kabel-iso-f-auf-fakra-f-kurz-gewinkelt-15cm", | ||
u: SHOP + "i-bus-app/zubehoer/radiohalter/185/alu-halter-zur-radio-montage-im-bmw-e39" }, | 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", | |||
d: "Ohne DSP-Lizenz arbeitet das Werks-DSP nicht.", d_en: "Without the DSP license the factory DSP will not work.", | |||
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?" }, | |||
halter: { t: "Alu-Halter zur Radio-Montage im BMW E39", t_en: "Alu holder for radio installation in BMW E39", | |||
d: "Empfohlen bei Radios, die nicht von AVIN stammen.", d_en: "Recommended for radios not made by AVIN.", img: [P.halter], | |||
u: SHOP + "i-bus-app/zubehoer/radiohalter/185/alu-halter-zur-radio-montage-im-bmw-e39", | |||
ue: SHOP_EN + "i-bus-app/accessories/fittings-for-radio/185/fittings-for-radio-in-bmw-e39" }, | |||
ibus: { t: "I-BUS App", hl: true, | 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: "Die I-BUS App ist eine Android Applikation, die dazu dient Ihren Bordcomputer auf einem Android Gerät darzustellen und in Ihrem Fahrzeug viele Comfort-/Codierfunktionen integriert. Der Download der App ist kostenlos und es kann eine Verbindung zum Interface/Modul hergestellt werden. Um alle Funktionen der App nutzen zu können, wird eine I-BUS App Lizenz benötigt.", | ||
u: SHOP + "cat/index/sCategory/42", | 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: [ | 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?" }, | { 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)" }, | { 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)" }, | { 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" } ] }, | { 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", d: "Verbindet I-BUS App und Fahrzeug.", img: [P.resler], | 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", | u: SHOP + "i-bus-app/zubehoer/interfaces-module/191/resler-usb-i-bus-modul-inkl.-anschlusskabel", | ||
w: "https://wiki.ibus-app.de/index.php?title=Hauptseite#Einbauanleitung_f.C3.BCr_Resler_Modul_und_Resler_Interface", wt: "Einbauanleitung Resler Modul" }, | ue: SHOP_EN + "i-bus-app/accessories/interfaces-modules/191/resler-usb-i-bus-module-incl.-cable", | ||
bclic: { t: "I-BUS App - BC Lizenz", d: "Schaltet u. a. die BC-Daten der App frei.", skipIf: "bcdsp", | 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" }, | ||
u: SHOP + "i-bus-app/lizenzen/167/i-bus-app-bc-lizenz" }, | 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", | ||
deepobd: { t: "Deep OBD OBD-II Bluetooth-Adapter", d: "Live-Werte auslesen, Fehler lesen und löschen.", img: [P.deepobd], | u: SHOP + "i-bus-app/lizenzen/167/i-bus-app-bc-lizenz", ue: SHOP_EN + "i-bus-app/licenses/173/i-bus-app-obc-license" }, | ||
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", | 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" }, | ue: SHOP_EN + "i-bus-app/accessories/interfaces-modules/258/deep-obd-obd-ii-bluetooth-adapter", | ||
can: { t: "CAN-Bus Interface inkl. Anschlusskabel", d: "Addon, funktioniert nur zusammen mit der I-BUS App bzw. der K-CAN App.", img: [P.can], | 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", | 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" }, | 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.", | kcan: { t: "K-CAN App (Beta)", d: "Pendant zur I-BUS App für Fahrzeuge mit K-CAN, aktuell als Betaversion.", | ||
w: "https://wiki.kcan-app.de/", wt: "Wiki zur K-CAN App" }, | d_en: "Counterpart to the I-BUS App for vehicles with K-CAN, currently in beta.", | ||
kcanlic: { t: "K-CAN App - Lizenz Betaversion", d: "Beta-Lizenz für die K-CAN App.", | w: "https://wiki.kcan-app.de/", wt: "Wiki zur K-CAN App", wt_en: "K-CAN App wiki" }, | ||
u: SHOP + "i-bus-app/lizenzen/358/k-can-app-lizenz-betaversion" }, | 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.", | ||
tpms: { t: "TPMS - Reifendruckkontrolle", d: "", u: SHOP + "radiozubehoer/tpms/" }, | 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" }, | ||
dab1: { t: "DAB+ Empfänger inkl. Antenne (Single)", d: "", w: "https://xtrons.ibus-app.de/index.php?title=Installation_der_DAB%2B_Antenne", wt: "Installation der DAB+ Antenne", u: SHOP + "radiozubehoer/dab/291/dab-empfaenger-inkl.-antenne-usbdab04" }, | tpms: { t: "TPMS - Reifendruckkontrolle", t_en: "TPMS - tire pressure monitoring", d: "", u: SHOP + "radiozubehoer/tpms/", ue: SHOP_EN + "accessories-for-head-units/tpms/" }, | ||
dab2: { t: "Dual DAB+ Empfänger-Stick inkl. 2 Antennen", d: "", w: "https://xtrons.ibus-app.de/index.php?title=Installation_der_DAB%2B_Antenne", wt: "Installation der DAB+ Antenne", u: SHOP + "radiozubehoer/dab/391/dual-dab-empfaenger-stick-inkl.-2-antennen-acusbdab05t?c=75" }, | dab1: { t: "DAB+ Empfänger inkl. Antenne (Single)", t_en: "DAB+ receiver incl. antenna (single)", d: "", | ||
rcam: { t: "Rückfahrkamera", d: "", u: SHOP + "radiozubehoer/kameras/", ut: "Kameras im Shop ansehen →" }, | 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", | ||
fcam: { t: "Front-Kamera", d: "", u: SHOP + "radiozubehoer/kameras/", ut: "Kameras im Shop ansehen →" }, | 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 →" }, | ||
tool: { t: "Einbau-Werkzeug (Kunststoffheber)", d: "Zum schonenden Lösen der Verkleidungen.", u: SHOP + "radiozubehoer/einbauwerkzeug/" } | 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 -------------------------------------------------------------- | /* ---- 5) Regeln -------------------------------------------------------------- | ||
type: need (Das brauchst Du) oder hint (Hinweise) when = Bedingung auf die Felder | 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 = 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) */ | 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: "[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: "[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: "[b]Kabelwege:[/b] Die Technik sitzt im Kofferraum. Mindestens Radioanschluss und FM-Antenne müssen nach vorn verlegt werden. Optional zusätzlich: GPS (OEM-Antenne), Verlängerung für DAB+, Anschluss OEM-CD-Wechsler, Cinch für Subwoofer." }, | html: "[b]Kabelwege:[/b] Die Technik sitzt im Kofferraum. Mindestens Radioanschluss und FM-Antenne müssen nach vorn verlegt werden. Optional zusätzlich: GPS (OEM-Antenne), Verlängerung für DAB+, Anschluss OEM-CD-Wechsler, Cinch für Subwoofer.", | ||
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: "[b]Kabelwege:[/b] Alle Anschlüsse befinden sich direkt hinter dem Radio, es müssen [b]keine[/b] Kabel verlegt werden. Optional ggf. für: GPS (OEM-Antenne), DAB+, OEM-CD-Wechsler, Cinch für Subwoofer." }, | html: "[b]Kabelwege:[/b] Alle Anschlüsse befinden sich direkt hinter dem Radio, es müssen [b]keine[/b] Kabel verlegt werden. Optional ggf. für: GPS (OEM-Antenne), DAB+, OEM-CD-Wechsler, Cinch für Subwoofer.", | ||
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: "[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: "[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: "[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: "[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: ["bcdsp"] }, | { type: "need", when: { sound: ["dsp"] }, items: ["bcdsp"] }, | ||
{ type: "hint", when: { sound: ["dsp"] }, | { type: "hint", when: { sound: ["dsp"] }, | ||
html: "[b]DSP:[/b] Damit das Werks-DSP überhaupt arbeitet, wird die I-BUS App mit BC+DSP Lizenz benötigt. Ob Dein Fahrzeug ein DSP hat: [a=" + WIKI + "Habe_ich_DSP%3F]Habe ich DSP?[/a]" }, | 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]", | ||
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]" }, | |||
{ type: "hint", when: { sound: ["hk"], gen: ["alt"] }, | { type: "hint", when: { sound: ["hk"], gen: ["alt"] }, | ||
html: "[b]Harman Kardon:[/b] Benötigt [b]keine[/b] DSP-Lizenz. Das Remote-Signal (+12 V, wenn Radio an) genügt zum Starten." }, | html: "[b]Harman Kardon:[/b] Benötigt [b]keine[/b] DSP-Lizenz. Das Remote-Signal (+12 V, wenn Radio an) genügt zum Starten.", | ||
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." }, | |||
{ type: "hint", when: { aux: ["nein"] }, | { type: "hint", when: { aux: ["nein"] }, | ||
html: "[b]AUX-IN:[/b] Der AUX-IN muss codiert werden. Optional kann ein FM-Transmitter genutzt werden - das ist nicht empfohlen." }, | html: "[b]AUX-IN:[/b] Der AUX-IN muss codiert werden. Optional kann ein FM-Transmitter genutzt werden - das ist nicht empfohlen.", | ||
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: ["7er-e38", "x5-e53"] }, | { type: "hint", when: { vehicle: ["7er-e38", "x5-e53"] }, | ||
html: "[b]Montage:[/b] Radios für BMW E38/E53 benötigen keine extra Halterungen." }, | html: "[b]Montage:[/b] Radios für BMW E38/E53 benötigen keine extra Halterungen.", | ||
html_en: "[b]Installation:[/b] Radios for BMW E38/E53 do not need extra brackets." }, | |||
{ type: "hint", when: { vehicle: ["5er-e39"] }, | { 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: "[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"] }, | { 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]" + | html: "[b]Montage E46 ohne großes Navi:[/b] Das Klimabedienteil muss nach unten versetzt werden. Dafür brauchst Du den passenden [b]Funktionsträger[/b] (neu ca. 100 €, ggf. beim Teileverwerter günstiger):[br]" + | ||
"Einzelschalter (eher VFL): [a=https://www.leebmann24.de/trager-3er-51168202186.html]ohne Raucher 51168202186[/a] / [a=https://www.leebmann24.de/trager-3er-51168230902.html]mit Raucher 51168230902[/a][br]" + | "Einzelschalter (eher VFL): [a=https://www.leebmann24.de/trager-3er-51168202186.html]ohne Raucher 51168202186[/a] / [a=https://www.leebmann24.de/trager-3er-51168230902.html]mit Raucher 51168230902[/a][br]" + | ||
"Schaltzentrum (eher FL): [a=https://www.leebmann24.de/funktionstrager-schaltzentrum-3er-51167001408.html]ohne Raucher 51167001408[/a] / [a=https://www.leebmann24.de/funktionstrager-schaltzentrum-3er-51167001410.html]mit Raucher 51167001410[/a][br][img=" + P.funktr + "]" }, | "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"] }, | { 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: "[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"] }, | { type: "hint", when: { factory: ["mask", "ccc", "cic", "nbt", "nbtevo"] }, | ||
html: "[b]Originales Radiomodul bleibt erhalten:[/b] Bei M-ASK, CCC, CIC, NBT und NBT EVO bleibt das originale Radiomodul im Fahrzeug und muss funktionieren! Ersetzt wird nur der Bildschirm." }, | html: "[b]Originales Radiomodul bleibt erhalten:[/b] Bei M-ASK, CCC, CIC, NBT und NBT EVO bleibt das originale Radiomodul im Fahrzeug und muss funktionieren! Ersetzt wird nur der Bildschirm.", | ||
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: {}, | { 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: "[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: "[b]I-BUS App:[/b] Siehe [a=https://wiki.ibus-app.de/index.php?title=Was_brauche_ich_um_die_I-BUS_App_nutzen_zu_k%C3%B6nnen%3F]Was brauche ich, um die I-BUS App nutzen zu können?[/a] und die [a=https://wiki.ibus-app.de/index.php?title=Hauptseite#Einbauanleitung_f.C3.BCr_Resler_Modul_und_Resler_Interface]Einbauanleitung für Resler Modul und Interface[/a]." }, | html: "[b]I-BUS App:[/b] Siehe [a=https://wiki.ibus-app.de/index.php?title=Was_brauche_ich_um_die_I-BUS_App_nutzen_zu_k%C3%B6nnen%3F]Was brauche ich, um die I-BUS App nutzen zu können?[/a] und die [a=https://wiki.ibus-app.de/index.php?title=Hauptseite#Einbauanleitung_f.C3.BCr_Resler_Modul_und_Resler_Interface]Einbauanleitung für Resler Modul und Interface[/a].", | ||
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]." }, | |||
{ type: "hint", when: {}, | { 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: "[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]." } | |||
]; | ]; | ||
/* ===================================================================== | /* ===================================================================== | ||
| Zeile 303: | Zeile 363: | ||
var sel = {}, picked = {}, summary = "", capA = 0, capB = 0, radioCache = {}, chosenRadio = null, cartFill = null; | 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 full(u) { return u.indexOf("/thumb/") === -1 ? u : u.replace("/thumb/", "/").replace(/\/[^\/]+$/, ""); } | ||
function fmt(t) { | function fmt(t) { | ||
| Zeile 335: | Zeile 400: | ||
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 350: | Zeile 415: | ||
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); | wrap.appendChild(lab); wrap.appendChild(s); | ||
if (f.help) { var h = document.createElement("div"); h.className = "nvk-help"; h.innerHTML = fmt(f | 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); | var inf = document.createElement("div"); inf.id = "nvk-i-" + f.id; wrap.appendChild(inf); | ||
fieldsEl.appendChild(wrap); | fieldsEl.appendChild(wrap); | ||
| Zeile 362: | Zeile 427: | ||
var s = derive(); | var s = derive(); | ||
var wrap = $("nvk-w-" + f.id), el = $("nvk-" + f.id); | var wrap = $("nvk-w-" + f.id), el = $("nvk-" + f.id); | ||
$("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; | var vis = f.show ? match(f.show, s, false) : true; | ||
wrap.style.display = vis ? "" : "none"; | wrap.style.display = vis ? "" : "none"; | ||
| Zeile 370: | Zeile 437: | ||
if (!sel[f.id]) { if (f.auto) { if (sel.vehicle) { if (allowed.length === 1) sel[f.id] = allowed[0].v; } } } | 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 cur = allowed.filter(function (v) { return v.v === sel[f.id]; })[0]; | ||
var pre = f.pre ? (match(f.pre.when, s, false) ? fmt(f.pre | 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(cur | $("nvk-i-" + f.id).innerHTML = pre + (cur ? (cur.info ? fmt(LT(cur, "info")) : "") : ""); | ||
}); | }); | ||
} | } | ||
| Zeile 398: | Zeile 465: | ||
}); | }); | ||
lab.appendChild(cb); | lab.appendChild(cb); | ||
lab.appendChild(document.createTextNode(" " + o | lab.appendChild(document.createTextNode(" " + LT(o, "t"))); | ||
var sub = [o | var sub = [LT(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); | ||
| Zeile 409: | Zeile 476: | ||
function card(item, cls) { | function card(item, cls) { | ||
var d = document.createElement("div"); d.className = "nvk-card " + (cls || "") + (item.hl ? " hl" : ""); | 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 (dd) { var p = document.createElement("span"); p.textContent = dd; d.appendChild(p); } | |||
if (item.img) { | if (item.img) { | ||
var im = document.createElement("div"); | var im = document.createElement("div"); | ||
item.img.forEach(function (u) { | item.img.forEach(function (u) { | ||
var a = document.createElement("a"); a.href = full(u); a.target = "_blank"; a.rel = "noopener"; | var a = document.createElement("a"); a.href = full(u); a.target = "_blank"; a.rel = "noopener"; | ||
var g = document.createElement("img"); g.className = "nvk-img"; g.src = u; g.alt = item | 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); | d.appendChild(im); | ||
} | } | ||
if ( | var iu = itemUrl(item); | ||
if (iu || item.w) { | |||
var l = document.createElement("div"); l.className = "nvk-links"; | var l = document.createElement("div"); l.className = "nvk-links"; | ||
if ( | if (iu) l.appendChild(link(iu, LT(item, "ut") || T("Im Shop ansehen →", "View in shop →"))); | ||
if (item.w) l.appendChild(link(item.w, (item | if (item.w) l.appendChild(link(item.w, (LT(item, "wt") || T("Zum Wiki", "Open wiki")) + " →")); | ||
d.appendChild(l); | d.appendChild(l); | ||
} | } | ||
if (item.links) item.links.forEach(function (x) { | if (item.links) item.links.forEach(function (x) { | ||
var r = document.createElement("div"); r.className = "nvk-links"; r.appendChild(link(x.u, 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; | ||
| Zeile 440: | Zeile 509: | ||
if (veh.noCat) return; | if (veh.noCat) return; | ||
if (chosenRadio) { if (chosenRadio.cat !== veh.v) chosenRadio = null; } | if (chosenRadio) { if (chosenRadio.cat !== veh.v) chosenRadio = null; } | ||
var data = radioCache[ | var ck = veh.v + "-" + LANG; | ||
var data = radioCache[ck]; | |||
if (data === undefined) { | if (data === undefined) { | ||
radioCache[ | radioCache[ck] = "loading"; | ||
fetch(API + "?cat=" + encodeURIComponent(veh.v)).then(function (r) { return r.json(); }).then(function (j) { | fetch(API + "?cat=" + encodeURIComponent(veh.v) + AMP + "lang=" + LANG).then(function (r) { return r.json(); }).then(function (j) { | ||
radioCache[ | radioCache[ck] = (j.items || []).map(function (it) { it.cat = veh.v; return it; }); | ||
renderResult(); | renderResult(); | ||
}).catch(function () { radioCache[ | }).catch(function () { radioCache[ck] = []; renderResult(); }); | ||
} | } | ||
if (data === undefined || data === "loading") { | if (data === undefined || data === "loading") { | ||
var m = document.createElement("p"); m.className = "nvk-miss"; m.textContent = "Verfügbare Radios werden geladen …"; outEl.appendChild(m); return; | 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; | if (!data.length) return; | ||
| Zeile 457: | Zeile 527: | ||
var det = document.createElement("details"); det.open = Math.max(list.length, 8) === 8; | 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"; | var sm = document.createElement("summary"); sm.style.cursor = "pointer"; sm.style.fontWeight = "700"; | ||
sm.textContent = "Verfügbare Radios für Deinen BMW " + veh | 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) { | list.forEach(function (it) { | ||
var row = document.createElement("div"); row.className = "nvk-row"; | var row = document.createElement("div"); row.className = "nvk-row"; | ||
| Zeile 465: | Zeile 535: | ||
rb.addEventListener("change", function () { chosenRadio = it; if (cartFill) cartFill(); }); | rb.addEventListener("change", function () { chosenRadio = it; if (cartFill) cartFill(); }); | ||
lab.appendChild(rb); | lab.appendChild(rb); | ||
lab.appendChild(document.createTextNode(" " + it.name + (it.price ? " - " + it.price : "") + (fits(it) ? " (passt zu Deiner Auswahl)" : ""))); | 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 →")); | row.appendChild(lab); row.appendChild(link(it.url, "Shop →")); | ||
det.appendChild(row); | det.appendChild(row); | ||
| Zeile 473: | Zeile 543: | ||
function cartBlock(needs, opt) { | function cartBlock(needs, opt) { | ||
var items = []; | var items = []; | ||
needs.concat(opt).forEach(function (i) { var id = aidOf(i | needs.concat(opt).forEach(function (i) { var id = aidOf(itemUrl(i) || ""); if (id) items.push({ t: LT(i, "t"), aid: id }); }); | ||
heading("In den Warenkorb"); | heading(T("In den Warenkorb", "Add to cart")); | ||
var box = document.createElement("div"); box.className = "nvk-card opt"; | var box = document.createElement("div"); box.className = "nvk-card opt"; | ||
var p = document.createElement("div"); | var p = document.createElement("div"); | ||
p.textContent = "Das oben gewählte Radio (falls ausgewählt) und diese Artikel werden direkt im Shop in den Warenkorb gelegt:"; | 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); | box.appendChild(p); | ||
var listEl = document.createElement("div"); box.appendChild(listEl); | var listEl = document.createElement("div"); box.appendChild(listEl); | ||
| Zeile 487: | Zeile 557: | ||
cartFill(); | cartFill(); | ||
var n = document.createElement("div"); n.className = "nvk-help"; | var n = document.createElement("div"); n.className = "nvk-help"; | ||
n.textContent = "Kameras, TPMS, Werkzeug und Artikel ohne Direktlink wählst Du bitte über die Links oben im Shop aus."; | 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); | box.appendChild(n); | ||
var all = needs.concat(opt); | var all = needs.concat(opt); | ||
| Zeile 495: | Zeile 565: | ||
var vb = document.createElement("div"); vb.className = "nvk-f"; vb.style.marginTop = "12px"; | var vb = document.createElement("div"); vb.className = "nvk-f"; vb.style.marginTop = "12px"; | ||
var vlab = document.createElement("label"); vlab.htmlFor = "nvk-licvin"; | var vlab = document.createElement("label"); vlab.htmlFor = "nvk-licvin"; | ||
vlab.textContent = l17 ? "Fahrgestellnummer (17 Zeichen) für die Lizenz" : "VIN für die Lizenz (7 Zeichen, z. B. AB12345)"; | 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; | var vin = document.createElement("input"); vin.type = "text"; vin.id = "nvk-licvin"; vin.maxLength = 17; | ||
vin.value = $("nvk-vin").value.toUpperCase(); | 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 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"; | var cb = document.createElement("button"); cb.type = "button"; cb.className = "nvk-btn"; cb.style.marginTop = "6px"; | ||
cb.textContent = "Kommentartext für die Kasse kopieren"; | cb.textContent = T("Kommentartext für die Kasse kopieren", "Copy comment text for checkout"); | ||
var ls = document.createElement("div"); ls.className = "nvk-help"; | var ls = document.createElement("div"); ls.className = "nvk-help"; | ||
cb.addEventListener("click", function () { | cb.addEventListener("click", function () { | ||
| Zeile 506: | Zeile 576: | ||
if (/^[A-HJ-NPR-Z0-9]{17}$/.test(v)) { v17 = v; v7 = v.slice(10); } | 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; | else if (/^[A-Z]{2}[0-9]{5}$/.test(v)) v7 = v; | ||
if (l17 ? !v17 : !v7) { ls.textContent = l17 ? "Bitte die vollständige 17-stellige Fahrgestellnummer eingeben." : "Bitte die VIN im Format AB12345 (oder die 17-stellige FGN) eingeben."; return; } | 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 = []; | var L = []; | ||
if (has("bclic")) L.push("I-BUS App BC Lizenz: VIN " + v7); | if (has("bclic")) L.push(T("I-BUS App BC Lizenz: VIN ", "I-BUS App OBC License: VIN ") + v7); | ||
if (has("bcdsp")) L.push("I-BUS App BC+DSP Lizenz: 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("K-CAN App Beta Lizenz: FGN " + v17); | 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(); | ta.value = L.join("\n"); ta.style.display = ""; ta.select(); | ||
var hint = "Bitte an der Shop-Kasse in das Feld Kommentar einfügen."; | 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."); | ||
if (navigator.clipboard) navigator.clipboard.writeText(ta.value).then(function () { ls.textContent = "Text kopiert. " + hint; }).catch(function () { ls.textContent = | var manual = T("Bitte den Text markieren und kopieren. ", "Please select and copy the text. "); | ||
else ls.textContent = | 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); | vb.appendChild(vlab); vb.appendChild(vin); vb.appendChild(cb); vb.appendChild(ta); vb.appendChild(ls); box.appendChild(vb); | ||
| Zeile 520: | Zeile 591: | ||
if (!CART_TRANSFER) { outEl.appendChild(box); return; } | if (!CART_TRANSFER) { outEl.appendChild(box); return; } | ||
var btn = document.createElement("button"); btn.type = "button"; btn.className = "nvk-btn"; btn.style.marginTop = "8px"; | var btn = document.createElement("button"); btn.type = "button"; btn.className = "nvk-btn"; btn.style.marginTop = "8px"; | ||
btn.textContent = "Auswahl in den Warenkorb legen"; | btn.textContent = T("Auswahl in den Warenkorb legen", "Add selection to cart"); | ||
var st = document.createElement("div"); st.className = "nvk-help"; | var st = document.createElement("div"); st.className = "nvk-help"; | ||
btn.addEventListener("click", function () { addToCart(items, st); }); | btn.addEventListener("click", function () { addToCart(items, st); }); | ||
| Zeile 528: | Zeile 599: | ||
var list = items.slice(); | var list = items.slice(); | ||
if (chosenRadio) list.unshift({ t: chosenRadio.type, sku: chosenRadio.sku }); | if (chosenRadio) list.unshift({ t: chosenRadio.type, sku: chosenRadio.sku }); | ||
if (!list.length) { st.textContent = "Es ist noch nichts zum Bestellen ausgewählt."; return; } | 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"); | var w = window.open("", "_blank"); | ||
st.textContent = "Artikelnummern werden ermittelt …"; | 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 ids = list.filter(function (x) { return x.aid; }).map(function (x) { return x.aid; }); | ||
var get = ids.length ? fetch(API + "?aid=" + ids.join(",")).then(function (r) { return r.json(); }).then(function (j) { return j.skus || {}; }) : Promise.resolve({}); | var get = ids.length ? fetch(API + "?aid=" + ids.join(",")).then(function (r) { return r.json(); }).then(function (j) { return j.skus || {}; }) : Promise.resolve({}); | ||
| Zeile 537: | Zeile 608: | ||
list.forEach(function (x) { var k = x.sku || map[x.aid]; if (k) skus.push(k); }); | list.forEach(function (x) { var k = x.sku || map[x.aid]; if (k) skus.push(k); }); | ||
if (!skus.length) throw new Error("none"); | if (!skus.length) throw new Error("none"); | ||
var url = TRANSFER_URL + encodeURIComponent(skus.join(",")); | var url = (LANG === "en" ? TRANSFER_URL_EN : TRANSFER_URL) + encodeURIComponent(skus.join(",")); | ||
if (w) { | if (w) { | ||
w.location.href = url; | w.location.href = url; | ||
st.textContent = "Der Shop wurde in einem neuen Tab geöffnet (" + skus.length + " von " + list.length + " Artikeln übergeben). Bitte dort den Warenkorb kontrollieren. Ist ein Artikel nicht bestellbar, weist der Shop darauf hin."; | 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 { | } else { | ||
st.textContent = "Der neue Tab wurde blockiert. Bitte Pop-ups erlauben oder diesen Link nutzen: "; | 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, "Warenkorb im Shop öffnen →")); | st.appendChild(link(url, T("Warenkorb im Shop öffnen →", "Open cart in the shop →"))); | ||
} | } | ||
}).catch(function () { if (w) w.close(); st.textContent = "Das hat leider nicht geklappt. Bitte nutze die Shop-Links oben."; }); | }).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() { | ||
| Zeile 556: | Zeile 627: | ||
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 (f) { return f | m.textContent = T("Bitte noch auswählen: ", "Please still select: ") + missing.map(function (f) { return LT(f, "label"); }).join(", "); | ||
outEl.appendChild(m); $("nvk-form").style.display = "none"; return; | outEl.appendChild(m); $("nvk-form").style.display = "none"; return; | ||
} | } | ||
$("nvk-form").style.display = ""; | $("nvk-form").style.display = ""; | ||
var veh = vehicleOf(sel.vehicle); | var veh = vehicleOf(sel.vehicle); | ||
var | var rbase = LANG === "en" ? SHOP_EN + "bmw-head-units/" : SHOP + "bmw-radios/"; | ||
heading("Passende Radios"); | var ru = veh.noCat ? rbase : rbase + (LANG === "en" ? enSlug(veh.v) : veh.v) + "/"; | ||
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.", | heading(T("Passende Radios", "Matching radios")); | ||
u: ru, ut: "Zu den passenden 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); | renderRadioList(veh); | ||
var needs = [], hints = [], seen = {}; | var needs = [], hints = [], seen = {}; | ||
| Zeile 571: | Zeile 643: | ||
if (r.opts) { if (!r.opts.every(function (o) { return st.on[o]; })) return; } | 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("Das brauchst Du"); | 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) { | OPTS.forEach(function (o) { | ||
| Zeile 587: | Zeile 659: | ||
}); | }); | ||
}); | }); | ||
if (opt.length) { heading("Deine Zusatzoptionen"); opt.forEach(function (i) { outEl.appendChild(card(i, "opt")); }); } | 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("Hinweise"); | heading(T("Hinweise", "Notes")); | ||
hints.forEach(function (t) { var d = document.createElement("div"); d.className = "nvk-note"; d.innerHTML = fmt(t); outEl.appendChild(d); }); | hints.forEach(function (t) { var d = document.createElement("div"); d.className = "nvk-note"; d.innerHTML = fmt(t); outEl.appendChild(d); }); | ||
} | } | ||
var L = ["KONFIGURATION"]; | var L = [T("KONFIGURATION", "CONFIGURATION"), "Language: " + LANG]; | ||
FIELDS.forEach(function (f) { | FIELDS.forEach(function (f) { | ||
if (!sel[f.id]) return; | if (!sel[f.id]) return; | ||
var v = f.values.filter(function (x) { return x.v === sel[f.id]; })[0]; | var v = f.values.filter(function (x) { return x.v === sel[f.id]; })[0]; | ||
if (v) L.push("- " + f | if (v) L.push("- " + LT(f, "label") + ": " + LT(v, "t")); | ||
}); | }); | ||
L.push("", "BENÖTIGT"); | L.push("", T("BENÖTIGT", "REQUIRED")); | ||
needs.forEach(function (i) { L.push("- " + i | needs.forEach(function (i) { L.push("- " + LT(i, "t") + (itemUrl(i) ? " " + itemUrl(i) : "")); }); | ||
if (opt.length) { L.push("", "ZUSATZOPTIONEN"); opt.forEach(function (i) { L.push("- " + 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); | L.push("", "Radios: " + ru); | ||
summary = L.join("\n"); | summary = L.join("\n"); | ||
| Zeile 606: | Zeile 678: | ||
} | } | ||
function update() { renderFields(); renderOpts(); renderResult(); } | function update() { renderFields(); renderOpts(); renderResult(); } | ||
function capText() { $("nvk-capq").textContent = T("Sicherheitsfrage: Was ist ", "Security question: What is ") + capA + " + " + capB + "? *"; } | |||
function newCaptcha() { | function newCaptcha() { | ||
capA = 1 + Math.floor(Math.random() * 9); capB = 1 + Math.floor(Math.random() * 9); | 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"; } | function status(msg, ok) { var e = $("nvk-status"); e.style.display = ""; e.textContent = msg; e.style.borderLeftColor = ok ? "#14866d" : "#d33"; } | ||
$("nvk-send").addEventListener("click", function () { | $("nvk-send").addEventListener("click", function () { | ||
var name = $("nvk-name").value.trim(), mail = $("nvk-mail").value.trim(), vin = $("nvk-vin").value.trim().toUpperCase(), msg = $("nvk-msg").value.trim(); | var name = $("nvk-name").value.trim(), mail = $("nvk-mail").value.trim(), vin = $("nvk-vin").value.trim().toUpperCase(), msg = $("nvk-msg").value.trim(); | ||
if (!name || !mail || !msg) return status("Bitte Name, E-Mail und Kommentar ausfüllen.", false); | if (!name || !mail || !msg) return status(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("Bitte eine gültige E-Mail-Adresse eingeben.", 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("Bitte die VIN im Format AB12345 oder die 17-stellige FGN eingeben - oder das Feld leer lassen.", false); } } | if (vin) { if (!/^[A-Z]{2}[0-9]{5}$/.test(vin)) { if (!/^[A-HJ-NPR-Z0-9]{17}$/.test(vin)) return status(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("Die Sicherheitsfrage wurde nicht richtig beantwortet.", 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("Bitte der Verarbeitung Deiner Daten zustimmen.", 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; | if ($("nvk-hp").value) return; | ||
var sz = $("nvk-size").value; | var sz = $("nvk-size").value; | ||
var rad = chosenRadio ? "\n\ | var rad = chosenRadio ? "\n\n" + T("GEWÄHLTES RADIO", "SELECTED RADIO") + "\n- " + chosenRadio.type + " " + chosenRadio.url : ""; | ||
var sum2 = summary + rad + (sz ? "\n\ | var sum2 = summary + rad + (sz ? "\n\n" + T("Gewünschte Displaygröße: ", "Desired display size: ") + sz : ""); | ||
var text = "Name: " + name + "\ | 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) { | if (SEND_URL) { | ||
var p = new URLSearchParams(); | var p = new URLSearchParams(); | ||
p.append("name", name); p.append("mail", mail); p.append("vin", vin); p.append("msg", msg); p.append("summary", sum2); | p.append("name", name); p.append("mail", mail); p.append("vin", vin); p.append("msg", msg); p.append("summary", sum2); | ||
p.append("hp", $("nvk-hp").value); p.append("ca", capA); p.append("cb", capB); p.append("cv", $("nvk-cap").value); | p.append("hp", $("nvk-hp").value); p.append("ca", capA); p.append("cb", capB); p.append("cv", $("nvk-cap").value); p.append("lang", LANG); | ||
fetch(SEND_URL, { method: "POST", body: p }).then(function (r) { | fetch(SEND_URL, { method: "POST", body: p }).then(function (r) { | ||
if (!r.ok) throw new Error("send"); | if (!r.ok) throw new Error("send"); | ||
status("Danke! Deine Anfrage wurde gesendet, eine Kopie geht an " + mail + ".", true); newCaptcha(); | 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("Das Senden hat nicht geklappt. Bitte versuche es später noch einmal oder schreibe direkt an " + MAIL_TO + ".", false); }); | }).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 { | } else { | ||
window.location.href = "mailto:" + MAIL_TO + "?cc=" + encodeURIComponent(mail) + AMP + "subject=" + encodeURIComponent(T(MAIL_SUBJECT, MAIL_SUBJECT_EN)) + AMP + "body=" + encodeURIComponent(text); | |||
window.location.href = "mailto:" + MAIL_TO + "?cc=" + encodeURIComponent(mail) + AMP + "subject=" + encodeURIComponent(MAIL_SUBJECT) + 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); | ||
status("Dein E-Mail-Programm wurde mit der fertigen Anfrage geöffnet. Bitte dort noch auf Senden klicken.", true); | |||
} | } | ||
}); | }); | ||
$("nvk-reset").addEventListener("click", function () { sel = {}; picked = {}; chosenRadio = null; update(); }); | $("nvk-reset").addEventListener("click", function () { sel = {}; picked = {}; chosenRadio = null; update(); }); | ||
var | function renderLegal() { | ||
[ ["agb", "AGB"], ["widerruf", "Widerrufsbelehrung"], ["datenschutz", "Datenschutzerklärung"] ].forEach(function (x) { | 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 | 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(); | newCaptcha(); | ||
update(); | update(); | ||
| Zeile 654: | Zeile 762: | ||
</script> | </script> | ||
</div> | </div> | ||
</html> | </html> | ||
<small>Stand: 21.10.2026</small><br> | <small>Stand: 21.10.2026</small><br> | ||
Version vom 23. Oktober 2026, 13:42 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: 21.10.2026