<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://xtrons.ibus-app.de/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Andre</id>
	<title>Wiki rund um Android-Navis für BMW E38/E39/E46/E53 - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://xtrons.ibus-app.de/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Andre"/>
	<link rel="alternate" type="text/html" href="https://xtrons.ibus-app.de/index.php?title=Spezial:Beitr%C3%A4ge/Andre"/>
	<updated>2026-11-05T01:36:53Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.37.1</generator>
	<entry>
		<id>https://xtrons.ibus-app.de/index.php?title=Android_Radio_Konfigurator&amp;diff=4098</id>
		<title>Android Radio Konfigurator</title>
		<link rel="alternate" type="text/html" href="https://xtrons.ibus-app.de/index.php?title=Android_Radio_Konfigurator&amp;diff=4098"/>
		<updated>2026-10-23T12:01:54Z</updated>

		<summary type="html">&lt;p&gt;Andre: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt; '''Mit diesem Tool kann auf Basis von Fahrzeug und vorhandenen Komponenten eine Liste nötiger Komponenten erstellt werden.&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;big&amp;gt;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.&amp;lt;br&amp;gt;'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
#nvk{max-width:900px;line-height:1.45}&lt;br /&gt;
#nvk *{box-sizing:border-box}&lt;br /&gt;
#nvk .nvk-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:14px;margin:12px 0}&lt;br /&gt;
#nvk .nvk-f label{display:block;font-weight:700;margin-bottom:4px}&lt;br /&gt;
#nvk select{width:100%;padding:9px 8px;font:inherit;color:#202122;background:#fff;border:1px solid #a2a9b1;border-radius:4px}&lt;br /&gt;
#nvk .nvk-help{font-size:.85em;opacity:.75;margin-top:3px}&lt;br /&gt;
#nvk fieldset{border:1px solid rgba(128,128,128,.45);border-radius:6px;padding:10px 14px;margin:14px 0}&lt;br /&gt;
#nvk legend{font-weight:700;padding:0 6px}&lt;br /&gt;
#nvk .nvk-o{display:block;padding:4px 0;cursor:pointer}&lt;br /&gt;
#nvk .nvk-o small{opacity:.7}&lt;br /&gt;
#nvk .nvk-o.dis{opacity:.75;cursor:default}&lt;br /&gt;
#nvk .nvk-btn{padding:7px 14px;font:inherit;border:1px solid #a2a9b1;border-radius:4px;background:#f8f9fa;color:#202122;cursor:pointer}&lt;br /&gt;
#nvk #nvk-out{margin-top:18px}&lt;br /&gt;
#nvk h3{margin:18px 0 8px}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-card.opt{border-left-color:#14866d}&lt;br /&gt;
#nvk .nvk-card.rad{border-left-color:#fff;background:rgba(255,255,255,.08)}&lt;br /&gt;
#nvk .nvk-card b{display:block}&lt;br /&gt;
#nvk .nvk-links{margin-top:4px;font-weight:600}&lt;br /&gt;
#nvk .nvk-links a{margin-right:14px}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-miss{opacity:.8;font-style:italic}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-card .nvk-img{max-width:230px;max-height:150px}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-card.hl{border:2px solid #36c;border-left-width:8px;background:rgba(51,102,204,.12);padding:12px 14px}&lt;br /&gt;
#nvk .nvk-card.hl b{font-size:1.1em}&lt;br /&gt;
#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)}&lt;br /&gt;
#nvk .nvk-row label{flex:1;margin:0;min-width:240px}&lt;br /&gt;
#nvk .nvk-row a{white-space:nowrap;font-weight:600}&lt;br /&gt;
#nvk .nvk-img.wide{max-width:min(100%,460px);max-height:none}&lt;br /&gt;
#nvk #nvk-form{margin-top:22px}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk-lang&amp;quot; style=&amp;quot;text-align:right;margin-bottom:6px&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-grid&amp;quot; id=&amp;quot;nvk-fields&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;fieldset id=&amp;quot;nvk-optset&amp;quot;&amp;gt;&amp;lt;legend data-en=&amp;quot;Additional options&amp;quot;&amp;gt;Zusatzoptionen&amp;lt;/legend&amp;gt;&amp;lt;div id=&amp;quot;nvk-opts&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/fieldset&amp;gt;&lt;br /&gt;
&amp;lt;button type=&amp;quot;button&amp;quot; class=&amp;quot;nvk-btn&amp;quot; id=&amp;quot;nvk-reset&amp;quot; data-en=&amp;quot;Reset selection&amp;quot;&amp;gt;Auswahl zurücksetzen&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk-out&amp;quot; aria-live=&amp;quot;polite&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;fieldset id=&amp;quot;nvk-form&amp;quot; style=&amp;quot;display:none&amp;quot;&amp;gt;&amp;lt;legend data-en=&amp;quot;Send request&amp;quot;&amp;gt;Anfrage senden&amp;lt;/legend&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;nvk-help&amp;quot; data-en=&amp;quot;Your selection and the list above are sent automatically. All fields marked * are required.&amp;quot;&amp;gt;Deine Auswahl und die Liste oben werden automatisch mitgesendet. Alle Felder mit * sind Pflicht.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-grid&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-name&amp;quot;&amp;gt;Name *&amp;lt;/label&amp;gt;&amp;lt;input id=&amp;quot;nvk-name&amp;quot; type=&amp;quot;text&amp;quot; autocomplete=&amp;quot;name&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-mail&amp;quot; data-en=&amp;quot;Email *&amp;quot;&amp;gt;E-Mail *&amp;lt;/label&amp;gt;&amp;lt;input id=&amp;quot;nvk-mail&amp;quot; type=&amp;quot;email&amp;quot; autocomplete=&amp;quot;email&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-size&amp;quot; data-en=&amp;quot;Desired display size (optional)&amp;quot;&amp;gt;Gewünschte Displaygröße (optional)&amp;lt;/label&amp;gt;&amp;lt;select id=&amp;quot;nvk-size&amp;quot;&amp;gt;&amp;lt;option value=&amp;quot;&amp;quot; data-en=&amp;quot;No preference / advice wanted&amp;quot;&amp;gt;Keine Angabe / Beratung gewünscht&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;7&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;8.8&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;9&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;10.25&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;12.3&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;14.9&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option data-en=&amp;quot;Other size (please state in comment)&amp;quot;&amp;gt;Andere Größe (bitte im Kommentar nennen)&amp;lt;/option&amp;gt;&amp;lt;/select&amp;gt;&amp;lt;div class=&amp;quot;nvk-help&amp;quot; data-en=&amp;quot;Diagonal in inches. Not every size is available for every model - we will check this for you.&amp;quot;&amp;gt;Diagonale in Zoll. Nicht jede Größe gibt es für jede Baureihe, das prüfen wir für Dich.&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-vin&amp;quot; data-en=&amp;quot;VIN (optional)&amp;quot;&amp;gt;VIN oder FGN (optional)&amp;lt;/label&amp;gt;&amp;lt;input id=&amp;quot;nvk-vin&amp;quot; type=&amp;quot;text&amp;quot; maxlength=&amp;quot;17&amp;quot; placeholder=&amp;quot;AB12345 oder 17-stellige FGN&amp;quot; data-en-ph=&amp;quot;AB12345 or full 17-character VIN&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-msg&amp;quot; data-en=&amp;quot;Comment *&amp;quot;&amp;gt;Kommentar *&amp;lt;/label&amp;gt;&amp;lt;textarea id=&amp;quot;nvk-msg&amp;quot; rows=&amp;quot;4&amp;quot;&amp;gt;&amp;lt;/textarea&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot; style=&amp;quot;max-width:300px&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-cap&amp;quot; id=&amp;quot;nvk-capq&amp;quot;&amp;gt;Sicherheitsfrage *&amp;lt;/label&amp;gt;&amp;lt;input id=&amp;quot;nvk-cap&amp;quot; type=&amp;quot;text&amp;quot; inputmode=&amp;quot;numeric&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;input id=&amp;quot;nvk-hp&amp;quot; type=&amp;quot;text&amp;quot; tabindex=&amp;quot;-1&amp;quot; autocomplete=&amp;quot;off&amp;quot; aria-hidden=&amp;quot;true&amp;quot; style=&amp;quot;position:absolute;left:-9999px;width:1px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;label class=&amp;quot;nvk-o&amp;quot;&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; id=&amp;quot;nvk-dsgvo&amp;quot;&amp;gt; &amp;lt;span data-en=&amp;quot;I agree that my details may be processed by email to handle this request.&amp;quot;&amp;gt;Ich stimme zu, dass meine Angaben zur Bearbeitung der Anfrage per E-Mail verarbeitet werden.&amp;lt;/span&amp;gt;&amp;lt;span id=&amp;quot;nvk-dslink&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; *&amp;lt;/label&amp;gt;&lt;br /&gt;
&amp;lt;button type=&amp;quot;button&amp;quot; class=&amp;quot;nvk-btn&amp;quot; id=&amp;quot;nvk-send&amp;quot; data-en=&amp;quot;Send request&amp;quot;&amp;gt;Anfrage senden&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk-status&amp;quot; class=&amp;quot;nvk-note&amp;quot; style=&amp;quot;display:none&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/fieldset&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk-legal&amp;quot; class=&amp;quot;nvk-help&amp;quot; style=&amp;quot;margin-top:20px&amp;quot;&amp;gt;&amp;lt;b data-en=&amp;quot;Note:&amp;quot;&amp;gt;Hinweis:&amp;lt;/b&amp;gt; &amp;lt;span data-en=&amp;quot;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.&amp;quot;&amp;gt;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.&amp;lt;/span&amp;gt;&amp;lt;div id=&amp;quot;nvk-legal-links&amp;quot; style=&amp;quot;margin-top:4px&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;noscript&amp;gt;Für den Konfigurator wird JavaScript benötigt. / JavaScript is required for the configurator.&amp;lt;/noscript&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
(function () {&lt;br /&gt;
&amp;quot;use strict&amp;quot;;&lt;br /&gt;
/* =====================================================================&lt;br /&gt;
   KONFIGURATION - hier wird gepflegt.&lt;br /&gt;
   Textformat in Hinweisen: [b]fett[/b]  [br] Zeilenumbruch  [a=URL]Linktext[/a]&lt;br /&gt;
   Bitte im Skript KEIN kaufmännisches Und, kein Kleiner-/Größer-Zeichen&lt;br /&gt;
   und keine Leerzeilen verwenden (das Wiki wandelt sie um).&lt;br /&gt;
   ===================================================================== */&lt;br /&gt;
var SHOP = &amp;quot;https://shop.ibus-app.de/&amp;quot;;&lt;br /&gt;
var WIKI = &amp;quot;https://wiki.ibus-app.de/index.php?title=&amp;quot;;&lt;br /&gt;
/* Bilder aus dem Wiki (Thumbnail-Adressen; Klick öffnet automatisch das Originalbild) */&lt;br /&gt;
var IM = &amp;quot;https://xtrons.ibus-app.de/images/thumb/&amp;quot;;&lt;br /&gt;
var P = {&lt;br /&gt;
  schema:  IM + &amp;quot;e/ea/BMW_E39_Verl%C3%A4ngerungen_EXL005%2BFAKRA_.png/135px-BMW_E39_Verl%C3%A4ngerungen_EXL005%2BFAKRA_.png&amp;quot;,&lt;br /&gt;
  exl005:  IM + &amp;quot;7/70/Exl005-1.webp/257px-Exl005-1.webp.png&amp;quot;,&lt;br /&gt;
  fakra6m: IM + &amp;quot;d/d8/FM-extension_01_1.png/270px-FM-extension_01_1.png&amp;quot;,&lt;br /&gt;
  isofakra: IM + &amp;quot;4/4e/ISO-FAKRA_1.png/270px-ISO-FAKRA_1.png&amp;quot;,&lt;br /&gt;
  bm24:    IM + &amp;quot;8/82/BM24.png/130px-BM24.png&amp;quot;,&lt;br /&gt;
  iso:     IM + &amp;quot;d/dd/Iso.jpg/69px-Iso.jpg&amp;quot;,&lt;br /&gt;
  bm54:    IM + &amp;quot;3/34/BM54.png/135px-BM54.png&amp;quot;,&lt;br /&gt;
  fakra:   IM + &amp;quot;b/b3/Fakra.jpg/100px-Fakra.jpg&amp;quot;,&lt;br /&gt;
  pfeil:   IM + &amp;quot;e/ee/Navi_E46.jpg/239px-Navi_E46.jpg&amp;quot;,&lt;br /&gt;
  noquad:  IM + &amp;quot;6/68/No_elongation.jpg/180px-No_elongation.jpg&amp;quot;,&lt;br /&gt;
  noexl6:  IM + &amp;quot;7/7b/No_EXL006.jpg/180px-No_EXL006.jpg&amp;quot;,&lt;br /&gt;
  halter:  IM + &amp;quot;3/3b/Halter_Alu.webp/92px-Halter_Alu.webp.png&amp;quot;,&lt;br /&gt;
  deepobd: &amp;quot;https://xtrons.ibus-app.de/images/d/d4/DeepOBD_Interface_1.png&amp;quot;,&lt;br /&gt;
  n43:     IM + &amp;quot;e/e4/Navi4_3.jpg/240px-Navi4_3.jpg&amp;quot;,&lt;br /&gt;
  n169:    IM + &amp;quot;8/8a/Navi16_9.jpg/240px-Navi16_9.jpg&amp;quot;,&lt;br /&gt;
  radio:   IM + &amp;quot;9/96/E39_Radio.jpg/240px-E39_Radio.jpg&amp;quot;,&lt;br /&gt;
  idrive:  &amp;quot;https://xtrons.ibus-app.de/images/0/02/MASK-CCC-CIC-NBT-EVO-iDrive.jpg&amp;quot;,&lt;br /&gt;
  iris:    &amp;quot;https://xtrons.ibus-app.de/images/b/be/BusinessKas_IRISG.jpg&amp;quot;,&lt;br /&gt;
  resler:  &amp;quot;https://xtrons.ibus-app.de/images/d/d1/Resler_Modul_01.png&amp;quot;,&lt;br /&gt;
  can:     &amp;quot;https://xtrons.ibus-app.de/images/6/69/CAN_Interface.png&amp;quot;,&lt;br /&gt;
  funktr:  IM + &amp;quot;7/7e/E46_Funktionstraeger.png/240px-E46_Funktionstraeger.png&amp;quot;&lt;br /&gt;
};&lt;br /&gt;
/* Anfrage-Formular: MAIL_TO = Empfänger. SEND_URL leer = E-Mail-Programm des Kunden öffnen (mailto).&lt;br /&gt;
   SEND_URL = Adresse des Server-Skripts send-anfrage.php = Versand direkt vom Server (mit CC an den Kunden). */&lt;br /&gt;
var MAIL_TO = &amp;quot;info@ibus-app.de&amp;quot;;&lt;br /&gt;
var MAIL_SUBJECT = &amp;quot;Anfrage aus Android Radio Konfigurator&amp;quot;;&lt;br /&gt;
var SEND_URL = &amp;quot;https://xtrons.ibus-app.de/send-anfrage.php&amp;quot;;&lt;br /&gt;
/* Shop-Anbindung: API = radios.php (liefert Radio-Liste und Artikelnummern). Warenkorb = Shopware-Link pro Artikelnummer. */&lt;br /&gt;
var API = &amp;quot;https://xtrons.ibus-app.de/radios.php&amp;quot;;&lt;br /&gt;
/* 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. */&lt;br /&gt;
var CART_TRANSFER = true;&lt;br /&gt;
/* 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. */&lt;br /&gt;
var CART_CLEAR = true;&lt;br /&gt;
/* Ziel der Übergabe: Shop-Controller aus Plugin 1.1.0 (serverseitig, unabhängig vom Browser-Cache).&lt;br /&gt;
   Älterer Weg über das Theme-Skript: var TRANSFER_URL = CART + &amp;quot;?nvk=&amp;quot;;  */&lt;br /&gt;
var TRANSFER_URL = &amp;quot;https://shop.ibus-app.de/nvk?add=&amp;quot;;&lt;br /&gt;
/* ---- Sprache / English ----------------------------------------------------&lt;br /&gt;
   DEFAULT_LANG: de oder en. Umschalten per Knopf DE/EN oder per Adresse ?uselang=en                     */&lt;br /&gt;
var DEFAULT_LANG = &amp;quot;de&amp;quot;;&lt;br /&gt;
var SHOP_EN = &amp;quot;https://shop.ibus-app.de/en/&amp;quot;;&lt;br /&gt;
var TRANSFER_URL_EN = SHOP_EN + &amp;quot;nvk?add=&amp;quot;;&lt;br /&gt;
var MAIL_SUBJECT_EN = &amp;quot;Request from Android Radio Configurator&amp;quot;;&lt;br /&gt;
/* Rechtliche Seiten EN (fehlt ein Eintrag, wird der deutsche Link genommen) */&lt;br /&gt;
var LEGAL_EN = { agb: SHOP_EN + &amp;quot;general-terms-and-conditions&amp;quot;, widerruf: SHOP_EN + &amp;quot;revocation-right&amp;quot;, datenschutz: SHOP_EN + &amp;quot;privacy-policy&amp;quot; };&lt;br /&gt;
var CART = &amp;quot;https://shop.ibus-app.de/checkout/cart&amp;quot;;&lt;br /&gt;
/* Rechtliche Seiten (Links unter dem Konfigurator und beim Datenschutz-Haken). Leer = Link wird nicht angezeigt. */&lt;br /&gt;
var LEGAL = { agb: &amp;quot;https://shop.ibus-app.de/allgemeine-geschaeftsbedingungen&amp;quot;, widerruf: &amp;quot;https://shop.ibus-app.de/widerrufsrecht&amp;quot;, datenschutz: &amp;quot;https://shop.ibus-app.de/datenschutz&amp;quot; };&lt;br /&gt;
/* ---- 1) Baureihen --------------------------------------------------------&lt;br /&gt;
   v = Shop-Kategorie (Link: SHOP + bmw-radios/ + v + /)&lt;br /&gt;
   gen: alt = I-BUS-Fahrzeuge (E38/E39/E46/E53/E83)&lt;br /&gt;
        b   = M-ASK / CCC / CIC     c = CIC / NBT / NBT EVO&lt;br /&gt;
   body = Karosserieformen (siehe BODY)                                      */&lt;br /&gt;
var BODY = { limo: &amp;quot;Limousine&amp;quot;, touring: &amp;quot;Touring&amp;quot;, coupe: &amp;quot;Coupé&amp;quot;, cabrio: &amp;quot;Cabrio&amp;quot;, schraeg: &amp;quot;Schrägheck&amp;quot;,&lt;br /&gt;
  compact: &amp;quot;Compact&amp;quot;, gt: &amp;quot;Gran Turismo&amp;quot;, gc: &amp;quot;Gran Coupé&amp;quot;, suv: &amp;quot;SUV / SAV&amp;quot;, roadster: &amp;quot;Roadster&amp;quot; };&lt;br /&gt;
var BODY_EN = { limo: &amp;quot;Sedan&amp;quot;, touring: &amp;quot;Touring (wagon)&amp;quot;, coupe: &amp;quot;Coupe&amp;quot;, cabrio: &amp;quot;Convertible&amp;quot;, schraeg: &amp;quot;Hatchback&amp;quot;,&lt;br /&gt;
  compact: &amp;quot;Compact&amp;quot;, gt: &amp;quot;Gran Turismo&amp;quot;, gc: &amp;quot;Gran Coupe&amp;quot;, suv: &amp;quot;SUV / SAV&amp;quot;, roadster: &amp;quot;Roadster&amp;quot; };&lt;br /&gt;
function vname(x) { return LANG === &amp;quot;en&amp;quot; ? x.t.replace(/^(\d)er /, &amp;quot;$1 Series &amp;quot;) : x.t; }&lt;br /&gt;
function enSlug(v) { return v.replace(/^(\d)er-/, &amp;quot;$1-series-&amp;quot;); }&lt;br /&gt;
var VEHICLES = [&lt;br /&gt;
  { v: &amp;quot;1er-e8x&amp;quot;, t: &amp;quot;1er E8x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;schraeg,coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;1er-f2x&amp;quot;, t: &amp;quot;1er F2x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;schraeg&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;2er-f2x&amp;quot;, t: &amp;quot;2er F2x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;3er-e46&amp;quot;, t: &amp;quot;3er E46&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;limo,touring,coupe,cabrio,compact&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;3er-e9x&amp;quot;, t: &amp;quot;3er E9x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;limo,touring,coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;3er-f3x&amp;quot;, t: &amp;quot;3er F3x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;limo,touring,gt&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;4er-f3x&amp;quot;, t: &amp;quot;4er F3x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;coupe,cabrio,gc&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;5er-e39&amp;quot;, t: &amp;quot;5er E39&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;limo,touring&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;5er-e6x&amp;quot;, t: &amp;quot;5er E6x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;limo,touring&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;5er-f1x&amp;quot;, t: &amp;quot;5er F1x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;limo,touring,gt&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;6er-e6x&amp;quot;, t: &amp;quot;6er E6x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;7er-e38&amp;quot;, t: &amp;quot;7er E38&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;limo&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;7er-e65&amp;quot;, t: &amp;quot;7er E65&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;limo&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;7er-f01&amp;quot;, t: &amp;quot;7er F01&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;limo&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x1-e84&amp;quot;, t: &amp;quot;X1 E84&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x1-f48&amp;quot;, t: &amp;quot;X1 F48&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x3-e83&amp;quot;, t: &amp;quot;X3 E83&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x3-f25&amp;quot;, t: &amp;quot;X3 F25&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x5-e53&amp;quot;, t: &amp;quot;X5 E53&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x5-e70&amp;quot;, t: &amp;quot;X5 E70&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x5-f15&amp;quot;, t: &amp;quot;X5 F15&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x6-e71&amp;quot;, t: &amp;quot;X6 E71&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;z4-e85e86&amp;quot;, t: &amp;quot;Z4 E85/E86&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;roadster,coupe&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;z4-e89&amp;quot;, t: &amp;quot;Z4 E89&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;roadster&amp;quot;, noCat: true }&lt;br /&gt;
];&lt;br /&gt;
/* Fahrzeuge mit K-CAN App (Beta) */&lt;br /&gt;
var KCAN = [&amp;quot;1er-e8x&amp;quot;, &amp;quot;3er-e9x&amp;quot;, &amp;quot;5er-e6x&amp;quot;, &amp;quot;6er-e6x&amp;quot;, &amp;quot;7er-e65&amp;quot;, &amp;quot;x1-e84&amp;quot;, &amp;quot;x5-e70&amp;quot;, &amp;quot;x6-e71&amp;quot;, &amp;quot;z4-e89&amp;quot;];&lt;br /&gt;
var bodyValues = Object.keys(BODY).map(function (k) {&lt;br /&gt;
  return { v: k, t: BODY[k], t_en: BODY_EN[k], only: { vehicle: VEHICLES.filter(function (x) { return x.body.split(&amp;quot;,&amp;quot;).indexOf(k) !== -1; }).map(function (x) { return x.v; }) } };&lt;br /&gt;
});&lt;br /&gt;
/* ---- 2) Auswahlfelder ------------------------------------------------------&lt;br /&gt;
   only = Wert nur anbieten, wenn Bedingung passt   show = Feld nur dann zeigen&lt;br /&gt;
   optional = muss nicht gewählt werden             auto = bei nur einem Wert vorwählen */&lt;br /&gt;
var FIELDS = [&lt;br /&gt;
  { id: &amp;quot;vehicle&amp;quot;, label: &amp;quot;Fahrzeug&amp;quot;, label_en: &amp;quot;Vehicle&amp;quot;, values: VEHICLES.map(function (x) { return { v: x.v, t: &amp;quot;BMW &amp;quot; + x.t, t_en: &amp;quot;BMW &amp;quot; + x.t.replace(/^(\d)er /, &amp;quot;$1 Series &amp;quot;) }; }) },&lt;br /&gt;
  { id: &amp;quot;factory&amp;quot;, label: &amp;quot;Verbaut ab Werk&amp;quot;, label_en: &amp;quot;Factory-fitted system&amp;quot;,&lt;br /&gt;
    pre: { when: { gen: [&amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;] }, html: &amp;quot;[b]So erkennst Du Dein System:[/b][br][imgw=&amp;quot; + P.idrive + &amp;quot;]&amp;quot;, html_en: &amp;quot;[b]How to identify your system:[/b][br][imgw=&amp;quot; + P.idrive + &amp;quot;]&amp;quot; }, values: [&lt;br /&gt;
    { v: &amp;quot;iris&amp;quot;,  t: &amp;quot;Radio mit IRIS&amp;quot;, t_en: &amp;quot;Radio with IRIS&amp;quot;, only: { vehicle: [&amp;quot;3er-e46&amp;quot;, &amp;quot;5er-e39&amp;quot;, &amp;quot;7er-e38&amp;quot;, &amp;quot;x5-e53&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.iris + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;mid&amp;quot;,   t: &amp;quot;Radio mit MID&amp;quot;,  t_en: &amp;quot;Radio with MID&amp;quot;, only: { gen: [&amp;quot;alt&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.radio + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;n43&amp;quot;,   t: &amp;quot;4:3 Navi&amp;quot;,       t_en: &amp;quot;4:3 navi&amp;quot;, only: { vehicle: [&amp;quot;5er-e39&amp;quot;, &amp;quot;7er-e38&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.n43 + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;n169&amp;quot;,  t: &amp;quot;16:9 Navi&amp;quot;,      t_en: &amp;quot;16:9 navi&amp;quot;, only: { gen: [&amp;quot;alt&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.n169 + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;pfeil&amp;quot;, t: &amp;quot;Pfeilnavi&amp;quot;,      t_en: &amp;quot;Arrow navi&amp;quot;, only: { vehicle: [&amp;quot;3er-e46&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.pfeil + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;mask&amp;quot;,  t: &amp;quot;M-ASK&amp;quot;,          only: { gen: [&amp;quot;b&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;ccc&amp;quot;,   t: &amp;quot;CCC&amp;quot;,            only: { gen: [&amp;quot;b&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;cic&amp;quot;,   t: &amp;quot;CIC&amp;quot;,            only: { gen: [&amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;nbt&amp;quot;,   t: &amp;quot;NBT&amp;quot;,            only: { gen: [&amp;quot;c&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;nbtevo&amp;quot;, t: &amp;quot;NBT EVO&amp;quot;,       only: { gen: [&amp;quot;c&amp;quot;] } } ] },&lt;br /&gt;
  { id: &amp;quot;trunk&amp;quot;, label: &amp;quot;Wo sitzt das Radiomodul des Pfeilnavis?&amp;quot;, label_en: &amp;quot;Where is the radio module of the arrow navi?&amp;quot;, optional: true, show: { factory: [&amp;quot;pfeil&amp;quot;] },&lt;br /&gt;
    help: &amp;quot;Bitte prüfen: Sitzt das Modul im Kofferraum, oder im Pfeilnavi selbst (Quadlock hinten neben dem Antennenstecker)?[br][img=&amp;quot; + P.pfeil + &amp;quot;]&amp;quot;,&lt;br /&gt;
    help_en: &amp;quot;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=&amp;quot; + P.pfeil + &amp;quot;]&amp;quot;,&lt;br /&gt;
    values: [&lt;br /&gt;
    { v: &amp;quot;ja&amp;quot;, t: &amp;quot;Im Kofferraum (Verlängerungen nötig)&amp;quot;, t_en: &amp;quot;In the trunk (extensions required)&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;nein&amp;quot;, t: &amp;quot;Im Pfeilnavi, Quadlock hinten (keine Verlängerung)&amp;quot;, t_en: &amp;quot;In the arrow navi, Quadlock at the back (no extension)&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;unk&amp;quot;, t: &amp;quot;Weiß ich nicht&amp;quot;, t_en: &amp;quot;I don't know&amp;quot; } ] },&lt;br /&gt;
  { id: &amp;quot;aux&amp;quot;, label: &amp;quot;AUX-IN verfügbar?&amp;quot;, label_en: &amp;quot;AUX-IN available?&amp;quot;, show: { gen: [&amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;] }, values: [&lt;br /&gt;
    { v: &amp;quot;ja&amp;quot;, t: &amp;quot;Ja&amp;quot;, t_en: &amp;quot;Yes&amp;quot; }, { v: &amp;quot;nein&amp;quot;, t: &amp;quot;Nein&amp;quot;, t_en: &amp;quot;No&amp;quot; } ] },&lt;br /&gt;
  { id: &amp;quot;sound&amp;quot;, label: &amp;quot;Soundsystem&amp;quot;, label_en: &amp;quot;Sound system&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;stereo&amp;quot;, t: &amp;quot;Stereo&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;hifi&amp;quot;,   t: &amp;quot;Hifi&amp;quot;, t_en: &amp;quot;Hi-Fi&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;dsp&amp;quot;,    t: &amp;quot;DSP&amp;quot;, only: { vehicle: [&amp;quot;7er-e38&amp;quot;, &amp;quot;5er-e39&amp;quot;, &amp;quot;x5-e53&amp;quot;, &amp;quot;x3-e83&amp;quot;] }, info: &amp;quot;[a=&amp;quot; + WIKI + &amp;quot;Habe_ich_DSP%3F]Habe ich DSP?[/a]&amp;quot;, info_en: &amp;quot;[a=&amp;quot; + WIKI + &amp;quot;Habe_ich_DSP%3F]Do I have DSP?[/a]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;hk&amp;quot;,     t: &amp;quot;Harman Kardon&amp;quot;, only: { vehicle: [&amp;quot;3er-e46&amp;quot;, &amp;quot;z4-e85e86&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;logic7&amp;quot;, t: &amp;quot;Logic7&amp;quot;, only: { vehicle: [&amp;quot;3er-e9x&amp;quot;, &amp;quot;5er-e6x&amp;quot;, &amp;quot;6er-e6x&amp;quot;, &amp;quot;7er-e65&amp;quot;, &amp;quot;1er-e8x&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;hksur&amp;quot;,  t: &amp;quot;Harman Kardon Surround&amp;quot;, only: { vehicle: [&amp;quot;1er-f2x&amp;quot;, &amp;quot;2er-f2x&amp;quot;, &amp;quot;3er-f3x&amp;quot;, &amp;quot;4er-f3x&amp;quot;, &amp;quot;5er-f1x&amp;quot;] } } ] },&lt;br /&gt;
  { id: &amp;quot;current&amp;quot;, label: &amp;quot;Aktuell verbaut&amp;quot;, label_en: &amp;quot;Currently installed&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;werk&amp;quot;, t: &amp;quot;Werksradio / Werksnavi&amp;quot;, t_en: &amp;quot;Factory radio / factory navi&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;nach&amp;quot;, t: &amp;quot;Nachrüst-Radio / -Navi&amp;quot;, t_en: &amp;quot;Aftermarket radio / navi&amp;quot; } ] },&lt;br /&gt;
  { id: &amp;quot;body&amp;quot;, label: &amp;quot;Karosserie&amp;quot;, label_en: &amp;quot;Body type&amp;quot;, auto: true, values: bodyValues },&lt;br /&gt;
  { id: &amp;quot;ant&amp;quot;, label: &amp;quot;Antennenstecker am Radio (optional)&amp;quot;, label_en: &amp;quot;Antenna connector on the radio (optional)&amp;quot;, optional: true, def: &amp;quot;unk&amp;quot;,&lt;br /&gt;
    show: { vehicle: [&amp;quot;7er-e38&amp;quot;, &amp;quot;5er-e39&amp;quot;, &amp;quot;3er-e46&amp;quot;, &amp;quot;x5-e53&amp;quot;] },&lt;br /&gt;
    values: [&lt;br /&gt;
    { v: &amp;quot;unk&amp;quot;,   t: &amp;quot;Weiß ich nicht&amp;quot;, t_en: &amp;quot;I don't know&amp;quot;,&lt;br /&gt;
      info: &amp;quot;[b]BM24[/b] (Rundpin) = ISO-Antennenstecker:[br][img=&amp;quot; + P.bm24 + &amp;quot;][img=&amp;quot; + P.iso + &amp;quot;][br][b]BM54[/b] = FAKRA:[br][img=&amp;quot; + P.bm54 + &amp;quot;][img=&amp;quot; + P.fakra + &amp;quot;]&amp;quot;,&lt;br /&gt;
      info_en: &amp;quot;[b]BM24[/b] (round pin) = ISO antenna connector:[br][img=&amp;quot; + P.bm24 + &amp;quot;][img=&amp;quot; + P.iso + &amp;quot;][br][b]BM54[/b] = FAKRA:[br][img=&amp;quot; + P.bm54 + &amp;quot;][img=&amp;quot; + P.fakra + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;iso&amp;quot;,   t: &amp;quot;ISO (BM24, Rundpin)&amp;quot;, t_en: &amp;quot;ISO (BM24, round pin)&amp;quot;, info: &amp;quot;[img=&amp;quot; + P.bm24 + &amp;quot;][img=&amp;quot; + P.iso + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;fakra&amp;quot;, t: &amp;quot;FAKRA (BM54)&amp;quot;, info: &amp;quot;[img=&amp;quot; + P.bm54 + &amp;quot;][img=&amp;quot; + P.fakra + &amp;quot;]&amp;quot; } ] }&lt;br /&gt;
];&lt;br /&gt;
/* ---- 3) Zusatzoptionen (Mehrfachauswahl) ---------------------------------&lt;br /&gt;
   show = nur sichtbar wenn Bedingung passt   requires = nur sichtbar wenn diese Optionen gewählt sind&lt;br /&gt;
   excl = Optionen derselben Gruppe schließen sich aus   items = Artikel aus ITEMS&lt;br /&gt;
   Englisch: Felder mit Endung _en (t_en, sub_en, ...). Fehlt ein _en-Feld, wird der deutsche Text gezeigt. */&lt;br /&gt;
var OPTS = [&lt;br /&gt;
  { id: &amp;quot;halter&amp;quot;,  t: &amp;quot;Radio-Halter&amp;quot;, t_en: &amp;quot;Radio holder&amp;quot;, sub: &amp;quot;nur BMW E39&amp;quot;, sub_en: &amp;quot;BMW E39 only&amp;quot;, show: { vehicle: [&amp;quot;5er-e39&amp;quot;] }, items: [&amp;quot;halter&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;ibus&amp;quot;,    t: &amp;quot;I-BUS App&amp;quot;, show: { gen: [&amp;quot;alt&amp;quot;] }, items: [&amp;quot;ibus&amp;quot;, &amp;quot;resler&amp;quot;, &amp;quot;bclic&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;deepobd&amp;quot;, t: &amp;quot;DeepOBD (Diagnose)&amp;quot;, t_en: &amp;quot;DeepOBD (diagnostics)&amp;quot;, items: [&amp;quot;deepobd&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;can&amp;quot;,     t: &amp;quot;CAN Interface&amp;quot;, sub: &amp;quot;Addon - nur mit I-BUS App&amp;quot;, sub_en: &amp;quot;Add-on - only with I-BUS App&amp;quot;, show: { gen: [&amp;quot;alt&amp;quot;] }, requires: [&amp;quot;ibus&amp;quot;], items: [&amp;quot;can&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;kcan&amp;quot;,    t: &amp;quot;K-CAN App (Beta)&amp;quot;, sub: &amp;quot;Pendant zur I-BUS App&amp;quot;, sub_en: &amp;quot;Counterpart to the I-BUS App&amp;quot;, show: { vehicle: KCAN }, items: [&amp;quot;kcan&amp;quot;, &amp;quot;kcanlic&amp;quot;, &amp;quot;can&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;tpms&amp;quot;,    t: &amp;quot;TPMS (Reifendruck)&amp;quot;, t_en: &amp;quot;TPMS (tire pressure)&amp;quot;, items: [&amp;quot;tpms&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;dab1&amp;quot;,    t: &amp;quot;DAB+ (Single Receiver)&amp;quot;, excl: &amp;quot;dab&amp;quot;, items: [&amp;quot;dab1&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;dab2&amp;quot;,    t: &amp;quot;DAB+ (Dual Receiver)&amp;quot;,   excl: &amp;quot;dab&amp;quot;, items: [&amp;quot;dab2&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;rcam&amp;quot;,    t: &amp;quot;Rückfahrkamera&amp;quot;, t_en: &amp;quot;Rear-view camera&amp;quot;, items: [&amp;quot;rcam&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;fcam&amp;quot;,    t: &amp;quot;Front-Kamera&amp;quot;, t_en: &amp;quot;Front camera&amp;quot;, items: [&amp;quot;fcam&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;tool&amp;quot;,    t: &amp;quot;Einbau-Werkzeug (Kunststoffheber)&amp;quot;, t_en: &amp;quot;Installation tool (plastic pry tool)&amp;quot;, items: [&amp;quot;tool&amp;quot;] }&lt;br /&gt;
];&lt;br /&gt;
/* Erzwungene Optionen (werden automatisch gesetzt und gesperrt) */&lt;br /&gt;
var FORCED = [&lt;br /&gt;
  { when: { sound: [&amp;quot;dsp&amp;quot;] }, opts: [&amp;quot;ibus&amp;quot;], why: &amp;quot;wegen DSP erforderlich&amp;quot;, why_en: &amp;quot;required because of DSP&amp;quot; }&lt;br /&gt;
];&lt;br /&gt;
/* ---- 4) Artikel ------------------------------------------------------------&lt;br /&gt;
   u = Shop-Link DE, ue = Shop-Link EN (leer = wie DE)   ut/wt = Linktexte   w = Wiki-Link   leer = kein Link&lt;br /&gt;
   skipIf = Artikel entfällt, wenn der genannte Artikel schon in der Liste steht&lt;br /&gt;
   Die Lizenzen sind im EN-Shop andere Artikel (BC = OBC): ue zeigt auf den EN-Artikel. */&lt;br /&gt;
var ITEMS = {&lt;br /&gt;
  exl005:  { t: &amp;quot;Verlängerung EXL005&amp;quot;, t_en: &amp;quot;Extension EXL005&amp;quot;, d: &amp;quot;Ersetzt das Radiomodul im Kofferraum.&amp;quot;, d_en: &amp;quot;Replaces the radio module in the trunk.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;detail/index/sArticle/212/&amp;quot;, ue: SHOP_EN + &amp;quot;accessories-for-head-units/adapter-elongations/212/bmw-radio-extension-6-meters-exl005&amp;quot;, img: [P.exl005, P.schema] },&lt;br /&gt;
  fakra6m: { t: &amp;quot;Verlängerung 6 m FAKRA(m) auf FAKRA(f), gewinkelt&amp;quot;, t_en: &amp;quot;Extension 6 m FAKRA(m) to FAKRA(f), angled&amp;quot;,&lt;br /&gt;
             d: &amp;quot;Antennenverlängerung vom Kofferraum nach vorn.&amp;quot;, d_en: &amp;quot;Antenna extension from the trunk to the front.&amp;quot;, img: [P.fakra6m],&lt;br /&gt;
             u: SHOP + &amp;quot;shop/zubehoer/adapterkabel/192/verlaengerung-6m-fakra-m-auf-fakra-f-kurz-gewinkelt&amp;quot;,&lt;br /&gt;
             ue: SHOP_EN + &amp;quot;i-bus-app/accessories/cable-adapters/192/extension-6m-fakra-m-to-fakra-f-short-angled&amp;quot; },&lt;br /&gt;
  isoada:  { t: &amp;quot;Adapter ISO-Stecker auf FAKRA, gewinkelt (15 cm)&amp;quot;, t_en: &amp;quot;Adapter ISO plug to FAKRA, angled (15 cm)&amp;quot;,&lt;br /&gt;
             d: &amp;quot;Nötig bei ISO-Antennenstecker (BM24, Rundpin).&amp;quot;, d_en: &amp;quot;Required with an ISO antenna connector (BM24, round pin).&amp;quot;, img: [P.isofakra],&lt;br /&gt;
             u: SHOP + &amp;quot;shop/zubehoer/adapterkabel/193/adapter-kabel-iso-f-auf-fakra-f-kurz-gewinkelt-15cm&amp;quot;,&lt;br /&gt;
             ue: SHOP_EN + &amp;quot;i-bus-app/accessories/cable-adapters/193/adapter-cable-iso-f-to-fakra-f-short-angled-15cm&amp;quot; },&lt;br /&gt;
  bcdsp:   { t: &amp;quot;I-BUS App - BC+DSP Lizenz&amp;quot;, t_en: &amp;quot;I-BUS App - OBC+DSP License&amp;quot;,&lt;br /&gt;
             d: &amp;quot;Ohne DSP-Lizenz arbeitet das Werks-DSP nicht.&amp;quot;, d_en: &amp;quot;Without the DSP license the factory DSP will not work.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/lizenzen/171/i-bus-app-bc-dsp-lizenz&amp;quot;, ue: SHOP_EN + &amp;quot;i-bus-app/licenses/172/i-bus-app-obc-dsp-license&amp;quot;,&lt;br /&gt;
             w: WIKI + &amp;quot;Habe_ich_DSP%3F&amp;quot;, wt: &amp;quot;Wiki: Habe ich DSP?&amp;quot;, wt_en: &amp;quot;Wiki: Do I have DSP?&amp;quot; },&lt;br /&gt;
  halter:  { t: &amp;quot;Alu-Halter zur Radio-Montage im BMW E39&amp;quot;, t_en: &amp;quot;Alu holder for radio installation in BMW E39&amp;quot;,&lt;br /&gt;
             d: &amp;quot;Empfohlen bei Radios, die nicht von AVIN stammen.&amp;quot;, d_en: &amp;quot;Recommended for radios not made by AVIN.&amp;quot;, img: [P.halter],&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/radiohalter/185/alu-halter-zur-radio-montage-im-bmw-e39&amp;quot;,&lt;br /&gt;
             ue: SHOP_EN + &amp;quot;i-bus-app/accessories/fittings-for-radio/185/fittings-for-radio-in-bmw-e39&amp;quot; },&lt;br /&gt;
  ibus:    { t: &amp;quot;I-BUS App&amp;quot;, hl: true,&lt;br /&gt;
             d: &amp;quot;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.&amp;quot;,&lt;br /&gt;
             d_en: &amp;quot;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.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;cat/index/sCategory/42&amp;quot;, ue: SHOP_EN + &amp;quot;cat/index/sCategory/45&amp;quot;,&lt;br /&gt;
             links: [&lt;br /&gt;
               { u: WIKI + &amp;quot;Was_brauche_ich_um_die_I-BUS_App_nutzen_zu_k%C3%B6nnen%3F&amp;quot;, t: &amp;quot;Wiki: Was brauche ich für die I-BUS App?&amp;quot;, t_en: &amp;quot;Wiki: What do I need for the I-BUS App?&amp;quot;, ue: WIKI + &amp;quot;What_do_I_need_to_use_the_I-BUS_app%3F&amp;quot; },&lt;br /&gt;
               { u: WIKI + &amp;quot;Funktionen&amp;quot;, t: &amp;quot;Liste aller I-BUS App Funktionen (BMW E38|E39|E46|E53|E83)&amp;quot;, t_en: &amp;quot;List of all I-BUS App functions (BMW E38|E39|E46|E53|E83)&amp;quot; },&lt;br /&gt;
               { u: WIKI + &amp;quot;Was_geht_beim_BMW_E46_nicht&amp;quot;, t: &amp;quot;Was geht beim BMW E46, E83, E85,.. nicht? (da werkseitig nicht verbaut)&amp;quot;, t_en: &amp;quot;What does not work on BMW E46, E83, E85,..? (not fitted at the factory)&amp;quot; },&lt;br /&gt;
               { u: WIKI + &amp;quot;Funktionseinschr%C3%A4nkungen_nach_Baujahr/Ausstattung/Modell&amp;quot;, t: &amp;quot;Funktionseinschränkungen nach Baujahr/Ausstattung/Modell&amp;quot;, t_en: &amp;quot;Function restrictions by year / equipment / model&amp;quot; } ] },&lt;br /&gt;
  resler:  { t: &amp;quot;Resler USB I-BUS Modul inkl. Anschlusskabel&amp;quot;, t_en: &amp;quot;Resler USB I-BUS module incl. cable&amp;quot;,&lt;br /&gt;
             d: &amp;quot;Verbindet I-BUS App und Fahrzeug.&amp;quot;, d_en: &amp;quot;Connects the I-BUS App and the vehicle.&amp;quot;, img: [P.resler],&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/interfaces-module/191/resler-usb-i-bus-modul-inkl.-anschlusskabel&amp;quot;,&lt;br /&gt;
             ue: SHOP_EN + &amp;quot;i-bus-app/accessories/interfaces-modules/191/resler-usb-i-bus-module-incl.-cable&amp;quot;,&lt;br /&gt;
             w: &amp;quot;https://wiki.ibus-app.de/index.php?title=Hauptseite#Einbauanleitung_f.C3.BCr_Resler_Modul_und_Resler_Interface&amp;quot;, wt: &amp;quot;Einbauanleitung Resler Modul&amp;quot;, wt_en: &amp;quot;Installation guide Resler module&amp;quot; },&lt;br /&gt;
  bclic:   { t: &amp;quot;I-BUS App - BC Lizenz&amp;quot;, t_en: &amp;quot;I-BUS App - OBC License&amp;quot;, d: &amp;quot;Schaltet u. a. die BC-Daten der App frei.&amp;quot;, d_en: &amp;quot;Unlocks e.g. the OBC data of the app.&amp;quot;, skipIf: &amp;quot;bcdsp&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/lizenzen/167/i-bus-app-bc-lizenz&amp;quot;, ue: SHOP_EN + &amp;quot;i-bus-app/licenses/173/i-bus-app-obc-license&amp;quot;, sku_en: &amp;quot;App04&amp;quot; },&lt;br /&gt;
  deepobd: { t: &amp;quot;Deep OBD OBD-II Bluetooth-Adapter&amp;quot;, t_en: &amp;quot;Deep OBD OBD-II Bluetooth adapter&amp;quot;,&lt;br /&gt;
             d: &amp;quot;Live-Werte auslesen, Fehler lesen und löschen.&amp;quot;, d_en: &amp;quot;Read live values, read and clear fault codes.&amp;quot;, img: [P.deepobd],&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/interfaces-module/258/deep-obd-obd-ii-bluetooth-adapter?c=54&amp;quot;,&lt;br /&gt;
             ue: SHOP_EN + &amp;quot;i-bus-app/accessories/interfaces-modules/258/deep-obd-obd-ii-bluetooth-adapter&amp;quot;,&lt;br /&gt;
             w: &amp;quot;https://xtrons.ibus-app.de/index.php?title=DeepOBD_-_Adapter_und_App_einrichten&amp;quot;, wt: &amp;quot;Wiki: DeepOBD einrichten&amp;quot;, wt_en: &amp;quot;Wiki: Setting up DeepOBD&amp;quot; },&lt;br /&gt;
  can:     { t: &amp;quot;CAN-Bus Interface inkl. Anschlusskabel&amp;quot;, t_en: &amp;quot;CAN bus interface incl. connection cable&amp;quot;,&lt;br /&gt;
             d: &amp;quot;Addon, funktioniert nur zusammen mit der I-BUS App bzw. der K-CAN App.&amp;quot;, d_en: &amp;quot;Add-on, only works together with the I-BUS App or the K-CAN App.&amp;quot;, img: [P.can],&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/interfaces-module/346/can-bus-interface-inkl.-anschlusskabel&amp;quot;,&lt;br /&gt;
             ue: SHOP_EN + &amp;quot;i-bus-app/accessories/interfaces-modules/346/can-bus-interface-incl.-connection-cable&amp;quot;,&lt;br /&gt;
             w: WIKI + &amp;quot;Einbauanleitung_CAN-Bus_Interface&amp;quot;, wt: &amp;quot;Einbauanleitung CAN-Bus Interface&amp;quot;, wt_en: &amp;quot;Installation guide CAN bus interface&amp;quot; },&lt;br /&gt;
  kcan:    { t: &amp;quot;K-CAN App (Beta)&amp;quot;, d: &amp;quot;Pendant zur I-BUS App für Fahrzeuge mit K-CAN, aktuell als Betaversion.&amp;quot;,&lt;br /&gt;
             d_en: &amp;quot;Counterpart to the I-BUS App for vehicles with K-CAN, currently in beta.&amp;quot;,&lt;br /&gt;
             w: &amp;quot;https://wiki.kcan-app.de/&amp;quot;, wt: &amp;quot;Wiki zur K-CAN App&amp;quot;, wt_en: &amp;quot;K-CAN App wiki&amp;quot; },&lt;br /&gt;
  kcanlic: { t: &amp;quot;K-CAN App - Lizenz Betaversion&amp;quot;, t_en: &amp;quot;K-CAN App - License Beta Version&amp;quot;, d: &amp;quot;Beta-Lizenz für die K-CAN App.&amp;quot;, d_en: &amp;quot;Beta license for the K-CAN App.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/lizenzen/358/k-can-app-lizenz-betaversion&amp;quot;, ue: SHOP_EN + &amp;quot;i-bus-app/licenses/358/k-can-app-license-beta-version&amp;quot; },&lt;br /&gt;
  tpms:    { t: &amp;quot;TPMS - Reifendruckkontrolle&amp;quot;, t_en: &amp;quot;TPMS - tire pressure monitoring&amp;quot;, d: &amp;quot;&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/tpms/&amp;quot;, ue: SHOP_EN + &amp;quot;accessories-for-head-units/tpms/&amp;quot; },&lt;br /&gt;
  dab1:    { t: &amp;quot;DAB+ Empfänger inkl. Antenne (Single)&amp;quot;, t_en: &amp;quot;DAB+ receiver incl. antenna (single)&amp;quot;, d: &amp;quot;&amp;quot;,&lt;br /&gt;
             w: &amp;quot;https://xtrons.ibus-app.de/index.php?title=Installation_der_DAB%2B_Antenne&amp;quot;, wt: &amp;quot;Installation der DAB+ Antenne&amp;quot;, wt_en: &amp;quot;Installing the DAB+ antenna&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;radiozubehoer/dab/291/dab-empfaenger-inkl.-antenne-usbdab04&amp;quot;, ue: SHOP_EN + &amp;quot;accessories-for-head-units/dab/&amp;quot;, ut_en: &amp;quot;DAB+ receivers in the shop →&amp;quot; },&lt;br /&gt;
  dab2:    { t: &amp;quot;Dual DAB+ Empfänger-Stick inkl. 2 Antennen&amp;quot;, t_en: &amp;quot;Dual DAB+ receiver stick incl. 2 antennas&amp;quot;, d: &amp;quot;&amp;quot;,&lt;br /&gt;
             w: &amp;quot;https://xtrons.ibus-app.de/index.php?title=Installation_der_DAB%2B_Antenne&amp;quot;, wt: &amp;quot;Installation der DAB+ Antenne&amp;quot;, wt_en: &amp;quot;Installing the DAB+ antenna&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;radiozubehoer/dab/391/dual-dab-empfaenger-stick-inkl.-2-antennen-acusbdab05t?c=75&amp;quot;, ue: SHOP_EN + &amp;quot;accessories-for-head-units/dab/&amp;quot;, ut_en: &amp;quot;DAB+ receivers in the shop →&amp;quot; },&lt;br /&gt;
  rcam:    { t: &amp;quot;Rückfahrkamera&amp;quot;, t_en: &amp;quot;Rear-view camera&amp;quot;, d: &amp;quot;&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/kameras/&amp;quot;, ue: SHOP_EN + &amp;quot;accessories-for-head-units/cameras/&amp;quot;,&lt;br /&gt;
             ut: &amp;quot;Kameras im Shop ansehen →&amp;quot;, ut_en: &amp;quot;View cameras in the shop →&amp;quot; },&lt;br /&gt;
  fcam:    { t: &amp;quot;Front-Kamera&amp;quot;, t_en: &amp;quot;Front camera&amp;quot;, d: &amp;quot;&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/kameras/&amp;quot;, ue: SHOP_EN + &amp;quot;accessories-for-head-units/cameras/&amp;quot;,&lt;br /&gt;
             ut: &amp;quot;Kameras im Shop ansehen →&amp;quot;, ut_en: &amp;quot;View cameras in the shop →&amp;quot; },&lt;br /&gt;
  tool:    { t: &amp;quot;Einbau-Werkzeug (Kunststoffheber)&amp;quot;, t_en: &amp;quot;Installation tool (plastic pry tool)&amp;quot;, d: &amp;quot;Zum schonenden Lösen der Verkleidungen.&amp;quot;, d_en: &amp;quot;For gently removing trim panels.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;radiozubehoer/einbauwerkzeug/&amp;quot;, ue: SHOP_EN + &amp;quot;accessories-for-head-units/installation-tools/&amp;quot; }&lt;br /&gt;
};&lt;br /&gt;
/* ---- 5) Regeln --------------------------------------------------------------&lt;br /&gt;
   type: need (Das brauchst Du) oder hint (Hinweise)   when = Bedingung auf die Felder&lt;br /&gt;
   opts = diese Zusatzoptionen müssen gewählt sein      items = Artikel   html / html_en = Text (DE / EN)&lt;br /&gt;
   Abgeleitete Werte: gen (alt/b/c) und module (ja/nein/unk = Radiomodul im Kofferraum, nur gen alt) */&lt;br /&gt;
var RULES = [&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { current: [&amp;quot;werk&amp;quot;], module: [&amp;quot;ja&amp;quot;] }, items: [&amp;quot;exl005&amp;quot;, &amp;quot;fakra6m&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { current: [&amp;quot;nach&amp;quot;], module: [&amp;quot;ja&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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=&amp;quot; + P.noquad + &amp;quot;][img=&amp;quot; + P.noexl6 + &amp;quot;]&amp;quot;,&lt;br /&gt;
    html_en: &amp;quot;[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=&amp;quot; + P.noquad + &amp;quot;][img=&amp;quot; + P.noexl6 + &amp;quot;]&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;ja&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot;,&lt;br /&gt;
    html_en: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;nein&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot;,&lt;br /&gt;
    html_en: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;unk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot;,&lt;br /&gt;
    html_en: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { ant: [&amp;quot;iso&amp;quot;] }, items: [&amp;quot;isoada&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { ant: [&amp;quot;unk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Antennenstecker:[/b] [b]BM24[/b] (Rundpin) = ISO-Antennenstecker, ggf. wird der [a=&amp;quot; + SHOP + &amp;quot;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.&amp;quot;,&lt;br /&gt;
    html_en: &amp;quot;[b]Antenna connector:[/b] [b]BM24[/b] (round pin) = ISO antenna connector, you may need the [a=&amp;quot; + SHOP_EN + &amp;quot;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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { sound: [&amp;quot;dsp&amp;quot;] }, items: [&amp;quot;bcdsp&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { sound: [&amp;quot;dsp&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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=&amp;quot; + WIKI + &amp;quot;Habe_ich_DSP%3F]Habe ich DSP?[/a]&amp;quot;,&lt;br /&gt;
    html_en: &amp;quot;[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=&amp;quot; + WIKI + &amp;quot;Habe_ich_DSP%3F]Do I have DSP?[/a]&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { sound: [&amp;quot;hk&amp;quot;], gen: [&amp;quot;alt&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Harman Kardon:[/b] Benötigt [b]keine[/b] DSP-Lizenz. Das Remote-Signal (+12 V, wenn Radio an) genügt zum Starten.&amp;quot;,&lt;br /&gt;
    html_en: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { aux: [&amp;quot;nein&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]AUX-IN:[/b] Der AUX-IN muss codiert werden. Optional kann ein FM-Transmitter genutzt werden - das ist nicht empfohlen.&amp;quot;,&lt;br /&gt;
    html_en: &amp;quot;[b]AUX-IN:[/b] The AUX-IN has to be coded. Optionally an FM transmitter can be used - this is not recommended.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;7er-e38&amp;quot;, &amp;quot;x5-e53&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Montage:[/b] Radios für BMW E38/E53 benötigen keine extra Halterungen.&amp;quot;,&lt;br /&gt;
    html_en: &amp;quot;[b]Installation:[/b] Radios for BMW E38/E53 do not need extra brackets.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;5er-e39&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot;,&lt;br /&gt;
    html_en: &amp;quot;[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].&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;3er-e46&amp;quot;], factory: [&amp;quot;iris&amp;quot;, &amp;quot;mid&amp;quot;, &amp;quot;pfeil&amp;quot;], current: [&amp;quot;werk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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]&amp;quot; +&lt;br /&gt;
          &amp;quot;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]&amp;quot; +&lt;br /&gt;
          &amp;quot;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=&amp;quot; + P.funktr + &amp;quot;]&amp;quot;,&lt;br /&gt;
    html_en: &amp;quot;[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]&amp;quot; +&lt;br /&gt;
          &amp;quot;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]&amp;quot; +&lt;br /&gt;
          &amp;quot;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=&amp;quot; + P.funktr + &amp;quot;]&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { factory: [&amp;quot;cic&amp;quot;, &amp;quot;nbt&amp;quot;, &amp;quot;nbtevo&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Lichtleiter:[/b] Ggf. vorhandene Lichtleiter (MOST) müssen aus dem BMW-Stecker in den Xtrons-Adapter umgesteckt werden.&amp;quot;,&lt;br /&gt;
    html_en: &amp;quot;[b]Fiber optic cables:[/b] Any existing fiber optic cables (MOST) have to be moved from the BMW connector to the Xtrons adapter.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { factory: [&amp;quot;mask&amp;quot;, &amp;quot;ccc&amp;quot;, &amp;quot;cic&amp;quot;, &amp;quot;nbt&amp;quot;, &amp;quot;nbtevo&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot;,&lt;br /&gt;
    html_en: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, opts: [&amp;quot;kcan&amp;quot;], when: {},&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot;,&lt;br /&gt;
    html_en: &amp;quot;[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].&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, opts: [&amp;quot;ibus&amp;quot;], when: {},&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot;,&lt;br /&gt;
    html_en: &amp;quot;[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].&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: {},&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot;,&lt;br /&gt;
    html_en: &amp;quot;[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].&amp;quot; }&lt;br /&gt;
];&lt;br /&gt;
/* =====================================================================&lt;br /&gt;
   PROGRAMMLOGIK&lt;br /&gt;
   ===================================================================== */&lt;br /&gt;
var $ = function (id) { return document.getElementById(id); };&lt;br /&gt;
var sel = {}, picked = {}, summary = &amp;quot;&amp;quot;, capA = 0, capB = 0, radioCache = {}, chosenRadio = null, cartFill = null;&lt;br /&gt;
var fieldsEl = $(&amp;quot;nvk-fields&amp;quot;), optsEl = $(&amp;quot;nvk-opts&amp;quot;), outEl = $(&amp;quot;nvk-out&amp;quot;);&lt;br /&gt;
var LANG = DEFAULT_LANG;&lt;br /&gt;
var AMP = &amp;quot;\u0026&amp;quot;;&lt;br /&gt;
function T(de, en) { return LANG === &amp;quot;en&amp;quot; ? en : de; }&lt;br /&gt;
function LT(o, k) { var v = LANG === &amp;quot;en&amp;quot; ? o[k + &amp;quot;_en&amp;quot;] : &amp;quot;&amp;quot;; return v ? v : o[k]; }&lt;br /&gt;
function itemUrl(i) { var v = LANG === &amp;quot;en&amp;quot; ? i.ue : &amp;quot;&amp;quot;; return v ? v : i.u; }&lt;br /&gt;
function full(u) { return u.indexOf(&amp;quot;/thumb/&amp;quot;) === -1 ? u : u.replace(&amp;quot;/thumb/&amp;quot;, &amp;quot;/&amp;quot;).replace(/\/[^\/]+$/, &amp;quot;&amp;quot;); }&lt;br /&gt;
function fmt(t) {&lt;br /&gt;
  return t.replace(/\[imgw=([^\x5D]+)\]/g, function (m, u) {&lt;br /&gt;
    return &amp;quot;\u003Ca href=\&amp;quot;&amp;quot; + full(u) + &amp;quot;\&amp;quot; target=\&amp;quot;_blank\&amp;quot; rel=\&amp;quot;noopener\&amp;quot;\u003E\u003Cimg class=\&amp;quot;nvk-img wide\&amp;quot; src=\&amp;quot;&amp;quot; + u + &amp;quot;\&amp;quot; alt=\&amp;quot;\&amp;quot;\u003E\u003C/a\u003E&amp;quot;;&lt;br /&gt;
  }).replace(/\[img=([^\x5D]+)\]/g, function (m, u) {&lt;br /&gt;
    return &amp;quot;\u003Ca href=\&amp;quot;&amp;quot; + full(u) + &amp;quot;\&amp;quot; target=\&amp;quot;_blank\&amp;quot; rel=\&amp;quot;noopener\&amp;quot;\u003E\u003Cimg class=\&amp;quot;nvk-img\&amp;quot; src=\&amp;quot;&amp;quot; + u + &amp;quot;\&amp;quot; alt=\&amp;quot;\&amp;quot;\u003E\u003C/a\u003E&amp;quot;;&lt;br /&gt;
  }).replace(/\[b\]/g, &amp;quot;\u003Cb\u003E&amp;quot;).replace(/\[\/b\]/g, &amp;quot;\u003C/b\u003E&amp;quot;).replace(/\[br\]/g, &amp;quot;\u003Cbr\u003E&amp;quot;)&lt;br /&gt;
    .replace(/\[a=([^\x5D]+)\]/g, &amp;quot;\u003Ca href=\&amp;quot;$1\&amp;quot; target=\&amp;quot;_blank\&amp;quot; rel=\&amp;quot;noopener\&amp;quot;\u003E&amp;quot;).replace(/\[\/a\]/g, &amp;quot;\u003C/a\u003E&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
function match(cond, s, lenient) {&lt;br /&gt;
  if (!cond) return true;&lt;br /&gt;
  for (var k in cond) {&lt;br /&gt;
    if (!s[k]) { if (lenient) continue; return false; }&lt;br /&gt;
    if (cond[k].indexOf(s[k]) === -1) return false;&lt;br /&gt;
  }&lt;br /&gt;
  return true;&lt;br /&gt;
}&lt;br /&gt;
function vehicleOf(id) { return VEHICLES.filter(function (x) { return x.v === id; })[0]; }&lt;br /&gt;
function derive() {&lt;br /&gt;
  var s = {}, k;&lt;br /&gt;
  for (k in sel) s[k] = sel[k];&lt;br /&gt;
  var veh = vehicleOf(sel.vehicle);&lt;br /&gt;
  if (veh) s.gen = veh.gen;&lt;br /&gt;
  if (s.gen === &amp;quot;alt&amp;quot;) {&lt;br /&gt;
    if (s.factory === &amp;quot;n43&amp;quot; || s.factory === &amp;quot;n169&amp;quot;) s.module = &amp;quot;ja&amp;quot;;&lt;br /&gt;
    else if (s.factory === &amp;quot;iris&amp;quot; || s.factory === &amp;quot;mid&amp;quot;) s.module = &amp;quot;nein&amp;quot;;&lt;br /&gt;
    else if (s.factory === &amp;quot;pfeil&amp;quot;) s.module = s.trunk || &amp;quot;unk&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  return s;&lt;br /&gt;
}&lt;br /&gt;
function forced(s) {&lt;br /&gt;
  var f = {};&lt;br /&gt;
  FORCED.forEach(function (r) { if (match(r.when, s)) r.opts.forEach(function (o) { f[o] = LT(r, &amp;quot;why&amp;quot;); }); });&lt;br /&gt;
  return f;&lt;br /&gt;
}&lt;br /&gt;
function onSet(s) {&lt;br /&gt;
  var f = forced(s), on = {}, k;&lt;br /&gt;
  for (k in picked) if (picked[k]) on[k] = true;&lt;br /&gt;
  for (k in f) on[k] = true;&lt;br /&gt;
  return { on: on, forced: f };&lt;br /&gt;
}&lt;br /&gt;
function optVisible(o, s, on) {&lt;br /&gt;
  if (!match(o.show, s, true)) return false;&lt;br /&gt;
  return (o.requires || []).every(function (r) { return on[r]; });&lt;br /&gt;
}&lt;br /&gt;
FIELDS.forEach(function (f) {&lt;br /&gt;
  var wrap = document.createElement(&amp;quot;div&amp;quot;); wrap.className = &amp;quot;nvk-f&amp;quot;; wrap.id = &amp;quot;nvk-w-&amp;quot; + f.id;&lt;br /&gt;
  var lab = document.createElement(&amp;quot;label&amp;quot;); lab.htmlFor = &amp;quot;nvk-&amp;quot; + f.id; lab.id = &amp;quot;nvk-l-&amp;quot; + f.id; lab.textContent = LT(f, &amp;quot;label&amp;quot;);&lt;br /&gt;
  var s = document.createElement(&amp;quot;select&amp;quot;); s.id = &amp;quot;nvk-&amp;quot; + f.id;&lt;br /&gt;
  s.addEventListener(&amp;quot;change&amp;quot;, function () { sel[f.id] = s.value; update(); });&lt;br /&gt;
  wrap.appendChild(lab); wrap.appendChild(s);&lt;br /&gt;
  if (f.help) { var h = document.createElement(&amp;quot;div&amp;quot;); h.className = &amp;quot;nvk-help&amp;quot;; h.id = &amp;quot;nvk-h-&amp;quot; + f.id; h.innerHTML = fmt(LT(f, &amp;quot;help&amp;quot;)); wrap.appendChild(h); }&lt;br /&gt;
  var inf = document.createElement(&amp;quot;div&amp;quot;); inf.id = &amp;quot;nvk-i-&amp;quot; + f.id; wrap.appendChild(inf);&lt;br /&gt;
  fieldsEl.appendChild(wrap);&lt;br /&gt;
});&lt;br /&gt;
function renderFields() {&lt;br /&gt;
  FIELDS.forEach(function (f) {&lt;br /&gt;
    var s = derive();&lt;br /&gt;
    var wrap = $(&amp;quot;nvk-w-&amp;quot; + f.id), el = $(&amp;quot;nvk-&amp;quot; + f.id);&lt;br /&gt;
    $(&amp;quot;nvk-l-&amp;quot; + f.id).textContent = LT(f, &amp;quot;label&amp;quot;);&lt;br /&gt;
    if (f.help) { $(&amp;quot;nvk-h-&amp;quot; + f.id).innerHTML = fmt(LT(f, &amp;quot;help&amp;quot;)); }&lt;br /&gt;
    var vis = f.show ? match(f.show, s, false) : true;&lt;br /&gt;
    wrap.style.display = vis ? &amp;quot;&amp;quot; : &amp;quot;none&amp;quot;;&lt;br /&gt;
    if (!vis) { sel[f.id] = &amp;quot;&amp;quot;; return; }&lt;br /&gt;
    var allowed = f.values.filter(function (v) { return match(v.only, s, true); });&lt;br /&gt;
    if (sel[f.id]) { if (!allowed.some(function (v) { return v.v === sel[f.id]; })) sel[f.id] = &amp;quot;&amp;quot;; }&lt;br /&gt;
    if (!sel[f.id]) { if (f.def) sel[f.id] = f.def; }&lt;br /&gt;
    if (!sel[f.id]) { if (f.auto) { if (sel.vehicle) { if (allowed.length === 1) sel[f.id] = allowed[0].v; } } }&lt;br /&gt;
    el.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
    if (!f.def) { var p = document.createElement(&amp;quot;option&amp;quot;); p.value = &amp;quot;&amp;quot;; p.textContent = T(&amp;quot;– bitte wählen –&amp;quot;, &amp;quot;– please select –&amp;quot;); el.appendChild(p); }&lt;br /&gt;
    allowed.forEach(function (v) {&lt;br /&gt;
      var o = document.createElement(&amp;quot;option&amp;quot;); o.value = v.v; o.textContent = LT(v, &amp;quot;t&amp;quot;); el.appendChild(o);&lt;br /&gt;
    });&lt;br /&gt;
    el.value = sel[f.id] || &amp;quot;&amp;quot;;&lt;br /&gt;
    var cur = allowed.filter(function (v) { return v.v === sel[f.id]; })[0];&lt;br /&gt;
    var pre = f.pre ? (match(f.pre.when, s, false) ? fmt(LT(f.pre, &amp;quot;html&amp;quot;)) : &amp;quot;&amp;quot;) : &amp;quot;&amp;quot;;&lt;br /&gt;
    $(&amp;quot;nvk-i-&amp;quot; + f.id).innerHTML = pre + (cur ? (cur.info ? fmt(LT(cur, &amp;quot;info&amp;quot;)) : &amp;quot;&amp;quot;) : &amp;quot;&amp;quot;);&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
function renderOpts() {&lt;br /&gt;
  var s = derive(), st = onSet(s);&lt;br /&gt;
  OPTS.forEach(function (o) { if (!optVisible(o, s, st.on)) picked[o.id] = false; });&lt;br /&gt;
  st = onSet(s);&lt;br /&gt;
  optsEl.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
  OPTS.forEach(function (o) {&lt;br /&gt;
    if (!optVisible(o, s, st.on)) return;&lt;br /&gt;
    var lab = document.createElement(&amp;quot;label&amp;quot;); lab.className = &amp;quot;nvk-o&amp;quot;;&lt;br /&gt;
    var cb = document.createElement(&amp;quot;input&amp;quot;); cb.type = &amp;quot;checkbox&amp;quot;;&lt;br /&gt;
    cb.checked = !!st.on[o.id];&lt;br /&gt;
    var isForced = !!st.forced[o.id];&lt;br /&gt;
    if (isForced) { cb.disabled = true; lab.className += &amp;quot; dis&amp;quot;; }&lt;br /&gt;
    cb.addEventListener(&amp;quot;change&amp;quot;, function () {&lt;br /&gt;
      picked[o.id] = cb.checked;&lt;br /&gt;
      if (cb.checked) { if (o.excl) OPTS.forEach(function (x) { if (x.excl === o.excl) { if (x.id !== o.id) picked[x.id] = false; } }); }&lt;br /&gt;
      update();&lt;br /&gt;
    });&lt;br /&gt;
    lab.appendChild(cb);&lt;br /&gt;
    lab.appendChild(document.createTextNode(&amp;quot; &amp;quot; + LT(o, &amp;quot;t&amp;quot;)));&lt;br /&gt;
    var sub = [LT(o, &amp;quot;sub&amp;quot;), isForced ? st.forced[o.id] : &amp;quot;&amp;quot;].filter(Boolean).join(&amp;quot; - &amp;quot;);&lt;br /&gt;
    if (sub) { var sm = document.createElement(&amp;quot;small&amp;quot;); sm.textContent = &amp;quot; (&amp;quot; + sub + &amp;quot;)&amp;quot;; lab.appendChild(sm); }&lt;br /&gt;
    optsEl.appendChild(lab);&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
function link(url, text) {&lt;br /&gt;
  var a = document.createElement(&amp;quot;a&amp;quot;); a.href = url; a.target = &amp;quot;_blank&amp;quot;; a.rel = &amp;quot;noopener&amp;quot;; a.textContent = text; return a;&lt;br /&gt;
}&lt;br /&gt;
function card(item, cls) {&lt;br /&gt;
  var d = document.createElement(&amp;quot;div&amp;quot;); d.className = &amp;quot;nvk-card &amp;quot; + (cls || &amp;quot;&amp;quot;) + (item.hl ? &amp;quot; hl&amp;quot; : &amp;quot;&amp;quot;);&lt;br /&gt;
  var b = document.createElement(&amp;quot;b&amp;quot;); b.textContent = LT(item, &amp;quot;t&amp;quot;); d.appendChild(b);&lt;br /&gt;
  var dd = LT(item, &amp;quot;d&amp;quot;);&lt;br /&gt;
  if (dd) { var p = document.createElement(&amp;quot;span&amp;quot;); p.textContent = dd; d.appendChild(p); }&lt;br /&gt;
  if (item.img) {&lt;br /&gt;
    var im = document.createElement(&amp;quot;div&amp;quot;);&lt;br /&gt;
    item.img.forEach(function (u) {&lt;br /&gt;
      var a = document.createElement(&amp;quot;a&amp;quot;); a.href = full(u); a.target = &amp;quot;_blank&amp;quot;; a.rel = &amp;quot;noopener&amp;quot;;&lt;br /&gt;
      var g = document.createElement(&amp;quot;img&amp;quot;); g.className = &amp;quot;nvk-img&amp;quot;; g.src = u; g.alt = LT(item, &amp;quot;t&amp;quot;); a.appendChild(g); im.appendChild(a);&lt;br /&gt;
    });&lt;br /&gt;
    d.appendChild(im);&lt;br /&gt;
  }&lt;br /&gt;
  var iu = itemUrl(item);&lt;br /&gt;
  if (iu || item.w) {&lt;br /&gt;
    var l = document.createElement(&amp;quot;div&amp;quot;); l.className = &amp;quot;nvk-links&amp;quot;;&lt;br /&gt;
    if (iu) l.appendChild(link(iu, LT(item, &amp;quot;ut&amp;quot;) || T(&amp;quot;Im Shop ansehen →&amp;quot;, &amp;quot;View in shop →&amp;quot;)));&lt;br /&gt;
    if (item.w) l.appendChild(link(item.w, (LT(item, &amp;quot;wt&amp;quot;) || T(&amp;quot;Zum Wiki&amp;quot;, &amp;quot;Open wiki&amp;quot;)) + &amp;quot; →&amp;quot;));&lt;br /&gt;
    d.appendChild(l);&lt;br /&gt;
  }&lt;br /&gt;
  if (item.links) item.links.forEach(function (x) {&lt;br /&gt;
    var r = document.createElement(&amp;quot;div&amp;quot;); r.className = &amp;quot;nvk-links&amp;quot;; r.appendChild(link(LANG === &amp;quot;en&amp;quot; ? (x.ue || x.u) : x.u, LT(x, &amp;quot;t&amp;quot;) + &amp;quot; →&amp;quot;)); d.appendChild(r);&lt;br /&gt;
  });&lt;br /&gt;
  return d;&lt;br /&gt;
}&lt;br /&gt;
function heading(txt) { var h = document.createElement(&amp;quot;h3&amp;quot;); h.textContent = txt; outEl.appendChild(h); }&lt;br /&gt;
function aidOf(u) {&lt;br /&gt;
  if (u.indexOf(SHOP) !== 0) return &amp;quot;&amp;quot;;&lt;br /&gt;
  var m = u.match(/sArticle\/(\d+)/);&lt;br /&gt;
  if (!m) m = u.split(&amp;quot;?&amp;quot;)[0].match(/\/(\d+)\/[^\/]+$/);&lt;br /&gt;
  return m ? m[1] : &amp;quot;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
function renderRadioList(veh) {&lt;br /&gt;
  if (veh.noCat) return;&lt;br /&gt;
  if (chosenRadio) { if (chosenRadio.cat !== veh.v) chosenRadio = null; }&lt;br /&gt;
  var ck = veh.v + &amp;quot;-&amp;quot; + LANG;&lt;br /&gt;
  var data = radioCache[ck];&lt;br /&gt;
  if (data === undefined) {&lt;br /&gt;
    radioCache[ck] = &amp;quot;loading&amp;quot;;&lt;br /&gt;
    fetch(API + &amp;quot;?cat=&amp;quot; + encodeURIComponent(veh.v) + AMP + &amp;quot;lang=&amp;quot; + LANG).then(function (r) { return r.json(); }).then(function (j) {&lt;br /&gt;
      radioCache[ck] = (j.items || []).map(function (it) { it.cat = veh.v; return it; });&lt;br /&gt;
      renderResult();&lt;br /&gt;
    }).catch(function () { radioCache[ck] = []; renderResult(); });&lt;br /&gt;
  }&lt;br /&gt;
  if (data === undefined || data === &amp;quot;loading&amp;quot;) {&lt;br /&gt;
    var m = document.createElement(&amp;quot;p&amp;quot;); m.className = &amp;quot;nvk-miss&amp;quot;; m.textContent = T(&amp;quot;Verfügbare Radios werden geladen …&amp;quot;, &amp;quot;Loading available radios …&amp;quot;); outEl.appendChild(m); return;&lt;br /&gt;
  }&lt;br /&gt;
  if (!data.length) return;&lt;br /&gt;
  var want = { mask: /M-?ASK/i, ccc: /\bCCC\b/i, cic: /\bCIC\b/i, nbt: /\bNBT\b/i, nbtevo: /EVO/i }[sel.factory];&lt;br /&gt;
  function fits(it) { return want ? want.test(it.name) : false; }&lt;br /&gt;
  var list = data.slice().sort(function (a, b) { return (fits(b) ? 1 : 0) - (fits(a) ? 1 : 0); });&lt;br /&gt;
  var det = document.createElement(&amp;quot;details&amp;quot;); det.open = Math.max(list.length, 8) === 8;&lt;br /&gt;
  var sm = document.createElement(&amp;quot;summary&amp;quot;); sm.style.cursor = &amp;quot;pointer&amp;quot;; sm.style.fontWeight = &amp;quot;700&amp;quot;;&lt;br /&gt;
  sm.textContent = T(&amp;quot;Verfügbare Radios für Deinen BMW &amp;quot;, &amp;quot;Available radios for your BMW &amp;quot;) + vname(veh) + &amp;quot; (&amp;quot; + list.length + &amp;quot;)&amp;quot;; det.appendChild(sm);&lt;br /&gt;
  list.forEach(function (it) {&lt;br /&gt;
    var row = document.createElement(&amp;quot;div&amp;quot;); row.className = &amp;quot;nvk-row&amp;quot;;&lt;br /&gt;
    var lab = document.createElement(&amp;quot;label&amp;quot;); lab.className = &amp;quot;nvk-o&amp;quot;;&lt;br /&gt;
    var rb = document.createElement(&amp;quot;input&amp;quot;); rb.type = &amp;quot;radio&amp;quot;; rb.name = &amp;quot;nvk-radio&amp;quot;;&lt;br /&gt;
    rb.checked = chosenRadio ? chosenRadio.sku === it.sku : false;&lt;br /&gt;
    rb.addEventListener(&amp;quot;change&amp;quot;, function () { chosenRadio = it; if (cartFill) cartFill(); });&lt;br /&gt;
    lab.appendChild(rb);&lt;br /&gt;
    lab.appendChild(document.createTextNode(&amp;quot; &amp;quot; + it.name + (it.price ? &amp;quot;  -  &amp;quot; + it.price : &amp;quot;&amp;quot;) + (fits(it) ? T(&amp;quot;  (passt zu Deiner Auswahl)&amp;quot;, &amp;quot;  (matches your selection)&amp;quot;) : &amp;quot;&amp;quot;)));&lt;br /&gt;
    row.appendChild(lab); row.appendChild(link(it.url, &amp;quot;Shop →&amp;quot;));&lt;br /&gt;
    det.appendChild(row);&lt;br /&gt;
  });&lt;br /&gt;
  outEl.appendChild(det);&lt;br /&gt;
}&lt;br /&gt;
function cartBlock(needs, opt) {&lt;br /&gt;
  var items = [];&lt;br /&gt;
  needs.concat(opt).forEach(function (i) { var id = aidOf(itemUrl(i) || &amp;quot;&amp;quot;); if (id) items.push({ t: LT(i, &amp;quot;t&amp;quot;), aid: id, sku: LANG === &amp;quot;en&amp;quot; ? i.sku_en : i.sku }); });&lt;br /&gt;
  heading(T(&amp;quot;In den Warenkorb&amp;quot;, &amp;quot;Add to cart&amp;quot;));&lt;br /&gt;
  var box = document.createElement(&amp;quot;div&amp;quot;); box.className = &amp;quot;nvk-card opt&amp;quot;;&lt;br /&gt;
  var p = document.createElement(&amp;quot;div&amp;quot;);&lt;br /&gt;
  p.textContent = T(&amp;quot;Das oben gewählte Radio (falls ausgewählt) und diese Artikel werden direkt im Shop in den Warenkorb gelegt:&amp;quot;, &amp;quot;The radio selected above (if any) and these items will be added to your cart in the shop:&amp;quot;);&lt;br /&gt;
  box.appendChild(p);&lt;br /&gt;
  var listEl = document.createElement(&amp;quot;div&amp;quot;); box.appendChild(listEl);&lt;br /&gt;
  cartFill = function () {&lt;br /&gt;
    listEl.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
    var lines = (chosenRadio ? [&amp;quot;Radio: &amp;quot; + chosenRadio.type] : []).concat(items.map(function (x) { return x.t; }));&lt;br /&gt;
    lines.forEach(function (t) { var r = document.createElement(&amp;quot;div&amp;quot;); r.textContent = &amp;quot;- &amp;quot; + t; listEl.appendChild(r); });&lt;br /&gt;
  };&lt;br /&gt;
  cartFill();&lt;br /&gt;
  var n = document.createElement(&amp;quot;div&amp;quot;); n.className = &amp;quot;nvk-help&amp;quot;;&lt;br /&gt;
  n.textContent = T(&amp;quot;Kameras, TPMS, Werkzeug und Artikel ohne Direktlink wählst Du bitte über die Links oben im Shop aus.&amp;quot;, &amp;quot;Cameras, TPMS, tools and items without a direct link: please pick them in the shop using the links above.&amp;quot;);&lt;br /&gt;
  box.appendChild(n);&lt;br /&gt;
  if (CART_CLEAR) {&lt;br /&gt;
    var cn = document.createElement(&amp;quot;div&amp;quot;); cn.className = &amp;quot;nvk-help&amp;quot;;&lt;br /&gt;
    cn.textContent = T(&amp;quot;Hinweis: Ein bereits vorhandener Warenkorb im Shop wird dabei ersetzt.&amp;quot;, &amp;quot;Note: An existing cart in the shop will be replaced.&amp;quot;);&lt;br /&gt;
    box.appendChild(cn);&lt;br /&gt;
  }&lt;br /&gt;
  var all = needs.concat(opt);&lt;br /&gt;
  var has = function (k) { return all.indexOf(ITEMS[k]) !== -1; };&lt;br /&gt;
  var l17 = has(&amp;quot;kcanlic&amp;quot;), l7 = has(&amp;quot;bclic&amp;quot;) || has(&amp;quot;bcdsp&amp;quot;);&lt;br /&gt;
  if (l17 || l7) {&lt;br /&gt;
    var vb = document.createElement(&amp;quot;div&amp;quot;); vb.className = &amp;quot;nvk-f&amp;quot;; vb.style.marginTop = &amp;quot;12px&amp;quot;;&lt;br /&gt;
    var vlab = document.createElement(&amp;quot;label&amp;quot;); vlab.htmlFor = &amp;quot;nvk-licvin&amp;quot;;&lt;br /&gt;
    vlab.textContent = l17 ? T(&amp;quot;Fahrgestellnummer (17 Zeichen) für die Lizenz&amp;quot;, &amp;quot;Full VIN (17 characters) for the license&amp;quot;) : T(&amp;quot;VIN für die Lizenz (7 Zeichen, z. B. AB12345)&amp;quot;, &amp;quot;VIN for the license (7 characters, e.g. AB12345)&amp;quot;);&lt;br /&gt;
    var vin = document.createElement(&amp;quot;input&amp;quot;); vin.type = &amp;quot;text&amp;quot;; vin.id = &amp;quot;nvk-licvin&amp;quot;; vin.maxLength = 17;&lt;br /&gt;
    vin.value = $(&amp;quot;nvk-vin&amp;quot;).value.toUpperCase();&lt;br /&gt;
    var ta = document.createElement(&amp;quot;textarea&amp;quot;); ta.rows = 3; ta.readOnly = true; ta.style.display = &amp;quot;none&amp;quot;; ta.style.marginTop = &amp;quot;6px&amp;quot;;&lt;br /&gt;
    var cb = document.createElement(&amp;quot;button&amp;quot;); cb.type = &amp;quot;button&amp;quot;; cb.className = &amp;quot;nvk-btn&amp;quot;; cb.style.marginTop = &amp;quot;6px&amp;quot;;&lt;br /&gt;
    cb.textContent = T(&amp;quot;Kommentartext für die Kasse kopieren&amp;quot;, &amp;quot;Copy comment text for checkout&amp;quot;);&lt;br /&gt;
    var ls = document.createElement(&amp;quot;div&amp;quot;); ls.className = &amp;quot;nvk-help&amp;quot;;&lt;br /&gt;
    cb.addEventListener(&amp;quot;click&amp;quot;, function () {&lt;br /&gt;
      var v = vin.value.trim().toUpperCase(), v7 = &amp;quot;&amp;quot;, v17 = &amp;quot;&amp;quot;;&lt;br /&gt;
      if (/^[A-HJ-NPR-Z0-9]{17}$/.test(v)) { v17 = v; v7 = v.slice(10); }&lt;br /&gt;
      else if (/^[A-Z]{2}[0-9]{5}$/.test(v)) v7 = v;&lt;br /&gt;
      if (l17 ? !v17 : !v7) { ls.textContent = l17 ? T(&amp;quot;Bitte die vollständige 17-stellige Fahrgestellnummer eingeben.&amp;quot;, &amp;quot;Please enter the full 17-character VIN.&amp;quot;) : T(&amp;quot;Bitte die VIN im Format AB12345 (oder die 17-stellige FGN) eingeben.&amp;quot;, &amp;quot;Please enter the VIN as AB12345 (or the full 17-character VIN).&amp;quot;); return; }&lt;br /&gt;
      var L = [];&lt;br /&gt;
      if (has(&amp;quot;bclic&amp;quot;)) L.push(T(&amp;quot;I-BUS App BC Lizenz: VIN &amp;quot;, &amp;quot;I-BUS App OBC License: VIN &amp;quot;) + v7);&lt;br /&gt;
      if (has(&amp;quot;bcdsp&amp;quot;)) L.push(T(&amp;quot;I-BUS App BC+DSP Lizenz: VIN &amp;quot;, &amp;quot;I-BUS App OBC+DSP License: VIN &amp;quot;) + v7);&lt;br /&gt;
      if (l17) L.push(T(&amp;quot;K-CAN App Beta Lizenz: FGN &amp;quot;, &amp;quot;K-CAN App Beta License: VIN &amp;quot;) + v17);&lt;br /&gt;
      ta.value = L.join(&amp;quot;\n&amp;quot;); ta.style.display = &amp;quot;&amp;quot;; ta.select();&lt;br /&gt;
      var hint = T(&amp;quot;Bitte an der Shop-Kasse in das Feld Kommentar einfügen.&amp;quot;, &amp;quot;Please paste it into the Comment field at the shop checkout.&amp;quot;);&lt;br /&gt;
      var manual = T(&amp;quot;Bitte den Text markieren und kopieren. &amp;quot;, &amp;quot;Please select and copy the text. &amp;quot;);&lt;br /&gt;
      if (navigator.clipboard) navigator.clipboard.writeText(ta.value).then(function () { ls.textContent = T(&amp;quot;Text kopiert. &amp;quot;, &amp;quot;Text copied. &amp;quot;) + hint; }).catch(function () { ls.textContent = manual + hint; });&lt;br /&gt;
      else ls.textContent = manual + hint;&lt;br /&gt;
    });&lt;br /&gt;
    vb.appendChild(vlab); vb.appendChild(vin); vb.appendChild(cb); vb.appendChild(ta); vb.appendChild(ls); box.appendChild(vb);&lt;br /&gt;
  }&lt;br /&gt;
  if (!CART_TRANSFER) { outEl.appendChild(box); return; }&lt;br /&gt;
  var btn = document.createElement(&amp;quot;button&amp;quot;); btn.type = &amp;quot;button&amp;quot;; btn.className = &amp;quot;nvk-btn&amp;quot;; btn.style.marginTop = &amp;quot;8px&amp;quot;;&lt;br /&gt;
  btn.textContent = T(&amp;quot;Auswahl in den Warenkorb legen&amp;quot;, &amp;quot;Add selection to cart&amp;quot;);&lt;br /&gt;
  var st = document.createElement(&amp;quot;div&amp;quot;); st.className = &amp;quot;nvk-help&amp;quot;;&lt;br /&gt;
  btn.addEventListener(&amp;quot;click&amp;quot;, function () { addToCart(items, st); });&lt;br /&gt;
  box.appendChild(btn); box.appendChild(st); outEl.appendChild(box);&lt;br /&gt;
}&lt;br /&gt;
function addToCart(items, st) {&lt;br /&gt;
  var list = items.slice();&lt;br /&gt;
  if (chosenRadio) list.unshift({ t: chosenRadio.type, sku: chosenRadio.sku });&lt;br /&gt;
  if (!list.length) { st.textContent = T(&amp;quot;Es ist noch nichts zum Bestellen ausgewählt.&amp;quot;, &amp;quot;Nothing has been selected to order yet.&amp;quot;); return; }&lt;br /&gt;
  var w = window.open(&amp;quot;&amp;quot;, &amp;quot;_blank&amp;quot;);&lt;br /&gt;
  st.textContent = T(&amp;quot;Artikelnummern werden ermittelt …&amp;quot;, &amp;quot;Looking up item numbers …&amp;quot;);&lt;br /&gt;
  var ids = list.filter(function (x) { return x.aid; }).map(function (x) { return x.aid; });&lt;br /&gt;
  var get = ids.length ? fetch(API + &amp;quot;?aid=&amp;quot; + ids.join(&amp;quot;,&amp;quot;) + AMP + &amp;quot;lang=&amp;quot; + LANG).then(function (r) { return r.json(); }).then(function (j) { return j.skus || {}; }) : Promise.resolve({});&lt;br /&gt;
  get.then(function (map) {&lt;br /&gt;
    var skus = [];&lt;br /&gt;
    list.forEach(function (x) { var k = x.sku || map[x.aid]; if (k) skus.push(k); });&lt;br /&gt;
    if (!skus.length) throw new Error(&amp;quot;none&amp;quot;);&lt;br /&gt;
    var url = (LANG === &amp;quot;en&amp;quot; ? TRANSFER_URL_EN : TRANSFER_URL) + encodeURIComponent(skus.join(&amp;quot;,&amp;quot;)) + (CART_CLEAR ? AMP + &amp;quot;clear=1&amp;quot; : &amp;quot;&amp;quot;);&lt;br /&gt;
    if (w) {&lt;br /&gt;
      w.location.href = url;&lt;br /&gt;
      st.textContent = T(&amp;quot;Der Shop wurde in einem neuen Tab geöffnet (&amp;quot; + skus.length + &amp;quot; von &amp;quot; + list.length + &amp;quot; Artikeln übergeben). Bitte dort den Warenkorb kontrollieren. Ist ein Artikel nicht bestellbar, weist der Shop darauf hin.&amp;quot;, &amp;quot;The shop was opened in a new tab (&amp;quot; + skus.length + &amp;quot; of &amp;quot; + list.length + &amp;quot; items transferred). Please check the cart there. If an item cannot be ordered, the shop will tell you.&amp;quot;);&lt;br /&gt;
    } else {&lt;br /&gt;
      st.textContent = T(&amp;quot;Der neue Tab wurde blockiert. Bitte Pop-ups erlauben oder diesen Link nutzen: &amp;quot;, &amp;quot;The new tab was blocked. Please allow pop-ups or use this link: &amp;quot;);&lt;br /&gt;
      st.appendChild(link(url, T(&amp;quot;Warenkorb im Shop öffnen →&amp;quot;, &amp;quot;Open cart in the shop →&amp;quot;)));&lt;br /&gt;
    }&lt;br /&gt;
  }).catch(function () { if (w) w.close(); st.textContent = T(&amp;quot;Das hat leider nicht geklappt. Bitte nutze die Shop-Links oben.&amp;quot;, &amp;quot;Sorry, that did not work. Please use the shop links above.&amp;quot;); });&lt;br /&gt;
}&lt;br /&gt;
function renderResult() {&lt;br /&gt;
  var s = derive(), st = onSet(s);&lt;br /&gt;
  var missing = FIELDS.filter(function (f) {&lt;br /&gt;
    var w = $(&amp;quot;nvk-w-&amp;quot; + f.id);&lt;br /&gt;
    return w.style.display !== &amp;quot;none&amp;quot; ? (!f.optional ? !sel[f.id] : false) : false;&lt;br /&gt;
  });&lt;br /&gt;
  outEl.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
  if (missing.length) {&lt;br /&gt;
    var m = document.createElement(&amp;quot;p&amp;quot;); m.className = &amp;quot;nvk-miss&amp;quot;;&lt;br /&gt;
    m.textContent = T(&amp;quot;Bitte noch auswählen: &amp;quot;, &amp;quot;Please still select: &amp;quot;) + missing.map(function (f) { return LT(f, &amp;quot;label&amp;quot;); }).join(&amp;quot;, &amp;quot;);&lt;br /&gt;
    outEl.appendChild(m); $(&amp;quot;nvk-form&amp;quot;).style.display = &amp;quot;none&amp;quot;; return;&lt;br /&gt;
  }&lt;br /&gt;
  $(&amp;quot;nvk-form&amp;quot;).style.display = &amp;quot;&amp;quot;;&lt;br /&gt;
  var veh = vehicleOf(sel.vehicle);&lt;br /&gt;
  var rbase = LANG === &amp;quot;en&amp;quot; ? SHOP_EN + &amp;quot;bmw-head-units/&amp;quot; : SHOP + &amp;quot;bmw-radios/&amp;quot;;&lt;br /&gt;
  var ru = veh.noCat ? rbase : rbase + (LANG === &amp;quot;en&amp;quot; ? enSlug(veh.v) : veh.v) + &amp;quot;/&amp;quot;;&lt;br /&gt;
  heading(T(&amp;quot;Passende Radios&amp;quot;, &amp;quot;Matching radios&amp;quot;));&lt;br /&gt;
  outEl.appendChild(card({ t: T(&amp;quot;BMW Radios für &amp;quot; + veh.t, &amp;quot;BMW radios for &amp;quot; + vname(veh)), d: T(&amp;quot;Alle Radios, die für Deinen BMW &amp;quot; + veh.t + &amp;quot; im Shop erhältlich sind.&amp;quot;, &amp;quot;All radios available in the shop for your BMW &amp;quot; + vname(veh) + &amp;quot;.&amp;quot;),&lt;br /&gt;
    u: ru, ut: T(&amp;quot;Zu den passenden Radios →&amp;quot;, &amp;quot;To the matching radios →&amp;quot;), w: rbase, wt: T(&amp;quot;Alle BMW Radios&amp;quot;, &amp;quot;All BMW radios&amp;quot;) }, &amp;quot;rad&amp;quot;));&lt;br /&gt;
  renderRadioList(veh);&lt;br /&gt;
  var needs = [], hints = [], seen = {};&lt;br /&gt;
  RULES.forEach(function (r) {&lt;br /&gt;
    if (!match(r.when, s)) return;&lt;br /&gt;
    if (r.opts) { if (!r.opts.every(function (o) { return st.on[o]; })) return; }&lt;br /&gt;
    if (r.type === &amp;quot;need&amp;quot;) (r.items || []).forEach(function (id) { if (!seen[id]) { seen[id] = 1; needs.push(ITEMS[id]); } });&lt;br /&gt;
    else hints.push(LT(r, &amp;quot;html&amp;quot;));&lt;br /&gt;
  });&lt;br /&gt;
  heading(T(&amp;quot;Das brauchst Du&amp;quot;, &amp;quot;What you need&amp;quot;));&lt;br /&gt;
  if (needs.length) needs.forEach(function (i) { outEl.appendChild(card(i)); });&lt;br /&gt;
  else { var n = document.createElement(&amp;quot;p&amp;quot;); n.textContent = T(&amp;quot;Für die Grundinstallation sind keine zusätzlichen Verlängerungen oder Adapter nötig.&amp;quot;, &amp;quot;No additional extensions or adapters are needed for the basic installation.&amp;quot;); outEl.appendChild(n); }&lt;br /&gt;
  var opt = [];&lt;br /&gt;
  OPTS.forEach(function (o) {&lt;br /&gt;
    if (!st.on[o.id]) return;&lt;br /&gt;
    if (!optVisible(o, s, st.on)) return;&lt;br /&gt;
    o.items.forEach(function (id) {&lt;br /&gt;
      if (seen[id]) return;&lt;br /&gt;
      var sk = ITEMS[id].skipIf;&lt;br /&gt;
      if (sk) { if (seen[sk]) return; }&lt;br /&gt;
      seen[id] = 1; opt.push(ITEMS[id]);&lt;br /&gt;
    });&lt;br /&gt;
  });&lt;br /&gt;
  if (opt.length) { heading(T(&amp;quot;Deine Zusatzoptionen&amp;quot;, &amp;quot;Your additional options&amp;quot;)); opt.forEach(function (i) { outEl.appendChild(card(i, &amp;quot;opt&amp;quot;)); }); }&lt;br /&gt;
  if (hints.length) {&lt;br /&gt;
    heading(T(&amp;quot;Hinweise&amp;quot;, &amp;quot;Notes&amp;quot;));&lt;br /&gt;
    hints.forEach(function (t) { var d = document.createElement(&amp;quot;div&amp;quot;); d.className = &amp;quot;nvk-note&amp;quot;; d.innerHTML = fmt(t); outEl.appendChild(d); });&lt;br /&gt;
  }&lt;br /&gt;
  var L = [T(&amp;quot;KONFIGURATION&amp;quot;, &amp;quot;CONFIGURATION&amp;quot;), &amp;quot;Language: &amp;quot; + LANG];&lt;br /&gt;
  FIELDS.forEach(function (f) {&lt;br /&gt;
    if (!sel[f.id]) return;&lt;br /&gt;
    var v = f.values.filter(function (x) { return x.v === sel[f.id]; })[0];&lt;br /&gt;
    if (v) L.push(&amp;quot;- &amp;quot; + LT(f, &amp;quot;label&amp;quot;) + &amp;quot;: &amp;quot; + LT(v, &amp;quot;t&amp;quot;));&lt;br /&gt;
  });&lt;br /&gt;
  L.push(&amp;quot;&amp;quot;, T(&amp;quot;BENÖTIGT&amp;quot;, &amp;quot;REQUIRED&amp;quot;));&lt;br /&gt;
  needs.forEach(function (i) { L.push(&amp;quot;- &amp;quot; + LT(i, &amp;quot;t&amp;quot;) + (itemUrl(i) ? &amp;quot;  &amp;quot; + itemUrl(i) : &amp;quot;&amp;quot;)); });&lt;br /&gt;
  if (opt.length) { L.push(&amp;quot;&amp;quot;, T(&amp;quot;ZUSATZOPTIONEN&amp;quot;, &amp;quot;ADDITIONAL OPTIONS&amp;quot;)); opt.forEach(function (i) { L.push(&amp;quot;- &amp;quot; + LT(i, &amp;quot;t&amp;quot;) + (itemUrl(i) ? &amp;quot;  &amp;quot; + itemUrl(i) : &amp;quot;&amp;quot;)); }); }&lt;br /&gt;
  L.push(&amp;quot;&amp;quot;, &amp;quot;Radios: &amp;quot; + ru);&lt;br /&gt;
  summary = L.join(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  cartBlock(needs, opt);&lt;br /&gt;
}&lt;br /&gt;
function update() { renderFields(); renderOpts(); renderResult(); }&lt;br /&gt;
function capText() { $(&amp;quot;nvk-capq&amp;quot;).textContent = T(&amp;quot;Sicherheitsfrage: Was ist &amp;quot;, &amp;quot;Security question: What is &amp;quot;) + capA + &amp;quot; + &amp;quot; + capB + &amp;quot;? *&amp;quot;; }&lt;br /&gt;
function newCaptcha() {&lt;br /&gt;
  capA = 1 + Math.floor(Math.random() * 9); capB = 1 + Math.floor(Math.random() * 9);&lt;br /&gt;
  capText(); $(&amp;quot;nvk-cap&amp;quot;).value = &amp;quot;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
function status(msg, ok) { var e = $(&amp;quot;nvk-status&amp;quot;); e.style.display = &amp;quot;&amp;quot;; e.textContent = msg; e.style.borderLeftColor = ok ? &amp;quot;#14866d&amp;quot; : &amp;quot;#d33&amp;quot;; }&lt;br /&gt;
$(&amp;quot;nvk-send&amp;quot;).addEventListener(&amp;quot;click&amp;quot;, function () {&lt;br /&gt;
  var name = $(&amp;quot;nvk-name&amp;quot;).value.trim(), mail = $(&amp;quot;nvk-mail&amp;quot;).value.trim(), vin = $(&amp;quot;nvk-vin&amp;quot;).value.trim().toUpperCase(), msg = $(&amp;quot;nvk-msg&amp;quot;).value.trim();&lt;br /&gt;
  if (!name || !mail || !msg) return status(T(&amp;quot;Bitte Name, E-Mail und Kommentar ausfüllen.&amp;quot;, &amp;quot;Please fill in name, email and comment.&amp;quot;), false);&lt;br /&gt;
  if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(mail)) return status(T(&amp;quot;Bitte eine gültige E-Mail-Adresse eingeben.&amp;quot;, &amp;quot;Please enter a valid email address.&amp;quot;), false);&lt;br /&gt;
  if (vin) { if (!/^[A-Z]{2}[0-9]{5}$/.test(vin)) { if (!/^[A-HJ-NPR-Z0-9]{17}$/.test(vin)) return status(T(&amp;quot;Bitte die VIN im Format AB12345 oder die 17-stellige FGN eingeben - oder das Feld leer lassen.&amp;quot;, &amp;quot;Please enter the VIN as AB12345 or the full 17-character VIN - or leave the field empty.&amp;quot;), false); } }&lt;br /&gt;
  if (parseInt($(&amp;quot;nvk-cap&amp;quot;).value, 10) !== capA + capB) return status(T(&amp;quot;Die Sicherheitsfrage wurde nicht richtig beantwortet.&amp;quot;, &amp;quot;The security question was not answered correctly.&amp;quot;), false);&lt;br /&gt;
  if (!$(&amp;quot;nvk-dsgvo&amp;quot;).checked) return status(T(&amp;quot;Bitte der Verarbeitung Deiner Daten zustimmen.&amp;quot;, &amp;quot;Please agree to the processing of your data.&amp;quot;), false);&lt;br /&gt;
  if ($(&amp;quot;nvk-hp&amp;quot;).value) return;&lt;br /&gt;
  var sz = $(&amp;quot;nvk-size&amp;quot;).value;&lt;br /&gt;
  var rad = chosenRadio ? &amp;quot;\n\n&amp;quot; + T(&amp;quot;GEWÄHLTES RADIO&amp;quot;, &amp;quot;SELECTED RADIO&amp;quot;) + &amp;quot;\n- &amp;quot; + chosenRadio.type + &amp;quot;  &amp;quot; + chosenRadio.url : &amp;quot;&amp;quot;;&lt;br /&gt;
  var sum2 = summary + rad + (sz ? &amp;quot;\n\n&amp;quot; + T(&amp;quot;Gewünschte Displaygröße: &amp;quot;, &amp;quot;Desired display size: &amp;quot;) + sz : &amp;quot;&amp;quot;);&lt;br /&gt;
  var text = &amp;quot;Name: &amp;quot; + name + &amp;quot;\n&amp;quot; + T(&amp;quot;E-Mail: &amp;quot;, &amp;quot;Email: &amp;quot;) + mail + &amp;quot;\nVIN: &amp;quot; + (vin || &amp;quot;-&amp;quot;) + &amp;quot;\n\n&amp;quot; + T(&amp;quot;Kommentar:&amp;quot;, &amp;quot;Comment:&amp;quot;) + &amp;quot;\n&amp;quot; + msg + &amp;quot;\n\n&amp;quot; + sum2;&lt;br /&gt;
  if (SEND_URL) {&lt;br /&gt;
    var p = new URLSearchParams();&lt;br /&gt;
    p.append(&amp;quot;name&amp;quot;, name); p.append(&amp;quot;mail&amp;quot;, mail); p.append(&amp;quot;vin&amp;quot;, vin); p.append(&amp;quot;msg&amp;quot;, msg); p.append(&amp;quot;summary&amp;quot;, sum2);&lt;br /&gt;
    p.append(&amp;quot;hp&amp;quot;, $(&amp;quot;nvk-hp&amp;quot;).value); p.append(&amp;quot;ca&amp;quot;, capA); p.append(&amp;quot;cb&amp;quot;, capB); p.append(&amp;quot;cv&amp;quot;, $(&amp;quot;nvk-cap&amp;quot;).value); p.append(&amp;quot;lang&amp;quot;, LANG);&lt;br /&gt;
    fetch(SEND_URL, { method: &amp;quot;POST&amp;quot;, body: p }).then(function (r) {&lt;br /&gt;
      if (!r.ok) throw new Error(&amp;quot;send&amp;quot;);&lt;br /&gt;
      status(T(&amp;quot;Danke! Deine Anfrage wurde gesendet, eine Kopie geht an &amp;quot; + mail + &amp;quot;.&amp;quot;, &amp;quot;Thank you! Your request has been sent, a copy goes to &amp;quot; + mail + &amp;quot;.&amp;quot;), true); newCaptcha();&lt;br /&gt;
    }).catch(function () { status(T(&amp;quot;Das Senden hat nicht geklappt. Bitte versuche es später noch einmal oder schreibe direkt an &amp;quot; + MAIL_TO + &amp;quot;.&amp;quot;, &amp;quot;Sending failed. Please try again later or write directly to &amp;quot; + MAIL_TO + &amp;quot;.&amp;quot;), false); });&lt;br /&gt;
  } else {&lt;br /&gt;
    window.location.href = &amp;quot;mailto:&amp;quot; + MAIL_TO + &amp;quot;?cc=&amp;quot; + encodeURIComponent(mail) + AMP + &amp;quot;subject=&amp;quot; + encodeURIComponent(T(MAIL_SUBJECT, MAIL_SUBJECT_EN)) + AMP + &amp;quot;body=&amp;quot; + encodeURIComponent(text);&lt;br /&gt;
    status(T(&amp;quot;Dein E-Mail-Programm wurde mit der fertigen Anfrage geöffnet. Bitte dort noch auf Senden klicken.&amp;quot;, &amp;quot;Your email program was opened with the finished request. Please click Send there.&amp;quot;), true);&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
$(&amp;quot;nvk-reset&amp;quot;).addEventListener(&amp;quot;click&amp;quot;, function () { sel = {}; picked = {}; chosenRadio = null; update(); });&lt;br /&gt;
function renderLegal() {&lt;br /&gt;
  var le = $(&amp;quot;nvk-legal-links&amp;quot;), dl = $(&amp;quot;nvk-dslink&amp;quot;), first = true;&lt;br /&gt;
  le.innerHTML = &amp;quot;&amp;quot;; dl.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
  [ [&amp;quot;agb&amp;quot;, T(&amp;quot;AGB&amp;quot;, &amp;quot;Terms and conditions&amp;quot;)], [&amp;quot;widerruf&amp;quot;, T(&amp;quot;Widerrufsbelehrung&amp;quot;, &amp;quot;Right of withdrawal&amp;quot;)], [&amp;quot;datenschutz&amp;quot;, T(&amp;quot;Datenschutzerklärung&amp;quot;, &amp;quot;Privacy policy&amp;quot;)] ].forEach(function (x) {&lt;br /&gt;
    var key = x[0], url = LANG === &amp;quot;en&amp;quot; ? (LEGAL_EN[key] || LEGAL[key]) : LEGAL[key];&lt;br /&gt;
    if (!url) return;&lt;br /&gt;
    if (!first) le.appendChild(document.createTextNode(&amp;quot; | &amp;quot;));&lt;br /&gt;
    first = false; le.appendChild(link(url, x[1]));&lt;br /&gt;
    if (key === &amp;quot;datenschutz&amp;quot;) {&lt;br /&gt;
      dl.appendChild(document.createTextNode(&amp;quot; (&amp;quot;)); dl.appendChild(link(url, x[1])); dl.appendChild(document.createTextNode(&amp;quot;)&amp;quot;));&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
function applyStatic() {&lt;br /&gt;
  Array.prototype.forEach.call(document.querySelectorAll(&amp;quot;#nvk [data-en]&amp;quot;), function (e) {&lt;br /&gt;
    if (e.getAttribute(&amp;quot;data-de&amp;quot;) === null) e.setAttribute(&amp;quot;data-de&amp;quot;, e.textContent);&lt;br /&gt;
    e.textContent = LANG === &amp;quot;en&amp;quot; ? e.getAttribute(&amp;quot;data-en&amp;quot;) : e.getAttribute(&amp;quot;data-de&amp;quot;);&lt;br /&gt;
  });&lt;br /&gt;
  Array.prototype.forEach.call(document.querySelectorAll(&amp;quot;#nvk [data-en-ph]&amp;quot;), function (e) {&lt;br /&gt;
    if (e.getAttribute(&amp;quot;data-de-ph&amp;quot;) === null) e.setAttribute(&amp;quot;data-de-ph&amp;quot;, e.placeholder);&lt;br /&gt;
    e.placeholder = LANG === &amp;quot;en&amp;quot; ? e.getAttribute(&amp;quot;data-en-ph&amp;quot;) : e.getAttribute(&amp;quot;data-de-ph&amp;quot;);&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
function markLang() {&lt;br /&gt;
  [&amp;quot;de&amp;quot;, &amp;quot;en&amp;quot;].forEach(function (l) {&lt;br /&gt;
    var b = $(&amp;quot;nvk-lang-&amp;quot; + l);&lt;br /&gt;
    b.style.fontWeight = LANG === l ? &amp;quot;700&amp;quot; : &amp;quot;400&amp;quot;;&lt;br /&gt;
    b.style.borderColor = LANG === l ? &amp;quot;#f26522&amp;quot; : &amp;quot;#a2a9b1&amp;quot;;&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
function setLang(l) {&lt;br /&gt;
  LANG = l;&lt;br /&gt;
  try { localStorage.setItem(&amp;quot;nvk-lang&amp;quot;, l); } catch (e) { }&lt;br /&gt;
  markLang(); applyStatic(); renderLegal(); capText(); update();&lt;br /&gt;
}&lt;br /&gt;
[&amp;quot;de&amp;quot;, &amp;quot;en&amp;quot;].forEach(function (l) {&lt;br /&gt;
  var b = document.createElement(&amp;quot;button&amp;quot;); b.type = &amp;quot;button&amp;quot;; b.className = &amp;quot;nvk-btn&amp;quot;; b.id = &amp;quot;nvk-lang-&amp;quot; + l;&lt;br /&gt;
  b.textContent = l.toUpperCase(); b.style.marginLeft = &amp;quot;6px&amp;quot;; b.style.padding = &amp;quot;3px 12px&amp;quot;;&lt;br /&gt;
  b.addEventListener(&amp;quot;click&amp;quot;, function () { setLang(l); });&lt;br /&gt;
  $(&amp;quot;nvk-lang&amp;quot;).appendChild(b);&lt;br /&gt;
});&lt;br /&gt;
(function () {&lt;br /&gt;
  var m = location.search.match(/[?\x26](?:uselang|lang)=(\w+)/), l = m ? m[1].toLowerCase() : &amp;quot;&amp;quot;;&lt;br /&gt;
  if (!l) { try { l = localStorage.getItem(&amp;quot;nvk-lang&amp;quot;) || &amp;quot;&amp;quot;; } catch (e) { l = &amp;quot;&amp;quot;; } }&lt;br /&gt;
  if (l === &amp;quot;en&amp;quot; || l === &amp;quot;de&amp;quot;) LANG = l;&lt;br /&gt;
})();&lt;br /&gt;
markLang(); applyStatic(); renderLegal();&lt;br /&gt;
newCaptcha();&lt;br /&gt;
update();&lt;br /&gt;
})();&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;Stand: 23.10.2026&amp;lt;/small&amp;gt;&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andre</name></author>
	</entry>
	<entry>
		<id>https://xtrons.ibus-app.de/index.php?title=Android_Radio_Konfigurator&amp;diff=4097</id>
		<title>Android Radio Konfigurator</title>
		<link rel="alternate" type="text/html" href="https://xtrons.ibus-app.de/index.php?title=Android_Radio_Konfigurator&amp;diff=4097"/>
		<updated>2026-10-23T11:55:02Z</updated>

		<summary type="html">&lt;p&gt;Andre: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt; '''Mit diesem Tool kann auf Basis von Fahrzeug und vorhandenen Komponenten eine Liste nötiger Komponenten erstellt werden.&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;big&amp;gt;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.&amp;lt;br&amp;gt;'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
#nvk{max-width:900px;line-height:1.45}&lt;br /&gt;
#nvk *{box-sizing:border-box}&lt;br /&gt;
#nvk .nvk-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:14px;margin:12px 0}&lt;br /&gt;
#nvk .nvk-f label{display:block;font-weight:700;margin-bottom:4px}&lt;br /&gt;
#nvk select{width:100%;padding:9px 8px;font:inherit;color:#202122;background:#fff;border:1px solid #a2a9b1;border-radius:4px}&lt;br /&gt;
#nvk .nvk-help{font-size:.85em;opacity:.75;margin-top:3px}&lt;br /&gt;
#nvk fieldset{border:1px solid rgba(128,128,128,.45);border-radius:6px;padding:10px 14px;margin:14px 0}&lt;br /&gt;
#nvk legend{font-weight:700;padding:0 6px}&lt;br /&gt;
#nvk .nvk-o{display:block;padding:4px 0;cursor:pointer}&lt;br /&gt;
#nvk .nvk-o small{opacity:.7}&lt;br /&gt;
#nvk .nvk-o.dis{opacity:.75;cursor:default}&lt;br /&gt;
#nvk .nvk-btn{padding:7px 14px;font:inherit;border:1px solid #a2a9b1;border-radius:4px;background:#f8f9fa;color:#202122;cursor:pointer}&lt;br /&gt;
#nvk #nvk-out{margin-top:18px}&lt;br /&gt;
#nvk h3{margin:18px 0 8px}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-card.opt{border-left-color:#14866d}&lt;br /&gt;
#nvk .nvk-card.rad{border-left-color:#fff;background:rgba(255,255,255,.08)}&lt;br /&gt;
#nvk .nvk-card b{display:block}&lt;br /&gt;
#nvk .nvk-links{margin-top:4px;font-weight:600}&lt;br /&gt;
#nvk .nvk-links a{margin-right:14px}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-miss{opacity:.8;font-style:italic}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-card .nvk-img{max-width:230px;max-height:150px}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-card.hl{border:2px solid #36c;border-left-width:8px;background:rgba(51,102,204,.12);padding:12px 14px}&lt;br /&gt;
#nvk .nvk-card.hl b{font-size:1.1em}&lt;br /&gt;
#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)}&lt;br /&gt;
#nvk .nvk-row label{flex:1;margin:0;min-width:240px}&lt;br /&gt;
#nvk .nvk-row a{white-space:nowrap;font-weight:600}&lt;br /&gt;
#nvk .nvk-img.wide{max-width:min(100%,460px);max-height:none}&lt;br /&gt;
#nvk #nvk-form{margin-top:22px}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk-lang&amp;quot; style=&amp;quot;text-align:right;margin-bottom:6px&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-grid&amp;quot; id=&amp;quot;nvk-fields&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;fieldset id=&amp;quot;nvk-optset&amp;quot;&amp;gt;&amp;lt;legend data-en=&amp;quot;Additional options&amp;quot;&amp;gt;Zusatzoptionen&amp;lt;/legend&amp;gt;&amp;lt;div id=&amp;quot;nvk-opts&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/fieldset&amp;gt;&lt;br /&gt;
&amp;lt;button type=&amp;quot;button&amp;quot; class=&amp;quot;nvk-btn&amp;quot; id=&amp;quot;nvk-reset&amp;quot; data-en=&amp;quot;Reset selection&amp;quot;&amp;gt;Auswahl zurücksetzen&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk-out&amp;quot; aria-live=&amp;quot;polite&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;fieldset id=&amp;quot;nvk-form&amp;quot; style=&amp;quot;display:none&amp;quot;&amp;gt;&amp;lt;legend data-en=&amp;quot;Send request&amp;quot;&amp;gt;Anfrage senden&amp;lt;/legend&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;nvk-help&amp;quot; data-en=&amp;quot;Your selection and the list above are sent automatically. All fields marked * are required.&amp;quot;&amp;gt;Deine Auswahl und die Liste oben werden automatisch mitgesendet. Alle Felder mit * sind Pflicht.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-grid&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-name&amp;quot;&amp;gt;Name *&amp;lt;/label&amp;gt;&amp;lt;input id=&amp;quot;nvk-name&amp;quot; type=&amp;quot;text&amp;quot; autocomplete=&amp;quot;name&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-mail&amp;quot; data-en=&amp;quot;Email *&amp;quot;&amp;gt;E-Mail *&amp;lt;/label&amp;gt;&amp;lt;input id=&amp;quot;nvk-mail&amp;quot; type=&amp;quot;email&amp;quot; autocomplete=&amp;quot;email&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-size&amp;quot; data-en=&amp;quot;Desired display size (optional)&amp;quot;&amp;gt;Gewünschte Displaygröße (optional)&amp;lt;/label&amp;gt;&amp;lt;select id=&amp;quot;nvk-size&amp;quot;&amp;gt;&amp;lt;option value=&amp;quot;&amp;quot; data-en=&amp;quot;No preference / advice wanted&amp;quot;&amp;gt;Keine Angabe / Beratung gewünscht&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;7&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;8.8&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;9&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;10.25&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;12.3&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;14.9&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option data-en=&amp;quot;Other size (please state in comment)&amp;quot;&amp;gt;Andere Größe (bitte im Kommentar nennen)&amp;lt;/option&amp;gt;&amp;lt;/select&amp;gt;&amp;lt;div class=&amp;quot;nvk-help&amp;quot; data-en=&amp;quot;Diagonal in inches. Not every size is available for every model - we will check this for you.&amp;quot;&amp;gt;Diagonale in Zoll. Nicht jede Größe gibt es für jede Baureihe, das prüfen wir für Dich.&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-vin&amp;quot; data-en=&amp;quot;VIN (optional)&amp;quot;&amp;gt;VIN oder FGN (optional)&amp;lt;/label&amp;gt;&amp;lt;input id=&amp;quot;nvk-vin&amp;quot; type=&amp;quot;text&amp;quot; maxlength=&amp;quot;17&amp;quot; placeholder=&amp;quot;AB12345 oder 17-stellige FGN&amp;quot; data-en-ph=&amp;quot;AB12345 or full 17-character VIN&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-msg&amp;quot; data-en=&amp;quot;Comment *&amp;quot;&amp;gt;Kommentar *&amp;lt;/label&amp;gt;&amp;lt;textarea id=&amp;quot;nvk-msg&amp;quot; rows=&amp;quot;4&amp;quot;&amp;gt;&amp;lt;/textarea&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot; style=&amp;quot;max-width:300px&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-cap&amp;quot; id=&amp;quot;nvk-capq&amp;quot;&amp;gt;Sicherheitsfrage *&amp;lt;/label&amp;gt;&amp;lt;input id=&amp;quot;nvk-cap&amp;quot; type=&amp;quot;text&amp;quot; inputmode=&amp;quot;numeric&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;input id=&amp;quot;nvk-hp&amp;quot; type=&amp;quot;text&amp;quot; tabindex=&amp;quot;-1&amp;quot; autocomplete=&amp;quot;off&amp;quot; aria-hidden=&amp;quot;true&amp;quot; style=&amp;quot;position:absolute;left:-9999px;width:1px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;label class=&amp;quot;nvk-o&amp;quot;&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; id=&amp;quot;nvk-dsgvo&amp;quot;&amp;gt; &amp;lt;span data-en=&amp;quot;I agree that my details may be processed by email to handle this request.&amp;quot;&amp;gt;Ich stimme zu, dass meine Angaben zur Bearbeitung der Anfrage per E-Mail verarbeitet werden.&amp;lt;/span&amp;gt;&amp;lt;span id=&amp;quot;nvk-dslink&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; *&amp;lt;/label&amp;gt;&lt;br /&gt;
&amp;lt;button type=&amp;quot;button&amp;quot; class=&amp;quot;nvk-btn&amp;quot; id=&amp;quot;nvk-send&amp;quot; data-en=&amp;quot;Send request&amp;quot;&amp;gt;Anfrage senden&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk-status&amp;quot; class=&amp;quot;nvk-note&amp;quot; style=&amp;quot;display:none&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/fieldset&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk-legal&amp;quot; class=&amp;quot;nvk-help&amp;quot; style=&amp;quot;margin-top:20px&amp;quot;&amp;gt;&amp;lt;b data-en=&amp;quot;Note:&amp;quot;&amp;gt;Hinweis:&amp;lt;/b&amp;gt; &amp;lt;span data-en=&amp;quot;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.&amp;quot;&amp;gt;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.&amp;lt;/span&amp;gt;&amp;lt;div id=&amp;quot;nvk-legal-links&amp;quot; style=&amp;quot;margin-top:4px&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;noscript&amp;gt;Für den Konfigurator wird JavaScript benötigt. / JavaScript is required for the configurator.&amp;lt;/noscript&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
(function () {&lt;br /&gt;
&amp;quot;use strict&amp;quot;;&lt;br /&gt;
/* =====================================================================&lt;br /&gt;
   KONFIGURATION - hier wird gepflegt.&lt;br /&gt;
   Textformat in Hinweisen: [b]fett[/b]  [br] Zeilenumbruch  [a=URL]Linktext[/a]&lt;br /&gt;
   Bitte im Skript KEIN kaufmännisches Und, kein Kleiner-/Größer-Zeichen&lt;br /&gt;
   und keine Leerzeilen verwenden (das Wiki wandelt sie um).&lt;br /&gt;
   ===================================================================== */&lt;br /&gt;
var SHOP = &amp;quot;https://shop.ibus-app.de/&amp;quot;;&lt;br /&gt;
var WIKI = &amp;quot;https://wiki.ibus-app.de/index.php?title=&amp;quot;;&lt;br /&gt;
/* Bilder aus dem Wiki (Thumbnail-Adressen; Klick öffnet automatisch das Originalbild) */&lt;br /&gt;
var IM = &amp;quot;https://xtrons.ibus-app.de/images/thumb/&amp;quot;;&lt;br /&gt;
var P = {&lt;br /&gt;
  schema:  IM + &amp;quot;e/ea/BMW_E39_Verl%C3%A4ngerungen_EXL005%2BFAKRA_.png/135px-BMW_E39_Verl%C3%A4ngerungen_EXL005%2BFAKRA_.png&amp;quot;,&lt;br /&gt;
  exl005:  IM + &amp;quot;7/70/Exl005-1.webp/257px-Exl005-1.webp.png&amp;quot;,&lt;br /&gt;
  fakra6m: IM + &amp;quot;d/d8/FM-extension_01_1.png/270px-FM-extension_01_1.png&amp;quot;,&lt;br /&gt;
  isofakra: IM + &amp;quot;4/4e/ISO-FAKRA_1.png/270px-ISO-FAKRA_1.png&amp;quot;,&lt;br /&gt;
  bm24:    IM + &amp;quot;8/82/BM24.png/130px-BM24.png&amp;quot;,&lt;br /&gt;
  iso:     IM + &amp;quot;d/dd/Iso.jpg/69px-Iso.jpg&amp;quot;,&lt;br /&gt;
  bm54:    IM + &amp;quot;3/34/BM54.png/135px-BM54.png&amp;quot;,&lt;br /&gt;
  fakra:   IM + &amp;quot;b/b3/Fakra.jpg/100px-Fakra.jpg&amp;quot;,&lt;br /&gt;
  pfeil:   IM + &amp;quot;e/ee/Navi_E46.jpg/239px-Navi_E46.jpg&amp;quot;,&lt;br /&gt;
  noquad:  IM + &amp;quot;6/68/No_elongation.jpg/180px-No_elongation.jpg&amp;quot;,&lt;br /&gt;
  noexl6:  IM + &amp;quot;7/7b/No_EXL006.jpg/180px-No_EXL006.jpg&amp;quot;,&lt;br /&gt;
  halter:  IM + &amp;quot;3/3b/Halter_Alu.webp/92px-Halter_Alu.webp.png&amp;quot;,&lt;br /&gt;
  deepobd: &amp;quot;https://xtrons.ibus-app.de/images/d/d4/DeepOBD_Interface_1.png&amp;quot;,&lt;br /&gt;
  n43:     IM + &amp;quot;e/e4/Navi4_3.jpg/240px-Navi4_3.jpg&amp;quot;,&lt;br /&gt;
  n169:    IM + &amp;quot;8/8a/Navi16_9.jpg/240px-Navi16_9.jpg&amp;quot;,&lt;br /&gt;
  radio:   IM + &amp;quot;9/96/E39_Radio.jpg/240px-E39_Radio.jpg&amp;quot;,&lt;br /&gt;
  idrive:  &amp;quot;https://xtrons.ibus-app.de/images/0/02/MASK-CCC-CIC-NBT-EVO-iDrive.jpg&amp;quot;,&lt;br /&gt;
  iris:    &amp;quot;https://xtrons.ibus-app.de/images/b/be/BusinessKas_IRISG.jpg&amp;quot;,&lt;br /&gt;
  resler:  &amp;quot;https://xtrons.ibus-app.de/images/d/d1/Resler_Modul_01.png&amp;quot;,&lt;br /&gt;
  can:     &amp;quot;https://xtrons.ibus-app.de/images/6/69/CAN_Interface.png&amp;quot;,&lt;br /&gt;
  funktr:  IM + &amp;quot;7/7e/E46_Funktionstraeger.png/240px-E46_Funktionstraeger.png&amp;quot;&lt;br /&gt;
};&lt;br /&gt;
/* Anfrage-Formular: MAIL_TO = Empfänger. SEND_URL leer = E-Mail-Programm des Kunden öffnen (mailto).&lt;br /&gt;
   SEND_URL = Adresse des Server-Skripts send-anfrage.php = Versand direkt vom Server (mit CC an den Kunden). */&lt;br /&gt;
var MAIL_TO = &amp;quot;info@ibus-app.de&amp;quot;;&lt;br /&gt;
var MAIL_SUBJECT = &amp;quot;Anfrage aus Android Radio Konfigurator&amp;quot;;&lt;br /&gt;
var SEND_URL = &amp;quot;https://xtrons.ibus-app.de/send-anfrage.php&amp;quot;;&lt;br /&gt;
/* Shop-Anbindung: API = radios.php (liefert Radio-Liste und Artikelnummern). Warenkorb = Shopware-Link pro Artikelnummer. */&lt;br /&gt;
var API = &amp;quot;https://xtrons.ibus-app.de/radios.php&amp;quot;;&lt;br /&gt;
/* 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. */&lt;br /&gt;
var CART_TRANSFER = true;&lt;br /&gt;
/* Ziel der Übergabe: Shop-Controller aus Plugin 1.1.0 (serverseitig, unabhängig vom Browser-Cache).&lt;br /&gt;
   Älterer Weg über das Theme-Skript: var TRANSFER_URL = CART + &amp;quot;?nvk=&amp;quot;;  */&lt;br /&gt;
var TRANSFER_URL = &amp;quot;https://shop.ibus-app.de/nvk?add=&amp;quot;;&lt;br /&gt;
/* ---- Sprache / English ----------------------------------------------------&lt;br /&gt;
   DEFAULT_LANG: de oder en. Umschalten per Knopf DE/EN oder per Adresse ?uselang=en                     */&lt;br /&gt;
var DEFAULT_LANG = &amp;quot;de&amp;quot;;&lt;br /&gt;
var SHOP_EN = &amp;quot;https://shop.ibus-app.de/en/&amp;quot;;&lt;br /&gt;
var TRANSFER_URL_EN = SHOP_EN + &amp;quot;nvk?add=&amp;quot;;&lt;br /&gt;
var MAIL_SUBJECT_EN = &amp;quot;Request from Android Radio Configurator&amp;quot;;&lt;br /&gt;
/* Rechtliche Seiten EN (fehlt ein Eintrag, wird der deutsche Link genommen) */&lt;br /&gt;
var LEGAL_EN = { agb: SHOP_EN + &amp;quot;general-terms-and-conditions&amp;quot;, widerruf: SHOP_EN + &amp;quot;revocation-right&amp;quot;, datenschutz: SHOP_EN + &amp;quot;privacy-policy&amp;quot; };&lt;br /&gt;
var CART = &amp;quot;https://shop.ibus-app.de/checkout/cart&amp;quot;;&lt;br /&gt;
/* Rechtliche Seiten (Links unter dem Konfigurator und beim Datenschutz-Haken). Leer = Link wird nicht angezeigt. */&lt;br /&gt;
var LEGAL = { agb: &amp;quot;https://shop.ibus-app.de/allgemeine-geschaeftsbedingungen&amp;quot;, widerruf: &amp;quot;https://shop.ibus-app.de/widerrufsrecht&amp;quot;, datenschutz: &amp;quot;https://shop.ibus-app.de/datenschutz&amp;quot; };&lt;br /&gt;
/* ---- 1) Baureihen --------------------------------------------------------&lt;br /&gt;
   v = Shop-Kategorie (Link: SHOP + bmw-radios/ + v + /)&lt;br /&gt;
   gen: alt = I-BUS-Fahrzeuge (E38/E39/E46/E53/E83)&lt;br /&gt;
        b   = M-ASK / CCC / CIC     c = CIC / NBT / NBT EVO&lt;br /&gt;
   body = Karosserieformen (siehe BODY)                                      */&lt;br /&gt;
var BODY = { limo: &amp;quot;Limousine&amp;quot;, touring: &amp;quot;Touring&amp;quot;, coupe: &amp;quot;Coupé&amp;quot;, cabrio: &amp;quot;Cabrio&amp;quot;, schraeg: &amp;quot;Schrägheck&amp;quot;,&lt;br /&gt;
  compact: &amp;quot;Compact&amp;quot;, gt: &amp;quot;Gran Turismo&amp;quot;, gc: &amp;quot;Gran Coupé&amp;quot;, suv: &amp;quot;SUV / SAV&amp;quot;, roadster: &amp;quot;Roadster&amp;quot; };&lt;br /&gt;
var BODY_EN = { limo: &amp;quot;Sedan&amp;quot;, touring: &amp;quot;Touring (wagon)&amp;quot;, coupe: &amp;quot;Coupe&amp;quot;, cabrio: &amp;quot;Convertible&amp;quot;, schraeg: &amp;quot;Hatchback&amp;quot;,&lt;br /&gt;
  compact: &amp;quot;Compact&amp;quot;, gt: &amp;quot;Gran Turismo&amp;quot;, gc: &amp;quot;Gran Coupe&amp;quot;, suv: &amp;quot;SUV / SAV&amp;quot;, roadster: &amp;quot;Roadster&amp;quot; };&lt;br /&gt;
function vname(x) { return LANG === &amp;quot;en&amp;quot; ? x.t.replace(/^(\d)er /, &amp;quot;$1 Series &amp;quot;) : x.t; }&lt;br /&gt;
function enSlug(v) { return v.replace(/^(\d)er-/, &amp;quot;$1-series-&amp;quot;); }&lt;br /&gt;
var VEHICLES = [&lt;br /&gt;
  { v: &amp;quot;1er-e8x&amp;quot;, t: &amp;quot;1er E8x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;schraeg,coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;1er-f2x&amp;quot;, t: &amp;quot;1er F2x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;schraeg&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;2er-f2x&amp;quot;, t: &amp;quot;2er F2x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;3er-e46&amp;quot;, t: &amp;quot;3er E46&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;limo,touring,coupe,cabrio,compact&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;3er-e9x&amp;quot;, t: &amp;quot;3er E9x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;limo,touring,coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;3er-f3x&amp;quot;, t: &amp;quot;3er F3x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;limo,touring,gt&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;4er-f3x&amp;quot;, t: &amp;quot;4er F3x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;coupe,cabrio,gc&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;5er-e39&amp;quot;, t: &amp;quot;5er E39&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;limo,touring&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;5er-e6x&amp;quot;, t: &amp;quot;5er E6x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;limo,touring&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;5er-f1x&amp;quot;, t: &amp;quot;5er F1x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;limo,touring,gt&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;6er-e6x&amp;quot;, t: &amp;quot;6er E6x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;7er-e38&amp;quot;, t: &amp;quot;7er E38&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;limo&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;7er-e65&amp;quot;, t: &amp;quot;7er E65&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;limo&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;7er-f01&amp;quot;, t: &amp;quot;7er F01&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;limo&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x1-e84&amp;quot;, t: &amp;quot;X1 E84&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x1-f48&amp;quot;, t: &amp;quot;X1 F48&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x3-e83&amp;quot;, t: &amp;quot;X3 E83&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x3-f25&amp;quot;, t: &amp;quot;X3 F25&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x5-e53&amp;quot;, t: &amp;quot;X5 E53&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x5-e70&amp;quot;, t: &amp;quot;X5 E70&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x5-f15&amp;quot;, t: &amp;quot;X5 F15&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x6-e71&amp;quot;, t: &amp;quot;X6 E71&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;z4-e85e86&amp;quot;, t: &amp;quot;Z4 E85/E86&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;roadster,coupe&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;z4-e89&amp;quot;, t: &amp;quot;Z4 E89&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;roadster&amp;quot;, noCat: true }&lt;br /&gt;
];&lt;br /&gt;
/* Fahrzeuge mit K-CAN App (Beta) */&lt;br /&gt;
var KCAN = [&amp;quot;1er-e8x&amp;quot;, &amp;quot;3er-e9x&amp;quot;, &amp;quot;5er-e6x&amp;quot;, &amp;quot;6er-e6x&amp;quot;, &amp;quot;7er-e65&amp;quot;, &amp;quot;x1-e84&amp;quot;, &amp;quot;x5-e70&amp;quot;, &amp;quot;x6-e71&amp;quot;, &amp;quot;z4-e89&amp;quot;];&lt;br /&gt;
var bodyValues = Object.keys(BODY).map(function (k) {&lt;br /&gt;
  return { v: k, t: BODY[k], t_en: BODY_EN[k], only: { vehicle: VEHICLES.filter(function (x) { return x.body.split(&amp;quot;,&amp;quot;).indexOf(k) !== -1; }).map(function (x) { return x.v; }) } };&lt;br /&gt;
});&lt;br /&gt;
/* ---- 2) Auswahlfelder ------------------------------------------------------&lt;br /&gt;
   only = Wert nur anbieten, wenn Bedingung passt   show = Feld nur dann zeigen&lt;br /&gt;
   optional = muss nicht gewählt werden             auto = bei nur einem Wert vorwählen */&lt;br /&gt;
var FIELDS = [&lt;br /&gt;
  { id: &amp;quot;vehicle&amp;quot;, label: &amp;quot;Fahrzeug&amp;quot;, label_en: &amp;quot;Vehicle&amp;quot;, values: VEHICLES.map(function (x) { return { v: x.v, t: &amp;quot;BMW &amp;quot; + x.t, t_en: &amp;quot;BMW &amp;quot; + x.t.replace(/^(\d)er /, &amp;quot;$1 Series &amp;quot;) }; }) },&lt;br /&gt;
  { id: &amp;quot;factory&amp;quot;, label: &amp;quot;Verbaut ab Werk&amp;quot;, label_en: &amp;quot;Factory-fitted system&amp;quot;,&lt;br /&gt;
    pre: { when: { gen: [&amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;] }, html: &amp;quot;[b]So erkennst Du Dein System:[/b][br][imgw=&amp;quot; + P.idrive + &amp;quot;]&amp;quot;, html_en: &amp;quot;[b]How to identify your system:[/b][br][imgw=&amp;quot; + P.idrive + &amp;quot;]&amp;quot; }, values: [&lt;br /&gt;
    { v: &amp;quot;iris&amp;quot;,  t: &amp;quot;Radio mit IRIS&amp;quot;, t_en: &amp;quot;Radio with IRIS&amp;quot;, only: { vehicle: [&amp;quot;3er-e46&amp;quot;, &amp;quot;5er-e39&amp;quot;, &amp;quot;7er-e38&amp;quot;, &amp;quot;x5-e53&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.iris + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;mid&amp;quot;,   t: &amp;quot;Radio mit MID&amp;quot;,  t_en: &amp;quot;Radio with MID&amp;quot;, only: { gen: [&amp;quot;alt&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.radio + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;n43&amp;quot;,   t: &amp;quot;4:3 Navi&amp;quot;,       t_en: &amp;quot;4:3 navi&amp;quot;, only: { vehicle: [&amp;quot;5er-e39&amp;quot;, &amp;quot;7er-e38&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.n43 + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;n169&amp;quot;,  t: &amp;quot;16:9 Navi&amp;quot;,      t_en: &amp;quot;16:9 navi&amp;quot;, only: { gen: [&amp;quot;alt&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.n169 + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;pfeil&amp;quot;, t: &amp;quot;Pfeilnavi&amp;quot;,      t_en: &amp;quot;Arrow navi&amp;quot;, only: { vehicle: [&amp;quot;3er-e46&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.pfeil + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;mask&amp;quot;,  t: &amp;quot;M-ASK&amp;quot;,          only: { gen: [&amp;quot;b&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;ccc&amp;quot;,   t: &amp;quot;CCC&amp;quot;,            only: { gen: [&amp;quot;b&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;cic&amp;quot;,   t: &amp;quot;CIC&amp;quot;,            only: { gen: [&amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;nbt&amp;quot;,   t: &amp;quot;NBT&amp;quot;,            only: { gen: [&amp;quot;c&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;nbtevo&amp;quot;, t: &amp;quot;NBT EVO&amp;quot;,       only: { gen: [&amp;quot;c&amp;quot;] } } ] },&lt;br /&gt;
  { id: &amp;quot;trunk&amp;quot;, label: &amp;quot;Wo sitzt das Radiomodul des Pfeilnavis?&amp;quot;, label_en: &amp;quot;Where is the radio module of the arrow navi?&amp;quot;, optional: true, show: { factory: [&amp;quot;pfeil&amp;quot;] },&lt;br /&gt;
    help: &amp;quot;Bitte prüfen: Sitzt das Modul im Kofferraum, oder im Pfeilnavi selbst (Quadlock hinten neben dem Antennenstecker)?[br][img=&amp;quot; + P.pfeil + &amp;quot;]&amp;quot;,&lt;br /&gt;
    help_en: &amp;quot;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=&amp;quot; + P.pfeil + &amp;quot;]&amp;quot;,&lt;br /&gt;
    values: [&lt;br /&gt;
    { v: &amp;quot;ja&amp;quot;, t: &amp;quot;Im Kofferraum (Verlängerungen nötig)&amp;quot;, t_en: &amp;quot;In the trunk (extensions required)&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;nein&amp;quot;, t: &amp;quot;Im Pfeilnavi, Quadlock hinten (keine Verlängerung)&amp;quot;, t_en: &amp;quot;In the arrow navi, Quadlock at the back (no extension)&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;unk&amp;quot;, t: &amp;quot;Weiß ich nicht&amp;quot;, t_en: &amp;quot;I don't know&amp;quot; } ] },&lt;br /&gt;
  { id: &amp;quot;aux&amp;quot;, label: &amp;quot;AUX-IN verfügbar?&amp;quot;, label_en: &amp;quot;AUX-IN available?&amp;quot;, show: { gen: [&amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;] }, values: [&lt;br /&gt;
    { v: &amp;quot;ja&amp;quot;, t: &amp;quot;Ja&amp;quot;, t_en: &amp;quot;Yes&amp;quot; }, { v: &amp;quot;nein&amp;quot;, t: &amp;quot;Nein&amp;quot;, t_en: &amp;quot;No&amp;quot; } ] },&lt;br /&gt;
  { id: &amp;quot;sound&amp;quot;, label: &amp;quot;Soundsystem&amp;quot;, label_en: &amp;quot;Sound system&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;stereo&amp;quot;, t: &amp;quot;Stereo&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;hifi&amp;quot;,   t: &amp;quot;Hifi&amp;quot;, t_en: &amp;quot;Hi-Fi&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;dsp&amp;quot;,    t: &amp;quot;DSP&amp;quot;, only: { vehicle: [&amp;quot;7er-e38&amp;quot;, &amp;quot;5er-e39&amp;quot;, &amp;quot;x5-e53&amp;quot;, &amp;quot;x3-e83&amp;quot;] }, info: &amp;quot;[a=&amp;quot; + WIKI + &amp;quot;Habe_ich_DSP%3F]Habe ich DSP?[/a]&amp;quot;, info_en: &amp;quot;[a=&amp;quot; + WIKI + &amp;quot;Habe_ich_DSP%3F]Do I have DSP?[/a]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;hk&amp;quot;,     t: &amp;quot;Harman Kardon&amp;quot;, only: { vehicle: [&amp;quot;3er-e46&amp;quot;, &amp;quot;z4-e85e86&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;logic7&amp;quot;, t: &amp;quot;Logic7&amp;quot;, only: { vehicle: [&amp;quot;3er-e9x&amp;quot;, &amp;quot;5er-e6x&amp;quot;, &amp;quot;6er-e6x&amp;quot;, &amp;quot;7er-e65&amp;quot;, &amp;quot;1er-e8x&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;hksur&amp;quot;,  t: &amp;quot;Harman Kardon Surround&amp;quot;, only: { vehicle: [&amp;quot;1er-f2x&amp;quot;, &amp;quot;2er-f2x&amp;quot;, &amp;quot;3er-f3x&amp;quot;, &amp;quot;4er-f3x&amp;quot;, &amp;quot;5er-f1x&amp;quot;] } } ] },&lt;br /&gt;
  { id: &amp;quot;current&amp;quot;, label: &amp;quot;Aktuell verbaut&amp;quot;, label_en: &amp;quot;Currently installed&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;werk&amp;quot;, t: &amp;quot;Werksradio / Werksnavi&amp;quot;, t_en: &amp;quot;Factory radio / factory navi&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;nach&amp;quot;, t: &amp;quot;Nachrüst-Radio / -Navi&amp;quot;, t_en: &amp;quot;Aftermarket radio / navi&amp;quot; } ] },&lt;br /&gt;
  { id: &amp;quot;body&amp;quot;, label: &amp;quot;Karosserie&amp;quot;, label_en: &amp;quot;Body type&amp;quot;, auto: true, values: bodyValues },&lt;br /&gt;
  { id: &amp;quot;ant&amp;quot;, label: &amp;quot;Antennenstecker am Radio (optional)&amp;quot;, label_en: &amp;quot;Antenna connector on the radio (optional)&amp;quot;, optional: true, def: &amp;quot;unk&amp;quot;,&lt;br /&gt;
    show: { vehicle: [&amp;quot;7er-e38&amp;quot;, &amp;quot;5er-e39&amp;quot;, &amp;quot;3er-e46&amp;quot;, &amp;quot;x5-e53&amp;quot;] },&lt;br /&gt;
    values: [&lt;br /&gt;
    { v: &amp;quot;unk&amp;quot;,   t: &amp;quot;Weiß ich nicht&amp;quot;, t_en: &amp;quot;I don't know&amp;quot;,&lt;br /&gt;
      info: &amp;quot;[b]BM24[/b] (Rundpin) = ISO-Antennenstecker:[br][img=&amp;quot; + P.bm24 + &amp;quot;][img=&amp;quot; + P.iso + &amp;quot;][br][b]BM54[/b] = FAKRA:[br][img=&amp;quot; + P.bm54 + &amp;quot;][img=&amp;quot; + P.fakra + &amp;quot;]&amp;quot;,&lt;br /&gt;
      info_en: &amp;quot;[b]BM24[/b] (round pin) = ISO antenna connector:[br][img=&amp;quot; + P.bm24 + &amp;quot;][img=&amp;quot; + P.iso + &amp;quot;][br][b]BM54[/b] = FAKRA:[br][img=&amp;quot; + P.bm54 + &amp;quot;][img=&amp;quot; + P.fakra + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;iso&amp;quot;,   t: &amp;quot;ISO (BM24, Rundpin)&amp;quot;, t_en: &amp;quot;ISO (BM24, round pin)&amp;quot;, info: &amp;quot;[img=&amp;quot; + P.bm24 + &amp;quot;][img=&amp;quot; + P.iso + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;fakra&amp;quot;, t: &amp;quot;FAKRA (BM54)&amp;quot;, info: &amp;quot;[img=&amp;quot; + P.bm54 + &amp;quot;][img=&amp;quot; + P.fakra + &amp;quot;]&amp;quot; } ] }&lt;br /&gt;
];&lt;br /&gt;
/* ---- 3) Zusatzoptionen (Mehrfachauswahl) ---------------------------------&lt;br /&gt;
   show = nur sichtbar wenn Bedingung passt   requires = nur sichtbar wenn diese Optionen gewählt sind&lt;br /&gt;
   excl = Optionen derselben Gruppe schließen sich aus   items = Artikel aus ITEMS&lt;br /&gt;
   Englisch: Felder mit Endung _en (t_en, sub_en, ...). Fehlt ein _en-Feld, wird der deutsche Text gezeigt. */&lt;br /&gt;
var OPTS = [&lt;br /&gt;
  { id: &amp;quot;halter&amp;quot;,  t: &amp;quot;Radio-Halter&amp;quot;, t_en: &amp;quot;Radio holder&amp;quot;, sub: &amp;quot;nur BMW E39&amp;quot;, sub_en: &amp;quot;BMW E39 only&amp;quot;, show: { vehicle: [&amp;quot;5er-e39&amp;quot;] }, items: [&amp;quot;halter&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;ibus&amp;quot;,    t: &amp;quot;I-BUS App&amp;quot;, show: { gen: [&amp;quot;alt&amp;quot;] }, items: [&amp;quot;ibus&amp;quot;, &amp;quot;resler&amp;quot;, &amp;quot;bclic&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;deepobd&amp;quot;, t: &amp;quot;DeepOBD (Diagnose)&amp;quot;, t_en: &amp;quot;DeepOBD (diagnostics)&amp;quot;, items: [&amp;quot;deepobd&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;can&amp;quot;,     t: &amp;quot;CAN Interface&amp;quot;, sub: &amp;quot;Addon - nur mit I-BUS App&amp;quot;, sub_en: &amp;quot;Add-on - only with I-BUS App&amp;quot;, show: { gen: [&amp;quot;alt&amp;quot;] }, requires: [&amp;quot;ibus&amp;quot;], items: [&amp;quot;can&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;kcan&amp;quot;,    t: &amp;quot;K-CAN App (Beta)&amp;quot;, sub: &amp;quot;Pendant zur I-BUS App&amp;quot;, sub_en: &amp;quot;Counterpart to the I-BUS App&amp;quot;, show: { vehicle: KCAN }, items: [&amp;quot;kcan&amp;quot;, &amp;quot;kcanlic&amp;quot;, &amp;quot;can&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;tpms&amp;quot;,    t: &amp;quot;TPMS (Reifendruck)&amp;quot;, t_en: &amp;quot;TPMS (tire pressure)&amp;quot;, items: [&amp;quot;tpms&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;dab1&amp;quot;,    t: &amp;quot;DAB+ (Single Receiver)&amp;quot;, excl: &amp;quot;dab&amp;quot;, items: [&amp;quot;dab1&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;dab2&amp;quot;,    t: &amp;quot;DAB+ (Dual Receiver)&amp;quot;,   excl: &amp;quot;dab&amp;quot;, items: [&amp;quot;dab2&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;rcam&amp;quot;,    t: &amp;quot;Rückfahrkamera&amp;quot;, t_en: &amp;quot;Rear-view camera&amp;quot;, items: [&amp;quot;rcam&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;fcam&amp;quot;,    t: &amp;quot;Front-Kamera&amp;quot;, t_en: &amp;quot;Front camera&amp;quot;, items: [&amp;quot;fcam&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;tool&amp;quot;,    t: &amp;quot;Einbau-Werkzeug (Kunststoffheber)&amp;quot;, t_en: &amp;quot;Installation tool (plastic pry tool)&amp;quot;, items: [&amp;quot;tool&amp;quot;] }&lt;br /&gt;
];&lt;br /&gt;
/* Erzwungene Optionen (werden automatisch gesetzt und gesperrt) */&lt;br /&gt;
var FORCED = [&lt;br /&gt;
  { when: { sound: [&amp;quot;dsp&amp;quot;] }, opts: [&amp;quot;ibus&amp;quot;], why: &amp;quot;wegen DSP erforderlich&amp;quot;, why_en: &amp;quot;required because of DSP&amp;quot; }&lt;br /&gt;
];&lt;br /&gt;
/* ---- 4) Artikel ------------------------------------------------------------&lt;br /&gt;
   u = Shop-Link DE, ue = Shop-Link EN (leer = wie DE)   ut/wt = Linktexte   w = Wiki-Link   leer = kein Link&lt;br /&gt;
   skipIf = Artikel entfällt, wenn der genannte Artikel schon in der Liste steht&lt;br /&gt;
   Die Lizenzen sind im EN-Shop andere Artikel (BC = OBC): ue zeigt auf den EN-Artikel. */&lt;br /&gt;
var ITEMS = {&lt;br /&gt;
  exl005:  { t: &amp;quot;Verlängerung EXL005&amp;quot;, t_en: &amp;quot;Extension EXL005&amp;quot;, d: &amp;quot;Ersetzt das Radiomodul im Kofferraum.&amp;quot;, d_en: &amp;quot;Replaces the radio module in the trunk.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;detail/index/sArticle/212/&amp;quot;, ue: SHOP_EN + &amp;quot;accessories-for-head-units/adapter-elongations/212/bmw-radio-extension-6-meters-exl005&amp;quot;, img: [P.exl005, P.schema] },&lt;br /&gt;
  fakra6m: { t: &amp;quot;Verlängerung 6 m FAKRA(m) auf FAKRA(f), gewinkelt&amp;quot;, t_en: &amp;quot;Extension 6 m FAKRA(m) to FAKRA(f), angled&amp;quot;,&lt;br /&gt;
             d: &amp;quot;Antennenverlängerung vom Kofferraum nach vorn.&amp;quot;, d_en: &amp;quot;Antenna extension from the trunk to the front.&amp;quot;, img: [P.fakra6m],&lt;br /&gt;
             u: SHOP + &amp;quot;shop/zubehoer/adapterkabel/192/verlaengerung-6m-fakra-m-auf-fakra-f-kurz-gewinkelt&amp;quot;,&lt;br /&gt;
             ue: SHOP_EN + &amp;quot;i-bus-app/accessories/cable-adapters/192/extension-6m-fakra-m-to-fakra-f-short-angled&amp;quot; },&lt;br /&gt;
  isoada:  { t: &amp;quot;Adapter ISO-Stecker auf FAKRA, gewinkelt (15 cm)&amp;quot;, t_en: &amp;quot;Adapter ISO plug to FAKRA, angled (15 cm)&amp;quot;,&lt;br /&gt;
             d: &amp;quot;Nötig bei ISO-Antennenstecker (BM24, Rundpin).&amp;quot;, d_en: &amp;quot;Required with an ISO antenna connector (BM24, round pin).&amp;quot;, img: [P.isofakra],&lt;br /&gt;
             u: SHOP + &amp;quot;shop/zubehoer/adapterkabel/193/adapter-kabel-iso-f-auf-fakra-f-kurz-gewinkelt-15cm&amp;quot;,&lt;br /&gt;
             ue: SHOP_EN + &amp;quot;i-bus-app/accessories/cable-adapters/193/adapter-cable-iso-f-to-fakra-f-short-angled-15cm&amp;quot; },&lt;br /&gt;
  bcdsp:   { t: &amp;quot;I-BUS App - BC+DSP Lizenz&amp;quot;, t_en: &amp;quot;I-BUS App - OBC+DSP License&amp;quot;,&lt;br /&gt;
             d: &amp;quot;Ohne DSP-Lizenz arbeitet das Werks-DSP nicht.&amp;quot;, d_en: &amp;quot;Without the DSP license the factory DSP will not work.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/lizenzen/171/i-bus-app-bc-dsp-lizenz&amp;quot;, ue: SHOP_EN + &amp;quot;i-bus-app/licenses/172/i-bus-app-obc-dsp-license&amp;quot;,&lt;br /&gt;
             w: WIKI + &amp;quot;Habe_ich_DSP%3F&amp;quot;, wt: &amp;quot;Wiki: Habe ich DSP?&amp;quot;, wt_en: &amp;quot;Wiki: Do I have DSP?&amp;quot; },&lt;br /&gt;
  halter:  { t: &amp;quot;Alu-Halter zur Radio-Montage im BMW E39&amp;quot;, t_en: &amp;quot;Alu holder for radio installation in BMW E39&amp;quot;,&lt;br /&gt;
             d: &amp;quot;Empfohlen bei Radios, die nicht von AVIN stammen.&amp;quot;, d_en: &amp;quot;Recommended for radios not made by AVIN.&amp;quot;, img: [P.halter],&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/radiohalter/185/alu-halter-zur-radio-montage-im-bmw-e39&amp;quot;,&lt;br /&gt;
             ue: SHOP_EN + &amp;quot;i-bus-app/accessories/fittings-for-radio/185/fittings-for-radio-in-bmw-e39&amp;quot; },&lt;br /&gt;
  ibus:    { t: &amp;quot;I-BUS App&amp;quot;, hl: true,&lt;br /&gt;
             d: &amp;quot;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.&amp;quot;,&lt;br /&gt;
             d_en: &amp;quot;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.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;cat/index/sCategory/42&amp;quot;, ue: SHOP_EN + &amp;quot;cat/index/sCategory/45&amp;quot;,&lt;br /&gt;
             links: [&lt;br /&gt;
               { u: WIKI + &amp;quot;Was_brauche_ich_um_die_I-BUS_App_nutzen_zu_k%C3%B6nnen%3F&amp;quot;, t: &amp;quot;Wiki: Was brauche ich für die I-BUS App?&amp;quot;, t_en: &amp;quot;Wiki: What do I need for the I-BUS App?&amp;quot;, ue: WIKI + &amp;quot;What_do_I_need_to_use_the_I-BUS_app%3F&amp;quot; },&lt;br /&gt;
               { u: WIKI + &amp;quot;Funktionen&amp;quot;, t: &amp;quot;Liste aller I-BUS App Funktionen (BMW E38|E39|E46|E53|E83)&amp;quot;, t_en: &amp;quot;List of all I-BUS App functions (BMW E38|E39|E46|E53|E83)&amp;quot; },&lt;br /&gt;
               { u: WIKI + &amp;quot;Was_geht_beim_BMW_E46_nicht&amp;quot;, t: &amp;quot;Was geht beim BMW E46, E83, E85,.. nicht? (da werkseitig nicht verbaut)&amp;quot;, t_en: &amp;quot;What does not work on BMW E46, E83, E85,..? (not fitted at the factory)&amp;quot; },&lt;br /&gt;
               { u: WIKI + &amp;quot;Funktionseinschr%C3%A4nkungen_nach_Baujahr/Ausstattung/Modell&amp;quot;, t: &amp;quot;Funktionseinschränkungen nach Baujahr/Ausstattung/Modell&amp;quot;, t_en: &amp;quot;Function restrictions by year / equipment / model&amp;quot; } ] },&lt;br /&gt;
  resler:  { t: &amp;quot;Resler USB I-BUS Modul inkl. Anschlusskabel&amp;quot;, t_en: &amp;quot;Resler USB I-BUS module incl. cable&amp;quot;,&lt;br /&gt;
             d: &amp;quot;Verbindet I-BUS App und Fahrzeug.&amp;quot;, d_en: &amp;quot;Connects the I-BUS App and the vehicle.&amp;quot;, img: [P.resler],&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/interfaces-module/191/resler-usb-i-bus-modul-inkl.-anschlusskabel&amp;quot;,&lt;br /&gt;
             ue: SHOP_EN + &amp;quot;i-bus-app/accessories/interfaces-modules/191/resler-usb-i-bus-module-incl.-cable&amp;quot;,&lt;br /&gt;
             w: &amp;quot;https://wiki.ibus-app.de/index.php?title=Hauptseite#Einbauanleitung_f.C3.BCr_Resler_Modul_und_Resler_Interface&amp;quot;, wt: &amp;quot;Einbauanleitung Resler Modul&amp;quot;, wt_en: &amp;quot;Installation guide Resler module&amp;quot; },&lt;br /&gt;
  bclic:   { t: &amp;quot;I-BUS App - BC Lizenz&amp;quot;, t_en: &amp;quot;I-BUS App - OBC License&amp;quot;, d: &amp;quot;Schaltet u. a. die BC-Daten der App frei.&amp;quot;, d_en: &amp;quot;Unlocks e.g. the OBC data of the app.&amp;quot;, skipIf: &amp;quot;bcdsp&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/lizenzen/167/i-bus-app-bc-lizenz&amp;quot;, ue: SHOP_EN + &amp;quot;i-bus-app/licenses/173/i-bus-app-obc-license&amp;quot;, sku_en: &amp;quot;App04&amp;quot; },&lt;br /&gt;
  deepobd: { t: &amp;quot;Deep OBD OBD-II Bluetooth-Adapter&amp;quot;, t_en: &amp;quot;Deep OBD OBD-II Bluetooth adapter&amp;quot;,&lt;br /&gt;
             d: &amp;quot;Live-Werte auslesen, Fehler lesen und löschen.&amp;quot;, d_en: &amp;quot;Read live values, read and clear fault codes.&amp;quot;, img: [P.deepobd],&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/interfaces-module/258/deep-obd-obd-ii-bluetooth-adapter?c=54&amp;quot;,&lt;br /&gt;
             ue: SHOP_EN + &amp;quot;i-bus-app/accessories/interfaces-modules/258/deep-obd-obd-ii-bluetooth-adapter&amp;quot;,&lt;br /&gt;
             w: &amp;quot;https://xtrons.ibus-app.de/index.php?title=DeepOBD_-_Adapter_und_App_einrichten&amp;quot;, wt: &amp;quot;Wiki: DeepOBD einrichten&amp;quot;, wt_en: &amp;quot;Wiki: Setting up DeepOBD&amp;quot; },&lt;br /&gt;
  can:     { t: &amp;quot;CAN-Bus Interface inkl. Anschlusskabel&amp;quot;, t_en: &amp;quot;CAN bus interface incl. connection cable&amp;quot;,&lt;br /&gt;
             d: &amp;quot;Addon, funktioniert nur zusammen mit der I-BUS App bzw. der K-CAN App.&amp;quot;, d_en: &amp;quot;Add-on, only works together with the I-BUS App or the K-CAN App.&amp;quot;, img: [P.can],&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/interfaces-module/346/can-bus-interface-inkl.-anschlusskabel&amp;quot;,&lt;br /&gt;
             ue: SHOP_EN + &amp;quot;i-bus-app/accessories/interfaces-modules/346/can-bus-interface-incl.-connection-cable&amp;quot;,&lt;br /&gt;
             w: WIKI + &amp;quot;Einbauanleitung_CAN-Bus_Interface&amp;quot;, wt: &amp;quot;Einbauanleitung CAN-Bus Interface&amp;quot;, wt_en: &amp;quot;Installation guide CAN bus interface&amp;quot; },&lt;br /&gt;
  kcan:    { t: &amp;quot;K-CAN App (Beta)&amp;quot;, d: &amp;quot;Pendant zur I-BUS App für Fahrzeuge mit K-CAN, aktuell als Betaversion.&amp;quot;,&lt;br /&gt;
             d_en: &amp;quot;Counterpart to the I-BUS App for vehicles with K-CAN, currently in beta.&amp;quot;,&lt;br /&gt;
             w: &amp;quot;https://wiki.kcan-app.de/&amp;quot;, wt: &amp;quot;Wiki zur K-CAN App&amp;quot;, wt_en: &amp;quot;K-CAN App wiki&amp;quot; },&lt;br /&gt;
  kcanlic: { t: &amp;quot;K-CAN App - Lizenz Betaversion&amp;quot;, t_en: &amp;quot;K-CAN App - License Beta Version&amp;quot;, d: &amp;quot;Beta-Lizenz für die K-CAN App.&amp;quot;, d_en: &amp;quot;Beta license for the K-CAN App.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/lizenzen/358/k-can-app-lizenz-betaversion&amp;quot;, ue: SHOP_EN + &amp;quot;i-bus-app/licenses/358/k-can-app-license-beta-version&amp;quot; },&lt;br /&gt;
  tpms:    { t: &amp;quot;TPMS - Reifendruckkontrolle&amp;quot;, t_en: &amp;quot;TPMS - tire pressure monitoring&amp;quot;, d: &amp;quot;&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/tpms/&amp;quot;, ue: SHOP_EN + &amp;quot;accessories-for-head-units/tpms/&amp;quot; },&lt;br /&gt;
  dab1:    { t: &amp;quot;DAB+ Empfänger inkl. Antenne (Single)&amp;quot;, t_en: &amp;quot;DAB+ receiver incl. antenna (single)&amp;quot;, d: &amp;quot;&amp;quot;,&lt;br /&gt;
             w: &amp;quot;https://xtrons.ibus-app.de/index.php?title=Installation_der_DAB%2B_Antenne&amp;quot;, wt: &amp;quot;Installation der DAB+ Antenne&amp;quot;, wt_en: &amp;quot;Installing the DAB+ antenna&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;radiozubehoer/dab/291/dab-empfaenger-inkl.-antenne-usbdab04&amp;quot;, ue: SHOP_EN + &amp;quot;accessories-for-head-units/dab/&amp;quot;, ut_en: &amp;quot;DAB+ receivers in the shop →&amp;quot; },&lt;br /&gt;
  dab2:    { t: &amp;quot;Dual DAB+ Empfänger-Stick inkl. 2 Antennen&amp;quot;, t_en: &amp;quot;Dual DAB+ receiver stick incl. 2 antennas&amp;quot;, d: &amp;quot;&amp;quot;,&lt;br /&gt;
             w: &amp;quot;https://xtrons.ibus-app.de/index.php?title=Installation_der_DAB%2B_Antenne&amp;quot;, wt: &amp;quot;Installation der DAB+ Antenne&amp;quot;, wt_en: &amp;quot;Installing the DAB+ antenna&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;radiozubehoer/dab/391/dual-dab-empfaenger-stick-inkl.-2-antennen-acusbdab05t?c=75&amp;quot;, ue: SHOP_EN + &amp;quot;accessories-for-head-units/dab/&amp;quot;, ut_en: &amp;quot;DAB+ receivers in the shop →&amp;quot; },&lt;br /&gt;
  rcam:    { t: &amp;quot;Rückfahrkamera&amp;quot;, t_en: &amp;quot;Rear-view camera&amp;quot;, d: &amp;quot;&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/kameras/&amp;quot;, ue: SHOP_EN + &amp;quot;accessories-for-head-units/cameras/&amp;quot;,&lt;br /&gt;
             ut: &amp;quot;Kameras im Shop ansehen →&amp;quot;, ut_en: &amp;quot;View cameras in the shop →&amp;quot; },&lt;br /&gt;
  fcam:    { t: &amp;quot;Front-Kamera&amp;quot;, t_en: &amp;quot;Front camera&amp;quot;, d: &amp;quot;&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/kameras/&amp;quot;, ue: SHOP_EN + &amp;quot;accessories-for-head-units/cameras/&amp;quot;,&lt;br /&gt;
             ut: &amp;quot;Kameras im Shop ansehen →&amp;quot;, ut_en: &amp;quot;View cameras in the shop →&amp;quot; },&lt;br /&gt;
  tool:    { t: &amp;quot;Einbau-Werkzeug (Kunststoffheber)&amp;quot;, t_en: &amp;quot;Installation tool (plastic pry tool)&amp;quot;, d: &amp;quot;Zum schonenden Lösen der Verkleidungen.&amp;quot;, d_en: &amp;quot;For gently removing trim panels.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;radiozubehoer/einbauwerkzeug/&amp;quot;, ue: SHOP_EN + &amp;quot;accessories-for-head-units/installation-tools/&amp;quot; }&lt;br /&gt;
};&lt;br /&gt;
/* ---- 5) Regeln --------------------------------------------------------------&lt;br /&gt;
   type: need (Das brauchst Du) oder hint (Hinweise)   when = Bedingung auf die Felder&lt;br /&gt;
   opts = diese Zusatzoptionen müssen gewählt sein      items = Artikel   html / html_en = Text (DE / EN)&lt;br /&gt;
   Abgeleitete Werte: gen (alt/b/c) und module (ja/nein/unk = Radiomodul im Kofferraum, nur gen alt) */&lt;br /&gt;
var RULES = [&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { current: [&amp;quot;werk&amp;quot;], module: [&amp;quot;ja&amp;quot;] }, items: [&amp;quot;exl005&amp;quot;, &amp;quot;fakra6m&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { current: [&amp;quot;nach&amp;quot;], module: [&amp;quot;ja&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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=&amp;quot; + P.noquad + &amp;quot;][img=&amp;quot; + P.noexl6 + &amp;quot;]&amp;quot;,&lt;br /&gt;
    html_en: &amp;quot;[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=&amp;quot; + P.noquad + &amp;quot;][img=&amp;quot; + P.noexl6 + &amp;quot;]&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;ja&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot;,&lt;br /&gt;
    html_en: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;nein&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot;,&lt;br /&gt;
    html_en: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;unk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot;,&lt;br /&gt;
    html_en: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { ant: [&amp;quot;iso&amp;quot;] }, items: [&amp;quot;isoada&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { ant: [&amp;quot;unk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Antennenstecker:[/b] [b]BM24[/b] (Rundpin) = ISO-Antennenstecker, ggf. wird der [a=&amp;quot; + SHOP + &amp;quot;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.&amp;quot;,&lt;br /&gt;
    html_en: &amp;quot;[b]Antenna connector:[/b] [b]BM24[/b] (round pin) = ISO antenna connector, you may need the [a=&amp;quot; + SHOP_EN + &amp;quot;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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { sound: [&amp;quot;dsp&amp;quot;] }, items: [&amp;quot;bcdsp&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { sound: [&amp;quot;dsp&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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=&amp;quot; + WIKI + &amp;quot;Habe_ich_DSP%3F]Habe ich DSP?[/a]&amp;quot;,&lt;br /&gt;
    html_en: &amp;quot;[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=&amp;quot; + WIKI + &amp;quot;Habe_ich_DSP%3F]Do I have DSP?[/a]&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { sound: [&amp;quot;hk&amp;quot;], gen: [&amp;quot;alt&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Harman Kardon:[/b] Benötigt [b]keine[/b] DSP-Lizenz. Das Remote-Signal (+12 V, wenn Radio an) genügt zum Starten.&amp;quot;,&lt;br /&gt;
    html_en: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { aux: [&amp;quot;nein&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]AUX-IN:[/b] Der AUX-IN muss codiert werden. Optional kann ein FM-Transmitter genutzt werden - das ist nicht empfohlen.&amp;quot;,&lt;br /&gt;
    html_en: &amp;quot;[b]AUX-IN:[/b] The AUX-IN has to be coded. Optionally an FM transmitter can be used - this is not recommended.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;7er-e38&amp;quot;, &amp;quot;x5-e53&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Montage:[/b] Radios für BMW E38/E53 benötigen keine extra Halterungen.&amp;quot;,&lt;br /&gt;
    html_en: &amp;quot;[b]Installation:[/b] Radios for BMW E38/E53 do not need extra brackets.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;5er-e39&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot;,&lt;br /&gt;
    html_en: &amp;quot;[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].&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;3er-e46&amp;quot;], factory: [&amp;quot;iris&amp;quot;, &amp;quot;mid&amp;quot;, &amp;quot;pfeil&amp;quot;], current: [&amp;quot;werk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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]&amp;quot; +&lt;br /&gt;
          &amp;quot;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]&amp;quot; +&lt;br /&gt;
          &amp;quot;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=&amp;quot; + P.funktr + &amp;quot;]&amp;quot;,&lt;br /&gt;
    html_en: &amp;quot;[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]&amp;quot; +&lt;br /&gt;
          &amp;quot;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]&amp;quot; +&lt;br /&gt;
          &amp;quot;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=&amp;quot; + P.funktr + &amp;quot;]&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { factory: [&amp;quot;cic&amp;quot;, &amp;quot;nbt&amp;quot;, &amp;quot;nbtevo&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Lichtleiter:[/b] Ggf. vorhandene Lichtleiter (MOST) müssen aus dem BMW-Stecker in den Xtrons-Adapter umgesteckt werden.&amp;quot;,&lt;br /&gt;
    html_en: &amp;quot;[b]Fiber optic cables:[/b] Any existing fiber optic cables (MOST) have to be moved from the BMW connector to the Xtrons adapter.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { factory: [&amp;quot;mask&amp;quot;, &amp;quot;ccc&amp;quot;, &amp;quot;cic&amp;quot;, &amp;quot;nbt&amp;quot;, &amp;quot;nbtevo&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot;,&lt;br /&gt;
    html_en: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, opts: [&amp;quot;kcan&amp;quot;], when: {},&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot;,&lt;br /&gt;
    html_en: &amp;quot;[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].&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, opts: [&amp;quot;ibus&amp;quot;], when: {},&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot;,&lt;br /&gt;
    html_en: &amp;quot;[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].&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: {},&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot;,&lt;br /&gt;
    html_en: &amp;quot;[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].&amp;quot; }&lt;br /&gt;
];&lt;br /&gt;
/* =====================================================================&lt;br /&gt;
   PROGRAMMLOGIK&lt;br /&gt;
   ===================================================================== */&lt;br /&gt;
var $ = function (id) { return document.getElementById(id); };&lt;br /&gt;
var sel = {}, picked = {}, summary = &amp;quot;&amp;quot;, capA = 0, capB = 0, radioCache = {}, chosenRadio = null, cartFill = null;&lt;br /&gt;
var fieldsEl = $(&amp;quot;nvk-fields&amp;quot;), optsEl = $(&amp;quot;nvk-opts&amp;quot;), outEl = $(&amp;quot;nvk-out&amp;quot;);&lt;br /&gt;
var LANG = DEFAULT_LANG;&lt;br /&gt;
var AMP = &amp;quot;\u0026&amp;quot;;&lt;br /&gt;
function T(de, en) { return LANG === &amp;quot;en&amp;quot; ? en : de; }&lt;br /&gt;
function LT(o, k) { var v = LANG === &amp;quot;en&amp;quot; ? o[k + &amp;quot;_en&amp;quot;] : &amp;quot;&amp;quot;; return v ? v : o[k]; }&lt;br /&gt;
function itemUrl(i) { var v = LANG === &amp;quot;en&amp;quot; ? i.ue : &amp;quot;&amp;quot;; return v ? v : i.u; }&lt;br /&gt;
function full(u) { return u.indexOf(&amp;quot;/thumb/&amp;quot;) === -1 ? u : u.replace(&amp;quot;/thumb/&amp;quot;, &amp;quot;/&amp;quot;).replace(/\/[^\/]+$/, &amp;quot;&amp;quot;); }&lt;br /&gt;
function fmt(t) {&lt;br /&gt;
  return t.replace(/\[imgw=([^\x5D]+)\]/g, function (m, u) {&lt;br /&gt;
    return &amp;quot;\u003Ca href=\&amp;quot;&amp;quot; + full(u) + &amp;quot;\&amp;quot; target=\&amp;quot;_blank\&amp;quot; rel=\&amp;quot;noopener\&amp;quot;\u003E\u003Cimg class=\&amp;quot;nvk-img wide\&amp;quot; src=\&amp;quot;&amp;quot; + u + &amp;quot;\&amp;quot; alt=\&amp;quot;\&amp;quot;\u003E\u003C/a\u003E&amp;quot;;&lt;br /&gt;
  }).replace(/\[img=([^\x5D]+)\]/g, function (m, u) {&lt;br /&gt;
    return &amp;quot;\u003Ca href=\&amp;quot;&amp;quot; + full(u) + &amp;quot;\&amp;quot; target=\&amp;quot;_blank\&amp;quot; rel=\&amp;quot;noopener\&amp;quot;\u003E\u003Cimg class=\&amp;quot;nvk-img\&amp;quot; src=\&amp;quot;&amp;quot; + u + &amp;quot;\&amp;quot; alt=\&amp;quot;\&amp;quot;\u003E\u003C/a\u003E&amp;quot;;&lt;br /&gt;
  }).replace(/\[b\]/g, &amp;quot;\u003Cb\u003E&amp;quot;).replace(/\[\/b\]/g, &amp;quot;\u003C/b\u003E&amp;quot;).replace(/\[br\]/g, &amp;quot;\u003Cbr\u003E&amp;quot;)&lt;br /&gt;
    .replace(/\[a=([^\x5D]+)\]/g, &amp;quot;\u003Ca href=\&amp;quot;$1\&amp;quot; target=\&amp;quot;_blank\&amp;quot; rel=\&amp;quot;noopener\&amp;quot;\u003E&amp;quot;).replace(/\[\/a\]/g, &amp;quot;\u003C/a\u003E&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
function match(cond, s, lenient) {&lt;br /&gt;
  if (!cond) return true;&lt;br /&gt;
  for (var k in cond) {&lt;br /&gt;
    if (!s[k]) { if (lenient) continue; return false; }&lt;br /&gt;
    if (cond[k].indexOf(s[k]) === -1) return false;&lt;br /&gt;
  }&lt;br /&gt;
  return true;&lt;br /&gt;
}&lt;br /&gt;
function vehicleOf(id) { return VEHICLES.filter(function (x) { return x.v === id; })[0]; }&lt;br /&gt;
function derive() {&lt;br /&gt;
  var s = {}, k;&lt;br /&gt;
  for (k in sel) s[k] = sel[k];&lt;br /&gt;
  var veh = vehicleOf(sel.vehicle);&lt;br /&gt;
  if (veh) s.gen = veh.gen;&lt;br /&gt;
  if (s.gen === &amp;quot;alt&amp;quot;) {&lt;br /&gt;
    if (s.factory === &amp;quot;n43&amp;quot; || s.factory === &amp;quot;n169&amp;quot;) s.module = &amp;quot;ja&amp;quot;;&lt;br /&gt;
    else if (s.factory === &amp;quot;iris&amp;quot; || s.factory === &amp;quot;mid&amp;quot;) s.module = &amp;quot;nein&amp;quot;;&lt;br /&gt;
    else if (s.factory === &amp;quot;pfeil&amp;quot;) s.module = s.trunk || &amp;quot;unk&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  return s;&lt;br /&gt;
}&lt;br /&gt;
function forced(s) {&lt;br /&gt;
  var f = {};&lt;br /&gt;
  FORCED.forEach(function (r) { if (match(r.when, s)) r.opts.forEach(function (o) { f[o] = LT(r, &amp;quot;why&amp;quot;); }); });&lt;br /&gt;
  return f;&lt;br /&gt;
}&lt;br /&gt;
function onSet(s) {&lt;br /&gt;
  var f = forced(s), on = {}, k;&lt;br /&gt;
  for (k in picked) if (picked[k]) on[k] = true;&lt;br /&gt;
  for (k in f) on[k] = true;&lt;br /&gt;
  return { on: on, forced: f };&lt;br /&gt;
}&lt;br /&gt;
function optVisible(o, s, on) {&lt;br /&gt;
  if (!match(o.show, s, true)) return false;&lt;br /&gt;
  return (o.requires || []).every(function (r) { return on[r]; });&lt;br /&gt;
}&lt;br /&gt;
FIELDS.forEach(function (f) {&lt;br /&gt;
  var wrap = document.createElement(&amp;quot;div&amp;quot;); wrap.className = &amp;quot;nvk-f&amp;quot;; wrap.id = &amp;quot;nvk-w-&amp;quot; + f.id;&lt;br /&gt;
  var lab = document.createElement(&amp;quot;label&amp;quot;); lab.htmlFor = &amp;quot;nvk-&amp;quot; + f.id; lab.id = &amp;quot;nvk-l-&amp;quot; + f.id; lab.textContent = LT(f, &amp;quot;label&amp;quot;);&lt;br /&gt;
  var s = document.createElement(&amp;quot;select&amp;quot;); s.id = &amp;quot;nvk-&amp;quot; + f.id;&lt;br /&gt;
  s.addEventListener(&amp;quot;change&amp;quot;, function () { sel[f.id] = s.value; update(); });&lt;br /&gt;
  wrap.appendChild(lab); wrap.appendChild(s);&lt;br /&gt;
  if (f.help) { var h = document.createElement(&amp;quot;div&amp;quot;); h.className = &amp;quot;nvk-help&amp;quot;; h.id = &amp;quot;nvk-h-&amp;quot; + f.id; h.innerHTML = fmt(LT(f, &amp;quot;help&amp;quot;)); wrap.appendChild(h); }&lt;br /&gt;
  var inf = document.createElement(&amp;quot;div&amp;quot;); inf.id = &amp;quot;nvk-i-&amp;quot; + f.id; wrap.appendChild(inf);&lt;br /&gt;
  fieldsEl.appendChild(wrap);&lt;br /&gt;
});&lt;br /&gt;
function renderFields() {&lt;br /&gt;
  FIELDS.forEach(function (f) {&lt;br /&gt;
    var s = derive();&lt;br /&gt;
    var wrap = $(&amp;quot;nvk-w-&amp;quot; + f.id), el = $(&amp;quot;nvk-&amp;quot; + f.id);&lt;br /&gt;
    $(&amp;quot;nvk-l-&amp;quot; + f.id).textContent = LT(f, &amp;quot;label&amp;quot;);&lt;br /&gt;
    if (f.help) { $(&amp;quot;nvk-h-&amp;quot; + f.id).innerHTML = fmt(LT(f, &amp;quot;help&amp;quot;)); }&lt;br /&gt;
    var vis = f.show ? match(f.show, s, false) : true;&lt;br /&gt;
    wrap.style.display = vis ? &amp;quot;&amp;quot; : &amp;quot;none&amp;quot;;&lt;br /&gt;
    if (!vis) { sel[f.id] = &amp;quot;&amp;quot;; return; }&lt;br /&gt;
    var allowed = f.values.filter(function (v) { return match(v.only, s, true); });&lt;br /&gt;
    if (sel[f.id]) { if (!allowed.some(function (v) { return v.v === sel[f.id]; })) sel[f.id] = &amp;quot;&amp;quot;; }&lt;br /&gt;
    if (!sel[f.id]) { if (f.def) sel[f.id] = f.def; }&lt;br /&gt;
    if (!sel[f.id]) { if (f.auto) { if (sel.vehicle) { if (allowed.length === 1) sel[f.id] = allowed[0].v; } } }&lt;br /&gt;
    el.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
    if (!f.def) { var p = document.createElement(&amp;quot;option&amp;quot;); p.value = &amp;quot;&amp;quot;; p.textContent = T(&amp;quot;– bitte wählen –&amp;quot;, &amp;quot;– please select –&amp;quot;); el.appendChild(p); }&lt;br /&gt;
    allowed.forEach(function (v) {&lt;br /&gt;
      var o = document.createElement(&amp;quot;option&amp;quot;); o.value = v.v; o.textContent = LT(v, &amp;quot;t&amp;quot;); el.appendChild(o);&lt;br /&gt;
    });&lt;br /&gt;
    el.value = sel[f.id] || &amp;quot;&amp;quot;;&lt;br /&gt;
    var cur = allowed.filter(function (v) { return v.v === sel[f.id]; })[0];&lt;br /&gt;
    var pre = f.pre ? (match(f.pre.when, s, false) ? fmt(LT(f.pre, &amp;quot;html&amp;quot;)) : &amp;quot;&amp;quot;) : &amp;quot;&amp;quot;;&lt;br /&gt;
    $(&amp;quot;nvk-i-&amp;quot; + f.id).innerHTML = pre + (cur ? (cur.info ? fmt(LT(cur, &amp;quot;info&amp;quot;)) : &amp;quot;&amp;quot;) : &amp;quot;&amp;quot;);&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
function renderOpts() {&lt;br /&gt;
  var s = derive(), st = onSet(s);&lt;br /&gt;
  OPTS.forEach(function (o) { if (!optVisible(o, s, st.on)) picked[o.id] = false; });&lt;br /&gt;
  st = onSet(s);&lt;br /&gt;
  optsEl.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
  OPTS.forEach(function (o) {&lt;br /&gt;
    if (!optVisible(o, s, st.on)) return;&lt;br /&gt;
    var lab = document.createElement(&amp;quot;label&amp;quot;); lab.className = &amp;quot;nvk-o&amp;quot;;&lt;br /&gt;
    var cb = document.createElement(&amp;quot;input&amp;quot;); cb.type = &amp;quot;checkbox&amp;quot;;&lt;br /&gt;
    cb.checked = !!st.on[o.id];&lt;br /&gt;
    var isForced = !!st.forced[o.id];&lt;br /&gt;
    if (isForced) { cb.disabled = true; lab.className += &amp;quot; dis&amp;quot;; }&lt;br /&gt;
    cb.addEventListener(&amp;quot;change&amp;quot;, function () {&lt;br /&gt;
      picked[o.id] = cb.checked;&lt;br /&gt;
      if (cb.checked) { if (o.excl) OPTS.forEach(function (x) { if (x.excl === o.excl) { if (x.id !== o.id) picked[x.id] = false; } }); }&lt;br /&gt;
      update();&lt;br /&gt;
    });&lt;br /&gt;
    lab.appendChild(cb);&lt;br /&gt;
    lab.appendChild(document.createTextNode(&amp;quot; &amp;quot; + LT(o, &amp;quot;t&amp;quot;)));&lt;br /&gt;
    var sub = [LT(o, &amp;quot;sub&amp;quot;), isForced ? st.forced[o.id] : &amp;quot;&amp;quot;].filter(Boolean).join(&amp;quot; - &amp;quot;);&lt;br /&gt;
    if (sub) { var sm = document.createElement(&amp;quot;small&amp;quot;); sm.textContent = &amp;quot; (&amp;quot; + sub + &amp;quot;)&amp;quot;; lab.appendChild(sm); }&lt;br /&gt;
    optsEl.appendChild(lab);&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
function link(url, text) {&lt;br /&gt;
  var a = document.createElement(&amp;quot;a&amp;quot;); a.href = url; a.target = &amp;quot;_blank&amp;quot;; a.rel = &amp;quot;noopener&amp;quot;; a.textContent = text; return a;&lt;br /&gt;
}&lt;br /&gt;
function card(item, cls) {&lt;br /&gt;
  var d = document.createElement(&amp;quot;div&amp;quot;); d.className = &amp;quot;nvk-card &amp;quot; + (cls || &amp;quot;&amp;quot;) + (item.hl ? &amp;quot; hl&amp;quot; : &amp;quot;&amp;quot;);&lt;br /&gt;
  var b = document.createElement(&amp;quot;b&amp;quot;); b.textContent = LT(item, &amp;quot;t&amp;quot;); d.appendChild(b);&lt;br /&gt;
  var dd = LT(item, &amp;quot;d&amp;quot;);&lt;br /&gt;
  if (dd) { var p = document.createElement(&amp;quot;span&amp;quot;); p.textContent = dd; d.appendChild(p); }&lt;br /&gt;
  if (item.img) {&lt;br /&gt;
    var im = document.createElement(&amp;quot;div&amp;quot;);&lt;br /&gt;
    item.img.forEach(function (u) {&lt;br /&gt;
      var a = document.createElement(&amp;quot;a&amp;quot;); a.href = full(u); a.target = &amp;quot;_blank&amp;quot;; a.rel = &amp;quot;noopener&amp;quot;;&lt;br /&gt;
      var g = document.createElement(&amp;quot;img&amp;quot;); g.className = &amp;quot;nvk-img&amp;quot;; g.src = u; g.alt = LT(item, &amp;quot;t&amp;quot;); a.appendChild(g); im.appendChild(a);&lt;br /&gt;
    });&lt;br /&gt;
    d.appendChild(im);&lt;br /&gt;
  }&lt;br /&gt;
  var iu = itemUrl(item);&lt;br /&gt;
  if (iu || item.w) {&lt;br /&gt;
    var l = document.createElement(&amp;quot;div&amp;quot;); l.className = &amp;quot;nvk-links&amp;quot;;&lt;br /&gt;
    if (iu) l.appendChild(link(iu, LT(item, &amp;quot;ut&amp;quot;) || T(&amp;quot;Im Shop ansehen →&amp;quot;, &amp;quot;View in shop →&amp;quot;)));&lt;br /&gt;
    if (item.w) l.appendChild(link(item.w, (LT(item, &amp;quot;wt&amp;quot;) || T(&amp;quot;Zum Wiki&amp;quot;, &amp;quot;Open wiki&amp;quot;)) + &amp;quot; →&amp;quot;));&lt;br /&gt;
    d.appendChild(l);&lt;br /&gt;
  }&lt;br /&gt;
  if (item.links) item.links.forEach(function (x) {&lt;br /&gt;
    var r = document.createElement(&amp;quot;div&amp;quot;); r.className = &amp;quot;nvk-links&amp;quot;; r.appendChild(link(LANG === &amp;quot;en&amp;quot; ? (x.ue || x.u) : x.u, LT(x, &amp;quot;t&amp;quot;) + &amp;quot; →&amp;quot;)); d.appendChild(r);&lt;br /&gt;
  });&lt;br /&gt;
  return d;&lt;br /&gt;
}&lt;br /&gt;
function heading(txt) { var h = document.createElement(&amp;quot;h3&amp;quot;); h.textContent = txt; outEl.appendChild(h); }&lt;br /&gt;
function aidOf(u) {&lt;br /&gt;
  if (u.indexOf(SHOP) !== 0) return &amp;quot;&amp;quot;;&lt;br /&gt;
  var m = u.match(/sArticle\/(\d+)/);&lt;br /&gt;
  if (!m) m = u.split(&amp;quot;?&amp;quot;)[0].match(/\/(\d+)\/[^\/]+$/);&lt;br /&gt;
  return m ? m[1] : &amp;quot;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
function renderRadioList(veh) {&lt;br /&gt;
  if (veh.noCat) return;&lt;br /&gt;
  if (chosenRadio) { if (chosenRadio.cat !== veh.v) chosenRadio = null; }&lt;br /&gt;
  var ck = veh.v + &amp;quot;-&amp;quot; + LANG;&lt;br /&gt;
  var data = radioCache[ck];&lt;br /&gt;
  if (data === undefined) {&lt;br /&gt;
    radioCache[ck] = &amp;quot;loading&amp;quot;;&lt;br /&gt;
    fetch(API + &amp;quot;?cat=&amp;quot; + encodeURIComponent(veh.v) + AMP + &amp;quot;lang=&amp;quot; + LANG).then(function (r) { return r.json(); }).then(function (j) {&lt;br /&gt;
      radioCache[ck] = (j.items || []).map(function (it) { it.cat = veh.v; return it; });&lt;br /&gt;
      renderResult();&lt;br /&gt;
    }).catch(function () { radioCache[ck] = []; renderResult(); });&lt;br /&gt;
  }&lt;br /&gt;
  if (data === undefined || data === &amp;quot;loading&amp;quot;) {&lt;br /&gt;
    var m = document.createElement(&amp;quot;p&amp;quot;); m.className = &amp;quot;nvk-miss&amp;quot;; m.textContent = T(&amp;quot;Verfügbare Radios werden geladen …&amp;quot;, &amp;quot;Loading available radios …&amp;quot;); outEl.appendChild(m); return;&lt;br /&gt;
  }&lt;br /&gt;
  if (!data.length) return;&lt;br /&gt;
  var want = { mask: /M-?ASK/i, ccc: /\bCCC\b/i, cic: /\bCIC\b/i, nbt: /\bNBT\b/i, nbtevo: /EVO/i }[sel.factory];&lt;br /&gt;
  function fits(it) { return want ? want.test(it.name) : false; }&lt;br /&gt;
  var list = data.slice().sort(function (a, b) { return (fits(b) ? 1 : 0) - (fits(a) ? 1 : 0); });&lt;br /&gt;
  var det = document.createElement(&amp;quot;details&amp;quot;); det.open = Math.max(list.length, 8) === 8;&lt;br /&gt;
  var sm = document.createElement(&amp;quot;summary&amp;quot;); sm.style.cursor = &amp;quot;pointer&amp;quot;; sm.style.fontWeight = &amp;quot;700&amp;quot;;&lt;br /&gt;
  sm.textContent = T(&amp;quot;Verfügbare Radios für Deinen BMW &amp;quot;, &amp;quot;Available radios for your BMW &amp;quot;) + vname(veh) + &amp;quot; (&amp;quot; + list.length + &amp;quot;)&amp;quot;; det.appendChild(sm);&lt;br /&gt;
  list.forEach(function (it) {&lt;br /&gt;
    var row = document.createElement(&amp;quot;div&amp;quot;); row.className = &amp;quot;nvk-row&amp;quot;;&lt;br /&gt;
    var lab = document.createElement(&amp;quot;label&amp;quot;); lab.className = &amp;quot;nvk-o&amp;quot;;&lt;br /&gt;
    var rb = document.createElement(&amp;quot;input&amp;quot;); rb.type = &amp;quot;radio&amp;quot;; rb.name = &amp;quot;nvk-radio&amp;quot;;&lt;br /&gt;
    rb.checked = chosenRadio ? chosenRadio.sku === it.sku : false;&lt;br /&gt;
    rb.addEventListener(&amp;quot;change&amp;quot;, function () { chosenRadio = it; if (cartFill) cartFill(); });&lt;br /&gt;
    lab.appendChild(rb);&lt;br /&gt;
    lab.appendChild(document.createTextNode(&amp;quot; &amp;quot; + it.name + (it.price ? &amp;quot;  -  &amp;quot; + it.price : &amp;quot;&amp;quot;) + (fits(it) ? T(&amp;quot;  (passt zu Deiner Auswahl)&amp;quot;, &amp;quot;  (matches your selection)&amp;quot;) : &amp;quot;&amp;quot;)));&lt;br /&gt;
    row.appendChild(lab); row.appendChild(link(it.url, &amp;quot;Shop →&amp;quot;));&lt;br /&gt;
    det.appendChild(row);&lt;br /&gt;
  });&lt;br /&gt;
  outEl.appendChild(det);&lt;br /&gt;
}&lt;br /&gt;
function cartBlock(needs, opt) {&lt;br /&gt;
  var items = [];&lt;br /&gt;
  needs.concat(opt).forEach(function (i) { var id = aidOf(itemUrl(i) || &amp;quot;&amp;quot;); if (id) items.push({ t: LT(i, &amp;quot;t&amp;quot;), aid: id, sku: LANG === &amp;quot;en&amp;quot; ? i.sku_en : i.sku }); });&lt;br /&gt;
  heading(T(&amp;quot;In den Warenkorb&amp;quot;, &amp;quot;Add to cart&amp;quot;));&lt;br /&gt;
  var box = document.createElement(&amp;quot;div&amp;quot;); box.className = &amp;quot;nvk-card opt&amp;quot;;&lt;br /&gt;
  var p = document.createElement(&amp;quot;div&amp;quot;);&lt;br /&gt;
  p.textContent = T(&amp;quot;Das oben gewählte Radio (falls ausgewählt) und diese Artikel werden direkt im Shop in den Warenkorb gelegt:&amp;quot;, &amp;quot;The radio selected above (if any) and these items will be added to your cart in the shop:&amp;quot;);&lt;br /&gt;
  box.appendChild(p);&lt;br /&gt;
  var listEl = document.createElement(&amp;quot;div&amp;quot;); box.appendChild(listEl);&lt;br /&gt;
  cartFill = function () {&lt;br /&gt;
    listEl.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
    var lines = (chosenRadio ? [&amp;quot;Radio: &amp;quot; + chosenRadio.type] : []).concat(items.map(function (x) { return x.t; }));&lt;br /&gt;
    lines.forEach(function (t) { var r = document.createElement(&amp;quot;div&amp;quot;); r.textContent = &amp;quot;- &amp;quot; + t; listEl.appendChild(r); });&lt;br /&gt;
  };&lt;br /&gt;
  cartFill();&lt;br /&gt;
  var n = document.createElement(&amp;quot;div&amp;quot;); n.className = &amp;quot;nvk-help&amp;quot;;&lt;br /&gt;
  n.textContent = T(&amp;quot;Kameras, TPMS, Werkzeug und Artikel ohne Direktlink wählst Du bitte über die Links oben im Shop aus.&amp;quot;, &amp;quot;Cameras, TPMS, tools and items without a direct link: please pick them in the shop using the links above.&amp;quot;);&lt;br /&gt;
  box.appendChild(n);&lt;br /&gt;
  var all = needs.concat(opt);&lt;br /&gt;
  var has = function (k) { return all.indexOf(ITEMS[k]) !== -1; };&lt;br /&gt;
  var l17 = has(&amp;quot;kcanlic&amp;quot;), l7 = has(&amp;quot;bclic&amp;quot;) || has(&amp;quot;bcdsp&amp;quot;);&lt;br /&gt;
  if (l17 || l7) {&lt;br /&gt;
    var vb = document.createElement(&amp;quot;div&amp;quot;); vb.className = &amp;quot;nvk-f&amp;quot;; vb.style.marginTop = &amp;quot;12px&amp;quot;;&lt;br /&gt;
    var vlab = document.createElement(&amp;quot;label&amp;quot;); vlab.htmlFor = &amp;quot;nvk-licvin&amp;quot;;&lt;br /&gt;
    vlab.textContent = l17 ? T(&amp;quot;Fahrgestellnummer (17 Zeichen) für die Lizenz&amp;quot;, &amp;quot;Full VIN (17 characters) for the license&amp;quot;) : T(&amp;quot;VIN für die Lizenz (7 Zeichen, z. B. AB12345)&amp;quot;, &amp;quot;VIN for the license (7 characters, e.g. AB12345)&amp;quot;);&lt;br /&gt;
    var vin = document.createElement(&amp;quot;input&amp;quot;); vin.type = &amp;quot;text&amp;quot;; vin.id = &amp;quot;nvk-licvin&amp;quot;; vin.maxLength = 17;&lt;br /&gt;
    vin.value = $(&amp;quot;nvk-vin&amp;quot;).value.toUpperCase();&lt;br /&gt;
    var ta = document.createElement(&amp;quot;textarea&amp;quot;); ta.rows = 3; ta.readOnly = true; ta.style.display = &amp;quot;none&amp;quot;; ta.style.marginTop = &amp;quot;6px&amp;quot;;&lt;br /&gt;
    var cb = document.createElement(&amp;quot;button&amp;quot;); cb.type = &amp;quot;button&amp;quot;; cb.className = &amp;quot;nvk-btn&amp;quot;; cb.style.marginTop = &amp;quot;6px&amp;quot;;&lt;br /&gt;
    cb.textContent = T(&amp;quot;Kommentartext für die Kasse kopieren&amp;quot;, &amp;quot;Copy comment text for checkout&amp;quot;);&lt;br /&gt;
    var ls = document.createElement(&amp;quot;div&amp;quot;); ls.className = &amp;quot;nvk-help&amp;quot;;&lt;br /&gt;
    cb.addEventListener(&amp;quot;click&amp;quot;, function () {&lt;br /&gt;
      var v = vin.value.trim().toUpperCase(), v7 = &amp;quot;&amp;quot;, v17 = &amp;quot;&amp;quot;;&lt;br /&gt;
      if (/^[A-HJ-NPR-Z0-9]{17}$/.test(v)) { v17 = v; v7 = v.slice(10); }&lt;br /&gt;
      else if (/^[A-Z]{2}[0-9]{5}$/.test(v)) v7 = v;&lt;br /&gt;
      if (l17 ? !v17 : !v7) { ls.textContent = l17 ? T(&amp;quot;Bitte die vollständige 17-stellige Fahrgestellnummer eingeben.&amp;quot;, &amp;quot;Please enter the full 17-character VIN.&amp;quot;) : T(&amp;quot;Bitte die VIN im Format AB12345 (oder die 17-stellige FGN) eingeben.&amp;quot;, &amp;quot;Please enter the VIN as AB12345 (or the full 17-character VIN).&amp;quot;); return; }&lt;br /&gt;
      var L = [];&lt;br /&gt;
      if (has(&amp;quot;bclic&amp;quot;)) L.push(T(&amp;quot;I-BUS App BC Lizenz: VIN &amp;quot;, &amp;quot;I-BUS App OBC License: VIN &amp;quot;) + v7);&lt;br /&gt;
      if (has(&amp;quot;bcdsp&amp;quot;)) L.push(T(&amp;quot;I-BUS App BC+DSP Lizenz: VIN &amp;quot;, &amp;quot;I-BUS App OBC+DSP License: VIN &amp;quot;) + v7);&lt;br /&gt;
      if (l17) L.push(T(&amp;quot;K-CAN App Beta Lizenz: FGN &amp;quot;, &amp;quot;K-CAN App Beta License: VIN &amp;quot;) + v17);&lt;br /&gt;
      ta.value = L.join(&amp;quot;\n&amp;quot;); ta.style.display = &amp;quot;&amp;quot;; ta.select();&lt;br /&gt;
      var hint = T(&amp;quot;Bitte an der Shop-Kasse in das Feld Kommentar einfügen.&amp;quot;, &amp;quot;Please paste it into the Comment field at the shop checkout.&amp;quot;);&lt;br /&gt;
      var manual = T(&amp;quot;Bitte den Text markieren und kopieren. &amp;quot;, &amp;quot;Please select and copy the text. &amp;quot;);&lt;br /&gt;
      if (navigator.clipboard) navigator.clipboard.writeText(ta.value).then(function () { ls.textContent = T(&amp;quot;Text kopiert. &amp;quot;, &amp;quot;Text copied. &amp;quot;) + hint; }).catch(function () { ls.textContent = manual + hint; });&lt;br /&gt;
      else ls.textContent = manual + hint;&lt;br /&gt;
    });&lt;br /&gt;
    vb.appendChild(vlab); vb.appendChild(vin); vb.appendChild(cb); vb.appendChild(ta); vb.appendChild(ls); box.appendChild(vb);&lt;br /&gt;
  }&lt;br /&gt;
  if (!CART_TRANSFER) { outEl.appendChild(box); return; }&lt;br /&gt;
  var btn = document.createElement(&amp;quot;button&amp;quot;); btn.type = &amp;quot;button&amp;quot;; btn.className = &amp;quot;nvk-btn&amp;quot;; btn.style.marginTop = &amp;quot;8px&amp;quot;;&lt;br /&gt;
  btn.textContent = T(&amp;quot;Auswahl in den Warenkorb legen&amp;quot;, &amp;quot;Add selection to cart&amp;quot;);&lt;br /&gt;
  var st = document.createElement(&amp;quot;div&amp;quot;); st.className = &amp;quot;nvk-help&amp;quot;;&lt;br /&gt;
  btn.addEventListener(&amp;quot;click&amp;quot;, function () { addToCart(items, st); });&lt;br /&gt;
  box.appendChild(btn); box.appendChild(st); outEl.appendChild(box);&lt;br /&gt;
}&lt;br /&gt;
function addToCart(items, st) {&lt;br /&gt;
  var list = items.slice();&lt;br /&gt;
  if (chosenRadio) list.unshift({ t: chosenRadio.type, sku: chosenRadio.sku });&lt;br /&gt;
  if (!list.length) { st.textContent = T(&amp;quot;Es ist noch nichts zum Bestellen ausgewählt.&amp;quot;, &amp;quot;Nothing has been selected to order yet.&amp;quot;); return; }&lt;br /&gt;
  var w = window.open(&amp;quot;&amp;quot;, &amp;quot;_blank&amp;quot;);&lt;br /&gt;
  st.textContent = T(&amp;quot;Artikelnummern werden ermittelt …&amp;quot;, &amp;quot;Looking up item numbers …&amp;quot;);&lt;br /&gt;
  var ids = list.filter(function (x) { return x.aid; }).map(function (x) { return x.aid; });&lt;br /&gt;
  var get = ids.length ? fetch(API + &amp;quot;?aid=&amp;quot; + ids.join(&amp;quot;,&amp;quot;) + AMP + &amp;quot;lang=&amp;quot; + LANG).then(function (r) { return r.json(); }).then(function (j) { return j.skus || {}; }) : Promise.resolve({});&lt;br /&gt;
  get.then(function (map) {&lt;br /&gt;
    var skus = [];&lt;br /&gt;
    list.forEach(function (x) { var k = x.sku || map[x.aid]; if (k) skus.push(k); });&lt;br /&gt;
    if (!skus.length) throw new Error(&amp;quot;none&amp;quot;);&lt;br /&gt;
    var url = (LANG === &amp;quot;en&amp;quot; ? TRANSFER_URL_EN : TRANSFER_URL) + encodeURIComponent(skus.join(&amp;quot;,&amp;quot;));&lt;br /&gt;
    if (w) {&lt;br /&gt;
      w.location.href = url;&lt;br /&gt;
      st.textContent = T(&amp;quot;Der Shop wurde in einem neuen Tab geöffnet (&amp;quot; + skus.length + &amp;quot; von &amp;quot; + list.length + &amp;quot; Artikeln übergeben). Bitte dort den Warenkorb kontrollieren. Ist ein Artikel nicht bestellbar, weist der Shop darauf hin.&amp;quot;, &amp;quot;The shop was opened in a new tab (&amp;quot; + skus.length + &amp;quot; of &amp;quot; + list.length + &amp;quot; items transferred). Please check the cart there. If an item cannot be ordered, the shop will tell you.&amp;quot;);&lt;br /&gt;
    } else {&lt;br /&gt;
      st.textContent = T(&amp;quot;Der neue Tab wurde blockiert. Bitte Pop-ups erlauben oder diesen Link nutzen: &amp;quot;, &amp;quot;The new tab was blocked. Please allow pop-ups or use this link: &amp;quot;);&lt;br /&gt;
      st.appendChild(link(url, T(&amp;quot;Warenkorb im Shop öffnen →&amp;quot;, &amp;quot;Open cart in the shop →&amp;quot;)));&lt;br /&gt;
    }&lt;br /&gt;
  }).catch(function () { if (w) w.close(); st.textContent = T(&amp;quot;Das hat leider nicht geklappt. Bitte nutze die Shop-Links oben.&amp;quot;, &amp;quot;Sorry, that did not work. Please use the shop links above.&amp;quot;); });&lt;br /&gt;
}&lt;br /&gt;
function renderResult() {&lt;br /&gt;
  var s = derive(), st = onSet(s);&lt;br /&gt;
  var missing = FIELDS.filter(function (f) {&lt;br /&gt;
    var w = $(&amp;quot;nvk-w-&amp;quot; + f.id);&lt;br /&gt;
    return w.style.display !== &amp;quot;none&amp;quot; ? (!f.optional ? !sel[f.id] : false) : false;&lt;br /&gt;
  });&lt;br /&gt;
  outEl.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
  if (missing.length) {&lt;br /&gt;
    var m = document.createElement(&amp;quot;p&amp;quot;); m.className = &amp;quot;nvk-miss&amp;quot;;&lt;br /&gt;
    m.textContent = T(&amp;quot;Bitte noch auswählen: &amp;quot;, &amp;quot;Please still select: &amp;quot;) + missing.map(function (f) { return LT(f, &amp;quot;label&amp;quot;); }).join(&amp;quot;, &amp;quot;);&lt;br /&gt;
    outEl.appendChild(m); $(&amp;quot;nvk-form&amp;quot;).style.display = &amp;quot;none&amp;quot;; return;&lt;br /&gt;
  }&lt;br /&gt;
  $(&amp;quot;nvk-form&amp;quot;).style.display = &amp;quot;&amp;quot;;&lt;br /&gt;
  var veh = vehicleOf(sel.vehicle);&lt;br /&gt;
  var rbase = LANG === &amp;quot;en&amp;quot; ? SHOP_EN + &amp;quot;bmw-head-units/&amp;quot; : SHOP + &amp;quot;bmw-radios/&amp;quot;;&lt;br /&gt;
  var ru = veh.noCat ? rbase : rbase + (LANG === &amp;quot;en&amp;quot; ? enSlug(veh.v) : veh.v) + &amp;quot;/&amp;quot;;&lt;br /&gt;
  heading(T(&amp;quot;Passende Radios&amp;quot;, &amp;quot;Matching radios&amp;quot;));&lt;br /&gt;
  outEl.appendChild(card({ t: T(&amp;quot;BMW Radios für &amp;quot; + veh.t, &amp;quot;BMW radios for &amp;quot; + vname(veh)), d: T(&amp;quot;Alle Radios, die für Deinen BMW &amp;quot; + veh.t + &amp;quot; im Shop erhältlich sind.&amp;quot;, &amp;quot;All radios available in the shop for your BMW &amp;quot; + vname(veh) + &amp;quot;.&amp;quot;),&lt;br /&gt;
    u: ru, ut: T(&amp;quot;Zu den passenden Radios →&amp;quot;, &amp;quot;To the matching radios →&amp;quot;), w: rbase, wt: T(&amp;quot;Alle BMW Radios&amp;quot;, &amp;quot;All BMW radios&amp;quot;) }, &amp;quot;rad&amp;quot;));&lt;br /&gt;
  renderRadioList(veh);&lt;br /&gt;
  var needs = [], hints = [], seen = {};&lt;br /&gt;
  RULES.forEach(function (r) {&lt;br /&gt;
    if (!match(r.when, s)) return;&lt;br /&gt;
    if (r.opts) { if (!r.opts.every(function (o) { return st.on[o]; })) return; }&lt;br /&gt;
    if (r.type === &amp;quot;need&amp;quot;) (r.items || []).forEach(function (id) { if (!seen[id]) { seen[id] = 1; needs.push(ITEMS[id]); } });&lt;br /&gt;
    else hints.push(LT(r, &amp;quot;html&amp;quot;));&lt;br /&gt;
  });&lt;br /&gt;
  heading(T(&amp;quot;Das brauchst Du&amp;quot;, &amp;quot;What you need&amp;quot;));&lt;br /&gt;
  if (needs.length) needs.forEach(function (i) { outEl.appendChild(card(i)); });&lt;br /&gt;
  else { var n = document.createElement(&amp;quot;p&amp;quot;); n.textContent = T(&amp;quot;Für die Grundinstallation sind keine zusätzlichen Verlängerungen oder Adapter nötig.&amp;quot;, &amp;quot;No additional extensions or adapters are needed for the basic installation.&amp;quot;); outEl.appendChild(n); }&lt;br /&gt;
  var opt = [];&lt;br /&gt;
  OPTS.forEach(function (o) {&lt;br /&gt;
    if (!st.on[o.id]) return;&lt;br /&gt;
    if (!optVisible(o, s, st.on)) return;&lt;br /&gt;
    o.items.forEach(function (id) {&lt;br /&gt;
      if (seen[id]) return;&lt;br /&gt;
      var sk = ITEMS[id].skipIf;&lt;br /&gt;
      if (sk) { if (seen[sk]) return; }&lt;br /&gt;
      seen[id] = 1; opt.push(ITEMS[id]);&lt;br /&gt;
    });&lt;br /&gt;
  });&lt;br /&gt;
  if (opt.length) { heading(T(&amp;quot;Deine Zusatzoptionen&amp;quot;, &amp;quot;Your additional options&amp;quot;)); opt.forEach(function (i) { outEl.appendChild(card(i, &amp;quot;opt&amp;quot;)); }); }&lt;br /&gt;
  if (hints.length) {&lt;br /&gt;
    heading(T(&amp;quot;Hinweise&amp;quot;, &amp;quot;Notes&amp;quot;));&lt;br /&gt;
    hints.forEach(function (t) { var d = document.createElement(&amp;quot;div&amp;quot;); d.className = &amp;quot;nvk-note&amp;quot;; d.innerHTML = fmt(t); outEl.appendChild(d); });&lt;br /&gt;
  }&lt;br /&gt;
  var L = [T(&amp;quot;KONFIGURATION&amp;quot;, &amp;quot;CONFIGURATION&amp;quot;), &amp;quot;Language: &amp;quot; + LANG];&lt;br /&gt;
  FIELDS.forEach(function (f) {&lt;br /&gt;
    if (!sel[f.id]) return;&lt;br /&gt;
    var v = f.values.filter(function (x) { return x.v === sel[f.id]; })[0];&lt;br /&gt;
    if (v) L.push(&amp;quot;- &amp;quot; + LT(f, &amp;quot;label&amp;quot;) + &amp;quot;: &amp;quot; + LT(v, &amp;quot;t&amp;quot;));&lt;br /&gt;
  });&lt;br /&gt;
  L.push(&amp;quot;&amp;quot;, T(&amp;quot;BENÖTIGT&amp;quot;, &amp;quot;REQUIRED&amp;quot;));&lt;br /&gt;
  needs.forEach(function (i) { L.push(&amp;quot;- &amp;quot; + LT(i, &amp;quot;t&amp;quot;) + (itemUrl(i) ? &amp;quot;  &amp;quot; + itemUrl(i) : &amp;quot;&amp;quot;)); });&lt;br /&gt;
  if (opt.length) { L.push(&amp;quot;&amp;quot;, T(&amp;quot;ZUSATZOPTIONEN&amp;quot;, &amp;quot;ADDITIONAL OPTIONS&amp;quot;)); opt.forEach(function (i) { L.push(&amp;quot;- &amp;quot; + LT(i, &amp;quot;t&amp;quot;) + (itemUrl(i) ? &amp;quot;  &amp;quot; + itemUrl(i) : &amp;quot;&amp;quot;)); }); }&lt;br /&gt;
  L.push(&amp;quot;&amp;quot;, &amp;quot;Radios: &amp;quot; + ru);&lt;br /&gt;
  summary = L.join(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  cartBlock(needs, opt);&lt;br /&gt;
}&lt;br /&gt;
function update() { renderFields(); renderOpts(); renderResult(); }&lt;br /&gt;
function capText() { $(&amp;quot;nvk-capq&amp;quot;).textContent = T(&amp;quot;Sicherheitsfrage: Was ist &amp;quot;, &amp;quot;Security question: What is &amp;quot;) + capA + &amp;quot; + &amp;quot; + capB + &amp;quot;? *&amp;quot;; }&lt;br /&gt;
function newCaptcha() {&lt;br /&gt;
  capA = 1 + Math.floor(Math.random() * 9); capB = 1 + Math.floor(Math.random() * 9);&lt;br /&gt;
  capText(); $(&amp;quot;nvk-cap&amp;quot;).value = &amp;quot;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
function status(msg, ok) { var e = $(&amp;quot;nvk-status&amp;quot;); e.style.display = &amp;quot;&amp;quot;; e.textContent = msg; e.style.borderLeftColor = ok ? &amp;quot;#14866d&amp;quot; : &amp;quot;#d33&amp;quot;; }&lt;br /&gt;
$(&amp;quot;nvk-send&amp;quot;).addEventListener(&amp;quot;click&amp;quot;, function () {&lt;br /&gt;
  var name = $(&amp;quot;nvk-name&amp;quot;).value.trim(), mail = $(&amp;quot;nvk-mail&amp;quot;).value.trim(), vin = $(&amp;quot;nvk-vin&amp;quot;).value.trim().toUpperCase(), msg = $(&amp;quot;nvk-msg&amp;quot;).value.trim();&lt;br /&gt;
  if (!name || !mail || !msg) return status(T(&amp;quot;Bitte Name, E-Mail und Kommentar ausfüllen.&amp;quot;, &amp;quot;Please fill in name, email and comment.&amp;quot;), false);&lt;br /&gt;
  if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(mail)) return status(T(&amp;quot;Bitte eine gültige E-Mail-Adresse eingeben.&amp;quot;, &amp;quot;Please enter a valid email address.&amp;quot;), false);&lt;br /&gt;
  if (vin) { if (!/^[A-Z]{2}[0-9]{5}$/.test(vin)) { if (!/^[A-HJ-NPR-Z0-9]{17}$/.test(vin)) return status(T(&amp;quot;Bitte die VIN im Format AB12345 oder die 17-stellige FGN eingeben - oder das Feld leer lassen.&amp;quot;, &amp;quot;Please enter the VIN as AB12345 or the full 17-character VIN - or leave the field empty.&amp;quot;), false); } }&lt;br /&gt;
  if (parseInt($(&amp;quot;nvk-cap&amp;quot;).value, 10) !== capA + capB) return status(T(&amp;quot;Die Sicherheitsfrage wurde nicht richtig beantwortet.&amp;quot;, &amp;quot;The security question was not answered correctly.&amp;quot;), false);&lt;br /&gt;
  if (!$(&amp;quot;nvk-dsgvo&amp;quot;).checked) return status(T(&amp;quot;Bitte der Verarbeitung Deiner Daten zustimmen.&amp;quot;, &amp;quot;Please agree to the processing of your data.&amp;quot;), false);&lt;br /&gt;
  if ($(&amp;quot;nvk-hp&amp;quot;).value) return;&lt;br /&gt;
  var sz = $(&amp;quot;nvk-size&amp;quot;).value;&lt;br /&gt;
  var rad = chosenRadio ? &amp;quot;\n\n&amp;quot; + T(&amp;quot;GEWÄHLTES RADIO&amp;quot;, &amp;quot;SELECTED RADIO&amp;quot;) + &amp;quot;\n- &amp;quot; + chosenRadio.type + &amp;quot;  &amp;quot; + chosenRadio.url : &amp;quot;&amp;quot;;&lt;br /&gt;
  var sum2 = summary + rad + (sz ? &amp;quot;\n\n&amp;quot; + T(&amp;quot;Gewünschte Displaygröße: &amp;quot;, &amp;quot;Desired display size: &amp;quot;) + sz : &amp;quot;&amp;quot;);&lt;br /&gt;
  var text = &amp;quot;Name: &amp;quot; + name + &amp;quot;\n&amp;quot; + T(&amp;quot;E-Mail: &amp;quot;, &amp;quot;Email: &amp;quot;) + mail + &amp;quot;\nVIN: &amp;quot; + (vin || &amp;quot;-&amp;quot;) + &amp;quot;\n\n&amp;quot; + T(&amp;quot;Kommentar:&amp;quot;, &amp;quot;Comment:&amp;quot;) + &amp;quot;\n&amp;quot; + msg + &amp;quot;\n\n&amp;quot; + sum2;&lt;br /&gt;
  if (SEND_URL) {&lt;br /&gt;
    var p = new URLSearchParams();&lt;br /&gt;
    p.append(&amp;quot;name&amp;quot;, name); p.append(&amp;quot;mail&amp;quot;, mail); p.append(&amp;quot;vin&amp;quot;, vin); p.append(&amp;quot;msg&amp;quot;, msg); p.append(&amp;quot;summary&amp;quot;, sum2);&lt;br /&gt;
    p.append(&amp;quot;hp&amp;quot;, $(&amp;quot;nvk-hp&amp;quot;).value); p.append(&amp;quot;ca&amp;quot;, capA); p.append(&amp;quot;cb&amp;quot;, capB); p.append(&amp;quot;cv&amp;quot;, $(&amp;quot;nvk-cap&amp;quot;).value); p.append(&amp;quot;lang&amp;quot;, LANG);&lt;br /&gt;
    fetch(SEND_URL, { method: &amp;quot;POST&amp;quot;, body: p }).then(function (r) {&lt;br /&gt;
      if (!r.ok) throw new Error(&amp;quot;send&amp;quot;);&lt;br /&gt;
      status(T(&amp;quot;Danke! Deine Anfrage wurde gesendet, eine Kopie geht an &amp;quot; + mail + &amp;quot;.&amp;quot;, &amp;quot;Thank you! Your request has been sent, a copy goes to &amp;quot; + mail + &amp;quot;.&amp;quot;), true); newCaptcha();&lt;br /&gt;
    }).catch(function () { status(T(&amp;quot;Das Senden hat nicht geklappt. Bitte versuche es später noch einmal oder schreibe direkt an &amp;quot; + MAIL_TO + &amp;quot;.&amp;quot;, &amp;quot;Sending failed. Please try again later or write directly to &amp;quot; + MAIL_TO + &amp;quot;.&amp;quot;), false); });&lt;br /&gt;
  } else {&lt;br /&gt;
    window.location.href = &amp;quot;mailto:&amp;quot; + MAIL_TO + &amp;quot;?cc=&amp;quot; + encodeURIComponent(mail) + AMP + &amp;quot;subject=&amp;quot; + encodeURIComponent(T(MAIL_SUBJECT, MAIL_SUBJECT_EN)) + AMP + &amp;quot;body=&amp;quot; + encodeURIComponent(text);&lt;br /&gt;
    status(T(&amp;quot;Dein E-Mail-Programm wurde mit der fertigen Anfrage geöffnet. Bitte dort noch auf Senden klicken.&amp;quot;, &amp;quot;Your email program was opened with the finished request. Please click Send there.&amp;quot;), true);&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
$(&amp;quot;nvk-reset&amp;quot;).addEventListener(&amp;quot;click&amp;quot;, function () { sel = {}; picked = {}; chosenRadio = null; update(); });&lt;br /&gt;
function renderLegal() {&lt;br /&gt;
  var le = $(&amp;quot;nvk-legal-links&amp;quot;), dl = $(&amp;quot;nvk-dslink&amp;quot;), first = true;&lt;br /&gt;
  le.innerHTML = &amp;quot;&amp;quot;; dl.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
  [ [&amp;quot;agb&amp;quot;, T(&amp;quot;AGB&amp;quot;, &amp;quot;Terms and conditions&amp;quot;)], [&amp;quot;widerruf&amp;quot;, T(&amp;quot;Widerrufsbelehrung&amp;quot;, &amp;quot;Right of withdrawal&amp;quot;)], [&amp;quot;datenschutz&amp;quot;, T(&amp;quot;Datenschutzerklärung&amp;quot;, &amp;quot;Privacy policy&amp;quot;)] ].forEach(function (x) {&lt;br /&gt;
    var key = x[0], url = LANG === &amp;quot;en&amp;quot; ? (LEGAL_EN[key] || LEGAL[key]) : LEGAL[key];&lt;br /&gt;
    if (!url) return;&lt;br /&gt;
    if (!first) le.appendChild(document.createTextNode(&amp;quot; | &amp;quot;));&lt;br /&gt;
    first = false; le.appendChild(link(url, x[1]));&lt;br /&gt;
    if (key === &amp;quot;datenschutz&amp;quot;) {&lt;br /&gt;
      dl.appendChild(document.createTextNode(&amp;quot; (&amp;quot;)); dl.appendChild(link(url, x[1])); dl.appendChild(document.createTextNode(&amp;quot;)&amp;quot;));&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
function applyStatic() {&lt;br /&gt;
  Array.prototype.forEach.call(document.querySelectorAll(&amp;quot;#nvk [data-en]&amp;quot;), function (e) {&lt;br /&gt;
    if (e.getAttribute(&amp;quot;data-de&amp;quot;) === null) e.setAttribute(&amp;quot;data-de&amp;quot;, e.textContent);&lt;br /&gt;
    e.textContent = LANG === &amp;quot;en&amp;quot; ? e.getAttribute(&amp;quot;data-en&amp;quot;) : e.getAttribute(&amp;quot;data-de&amp;quot;);&lt;br /&gt;
  });&lt;br /&gt;
  Array.prototype.forEach.call(document.querySelectorAll(&amp;quot;#nvk [data-en-ph]&amp;quot;), function (e) {&lt;br /&gt;
    if (e.getAttribute(&amp;quot;data-de-ph&amp;quot;) === null) e.setAttribute(&amp;quot;data-de-ph&amp;quot;, e.placeholder);&lt;br /&gt;
    e.placeholder = LANG === &amp;quot;en&amp;quot; ? e.getAttribute(&amp;quot;data-en-ph&amp;quot;) : e.getAttribute(&amp;quot;data-de-ph&amp;quot;);&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
function markLang() {&lt;br /&gt;
  [&amp;quot;de&amp;quot;, &amp;quot;en&amp;quot;].forEach(function (l) {&lt;br /&gt;
    var b = $(&amp;quot;nvk-lang-&amp;quot; + l);&lt;br /&gt;
    b.style.fontWeight = LANG === l ? &amp;quot;700&amp;quot; : &amp;quot;400&amp;quot;;&lt;br /&gt;
    b.style.borderColor = LANG === l ? &amp;quot;#f26522&amp;quot; : &amp;quot;#a2a9b1&amp;quot;;&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
function setLang(l) {&lt;br /&gt;
  LANG = l;&lt;br /&gt;
  try { localStorage.setItem(&amp;quot;nvk-lang&amp;quot;, l); } catch (e) { }&lt;br /&gt;
  markLang(); applyStatic(); renderLegal(); capText(); update();&lt;br /&gt;
}&lt;br /&gt;
[&amp;quot;de&amp;quot;, &amp;quot;en&amp;quot;].forEach(function (l) {&lt;br /&gt;
  var b = document.createElement(&amp;quot;button&amp;quot;); b.type = &amp;quot;button&amp;quot;; b.className = &amp;quot;nvk-btn&amp;quot;; b.id = &amp;quot;nvk-lang-&amp;quot; + l;&lt;br /&gt;
  b.textContent = l.toUpperCase(); b.style.marginLeft = &amp;quot;6px&amp;quot;; b.style.padding = &amp;quot;3px 12px&amp;quot;;&lt;br /&gt;
  b.addEventListener(&amp;quot;click&amp;quot;, function () { setLang(l); });&lt;br /&gt;
  $(&amp;quot;nvk-lang&amp;quot;).appendChild(b);&lt;br /&gt;
});&lt;br /&gt;
(function () {&lt;br /&gt;
  var m = location.search.match(/[?\x26](?:uselang|lang)=(\w+)/), l = m ? m[1].toLowerCase() : &amp;quot;&amp;quot;;&lt;br /&gt;
  if (!l) { try { l = localStorage.getItem(&amp;quot;nvk-lang&amp;quot;) || &amp;quot;&amp;quot;; } catch (e) { l = &amp;quot;&amp;quot;; } }&lt;br /&gt;
  if (l === &amp;quot;en&amp;quot; || l === &amp;quot;de&amp;quot;) LANG = l;&lt;br /&gt;
})();&lt;br /&gt;
markLang(); applyStatic(); renderLegal();&lt;br /&gt;
newCaptcha();&lt;br /&gt;
update();&lt;br /&gt;
})();&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;Stand: 23.10.2026&amp;lt;/small&amp;gt;&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andre</name></author>
	</entry>
	<entry>
		<id>https://xtrons.ibus-app.de/index.php?title=Android_Radio_Konfigurator&amp;diff=4096</id>
		<title>Android Radio Konfigurator</title>
		<link rel="alternate" type="text/html" href="https://xtrons.ibus-app.de/index.php?title=Android_Radio_Konfigurator&amp;diff=4096"/>
		<updated>2026-10-23T11:54:46Z</updated>

		<summary type="html">&lt;p&gt;Andre: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt; '''Mit diesem Tool kann auf Basis von Fahrzeug und vorhandenen Komponenten eine Liste nötiger Komponenten erstellt werden.&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;big&amp;gt;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.&amp;lt;br&amp;gt;'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
#nvk{max-width:900px;line-height:1.45}&lt;br /&gt;
#nvk *{box-sizing:border-box}&lt;br /&gt;
#nvk .nvk-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:14px;margin:12px 0}&lt;br /&gt;
#nvk .nvk-f label{display:block;font-weight:700;margin-bottom:4px}&lt;br /&gt;
#nvk select{width:100%;padding:9px 8px;font:inherit;color:#202122;background:#fff;border:1px solid #a2a9b1;border-radius:4px}&lt;br /&gt;
#nvk .nvk-help{font-size:.85em;opacity:.75;margin-top:3px}&lt;br /&gt;
#nvk fieldset{border:1px solid rgba(128,128,128,.45);border-radius:6px;padding:10px 14px;margin:14px 0}&lt;br /&gt;
#nvk legend{font-weight:700;padding:0 6px}&lt;br /&gt;
#nvk .nvk-o{display:block;padding:4px 0;cursor:pointer}&lt;br /&gt;
#nvk .nvk-o small{opacity:.7}&lt;br /&gt;
#nvk .nvk-o.dis{opacity:.75;cursor:default}&lt;br /&gt;
#nvk .nvk-btn{padding:7px 14px;font:inherit;border:1px solid #a2a9b1;border-radius:4px;background:#f8f9fa;color:#202122;cursor:pointer}&lt;br /&gt;
#nvk #nvk-out{margin-top:18px}&lt;br /&gt;
#nvk h3{margin:18px 0 8px}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-card.opt{border-left-color:#14866d}&lt;br /&gt;
#nvk .nvk-card.rad{border-left-color:#fff;background:rgba(255,255,255,.08)}&lt;br /&gt;
#nvk .nvk-card b{display:block}&lt;br /&gt;
#nvk .nvk-links{margin-top:4px;font-weight:600}&lt;br /&gt;
#nvk .nvk-links a{margin-right:14px}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-miss{opacity:.8;font-style:italic}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-card .nvk-img{max-width:230px;max-height:150px}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-card.hl{border:2px solid #36c;border-left-width:8px;background:rgba(51,102,204,.12);padding:12px 14px}&lt;br /&gt;
#nvk .nvk-card.hl b{font-size:1.1em}&lt;br /&gt;
#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)}&lt;br /&gt;
#nvk .nvk-row label{flex:1;margin:0;min-width:240px}&lt;br /&gt;
#nvk .nvk-row a{white-space:nowrap;font-weight:600}&lt;br /&gt;
#nvk .nvk-img.wide{max-width:min(100%,460px);max-height:none}&lt;br /&gt;
#nvk #nvk-form{margin-top:22px}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk-lang&amp;quot; style=&amp;quot;text-align:right;margin-bottom:6px&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-grid&amp;quot; id=&amp;quot;nvk-fields&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;fieldset id=&amp;quot;nvk-optset&amp;quot;&amp;gt;&amp;lt;legend data-en=&amp;quot;Additional options&amp;quot;&amp;gt;Zusatzoptionen&amp;lt;/legend&amp;gt;&amp;lt;div id=&amp;quot;nvk-opts&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/fieldset&amp;gt;&lt;br /&gt;
&amp;lt;button type=&amp;quot;button&amp;quot; class=&amp;quot;nvk-btn&amp;quot; id=&amp;quot;nvk-reset&amp;quot; data-en=&amp;quot;Reset selection&amp;quot;&amp;gt;Auswahl zurücksetzen&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk-out&amp;quot; aria-live=&amp;quot;polite&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;fieldset id=&amp;quot;nvk-form&amp;quot; style=&amp;quot;display:none&amp;quot;&amp;gt;&amp;lt;legend data-en=&amp;quot;Send request&amp;quot;&amp;gt;Anfrage senden&amp;lt;/legend&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;nvk-help&amp;quot; data-en=&amp;quot;Your selection and the list above are sent automatically. All fields marked * are required.&amp;quot;&amp;gt;Deine Auswahl und die Liste oben werden automatisch mitgesendet. Alle Felder mit * sind Pflicht.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-grid&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-name&amp;quot;&amp;gt;Name *&amp;lt;/label&amp;gt;&amp;lt;input id=&amp;quot;nvk-name&amp;quot; type=&amp;quot;text&amp;quot; autocomplete=&amp;quot;name&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-mail&amp;quot; data-en=&amp;quot;Email *&amp;quot;&amp;gt;E-Mail *&amp;lt;/label&amp;gt;&amp;lt;input id=&amp;quot;nvk-mail&amp;quot; type=&amp;quot;email&amp;quot; autocomplete=&amp;quot;email&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-size&amp;quot; data-en=&amp;quot;Desired display size (optional)&amp;quot;&amp;gt;Gewünschte Displaygröße (optional)&amp;lt;/label&amp;gt;&amp;lt;select id=&amp;quot;nvk-size&amp;quot;&amp;gt;&amp;lt;option value=&amp;quot;&amp;quot; data-en=&amp;quot;No preference / advice wanted&amp;quot;&amp;gt;Keine Angabe / Beratung gewünscht&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;7&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;8.8&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;9&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;10.25&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;12.3&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;14.9&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option data-en=&amp;quot;Other size (please state in comment)&amp;quot;&amp;gt;Andere Größe (bitte im Kommentar nennen)&amp;lt;/option&amp;gt;&amp;lt;/select&amp;gt;&amp;lt;div class=&amp;quot;nvk-help&amp;quot; data-en=&amp;quot;Diagonal in inches. Not every size is available for every model - we will check this for you.&amp;quot;&amp;gt;Diagonale in Zoll. Nicht jede Größe gibt es für jede Baureihe, das prüfen wir für Dich.&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-vin&amp;quot; data-en=&amp;quot;VIN (optional)&amp;quot;&amp;gt;VIN oder FGN (optional)&amp;lt;/label&amp;gt;&amp;lt;input id=&amp;quot;nvk-vin&amp;quot; type=&amp;quot;text&amp;quot; maxlength=&amp;quot;17&amp;quot; placeholder=&amp;quot;AB12345 oder 17-stellige FGN&amp;quot; data-en-ph=&amp;quot;AB12345 or full 17-character VIN&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-msg&amp;quot; data-en=&amp;quot;Comment *&amp;quot;&amp;gt;Kommentar *&amp;lt;/label&amp;gt;&amp;lt;textarea id=&amp;quot;nvk-msg&amp;quot; rows=&amp;quot;4&amp;quot;&amp;gt;&amp;lt;/textarea&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot; style=&amp;quot;max-width:300px&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-cap&amp;quot; id=&amp;quot;nvk-capq&amp;quot;&amp;gt;Sicherheitsfrage *&amp;lt;/label&amp;gt;&amp;lt;input id=&amp;quot;nvk-cap&amp;quot; type=&amp;quot;text&amp;quot; inputmode=&amp;quot;numeric&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;input id=&amp;quot;nvk-hp&amp;quot; type=&amp;quot;text&amp;quot; tabindex=&amp;quot;-1&amp;quot; autocomplete=&amp;quot;off&amp;quot; aria-hidden=&amp;quot;true&amp;quot; style=&amp;quot;position:absolute;left:-9999px;width:1px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;label class=&amp;quot;nvk-o&amp;quot;&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; id=&amp;quot;nvk-dsgvo&amp;quot;&amp;gt; &amp;lt;span data-en=&amp;quot;I agree that my details may be processed by email to handle this request.&amp;quot;&amp;gt;Ich stimme zu, dass meine Angaben zur Bearbeitung der Anfrage per E-Mail verarbeitet werden.&amp;lt;/span&amp;gt;&amp;lt;span id=&amp;quot;nvk-dslink&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; *&amp;lt;/label&amp;gt;&lt;br /&gt;
&amp;lt;button type=&amp;quot;button&amp;quot; class=&amp;quot;nvk-btn&amp;quot; id=&amp;quot;nvk-send&amp;quot; data-en=&amp;quot;Send request&amp;quot;&amp;gt;Anfrage senden&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk-status&amp;quot; class=&amp;quot;nvk-note&amp;quot; style=&amp;quot;display:none&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/fieldset&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk-legal&amp;quot; class=&amp;quot;nvk-help&amp;quot; style=&amp;quot;margin-top:20px&amp;quot;&amp;gt;&amp;lt;b data-en=&amp;quot;Note:&amp;quot;&amp;gt;Hinweis:&amp;lt;/b&amp;gt; &amp;lt;span data-en=&amp;quot;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.&amp;quot;&amp;gt;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.&amp;lt;/span&amp;gt;&amp;lt;div id=&amp;quot;nvk-legal-links&amp;quot; style=&amp;quot;margin-top:4px&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;noscript&amp;gt;Für den Konfigurator wird JavaScript benötigt. / JavaScript is required for the configurator.&amp;lt;/noscript&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
(function () {&lt;br /&gt;
&amp;quot;use strict&amp;quot;;&lt;br /&gt;
/* =====================================================================&lt;br /&gt;
   KONFIGURATION - hier wird gepflegt.&lt;br /&gt;
   Textformat in Hinweisen: [b]fett[/b]  [br] Zeilenumbruch  [a=URL]Linktext[/a]&lt;br /&gt;
   Bitte im Skript KEIN kaufmännisches Und, kein Kleiner-/Größer-Zeichen&lt;br /&gt;
   und keine Leerzeilen verwenden (das Wiki wandelt sie um).&lt;br /&gt;
   ===================================================================== */&lt;br /&gt;
var SHOP = &amp;quot;https://shop.ibus-app.de/&amp;quot;;&lt;br /&gt;
var WIKI = &amp;quot;https://wiki.ibus-app.de/index.php?title=&amp;quot;;&lt;br /&gt;
/* Bilder aus dem Wiki (Thumbnail-Adressen; Klick öffnet automatisch das Originalbild) */&lt;br /&gt;
var IM = &amp;quot;https://xtrons.ibus-app.de/images/thumb/&amp;quot;;&lt;br /&gt;
var P = {&lt;br /&gt;
  schema:  IM + &amp;quot;e/ea/BMW_E39_Verl%C3%A4ngerungen_EXL005%2BFAKRA_.png/135px-BMW_E39_Verl%C3%A4ngerungen_EXL005%2BFAKRA_.png&amp;quot;,&lt;br /&gt;
  exl005:  IM + &amp;quot;7/70/Exl005-1.webp/257px-Exl005-1.webp.png&amp;quot;,&lt;br /&gt;
  fakra6m: IM + &amp;quot;d/d8/FM-extension_01_1.png/270px-FM-extension_01_1.png&amp;quot;,&lt;br /&gt;
  isofakra: IM + &amp;quot;4/4e/ISO-FAKRA_1.png/270px-ISO-FAKRA_1.png&amp;quot;,&lt;br /&gt;
  bm24:    IM + &amp;quot;8/82/BM24.png/130px-BM24.png&amp;quot;,&lt;br /&gt;
  iso:     IM + &amp;quot;d/dd/Iso.jpg/69px-Iso.jpg&amp;quot;,&lt;br /&gt;
  bm54:    IM + &amp;quot;3/34/BM54.png/135px-BM54.png&amp;quot;,&lt;br /&gt;
  fakra:   IM + &amp;quot;b/b3/Fakra.jpg/100px-Fakra.jpg&amp;quot;,&lt;br /&gt;
  pfeil:   IM + &amp;quot;e/ee/Navi_E46.jpg/239px-Navi_E46.jpg&amp;quot;,&lt;br /&gt;
  noquad:  IM + &amp;quot;6/68/No_elongation.jpg/180px-No_elongation.jpg&amp;quot;,&lt;br /&gt;
  noexl6:  IM + &amp;quot;7/7b/No_EXL006.jpg/180px-No_EXL006.jpg&amp;quot;,&lt;br /&gt;
  halter:  IM + &amp;quot;3/3b/Halter_Alu.webp/92px-Halter_Alu.webp.png&amp;quot;,&lt;br /&gt;
  deepobd: &amp;quot;https://xtrons.ibus-app.de/images/d/d4/DeepOBD_Interface_1.png&amp;quot;,&lt;br /&gt;
  n43:     IM + &amp;quot;e/e4/Navi4_3.jpg/240px-Navi4_3.jpg&amp;quot;,&lt;br /&gt;
  n169:    IM + &amp;quot;8/8a/Navi16_9.jpg/240px-Navi16_9.jpg&amp;quot;,&lt;br /&gt;
  radio:   IM + &amp;quot;9/96/E39_Radio.jpg/240px-E39_Radio.jpg&amp;quot;,&lt;br /&gt;
  idrive:  &amp;quot;https://xtrons.ibus-app.de/images/0/02/MASK-CCC-CIC-NBT-EVO-iDrive.jpg&amp;quot;,&lt;br /&gt;
  iris:    &amp;quot;https://xtrons.ibus-app.de/images/b/be/BusinessKas_IRISG.jpg&amp;quot;,&lt;br /&gt;
  resler:  &amp;quot;https://xtrons.ibus-app.de/images/d/d1/Resler_Modul_01.png&amp;quot;,&lt;br /&gt;
  can:     &amp;quot;https://xtrons.ibus-app.de/images/6/69/CAN_Interface.png&amp;quot;,&lt;br /&gt;
  funktr:  IM + &amp;quot;7/7e/E46_Funktionstraeger.png/240px-E46_Funktionstraeger.png&amp;quot;&lt;br /&gt;
};&lt;br /&gt;
/* Anfrage-Formular: MAIL_TO = Empfänger. SEND_URL leer = E-Mail-Programm des Kunden öffnen (mailto).&lt;br /&gt;
   SEND_URL = Adresse des Server-Skripts send-anfrage.php = Versand direkt vom Server (mit CC an den Kunden). */&lt;br /&gt;
var MAIL_TO = &amp;quot;info@ibus-app.de&amp;quot;;&lt;br /&gt;
var MAIL_SUBJECT = &amp;quot;Anfrage aus Android Radio Konfigurator&amp;quot;;&lt;br /&gt;
var SEND_URL = &amp;quot;https://xtrons.ibus-app.de/send-anfrage.php&amp;quot;;&lt;br /&gt;
/* Shop-Anbindung: API = radios.php (liefert Radio-Liste und Artikelnummern). Warenkorb = Shopware-Link pro Artikelnummer. */&lt;br /&gt;
var API = &amp;quot;https://xtrons.ibus-app.de/radios.php&amp;quot;;&lt;br /&gt;
/* 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. */&lt;br /&gt;
var CART_TRANSFER = true;&lt;br /&gt;
/* Ziel der Übergabe: Shop-Controller aus Plugin 1.1.0 (serverseitig, unabhängig vom Browser-Cache).&lt;br /&gt;
   Älterer Weg über das Theme-Skript: var TRANSFER_URL = CART + &amp;quot;?nvk=&amp;quot;;  */&lt;br /&gt;
var TRANSFER_URL = &amp;quot;https://shop.ibus-app.de/nvk?add=&amp;quot;;&lt;br /&gt;
/* ---- Sprache / English ----------------------------------------------------&lt;br /&gt;
   DEFAULT_LANG: de oder en. Umschalten per Knopf DE/EN oder per Adresse ?uselang=en                     */&lt;br /&gt;
var DEFAULT_LANG = &amp;quot;de&amp;quot;;&lt;br /&gt;
var SHOP_EN = &amp;quot;https://shop.ibus-app.de/en/&amp;quot;;&lt;br /&gt;
var TRANSFER_URL_EN = SHOP_EN + &amp;quot;nvk?add=&amp;quot;;&lt;br /&gt;
var MAIL_SUBJECT_EN = &amp;quot;Request from Android Radio Configurator&amp;quot;;&lt;br /&gt;
/* Rechtliche Seiten EN (fehlt ein Eintrag, wird der deutsche Link genommen) */&lt;br /&gt;
var LEGAL_EN = { agb: SHOP_EN + &amp;quot;general-terms-and-conditions&amp;quot;, widerruf: SHOP_EN + &amp;quot;revocation-right&amp;quot;, datenschutz: SHOP_EN + &amp;quot;privacy-policy&amp;quot; };&lt;br /&gt;
var CART = &amp;quot;https://shop.ibus-app.de/checkout/cart&amp;quot;;&lt;br /&gt;
/* Rechtliche Seiten (Links unter dem Konfigurator und beim Datenschutz-Haken). Leer = Link wird nicht angezeigt. */&lt;br /&gt;
var LEGAL = { agb: &amp;quot;https://shop.ibus-app.de/allgemeine-geschaeftsbedingungen&amp;quot;, widerruf: &amp;quot;https://shop.ibus-app.de/widerrufsrecht&amp;quot;, datenschutz: &amp;quot;https://shop.ibus-app.de/datenschutz&amp;quot; };&lt;br /&gt;
/* ---- 1) Baureihen --------------------------------------------------------&lt;br /&gt;
   v = Shop-Kategorie (Link: SHOP + bmw-radios/ + v + /)&lt;br /&gt;
   gen: alt = I-BUS-Fahrzeuge (E38/E39/E46/E53/E83)&lt;br /&gt;
        b   = M-ASK / CCC / CIC     c = CIC / NBT / NBT EVO&lt;br /&gt;
   body = Karosserieformen (siehe BODY)                                      */&lt;br /&gt;
var BODY = { limo: &amp;quot;Limousine&amp;quot;, touring: &amp;quot;Touring&amp;quot;, coupe: &amp;quot;Coupé&amp;quot;, cabrio: &amp;quot;Cabrio&amp;quot;, schraeg: &amp;quot;Schrägheck&amp;quot;,&lt;br /&gt;
  compact: &amp;quot;Compact&amp;quot;, gt: &amp;quot;Gran Turismo&amp;quot;, gc: &amp;quot;Gran Coupé&amp;quot;, suv: &amp;quot;SUV / SAV&amp;quot;, roadster: &amp;quot;Roadster&amp;quot; };&lt;br /&gt;
var BODY_EN = { limo: &amp;quot;Sedan&amp;quot;, touring: &amp;quot;Touring (wagon)&amp;quot;, coupe: &amp;quot;Coupe&amp;quot;, cabrio: &amp;quot;Convertible&amp;quot;, schraeg: &amp;quot;Hatchback&amp;quot;,&lt;br /&gt;
  compact: &amp;quot;Compact&amp;quot;, gt: &amp;quot;Gran Turismo&amp;quot;, gc: &amp;quot;Gran Coupe&amp;quot;, suv: &amp;quot;SUV / SAV&amp;quot;, roadster: &amp;quot;Roadster&amp;quot; };&lt;br /&gt;
function vname(x) { return LANG === &amp;quot;en&amp;quot; ? x.t.replace(/^(\d)er /, &amp;quot;$1 Series &amp;quot;) : x.t; }&lt;br /&gt;
function enSlug(v) { return v.replace(/^(\d)er-/, &amp;quot;$1-series-&amp;quot;); }&lt;br /&gt;
var VEHICLES = [&lt;br /&gt;
  { v: &amp;quot;1er-e8x&amp;quot;, t: &amp;quot;1er E8x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;schraeg,coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;1er-f2x&amp;quot;, t: &amp;quot;1er F2x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;schraeg&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;2er-f2x&amp;quot;, t: &amp;quot;2er F2x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;3er-e46&amp;quot;, t: &amp;quot;3er E46&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;limo,touring,coupe,cabrio,compact&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;3er-e9x&amp;quot;, t: &amp;quot;3er E9x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;limo,touring,coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;3er-f3x&amp;quot;, t: &amp;quot;3er F3x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;limo,touring,gt&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;4er-f3x&amp;quot;, t: &amp;quot;4er F3x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;coupe,cabrio,gc&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;5er-e39&amp;quot;, t: &amp;quot;5er E39&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;limo,touring&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;5er-e6x&amp;quot;, t: &amp;quot;5er E6x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;limo,touring&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;5er-f1x&amp;quot;, t: &amp;quot;5er F1x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;limo,touring,gt&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;6er-e6x&amp;quot;, t: &amp;quot;6er E6x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;7er-e38&amp;quot;, t: &amp;quot;7er E38&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;limo&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;7er-e65&amp;quot;, t: &amp;quot;7er E65&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;limo&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;7er-f01&amp;quot;, t: &amp;quot;7er F01&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;limo&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x1-e84&amp;quot;, t: &amp;quot;X1 E84&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x1-f48&amp;quot;, t: &amp;quot;X1 F48&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x3-e83&amp;quot;, t: &amp;quot;X3 E83&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x3-f25&amp;quot;, t: &amp;quot;X3 F25&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x5-e53&amp;quot;, t: &amp;quot;X5 E53&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x5-e70&amp;quot;, t: &amp;quot;X5 E70&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x5-f15&amp;quot;, t: &amp;quot;X5 F15&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x6-e71&amp;quot;, t: &amp;quot;X6 E71&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;z4-e85e86&amp;quot;, t: &amp;quot;Z4 E85/E86&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;roadster,coupe&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;z4-e89&amp;quot;, t: &amp;quot;Z4 E89&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;roadster&amp;quot;, noCat: true }&lt;br /&gt;
];&lt;br /&gt;
/* Fahrzeuge mit K-CAN App (Beta) */&lt;br /&gt;
var KCAN = [&amp;quot;1er-e8x&amp;quot;, &amp;quot;3er-e9x&amp;quot;, &amp;quot;5er-e6x&amp;quot;, &amp;quot;6er-e6x&amp;quot;, &amp;quot;7er-e65&amp;quot;, &amp;quot;x1-e84&amp;quot;, &amp;quot;x5-e70&amp;quot;, &amp;quot;x6-e71&amp;quot;, &amp;quot;z4-e89&amp;quot;];&lt;br /&gt;
var bodyValues = Object.keys(BODY).map(function (k) {&lt;br /&gt;
  return { v: k, t: BODY[k], t_en: BODY_EN[k], only: { vehicle: VEHICLES.filter(function (x) { return x.body.split(&amp;quot;,&amp;quot;).indexOf(k) !== -1; }).map(function (x) { return x.v; }) } };&lt;br /&gt;
});&lt;br /&gt;
/* ---- 2) Auswahlfelder ------------------------------------------------------&lt;br /&gt;
   only = Wert nur anbieten, wenn Bedingung passt   show = Feld nur dann zeigen&lt;br /&gt;
   optional = muss nicht gewählt werden             auto = bei nur einem Wert vorwählen */&lt;br /&gt;
var FIELDS = [&lt;br /&gt;
  { id: &amp;quot;vehicle&amp;quot;, label: &amp;quot;Fahrzeug&amp;quot;, label_en: &amp;quot;Vehicle&amp;quot;, values: VEHICLES.map(function (x) { return { v: x.v, t: &amp;quot;BMW &amp;quot; + x.t, t_en: &amp;quot;BMW &amp;quot; + x.t.replace(/^(\d)er /, &amp;quot;$1 Series &amp;quot;) }; }) },&lt;br /&gt;
  { id: &amp;quot;factory&amp;quot;, label: &amp;quot;Verbaut ab Werk&amp;quot;, label_en: &amp;quot;Factory-fitted system&amp;quot;,&lt;br /&gt;
    pre: { when: { gen: [&amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;] }, html: &amp;quot;[b]So erkennst Du Dein System:[/b][br][imgw=&amp;quot; + P.idrive + &amp;quot;]&amp;quot;, html_en: &amp;quot;[b]How to identify your system:[/b][br][imgw=&amp;quot; + P.idrive + &amp;quot;]&amp;quot; }, values: [&lt;br /&gt;
    { v: &amp;quot;iris&amp;quot;,  t: &amp;quot;Radio mit IRIS&amp;quot;, t_en: &amp;quot;Radio with IRIS&amp;quot;, only: { vehicle: [&amp;quot;3er-e46&amp;quot;, &amp;quot;5er-e39&amp;quot;, &amp;quot;7er-e38&amp;quot;, &amp;quot;x5-e53&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.iris + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;mid&amp;quot;,   t: &amp;quot;Radio mit MID&amp;quot;,  t_en: &amp;quot;Radio with MID&amp;quot;, only: { gen: [&amp;quot;alt&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.radio + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;n43&amp;quot;,   t: &amp;quot;4:3 Navi&amp;quot;,       t_en: &amp;quot;4:3 navi&amp;quot;, only: { vehicle: [&amp;quot;5er-e39&amp;quot;, &amp;quot;7er-e38&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.n43 + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;n169&amp;quot;,  t: &amp;quot;16:9 Navi&amp;quot;,      t_en: &amp;quot;16:9 navi&amp;quot;, only: { gen: [&amp;quot;alt&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.n169 + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;pfeil&amp;quot;, t: &amp;quot;Pfeilnavi&amp;quot;,      t_en: &amp;quot;Arrow navi&amp;quot;, only: { vehicle: [&amp;quot;3er-e46&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.pfeil + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;mask&amp;quot;,  t: &amp;quot;M-ASK&amp;quot;,          only: { gen: [&amp;quot;b&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;ccc&amp;quot;,   t: &amp;quot;CCC&amp;quot;,            only: { gen: [&amp;quot;b&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;cic&amp;quot;,   t: &amp;quot;CIC&amp;quot;,            only: { gen: [&amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;nbt&amp;quot;,   t: &amp;quot;NBT&amp;quot;,            only: { gen: [&amp;quot;c&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;nbtevo&amp;quot;, t: &amp;quot;NBT EVO&amp;quot;,       only: { gen: [&amp;quot;c&amp;quot;] } } ] },&lt;br /&gt;
  { id: &amp;quot;trunk&amp;quot;, label: &amp;quot;Wo sitzt das Radiomodul des Pfeilnavis?&amp;quot;, label_en: &amp;quot;Where is the radio module of the arrow navi?&amp;quot;, optional: true, show: { factory: [&amp;quot;pfeil&amp;quot;] },&lt;br /&gt;
    help: &amp;quot;Bitte prüfen: Sitzt das Modul im Kofferraum, oder im Pfeilnavi selbst (Quadlock hinten neben dem Antennenstecker)?[br][img=&amp;quot; + P.pfeil + &amp;quot;]&amp;quot;,&lt;br /&gt;
    help_en: &amp;quot;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=&amp;quot; + P.pfeil + &amp;quot;]&amp;quot;,&lt;br /&gt;
    values: [&lt;br /&gt;
    { v: &amp;quot;ja&amp;quot;, t: &amp;quot;Im Kofferraum (Verlängerungen nötig)&amp;quot;, t_en: &amp;quot;In the trunk (extensions required)&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;nein&amp;quot;, t: &amp;quot;Im Pfeilnavi, Quadlock hinten (keine Verlängerung)&amp;quot;, t_en: &amp;quot;In the arrow navi, Quadlock at the back (no extension)&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;unk&amp;quot;, t: &amp;quot;Weiß ich nicht&amp;quot;, t_en: &amp;quot;I don't know&amp;quot; } ] },&lt;br /&gt;
  { id: &amp;quot;aux&amp;quot;, label: &amp;quot;AUX-IN verfügbar?&amp;quot;, label_en: &amp;quot;AUX-IN available?&amp;quot;, show: { gen: [&amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;] }, values: [&lt;br /&gt;
    { v: &amp;quot;ja&amp;quot;, t: &amp;quot;Ja&amp;quot;, t_en: &amp;quot;Yes&amp;quot; }, { v: &amp;quot;nein&amp;quot;, t: &amp;quot;Nein&amp;quot;, t_en: &amp;quot;No&amp;quot; } ] },&lt;br /&gt;
  { id: &amp;quot;sound&amp;quot;, label: &amp;quot;Soundsystem&amp;quot;, label_en: &amp;quot;Sound system&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;stereo&amp;quot;, t: &amp;quot;Stereo&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;hifi&amp;quot;,   t: &amp;quot;Hifi&amp;quot;, t_en: &amp;quot;Hi-Fi&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;dsp&amp;quot;,    t: &amp;quot;DSP&amp;quot;, only: { vehicle: [&amp;quot;7er-e38&amp;quot;, &amp;quot;5er-e39&amp;quot;, &amp;quot;x5-e53&amp;quot;, &amp;quot;x3-e83&amp;quot;] }, info: &amp;quot;[a=&amp;quot; + WIKI + &amp;quot;Habe_ich_DSP%3F]Habe ich DSP?[/a]&amp;quot;, info_en: &amp;quot;[a=&amp;quot; + WIKI + &amp;quot;Habe_ich_DSP%3F]Do I have DSP?[/a]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;hk&amp;quot;,     t: &amp;quot;Harman Kardon&amp;quot;, only: { vehicle: [&amp;quot;3er-e46&amp;quot;, &amp;quot;z4-e85e86&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;logic7&amp;quot;, t: &amp;quot;Logic7&amp;quot;, only: { vehicle: [&amp;quot;3er-e9x&amp;quot;, &amp;quot;5er-e6x&amp;quot;, &amp;quot;6er-e6x&amp;quot;, &amp;quot;7er-e65&amp;quot;, &amp;quot;1er-e8x&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;hksur&amp;quot;,  t: &amp;quot;Harman Kardon Surround&amp;quot;, only: { vehicle: [&amp;quot;1er-f2x&amp;quot;, &amp;quot;2er-f2x&amp;quot;, &amp;quot;3er-f3x&amp;quot;, &amp;quot;4er-f3x&amp;quot;, &amp;quot;5er-f1x&amp;quot;] } } ] },&lt;br /&gt;
  { id: &amp;quot;current&amp;quot;, label: &amp;quot;Aktuell verbaut&amp;quot;, label_en: &amp;quot;Currently installed&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;werk&amp;quot;, t: &amp;quot;Werksradio / Werksnavi&amp;quot;, t_en: &amp;quot;Factory radio / factory navi&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;nach&amp;quot;, t: &amp;quot;Nachrüst-Radio / -Navi&amp;quot;, t_en: &amp;quot;Aftermarket radio / navi&amp;quot; } ] },&lt;br /&gt;
  { id: &amp;quot;body&amp;quot;, label: &amp;quot;Karosserie&amp;quot;, label_en: &amp;quot;Body type&amp;quot;, auto: true, values: bodyValues },&lt;br /&gt;
  { id: &amp;quot;ant&amp;quot;, label: &amp;quot;Antennenstecker am Radio (optional)&amp;quot;, label_en: &amp;quot;Antenna connector on the radio (optional)&amp;quot;, optional: true, def: &amp;quot;unk&amp;quot;,&lt;br /&gt;
    show: { vehicle: [&amp;quot;7er-e38&amp;quot;, &amp;quot;5er-e39&amp;quot;, &amp;quot;3er-e46&amp;quot;, &amp;quot;x5-e53&amp;quot;] },&lt;br /&gt;
    values: [&lt;br /&gt;
    { v: &amp;quot;unk&amp;quot;,   t: &amp;quot;Weiß ich nicht&amp;quot;, t_en: &amp;quot;I don't know&amp;quot;,&lt;br /&gt;
      info: &amp;quot;[b]BM24[/b] (Rundpin) = ISO-Antennenstecker:[br][img=&amp;quot; + P.bm24 + &amp;quot;][img=&amp;quot; + P.iso + &amp;quot;][br][b]BM54[/b] = FAKRA:[br][img=&amp;quot; + P.bm54 + &amp;quot;][img=&amp;quot; + P.fakra + &amp;quot;]&amp;quot;,&lt;br /&gt;
      info_en: &amp;quot;[b]BM24[/b] (round pin) = ISO antenna connector:[br][img=&amp;quot; + P.bm24 + &amp;quot;][img=&amp;quot; + P.iso + &amp;quot;][br][b]BM54[/b] = FAKRA:[br][img=&amp;quot; + P.bm54 + &amp;quot;][img=&amp;quot; + P.fakra + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;iso&amp;quot;,   t: &amp;quot;ISO (BM24, Rundpin)&amp;quot;, t_en: &amp;quot;ISO (BM24, round pin)&amp;quot;, info: &amp;quot;[img=&amp;quot; + P.bm24 + &amp;quot;][img=&amp;quot; + P.iso + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;fakra&amp;quot;, t: &amp;quot;FAKRA (BM54)&amp;quot;, info: &amp;quot;[img=&amp;quot; + P.bm54 + &amp;quot;][img=&amp;quot; + P.fakra + &amp;quot;]&amp;quot; } ] }&lt;br /&gt;
];&lt;br /&gt;
/* ---- 3) Zusatzoptionen (Mehrfachauswahl) ---------------------------------&lt;br /&gt;
   show = nur sichtbar wenn Bedingung passt   requires = nur sichtbar wenn diese Optionen gewählt sind&lt;br /&gt;
   excl = Optionen derselben Gruppe schließen sich aus   items = Artikel aus ITEMS&lt;br /&gt;
   Englisch: Felder mit Endung _en (t_en, sub_en, ...). Fehlt ein _en-Feld, wird der deutsche Text gezeigt. */&lt;br /&gt;
var OPTS = [&lt;br /&gt;
  { id: &amp;quot;halter&amp;quot;,  t: &amp;quot;Radio-Halter&amp;quot;, t_en: &amp;quot;Radio holder&amp;quot;, sub: &amp;quot;nur BMW E39&amp;quot;, sub_en: &amp;quot;BMW E39 only&amp;quot;, show: { vehicle: [&amp;quot;5er-e39&amp;quot;] }, items: [&amp;quot;halter&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;ibus&amp;quot;,    t: &amp;quot;I-BUS App&amp;quot;, show: { gen: [&amp;quot;alt&amp;quot;] }, items: [&amp;quot;ibus&amp;quot;, &amp;quot;resler&amp;quot;, &amp;quot;bclic&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;deepobd&amp;quot;, t: &amp;quot;DeepOBD (Diagnose)&amp;quot;, t_en: &amp;quot;DeepOBD (diagnostics)&amp;quot;, items: [&amp;quot;deepobd&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;can&amp;quot;,     t: &amp;quot;CAN Interface&amp;quot;, sub: &amp;quot;Addon - nur mit I-BUS App&amp;quot;, sub_en: &amp;quot;Add-on - only with I-BUS App&amp;quot;, show: { gen: [&amp;quot;alt&amp;quot;] }, requires: [&amp;quot;ibus&amp;quot;], items: [&amp;quot;can&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;kcan&amp;quot;,    t: &amp;quot;K-CAN App (Beta)&amp;quot;, sub: &amp;quot;Pendant zur I-BUS App&amp;quot;, sub_en: &amp;quot;Counterpart to the I-BUS App&amp;quot;, show: { vehicle: KCAN }, items: [&amp;quot;kcan&amp;quot;, &amp;quot;kcanlic&amp;quot;, &amp;quot;can&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;tpms&amp;quot;,    t: &amp;quot;TPMS (Reifendruck)&amp;quot;, t_en: &amp;quot;TPMS (tire pressure)&amp;quot;, items: [&amp;quot;tpms&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;dab1&amp;quot;,    t: &amp;quot;DAB+ (Single Receiver)&amp;quot;, excl: &amp;quot;dab&amp;quot;, items: [&amp;quot;dab1&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;dab2&amp;quot;,    t: &amp;quot;DAB+ (Dual Receiver)&amp;quot;,   excl: &amp;quot;dab&amp;quot;, items: [&amp;quot;dab2&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;rcam&amp;quot;,    t: &amp;quot;Rückfahrkamera&amp;quot;, t_en: &amp;quot;Rear-view camera&amp;quot;, items: [&amp;quot;rcam&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;fcam&amp;quot;,    t: &amp;quot;Front-Kamera&amp;quot;, t_en: &amp;quot;Front camera&amp;quot;, items: [&amp;quot;fcam&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;tool&amp;quot;,    t: &amp;quot;Einbau-Werkzeug (Kunststoffheber)&amp;quot;, t_en: &amp;quot;Installation tool (plastic pry tool)&amp;quot;, items: [&amp;quot;tool&amp;quot;] }&lt;br /&gt;
];&lt;br /&gt;
/* Erzwungene Optionen (werden automatisch gesetzt und gesperrt) */&lt;br /&gt;
var FORCED = [&lt;br /&gt;
  { when: { sound: [&amp;quot;dsp&amp;quot;] }, opts: [&amp;quot;ibus&amp;quot;], why: &amp;quot;wegen DSP erforderlich&amp;quot;, why_en: &amp;quot;required because of DSP&amp;quot; }&lt;br /&gt;
];&lt;br /&gt;
/* ---- 4) Artikel ------------------------------------------------------------&lt;br /&gt;
   u = Shop-Link DE, ue = Shop-Link EN (leer = wie DE)   ut/wt = Linktexte   w = Wiki-Link   leer = kein Link&lt;br /&gt;
   skipIf = Artikel entfällt, wenn der genannte Artikel schon in der Liste steht&lt;br /&gt;
   Die Lizenzen sind im EN-Shop andere Artikel (BC = OBC): ue zeigt auf den EN-Artikel. */&lt;br /&gt;
var ITEMS = {&lt;br /&gt;
  exl005:  { t: &amp;quot;Verlängerung EXL005&amp;quot;, t_en: &amp;quot;Extension EXL005&amp;quot;, d: &amp;quot;Ersetzt das Radiomodul im Kofferraum.&amp;quot;, d_en: &amp;quot;Replaces the radio module in the trunk.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;detail/index/sArticle/212/&amp;quot;, ue: SHOP_EN + &amp;quot;accessories-for-head-units/adapter-elongations/212/bmw-radio-extension-6-meters-exl005&amp;quot;, img: [P.exl005, P.schema] },&lt;br /&gt;
  fakra6m: { t: &amp;quot;Verlängerung 6 m FAKRA(m) auf FAKRA(f), gewinkelt&amp;quot;, t_en: &amp;quot;Extension 6 m FAKRA(m) to FAKRA(f), angled&amp;quot;,&lt;br /&gt;
             d: &amp;quot;Antennenverlängerung vom Kofferraum nach vorn.&amp;quot;, d_en: &amp;quot;Antenna extension from the trunk to the front.&amp;quot;, img: [P.fakra6m],&lt;br /&gt;
             u: SHOP + &amp;quot;shop/zubehoer/adapterkabel/192/verlaengerung-6m-fakra-m-auf-fakra-f-kurz-gewinkelt&amp;quot;,&lt;br /&gt;
             ue: SHOP_EN + &amp;quot;i-bus-app/accessories/cable-adapters/192/extension-6m-fakra-m-to-fakra-f-short-angled&amp;quot; },&lt;br /&gt;
  isoada:  { t: &amp;quot;Adapter ISO-Stecker auf FAKRA, gewinkelt (15 cm)&amp;quot;, t_en: &amp;quot;Adapter ISO plug to FAKRA, angled (15 cm)&amp;quot;,&lt;br /&gt;
             d: &amp;quot;Nötig bei ISO-Antennenstecker (BM24, Rundpin).&amp;quot;, d_en: &amp;quot;Required with an ISO antenna connector (BM24, round pin).&amp;quot;, img: [P.isofakra],&lt;br /&gt;
             u: SHOP + &amp;quot;shop/zubehoer/adapterkabel/193/adapter-kabel-iso-f-auf-fakra-f-kurz-gewinkelt-15cm&amp;quot;,&lt;br /&gt;
             ue: SHOP_EN + &amp;quot;i-bus-app/accessories/cable-adapters/193/adapter-cable-iso-f-to-fakra-f-short-angled-15cm&amp;quot; },&lt;br /&gt;
  bcdsp:   { t: &amp;quot;I-BUS App - BC+DSP Lizenz&amp;quot;, t_en: &amp;quot;I-BUS App - OBC+DSP License&amp;quot;,&lt;br /&gt;
             d: &amp;quot;Ohne DSP-Lizenz arbeitet das Werks-DSP nicht.&amp;quot;, d_en: &amp;quot;Without the DSP license the factory DSP will not work.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/lizenzen/171/i-bus-app-bc-dsp-lizenz&amp;quot;, ue: SHOP_EN + &amp;quot;i-bus-app/licenses/172/i-bus-app-obc-dsp-license&amp;quot;,&lt;br /&gt;
             w: WIKI + &amp;quot;Habe_ich_DSP%3F&amp;quot;, wt: &amp;quot;Wiki: Habe ich DSP?&amp;quot;, wt_en: &amp;quot;Wiki: Do I have DSP?&amp;quot; },&lt;br /&gt;
  halter:  { t: &amp;quot;Alu-Halter zur Radio-Montage im BMW E39&amp;quot;, t_en: &amp;quot;Alu holder for radio installation in BMW E39&amp;quot;,&lt;br /&gt;
             d: &amp;quot;Empfohlen bei Radios, die nicht von AVIN stammen.&amp;quot;, d_en: &amp;quot;Recommended for radios not made by AVIN.&amp;quot;, img: [P.halter],&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/radiohalter/185/alu-halter-zur-radio-montage-im-bmw-e39&amp;quot;,&lt;br /&gt;
             ue: SHOP_EN + &amp;quot;i-bus-app/accessories/fittings-for-radio/185/fittings-for-radio-in-bmw-e39&amp;quot; },&lt;br /&gt;
  ibus:    { t: &amp;quot;I-BUS App&amp;quot;, hl: true,&lt;br /&gt;
             d: &amp;quot;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.&amp;quot;,&lt;br /&gt;
             d_en: &amp;quot;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.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;cat/index/sCategory/42&amp;quot;, ue: SHOP_EN + &amp;quot;cat/index/sCategory/45&amp;quot;,&lt;br /&gt;
             links: [&lt;br /&gt;
               { u: WIKI + &amp;quot;Was_brauche_ich_um_die_I-BUS_App_nutzen_zu_k%C3%B6nnen%3F&amp;quot;, t: &amp;quot;Wiki: Was brauche ich für die I-BUS App?&amp;quot;, t_en: &amp;quot;Wiki: What do I need for the I-BUS App?&amp;quot;, ue: WIKI + &amp;quot;What_do_I_need_to_use_the_I-BUS_app%3F&amp;quot; },&lt;br /&gt;
               { u: WIKI + &amp;quot;Funktionen&amp;quot;, t: &amp;quot;Liste aller I-BUS App Funktionen (BMW E38|E39|E46|E53|E83)&amp;quot;, t_en: &amp;quot;List of all I-BUS App functions (BMW E38|E39|E46|E53|E83)&amp;quot; },&lt;br /&gt;
               { u: WIKI + &amp;quot;Was_geht_beim_BMW_E46_nicht&amp;quot;, t: &amp;quot;Was geht beim BMW E46, E83, E85,.. nicht? (da werkseitig nicht verbaut)&amp;quot;, t_en: &amp;quot;What does not work on BMW E46, E83, E85,..? (not fitted at the factory)&amp;quot; },&lt;br /&gt;
               { u: WIKI + &amp;quot;Funktionseinschr%C3%A4nkungen_nach_Baujahr/Ausstattung/Modell&amp;quot;, t: &amp;quot;Funktionseinschränkungen nach Baujahr/Ausstattung/Modell&amp;quot;, t_en: &amp;quot;Function restrictions by year / equipment / model&amp;quot; } ] },&lt;br /&gt;
  resler:  { t: &amp;quot;Resler USB I-BUS Modul inkl. Anschlusskabel&amp;quot;, t_en: &amp;quot;Resler USB I-BUS module incl. cable&amp;quot;,&lt;br /&gt;
             d: &amp;quot;Verbindet I-BUS App und Fahrzeug.&amp;quot;, d_en: &amp;quot;Connects the I-BUS App and the vehicle.&amp;quot;, img: [P.resler],&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/interfaces-module/191/resler-usb-i-bus-modul-inkl.-anschlusskabel&amp;quot;,&lt;br /&gt;
             ue: SHOP_EN + &amp;quot;i-bus-app/accessories/interfaces-modules/191/resler-usb-i-bus-module-incl.-cable&amp;quot;,&lt;br /&gt;
             w: &amp;quot;https://wiki.ibus-app.de/index.php?title=Hauptseite#Einbauanleitung_f.C3.BCr_Resler_Modul_und_Resler_Interface&amp;quot;, wt: &amp;quot;Einbauanleitung Resler Modul&amp;quot;, wt_en: &amp;quot;Installation guide Resler module&amp;quot; },&lt;br /&gt;
  bclic:   { t: &amp;quot;I-BUS App - BC Lizenz&amp;quot;, t_en: &amp;quot;I-BUS App - OBC License&amp;quot;, d: &amp;quot;Schaltet u. a. die BC-Daten der App frei.&amp;quot;, d_en: &amp;quot;Unlocks e.g. the OBC data of the app.&amp;quot;, skipIf: &amp;quot;bcdsp&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/lizenzen/167/i-bus-app-bc-lizenz&amp;quot;, ue: SHOP_EN + &amp;quot;i-bus-app/licenses/173/i-bus-app-obc-license&amp;quot;, sku_en: &amp;quot;App04&amp;quot; },&lt;br /&gt;
  deepobd: { t: &amp;quot;Deep OBD OBD-II Bluetooth-Adapter&amp;quot;, t_en: &amp;quot;Deep OBD OBD-II Bluetooth adapter&amp;quot;,&lt;br /&gt;
             d: &amp;quot;Live-Werte auslesen, Fehler lesen und löschen.&amp;quot;, d_en: &amp;quot;Read live values, read and clear fault codes.&amp;quot;, img: [P.deepobd],&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/interfaces-module/258/deep-obd-obd-ii-bluetooth-adapter?c=54&amp;quot;,&lt;br /&gt;
             ue: SHOP_EN + &amp;quot;i-bus-app/accessories/interfaces-modules/258/deep-obd-obd-ii-bluetooth-adapter&amp;quot;,&lt;br /&gt;
             w: &amp;quot;https://xtrons.ibus-app.de/index.php?title=DeepOBD_-_Adapter_und_App_einrichten&amp;quot;, wt: &amp;quot;Wiki: DeepOBD einrichten&amp;quot;, wt_en: &amp;quot;Wiki: Setting up DeepOBD&amp;quot; },&lt;br /&gt;
  can:     { t: &amp;quot;CAN-Bus Interface inkl. Anschlusskabel&amp;quot;, t_en: &amp;quot;CAN bus interface incl. connection cable&amp;quot;,&lt;br /&gt;
             d: &amp;quot;Addon, funktioniert nur zusammen mit der I-BUS App bzw. der K-CAN App.&amp;quot;, d_en: &amp;quot;Add-on, only works together with the I-BUS App or the K-CAN App.&amp;quot;, img: [P.can],&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/interfaces-module/346/can-bus-interface-inkl.-anschlusskabel&amp;quot;,&lt;br /&gt;
             ue: SHOP_EN + &amp;quot;i-bus-app/accessories/interfaces-modules/346/can-bus-interface-incl.-connection-cable&amp;quot;,&lt;br /&gt;
             w: WIKI + &amp;quot;Einbauanleitung_CAN-Bus_Interface&amp;quot;, wt: &amp;quot;Einbauanleitung CAN-Bus Interface&amp;quot;, wt_en: &amp;quot;Installation guide CAN bus interface&amp;quot; },&lt;br /&gt;
  kcan:    { t: &amp;quot;K-CAN App (Beta)&amp;quot;, d: &amp;quot;Pendant zur I-BUS App für Fahrzeuge mit K-CAN, aktuell als Betaversion.&amp;quot;,&lt;br /&gt;
             d_en: &amp;quot;Counterpart to the I-BUS App for vehicles with K-CAN, currently in beta.&amp;quot;,&lt;br /&gt;
             w: &amp;quot;https://wiki.kcan-app.de/&amp;quot;, wt: &amp;quot;Wiki zur K-CAN App&amp;quot;, wt_en: &amp;quot;K-CAN App wiki&amp;quot; },&lt;br /&gt;
  kcanlic: { t: &amp;quot;K-CAN App - Lizenz Betaversion&amp;quot;, t_en: &amp;quot;K-CAN App - License Beta Version&amp;quot;, d: &amp;quot;Beta-Lizenz für die K-CAN App.&amp;quot;, d_en: &amp;quot;Beta license for the K-CAN App.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/lizenzen/358/k-can-app-lizenz-betaversion&amp;quot;, ue: SHOP_EN + &amp;quot;i-bus-app/licenses/358/k-can-app-license-beta-version&amp;quot; },&lt;br /&gt;
  tpms:    { t: &amp;quot;TPMS - Reifendruckkontrolle&amp;quot;, t_en: &amp;quot;TPMS - tire pressure monitoring&amp;quot;, d: &amp;quot;&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/tpms/&amp;quot;, ue: SHOP_EN + &amp;quot;accessories-for-head-units/tpms/&amp;quot; },&lt;br /&gt;
  dab1:    { t: &amp;quot;DAB+ Empfänger inkl. Antenne (Single)&amp;quot;, t_en: &amp;quot;DAB+ receiver incl. antenna (single)&amp;quot;, d: &amp;quot;&amp;quot;,&lt;br /&gt;
             w: &amp;quot;https://xtrons.ibus-app.de/index.php?title=Installation_der_DAB%2B_Antenne&amp;quot;, wt: &amp;quot;Installation der DAB+ Antenne&amp;quot;, wt_en: &amp;quot;Installing the DAB+ antenna&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;radiozubehoer/dab/291/dab-empfaenger-inkl.-antenne-usbdab04&amp;quot;, ue: SHOP_EN + &amp;quot;accessories-for-head-units/dab/&amp;quot;, ut_en: &amp;quot;DAB+ receivers in the shop →&amp;quot; },&lt;br /&gt;
  dab2:    { t: &amp;quot;Dual DAB+ Empfänger-Stick inkl. 2 Antennen&amp;quot;, t_en: &amp;quot;Dual DAB+ receiver stick incl. 2 antennas&amp;quot;, d: &amp;quot;&amp;quot;,&lt;br /&gt;
             w: &amp;quot;https://xtrons.ibus-app.de/index.php?title=Installation_der_DAB%2B_Antenne&amp;quot;, wt: &amp;quot;Installation der DAB+ Antenne&amp;quot;, wt_en: &amp;quot;Installing the DAB+ antenna&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;radiozubehoer/dab/391/dual-dab-empfaenger-stick-inkl.-2-antennen-acusbdab05t?c=75&amp;quot;, ue: SHOP_EN + &amp;quot;accessories-for-head-units/dab/&amp;quot;, ut_en: &amp;quot;DAB+ receivers in the shop →&amp;quot; },&lt;br /&gt;
  rcam:    { t: &amp;quot;Rückfahrkamera&amp;quot;, t_en: &amp;quot;Rear-view camera&amp;quot;, d: &amp;quot;&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/kameras/&amp;quot;, ue: SHOP_EN + &amp;quot;accessories-for-head-units/cameras/&amp;quot;,&lt;br /&gt;
             ut: &amp;quot;Kameras im Shop ansehen →&amp;quot;, ut_en: &amp;quot;View cameras in the shop →&amp;quot; },&lt;br /&gt;
  fcam:    { t: &amp;quot;Front-Kamera&amp;quot;, t_en: &amp;quot;Front camera&amp;quot;, d: &amp;quot;&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/kameras/&amp;quot;, ue: SHOP_EN + &amp;quot;accessories-for-head-units/cameras/&amp;quot;,&lt;br /&gt;
             ut: &amp;quot;Kameras im Shop ansehen →&amp;quot;, ut_en: &amp;quot;View cameras in the shop →&amp;quot; },&lt;br /&gt;
  tool:    { t: &amp;quot;Einbau-Werkzeug (Kunststoffheber)&amp;quot;, t_en: &amp;quot;Installation tool (plastic pry tool)&amp;quot;, d: &amp;quot;Zum schonenden Lösen der Verkleidungen.&amp;quot;, d_en: &amp;quot;For gently removing trim panels.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;radiozubehoer/einbauwerkzeug/&amp;quot;, ue: SHOP_EN + &amp;quot;accessories-for-head-units/installation-tools/&amp;quot; }&lt;br /&gt;
};&lt;br /&gt;
/* ---- 5) Regeln --------------------------------------------------------------&lt;br /&gt;
   type: need (Das brauchst Du) oder hint (Hinweise)   when = Bedingung auf die Felder&lt;br /&gt;
   opts = diese Zusatzoptionen müssen gewählt sein      items = Artikel   html / html_en = Text (DE / EN)&lt;br /&gt;
   Abgeleitete Werte: gen (alt/b/c) und module (ja/nein/unk = Radiomodul im Kofferraum, nur gen alt) */&lt;br /&gt;
var RULES = [&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { current: [&amp;quot;werk&amp;quot;], module: [&amp;quot;ja&amp;quot;] }, items: [&amp;quot;exl005&amp;quot;, &amp;quot;fakra6m&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { current: [&amp;quot;nach&amp;quot;], module: [&amp;quot;ja&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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=&amp;quot; + P.noquad + &amp;quot;][img=&amp;quot; + P.noexl6 + &amp;quot;]&amp;quot;,&lt;br /&gt;
    html_en: &amp;quot;[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=&amp;quot; + P.noquad + &amp;quot;][img=&amp;quot; + P.noexl6 + &amp;quot;]&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;ja&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot;,&lt;br /&gt;
    html_en: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;nein&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot;,&lt;br /&gt;
    html_en: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;unk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot;,&lt;br /&gt;
    html_en: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { ant: [&amp;quot;iso&amp;quot;] }, items: [&amp;quot;isoada&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { ant: [&amp;quot;unk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Antennenstecker:[/b] [b]BM24[/b] (Rundpin) = ISO-Antennenstecker, ggf. wird der [a=&amp;quot; + SHOP + &amp;quot;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.&amp;quot;,&lt;br /&gt;
    html_en: &amp;quot;[b]Antenna connector:[/b] [b]BM24[/b] (round pin) = ISO antenna connector, you may need the [a=&amp;quot; + SHOP_EN + &amp;quot;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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { sound: [&amp;quot;dsp&amp;quot;] }, items: [&amp;quot;bcdsp&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { sound: [&amp;quot;dsp&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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=&amp;quot; + WIKI + &amp;quot;Habe_ich_DSP%3F]Habe ich DSP?[/a]&amp;quot;,&lt;br /&gt;
    html_en: &amp;quot;[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=&amp;quot; + WIKI + &amp;quot;Habe_ich_DSP%3F]Do I have DSP?[/a]&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { sound: [&amp;quot;hk&amp;quot;], gen: [&amp;quot;alt&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Harman Kardon:[/b] Benötigt [b]keine[/b] DSP-Lizenz. Das Remote-Signal (+12 V, wenn Radio an) genügt zum Starten.&amp;quot;,&lt;br /&gt;
    html_en: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { aux: [&amp;quot;nein&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]AUX-IN:[/b] Der AUX-IN muss codiert werden. Optional kann ein FM-Transmitter genutzt werden - das ist nicht empfohlen.&amp;quot;,&lt;br /&gt;
    html_en: &amp;quot;[b]AUX-IN:[/b] The AUX-IN has to be coded. Optionally an FM transmitter can be used - this is not recommended.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;7er-e38&amp;quot;, &amp;quot;x5-e53&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Montage:[/b] Radios für BMW E38/E53 benötigen keine extra Halterungen.&amp;quot;,&lt;br /&gt;
    html_en: &amp;quot;[b]Installation:[/b] Radios for BMW E38/E53 do not need extra brackets.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;5er-e39&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot;,&lt;br /&gt;
    html_en: &amp;quot;[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].&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;3er-e46&amp;quot;], factory: [&amp;quot;iris&amp;quot;, &amp;quot;mid&amp;quot;, &amp;quot;pfeil&amp;quot;], current: [&amp;quot;werk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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]&amp;quot; +&lt;br /&gt;
          &amp;quot;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]&amp;quot; +&lt;br /&gt;
          &amp;quot;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=&amp;quot; + P.funktr + &amp;quot;]&amp;quot;,&lt;br /&gt;
    html_en: &amp;quot;[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]&amp;quot; +&lt;br /&gt;
          &amp;quot;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]&amp;quot; +&lt;br /&gt;
          &amp;quot;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=&amp;quot; + P.funktr + &amp;quot;]&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { factory: [&amp;quot;cic&amp;quot;, &amp;quot;nbt&amp;quot;, &amp;quot;nbtevo&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Lichtleiter:[/b] Ggf. vorhandene Lichtleiter (MOST) müssen aus dem BMW-Stecker in den Xtrons-Adapter umgesteckt werden.&amp;quot;,&lt;br /&gt;
    html_en: &amp;quot;[b]Fiber optic cables:[/b] Any existing fiber optic cables (MOST) have to be moved from the BMW connector to the Xtrons adapter.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { factory: [&amp;quot;mask&amp;quot;, &amp;quot;ccc&amp;quot;, &amp;quot;cic&amp;quot;, &amp;quot;nbt&amp;quot;, &amp;quot;nbtevo&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot;,&lt;br /&gt;
    html_en: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, opts: [&amp;quot;kcan&amp;quot;], when: {},&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot;,&lt;br /&gt;
    html_en: &amp;quot;[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].&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, opts: [&amp;quot;ibus&amp;quot;], when: {},&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot;,&lt;br /&gt;
    html_en: &amp;quot;[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].&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: {},&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot;,&lt;br /&gt;
    html_en: &amp;quot;[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].&amp;quot; }&lt;br /&gt;
];&lt;br /&gt;
/* =====================================================================&lt;br /&gt;
   PROGRAMMLOGIK&lt;br /&gt;
   ===================================================================== */&lt;br /&gt;
var $ = function (id) { return document.getElementById(id); };&lt;br /&gt;
var sel = {}, picked = {}, summary = &amp;quot;&amp;quot;, capA = 0, capB = 0, radioCache = {}, chosenRadio = null, cartFill = null;&lt;br /&gt;
var fieldsEl = $(&amp;quot;nvk-fields&amp;quot;), optsEl = $(&amp;quot;nvk-opts&amp;quot;), outEl = $(&amp;quot;nvk-out&amp;quot;);&lt;br /&gt;
var LANG = DEFAULT_LANG;&lt;br /&gt;
var AMP = &amp;quot;\u0026&amp;quot;;&lt;br /&gt;
function T(de, en) { return LANG === &amp;quot;en&amp;quot; ? en : de; }&lt;br /&gt;
function LT(o, k) { var v = LANG === &amp;quot;en&amp;quot; ? o[k + &amp;quot;_en&amp;quot;] : &amp;quot;&amp;quot;; return v ? v : o[k]; }&lt;br /&gt;
function itemUrl(i) { var v = LANG === &amp;quot;en&amp;quot; ? i.ue : &amp;quot;&amp;quot;; return v ? v : i.u; }&lt;br /&gt;
function full(u) { return u.indexOf(&amp;quot;/thumb/&amp;quot;) === -1 ? u : u.replace(&amp;quot;/thumb/&amp;quot;, &amp;quot;/&amp;quot;).replace(/\/[^\/]+$/, &amp;quot;&amp;quot;); }&lt;br /&gt;
function fmt(t) {&lt;br /&gt;
  return t.replace(/\[imgw=([^\x5D]+)\]/g, function (m, u) {&lt;br /&gt;
    return &amp;quot;\u003Ca href=\&amp;quot;&amp;quot; + full(u) + &amp;quot;\&amp;quot; target=\&amp;quot;_blank\&amp;quot; rel=\&amp;quot;noopener\&amp;quot;\u003E\u003Cimg class=\&amp;quot;nvk-img wide\&amp;quot; src=\&amp;quot;&amp;quot; + u + &amp;quot;\&amp;quot; alt=\&amp;quot;\&amp;quot;\u003E\u003C/a\u003E&amp;quot;;&lt;br /&gt;
  }).replace(/\[img=([^\x5D]+)\]/g, function (m, u) {&lt;br /&gt;
    return &amp;quot;\u003Ca href=\&amp;quot;&amp;quot; + full(u) + &amp;quot;\&amp;quot; target=\&amp;quot;_blank\&amp;quot; rel=\&amp;quot;noopener\&amp;quot;\u003E\u003Cimg class=\&amp;quot;nvk-img\&amp;quot; src=\&amp;quot;&amp;quot; + u + &amp;quot;\&amp;quot; alt=\&amp;quot;\&amp;quot;\u003E\u003C/a\u003E&amp;quot;;&lt;br /&gt;
  }).replace(/\[b\]/g, &amp;quot;\u003Cb\u003E&amp;quot;).replace(/\[\/b\]/g, &amp;quot;\u003C/b\u003E&amp;quot;).replace(/\[br\]/g, &amp;quot;\u003Cbr\u003E&amp;quot;)&lt;br /&gt;
    .replace(/\[a=([^\x5D]+)\]/g, &amp;quot;\u003Ca href=\&amp;quot;$1\&amp;quot; target=\&amp;quot;_blank\&amp;quot; rel=\&amp;quot;noopener\&amp;quot;\u003E&amp;quot;).replace(/\[\/a\]/g, &amp;quot;\u003C/a\u003E&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
function match(cond, s, lenient) {&lt;br /&gt;
  if (!cond) return true;&lt;br /&gt;
  for (var k in cond) {&lt;br /&gt;
    if (!s[k]) { if (lenient) continue; return false; }&lt;br /&gt;
    if (cond[k].indexOf(s[k]) === -1) return false;&lt;br /&gt;
  }&lt;br /&gt;
  return true;&lt;br /&gt;
}&lt;br /&gt;
function vehicleOf(id) { return VEHICLES.filter(function (x) { return x.v === id; })[0]; }&lt;br /&gt;
function derive() {&lt;br /&gt;
  var s = {}, k;&lt;br /&gt;
  for (k in sel) s[k] = sel[k];&lt;br /&gt;
  var veh = vehicleOf(sel.vehicle);&lt;br /&gt;
  if (veh) s.gen = veh.gen;&lt;br /&gt;
  if (s.gen === &amp;quot;alt&amp;quot;) {&lt;br /&gt;
    if (s.factory === &amp;quot;n43&amp;quot; || s.factory === &amp;quot;n169&amp;quot;) s.module = &amp;quot;ja&amp;quot;;&lt;br /&gt;
    else if (s.factory === &amp;quot;iris&amp;quot; || s.factory === &amp;quot;mid&amp;quot;) s.module = &amp;quot;nein&amp;quot;;&lt;br /&gt;
    else if (s.factory === &amp;quot;pfeil&amp;quot;) s.module = s.trunk || &amp;quot;unk&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  return s;&lt;br /&gt;
}&lt;br /&gt;
function forced(s) {&lt;br /&gt;
  var f = {};&lt;br /&gt;
  FORCED.forEach(function (r) { if (match(r.when, s)) r.opts.forEach(function (o) { f[o] = LT(r, &amp;quot;why&amp;quot;); }); });&lt;br /&gt;
  return f;&lt;br /&gt;
}&lt;br /&gt;
function onSet(s) {&lt;br /&gt;
  var f = forced(s), on = {}, k;&lt;br /&gt;
  for (k in picked) if (picked[k]) on[k] = true;&lt;br /&gt;
  for (k in f) on[k] = true;&lt;br /&gt;
  return { on: on, forced: f };&lt;br /&gt;
}&lt;br /&gt;
function optVisible(o, s, on) {&lt;br /&gt;
  if (!match(o.show, s, true)) return false;&lt;br /&gt;
  return (o.requires || []).every(function (r) { return on[r]; });&lt;br /&gt;
}&lt;br /&gt;
FIELDS.forEach(function (f) {&lt;br /&gt;
  var wrap = document.createElement(&amp;quot;div&amp;quot;); wrap.className = &amp;quot;nvk-f&amp;quot;; wrap.id = &amp;quot;nvk-w-&amp;quot; + f.id;&lt;br /&gt;
  var lab = document.createElement(&amp;quot;label&amp;quot;); lab.htmlFor = &amp;quot;nvk-&amp;quot; + f.id; lab.id = &amp;quot;nvk-l-&amp;quot; + f.id; lab.textContent = LT(f, &amp;quot;label&amp;quot;);&lt;br /&gt;
  var s = document.createElement(&amp;quot;select&amp;quot;); s.id = &amp;quot;nvk-&amp;quot; + f.id;&lt;br /&gt;
  s.addEventListener(&amp;quot;change&amp;quot;, function () { sel[f.id] = s.value; update(); });&lt;br /&gt;
  wrap.appendChild(lab); wrap.appendChild(s);&lt;br /&gt;
  if (f.help) { var h = document.createElement(&amp;quot;div&amp;quot;); h.className = &amp;quot;nvk-help&amp;quot;; h.id = &amp;quot;nvk-h-&amp;quot; + f.id; h.innerHTML = fmt(LT(f, &amp;quot;help&amp;quot;)); wrap.appendChild(h); }&lt;br /&gt;
  var inf = document.createElement(&amp;quot;div&amp;quot;); inf.id = &amp;quot;nvk-i-&amp;quot; + f.id; wrap.appendChild(inf);&lt;br /&gt;
  fieldsEl.appendChild(wrap);&lt;br /&gt;
});&lt;br /&gt;
function renderFields() {&lt;br /&gt;
  FIELDS.forEach(function (f) {&lt;br /&gt;
    var s = derive();&lt;br /&gt;
    var wrap = $(&amp;quot;nvk-w-&amp;quot; + f.id), el = $(&amp;quot;nvk-&amp;quot; + f.id);&lt;br /&gt;
    $(&amp;quot;nvk-l-&amp;quot; + f.id).textContent = LT(f, &amp;quot;label&amp;quot;);&lt;br /&gt;
    if (f.help) { $(&amp;quot;nvk-h-&amp;quot; + f.id).innerHTML = fmt(LT(f, &amp;quot;help&amp;quot;)); }&lt;br /&gt;
    var vis = f.show ? match(f.show, s, false) : true;&lt;br /&gt;
    wrap.style.display = vis ? &amp;quot;&amp;quot; : &amp;quot;none&amp;quot;;&lt;br /&gt;
    if (!vis) { sel[f.id] = &amp;quot;&amp;quot;; return; }&lt;br /&gt;
    var allowed = f.values.filter(function (v) { return match(v.only, s, true); });&lt;br /&gt;
    if (sel[f.id]) { if (!allowed.some(function (v) { return v.v === sel[f.id]; })) sel[f.id] = &amp;quot;&amp;quot;; }&lt;br /&gt;
    if (!sel[f.id]) { if (f.def) sel[f.id] = f.def; }&lt;br /&gt;
    if (!sel[f.id]) { if (f.auto) { if (sel.vehicle) { if (allowed.length === 1) sel[f.id] = allowed[0].v; } } }&lt;br /&gt;
    el.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
    if (!f.def) { var p = document.createElement(&amp;quot;option&amp;quot;); p.value = &amp;quot;&amp;quot;; p.textContent = T(&amp;quot;– bitte wählen –&amp;quot;, &amp;quot;– please select –&amp;quot;); el.appendChild(p); }&lt;br /&gt;
    allowed.forEach(function (v) {&lt;br /&gt;
      var o = document.createElement(&amp;quot;option&amp;quot;); o.value = v.v; o.textContent = LT(v, &amp;quot;t&amp;quot;); el.appendChild(o);&lt;br /&gt;
    });&lt;br /&gt;
    el.value = sel[f.id] || &amp;quot;&amp;quot;;&lt;br /&gt;
    var cur = allowed.filter(function (v) { return v.v === sel[f.id]; })[0];&lt;br /&gt;
    var pre = f.pre ? (match(f.pre.when, s, false) ? fmt(LT(f.pre, &amp;quot;html&amp;quot;)) : &amp;quot;&amp;quot;) : &amp;quot;&amp;quot;;&lt;br /&gt;
    $(&amp;quot;nvk-i-&amp;quot; + f.id).innerHTML = pre + (cur ? (cur.info ? fmt(LT(cur, &amp;quot;info&amp;quot;)) : &amp;quot;&amp;quot;) : &amp;quot;&amp;quot;);&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
function renderOpts() {&lt;br /&gt;
  var s = derive(), st = onSet(s);&lt;br /&gt;
  OPTS.forEach(function (o) { if (!optVisible(o, s, st.on)) picked[o.id] = false; });&lt;br /&gt;
  st = onSet(s);&lt;br /&gt;
  optsEl.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
  OPTS.forEach(function (o) {&lt;br /&gt;
    if (!optVisible(o, s, st.on)) return;&lt;br /&gt;
    var lab = document.createElement(&amp;quot;label&amp;quot;); lab.className = &amp;quot;nvk-o&amp;quot;;&lt;br /&gt;
    var cb = document.createElement(&amp;quot;input&amp;quot;); cb.type = &amp;quot;checkbox&amp;quot;;&lt;br /&gt;
    cb.checked = !!st.on[o.id];&lt;br /&gt;
    var isForced = !!st.forced[o.id];&lt;br /&gt;
    if (isForced) { cb.disabled = true; lab.className += &amp;quot; dis&amp;quot;; }&lt;br /&gt;
    cb.addEventListener(&amp;quot;change&amp;quot;, function () {&lt;br /&gt;
      picked[o.id] = cb.checked;&lt;br /&gt;
      if (cb.checked) { if (o.excl) OPTS.forEach(function (x) { if (x.excl === o.excl) { if (x.id !== o.id) picked[x.id] = false; } }); }&lt;br /&gt;
      update();&lt;br /&gt;
    });&lt;br /&gt;
    lab.appendChild(cb);&lt;br /&gt;
    lab.appendChild(document.createTextNode(&amp;quot; &amp;quot; + LT(o, &amp;quot;t&amp;quot;)));&lt;br /&gt;
    var sub = [LT(o, &amp;quot;sub&amp;quot;), isForced ? st.forced[o.id] : &amp;quot;&amp;quot;].filter(Boolean).join(&amp;quot; - &amp;quot;);&lt;br /&gt;
    if (sub) { var sm = document.createElement(&amp;quot;small&amp;quot;); sm.textContent = &amp;quot; (&amp;quot; + sub + &amp;quot;)&amp;quot;; lab.appendChild(sm); }&lt;br /&gt;
    optsEl.appendChild(lab);&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
function link(url, text) {&lt;br /&gt;
  var a = document.createElement(&amp;quot;a&amp;quot;); a.href = url; a.target = &amp;quot;_blank&amp;quot;; a.rel = &amp;quot;noopener&amp;quot;; a.textContent = text; return a;&lt;br /&gt;
}&lt;br /&gt;
function card(item, cls) {&lt;br /&gt;
  var d = document.createElement(&amp;quot;div&amp;quot;); d.className = &amp;quot;nvk-card &amp;quot; + (cls || &amp;quot;&amp;quot;) + (item.hl ? &amp;quot; hl&amp;quot; : &amp;quot;&amp;quot;);&lt;br /&gt;
  var b = document.createElement(&amp;quot;b&amp;quot;); b.textContent = LT(item, &amp;quot;t&amp;quot;); d.appendChild(b);&lt;br /&gt;
  var dd = LT(item, &amp;quot;d&amp;quot;);&lt;br /&gt;
  if (dd) { var p = document.createElement(&amp;quot;span&amp;quot;); p.textContent = dd; d.appendChild(p); }&lt;br /&gt;
  if (item.img) {&lt;br /&gt;
    var im = document.createElement(&amp;quot;div&amp;quot;);&lt;br /&gt;
    item.img.forEach(function (u) {&lt;br /&gt;
      var a = document.createElement(&amp;quot;a&amp;quot;); a.href = full(u); a.target = &amp;quot;_blank&amp;quot;; a.rel = &amp;quot;noopener&amp;quot;;&lt;br /&gt;
      var g = document.createElement(&amp;quot;img&amp;quot;); g.className = &amp;quot;nvk-img&amp;quot;; g.src = u; g.alt = LT(item, &amp;quot;t&amp;quot;); a.appendChild(g); im.appendChild(a);&lt;br /&gt;
    });&lt;br /&gt;
    d.appendChild(im);&lt;br /&gt;
  }&lt;br /&gt;
  var iu = itemUrl(item);&lt;br /&gt;
  if (iu || item.w) {&lt;br /&gt;
    var l = document.createElement(&amp;quot;div&amp;quot;); l.className = &amp;quot;nvk-links&amp;quot;;&lt;br /&gt;
    if (iu) l.appendChild(link(iu, LT(item, &amp;quot;ut&amp;quot;) || T(&amp;quot;Im Shop ansehen →&amp;quot;, &amp;quot;View in shop →&amp;quot;)));&lt;br /&gt;
    if (item.w) l.appendChild(link(item.w, (LT(item, &amp;quot;wt&amp;quot;) || T(&amp;quot;Zum Wiki&amp;quot;, &amp;quot;Open wiki&amp;quot;)) + &amp;quot; →&amp;quot;));&lt;br /&gt;
    d.appendChild(l);&lt;br /&gt;
  }&lt;br /&gt;
  if (item.links) item.links.forEach(function (x) {&lt;br /&gt;
    var r = document.createElement(&amp;quot;div&amp;quot;); r.className = &amp;quot;nvk-links&amp;quot;; r.appendChild(link(LANG === &amp;quot;en&amp;quot; ? (x.ue || x.u) : x.u, LT(x, &amp;quot;t&amp;quot;) + &amp;quot; →&amp;quot;)); d.appendChild(r);&lt;br /&gt;
  });&lt;br /&gt;
  return d;&lt;br /&gt;
}&lt;br /&gt;
function heading(txt) { var h = document.createElement(&amp;quot;h3&amp;quot;); h.textContent = txt; outEl.appendChild(h); }&lt;br /&gt;
function aidOf(u) {&lt;br /&gt;
  if (u.indexOf(SHOP) !== 0) return &amp;quot;&amp;quot;;&lt;br /&gt;
  var m = u.match(/sArticle\/(\d+)/);&lt;br /&gt;
  if (!m) m = u.split(&amp;quot;?&amp;quot;)[0].match(/\/(\d+)\/[^\/]+$/);&lt;br /&gt;
  return m ? m[1] : &amp;quot;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
function renderRadioList(veh) {&lt;br /&gt;
  if (veh.noCat) return;&lt;br /&gt;
  if (chosenRadio) { if (chosenRadio.cat !== veh.v) chosenRadio = null; }&lt;br /&gt;
  var ck = veh.v + &amp;quot;-&amp;quot; + LANG;&lt;br /&gt;
  var data = radioCache[ck];&lt;br /&gt;
  if (data === undefined) {&lt;br /&gt;
    radioCache[ck] = &amp;quot;loading&amp;quot;;&lt;br /&gt;
    fetch(API + &amp;quot;?cat=&amp;quot; + encodeURIComponent(veh.v) + AMP + &amp;quot;lang=&amp;quot; + LANG).then(function (r) { return r.json(); }).then(function (j) {&lt;br /&gt;
      radioCache[ck] = (j.items || []).map(function (it) { it.cat = veh.v; return it; });&lt;br /&gt;
      renderResult();&lt;br /&gt;
    }).catch(function () { radioCache[ck] = []; renderResult(); });&lt;br /&gt;
  }&lt;br /&gt;
  if (data === undefined || data === &amp;quot;loading&amp;quot;) {&lt;br /&gt;
    var m = document.createElement(&amp;quot;p&amp;quot;); m.className = &amp;quot;nvk-miss&amp;quot;; m.textContent = T(&amp;quot;Verfügbare Radios werden geladen …&amp;quot;, &amp;quot;Loading available radios …&amp;quot;); outEl.appendChild(m); return;&lt;br /&gt;
  }&lt;br /&gt;
  if (!data.length) return;&lt;br /&gt;
  var want = { mask: /M-?ASK/i, ccc: /\bCCC\b/i, cic: /\bCIC\b/i, nbt: /\bNBT\b/i, nbtevo: /EVO/i }[sel.factory];&lt;br /&gt;
  function fits(it) { return want ? want.test(it.name) : false; }&lt;br /&gt;
  var list = data.slice().sort(function (a, b) { return (fits(b) ? 1 : 0) - (fits(a) ? 1 : 0); });&lt;br /&gt;
  var det = document.createElement(&amp;quot;details&amp;quot;); det.open = Math.max(list.length, 8) === 8;&lt;br /&gt;
  var sm = document.createElement(&amp;quot;summary&amp;quot;); sm.style.cursor = &amp;quot;pointer&amp;quot;; sm.style.fontWeight = &amp;quot;700&amp;quot;;&lt;br /&gt;
  sm.textContent = T(&amp;quot;Verfügbare Radios für Deinen BMW &amp;quot;, &amp;quot;Available radios for your BMW &amp;quot;) + vname(veh) + &amp;quot; (&amp;quot; + list.length + &amp;quot;)&amp;quot;; det.appendChild(sm);&lt;br /&gt;
  list.forEach(function (it) {&lt;br /&gt;
    var row = document.createElement(&amp;quot;div&amp;quot;); row.className = &amp;quot;nvk-row&amp;quot;;&lt;br /&gt;
    var lab = document.createElement(&amp;quot;label&amp;quot;); lab.className = &amp;quot;nvk-o&amp;quot;;&lt;br /&gt;
    var rb = document.createElement(&amp;quot;input&amp;quot;); rb.type = &amp;quot;radio&amp;quot;; rb.name = &amp;quot;nvk-radio&amp;quot;;&lt;br /&gt;
    rb.checked = chosenRadio ? chosenRadio.sku === it.sku : false;&lt;br /&gt;
    rb.addEventListener(&amp;quot;change&amp;quot;, function () { chosenRadio = it; if (cartFill) cartFill(); });&lt;br /&gt;
    lab.appendChild(rb);&lt;br /&gt;
    lab.appendChild(document.createTextNode(&amp;quot; &amp;quot; + it.name + (it.price ? &amp;quot;  -  &amp;quot; + it.price : &amp;quot;&amp;quot;) + (fits(it) ? T(&amp;quot;  (passt zu Deiner Auswahl)&amp;quot;, &amp;quot;  (matches your selection)&amp;quot;) : &amp;quot;&amp;quot;)));&lt;br /&gt;
    row.appendChild(lab); row.appendChild(link(it.url, &amp;quot;Shop →&amp;quot;));&lt;br /&gt;
    det.appendChild(row);&lt;br /&gt;
  });&lt;br /&gt;
  outEl.appendChild(det);&lt;br /&gt;
}&lt;br /&gt;
function cartBlock(needs, opt) {&lt;br /&gt;
  var items = [];&lt;br /&gt;
  needs.concat(opt).forEach(function (i) { var id = aidOf(itemUrl(i) || &amp;quot;&amp;quot;); if (id) items.push({ t: LT(i, &amp;quot;t&amp;quot;), aid: id, sku: LANG === &amp;quot;en&amp;quot; ? i.sku_en : i.sku }); });&lt;br /&gt;
  heading(T(&amp;quot;In den Warenkorb&amp;quot;, &amp;quot;Add to cart&amp;quot;));&lt;br /&gt;
  var box = document.createElement(&amp;quot;div&amp;quot;); box.className = &amp;quot;nvk-card opt&amp;quot;;&lt;br /&gt;
  var p = document.createElement(&amp;quot;div&amp;quot;);&lt;br /&gt;
  p.textContent = T(&amp;quot;Das oben gewählte Radio (falls ausgewählt) und diese Artikel werden direkt im Shop in den Warenkorb gelegt:&amp;quot;, &amp;quot;The radio selected above (if any) and these items will be added to your cart in the shop:&amp;quot;);&lt;br /&gt;
  box.appendChild(p);&lt;br /&gt;
  var listEl = document.createElement(&amp;quot;div&amp;quot;); box.appendChild(listEl);&lt;br /&gt;
  cartFill = function () {&lt;br /&gt;
    listEl.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
    var lines = (chosenRadio ? [&amp;quot;Radio: &amp;quot; + chosenRadio.type] : []).concat(items.map(function (x) { return x.t; }));&lt;br /&gt;
    lines.forEach(function (t) { var r = document.createElement(&amp;quot;div&amp;quot;); r.textContent = &amp;quot;- &amp;quot; + t; listEl.appendChild(r); });&lt;br /&gt;
  };&lt;br /&gt;
  cartFill();&lt;br /&gt;
  var n = document.createElement(&amp;quot;div&amp;quot;); n.className = &amp;quot;nvk-help&amp;quot;;&lt;br /&gt;
  n.textContent = T(&amp;quot;Kameras, TPMS, Werkzeug und Artikel ohne Direktlink wählst Du bitte über die Links oben im Shop aus.&amp;quot;, &amp;quot;Cameras, TPMS, tools and items without a direct link: please pick them in the shop using the links above.&amp;quot;);&lt;br /&gt;
  box.appendChild(n);&lt;br /&gt;
  var all = needs.concat(opt);&lt;br /&gt;
  var has = function (k) { return all.indexOf(ITEMS[k]) !== -1; };&lt;br /&gt;
  var l17 = has(&amp;quot;kcanlic&amp;quot;), l7 = has(&amp;quot;bclic&amp;quot;) || has(&amp;quot;bcdsp&amp;quot;);&lt;br /&gt;
  if (l17 || l7) {&lt;br /&gt;
    var vb = document.createElement(&amp;quot;div&amp;quot;); vb.className = &amp;quot;nvk-f&amp;quot;; vb.style.marginTop = &amp;quot;12px&amp;quot;;&lt;br /&gt;
    var vlab = document.createElement(&amp;quot;label&amp;quot;); vlab.htmlFor = &amp;quot;nvk-licvin&amp;quot;;&lt;br /&gt;
    vlab.textContent = l17 ? T(&amp;quot;Fahrgestellnummer (17 Zeichen) für die Lizenz&amp;quot;, &amp;quot;Full VIN (17 characters) for the license&amp;quot;) : T(&amp;quot;VIN für die Lizenz (7 Zeichen, z. B. AB12345)&amp;quot;, &amp;quot;VIN for the license (7 characters, e.g. AB12345)&amp;quot;);&lt;br /&gt;
    var vin = document.createElement(&amp;quot;input&amp;quot;); vin.type = &amp;quot;text&amp;quot;; vin.id = &amp;quot;nvk-licvin&amp;quot;; vin.maxLength = 17;&lt;br /&gt;
    vin.value = $(&amp;quot;nvk-vin&amp;quot;).value.toUpperCase();&lt;br /&gt;
    var ta = document.createElement(&amp;quot;textarea&amp;quot;); ta.rows = 3; ta.readOnly = true; ta.style.display = &amp;quot;none&amp;quot;; ta.style.marginTop = &amp;quot;6px&amp;quot;;&lt;br /&gt;
    var cb = document.createElement(&amp;quot;button&amp;quot;); cb.type = &amp;quot;button&amp;quot;; cb.className = &amp;quot;nvk-btn&amp;quot;; cb.style.marginTop = &amp;quot;6px&amp;quot;;&lt;br /&gt;
    cb.textContent = T(&amp;quot;Kommentartext für die Kasse kopieren&amp;quot;, &amp;quot;Copy comment text for checkout&amp;quot;);&lt;br /&gt;
    var ls = document.createElement(&amp;quot;div&amp;quot;); ls.className = &amp;quot;nvk-help&amp;quot;;&lt;br /&gt;
    cb.addEventListener(&amp;quot;click&amp;quot;, function () {&lt;br /&gt;
      var v = vin.value.trim().toUpperCase(), v7 = &amp;quot;&amp;quot;, v17 = &amp;quot;&amp;quot;;&lt;br /&gt;
      if (/^[A-HJ-NPR-Z0-9]{17}$/.test(v)) { v17 = v; v7 = v.slice(10); }&lt;br /&gt;
      else if (/^[A-Z]{2}[0-9]{5}$/.test(v)) v7 = v;&lt;br /&gt;
      if (l17 ? !v17 : !v7) { ls.textContent = l17 ? T(&amp;quot;Bitte die vollständige 17-stellige Fahrgestellnummer eingeben.&amp;quot;, &amp;quot;Please enter the full 17-character VIN.&amp;quot;) : T(&amp;quot;Bitte die VIN im Format AB12345 (oder die 17-stellige FGN) eingeben.&amp;quot;, &amp;quot;Please enter the VIN as AB12345 (or the full 17-character VIN).&amp;quot;); return; }&lt;br /&gt;
      var L = [];&lt;br /&gt;
      if (has(&amp;quot;bclic&amp;quot;)) L.push(T(&amp;quot;I-BUS App BC Lizenz: VIN &amp;quot;, &amp;quot;I-BUS App OBC License: VIN &amp;quot;) + v7);&lt;br /&gt;
      if (has(&amp;quot;bcdsp&amp;quot;)) L.push(T(&amp;quot;I-BUS App BC+DSP Lizenz: VIN &amp;quot;, &amp;quot;I-BUS App OBC+DSP License: VIN &amp;quot;) + v7);&lt;br /&gt;
      if (l17) L.push(T(&amp;quot;K-CAN App Beta Lizenz: FGN &amp;quot;, &amp;quot;K-CAN App Beta License: VIN &amp;quot;) + v17);&lt;br /&gt;
      ta.value = L.join(&amp;quot;\n&amp;quot;); ta.style.display = &amp;quot;&amp;quot;; ta.select();&lt;br /&gt;
      var hint = T(&amp;quot;Bitte an der Shop-Kasse in das Feld Kommentar einfügen.&amp;quot;, &amp;quot;Please paste it into the Comment field at the shop checkout.&amp;quot;);&lt;br /&gt;
      var manual = T(&amp;quot;Bitte den Text markieren und kopieren. &amp;quot;, &amp;quot;Please select and copy the text. &amp;quot;);&lt;br /&gt;
      if (navigator.clipboard) navigator.clipboard.writeText(ta.value).then(function () { ls.textContent = T(&amp;quot;Text kopiert. &amp;quot;, &amp;quot;Text copied. &amp;quot;) + hint; }).catch(function () { ls.textContent = manual + hint; });&lt;br /&gt;
      else ls.textContent = manual + hint;&lt;br /&gt;
    });&lt;br /&gt;
    vb.appendChild(vlab); vb.appendChild(vin); vb.appendChild(cb); vb.appendChild(ta); vb.appendChild(ls); box.appendChild(vb);&lt;br /&gt;
  }&lt;br /&gt;
  if (!CART_TRANSFER) { outEl.appendChild(box); return; }&lt;br /&gt;
  var btn = document.createElement(&amp;quot;button&amp;quot;); btn.type = &amp;quot;button&amp;quot;; btn.className = &amp;quot;nvk-btn&amp;quot;; btn.style.marginTop = &amp;quot;8px&amp;quot;;&lt;br /&gt;
  btn.textContent = T(&amp;quot;Auswahl in den Warenkorb legen&amp;quot;, &amp;quot;Add selection to cart&amp;quot;);&lt;br /&gt;
  var st = document.createElement(&amp;quot;div&amp;quot;); st.className = &amp;quot;nvk-help&amp;quot;;&lt;br /&gt;
  btn.addEventListener(&amp;quot;click&amp;quot;, function () { addToCart(items, st); });&lt;br /&gt;
  box.appendChild(btn); box.appendChild(st); outEl.appendChild(box);&lt;br /&gt;
}&lt;br /&gt;
function addToCart(items, st) {&lt;br /&gt;
  var list = items.slice();&lt;br /&gt;
  if (chosenRadio) list.unshift({ t: chosenRadio.type, sku: chosenRadio.sku });&lt;br /&gt;
  if (!list.length) { st.textContent = T(&amp;quot;Es ist noch nichts zum Bestellen ausgewählt.&amp;quot;, &amp;quot;Nothing has been selected to order yet.&amp;quot;); return; }&lt;br /&gt;
  var w = window.open(&amp;quot;&amp;quot;, &amp;quot;_blank&amp;quot;);&lt;br /&gt;
  st.textContent = T(&amp;quot;Artikelnummern werden ermittelt …&amp;quot;, &amp;quot;Looking up item numbers …&amp;quot;);&lt;br /&gt;
  var ids = list.filter(function (x) { return x.aid; }).map(function (x) { return x.aid; });&lt;br /&gt;
  var get = ids.length ? fetch(API + &amp;quot;?aid=&amp;quot; + ids.join(&amp;quot;,&amp;quot;) + AMP + &amp;quot;lang=&amp;quot; + LANG).then(function (r) { return r.json(); }).then(function (j) { return j.skus || {}; }) : Promise.resolve({});&lt;br /&gt;
  get.then(function (map) {&lt;br /&gt;
    var skus = [];&lt;br /&gt;
    list.forEach(function (x) { var k = x.sku || map[x.aid]; if (k) skus.push(k); });&lt;br /&gt;
    if (!skus.length) throw new Error(&amp;quot;none&amp;quot;);&lt;br /&gt;
    var url = (LANG === &amp;quot;en&amp;quot; ? TRANSFER_URL_EN : TRANSFER_URL) + encodeURIComponent(skus.join(&amp;quot;,&amp;quot;));&lt;br /&gt;
    if (w) {&lt;br /&gt;
      w.location.href = url;&lt;br /&gt;
      st.textContent = T(&amp;quot;Der Shop wurde in einem neuen Tab geöffnet (&amp;quot; + skus.length + &amp;quot; von &amp;quot; + list.length + &amp;quot; Artikeln übergeben). Bitte dort den Warenkorb kontrollieren. Ist ein Artikel nicht bestellbar, weist der Shop darauf hin.&amp;quot;, &amp;quot;The shop was opened in a new tab (&amp;quot; + skus.length + &amp;quot; of &amp;quot; + list.length + &amp;quot; items transferred). Please check the cart there. If an item cannot be ordered, the shop will tell you.&amp;quot;);&lt;br /&gt;
    } else {&lt;br /&gt;
      st.textContent = T(&amp;quot;Der neue Tab wurde blockiert. Bitte Pop-ups erlauben oder diesen Link nutzen: &amp;quot;, &amp;quot;The new tab was blocked. Please allow pop-ups or use this link: &amp;quot;);&lt;br /&gt;
      st.appendChild(link(url, T(&amp;quot;Warenkorb im Shop öffnen →&amp;quot;, &amp;quot;Open cart in the shop →&amp;quot;)));&lt;br /&gt;
    }&lt;br /&gt;
  }).catch(function () { if (w) w.close(); st.textContent = T(&amp;quot;Das hat leider nicht geklappt. Bitte nutze die Shop-Links oben.&amp;quot;, &amp;quot;Sorry, that did not work. Please use the shop links above.&amp;quot;); });&lt;br /&gt;
}&lt;br /&gt;
function renderResult() {&lt;br /&gt;
  var s = derive(), st = onSet(s);&lt;br /&gt;
  var missing = FIELDS.filter(function (f) {&lt;br /&gt;
    var w = $(&amp;quot;nvk-w-&amp;quot; + f.id);&lt;br /&gt;
    return w.style.display !== &amp;quot;none&amp;quot; ? (!f.optional ? !sel[f.id] : false) : false;&lt;br /&gt;
  });&lt;br /&gt;
  outEl.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
  if (missing.length) {&lt;br /&gt;
    var m = document.createElement(&amp;quot;p&amp;quot;); m.className = &amp;quot;nvk-miss&amp;quot;;&lt;br /&gt;
    m.textContent = T(&amp;quot;Bitte noch auswählen: &amp;quot;, &amp;quot;Please still select: &amp;quot;) + missing.map(function (f) { return LT(f, &amp;quot;label&amp;quot;); }).join(&amp;quot;, &amp;quot;);&lt;br /&gt;
    outEl.appendChild(m); $(&amp;quot;nvk-form&amp;quot;).style.display = &amp;quot;none&amp;quot;; return;&lt;br /&gt;
  }&lt;br /&gt;
  $(&amp;quot;nvk-form&amp;quot;).style.display = &amp;quot;&amp;quot;;&lt;br /&gt;
  var veh = vehicleOf(sel.vehicle);&lt;br /&gt;
  var rbase = LANG === &amp;quot;en&amp;quot; ? SHOP_EN + &amp;quot;bmw-head-units/&amp;quot; : SHOP + &amp;quot;bmw-radios/&amp;quot;;&lt;br /&gt;
  var ru = veh.noCat ? rbase : rbase + (LANG === &amp;quot;en&amp;quot; ? enSlug(veh.v) : veh.v) + &amp;quot;/&amp;quot;;&lt;br /&gt;
  heading(T(&amp;quot;Passende Radios&amp;quot;, &amp;quot;Matching radios&amp;quot;));&lt;br /&gt;
  outEl.appendChild(card({ t: T(&amp;quot;BMW Radios für &amp;quot; + veh.t, &amp;quot;BMW radios for &amp;quot; + vname(veh)), d: T(&amp;quot;Alle Radios, die für Deinen BMW &amp;quot; + veh.t + &amp;quot; im Shop erhältlich sind.&amp;quot;, &amp;quot;All radios available in the shop for your BMW &amp;quot; + vname(veh) + &amp;quot;.&amp;quot;),&lt;br /&gt;
    u: ru, ut: T(&amp;quot;Zu den passenden Radios →&amp;quot;, &amp;quot;To the matching radios →&amp;quot;), w: rbase, wt: T(&amp;quot;Alle BMW Radios&amp;quot;, &amp;quot;All BMW radios&amp;quot;) }, &amp;quot;rad&amp;quot;));&lt;br /&gt;
  renderRadioList(veh);&lt;br /&gt;
  var needs = [], hints = [], seen = {};&lt;br /&gt;
  RULES.forEach(function (r) {&lt;br /&gt;
    if (!match(r.when, s)) return;&lt;br /&gt;
    if (r.opts) { if (!r.opts.every(function (o) { return st.on[o]; })) return; }&lt;br /&gt;
    if (r.type === &amp;quot;need&amp;quot;) (r.items || []).forEach(function (id) { if (!seen[id]) { seen[id] = 1; needs.push(ITEMS[id]); } });&lt;br /&gt;
    else hints.push(LT(r, &amp;quot;html&amp;quot;));&lt;br /&gt;
  });&lt;br /&gt;
  heading(T(&amp;quot;Das brauchst Du&amp;quot;, &amp;quot;What you need&amp;quot;));&lt;br /&gt;
  if (needs.length) needs.forEach(function (i) { outEl.appendChild(card(i)); });&lt;br /&gt;
  else { var n = document.createElement(&amp;quot;p&amp;quot;); n.textContent = T(&amp;quot;Für die Grundinstallation sind keine zusätzlichen Verlängerungen oder Adapter nötig.&amp;quot;, &amp;quot;No additional extensions or adapters are needed for the basic installation.&amp;quot;); outEl.appendChild(n); }&lt;br /&gt;
  var opt = [];&lt;br /&gt;
  OPTS.forEach(function (o) {&lt;br /&gt;
    if (!st.on[o.id]) return;&lt;br /&gt;
    if (!optVisible(o, s, st.on)) return;&lt;br /&gt;
    o.items.forEach(function (id) {&lt;br /&gt;
      if (seen[id]) return;&lt;br /&gt;
      var sk = ITEMS[id].skipIf;&lt;br /&gt;
      if (sk) { if (seen[sk]) return; }&lt;br /&gt;
      seen[id] = 1; opt.push(ITEMS[id]);&lt;br /&gt;
    });&lt;br /&gt;
  });&lt;br /&gt;
  if (opt.length) { heading(T(&amp;quot;Deine Zusatzoptionen&amp;quot;, &amp;quot;Your additional options&amp;quot;)); opt.forEach(function (i) { outEl.appendChild(card(i, &amp;quot;opt&amp;quot;)); }); }&lt;br /&gt;
  if (hints.length) {&lt;br /&gt;
    heading(T(&amp;quot;Hinweise&amp;quot;, &amp;quot;Notes&amp;quot;));&lt;br /&gt;
    hints.forEach(function (t) { var d = document.createElement(&amp;quot;div&amp;quot;); d.className = &amp;quot;nvk-note&amp;quot;; d.innerHTML = fmt(t); outEl.appendChild(d); });&lt;br /&gt;
  }&lt;br /&gt;
  var L = [T(&amp;quot;KONFIGURATION&amp;quot;, &amp;quot;CONFIGURATION&amp;quot;), &amp;quot;Language: &amp;quot; + LANG];&lt;br /&gt;
  FIELDS.forEach(function (f) {&lt;br /&gt;
    if (!sel[f.id]) return;&lt;br /&gt;
    var v = f.values.filter(function (x) { return x.v === sel[f.id]; })[0];&lt;br /&gt;
    if (v) L.push(&amp;quot;- &amp;quot; + LT(f, &amp;quot;label&amp;quot;) + &amp;quot;: &amp;quot; + LT(v, &amp;quot;t&amp;quot;));&lt;br /&gt;
  });&lt;br /&gt;
  L.push(&amp;quot;&amp;quot;, T(&amp;quot;BENÖTIGT&amp;quot;, &amp;quot;REQUIRED&amp;quot;));&lt;br /&gt;
  needs.forEach(function (i) { L.push(&amp;quot;- &amp;quot; + LT(i, &amp;quot;t&amp;quot;) + (itemUrl(i) ? &amp;quot;  &amp;quot; + itemUrl(i) : &amp;quot;&amp;quot;)); });&lt;br /&gt;
  if (opt.length) { L.push(&amp;quot;&amp;quot;, T(&amp;quot;ZUSATZOPTIONEN&amp;quot;, &amp;quot;ADDITIONAL OPTIONS&amp;quot;)); opt.forEach(function (i) { L.push(&amp;quot;- &amp;quot; + LT(i, &amp;quot;t&amp;quot;) + (itemUrl(i) ? &amp;quot;  &amp;quot; + itemUrl(i) : &amp;quot;&amp;quot;)); }); }&lt;br /&gt;
  L.push(&amp;quot;&amp;quot;, &amp;quot;Radios: &amp;quot; + ru);&lt;br /&gt;
  summary = L.join(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  cartBlock(needs, opt);&lt;br /&gt;
}&lt;br /&gt;
function update() { renderFields(); renderOpts(); renderResult(); }&lt;br /&gt;
function capText() { $(&amp;quot;nvk-capq&amp;quot;).textContent = T(&amp;quot;Sicherheitsfrage: Was ist &amp;quot;, &amp;quot;Security question: What is &amp;quot;) + capA + &amp;quot; + &amp;quot; + capB + &amp;quot;? *&amp;quot;; }&lt;br /&gt;
function newCaptcha() {&lt;br /&gt;
  capA = 1 + Math.floor(Math.random() * 9); capB = 1 + Math.floor(Math.random() * 9);&lt;br /&gt;
  capText(); $(&amp;quot;nvk-cap&amp;quot;).value = &amp;quot;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
function status(msg, ok) { var e = $(&amp;quot;nvk-status&amp;quot;); e.style.display = &amp;quot;&amp;quot;; e.textContent = msg; e.style.borderLeftColor = ok ? &amp;quot;#14866d&amp;quot; : &amp;quot;#d33&amp;quot;; }&lt;br /&gt;
$(&amp;quot;nvk-send&amp;quot;).addEventListener(&amp;quot;click&amp;quot;, function () {&lt;br /&gt;
  var name = $(&amp;quot;nvk-name&amp;quot;).value.trim(), mail = $(&amp;quot;nvk-mail&amp;quot;).value.trim(), vin = $(&amp;quot;nvk-vin&amp;quot;).value.trim().toUpperCase(), msg = $(&amp;quot;nvk-msg&amp;quot;).value.trim();&lt;br /&gt;
  if (!name || !mail || !msg) return status(T(&amp;quot;Bitte Name, E-Mail und Kommentar ausfüllen.&amp;quot;, &amp;quot;Please fill in name, email and comment.&amp;quot;), false);&lt;br /&gt;
  if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(mail)) return status(T(&amp;quot;Bitte eine gültige E-Mail-Adresse eingeben.&amp;quot;, &amp;quot;Please enter a valid email address.&amp;quot;), false);&lt;br /&gt;
  if (vin) { if (!/^[A-Z]{2}[0-9]{5}$/.test(vin)) { if (!/^[A-HJ-NPR-Z0-9]{17}$/.test(vin)) return status(T(&amp;quot;Bitte die VIN im Format AB12345 oder die 17-stellige FGN eingeben - oder das Feld leer lassen.&amp;quot;, &amp;quot;Please enter the VIN as AB12345 or the full 17-character VIN - or leave the field empty.&amp;quot;), false); } }&lt;br /&gt;
  if (parseInt($(&amp;quot;nvk-cap&amp;quot;).value, 10) !== capA + capB) return status(T(&amp;quot;Die Sicherheitsfrage wurde nicht richtig beantwortet.&amp;quot;, &amp;quot;The security question was not answered correctly.&amp;quot;), false);&lt;br /&gt;
  if (!$(&amp;quot;nvk-dsgvo&amp;quot;).checked) return status(T(&amp;quot;Bitte der Verarbeitung Deiner Daten zustimmen.&amp;quot;, &amp;quot;Please agree to the processing of your data.&amp;quot;), false);&lt;br /&gt;
  if ($(&amp;quot;nvk-hp&amp;quot;).value) return;&lt;br /&gt;
  var sz = $(&amp;quot;nvk-size&amp;quot;).value;&lt;br /&gt;
  var rad = chosenRadio ? &amp;quot;\n\n&amp;quot; + T(&amp;quot;GEWÄHLTES RADIO&amp;quot;, &amp;quot;SELECTED RADIO&amp;quot;) + &amp;quot;\n- &amp;quot; + chosenRadio.type + &amp;quot;  &amp;quot; + chosenRadio.url : &amp;quot;&amp;quot;;&lt;br /&gt;
  var sum2 = summary + rad + (sz ? &amp;quot;\n\n&amp;quot; + T(&amp;quot;Gewünschte Displaygröße: &amp;quot;, &amp;quot;Desired display size: &amp;quot;) + sz : &amp;quot;&amp;quot;);&lt;br /&gt;
  var text = &amp;quot;Name: &amp;quot; + name + &amp;quot;\n&amp;quot; + T(&amp;quot;E-Mail: &amp;quot;, &amp;quot;Email: &amp;quot;) + mail + &amp;quot;\nVIN: &amp;quot; + (vin || &amp;quot;-&amp;quot;) + &amp;quot;\n\n&amp;quot; + T(&amp;quot;Kommentar:&amp;quot;, &amp;quot;Comment:&amp;quot;) + &amp;quot;\n&amp;quot; + msg + &amp;quot;\n\n&amp;quot; + sum2;&lt;br /&gt;
  if (SEND_URL) {&lt;br /&gt;
    var p = new URLSearchParams();&lt;br /&gt;
    p.append(&amp;quot;name&amp;quot;, name); p.append(&amp;quot;mail&amp;quot;, mail); p.append(&amp;quot;vin&amp;quot;, vin); p.append(&amp;quot;msg&amp;quot;, msg); p.append(&amp;quot;summary&amp;quot;, sum2);&lt;br /&gt;
    p.append(&amp;quot;hp&amp;quot;, $(&amp;quot;nvk-hp&amp;quot;).value); p.append(&amp;quot;ca&amp;quot;, capA); p.append(&amp;quot;cb&amp;quot;, capB); p.append(&amp;quot;cv&amp;quot;, $(&amp;quot;nvk-cap&amp;quot;).value); p.append(&amp;quot;lang&amp;quot;, LANG);&lt;br /&gt;
    fetch(SEND_URL, { method: &amp;quot;POST&amp;quot;, body: p }).then(function (r) {&lt;br /&gt;
      if (!r.ok) throw new Error(&amp;quot;send&amp;quot;);&lt;br /&gt;
      status(T(&amp;quot;Danke! Deine Anfrage wurde gesendet, eine Kopie geht an &amp;quot; + mail + &amp;quot;.&amp;quot;, &amp;quot;Thank you! Your request has been sent, a copy goes to &amp;quot; + mail + &amp;quot;.&amp;quot;), true); newCaptcha();&lt;br /&gt;
    }).catch(function () { status(T(&amp;quot;Das Senden hat nicht geklappt. Bitte versuche es später noch einmal oder schreibe direkt an &amp;quot; + MAIL_TO + &amp;quot;.&amp;quot;, &amp;quot;Sending failed. Please try again later or write directly to &amp;quot; + MAIL_TO + &amp;quot;.&amp;quot;), false); });&lt;br /&gt;
  } else {&lt;br /&gt;
    window.location.href = &amp;quot;mailto:&amp;quot; + MAIL_TO + &amp;quot;?cc=&amp;quot; + encodeURIComponent(mail) + AMP + &amp;quot;subject=&amp;quot; + encodeURIComponent(T(MAIL_SUBJECT, MAIL_SUBJECT_EN)) + AMP + &amp;quot;body=&amp;quot; + encodeURIComponent(text);&lt;br /&gt;
    status(T(&amp;quot;Dein E-Mail-Programm wurde mit der fertigen Anfrage geöffnet. Bitte dort noch auf Senden klicken.&amp;quot;, &amp;quot;Your email program was opened with the finished request. Please click Send there.&amp;quot;), true);&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
$(&amp;quot;nvk-reset&amp;quot;).addEventListener(&amp;quot;click&amp;quot;, function () { sel = {}; picked = {}; chosenRadio = null; update(); });&lt;br /&gt;
function renderLegal() {&lt;br /&gt;
  var le = $(&amp;quot;nvk-legal-links&amp;quot;), dl = $(&amp;quot;nvk-dslink&amp;quot;), first = true;&lt;br /&gt;
  le.innerHTML = &amp;quot;&amp;quot;; dl.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
  [ [&amp;quot;agb&amp;quot;, T(&amp;quot;AGB&amp;quot;, &amp;quot;Terms and conditions&amp;quot;)], [&amp;quot;widerruf&amp;quot;, T(&amp;quot;Widerrufsbelehrung&amp;quot;, &amp;quot;Right of withdrawal&amp;quot;)], [&amp;quot;datenschutz&amp;quot;, T(&amp;quot;Datenschutzerklärung&amp;quot;, &amp;quot;Privacy policy&amp;quot;)] ].forEach(function (x) {&lt;br /&gt;
    var key = x[0], url = LANG === &amp;quot;en&amp;quot; ? (LEGAL_EN[key] || LEGAL[key]) : LEGAL[key];&lt;br /&gt;
    if (!url) return;&lt;br /&gt;
    if (!first) le.appendChild(document.createTextNode(&amp;quot; | &amp;quot;));&lt;br /&gt;
    first = false; le.appendChild(link(url, x[1]));&lt;br /&gt;
    if (key === &amp;quot;datenschutz&amp;quot;) {&lt;br /&gt;
      dl.appendChild(document.createTextNode(&amp;quot; (&amp;quot;)); dl.appendChild(link(url, x[1])); dl.appendChild(document.createTextNode(&amp;quot;)&amp;quot;));&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
function applyStatic() {&lt;br /&gt;
  Array.prototype.forEach.call(document.querySelectorAll(&amp;quot;#nvk [data-en]&amp;quot;), function (e) {&lt;br /&gt;
    if (e.getAttribute(&amp;quot;data-de&amp;quot;) === null) e.setAttribute(&amp;quot;data-de&amp;quot;, e.textContent);&lt;br /&gt;
    e.textContent = LANG === &amp;quot;en&amp;quot; ? e.getAttribute(&amp;quot;data-en&amp;quot;) : e.getAttribute(&amp;quot;data-de&amp;quot;);&lt;br /&gt;
  });&lt;br /&gt;
  Array.prototype.forEach.call(document.querySelectorAll(&amp;quot;#nvk [data-en-ph]&amp;quot;), function (e) {&lt;br /&gt;
    if (e.getAttribute(&amp;quot;data-de-ph&amp;quot;) === null) e.setAttribute(&amp;quot;data-de-ph&amp;quot;, e.placeholder);&lt;br /&gt;
    e.placeholder = LANG === &amp;quot;en&amp;quot; ? e.getAttribute(&amp;quot;data-en-ph&amp;quot;) : e.getAttribute(&amp;quot;data-de-ph&amp;quot;);&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
function markLang() {&lt;br /&gt;
  [&amp;quot;de&amp;quot;, &amp;quot;en&amp;quot;].forEach(function (l) {&lt;br /&gt;
    var b = $(&amp;quot;nvk-lang-&amp;quot; + l);&lt;br /&gt;
    b.style.fontWeight = LANG === l ? &amp;quot;700&amp;quot; : &amp;quot;400&amp;quot;;&lt;br /&gt;
    b.style.borderColor = LANG === l ? &amp;quot;#f26522&amp;quot; : &amp;quot;#a2a9b1&amp;quot;;&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
function setLang(l) {&lt;br /&gt;
  LANG = l;&lt;br /&gt;
  try { localStorage.setItem(&amp;quot;nvk-lang&amp;quot;, l); } catch (e) { }&lt;br /&gt;
  markLang(); applyStatic(); renderLegal(); capText(); update();&lt;br /&gt;
}&lt;br /&gt;
[&amp;quot;de&amp;quot;, &amp;quot;en&amp;quot;].forEach(function (l) {&lt;br /&gt;
  var b = document.createElement(&amp;quot;button&amp;quot;); b.type = &amp;quot;button&amp;quot;; b.className = &amp;quot;nvk-btn&amp;quot;; b.id = &amp;quot;nvk-lang-&amp;quot; + l;&lt;br /&gt;
  b.textContent = l.toUpperCase(); b.style.marginLeft = &amp;quot;6px&amp;quot;; b.style.padding = &amp;quot;3px 12px&amp;quot;;&lt;br /&gt;
  b.addEventListener(&amp;quot;click&amp;quot;, function () { setLang(l); });&lt;br /&gt;
  $(&amp;quot;nvk-lang&amp;quot;).appendChild(b);&lt;br /&gt;
});&lt;br /&gt;
(function () {&lt;br /&gt;
  var m = location.search.match(/[?\x26](?:uselang|lang)=(\w+)/), l = m ? m[1].toLowerCase() : &amp;quot;&amp;quot;;&lt;br /&gt;
  if (!l) { try { l = localStorage.getItem(&amp;quot;nvk-lang&amp;quot;) || &amp;quot;&amp;quot;; } catch (e) { l = &amp;quot;&amp;quot;; } }&lt;br /&gt;
  if (l === &amp;quot;en&amp;quot; || l === &amp;quot;de&amp;quot;) LANG = l;&lt;br /&gt;
})();&lt;br /&gt;
markLang(); applyStatic(); renderLegal();&lt;br /&gt;
newCaptcha();&lt;br /&gt;
update();&lt;br /&gt;
})();&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;Stand: 21.10.2026&amp;lt;/small&amp;gt;&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andre</name></author>
	</entry>
	<entry>
		<id>https://xtrons.ibus-app.de/index.php?title=Android_Radio_Konfigurator&amp;diff=4095</id>
		<title>Android Radio Konfigurator</title>
		<link rel="alternate" type="text/html" href="https://xtrons.ibus-app.de/index.php?title=Android_Radio_Konfigurator&amp;diff=4095"/>
		<updated>2026-10-23T11:42:33Z</updated>

		<summary type="html">&lt;p&gt;Andre: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt; '''Mit diesem Tool kann auf Basis von Fahrzeug und vorhandenen Komponenten eine Liste nötiger Komponenten erstellt werden.&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;big&amp;gt;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.&amp;lt;br&amp;gt;'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
#nvk{max-width:900px;line-height:1.45}&lt;br /&gt;
#nvk *{box-sizing:border-box}&lt;br /&gt;
#nvk .nvk-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:14px;margin:12px 0}&lt;br /&gt;
#nvk .nvk-f label{display:block;font-weight:700;margin-bottom:4px}&lt;br /&gt;
#nvk select{width:100%;padding:9px 8px;font:inherit;color:#202122;background:#fff;border:1px solid #a2a9b1;border-radius:4px}&lt;br /&gt;
#nvk .nvk-help{font-size:.85em;opacity:.75;margin-top:3px}&lt;br /&gt;
#nvk fieldset{border:1px solid rgba(128,128,128,.45);border-radius:6px;padding:10px 14px;margin:14px 0}&lt;br /&gt;
#nvk legend{font-weight:700;padding:0 6px}&lt;br /&gt;
#nvk .nvk-o{display:block;padding:4px 0;cursor:pointer}&lt;br /&gt;
#nvk .nvk-o small{opacity:.7}&lt;br /&gt;
#nvk .nvk-o.dis{opacity:.75;cursor:default}&lt;br /&gt;
#nvk .nvk-btn{padding:7px 14px;font:inherit;border:1px solid #a2a9b1;border-radius:4px;background:#f8f9fa;color:#202122;cursor:pointer}&lt;br /&gt;
#nvk #nvk-out{margin-top:18px}&lt;br /&gt;
#nvk h3{margin:18px 0 8px}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-card.opt{border-left-color:#14866d}&lt;br /&gt;
#nvk .nvk-card.rad{border-left-color:#fff;background:rgba(255,255,255,.08)}&lt;br /&gt;
#nvk .nvk-card b{display:block}&lt;br /&gt;
#nvk .nvk-links{margin-top:4px;font-weight:600}&lt;br /&gt;
#nvk .nvk-links a{margin-right:14px}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-miss{opacity:.8;font-style:italic}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-card .nvk-img{max-width:230px;max-height:150px}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-card.hl{border:2px solid #36c;border-left-width:8px;background:rgba(51,102,204,.12);padding:12px 14px}&lt;br /&gt;
#nvk .nvk-card.hl b{font-size:1.1em}&lt;br /&gt;
#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)}&lt;br /&gt;
#nvk .nvk-row label{flex:1;margin:0;min-width:240px}&lt;br /&gt;
#nvk .nvk-row a{white-space:nowrap;font-weight:600}&lt;br /&gt;
#nvk .nvk-img.wide{max-width:min(100%,460px);max-height:none}&lt;br /&gt;
#nvk #nvk-form{margin-top:22px}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk-lang&amp;quot; style=&amp;quot;text-align:right;margin-bottom:6px&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-grid&amp;quot; id=&amp;quot;nvk-fields&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;fieldset id=&amp;quot;nvk-optset&amp;quot;&amp;gt;&amp;lt;legend data-en=&amp;quot;Additional options&amp;quot;&amp;gt;Zusatzoptionen&amp;lt;/legend&amp;gt;&amp;lt;div id=&amp;quot;nvk-opts&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/fieldset&amp;gt;&lt;br /&gt;
&amp;lt;button type=&amp;quot;button&amp;quot; class=&amp;quot;nvk-btn&amp;quot; id=&amp;quot;nvk-reset&amp;quot; data-en=&amp;quot;Reset selection&amp;quot;&amp;gt;Auswahl zurücksetzen&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk-out&amp;quot; aria-live=&amp;quot;polite&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;fieldset id=&amp;quot;nvk-form&amp;quot; style=&amp;quot;display:none&amp;quot;&amp;gt;&amp;lt;legend data-en=&amp;quot;Send request&amp;quot;&amp;gt;Anfrage senden&amp;lt;/legend&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;nvk-help&amp;quot; data-en=&amp;quot;Your selection and the list above are sent automatically. All fields marked * are required.&amp;quot;&amp;gt;Deine Auswahl und die Liste oben werden automatisch mitgesendet. Alle Felder mit * sind Pflicht.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-grid&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-name&amp;quot;&amp;gt;Name *&amp;lt;/label&amp;gt;&amp;lt;input id=&amp;quot;nvk-name&amp;quot; type=&amp;quot;text&amp;quot; autocomplete=&amp;quot;name&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-mail&amp;quot; data-en=&amp;quot;Email *&amp;quot;&amp;gt;E-Mail *&amp;lt;/label&amp;gt;&amp;lt;input id=&amp;quot;nvk-mail&amp;quot; type=&amp;quot;email&amp;quot; autocomplete=&amp;quot;email&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-size&amp;quot; data-en=&amp;quot;Desired display size (optional)&amp;quot;&amp;gt;Gewünschte Displaygröße (optional)&amp;lt;/label&amp;gt;&amp;lt;select id=&amp;quot;nvk-size&amp;quot;&amp;gt;&amp;lt;option value=&amp;quot;&amp;quot; data-en=&amp;quot;No preference / advice wanted&amp;quot;&amp;gt;Keine Angabe / Beratung gewünscht&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;7&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;8.8&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;9&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;10.25&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;12.3&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;14.9&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option data-en=&amp;quot;Other size (please state in comment)&amp;quot;&amp;gt;Andere Größe (bitte im Kommentar nennen)&amp;lt;/option&amp;gt;&amp;lt;/select&amp;gt;&amp;lt;div class=&amp;quot;nvk-help&amp;quot; data-en=&amp;quot;Diagonal in inches. Not every size is available for every model - we will check this for you.&amp;quot;&amp;gt;Diagonale in Zoll. Nicht jede Größe gibt es für jede Baureihe, das prüfen wir für Dich.&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-vin&amp;quot; data-en=&amp;quot;VIN (optional)&amp;quot;&amp;gt;VIN oder FGN (optional)&amp;lt;/label&amp;gt;&amp;lt;input id=&amp;quot;nvk-vin&amp;quot; type=&amp;quot;text&amp;quot; maxlength=&amp;quot;17&amp;quot; placeholder=&amp;quot;AB12345 oder 17-stellige FGN&amp;quot; data-en-ph=&amp;quot;AB12345 or full 17-character VIN&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-msg&amp;quot; data-en=&amp;quot;Comment *&amp;quot;&amp;gt;Kommentar *&amp;lt;/label&amp;gt;&amp;lt;textarea id=&amp;quot;nvk-msg&amp;quot; rows=&amp;quot;4&amp;quot;&amp;gt;&amp;lt;/textarea&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot; style=&amp;quot;max-width:300px&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-cap&amp;quot; id=&amp;quot;nvk-capq&amp;quot;&amp;gt;Sicherheitsfrage *&amp;lt;/label&amp;gt;&amp;lt;input id=&amp;quot;nvk-cap&amp;quot; type=&amp;quot;text&amp;quot; inputmode=&amp;quot;numeric&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;input id=&amp;quot;nvk-hp&amp;quot; type=&amp;quot;text&amp;quot; tabindex=&amp;quot;-1&amp;quot; autocomplete=&amp;quot;off&amp;quot; aria-hidden=&amp;quot;true&amp;quot; style=&amp;quot;position:absolute;left:-9999px;width:1px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;label class=&amp;quot;nvk-o&amp;quot;&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; id=&amp;quot;nvk-dsgvo&amp;quot;&amp;gt; &amp;lt;span data-en=&amp;quot;I agree that my details may be processed by email to handle this request.&amp;quot;&amp;gt;Ich stimme zu, dass meine Angaben zur Bearbeitung der Anfrage per E-Mail verarbeitet werden.&amp;lt;/span&amp;gt;&amp;lt;span id=&amp;quot;nvk-dslink&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; *&amp;lt;/label&amp;gt;&lt;br /&gt;
&amp;lt;button type=&amp;quot;button&amp;quot; class=&amp;quot;nvk-btn&amp;quot; id=&amp;quot;nvk-send&amp;quot; data-en=&amp;quot;Send request&amp;quot;&amp;gt;Anfrage senden&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk-status&amp;quot; class=&amp;quot;nvk-note&amp;quot; style=&amp;quot;display:none&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/fieldset&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk-legal&amp;quot; class=&amp;quot;nvk-help&amp;quot; style=&amp;quot;margin-top:20px&amp;quot;&amp;gt;&amp;lt;b data-en=&amp;quot;Note:&amp;quot;&amp;gt;Hinweis:&amp;lt;/b&amp;gt; &amp;lt;span data-en=&amp;quot;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.&amp;quot;&amp;gt;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.&amp;lt;/span&amp;gt;&amp;lt;div id=&amp;quot;nvk-legal-links&amp;quot; style=&amp;quot;margin-top:4px&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;noscript&amp;gt;Für den Konfigurator wird JavaScript benötigt. / JavaScript is required for the configurator.&amp;lt;/noscript&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
(function () {&lt;br /&gt;
&amp;quot;use strict&amp;quot;;&lt;br /&gt;
/* =====================================================================&lt;br /&gt;
   KONFIGURATION - hier wird gepflegt.&lt;br /&gt;
   Textformat in Hinweisen: [b]fett[/b]  [br] Zeilenumbruch  [a=URL]Linktext[/a]&lt;br /&gt;
   Bitte im Skript KEIN kaufmännisches Und, kein Kleiner-/Größer-Zeichen&lt;br /&gt;
   und keine Leerzeilen verwenden (das Wiki wandelt sie um).&lt;br /&gt;
   ===================================================================== */&lt;br /&gt;
var SHOP = &amp;quot;https://shop.ibus-app.de/&amp;quot;;&lt;br /&gt;
var WIKI = &amp;quot;https://wiki.ibus-app.de/index.php?title=&amp;quot;;&lt;br /&gt;
/* Bilder aus dem Wiki (Thumbnail-Adressen; Klick öffnet automatisch das Originalbild) */&lt;br /&gt;
var IM = &amp;quot;https://xtrons.ibus-app.de/images/thumb/&amp;quot;;&lt;br /&gt;
var P = {&lt;br /&gt;
  schema:  IM + &amp;quot;e/ea/BMW_E39_Verl%C3%A4ngerungen_EXL005%2BFAKRA_.png/135px-BMW_E39_Verl%C3%A4ngerungen_EXL005%2BFAKRA_.png&amp;quot;,&lt;br /&gt;
  exl005:  IM + &amp;quot;7/70/Exl005-1.webp/257px-Exl005-1.webp.png&amp;quot;,&lt;br /&gt;
  fakra6m: IM + &amp;quot;d/d8/FM-extension_01_1.png/270px-FM-extension_01_1.png&amp;quot;,&lt;br /&gt;
  isofakra: IM + &amp;quot;4/4e/ISO-FAKRA_1.png/270px-ISO-FAKRA_1.png&amp;quot;,&lt;br /&gt;
  bm24:    IM + &amp;quot;8/82/BM24.png/130px-BM24.png&amp;quot;,&lt;br /&gt;
  iso:     IM + &amp;quot;d/dd/Iso.jpg/69px-Iso.jpg&amp;quot;,&lt;br /&gt;
  bm54:    IM + &amp;quot;3/34/BM54.png/135px-BM54.png&amp;quot;,&lt;br /&gt;
  fakra:   IM + &amp;quot;b/b3/Fakra.jpg/100px-Fakra.jpg&amp;quot;,&lt;br /&gt;
  pfeil:   IM + &amp;quot;e/ee/Navi_E46.jpg/239px-Navi_E46.jpg&amp;quot;,&lt;br /&gt;
  noquad:  IM + &amp;quot;6/68/No_elongation.jpg/180px-No_elongation.jpg&amp;quot;,&lt;br /&gt;
  noexl6:  IM + &amp;quot;7/7b/No_EXL006.jpg/180px-No_EXL006.jpg&amp;quot;,&lt;br /&gt;
  halter:  IM + &amp;quot;3/3b/Halter_Alu.webp/92px-Halter_Alu.webp.png&amp;quot;,&lt;br /&gt;
  deepobd: &amp;quot;https://xtrons.ibus-app.de/images/d/d4/DeepOBD_Interface_1.png&amp;quot;,&lt;br /&gt;
  n43:     IM + &amp;quot;e/e4/Navi4_3.jpg/240px-Navi4_3.jpg&amp;quot;,&lt;br /&gt;
  n169:    IM + &amp;quot;8/8a/Navi16_9.jpg/240px-Navi16_9.jpg&amp;quot;,&lt;br /&gt;
  radio:   IM + &amp;quot;9/96/E39_Radio.jpg/240px-E39_Radio.jpg&amp;quot;,&lt;br /&gt;
  idrive:  &amp;quot;https://xtrons.ibus-app.de/images/0/02/MASK-CCC-CIC-NBT-EVO-iDrive.jpg&amp;quot;,&lt;br /&gt;
  iris:    &amp;quot;https://xtrons.ibus-app.de/images/b/be/BusinessKas_IRISG.jpg&amp;quot;,&lt;br /&gt;
  resler:  &amp;quot;https://xtrons.ibus-app.de/images/d/d1/Resler_Modul_01.png&amp;quot;,&lt;br /&gt;
  can:     &amp;quot;https://xtrons.ibus-app.de/images/6/69/CAN_Interface.png&amp;quot;,&lt;br /&gt;
  funktr:  IM + &amp;quot;7/7e/E46_Funktionstraeger.png/240px-E46_Funktionstraeger.png&amp;quot;&lt;br /&gt;
};&lt;br /&gt;
/* Anfrage-Formular: MAIL_TO = Empfänger. SEND_URL leer = E-Mail-Programm des Kunden öffnen (mailto).&lt;br /&gt;
   SEND_URL = Adresse des Server-Skripts send-anfrage.php = Versand direkt vom Server (mit CC an den Kunden). */&lt;br /&gt;
var MAIL_TO = &amp;quot;info@ibus-app.de&amp;quot;;&lt;br /&gt;
var MAIL_SUBJECT = &amp;quot;Anfrage aus Android Radio Konfigurator&amp;quot;;&lt;br /&gt;
var SEND_URL = &amp;quot;https://xtrons.ibus-app.de/send-anfrage.php&amp;quot;;&lt;br /&gt;
/* Shop-Anbindung: API = radios.php (liefert Radio-Liste und Artikelnummern). Warenkorb = Shopware-Link pro Artikelnummer. */&lt;br /&gt;
var API = &amp;quot;https://xtrons.ibus-app.de/radios.php&amp;quot;;&lt;br /&gt;
/* 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. */&lt;br /&gt;
var CART_TRANSFER = true;&lt;br /&gt;
/* Ziel der Übergabe: Shop-Controller aus Plugin 1.1.0 (serverseitig, unabhängig vom Browser-Cache).&lt;br /&gt;
   Älterer Weg über das Theme-Skript: var TRANSFER_URL = CART + &amp;quot;?nvk=&amp;quot;;  */&lt;br /&gt;
var TRANSFER_URL = &amp;quot;https://shop.ibus-app.de/nvk?add=&amp;quot;;&lt;br /&gt;
/* ---- Sprache / English ----------------------------------------------------&lt;br /&gt;
   DEFAULT_LANG: de oder en. Umschalten per Knopf DE/EN oder per Adresse ?uselang=en                     */&lt;br /&gt;
var DEFAULT_LANG = &amp;quot;de&amp;quot;;&lt;br /&gt;
var SHOP_EN = &amp;quot;https://shop.ibus-app.de/en/&amp;quot;;&lt;br /&gt;
var TRANSFER_URL_EN = SHOP_EN + &amp;quot;nvk?add=&amp;quot;;&lt;br /&gt;
var MAIL_SUBJECT_EN = &amp;quot;Request from Android Radio Configurator&amp;quot;;&lt;br /&gt;
/* Rechtliche Seiten EN (fehlt ein Eintrag, wird der deutsche Link genommen) */&lt;br /&gt;
var LEGAL_EN = { agb: SHOP_EN + &amp;quot;general-terms-and-conditions&amp;quot;, widerruf: SHOP_EN + &amp;quot;revocation-right&amp;quot;, datenschutz: SHOP_EN + &amp;quot;privacy-policy&amp;quot; };&lt;br /&gt;
var CART = &amp;quot;https://shop.ibus-app.de/checkout/cart&amp;quot;;&lt;br /&gt;
/* Rechtliche Seiten (Links unter dem Konfigurator und beim Datenschutz-Haken). Leer = Link wird nicht angezeigt. */&lt;br /&gt;
var LEGAL = { agb: &amp;quot;https://shop.ibus-app.de/allgemeine-geschaeftsbedingungen&amp;quot;, widerruf: &amp;quot;https://shop.ibus-app.de/widerrufsrecht&amp;quot;, datenschutz: &amp;quot;https://shop.ibus-app.de/datenschutz&amp;quot; };&lt;br /&gt;
/* ---- 1) Baureihen --------------------------------------------------------&lt;br /&gt;
   v = Shop-Kategorie (Link: SHOP + bmw-radios/ + v + /)&lt;br /&gt;
   gen: alt = I-BUS-Fahrzeuge (E38/E39/E46/E53/E83)&lt;br /&gt;
        b   = M-ASK / CCC / CIC     c = CIC / NBT / NBT EVO&lt;br /&gt;
   body = Karosserieformen (siehe BODY)                                      */&lt;br /&gt;
var BODY = { limo: &amp;quot;Limousine&amp;quot;, touring: &amp;quot;Touring&amp;quot;, coupe: &amp;quot;Coupé&amp;quot;, cabrio: &amp;quot;Cabrio&amp;quot;, schraeg: &amp;quot;Schrägheck&amp;quot;,&lt;br /&gt;
  compact: &amp;quot;Compact&amp;quot;, gt: &amp;quot;Gran Turismo&amp;quot;, gc: &amp;quot;Gran Coupé&amp;quot;, suv: &amp;quot;SUV / SAV&amp;quot;, roadster: &amp;quot;Roadster&amp;quot; };&lt;br /&gt;
var BODY_EN = { limo: &amp;quot;Sedan&amp;quot;, touring: &amp;quot;Touring (wagon)&amp;quot;, coupe: &amp;quot;Coupe&amp;quot;, cabrio: &amp;quot;Convertible&amp;quot;, schraeg: &amp;quot;Hatchback&amp;quot;,&lt;br /&gt;
  compact: &amp;quot;Compact&amp;quot;, gt: &amp;quot;Gran Turismo&amp;quot;, gc: &amp;quot;Gran Coupe&amp;quot;, suv: &amp;quot;SUV / SAV&amp;quot;, roadster: &amp;quot;Roadster&amp;quot; };&lt;br /&gt;
function vname(x) { return LANG === &amp;quot;en&amp;quot; ? x.t.replace(/^(\d)er /, &amp;quot;$1 Series &amp;quot;) : x.t; }&lt;br /&gt;
function enSlug(v) { return v.replace(/^(\d)er-/, &amp;quot;$1-series-&amp;quot;); }&lt;br /&gt;
var VEHICLES = [&lt;br /&gt;
  { v: &amp;quot;1er-e8x&amp;quot;, t: &amp;quot;1er E8x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;schraeg,coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;1er-f2x&amp;quot;, t: &amp;quot;1er F2x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;schraeg&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;2er-f2x&amp;quot;, t: &amp;quot;2er F2x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;3er-e46&amp;quot;, t: &amp;quot;3er E46&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;limo,touring,coupe,cabrio,compact&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;3er-e9x&amp;quot;, t: &amp;quot;3er E9x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;limo,touring,coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;3er-f3x&amp;quot;, t: &amp;quot;3er F3x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;limo,touring,gt&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;4er-f3x&amp;quot;, t: &amp;quot;4er F3x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;coupe,cabrio,gc&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;5er-e39&amp;quot;, t: &amp;quot;5er E39&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;limo,touring&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;5er-e6x&amp;quot;, t: &amp;quot;5er E6x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;limo,touring&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;5er-f1x&amp;quot;, t: &amp;quot;5er F1x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;limo,touring,gt&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;6er-e6x&amp;quot;, t: &amp;quot;6er E6x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;7er-e38&amp;quot;, t: &amp;quot;7er E38&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;limo&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;7er-e65&amp;quot;, t: &amp;quot;7er E65&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;limo&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;7er-f01&amp;quot;, t: &amp;quot;7er F01&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;limo&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x1-e84&amp;quot;, t: &amp;quot;X1 E84&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x1-f48&amp;quot;, t: &amp;quot;X1 F48&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x3-e83&amp;quot;, t: &amp;quot;X3 E83&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x3-f25&amp;quot;, t: &amp;quot;X3 F25&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x5-e53&amp;quot;, t: &amp;quot;X5 E53&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x5-e70&amp;quot;, t: &amp;quot;X5 E70&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x5-f15&amp;quot;, t: &amp;quot;X5 F15&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x6-e71&amp;quot;, t: &amp;quot;X6 E71&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;z4-e85e86&amp;quot;, t: &amp;quot;Z4 E85/E86&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;roadster,coupe&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;z4-e89&amp;quot;, t: &amp;quot;Z4 E89&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;roadster&amp;quot;, noCat: true }&lt;br /&gt;
];&lt;br /&gt;
/* Fahrzeuge mit K-CAN App (Beta) */&lt;br /&gt;
var KCAN = [&amp;quot;1er-e8x&amp;quot;, &amp;quot;3er-e9x&amp;quot;, &amp;quot;5er-e6x&amp;quot;, &amp;quot;6er-e6x&amp;quot;, &amp;quot;7er-e65&amp;quot;, &amp;quot;x1-e84&amp;quot;, &amp;quot;x5-e70&amp;quot;, &amp;quot;x6-e71&amp;quot;, &amp;quot;z4-e89&amp;quot;];&lt;br /&gt;
var bodyValues = Object.keys(BODY).map(function (k) {&lt;br /&gt;
  return { v: k, t: BODY[k], t_en: BODY_EN[k], only: { vehicle: VEHICLES.filter(function (x) { return x.body.split(&amp;quot;,&amp;quot;).indexOf(k) !== -1; }).map(function (x) { return x.v; }) } };&lt;br /&gt;
});&lt;br /&gt;
/* ---- 2) Auswahlfelder ------------------------------------------------------&lt;br /&gt;
   only = Wert nur anbieten, wenn Bedingung passt   show = Feld nur dann zeigen&lt;br /&gt;
   optional = muss nicht gewählt werden             auto = bei nur einem Wert vorwählen */&lt;br /&gt;
var FIELDS = [&lt;br /&gt;
  { id: &amp;quot;vehicle&amp;quot;, label: &amp;quot;Fahrzeug&amp;quot;, label_en: &amp;quot;Vehicle&amp;quot;, values: VEHICLES.map(function (x) { return { v: x.v, t: &amp;quot;BMW &amp;quot; + x.t, t_en: &amp;quot;BMW &amp;quot; + x.t.replace(/^(\d)er /, &amp;quot;$1 Series &amp;quot;) }; }) },&lt;br /&gt;
  { id: &amp;quot;factory&amp;quot;, label: &amp;quot;Verbaut ab Werk&amp;quot;, label_en: &amp;quot;Factory-fitted system&amp;quot;,&lt;br /&gt;
    pre: { when: { gen: [&amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;] }, html: &amp;quot;[b]So erkennst Du Dein System:[/b][br][imgw=&amp;quot; + P.idrive + &amp;quot;]&amp;quot;, html_en: &amp;quot;[b]How to identify your system:[/b][br][imgw=&amp;quot; + P.idrive + &amp;quot;]&amp;quot; }, values: [&lt;br /&gt;
    { v: &amp;quot;iris&amp;quot;,  t: &amp;quot;Radio mit IRIS&amp;quot;, t_en: &amp;quot;Radio with IRIS&amp;quot;, only: { vehicle: [&amp;quot;3er-e46&amp;quot;, &amp;quot;5er-e39&amp;quot;, &amp;quot;7er-e38&amp;quot;, &amp;quot;x5-e53&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.iris + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;mid&amp;quot;,   t: &amp;quot;Radio mit MID&amp;quot;,  t_en: &amp;quot;Radio with MID&amp;quot;, only: { gen: [&amp;quot;alt&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.radio + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;n43&amp;quot;,   t: &amp;quot;4:3 Navi&amp;quot;,       t_en: &amp;quot;4:3 navi&amp;quot;, only: { vehicle: [&amp;quot;5er-e39&amp;quot;, &amp;quot;7er-e38&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.n43 + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;n169&amp;quot;,  t: &amp;quot;16:9 Navi&amp;quot;,      t_en: &amp;quot;16:9 navi&amp;quot;, only: { gen: [&amp;quot;alt&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.n169 + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;pfeil&amp;quot;, t: &amp;quot;Pfeilnavi&amp;quot;,      t_en: &amp;quot;Arrow navi&amp;quot;, only: { vehicle: [&amp;quot;3er-e46&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.pfeil + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;mask&amp;quot;,  t: &amp;quot;M-ASK&amp;quot;,          only: { gen: [&amp;quot;b&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;ccc&amp;quot;,   t: &amp;quot;CCC&amp;quot;,            only: { gen: [&amp;quot;b&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;cic&amp;quot;,   t: &amp;quot;CIC&amp;quot;,            only: { gen: [&amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;nbt&amp;quot;,   t: &amp;quot;NBT&amp;quot;,            only: { gen: [&amp;quot;c&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;nbtevo&amp;quot;, t: &amp;quot;NBT EVO&amp;quot;,       only: { gen: [&amp;quot;c&amp;quot;] } } ] },&lt;br /&gt;
  { id: &amp;quot;trunk&amp;quot;, label: &amp;quot;Wo sitzt das Radiomodul des Pfeilnavis?&amp;quot;, label_en: &amp;quot;Where is the radio module of the arrow navi?&amp;quot;, optional: true, show: { factory: [&amp;quot;pfeil&amp;quot;] },&lt;br /&gt;
    help: &amp;quot;Bitte prüfen: Sitzt das Modul im Kofferraum, oder im Pfeilnavi selbst (Quadlock hinten neben dem Antennenstecker)?[br][img=&amp;quot; + P.pfeil + &amp;quot;]&amp;quot;,&lt;br /&gt;
    help_en: &amp;quot;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=&amp;quot; + P.pfeil + &amp;quot;]&amp;quot;,&lt;br /&gt;
    values: [&lt;br /&gt;
    { v: &amp;quot;ja&amp;quot;, t: &amp;quot;Im Kofferraum (Verlängerungen nötig)&amp;quot;, t_en: &amp;quot;In the trunk (extensions required)&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;nein&amp;quot;, t: &amp;quot;Im Pfeilnavi, Quadlock hinten (keine Verlängerung)&amp;quot;, t_en: &amp;quot;In the arrow navi, Quadlock at the back (no extension)&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;unk&amp;quot;, t: &amp;quot;Weiß ich nicht&amp;quot;, t_en: &amp;quot;I don't know&amp;quot; } ] },&lt;br /&gt;
  { id: &amp;quot;aux&amp;quot;, label: &amp;quot;AUX-IN verfügbar?&amp;quot;, label_en: &amp;quot;AUX-IN available?&amp;quot;, show: { gen: [&amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;] }, values: [&lt;br /&gt;
    { v: &amp;quot;ja&amp;quot;, t: &amp;quot;Ja&amp;quot;, t_en: &amp;quot;Yes&amp;quot; }, { v: &amp;quot;nein&amp;quot;, t: &amp;quot;Nein&amp;quot;, t_en: &amp;quot;No&amp;quot; } ] },&lt;br /&gt;
  { id: &amp;quot;sound&amp;quot;, label: &amp;quot;Soundsystem&amp;quot;, label_en: &amp;quot;Sound system&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;stereo&amp;quot;, t: &amp;quot;Stereo&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;hifi&amp;quot;,   t: &amp;quot;Hifi&amp;quot;, t_en: &amp;quot;Hi-Fi&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;dsp&amp;quot;,    t: &amp;quot;DSP&amp;quot;, only: { vehicle: [&amp;quot;7er-e38&amp;quot;, &amp;quot;5er-e39&amp;quot;, &amp;quot;x5-e53&amp;quot;, &amp;quot;x3-e83&amp;quot;] }, info: &amp;quot;[a=&amp;quot; + WIKI + &amp;quot;Habe_ich_DSP%3F]Habe ich DSP?[/a]&amp;quot;, info_en: &amp;quot;[a=&amp;quot; + WIKI + &amp;quot;Habe_ich_DSP%3F]Do I have DSP?[/a]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;hk&amp;quot;,     t: &amp;quot;Harman Kardon&amp;quot;, only: { vehicle: [&amp;quot;3er-e46&amp;quot;, &amp;quot;z4-e85e86&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;logic7&amp;quot;, t: &amp;quot;Logic7&amp;quot;, only: { vehicle: [&amp;quot;3er-e9x&amp;quot;, &amp;quot;5er-e6x&amp;quot;, &amp;quot;6er-e6x&amp;quot;, &amp;quot;7er-e65&amp;quot;, &amp;quot;1er-e8x&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;hksur&amp;quot;,  t: &amp;quot;Harman Kardon Surround&amp;quot;, only: { vehicle: [&amp;quot;1er-f2x&amp;quot;, &amp;quot;2er-f2x&amp;quot;, &amp;quot;3er-f3x&amp;quot;, &amp;quot;4er-f3x&amp;quot;, &amp;quot;5er-f1x&amp;quot;] } } ] },&lt;br /&gt;
  { id: &amp;quot;current&amp;quot;, label: &amp;quot;Aktuell verbaut&amp;quot;, label_en: &amp;quot;Currently installed&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;werk&amp;quot;, t: &amp;quot;Werksradio / Werksnavi&amp;quot;, t_en: &amp;quot;Factory radio / factory navi&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;nach&amp;quot;, t: &amp;quot;Nachrüst-Radio / -Navi&amp;quot;, t_en: &amp;quot;Aftermarket radio / navi&amp;quot; } ] },&lt;br /&gt;
  { id: &amp;quot;body&amp;quot;, label: &amp;quot;Karosserie&amp;quot;, label_en: &amp;quot;Body type&amp;quot;, auto: true, values: bodyValues },&lt;br /&gt;
  { id: &amp;quot;ant&amp;quot;, label: &amp;quot;Antennenstecker am Radio (optional)&amp;quot;, label_en: &amp;quot;Antenna connector on the radio (optional)&amp;quot;, optional: true, def: &amp;quot;unk&amp;quot;,&lt;br /&gt;
    show: { vehicle: [&amp;quot;7er-e38&amp;quot;, &amp;quot;5er-e39&amp;quot;, &amp;quot;3er-e46&amp;quot;, &amp;quot;x5-e53&amp;quot;] },&lt;br /&gt;
    values: [&lt;br /&gt;
    { v: &amp;quot;unk&amp;quot;,   t: &amp;quot;Weiß ich nicht&amp;quot;, t_en: &amp;quot;I don't know&amp;quot;,&lt;br /&gt;
      info: &amp;quot;[b]BM24[/b] (Rundpin) = ISO-Antennenstecker:[br][img=&amp;quot; + P.bm24 + &amp;quot;][img=&amp;quot; + P.iso + &amp;quot;][br][b]BM54[/b] = FAKRA:[br][img=&amp;quot; + P.bm54 + &amp;quot;][img=&amp;quot; + P.fakra + &amp;quot;]&amp;quot;,&lt;br /&gt;
      info_en: &amp;quot;[b]BM24[/b] (round pin) = ISO antenna connector:[br][img=&amp;quot; + P.bm24 + &amp;quot;][img=&amp;quot; + P.iso + &amp;quot;][br][b]BM54[/b] = FAKRA:[br][img=&amp;quot; + P.bm54 + &amp;quot;][img=&amp;quot; + P.fakra + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;iso&amp;quot;,   t: &amp;quot;ISO (BM24, Rundpin)&amp;quot;, t_en: &amp;quot;ISO (BM24, round pin)&amp;quot;, info: &amp;quot;[img=&amp;quot; + P.bm24 + &amp;quot;][img=&amp;quot; + P.iso + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;fakra&amp;quot;, t: &amp;quot;FAKRA (BM54)&amp;quot;, info: &amp;quot;[img=&amp;quot; + P.bm54 + &amp;quot;][img=&amp;quot; + P.fakra + &amp;quot;]&amp;quot; } ] }&lt;br /&gt;
];&lt;br /&gt;
/* ---- 3) Zusatzoptionen (Mehrfachauswahl) ---------------------------------&lt;br /&gt;
   show = nur sichtbar wenn Bedingung passt   requires = nur sichtbar wenn diese Optionen gewählt sind&lt;br /&gt;
   excl = Optionen derselben Gruppe schließen sich aus   items = Artikel aus ITEMS&lt;br /&gt;
   Englisch: Felder mit Endung _en (t_en, sub_en, ...). Fehlt ein _en-Feld, wird der deutsche Text gezeigt. */&lt;br /&gt;
var OPTS = [&lt;br /&gt;
  { id: &amp;quot;halter&amp;quot;,  t: &amp;quot;Radio-Halter&amp;quot;, t_en: &amp;quot;Radio holder&amp;quot;, sub: &amp;quot;nur BMW E39&amp;quot;, sub_en: &amp;quot;BMW E39 only&amp;quot;, show: { vehicle: [&amp;quot;5er-e39&amp;quot;] }, items: [&amp;quot;halter&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;ibus&amp;quot;,    t: &amp;quot;I-BUS App&amp;quot;, show: { gen: [&amp;quot;alt&amp;quot;] }, items: [&amp;quot;ibus&amp;quot;, &amp;quot;resler&amp;quot;, &amp;quot;bclic&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;deepobd&amp;quot;, t: &amp;quot;DeepOBD (Diagnose)&amp;quot;, t_en: &amp;quot;DeepOBD (diagnostics)&amp;quot;, items: [&amp;quot;deepobd&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;can&amp;quot;,     t: &amp;quot;CAN Interface&amp;quot;, sub: &amp;quot;Addon - nur mit I-BUS App&amp;quot;, sub_en: &amp;quot;Add-on - only with I-BUS App&amp;quot;, show: { gen: [&amp;quot;alt&amp;quot;] }, requires: [&amp;quot;ibus&amp;quot;], items: [&amp;quot;can&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;kcan&amp;quot;,    t: &amp;quot;K-CAN App (Beta)&amp;quot;, sub: &amp;quot;Pendant zur I-BUS App&amp;quot;, sub_en: &amp;quot;Counterpart to the I-BUS App&amp;quot;, show: { vehicle: KCAN }, items: [&amp;quot;kcan&amp;quot;, &amp;quot;kcanlic&amp;quot;, &amp;quot;can&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;tpms&amp;quot;,    t: &amp;quot;TPMS (Reifendruck)&amp;quot;, t_en: &amp;quot;TPMS (tire pressure)&amp;quot;, items: [&amp;quot;tpms&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;dab1&amp;quot;,    t: &amp;quot;DAB+ (Single Receiver)&amp;quot;, excl: &amp;quot;dab&amp;quot;, items: [&amp;quot;dab1&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;dab2&amp;quot;,    t: &amp;quot;DAB+ (Dual Receiver)&amp;quot;,   excl: &amp;quot;dab&amp;quot;, items: [&amp;quot;dab2&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;rcam&amp;quot;,    t: &amp;quot;Rückfahrkamera&amp;quot;, t_en: &amp;quot;Rear-view camera&amp;quot;, items: [&amp;quot;rcam&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;fcam&amp;quot;,    t: &amp;quot;Front-Kamera&amp;quot;, t_en: &amp;quot;Front camera&amp;quot;, items: [&amp;quot;fcam&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;tool&amp;quot;,    t: &amp;quot;Einbau-Werkzeug (Kunststoffheber)&amp;quot;, t_en: &amp;quot;Installation tool (plastic pry tool)&amp;quot;, items: [&amp;quot;tool&amp;quot;] }&lt;br /&gt;
];&lt;br /&gt;
/* Erzwungene Optionen (werden automatisch gesetzt und gesperrt) */&lt;br /&gt;
var FORCED = [&lt;br /&gt;
  { when: { sound: [&amp;quot;dsp&amp;quot;] }, opts: [&amp;quot;ibus&amp;quot;], why: &amp;quot;wegen DSP erforderlich&amp;quot;, why_en: &amp;quot;required because of DSP&amp;quot; }&lt;br /&gt;
];&lt;br /&gt;
/* ---- 4) Artikel ------------------------------------------------------------&lt;br /&gt;
   u = Shop-Link DE, ue = Shop-Link EN (leer = wie DE)   ut/wt = Linktexte   w = Wiki-Link   leer = kein Link&lt;br /&gt;
   skipIf = Artikel entfällt, wenn der genannte Artikel schon in der Liste steht&lt;br /&gt;
   Die Lizenzen sind im EN-Shop andere Artikel (BC = OBC): ue zeigt auf den EN-Artikel. */&lt;br /&gt;
var ITEMS = {&lt;br /&gt;
  exl005:  { t: &amp;quot;Verlängerung EXL005&amp;quot;, t_en: &amp;quot;Extension EXL005&amp;quot;, d: &amp;quot;Ersetzt das Radiomodul im Kofferraum.&amp;quot;, d_en: &amp;quot;Replaces the radio module in the trunk.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;detail/index/sArticle/212/&amp;quot;, ue: SHOP_EN + &amp;quot;accessories-for-head-units/adapter-elongations/212/bmw-radio-extension-6-meters-exl005&amp;quot;, img: [P.exl005, P.schema] },&lt;br /&gt;
  fakra6m: { t: &amp;quot;Verlängerung 6 m FAKRA(m) auf FAKRA(f), gewinkelt&amp;quot;, t_en: &amp;quot;Extension 6 m FAKRA(m) to FAKRA(f), angled&amp;quot;,&lt;br /&gt;
             d: &amp;quot;Antennenverlängerung vom Kofferraum nach vorn.&amp;quot;, d_en: &amp;quot;Antenna extension from the trunk to the front.&amp;quot;, img: [P.fakra6m],&lt;br /&gt;
             u: SHOP + &amp;quot;shop/zubehoer/adapterkabel/192/verlaengerung-6m-fakra-m-auf-fakra-f-kurz-gewinkelt&amp;quot;,&lt;br /&gt;
             ue: SHOP_EN + &amp;quot;i-bus-app/accessories/cable-adapters/192/extension-6m-fakra-m-to-fakra-f-short-angled&amp;quot; },&lt;br /&gt;
  isoada:  { t: &amp;quot;Adapter ISO-Stecker auf FAKRA, gewinkelt (15 cm)&amp;quot;, t_en: &amp;quot;Adapter ISO plug to FAKRA, angled (15 cm)&amp;quot;,&lt;br /&gt;
             d: &amp;quot;Nötig bei ISO-Antennenstecker (BM24, Rundpin).&amp;quot;, d_en: &amp;quot;Required with an ISO antenna connector (BM24, round pin).&amp;quot;, img: [P.isofakra],&lt;br /&gt;
             u: SHOP + &amp;quot;shop/zubehoer/adapterkabel/193/adapter-kabel-iso-f-auf-fakra-f-kurz-gewinkelt-15cm&amp;quot;,&lt;br /&gt;
             ue: SHOP_EN + &amp;quot;i-bus-app/accessories/cable-adapters/193/adapter-cable-iso-f-to-fakra-f-short-angled-15cm&amp;quot; },&lt;br /&gt;
  bcdsp:   { t: &amp;quot;I-BUS App - BC+DSP Lizenz&amp;quot;, t_en: &amp;quot;I-BUS App - OBC+DSP License&amp;quot;,&lt;br /&gt;
             d: &amp;quot;Ohne DSP-Lizenz arbeitet das Werks-DSP nicht.&amp;quot;, d_en: &amp;quot;Without the DSP license the factory DSP will not work.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/lizenzen/171/i-bus-app-bc-dsp-lizenz&amp;quot;, ue: SHOP_EN + &amp;quot;i-bus-app/licenses/172/i-bus-app-obc-dsp-license&amp;quot;,&lt;br /&gt;
             w: WIKI + &amp;quot;Habe_ich_DSP%3F&amp;quot;, wt: &amp;quot;Wiki: Habe ich DSP?&amp;quot;, wt_en: &amp;quot;Wiki: Do I have DSP?&amp;quot; },&lt;br /&gt;
  halter:  { t: &amp;quot;Alu-Halter zur Radio-Montage im BMW E39&amp;quot;, t_en: &amp;quot;Alu holder for radio installation in BMW E39&amp;quot;,&lt;br /&gt;
             d: &amp;quot;Empfohlen bei Radios, die nicht von AVIN stammen.&amp;quot;, d_en: &amp;quot;Recommended for radios not made by AVIN.&amp;quot;, img: [P.halter],&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/radiohalter/185/alu-halter-zur-radio-montage-im-bmw-e39&amp;quot;,&lt;br /&gt;
             ue: SHOP_EN + &amp;quot;i-bus-app/accessories/fittings-for-radio/185/fittings-for-radio-in-bmw-e39&amp;quot; },&lt;br /&gt;
  ibus:    { t: &amp;quot;I-BUS App&amp;quot;, hl: true,&lt;br /&gt;
             d: &amp;quot;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.&amp;quot;,&lt;br /&gt;
             d_en: &amp;quot;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.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;cat/index/sCategory/42&amp;quot;, ue: SHOP_EN + &amp;quot;cat/index/sCategory/45&amp;quot;,&lt;br /&gt;
             links: [&lt;br /&gt;
               { u: WIKI + &amp;quot;Was_brauche_ich_um_die_I-BUS_App_nutzen_zu_k%C3%B6nnen%3F&amp;quot;, t: &amp;quot;Wiki: Was brauche ich für die I-BUS App?&amp;quot;, t_en: &amp;quot;Wiki: What do I need for the I-BUS App?&amp;quot;, ue: WIKI + &amp;quot;What_do_I_need_to_use_the_I-BUS_app%3F&amp;quot; },&lt;br /&gt;
               { u: WIKI + &amp;quot;Funktionen&amp;quot;, t: &amp;quot;Liste aller I-BUS App Funktionen (BMW E38|E39|E46|E53|E83)&amp;quot;, t_en: &amp;quot;List of all I-BUS App functions (BMW E38|E39|E46|E53|E83)&amp;quot; },&lt;br /&gt;
               { u: WIKI + &amp;quot;Was_geht_beim_BMW_E46_nicht&amp;quot;, t: &amp;quot;Was geht beim BMW E46, E83, E85,.. nicht? (da werkseitig nicht verbaut)&amp;quot;, t_en: &amp;quot;What does not work on BMW E46, E83, E85,..? (not fitted at the factory)&amp;quot; },&lt;br /&gt;
               { u: WIKI + &amp;quot;Funktionseinschr%C3%A4nkungen_nach_Baujahr/Ausstattung/Modell&amp;quot;, t: &amp;quot;Funktionseinschränkungen nach Baujahr/Ausstattung/Modell&amp;quot;, t_en: &amp;quot;Function restrictions by year / equipment / model&amp;quot; } ] },&lt;br /&gt;
  resler:  { t: &amp;quot;Resler USB I-BUS Modul inkl. Anschlusskabel&amp;quot;, t_en: &amp;quot;Resler USB I-BUS module incl. cable&amp;quot;,&lt;br /&gt;
             d: &amp;quot;Verbindet I-BUS App und Fahrzeug.&amp;quot;, d_en: &amp;quot;Connects the I-BUS App and the vehicle.&amp;quot;, img: [P.resler],&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/interfaces-module/191/resler-usb-i-bus-modul-inkl.-anschlusskabel&amp;quot;,&lt;br /&gt;
             ue: SHOP_EN + &amp;quot;i-bus-app/accessories/interfaces-modules/191/resler-usb-i-bus-module-incl.-cable&amp;quot;,&lt;br /&gt;
             w: &amp;quot;https://wiki.ibus-app.de/index.php?title=Hauptseite#Einbauanleitung_f.C3.BCr_Resler_Modul_und_Resler_Interface&amp;quot;, wt: &amp;quot;Einbauanleitung Resler Modul&amp;quot;, wt_en: &amp;quot;Installation guide Resler module&amp;quot; },&lt;br /&gt;
  bclic:   { t: &amp;quot;I-BUS App - BC Lizenz&amp;quot;, t_en: &amp;quot;I-BUS App - OBC License&amp;quot;, d: &amp;quot;Schaltet u. a. die BC-Daten der App frei.&amp;quot;, d_en: &amp;quot;Unlocks e.g. the OBC data of the app.&amp;quot;, skipIf: &amp;quot;bcdsp&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/lizenzen/167/i-bus-app-bc-lizenz&amp;quot;, ue: SHOP_EN + &amp;quot;i-bus-app/licenses/173/i-bus-app-obc-license&amp;quot; },&lt;br /&gt;
  deepobd: { t: &amp;quot;Deep OBD OBD-II Bluetooth-Adapter&amp;quot;, t_en: &amp;quot;Deep OBD OBD-II Bluetooth adapter&amp;quot;,&lt;br /&gt;
             d: &amp;quot;Live-Werte auslesen, Fehler lesen und löschen.&amp;quot;, d_en: &amp;quot;Read live values, read and clear fault codes.&amp;quot;, img: [P.deepobd],&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/interfaces-module/258/deep-obd-obd-ii-bluetooth-adapter?c=54&amp;quot;,&lt;br /&gt;
             ue: SHOP_EN + &amp;quot;i-bus-app/accessories/interfaces-modules/258/deep-obd-obd-ii-bluetooth-adapter&amp;quot;,&lt;br /&gt;
             w: &amp;quot;https://xtrons.ibus-app.de/index.php?title=DeepOBD_-_Adapter_und_App_einrichten&amp;quot;, wt: &amp;quot;Wiki: DeepOBD einrichten&amp;quot;, wt_en: &amp;quot;Wiki: Setting up DeepOBD&amp;quot; },&lt;br /&gt;
  can:     { t: &amp;quot;CAN-Bus Interface inkl. Anschlusskabel&amp;quot;, t_en: &amp;quot;CAN bus interface incl. connection cable&amp;quot;,&lt;br /&gt;
             d: &amp;quot;Addon, funktioniert nur zusammen mit der I-BUS App bzw. der K-CAN App.&amp;quot;, d_en: &amp;quot;Add-on, only works together with the I-BUS App or the K-CAN App.&amp;quot;, img: [P.can],&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/interfaces-module/346/can-bus-interface-inkl.-anschlusskabel&amp;quot;,&lt;br /&gt;
             ue: SHOP_EN + &amp;quot;i-bus-app/accessories/interfaces-modules/346/can-bus-interface-incl.-connection-cable&amp;quot;,&lt;br /&gt;
             w: WIKI + &amp;quot;Einbauanleitung_CAN-Bus_Interface&amp;quot;, wt: &amp;quot;Einbauanleitung CAN-Bus Interface&amp;quot;, wt_en: &amp;quot;Installation guide CAN bus interface&amp;quot; },&lt;br /&gt;
  kcan:    { t: &amp;quot;K-CAN App (Beta)&amp;quot;, d: &amp;quot;Pendant zur I-BUS App für Fahrzeuge mit K-CAN, aktuell als Betaversion.&amp;quot;,&lt;br /&gt;
             d_en: &amp;quot;Counterpart to the I-BUS App for vehicles with K-CAN, currently in beta.&amp;quot;,&lt;br /&gt;
             w: &amp;quot;https://wiki.kcan-app.de/&amp;quot;, wt: &amp;quot;Wiki zur K-CAN App&amp;quot;, wt_en: &amp;quot;K-CAN App wiki&amp;quot; },&lt;br /&gt;
  kcanlic: { t: &amp;quot;K-CAN App - Lizenz Betaversion&amp;quot;, t_en: &amp;quot;K-CAN App - License Beta Version&amp;quot;, d: &amp;quot;Beta-Lizenz für die K-CAN App.&amp;quot;, d_en: &amp;quot;Beta license for the K-CAN App.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/lizenzen/358/k-can-app-lizenz-betaversion&amp;quot;, ue: SHOP_EN + &amp;quot;i-bus-app/licenses/358/k-can-app-license-beta-version&amp;quot; },&lt;br /&gt;
  tpms:    { t: &amp;quot;TPMS - Reifendruckkontrolle&amp;quot;, t_en: &amp;quot;TPMS - tire pressure monitoring&amp;quot;, d: &amp;quot;&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/tpms/&amp;quot;, ue: SHOP_EN + &amp;quot;accessories-for-head-units/tpms/&amp;quot; },&lt;br /&gt;
  dab1:    { t: &amp;quot;DAB+ Empfänger inkl. Antenne (Single)&amp;quot;, t_en: &amp;quot;DAB+ receiver incl. antenna (single)&amp;quot;, d: &amp;quot;&amp;quot;,&lt;br /&gt;
             w: &amp;quot;https://xtrons.ibus-app.de/index.php?title=Installation_der_DAB%2B_Antenne&amp;quot;, wt: &amp;quot;Installation der DAB+ Antenne&amp;quot;, wt_en: &amp;quot;Installing the DAB+ antenna&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;radiozubehoer/dab/291/dab-empfaenger-inkl.-antenne-usbdab04&amp;quot;, ue: SHOP_EN + &amp;quot;accessories-for-head-units/dab/&amp;quot;, ut_en: &amp;quot;DAB+ receivers in the shop →&amp;quot; },&lt;br /&gt;
  dab2:    { t: &amp;quot;Dual DAB+ Empfänger-Stick inkl. 2 Antennen&amp;quot;, t_en: &amp;quot;Dual DAB+ receiver stick incl. 2 antennas&amp;quot;, d: &amp;quot;&amp;quot;,&lt;br /&gt;
             w: &amp;quot;https://xtrons.ibus-app.de/index.php?title=Installation_der_DAB%2B_Antenne&amp;quot;, wt: &amp;quot;Installation der DAB+ Antenne&amp;quot;, wt_en: &amp;quot;Installing the DAB+ antenna&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;radiozubehoer/dab/391/dual-dab-empfaenger-stick-inkl.-2-antennen-acusbdab05t?c=75&amp;quot;, ue: SHOP_EN + &amp;quot;accessories-for-head-units/dab/&amp;quot;, ut_en: &amp;quot;DAB+ receivers in the shop →&amp;quot; },&lt;br /&gt;
  rcam:    { t: &amp;quot;Rückfahrkamera&amp;quot;, t_en: &amp;quot;Rear-view camera&amp;quot;, d: &amp;quot;&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/kameras/&amp;quot;, ue: SHOP_EN + &amp;quot;accessories-for-head-units/cameras/&amp;quot;,&lt;br /&gt;
             ut: &amp;quot;Kameras im Shop ansehen →&amp;quot;, ut_en: &amp;quot;View cameras in the shop →&amp;quot; },&lt;br /&gt;
  fcam:    { t: &amp;quot;Front-Kamera&amp;quot;, t_en: &amp;quot;Front camera&amp;quot;, d: &amp;quot;&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/kameras/&amp;quot;, ue: SHOP_EN + &amp;quot;accessories-for-head-units/cameras/&amp;quot;,&lt;br /&gt;
             ut: &amp;quot;Kameras im Shop ansehen →&amp;quot;, ut_en: &amp;quot;View cameras in the shop →&amp;quot; },&lt;br /&gt;
  tool:    { t: &amp;quot;Einbau-Werkzeug (Kunststoffheber)&amp;quot;, t_en: &amp;quot;Installation tool (plastic pry tool)&amp;quot;, d: &amp;quot;Zum schonenden Lösen der Verkleidungen.&amp;quot;, d_en: &amp;quot;For gently removing trim panels.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;radiozubehoer/einbauwerkzeug/&amp;quot;, ue: SHOP_EN + &amp;quot;accessories-for-head-units/installation-tools/&amp;quot; }&lt;br /&gt;
};&lt;br /&gt;
/* ---- 5) Regeln --------------------------------------------------------------&lt;br /&gt;
   type: need (Das brauchst Du) oder hint (Hinweise)   when = Bedingung auf die Felder&lt;br /&gt;
   opts = diese Zusatzoptionen müssen gewählt sein      items = Artikel   html / html_en = Text (DE / EN)&lt;br /&gt;
   Abgeleitete Werte: gen (alt/b/c) und module (ja/nein/unk = Radiomodul im Kofferraum, nur gen alt) */&lt;br /&gt;
var RULES = [&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { current: [&amp;quot;werk&amp;quot;], module: [&amp;quot;ja&amp;quot;] }, items: [&amp;quot;exl005&amp;quot;, &amp;quot;fakra6m&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { current: [&amp;quot;nach&amp;quot;], module: [&amp;quot;ja&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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=&amp;quot; + P.noquad + &amp;quot;][img=&amp;quot; + P.noexl6 + &amp;quot;]&amp;quot;,&lt;br /&gt;
    html_en: &amp;quot;[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=&amp;quot; + P.noquad + &amp;quot;][img=&amp;quot; + P.noexl6 + &amp;quot;]&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;ja&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot;,&lt;br /&gt;
    html_en: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;nein&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot;,&lt;br /&gt;
    html_en: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;unk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot;,&lt;br /&gt;
    html_en: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { ant: [&amp;quot;iso&amp;quot;] }, items: [&amp;quot;isoada&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { ant: [&amp;quot;unk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Antennenstecker:[/b] [b]BM24[/b] (Rundpin) = ISO-Antennenstecker, ggf. wird der [a=&amp;quot; + SHOP + &amp;quot;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.&amp;quot;,&lt;br /&gt;
    html_en: &amp;quot;[b]Antenna connector:[/b] [b]BM24[/b] (round pin) = ISO antenna connector, you may need the [a=&amp;quot; + SHOP_EN + &amp;quot;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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { sound: [&amp;quot;dsp&amp;quot;] }, items: [&amp;quot;bcdsp&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { sound: [&amp;quot;dsp&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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=&amp;quot; + WIKI + &amp;quot;Habe_ich_DSP%3F]Habe ich DSP?[/a]&amp;quot;,&lt;br /&gt;
    html_en: &amp;quot;[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=&amp;quot; + WIKI + &amp;quot;Habe_ich_DSP%3F]Do I have DSP?[/a]&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { sound: [&amp;quot;hk&amp;quot;], gen: [&amp;quot;alt&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Harman Kardon:[/b] Benötigt [b]keine[/b] DSP-Lizenz. Das Remote-Signal (+12 V, wenn Radio an) genügt zum Starten.&amp;quot;,&lt;br /&gt;
    html_en: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { aux: [&amp;quot;nein&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]AUX-IN:[/b] Der AUX-IN muss codiert werden. Optional kann ein FM-Transmitter genutzt werden - das ist nicht empfohlen.&amp;quot;,&lt;br /&gt;
    html_en: &amp;quot;[b]AUX-IN:[/b] The AUX-IN has to be coded. Optionally an FM transmitter can be used - this is not recommended.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;7er-e38&amp;quot;, &amp;quot;x5-e53&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Montage:[/b] Radios für BMW E38/E53 benötigen keine extra Halterungen.&amp;quot;,&lt;br /&gt;
    html_en: &amp;quot;[b]Installation:[/b] Radios for BMW E38/E53 do not need extra brackets.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;5er-e39&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot;,&lt;br /&gt;
    html_en: &amp;quot;[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].&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;3er-e46&amp;quot;], factory: [&amp;quot;iris&amp;quot;, &amp;quot;mid&amp;quot;, &amp;quot;pfeil&amp;quot;], current: [&amp;quot;werk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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]&amp;quot; +&lt;br /&gt;
          &amp;quot;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]&amp;quot; +&lt;br /&gt;
          &amp;quot;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=&amp;quot; + P.funktr + &amp;quot;]&amp;quot;,&lt;br /&gt;
    html_en: &amp;quot;[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]&amp;quot; +&lt;br /&gt;
          &amp;quot;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]&amp;quot; +&lt;br /&gt;
          &amp;quot;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=&amp;quot; + P.funktr + &amp;quot;]&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { factory: [&amp;quot;cic&amp;quot;, &amp;quot;nbt&amp;quot;, &amp;quot;nbtevo&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Lichtleiter:[/b] Ggf. vorhandene Lichtleiter (MOST) müssen aus dem BMW-Stecker in den Xtrons-Adapter umgesteckt werden.&amp;quot;,&lt;br /&gt;
    html_en: &amp;quot;[b]Fiber optic cables:[/b] Any existing fiber optic cables (MOST) have to be moved from the BMW connector to the Xtrons adapter.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { factory: [&amp;quot;mask&amp;quot;, &amp;quot;ccc&amp;quot;, &amp;quot;cic&amp;quot;, &amp;quot;nbt&amp;quot;, &amp;quot;nbtevo&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot;,&lt;br /&gt;
    html_en: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, opts: [&amp;quot;kcan&amp;quot;], when: {},&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot;,&lt;br /&gt;
    html_en: &amp;quot;[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].&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, opts: [&amp;quot;ibus&amp;quot;], when: {},&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot;,&lt;br /&gt;
    html_en: &amp;quot;[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].&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: {},&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot;,&lt;br /&gt;
    html_en: &amp;quot;[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].&amp;quot; }&lt;br /&gt;
];&lt;br /&gt;
/* =====================================================================&lt;br /&gt;
   PROGRAMMLOGIK&lt;br /&gt;
   ===================================================================== */&lt;br /&gt;
var $ = function (id) { return document.getElementById(id); };&lt;br /&gt;
var sel = {}, picked = {}, summary = &amp;quot;&amp;quot;, capA = 0, capB = 0, radioCache = {}, chosenRadio = null, cartFill = null;&lt;br /&gt;
var fieldsEl = $(&amp;quot;nvk-fields&amp;quot;), optsEl = $(&amp;quot;nvk-opts&amp;quot;), outEl = $(&amp;quot;nvk-out&amp;quot;);&lt;br /&gt;
var LANG = DEFAULT_LANG;&lt;br /&gt;
var AMP = &amp;quot;\u0026&amp;quot;;&lt;br /&gt;
function T(de, en) { return LANG === &amp;quot;en&amp;quot; ? en : de; }&lt;br /&gt;
function LT(o, k) { var v = LANG === &amp;quot;en&amp;quot; ? o[k + &amp;quot;_en&amp;quot;] : &amp;quot;&amp;quot;; return v ? v : o[k]; }&lt;br /&gt;
function itemUrl(i) { var v = LANG === &amp;quot;en&amp;quot; ? i.ue : &amp;quot;&amp;quot;; return v ? v : i.u; }&lt;br /&gt;
function full(u) { return u.indexOf(&amp;quot;/thumb/&amp;quot;) === -1 ? u : u.replace(&amp;quot;/thumb/&amp;quot;, &amp;quot;/&amp;quot;).replace(/\/[^\/]+$/, &amp;quot;&amp;quot;); }&lt;br /&gt;
function fmt(t) {&lt;br /&gt;
  return t.replace(/\[imgw=([^\x5D]+)\]/g, function (m, u) {&lt;br /&gt;
    return &amp;quot;\u003Ca href=\&amp;quot;&amp;quot; + full(u) + &amp;quot;\&amp;quot; target=\&amp;quot;_blank\&amp;quot; rel=\&amp;quot;noopener\&amp;quot;\u003E\u003Cimg class=\&amp;quot;nvk-img wide\&amp;quot; src=\&amp;quot;&amp;quot; + u + &amp;quot;\&amp;quot; alt=\&amp;quot;\&amp;quot;\u003E\u003C/a\u003E&amp;quot;;&lt;br /&gt;
  }).replace(/\[img=([^\x5D]+)\]/g, function (m, u) {&lt;br /&gt;
    return &amp;quot;\u003Ca href=\&amp;quot;&amp;quot; + full(u) + &amp;quot;\&amp;quot; target=\&amp;quot;_blank\&amp;quot; rel=\&amp;quot;noopener\&amp;quot;\u003E\u003Cimg class=\&amp;quot;nvk-img\&amp;quot; src=\&amp;quot;&amp;quot; + u + &amp;quot;\&amp;quot; alt=\&amp;quot;\&amp;quot;\u003E\u003C/a\u003E&amp;quot;;&lt;br /&gt;
  }).replace(/\[b\]/g, &amp;quot;\u003Cb\u003E&amp;quot;).replace(/\[\/b\]/g, &amp;quot;\u003C/b\u003E&amp;quot;).replace(/\[br\]/g, &amp;quot;\u003Cbr\u003E&amp;quot;)&lt;br /&gt;
    .replace(/\[a=([^\x5D]+)\]/g, &amp;quot;\u003Ca href=\&amp;quot;$1\&amp;quot; target=\&amp;quot;_blank\&amp;quot; rel=\&amp;quot;noopener\&amp;quot;\u003E&amp;quot;).replace(/\[\/a\]/g, &amp;quot;\u003C/a\u003E&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
function match(cond, s, lenient) {&lt;br /&gt;
  if (!cond) return true;&lt;br /&gt;
  for (var k in cond) {&lt;br /&gt;
    if (!s[k]) { if (lenient) continue; return false; }&lt;br /&gt;
    if (cond[k].indexOf(s[k]) === -1) return false;&lt;br /&gt;
  }&lt;br /&gt;
  return true;&lt;br /&gt;
}&lt;br /&gt;
function vehicleOf(id) { return VEHICLES.filter(function (x) { return x.v === id; })[0]; }&lt;br /&gt;
function derive() {&lt;br /&gt;
  var s = {}, k;&lt;br /&gt;
  for (k in sel) s[k] = sel[k];&lt;br /&gt;
  var veh = vehicleOf(sel.vehicle);&lt;br /&gt;
  if (veh) s.gen = veh.gen;&lt;br /&gt;
  if (s.gen === &amp;quot;alt&amp;quot;) {&lt;br /&gt;
    if (s.factory === &amp;quot;n43&amp;quot; || s.factory === &amp;quot;n169&amp;quot;) s.module = &amp;quot;ja&amp;quot;;&lt;br /&gt;
    else if (s.factory === &amp;quot;iris&amp;quot; || s.factory === &amp;quot;mid&amp;quot;) s.module = &amp;quot;nein&amp;quot;;&lt;br /&gt;
    else if (s.factory === &amp;quot;pfeil&amp;quot;) s.module = s.trunk || &amp;quot;unk&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  return s;&lt;br /&gt;
}&lt;br /&gt;
function forced(s) {&lt;br /&gt;
  var f = {};&lt;br /&gt;
  FORCED.forEach(function (r) { if (match(r.when, s)) r.opts.forEach(function (o) { f[o] = LT(r, &amp;quot;why&amp;quot;); }); });&lt;br /&gt;
  return f;&lt;br /&gt;
}&lt;br /&gt;
function onSet(s) {&lt;br /&gt;
  var f = forced(s), on = {}, k;&lt;br /&gt;
  for (k in picked) if (picked[k]) on[k] = true;&lt;br /&gt;
  for (k in f) on[k] = true;&lt;br /&gt;
  return { on: on, forced: f };&lt;br /&gt;
}&lt;br /&gt;
function optVisible(o, s, on) {&lt;br /&gt;
  if (!match(o.show, s, true)) return false;&lt;br /&gt;
  return (o.requires || []).every(function (r) { return on[r]; });&lt;br /&gt;
}&lt;br /&gt;
FIELDS.forEach(function (f) {&lt;br /&gt;
  var wrap = document.createElement(&amp;quot;div&amp;quot;); wrap.className = &amp;quot;nvk-f&amp;quot;; wrap.id = &amp;quot;nvk-w-&amp;quot; + f.id;&lt;br /&gt;
  var lab = document.createElement(&amp;quot;label&amp;quot;); lab.htmlFor = &amp;quot;nvk-&amp;quot; + f.id; lab.id = &amp;quot;nvk-l-&amp;quot; + f.id; lab.textContent = LT(f, &amp;quot;label&amp;quot;);&lt;br /&gt;
  var s = document.createElement(&amp;quot;select&amp;quot;); s.id = &amp;quot;nvk-&amp;quot; + f.id;&lt;br /&gt;
  s.addEventListener(&amp;quot;change&amp;quot;, function () { sel[f.id] = s.value; update(); });&lt;br /&gt;
  wrap.appendChild(lab); wrap.appendChild(s);&lt;br /&gt;
  if (f.help) { var h = document.createElement(&amp;quot;div&amp;quot;); h.className = &amp;quot;nvk-help&amp;quot;; h.id = &amp;quot;nvk-h-&amp;quot; + f.id; h.innerHTML = fmt(LT(f, &amp;quot;help&amp;quot;)); wrap.appendChild(h); }&lt;br /&gt;
  var inf = document.createElement(&amp;quot;div&amp;quot;); inf.id = &amp;quot;nvk-i-&amp;quot; + f.id; wrap.appendChild(inf);&lt;br /&gt;
  fieldsEl.appendChild(wrap);&lt;br /&gt;
});&lt;br /&gt;
function renderFields() {&lt;br /&gt;
  FIELDS.forEach(function (f) {&lt;br /&gt;
    var s = derive();&lt;br /&gt;
    var wrap = $(&amp;quot;nvk-w-&amp;quot; + f.id), el = $(&amp;quot;nvk-&amp;quot; + f.id);&lt;br /&gt;
    $(&amp;quot;nvk-l-&amp;quot; + f.id).textContent = LT(f, &amp;quot;label&amp;quot;);&lt;br /&gt;
    if (f.help) { $(&amp;quot;nvk-h-&amp;quot; + f.id).innerHTML = fmt(LT(f, &amp;quot;help&amp;quot;)); }&lt;br /&gt;
    var vis = f.show ? match(f.show, s, false) : true;&lt;br /&gt;
    wrap.style.display = vis ? &amp;quot;&amp;quot; : &amp;quot;none&amp;quot;;&lt;br /&gt;
    if (!vis) { sel[f.id] = &amp;quot;&amp;quot;; return; }&lt;br /&gt;
    var allowed = f.values.filter(function (v) { return match(v.only, s, true); });&lt;br /&gt;
    if (sel[f.id]) { if (!allowed.some(function (v) { return v.v === sel[f.id]; })) sel[f.id] = &amp;quot;&amp;quot;; }&lt;br /&gt;
    if (!sel[f.id]) { if (f.def) sel[f.id] = f.def; }&lt;br /&gt;
    if (!sel[f.id]) { if (f.auto) { if (sel.vehicle) { if (allowed.length === 1) sel[f.id] = allowed[0].v; } } }&lt;br /&gt;
    el.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
    if (!f.def) { var p = document.createElement(&amp;quot;option&amp;quot;); p.value = &amp;quot;&amp;quot;; p.textContent = T(&amp;quot;– bitte wählen –&amp;quot;, &amp;quot;– please select –&amp;quot;); el.appendChild(p); }&lt;br /&gt;
    allowed.forEach(function (v) {&lt;br /&gt;
      var o = document.createElement(&amp;quot;option&amp;quot;); o.value = v.v; o.textContent = LT(v, &amp;quot;t&amp;quot;); el.appendChild(o);&lt;br /&gt;
    });&lt;br /&gt;
    el.value = sel[f.id] || &amp;quot;&amp;quot;;&lt;br /&gt;
    var cur = allowed.filter(function (v) { return v.v === sel[f.id]; })[0];&lt;br /&gt;
    var pre = f.pre ? (match(f.pre.when, s, false) ? fmt(LT(f.pre, &amp;quot;html&amp;quot;)) : &amp;quot;&amp;quot;) : &amp;quot;&amp;quot;;&lt;br /&gt;
    $(&amp;quot;nvk-i-&amp;quot; + f.id).innerHTML = pre + (cur ? (cur.info ? fmt(LT(cur, &amp;quot;info&amp;quot;)) : &amp;quot;&amp;quot;) : &amp;quot;&amp;quot;);&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
function renderOpts() {&lt;br /&gt;
  var s = derive(), st = onSet(s);&lt;br /&gt;
  OPTS.forEach(function (o) { if (!optVisible(o, s, st.on)) picked[o.id] = false; });&lt;br /&gt;
  st = onSet(s);&lt;br /&gt;
  optsEl.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
  OPTS.forEach(function (o) {&lt;br /&gt;
    if (!optVisible(o, s, st.on)) return;&lt;br /&gt;
    var lab = document.createElement(&amp;quot;label&amp;quot;); lab.className = &amp;quot;nvk-o&amp;quot;;&lt;br /&gt;
    var cb = document.createElement(&amp;quot;input&amp;quot;); cb.type = &amp;quot;checkbox&amp;quot;;&lt;br /&gt;
    cb.checked = !!st.on[o.id];&lt;br /&gt;
    var isForced = !!st.forced[o.id];&lt;br /&gt;
    if (isForced) { cb.disabled = true; lab.className += &amp;quot; dis&amp;quot;; }&lt;br /&gt;
    cb.addEventListener(&amp;quot;change&amp;quot;, function () {&lt;br /&gt;
      picked[o.id] = cb.checked;&lt;br /&gt;
      if (cb.checked) { if (o.excl) OPTS.forEach(function (x) { if (x.excl === o.excl) { if (x.id !== o.id) picked[x.id] = false; } }); }&lt;br /&gt;
      update();&lt;br /&gt;
    });&lt;br /&gt;
    lab.appendChild(cb);&lt;br /&gt;
    lab.appendChild(document.createTextNode(&amp;quot; &amp;quot; + LT(o, &amp;quot;t&amp;quot;)));&lt;br /&gt;
    var sub = [LT(o, &amp;quot;sub&amp;quot;), isForced ? st.forced[o.id] : &amp;quot;&amp;quot;].filter(Boolean).join(&amp;quot; - &amp;quot;);&lt;br /&gt;
    if (sub) { var sm = document.createElement(&amp;quot;small&amp;quot;); sm.textContent = &amp;quot; (&amp;quot; + sub + &amp;quot;)&amp;quot;; lab.appendChild(sm); }&lt;br /&gt;
    optsEl.appendChild(lab);&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
function link(url, text) {&lt;br /&gt;
  var a = document.createElement(&amp;quot;a&amp;quot;); a.href = url; a.target = &amp;quot;_blank&amp;quot;; a.rel = &amp;quot;noopener&amp;quot;; a.textContent = text; return a;&lt;br /&gt;
}&lt;br /&gt;
function card(item, cls) {&lt;br /&gt;
  var d = document.createElement(&amp;quot;div&amp;quot;); d.className = &amp;quot;nvk-card &amp;quot; + (cls || &amp;quot;&amp;quot;) + (item.hl ? &amp;quot; hl&amp;quot; : &amp;quot;&amp;quot;);&lt;br /&gt;
  var b = document.createElement(&amp;quot;b&amp;quot;); b.textContent = LT(item, &amp;quot;t&amp;quot;); d.appendChild(b);&lt;br /&gt;
  var dd = LT(item, &amp;quot;d&amp;quot;);&lt;br /&gt;
  if (dd) { var p = document.createElement(&amp;quot;span&amp;quot;); p.textContent = dd; d.appendChild(p); }&lt;br /&gt;
  if (item.img) {&lt;br /&gt;
    var im = document.createElement(&amp;quot;div&amp;quot;);&lt;br /&gt;
    item.img.forEach(function (u) {&lt;br /&gt;
      var a = document.createElement(&amp;quot;a&amp;quot;); a.href = full(u); a.target = &amp;quot;_blank&amp;quot;; a.rel = &amp;quot;noopener&amp;quot;;&lt;br /&gt;
      var g = document.createElement(&amp;quot;img&amp;quot;); g.className = &amp;quot;nvk-img&amp;quot;; g.src = u; g.alt = LT(item, &amp;quot;t&amp;quot;); a.appendChild(g); im.appendChild(a);&lt;br /&gt;
    });&lt;br /&gt;
    d.appendChild(im);&lt;br /&gt;
  }&lt;br /&gt;
  var iu = itemUrl(item);&lt;br /&gt;
  if (iu || item.w) {&lt;br /&gt;
    var l = document.createElement(&amp;quot;div&amp;quot;); l.className = &amp;quot;nvk-links&amp;quot;;&lt;br /&gt;
    if (iu) l.appendChild(link(iu, LT(item, &amp;quot;ut&amp;quot;) || T(&amp;quot;Im Shop ansehen →&amp;quot;, &amp;quot;View in shop →&amp;quot;)));&lt;br /&gt;
    if (item.w) l.appendChild(link(item.w, (LT(item, &amp;quot;wt&amp;quot;) || T(&amp;quot;Zum Wiki&amp;quot;, &amp;quot;Open wiki&amp;quot;)) + &amp;quot; →&amp;quot;));&lt;br /&gt;
    d.appendChild(l);&lt;br /&gt;
  }&lt;br /&gt;
  if (item.links) item.links.forEach(function (x) {&lt;br /&gt;
    var r = document.createElement(&amp;quot;div&amp;quot;); r.className = &amp;quot;nvk-links&amp;quot;; r.appendChild(link(LANG === &amp;quot;en&amp;quot; ? (x.ue || x.u) : x.u, LT(x, &amp;quot;t&amp;quot;) + &amp;quot; →&amp;quot;)); d.appendChild(r);&lt;br /&gt;
  });&lt;br /&gt;
  return d;&lt;br /&gt;
}&lt;br /&gt;
function heading(txt) { var h = document.createElement(&amp;quot;h3&amp;quot;); h.textContent = txt; outEl.appendChild(h); }&lt;br /&gt;
function aidOf(u) {&lt;br /&gt;
  if (u.indexOf(SHOP) !== 0) return &amp;quot;&amp;quot;;&lt;br /&gt;
  var m = u.match(/sArticle\/(\d+)/);&lt;br /&gt;
  if (!m) m = u.split(&amp;quot;?&amp;quot;)[0].match(/\/(\d+)\/[^\/]+$/);&lt;br /&gt;
  return m ? m[1] : &amp;quot;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
function renderRadioList(veh) {&lt;br /&gt;
  if (veh.noCat) return;&lt;br /&gt;
  if (chosenRadio) { if (chosenRadio.cat !== veh.v) chosenRadio = null; }&lt;br /&gt;
  var ck = veh.v + &amp;quot;-&amp;quot; + LANG;&lt;br /&gt;
  var data = radioCache[ck];&lt;br /&gt;
  if (data === undefined) {&lt;br /&gt;
    radioCache[ck] = &amp;quot;loading&amp;quot;;&lt;br /&gt;
    fetch(API + &amp;quot;?cat=&amp;quot; + encodeURIComponent(veh.v) + AMP + &amp;quot;lang=&amp;quot; + LANG).then(function (r) { return r.json(); }).then(function (j) {&lt;br /&gt;
      radioCache[ck] = (j.items || []).map(function (it) { it.cat = veh.v; return it; });&lt;br /&gt;
      renderResult();&lt;br /&gt;
    }).catch(function () { radioCache[ck] = []; renderResult(); });&lt;br /&gt;
  }&lt;br /&gt;
  if (data === undefined || data === &amp;quot;loading&amp;quot;) {&lt;br /&gt;
    var m = document.createElement(&amp;quot;p&amp;quot;); m.className = &amp;quot;nvk-miss&amp;quot;; m.textContent = T(&amp;quot;Verfügbare Radios werden geladen …&amp;quot;, &amp;quot;Loading available radios …&amp;quot;); outEl.appendChild(m); return;&lt;br /&gt;
  }&lt;br /&gt;
  if (!data.length) return;&lt;br /&gt;
  var want = { mask: /M-?ASK/i, ccc: /\bCCC\b/i, cic: /\bCIC\b/i, nbt: /\bNBT\b/i, nbtevo: /EVO/i }[sel.factory];&lt;br /&gt;
  function fits(it) { return want ? want.test(it.name) : false; }&lt;br /&gt;
  var list = data.slice().sort(function (a, b) { return (fits(b) ? 1 : 0) - (fits(a) ? 1 : 0); });&lt;br /&gt;
  var det = document.createElement(&amp;quot;details&amp;quot;); det.open = Math.max(list.length, 8) === 8;&lt;br /&gt;
  var sm = document.createElement(&amp;quot;summary&amp;quot;); sm.style.cursor = &amp;quot;pointer&amp;quot;; sm.style.fontWeight = &amp;quot;700&amp;quot;;&lt;br /&gt;
  sm.textContent = T(&amp;quot;Verfügbare Radios für Deinen BMW &amp;quot;, &amp;quot;Available radios for your BMW &amp;quot;) + vname(veh) + &amp;quot; (&amp;quot; + list.length + &amp;quot;)&amp;quot;; det.appendChild(sm);&lt;br /&gt;
  list.forEach(function (it) {&lt;br /&gt;
    var row = document.createElement(&amp;quot;div&amp;quot;); row.className = &amp;quot;nvk-row&amp;quot;;&lt;br /&gt;
    var lab = document.createElement(&amp;quot;label&amp;quot;); lab.className = &amp;quot;nvk-o&amp;quot;;&lt;br /&gt;
    var rb = document.createElement(&amp;quot;input&amp;quot;); rb.type = &amp;quot;radio&amp;quot;; rb.name = &amp;quot;nvk-radio&amp;quot;;&lt;br /&gt;
    rb.checked = chosenRadio ? chosenRadio.sku === it.sku : false;&lt;br /&gt;
    rb.addEventListener(&amp;quot;change&amp;quot;, function () { chosenRadio = it; if (cartFill) cartFill(); });&lt;br /&gt;
    lab.appendChild(rb);&lt;br /&gt;
    lab.appendChild(document.createTextNode(&amp;quot; &amp;quot; + it.name + (it.price ? &amp;quot;  -  &amp;quot; + it.price : &amp;quot;&amp;quot;) + (fits(it) ? T(&amp;quot;  (passt zu Deiner Auswahl)&amp;quot;, &amp;quot;  (matches your selection)&amp;quot;) : &amp;quot;&amp;quot;)));&lt;br /&gt;
    row.appendChild(lab); row.appendChild(link(it.url, &amp;quot;Shop →&amp;quot;));&lt;br /&gt;
    det.appendChild(row);&lt;br /&gt;
  });&lt;br /&gt;
  outEl.appendChild(det);&lt;br /&gt;
}&lt;br /&gt;
function cartBlock(needs, opt) {&lt;br /&gt;
  var items = [];&lt;br /&gt;
  needs.concat(opt).forEach(function (i) { var id = aidOf(itemUrl(i) || &amp;quot;&amp;quot;); if (id) items.push({ t: LT(i, &amp;quot;t&amp;quot;), aid: id }); });&lt;br /&gt;
  heading(T(&amp;quot;In den Warenkorb&amp;quot;, &amp;quot;Add to cart&amp;quot;));&lt;br /&gt;
  var box = document.createElement(&amp;quot;div&amp;quot;); box.className = &amp;quot;nvk-card opt&amp;quot;;&lt;br /&gt;
  var p = document.createElement(&amp;quot;div&amp;quot;);&lt;br /&gt;
  p.textContent = T(&amp;quot;Das oben gewählte Radio (falls ausgewählt) und diese Artikel werden direkt im Shop in den Warenkorb gelegt:&amp;quot;, &amp;quot;The radio selected above (if any) and these items will be added to your cart in the shop:&amp;quot;);&lt;br /&gt;
  box.appendChild(p);&lt;br /&gt;
  var listEl = document.createElement(&amp;quot;div&amp;quot;); box.appendChild(listEl);&lt;br /&gt;
  cartFill = function () {&lt;br /&gt;
    listEl.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
    var lines = (chosenRadio ? [&amp;quot;Radio: &amp;quot; + chosenRadio.type] : []).concat(items.map(function (x) { return x.t; }));&lt;br /&gt;
    lines.forEach(function (t) { var r = document.createElement(&amp;quot;div&amp;quot;); r.textContent = &amp;quot;- &amp;quot; + t; listEl.appendChild(r); });&lt;br /&gt;
  };&lt;br /&gt;
  cartFill();&lt;br /&gt;
  var n = document.createElement(&amp;quot;div&amp;quot;); n.className = &amp;quot;nvk-help&amp;quot;;&lt;br /&gt;
  n.textContent = T(&amp;quot;Kameras, TPMS, Werkzeug und Artikel ohne Direktlink wählst Du bitte über die Links oben im Shop aus.&amp;quot;, &amp;quot;Cameras, TPMS, tools and items without a direct link: please pick them in the shop using the links above.&amp;quot;);&lt;br /&gt;
  box.appendChild(n);&lt;br /&gt;
  var all = needs.concat(opt);&lt;br /&gt;
  var has = function (k) { return all.indexOf(ITEMS[k]) !== -1; };&lt;br /&gt;
  var l17 = has(&amp;quot;kcanlic&amp;quot;), l7 = has(&amp;quot;bclic&amp;quot;) || has(&amp;quot;bcdsp&amp;quot;);&lt;br /&gt;
  if (l17 || l7) {&lt;br /&gt;
    var vb = document.createElement(&amp;quot;div&amp;quot;); vb.className = &amp;quot;nvk-f&amp;quot;; vb.style.marginTop = &amp;quot;12px&amp;quot;;&lt;br /&gt;
    var vlab = document.createElement(&amp;quot;label&amp;quot;); vlab.htmlFor = &amp;quot;nvk-licvin&amp;quot;;&lt;br /&gt;
    vlab.textContent = l17 ? T(&amp;quot;Fahrgestellnummer (17 Zeichen) für die Lizenz&amp;quot;, &amp;quot;Full VIN (17 characters) for the license&amp;quot;) : T(&amp;quot;VIN für die Lizenz (7 Zeichen, z. B. AB12345)&amp;quot;, &amp;quot;VIN for the license (7 characters, e.g. AB12345)&amp;quot;);&lt;br /&gt;
    var vin = document.createElement(&amp;quot;input&amp;quot;); vin.type = &amp;quot;text&amp;quot;; vin.id = &amp;quot;nvk-licvin&amp;quot;; vin.maxLength = 17;&lt;br /&gt;
    vin.value = $(&amp;quot;nvk-vin&amp;quot;).value.toUpperCase();&lt;br /&gt;
    var ta = document.createElement(&amp;quot;textarea&amp;quot;); ta.rows = 3; ta.readOnly = true; ta.style.display = &amp;quot;none&amp;quot;; ta.style.marginTop = &amp;quot;6px&amp;quot;;&lt;br /&gt;
    var cb = document.createElement(&amp;quot;button&amp;quot;); cb.type = &amp;quot;button&amp;quot;; cb.className = &amp;quot;nvk-btn&amp;quot;; cb.style.marginTop = &amp;quot;6px&amp;quot;;&lt;br /&gt;
    cb.textContent = T(&amp;quot;Kommentartext für die Kasse kopieren&amp;quot;, &amp;quot;Copy comment text for checkout&amp;quot;);&lt;br /&gt;
    var ls = document.createElement(&amp;quot;div&amp;quot;); ls.className = &amp;quot;nvk-help&amp;quot;;&lt;br /&gt;
    cb.addEventListener(&amp;quot;click&amp;quot;, function () {&lt;br /&gt;
      var v = vin.value.trim().toUpperCase(), v7 = &amp;quot;&amp;quot;, v17 = &amp;quot;&amp;quot;;&lt;br /&gt;
      if (/^[A-HJ-NPR-Z0-9]{17}$/.test(v)) { v17 = v; v7 = v.slice(10); }&lt;br /&gt;
      else if (/^[A-Z]{2}[0-9]{5}$/.test(v)) v7 = v;&lt;br /&gt;
      if (l17 ? !v17 : !v7) { ls.textContent = l17 ? T(&amp;quot;Bitte die vollständige 17-stellige Fahrgestellnummer eingeben.&amp;quot;, &amp;quot;Please enter the full 17-character VIN.&amp;quot;) : T(&amp;quot;Bitte die VIN im Format AB12345 (oder die 17-stellige FGN) eingeben.&amp;quot;, &amp;quot;Please enter the VIN as AB12345 (or the full 17-character VIN).&amp;quot;); return; }&lt;br /&gt;
      var L = [];&lt;br /&gt;
      if (has(&amp;quot;bclic&amp;quot;)) L.push(T(&amp;quot;I-BUS App BC Lizenz: VIN &amp;quot;, &amp;quot;I-BUS App OBC License: VIN &amp;quot;) + v7);&lt;br /&gt;
      if (has(&amp;quot;bcdsp&amp;quot;)) L.push(T(&amp;quot;I-BUS App BC+DSP Lizenz: VIN &amp;quot;, &amp;quot;I-BUS App OBC+DSP License: VIN &amp;quot;) + v7);&lt;br /&gt;
      if (l17) L.push(T(&amp;quot;K-CAN App Beta Lizenz: FGN &amp;quot;, &amp;quot;K-CAN App Beta License: VIN &amp;quot;) + v17);&lt;br /&gt;
      ta.value = L.join(&amp;quot;\n&amp;quot;); ta.style.display = &amp;quot;&amp;quot;; ta.select();&lt;br /&gt;
      var hint = T(&amp;quot;Bitte an der Shop-Kasse in das Feld Kommentar einfügen.&amp;quot;, &amp;quot;Please paste it into the Comment field at the shop checkout.&amp;quot;);&lt;br /&gt;
      var manual = T(&amp;quot;Bitte den Text markieren und kopieren. &amp;quot;, &amp;quot;Please select and copy the text. &amp;quot;);&lt;br /&gt;
      if (navigator.clipboard) navigator.clipboard.writeText(ta.value).then(function () { ls.textContent = T(&amp;quot;Text kopiert. &amp;quot;, &amp;quot;Text copied. &amp;quot;) + hint; }).catch(function () { ls.textContent = manual + hint; });&lt;br /&gt;
      else ls.textContent = manual + hint;&lt;br /&gt;
    });&lt;br /&gt;
    vb.appendChild(vlab); vb.appendChild(vin); vb.appendChild(cb); vb.appendChild(ta); vb.appendChild(ls); box.appendChild(vb);&lt;br /&gt;
  }&lt;br /&gt;
  if (!CART_TRANSFER) { outEl.appendChild(box); return; }&lt;br /&gt;
  var btn = document.createElement(&amp;quot;button&amp;quot;); btn.type = &amp;quot;button&amp;quot;; btn.className = &amp;quot;nvk-btn&amp;quot;; btn.style.marginTop = &amp;quot;8px&amp;quot;;&lt;br /&gt;
  btn.textContent = T(&amp;quot;Auswahl in den Warenkorb legen&amp;quot;, &amp;quot;Add selection to cart&amp;quot;);&lt;br /&gt;
  var st = document.createElement(&amp;quot;div&amp;quot;); st.className = &amp;quot;nvk-help&amp;quot;;&lt;br /&gt;
  btn.addEventListener(&amp;quot;click&amp;quot;, function () { addToCart(items, st); });&lt;br /&gt;
  box.appendChild(btn); box.appendChild(st); outEl.appendChild(box);&lt;br /&gt;
}&lt;br /&gt;
function addToCart(items, st) {&lt;br /&gt;
  var list = items.slice();&lt;br /&gt;
  if (chosenRadio) list.unshift({ t: chosenRadio.type, sku: chosenRadio.sku });&lt;br /&gt;
  if (!list.length) { st.textContent = T(&amp;quot;Es ist noch nichts zum Bestellen ausgewählt.&amp;quot;, &amp;quot;Nothing has been selected to order yet.&amp;quot;); return; }&lt;br /&gt;
  var w = window.open(&amp;quot;&amp;quot;, &amp;quot;_blank&amp;quot;);&lt;br /&gt;
  st.textContent = T(&amp;quot;Artikelnummern werden ermittelt …&amp;quot;, &amp;quot;Looking up item numbers …&amp;quot;);&lt;br /&gt;
  var ids = list.filter(function (x) { return x.aid; }).map(function (x) { return x.aid; });&lt;br /&gt;
  var get = ids.length ? fetch(API + &amp;quot;?aid=&amp;quot; + ids.join(&amp;quot;,&amp;quot;)).then(function (r) { return r.json(); }).then(function (j) { return j.skus || {}; }) : Promise.resolve({});&lt;br /&gt;
  get.then(function (map) {&lt;br /&gt;
    var skus = [];&lt;br /&gt;
    list.forEach(function (x) { var k = x.sku || map[x.aid]; if (k) skus.push(k); });&lt;br /&gt;
    if (!skus.length) throw new Error(&amp;quot;none&amp;quot;);&lt;br /&gt;
    var url = (LANG === &amp;quot;en&amp;quot; ? TRANSFER_URL_EN : TRANSFER_URL) + encodeURIComponent(skus.join(&amp;quot;,&amp;quot;));&lt;br /&gt;
    if (w) {&lt;br /&gt;
      w.location.href = url;&lt;br /&gt;
      st.textContent = T(&amp;quot;Der Shop wurde in einem neuen Tab geöffnet (&amp;quot; + skus.length + &amp;quot; von &amp;quot; + list.length + &amp;quot; Artikeln übergeben). Bitte dort den Warenkorb kontrollieren. Ist ein Artikel nicht bestellbar, weist der Shop darauf hin.&amp;quot;, &amp;quot;The shop was opened in a new tab (&amp;quot; + skus.length + &amp;quot; of &amp;quot; + list.length + &amp;quot; items transferred). Please check the cart there. If an item cannot be ordered, the shop will tell you.&amp;quot;);&lt;br /&gt;
    } else {&lt;br /&gt;
      st.textContent = T(&amp;quot;Der neue Tab wurde blockiert. Bitte Pop-ups erlauben oder diesen Link nutzen: &amp;quot;, &amp;quot;The new tab was blocked. Please allow pop-ups or use this link: &amp;quot;);&lt;br /&gt;
      st.appendChild(link(url, T(&amp;quot;Warenkorb im Shop öffnen →&amp;quot;, &amp;quot;Open cart in the shop →&amp;quot;)));&lt;br /&gt;
    }&lt;br /&gt;
  }).catch(function () { if (w) w.close(); st.textContent = T(&amp;quot;Das hat leider nicht geklappt. Bitte nutze die Shop-Links oben.&amp;quot;, &amp;quot;Sorry, that did not work. Please use the shop links above.&amp;quot;); });&lt;br /&gt;
}&lt;br /&gt;
function renderResult() {&lt;br /&gt;
  var s = derive(), st = onSet(s);&lt;br /&gt;
  var missing = FIELDS.filter(function (f) {&lt;br /&gt;
    var w = $(&amp;quot;nvk-w-&amp;quot; + f.id);&lt;br /&gt;
    return w.style.display !== &amp;quot;none&amp;quot; ? (!f.optional ? !sel[f.id] : false) : false;&lt;br /&gt;
  });&lt;br /&gt;
  outEl.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
  if (missing.length) {&lt;br /&gt;
    var m = document.createElement(&amp;quot;p&amp;quot;); m.className = &amp;quot;nvk-miss&amp;quot;;&lt;br /&gt;
    m.textContent = T(&amp;quot;Bitte noch auswählen: &amp;quot;, &amp;quot;Please still select: &amp;quot;) + missing.map(function (f) { return LT(f, &amp;quot;label&amp;quot;); }).join(&amp;quot;, &amp;quot;);&lt;br /&gt;
    outEl.appendChild(m); $(&amp;quot;nvk-form&amp;quot;).style.display = &amp;quot;none&amp;quot;; return;&lt;br /&gt;
  }&lt;br /&gt;
  $(&amp;quot;nvk-form&amp;quot;).style.display = &amp;quot;&amp;quot;;&lt;br /&gt;
  var veh = vehicleOf(sel.vehicle);&lt;br /&gt;
  var rbase = LANG === &amp;quot;en&amp;quot; ? SHOP_EN + &amp;quot;bmw-head-units/&amp;quot; : SHOP + &amp;quot;bmw-radios/&amp;quot;;&lt;br /&gt;
  var ru = veh.noCat ? rbase : rbase + (LANG === &amp;quot;en&amp;quot; ? enSlug(veh.v) : veh.v) + &amp;quot;/&amp;quot;;&lt;br /&gt;
  heading(T(&amp;quot;Passende Radios&amp;quot;, &amp;quot;Matching radios&amp;quot;));&lt;br /&gt;
  outEl.appendChild(card({ t: T(&amp;quot;BMW Radios für &amp;quot; + veh.t, &amp;quot;BMW radios for &amp;quot; + vname(veh)), d: T(&amp;quot;Alle Radios, die für Deinen BMW &amp;quot; + veh.t + &amp;quot; im Shop erhältlich sind.&amp;quot;, &amp;quot;All radios available in the shop for your BMW &amp;quot; + vname(veh) + &amp;quot;.&amp;quot;),&lt;br /&gt;
    u: ru, ut: T(&amp;quot;Zu den passenden Radios →&amp;quot;, &amp;quot;To the matching radios →&amp;quot;), w: rbase, wt: T(&amp;quot;Alle BMW Radios&amp;quot;, &amp;quot;All BMW radios&amp;quot;) }, &amp;quot;rad&amp;quot;));&lt;br /&gt;
  renderRadioList(veh);&lt;br /&gt;
  var needs = [], hints = [], seen = {};&lt;br /&gt;
  RULES.forEach(function (r) {&lt;br /&gt;
    if (!match(r.when, s)) return;&lt;br /&gt;
    if (r.opts) { if (!r.opts.every(function (o) { return st.on[o]; })) return; }&lt;br /&gt;
    if (r.type === &amp;quot;need&amp;quot;) (r.items || []).forEach(function (id) { if (!seen[id]) { seen[id] = 1; needs.push(ITEMS[id]); } });&lt;br /&gt;
    else hints.push(LT(r, &amp;quot;html&amp;quot;));&lt;br /&gt;
  });&lt;br /&gt;
  heading(T(&amp;quot;Das brauchst Du&amp;quot;, &amp;quot;What you need&amp;quot;));&lt;br /&gt;
  if (needs.length) needs.forEach(function (i) { outEl.appendChild(card(i)); });&lt;br /&gt;
  else { var n = document.createElement(&amp;quot;p&amp;quot;); n.textContent = T(&amp;quot;Für die Grundinstallation sind keine zusätzlichen Verlängerungen oder Adapter nötig.&amp;quot;, &amp;quot;No additional extensions or adapters are needed for the basic installation.&amp;quot;); outEl.appendChild(n); }&lt;br /&gt;
  var opt = [];&lt;br /&gt;
  OPTS.forEach(function (o) {&lt;br /&gt;
    if (!st.on[o.id]) return;&lt;br /&gt;
    if (!optVisible(o, s, st.on)) return;&lt;br /&gt;
    o.items.forEach(function (id) {&lt;br /&gt;
      if (seen[id]) return;&lt;br /&gt;
      var sk = ITEMS[id].skipIf;&lt;br /&gt;
      if (sk) { if (seen[sk]) return; }&lt;br /&gt;
      seen[id] = 1; opt.push(ITEMS[id]);&lt;br /&gt;
    });&lt;br /&gt;
  });&lt;br /&gt;
  if (opt.length) { heading(T(&amp;quot;Deine Zusatzoptionen&amp;quot;, &amp;quot;Your additional options&amp;quot;)); opt.forEach(function (i) { outEl.appendChild(card(i, &amp;quot;opt&amp;quot;)); }); }&lt;br /&gt;
  if (hints.length) {&lt;br /&gt;
    heading(T(&amp;quot;Hinweise&amp;quot;, &amp;quot;Notes&amp;quot;));&lt;br /&gt;
    hints.forEach(function (t) { var d = document.createElement(&amp;quot;div&amp;quot;); d.className = &amp;quot;nvk-note&amp;quot;; d.innerHTML = fmt(t); outEl.appendChild(d); });&lt;br /&gt;
  }&lt;br /&gt;
  var L = [T(&amp;quot;KONFIGURATION&amp;quot;, &amp;quot;CONFIGURATION&amp;quot;), &amp;quot;Language: &amp;quot; + LANG];&lt;br /&gt;
  FIELDS.forEach(function (f) {&lt;br /&gt;
    if (!sel[f.id]) return;&lt;br /&gt;
    var v = f.values.filter(function (x) { return x.v === sel[f.id]; })[0];&lt;br /&gt;
    if (v) L.push(&amp;quot;- &amp;quot; + LT(f, &amp;quot;label&amp;quot;) + &amp;quot;: &amp;quot; + LT(v, &amp;quot;t&amp;quot;));&lt;br /&gt;
  });&lt;br /&gt;
  L.push(&amp;quot;&amp;quot;, T(&amp;quot;BENÖTIGT&amp;quot;, &amp;quot;REQUIRED&amp;quot;));&lt;br /&gt;
  needs.forEach(function (i) { L.push(&amp;quot;- &amp;quot; + LT(i, &amp;quot;t&amp;quot;) + (itemUrl(i) ? &amp;quot;  &amp;quot; + itemUrl(i) : &amp;quot;&amp;quot;)); });&lt;br /&gt;
  if (opt.length) { L.push(&amp;quot;&amp;quot;, T(&amp;quot;ZUSATZOPTIONEN&amp;quot;, &amp;quot;ADDITIONAL OPTIONS&amp;quot;)); opt.forEach(function (i) { L.push(&amp;quot;- &amp;quot; + LT(i, &amp;quot;t&amp;quot;) + (itemUrl(i) ? &amp;quot;  &amp;quot; + itemUrl(i) : &amp;quot;&amp;quot;)); }); }&lt;br /&gt;
  L.push(&amp;quot;&amp;quot;, &amp;quot;Radios: &amp;quot; + ru);&lt;br /&gt;
  summary = L.join(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  cartBlock(needs, opt);&lt;br /&gt;
}&lt;br /&gt;
function update() { renderFields(); renderOpts(); renderResult(); }&lt;br /&gt;
function capText() { $(&amp;quot;nvk-capq&amp;quot;).textContent = T(&amp;quot;Sicherheitsfrage: Was ist &amp;quot;, &amp;quot;Security question: What is &amp;quot;) + capA + &amp;quot; + &amp;quot; + capB + &amp;quot;? *&amp;quot;; }&lt;br /&gt;
function newCaptcha() {&lt;br /&gt;
  capA = 1 + Math.floor(Math.random() * 9); capB = 1 + Math.floor(Math.random() * 9);&lt;br /&gt;
  capText(); $(&amp;quot;nvk-cap&amp;quot;).value = &amp;quot;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
function status(msg, ok) { var e = $(&amp;quot;nvk-status&amp;quot;); e.style.display = &amp;quot;&amp;quot;; e.textContent = msg; e.style.borderLeftColor = ok ? &amp;quot;#14866d&amp;quot; : &amp;quot;#d33&amp;quot;; }&lt;br /&gt;
$(&amp;quot;nvk-send&amp;quot;).addEventListener(&amp;quot;click&amp;quot;, function () {&lt;br /&gt;
  var name = $(&amp;quot;nvk-name&amp;quot;).value.trim(), mail = $(&amp;quot;nvk-mail&amp;quot;).value.trim(), vin = $(&amp;quot;nvk-vin&amp;quot;).value.trim().toUpperCase(), msg = $(&amp;quot;nvk-msg&amp;quot;).value.trim();&lt;br /&gt;
  if (!name || !mail || !msg) return status(T(&amp;quot;Bitte Name, E-Mail und Kommentar ausfüllen.&amp;quot;, &amp;quot;Please fill in name, email and comment.&amp;quot;), false);&lt;br /&gt;
  if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(mail)) return status(T(&amp;quot;Bitte eine gültige E-Mail-Adresse eingeben.&amp;quot;, &amp;quot;Please enter a valid email address.&amp;quot;), false);&lt;br /&gt;
  if (vin) { if (!/^[A-Z]{2}[0-9]{5}$/.test(vin)) { if (!/^[A-HJ-NPR-Z0-9]{17}$/.test(vin)) return status(T(&amp;quot;Bitte die VIN im Format AB12345 oder die 17-stellige FGN eingeben - oder das Feld leer lassen.&amp;quot;, &amp;quot;Please enter the VIN as AB12345 or the full 17-character VIN - or leave the field empty.&amp;quot;), false); } }&lt;br /&gt;
  if (parseInt($(&amp;quot;nvk-cap&amp;quot;).value, 10) !== capA + capB) return status(T(&amp;quot;Die Sicherheitsfrage wurde nicht richtig beantwortet.&amp;quot;, &amp;quot;The security question was not answered correctly.&amp;quot;), false);&lt;br /&gt;
  if (!$(&amp;quot;nvk-dsgvo&amp;quot;).checked) return status(T(&amp;quot;Bitte der Verarbeitung Deiner Daten zustimmen.&amp;quot;, &amp;quot;Please agree to the processing of your data.&amp;quot;), false);&lt;br /&gt;
  if ($(&amp;quot;nvk-hp&amp;quot;).value) return;&lt;br /&gt;
  var sz = $(&amp;quot;nvk-size&amp;quot;).value;&lt;br /&gt;
  var rad = chosenRadio ? &amp;quot;\n\n&amp;quot; + T(&amp;quot;GEWÄHLTES RADIO&amp;quot;, &amp;quot;SELECTED RADIO&amp;quot;) + &amp;quot;\n- &amp;quot; + chosenRadio.type + &amp;quot;  &amp;quot; + chosenRadio.url : &amp;quot;&amp;quot;;&lt;br /&gt;
  var sum2 = summary + rad + (sz ? &amp;quot;\n\n&amp;quot; + T(&amp;quot;Gewünschte Displaygröße: &amp;quot;, &amp;quot;Desired display size: &amp;quot;) + sz : &amp;quot;&amp;quot;);&lt;br /&gt;
  var text = &amp;quot;Name: &amp;quot; + name + &amp;quot;\n&amp;quot; + T(&amp;quot;E-Mail: &amp;quot;, &amp;quot;Email: &amp;quot;) + mail + &amp;quot;\nVIN: &amp;quot; + (vin || &amp;quot;-&amp;quot;) + &amp;quot;\n\n&amp;quot; + T(&amp;quot;Kommentar:&amp;quot;, &amp;quot;Comment:&amp;quot;) + &amp;quot;\n&amp;quot; + msg + &amp;quot;\n\n&amp;quot; + sum2;&lt;br /&gt;
  if (SEND_URL) {&lt;br /&gt;
    var p = new URLSearchParams();&lt;br /&gt;
    p.append(&amp;quot;name&amp;quot;, name); p.append(&amp;quot;mail&amp;quot;, mail); p.append(&amp;quot;vin&amp;quot;, vin); p.append(&amp;quot;msg&amp;quot;, msg); p.append(&amp;quot;summary&amp;quot;, sum2);&lt;br /&gt;
    p.append(&amp;quot;hp&amp;quot;, $(&amp;quot;nvk-hp&amp;quot;).value); p.append(&amp;quot;ca&amp;quot;, capA); p.append(&amp;quot;cb&amp;quot;, capB); p.append(&amp;quot;cv&amp;quot;, $(&amp;quot;nvk-cap&amp;quot;).value); p.append(&amp;quot;lang&amp;quot;, LANG);&lt;br /&gt;
    fetch(SEND_URL, { method: &amp;quot;POST&amp;quot;, body: p }).then(function (r) {&lt;br /&gt;
      if (!r.ok) throw new Error(&amp;quot;send&amp;quot;);&lt;br /&gt;
      status(T(&amp;quot;Danke! Deine Anfrage wurde gesendet, eine Kopie geht an &amp;quot; + mail + &amp;quot;.&amp;quot;, &amp;quot;Thank you! Your request has been sent, a copy goes to &amp;quot; + mail + &amp;quot;.&amp;quot;), true); newCaptcha();&lt;br /&gt;
    }).catch(function () { status(T(&amp;quot;Das Senden hat nicht geklappt. Bitte versuche es später noch einmal oder schreibe direkt an &amp;quot; + MAIL_TO + &amp;quot;.&amp;quot;, &amp;quot;Sending failed. Please try again later or write directly to &amp;quot; + MAIL_TO + &amp;quot;.&amp;quot;), false); });&lt;br /&gt;
  } else {&lt;br /&gt;
    window.location.href = &amp;quot;mailto:&amp;quot; + MAIL_TO + &amp;quot;?cc=&amp;quot; + encodeURIComponent(mail) + AMP + &amp;quot;subject=&amp;quot; + encodeURIComponent(T(MAIL_SUBJECT, MAIL_SUBJECT_EN)) + AMP + &amp;quot;body=&amp;quot; + encodeURIComponent(text);&lt;br /&gt;
    status(T(&amp;quot;Dein E-Mail-Programm wurde mit der fertigen Anfrage geöffnet. Bitte dort noch auf Senden klicken.&amp;quot;, &amp;quot;Your email program was opened with the finished request. Please click Send there.&amp;quot;), true);&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
$(&amp;quot;nvk-reset&amp;quot;).addEventListener(&amp;quot;click&amp;quot;, function () { sel = {}; picked = {}; chosenRadio = null; update(); });&lt;br /&gt;
function renderLegal() {&lt;br /&gt;
  var le = $(&amp;quot;nvk-legal-links&amp;quot;), dl = $(&amp;quot;nvk-dslink&amp;quot;), first = true;&lt;br /&gt;
  le.innerHTML = &amp;quot;&amp;quot;; dl.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
  [ [&amp;quot;agb&amp;quot;, T(&amp;quot;AGB&amp;quot;, &amp;quot;Terms and conditions&amp;quot;)], [&amp;quot;widerruf&amp;quot;, T(&amp;quot;Widerrufsbelehrung&amp;quot;, &amp;quot;Right of withdrawal&amp;quot;)], [&amp;quot;datenschutz&amp;quot;, T(&amp;quot;Datenschutzerklärung&amp;quot;, &amp;quot;Privacy policy&amp;quot;)] ].forEach(function (x) {&lt;br /&gt;
    var key = x[0], url = LANG === &amp;quot;en&amp;quot; ? (LEGAL_EN[key] || LEGAL[key]) : LEGAL[key];&lt;br /&gt;
    if (!url) return;&lt;br /&gt;
    if (!first) le.appendChild(document.createTextNode(&amp;quot; | &amp;quot;));&lt;br /&gt;
    first = false; le.appendChild(link(url, x[1]));&lt;br /&gt;
    if (key === &amp;quot;datenschutz&amp;quot;) {&lt;br /&gt;
      dl.appendChild(document.createTextNode(&amp;quot; (&amp;quot;)); dl.appendChild(link(url, x[1])); dl.appendChild(document.createTextNode(&amp;quot;)&amp;quot;));&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
function applyStatic() {&lt;br /&gt;
  Array.prototype.forEach.call(document.querySelectorAll(&amp;quot;#nvk [data-en]&amp;quot;), function (e) {&lt;br /&gt;
    if (e.getAttribute(&amp;quot;data-de&amp;quot;) === null) e.setAttribute(&amp;quot;data-de&amp;quot;, e.textContent);&lt;br /&gt;
    e.textContent = LANG === &amp;quot;en&amp;quot; ? e.getAttribute(&amp;quot;data-en&amp;quot;) : e.getAttribute(&amp;quot;data-de&amp;quot;);&lt;br /&gt;
  });&lt;br /&gt;
  Array.prototype.forEach.call(document.querySelectorAll(&amp;quot;#nvk [data-en-ph]&amp;quot;), function (e) {&lt;br /&gt;
    if (e.getAttribute(&amp;quot;data-de-ph&amp;quot;) === null) e.setAttribute(&amp;quot;data-de-ph&amp;quot;, e.placeholder);&lt;br /&gt;
    e.placeholder = LANG === &amp;quot;en&amp;quot; ? e.getAttribute(&amp;quot;data-en-ph&amp;quot;) : e.getAttribute(&amp;quot;data-de-ph&amp;quot;);&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
function markLang() {&lt;br /&gt;
  [&amp;quot;de&amp;quot;, &amp;quot;en&amp;quot;].forEach(function (l) {&lt;br /&gt;
    var b = $(&amp;quot;nvk-lang-&amp;quot; + l);&lt;br /&gt;
    b.style.fontWeight = LANG === l ? &amp;quot;700&amp;quot; : &amp;quot;400&amp;quot;;&lt;br /&gt;
    b.style.borderColor = LANG === l ? &amp;quot;#f26522&amp;quot; : &amp;quot;#a2a9b1&amp;quot;;&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
function setLang(l) {&lt;br /&gt;
  LANG = l;&lt;br /&gt;
  try { localStorage.setItem(&amp;quot;nvk-lang&amp;quot;, l); } catch (e) { }&lt;br /&gt;
  markLang(); applyStatic(); renderLegal(); capText(); update();&lt;br /&gt;
}&lt;br /&gt;
[&amp;quot;de&amp;quot;, &amp;quot;en&amp;quot;].forEach(function (l) {&lt;br /&gt;
  var b = document.createElement(&amp;quot;button&amp;quot;); b.type = &amp;quot;button&amp;quot;; b.className = &amp;quot;nvk-btn&amp;quot;; b.id = &amp;quot;nvk-lang-&amp;quot; + l;&lt;br /&gt;
  b.textContent = l.toUpperCase(); b.style.marginLeft = &amp;quot;6px&amp;quot;; b.style.padding = &amp;quot;3px 12px&amp;quot;;&lt;br /&gt;
  b.addEventListener(&amp;quot;click&amp;quot;, function () { setLang(l); });&lt;br /&gt;
  $(&amp;quot;nvk-lang&amp;quot;).appendChild(b);&lt;br /&gt;
});&lt;br /&gt;
(function () {&lt;br /&gt;
  var m = location.search.match(/[?\x26](?:uselang|lang)=(\w+)/), l = m ? m[1].toLowerCase() : &amp;quot;&amp;quot;;&lt;br /&gt;
  if (!l) { try { l = localStorage.getItem(&amp;quot;nvk-lang&amp;quot;) || &amp;quot;&amp;quot;; } catch (e) { l = &amp;quot;&amp;quot;; } }&lt;br /&gt;
  if (l === &amp;quot;en&amp;quot; || l === &amp;quot;de&amp;quot;) LANG = l;&lt;br /&gt;
})();&lt;br /&gt;
markLang(); applyStatic(); renderLegal();&lt;br /&gt;
newCaptcha();&lt;br /&gt;
update();&lt;br /&gt;
})();&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;Stand: 21.10.2026&amp;lt;/small&amp;gt;&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andre</name></author>
	</entry>
	<entry>
		<id>https://xtrons.ibus-app.de/index.php?title=Android_Radio_Konfigurator&amp;diff=4094</id>
		<title>Android Radio Konfigurator</title>
		<link rel="alternate" type="text/html" href="https://xtrons.ibus-app.de/index.php?title=Android_Radio_Konfigurator&amp;diff=4094"/>
		<updated>2026-10-22T11:46:56Z</updated>

		<summary type="html">&lt;p&gt;Andre: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt; '''Mit diesem Tool kann auf Basis von Fahrzeug und vorhandenen Komponenten eine Liste nötiger Komponenten erstellt werden.&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;big&amp;gt;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.&amp;lt;br&amp;gt;'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
#nvk{max-width:900px;line-height:1.45}&lt;br /&gt;
#nvk *{box-sizing:border-box}&lt;br /&gt;
#nvk .nvk-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:14px;margin:12px 0}&lt;br /&gt;
#nvk .nvk-f label{display:block;font-weight:700;margin-bottom:4px}&lt;br /&gt;
#nvk select{width:100%;padding:9px 8px;font:inherit;color:#202122;background:#fff;border:1px solid #a2a9b1;border-radius:4px}&lt;br /&gt;
#nvk .nvk-help{font-size:.85em;opacity:.75;margin-top:3px}&lt;br /&gt;
#nvk fieldset{border:1px solid rgba(128,128,128,.45);border-radius:6px;padding:10px 14px;margin:14px 0}&lt;br /&gt;
#nvk legend{font-weight:700;padding:0 6px}&lt;br /&gt;
#nvk .nvk-o{display:block;padding:4px 0;cursor:pointer}&lt;br /&gt;
#nvk .nvk-o small{opacity:.7}&lt;br /&gt;
#nvk .nvk-o.dis{opacity:.75;cursor:default}&lt;br /&gt;
#nvk .nvk-btn{padding:7px 14px;font:inherit;border:1px solid #a2a9b1;border-radius:4px;background:#f8f9fa;color:#202122;cursor:pointer}&lt;br /&gt;
#nvk #nvk-out{margin-top:18px}&lt;br /&gt;
#nvk h3{margin:18px 0 8px}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-card.opt{border-left-color:#14866d}&lt;br /&gt;
#nvk .nvk-card.rad{border-left-color:#fff;background:rgba(255,255,255,.08)}&lt;br /&gt;
#nvk .nvk-card b{display:block}&lt;br /&gt;
#nvk .nvk-links{margin-top:4px;font-weight:600}&lt;br /&gt;
#nvk .nvk-links a{margin-right:14px}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-miss{opacity:.8;font-style:italic}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-card .nvk-img{max-width:230px;max-height:150px}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-card.hl{border:2px solid #36c;border-left-width:8px;background:rgba(51,102,204,.12);padding:12px 14px}&lt;br /&gt;
#nvk .nvk-card.hl b{font-size:1.1em}&lt;br /&gt;
#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)}&lt;br /&gt;
#nvk .nvk-row label{flex:1;margin:0;min-width:240px}&lt;br /&gt;
#nvk .nvk-row a{white-space:nowrap;font-weight:600}&lt;br /&gt;
#nvk .nvk-img.wide{max-width:min(100%,460px);max-height:none}&lt;br /&gt;
#nvk #nvk-form{margin-top:22px}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-grid&amp;quot; id=&amp;quot;nvk-fields&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;fieldset id=&amp;quot;nvk-optset&amp;quot;&amp;gt;&amp;lt;legend&amp;gt;Zusatzoptionen&amp;lt;/legend&amp;gt;&amp;lt;div id=&amp;quot;nvk-opts&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/fieldset&amp;gt;&lt;br /&gt;
&amp;lt;button type=&amp;quot;button&amp;quot; class=&amp;quot;nvk-btn&amp;quot; id=&amp;quot;nvk-reset&amp;quot;&amp;gt;Auswahl zurücksetzen&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk-out&amp;quot; aria-live=&amp;quot;polite&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;fieldset id=&amp;quot;nvk-form&amp;quot; style=&amp;quot;display:none&amp;quot;&amp;gt;&amp;lt;legend&amp;gt;Anfrage senden&amp;lt;/legend&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;nvk-help&amp;quot;&amp;gt;Deine Auswahl und die Liste oben werden automatisch mitgesendet. Alle Felder mit * sind Pflicht.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-grid&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-name&amp;quot;&amp;gt;Name *&amp;lt;/label&amp;gt;&amp;lt;input id=&amp;quot;nvk-name&amp;quot; type=&amp;quot;text&amp;quot; autocomplete=&amp;quot;name&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-mail&amp;quot;&amp;gt;E-Mail *&amp;lt;/label&amp;gt;&amp;lt;input id=&amp;quot;nvk-mail&amp;quot; type=&amp;quot;email&amp;quot; autocomplete=&amp;quot;email&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-size&amp;quot;&amp;gt;Gewünschte Displaygröße (optional)&amp;lt;/label&amp;gt;&amp;lt;select id=&amp;quot;nvk-size&amp;quot;&amp;gt;&amp;lt;option value=&amp;quot;&amp;quot;&amp;gt;Keine Angabe / Beratung gewünscht&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;7&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;8.8&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;9&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;10.25&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;12.3&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;14.9&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;Andere Größe (bitte im Kommentar nennen)&amp;lt;/option&amp;gt;&amp;lt;/select&amp;gt;&amp;lt;div class=&amp;quot;nvk-help&amp;quot;&amp;gt;Diagonale in Zoll. Nicht jede Größe gibt es für jede Baureihe, das prüfen wir für Dich.&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-vin&amp;quot;&amp;gt;VIN oder FGN (optional)&amp;lt;/label&amp;gt;&amp;lt;input id=&amp;quot;nvk-vin&amp;quot; type=&amp;quot;text&amp;quot; maxlength=&amp;quot;17&amp;quot; placeholder=&amp;quot;AB12345 oder 17-stellige FGN&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-msg&amp;quot;&amp;gt;Kommentar *&amp;lt;/label&amp;gt;&amp;lt;textarea id=&amp;quot;nvk-msg&amp;quot; rows=&amp;quot;4&amp;quot;&amp;gt;&amp;lt;/textarea&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot; style=&amp;quot;max-width:300px&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-cap&amp;quot; id=&amp;quot;nvk-capq&amp;quot;&amp;gt;Sicherheitsfrage *&amp;lt;/label&amp;gt;&amp;lt;input id=&amp;quot;nvk-cap&amp;quot; type=&amp;quot;text&amp;quot; inputmode=&amp;quot;numeric&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;input id=&amp;quot;nvk-hp&amp;quot; type=&amp;quot;text&amp;quot; tabindex=&amp;quot;-1&amp;quot; autocomplete=&amp;quot;off&amp;quot; aria-hidden=&amp;quot;true&amp;quot; style=&amp;quot;position:absolute;left:-9999px;width:1px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;label class=&amp;quot;nvk-o&amp;quot;&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; id=&amp;quot;nvk-dsgvo&amp;quot;&amp;gt; Ich stimme zu, dass meine Angaben zur Bearbeitung der Anfrage per E-Mail verarbeitet werden.&amp;lt;span id=&amp;quot;nvk-dslink&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; *&amp;lt;/label&amp;gt;&lt;br /&gt;
&amp;lt;button type=&amp;quot;button&amp;quot; class=&amp;quot;nvk-btn&amp;quot; id=&amp;quot;nvk-send&amp;quot;&amp;gt;Anfrage senden&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk-status&amp;quot; class=&amp;quot;nvk-note&amp;quot; style=&amp;quot;display:none&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/fieldset&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk-legal&amp;quot; class=&amp;quot;nvk-help&amp;quot; style=&amp;quot;margin-top:20px&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Hinweis:&amp;lt;/b&amp;gt; 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.&amp;lt;div id=&amp;quot;nvk-legal-links&amp;quot; style=&amp;quot;margin-top:4px&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;noscript&amp;gt;Für den Konfigurator wird JavaScript benötigt.&amp;lt;/noscript&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
(function () {&lt;br /&gt;
&amp;quot;use strict&amp;quot;;&lt;br /&gt;
/* =====================================================================&lt;br /&gt;
   KONFIGURATION - hier wird gepflegt.&lt;br /&gt;
   Textformat in Hinweisen: [b]fett[/b]  [br] Zeilenumbruch  [a=URL]Linktext[/a]&lt;br /&gt;
   Bitte im Skript KEIN kaufmännisches Und, kein Kleiner-/Größer-Zeichen&lt;br /&gt;
   und keine Leerzeilen verwenden (das Wiki wandelt sie um).&lt;br /&gt;
   ===================================================================== */&lt;br /&gt;
var SHOP = &amp;quot;https://shop.ibus-app.de/&amp;quot;;&lt;br /&gt;
var WIKI = &amp;quot;https://wiki.ibus-app.de/index.php?title=&amp;quot;;&lt;br /&gt;
/* Bilder aus dem Wiki (Thumbnail-Adressen; Klick öffnet automatisch das Originalbild) */&lt;br /&gt;
var IM = &amp;quot;https://xtrons.ibus-app.de/images/thumb/&amp;quot;;&lt;br /&gt;
var P = {&lt;br /&gt;
  schema:  IM + &amp;quot;e/ea/BMW_E39_Verl%C3%A4ngerungen_EXL005%2BFAKRA_.png/135px-BMW_E39_Verl%C3%A4ngerungen_EXL005%2BFAKRA_.png&amp;quot;,&lt;br /&gt;
  exl005:  IM + &amp;quot;7/70/Exl005-1.webp/257px-Exl005-1.webp.png&amp;quot;,&lt;br /&gt;
  fakra6m: IM + &amp;quot;d/d8/FM-extension_01_1.png/270px-FM-extension_01_1.png&amp;quot;,&lt;br /&gt;
  isofakra: IM + &amp;quot;4/4e/ISO-FAKRA_1.png/270px-ISO-FAKRA_1.png&amp;quot;,&lt;br /&gt;
  bm24:    IM + &amp;quot;8/82/BM24.png/130px-BM24.png&amp;quot;,&lt;br /&gt;
  iso:     IM + &amp;quot;d/dd/Iso.jpg/69px-Iso.jpg&amp;quot;,&lt;br /&gt;
  bm54:    IM + &amp;quot;3/34/BM54.png/135px-BM54.png&amp;quot;,&lt;br /&gt;
  fakra:   IM + &amp;quot;b/b3/Fakra.jpg/100px-Fakra.jpg&amp;quot;,&lt;br /&gt;
  pfeil:   IM + &amp;quot;e/ee/Navi_E46.jpg/239px-Navi_E46.jpg&amp;quot;,&lt;br /&gt;
  noquad:  IM + &amp;quot;6/68/No_elongation.jpg/180px-No_elongation.jpg&amp;quot;,&lt;br /&gt;
  noexl6:  IM + &amp;quot;7/7b/No_EXL006.jpg/180px-No_EXL006.jpg&amp;quot;,&lt;br /&gt;
  halter:  IM + &amp;quot;3/3b/Halter_Alu.webp/92px-Halter_Alu.webp.png&amp;quot;,&lt;br /&gt;
  deepobd: &amp;quot;https://xtrons.ibus-app.de/images/d/d4/DeepOBD_Interface_1.png&amp;quot;,&lt;br /&gt;
  n43:     IM + &amp;quot;e/e4/Navi4_3.jpg/240px-Navi4_3.jpg&amp;quot;,&lt;br /&gt;
  n169:    IM + &amp;quot;8/8a/Navi16_9.jpg/240px-Navi16_9.jpg&amp;quot;,&lt;br /&gt;
  radio:   IM + &amp;quot;9/96/E39_Radio.jpg/240px-E39_Radio.jpg&amp;quot;,&lt;br /&gt;
  idrive:  &amp;quot;https://xtrons.ibus-app.de/images/0/02/MASK-CCC-CIC-NBT-EVO-iDrive.jpg&amp;quot;,&lt;br /&gt;
  iris:    &amp;quot;https://xtrons.ibus-app.de/images/b/be/BusinessKas_IRISG.jpg&amp;quot;,&lt;br /&gt;
  resler:  &amp;quot;https://xtrons.ibus-app.de/images/d/d1/Resler_Modul_01.png&amp;quot;,&lt;br /&gt;
  can:     &amp;quot;https://xtrons.ibus-app.de/images/6/69/CAN_Interface.png&amp;quot;,&lt;br /&gt;
  funktr:  IM + &amp;quot;7/7e/E46_Funktionstraeger.png/240px-E46_Funktionstraeger.png&amp;quot;&lt;br /&gt;
};&lt;br /&gt;
/* Anfrage-Formular: MAIL_TO = Empfänger. SEND_URL leer = E-Mail-Programm des Kunden öffnen (mailto).&lt;br /&gt;
   SEND_URL = Adresse des Server-Skripts send-anfrage.php = Versand direkt vom Server (mit CC an den Kunden). */&lt;br /&gt;
var MAIL_TO = &amp;quot;info@ibus-app.de&amp;quot;;&lt;br /&gt;
var MAIL_SUBJECT = &amp;quot;Anfrage aus Android Radio Konfigurator&amp;quot;;&lt;br /&gt;
var SEND_URL = &amp;quot;https://xtrons.ibus-app.de/send-anfrage.php&amp;quot;;&lt;br /&gt;
/* Shop-Anbindung: API = radios.php (liefert Radio-Liste und Artikelnummern). Warenkorb = Shopware-Link pro Artikelnummer. */&lt;br /&gt;
var API = &amp;quot;https://xtrons.ibus-app.de/radios.php&amp;quot;;&lt;br /&gt;
/* 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. */&lt;br /&gt;
var CART_TRANSFER = true;&lt;br /&gt;
/* Ziel der Übergabe: Shop-Controller aus Plugin 1.1.0 (serverseitig, unabhängig vom Browser-Cache).&lt;br /&gt;
   Älterer Weg über das Theme-Skript: var TRANSFER_URL = CART + &amp;quot;?nvk=&amp;quot;;  */&lt;br /&gt;
var TRANSFER_URL = &amp;quot;https://shop.ibus-app.de/nvk?add=&amp;quot;;&lt;br /&gt;
var CART = &amp;quot;https://shop.ibus-app.de/checkout/cart&amp;quot;;&lt;br /&gt;
/* Rechtliche Seiten (Links unter dem Konfigurator und beim Datenschutz-Haken). Leer = Link wird nicht angezeigt. */&lt;br /&gt;
var LEGAL = { agb: &amp;quot;https://shop.ibus-app.de/allgemeine-geschaeftsbedingungen&amp;quot;, widerruf: &amp;quot;https://shop.ibus-app.de/widerrufsrecht&amp;quot;, datenschutz: &amp;quot;https://shop.ibus-app.de/datenschutz&amp;quot; };&lt;br /&gt;
/* ---- 1) Baureihen --------------------------------------------------------&lt;br /&gt;
   v = Shop-Kategorie (Link: SHOP + bmw-radios/ + v + /)&lt;br /&gt;
   gen: alt = I-BUS-Fahrzeuge (E38/E39/E46/E53/E83)&lt;br /&gt;
        b   = M-ASK / CCC / CIC     c = CIC / NBT / NBT EVO&lt;br /&gt;
   body = Karosserieformen (siehe BODY)                                      */&lt;br /&gt;
var BODY = { limo: &amp;quot;Limousine&amp;quot;, touring: &amp;quot;Touring&amp;quot;, coupe: &amp;quot;Coupé&amp;quot;, cabrio: &amp;quot;Cabrio&amp;quot;, schraeg: &amp;quot;Schrägheck&amp;quot;,&lt;br /&gt;
  compact: &amp;quot;Compact&amp;quot;, gt: &amp;quot;Gran Turismo&amp;quot;, gc: &amp;quot;Gran Coupé&amp;quot;, suv: &amp;quot;SUV / SAV&amp;quot;, roadster: &amp;quot;Roadster&amp;quot; };&lt;br /&gt;
var VEHICLES = [&lt;br /&gt;
  { v: &amp;quot;1er-e8x&amp;quot;, t: &amp;quot;1er E8x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;schraeg,coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;1er-f2x&amp;quot;, t: &amp;quot;1er F2x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;schraeg&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;2er-f2x&amp;quot;, t: &amp;quot;2er F2x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;3er-e46&amp;quot;, t: &amp;quot;3er E46&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;limo,touring,coupe,cabrio,compact&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;3er-e9x&amp;quot;, t: &amp;quot;3er E9x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;limo,touring,coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;3er-f3x&amp;quot;, t: &amp;quot;3er F3x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;limo,touring,gt&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;4er-f3x&amp;quot;, t: &amp;quot;4er F3x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;coupe,cabrio,gc&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;5er-e39&amp;quot;, t: &amp;quot;5er E39&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;limo,touring&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;5er-e6x&amp;quot;, t: &amp;quot;5er E6x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;limo,touring&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;5er-f1x&amp;quot;, t: &amp;quot;5er F1x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;limo,touring,gt&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;6er-e6x&amp;quot;, t: &amp;quot;6er E6x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;7er-e38&amp;quot;, t: &amp;quot;7er E38&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;limo&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;7er-e65&amp;quot;, t: &amp;quot;7er E65&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;limo&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;7er-f01&amp;quot;, t: &amp;quot;7er F01&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;limo&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x1-e84&amp;quot;, t: &amp;quot;X1 E84&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x1-f48&amp;quot;, t: &amp;quot;X1 F48&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x3-e83&amp;quot;, t: &amp;quot;X3 E83&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x3-f25&amp;quot;, t: &amp;quot;X3 F25&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x5-e53&amp;quot;, t: &amp;quot;X5 E53&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x5-e70&amp;quot;, t: &amp;quot;X5 E70&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x5-f15&amp;quot;, t: &amp;quot;X5 F15&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x6-e71&amp;quot;, t: &amp;quot;X6 E71&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;z4-e85e86&amp;quot;, t: &amp;quot;Z4 E85/E86&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;roadster,coupe&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;z4-e89&amp;quot;, t: &amp;quot;Z4 E89&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;roadster&amp;quot;, noCat: true }&lt;br /&gt;
];&lt;br /&gt;
/* Fahrzeuge mit K-CAN App (Beta) */&lt;br /&gt;
var KCAN = [&amp;quot;1er-e8x&amp;quot;, &amp;quot;3er-e9x&amp;quot;, &amp;quot;5er-e6x&amp;quot;, &amp;quot;6er-e6x&amp;quot;, &amp;quot;7er-e65&amp;quot;, &amp;quot;x1-e84&amp;quot;, &amp;quot;x5-e70&amp;quot;, &amp;quot;x6-e71&amp;quot;, &amp;quot;z4-e89&amp;quot;];&lt;br /&gt;
var bodyValues = Object.keys(BODY).map(function (k) {&lt;br /&gt;
  return { v: k, t: BODY[k], only: { vehicle: VEHICLES.filter(function (x) { return x.body.split(&amp;quot;,&amp;quot;).indexOf(k) !== -1; }).map(function (x) { return x.v; }) } };&lt;br /&gt;
});&lt;br /&gt;
/* ---- 2) Auswahlfelder ------------------------------------------------------&lt;br /&gt;
   only = Wert nur anbieten, wenn Bedingung passt   show = Feld nur dann zeigen&lt;br /&gt;
   optional = muss nicht gewählt werden             auto = bei nur einem Wert vorwählen */&lt;br /&gt;
var FIELDS = [&lt;br /&gt;
  { id: &amp;quot;vehicle&amp;quot;, label: &amp;quot;Fahrzeug&amp;quot;, values: VEHICLES.map(function (x) { return { v: x.v, t: &amp;quot;BMW &amp;quot; + x.t }; }) },&lt;br /&gt;
  { id: &amp;quot;factory&amp;quot;, label: &amp;quot;Verbaut ab Werk&amp;quot;, pre: { when: { gen: [&amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;] }, html: &amp;quot;[b]So erkennst Du Dein System:[/b][br][imgw=&amp;quot; + P.idrive + &amp;quot;]&amp;quot; }, values: [&lt;br /&gt;
    { v: &amp;quot;iris&amp;quot;,  t: &amp;quot;Radio mit IRIS&amp;quot;, only: { vehicle: [&amp;quot;3er-e46&amp;quot;, &amp;quot;5er-e39&amp;quot;, &amp;quot;7er-e38&amp;quot;, &amp;quot;x5-e53&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.iris + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;mid&amp;quot;,   t: &amp;quot;Radio mit MID&amp;quot;,  only: { gen: [&amp;quot;alt&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.radio + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;n43&amp;quot;,   t: &amp;quot;4:3 Navi&amp;quot;,       only: { vehicle: [&amp;quot;5er-e39&amp;quot;, &amp;quot;7er-e38&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.n43 + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;n169&amp;quot;,  t: &amp;quot;16:9 Navi&amp;quot;,      only: { gen: [&amp;quot;alt&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.n169 + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;pfeil&amp;quot;, t: &amp;quot;Pfeilnavi&amp;quot;,      only: { vehicle: [&amp;quot;3er-e46&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.pfeil + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;mask&amp;quot;,  t: &amp;quot;M-ASK&amp;quot;,          only: { gen: [&amp;quot;b&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;ccc&amp;quot;,   t: &amp;quot;CCC&amp;quot;,            only: { gen: [&amp;quot;b&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;cic&amp;quot;,   t: &amp;quot;CIC&amp;quot;,            only: { gen: [&amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;nbt&amp;quot;,   t: &amp;quot;NBT&amp;quot;,            only: { gen: [&amp;quot;c&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;nbtevo&amp;quot;, t: &amp;quot;NBT EVO&amp;quot;,       only: { gen: [&amp;quot;c&amp;quot;] } } ] },&lt;br /&gt;
  { id: &amp;quot;trunk&amp;quot;, label: &amp;quot;Wo sitzt das Radiomodul des Pfeilnavis?&amp;quot;, optional: true, show: { factory: [&amp;quot;pfeil&amp;quot;] },&lt;br /&gt;
    help: &amp;quot;Bitte prüfen: Sitzt das Modul im Kofferraum, oder im Pfeilnavi selbst (Quadlock hinten neben dem Antennenstecker)?[br][img=&amp;quot; + P.pfeil + &amp;quot;]&amp;quot;,&lt;br /&gt;
    values: [&lt;br /&gt;
    { v: &amp;quot;ja&amp;quot;, t: &amp;quot;Im Kofferraum (Verlängerungen nötig)&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;nein&amp;quot;, t: &amp;quot;Im Pfeilnavi, Quadlock hinten (keine Verlängerung)&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;unk&amp;quot;, t: &amp;quot;Weiß ich nicht&amp;quot; } ] },&lt;br /&gt;
  { id: &amp;quot;aux&amp;quot;, label: &amp;quot;AUX-IN verfügbar?&amp;quot;, show: { gen: [&amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;] }, values: [&lt;br /&gt;
    { v: &amp;quot;ja&amp;quot;, t: &amp;quot;Ja&amp;quot; }, { v: &amp;quot;nein&amp;quot;, t: &amp;quot;Nein&amp;quot; } ] },&lt;br /&gt;
  { id: &amp;quot;sound&amp;quot;, label: &amp;quot;Soundsystem&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;stereo&amp;quot;, t: &amp;quot;Stereo&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;hifi&amp;quot;,   t: &amp;quot;Hifi&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;dsp&amp;quot;,    t: &amp;quot;DSP&amp;quot;, only: { vehicle: [&amp;quot;7er-e38&amp;quot;, &amp;quot;5er-e39&amp;quot;, &amp;quot;x5-e53&amp;quot;, &amp;quot;x3-e83&amp;quot;] }, info: &amp;quot;[a=&amp;quot; + WIKI + &amp;quot;Habe_ich_DSP%3F]Habe ich DSP?[/a]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;hk&amp;quot;,     t: &amp;quot;Harman Kardon&amp;quot;, only: { vehicle: [&amp;quot;3er-e46&amp;quot;, &amp;quot;z4-e85e86&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;logic7&amp;quot;, t: &amp;quot;Logic7&amp;quot;, only: { vehicle: [&amp;quot;3er-e9x&amp;quot;, &amp;quot;5er-e6x&amp;quot;, &amp;quot;6er-e6x&amp;quot;, &amp;quot;7er-e65&amp;quot;, &amp;quot;1er-e8x&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;hksur&amp;quot;,  t: &amp;quot;Harman Kardon Surround&amp;quot;, only: { vehicle: [&amp;quot;1er-f2x&amp;quot;, &amp;quot;2er-f2x&amp;quot;, &amp;quot;3er-f3x&amp;quot;, &amp;quot;4er-f3x&amp;quot;, &amp;quot;5er-f1x&amp;quot;] } } ] },&lt;br /&gt;
  { id: &amp;quot;current&amp;quot;, label: &amp;quot;Aktuell verbaut&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;werk&amp;quot;, t: &amp;quot;Werksradio / Werksnavi&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;nach&amp;quot;, t: &amp;quot;Nachrüst-Radio / -Navi&amp;quot; } ] },&lt;br /&gt;
  { id: &amp;quot;body&amp;quot;, label: &amp;quot;Karosserie&amp;quot;, auto: true, values: bodyValues },&lt;br /&gt;
  { id: &amp;quot;ant&amp;quot;, label: &amp;quot;Antennenstecker am Radio (optional)&amp;quot;, optional: true, def: &amp;quot;unk&amp;quot;,&lt;br /&gt;
    show: { vehicle: [&amp;quot;7er-e38&amp;quot;, &amp;quot;5er-e39&amp;quot;, &amp;quot;3er-e46&amp;quot;, &amp;quot;x5-e53&amp;quot;] },&lt;br /&gt;
    values: [&lt;br /&gt;
    { v: &amp;quot;unk&amp;quot;,   t: &amp;quot;Weiß ich nicht&amp;quot;, info: &amp;quot;[b]BM24[/b] (Rundpin) = ISO-Antennenstecker:[br][img=&amp;quot; + P.bm24 + &amp;quot;][img=&amp;quot; + P.iso + &amp;quot;][br][b]BM54[/b] = FAKRA:[br][img=&amp;quot; + P.bm54 + &amp;quot;][img=&amp;quot; + P.fakra + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;iso&amp;quot;,   t: &amp;quot;ISO (BM24, Rundpin)&amp;quot;, info: &amp;quot;[img=&amp;quot; + P.bm24 + &amp;quot;][img=&amp;quot; + P.iso + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;fakra&amp;quot;, t: &amp;quot;FAKRA (BM54)&amp;quot;, info: &amp;quot;[img=&amp;quot; + P.bm54 + &amp;quot;][img=&amp;quot; + P.fakra + &amp;quot;]&amp;quot; } ] }&lt;br /&gt;
];&lt;br /&gt;
/* ---- 3) Zusatzoptionen (Mehrfachauswahl) ---------------------------------&lt;br /&gt;
   show = nur sichtbar wenn Bedingung passt   requires = nur sichtbar wenn diese Optionen gewählt sind&lt;br /&gt;
   excl = Optionen derselben Gruppe schließen sich aus   items = Artikel aus ITEMS */&lt;br /&gt;
var OPTS = [&lt;br /&gt;
  { id: &amp;quot;halter&amp;quot;,  t: &amp;quot;Radio-Halter&amp;quot;, sub: &amp;quot;nur BMW E39&amp;quot;, show: { vehicle: [&amp;quot;5er-e39&amp;quot;] }, items: [&amp;quot;halter&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;ibus&amp;quot;,    t: &amp;quot;I-BUS App&amp;quot;, show: { gen: [&amp;quot;alt&amp;quot;] }, items: [&amp;quot;ibus&amp;quot;, &amp;quot;resler&amp;quot;, &amp;quot;bclic&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;deepobd&amp;quot;, t: &amp;quot;DeepOBD (Diagnose)&amp;quot;, items: [&amp;quot;deepobd&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;can&amp;quot;,     t: &amp;quot;CAN Interface&amp;quot;, sub: &amp;quot;Addon - nur mit I-BUS App&amp;quot;, show: { gen: [&amp;quot;alt&amp;quot;] }, requires: [&amp;quot;ibus&amp;quot;], items: [&amp;quot;can&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;kcan&amp;quot;,    t: &amp;quot;K-CAN App (Beta)&amp;quot;, sub: &amp;quot;Pendant zur I-BUS App&amp;quot;, show: { vehicle: KCAN }, items: [&amp;quot;kcan&amp;quot;, &amp;quot;kcanlic&amp;quot;, &amp;quot;can&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;tpms&amp;quot;,    t: &amp;quot;TPMS (Reifendruck)&amp;quot;, items: [&amp;quot;tpms&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;dab1&amp;quot;,    t: &amp;quot;DAB+ (Single Receiver)&amp;quot;, excl: &amp;quot;dab&amp;quot;, items: [&amp;quot;dab1&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;dab2&amp;quot;,    t: &amp;quot;DAB+ (Dual Receiver)&amp;quot;,   excl: &amp;quot;dab&amp;quot;, items: [&amp;quot;dab2&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;rcam&amp;quot;,    t: &amp;quot;Rückfahrkamera&amp;quot;, items: [&amp;quot;rcam&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;fcam&amp;quot;,    t: &amp;quot;Front-Kamera&amp;quot;, items: [&amp;quot;fcam&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;tool&amp;quot;,    t: &amp;quot;Einbau-Werkzeug (Kunststoffheber)&amp;quot;, items: [&amp;quot;tool&amp;quot;] }&lt;br /&gt;
];&lt;br /&gt;
/* Erzwungene Optionen (werden automatisch gesetzt und gesperrt) */&lt;br /&gt;
var FORCED = [&lt;br /&gt;
  { when: { sound: [&amp;quot;dsp&amp;quot;] }, opts: [&amp;quot;ibus&amp;quot;], why: &amp;quot;wegen DSP erforderlich&amp;quot; }&lt;br /&gt;
];&lt;br /&gt;
/* ---- 4) Artikel ------------------------------------------------------------&lt;br /&gt;
   u = Shop-Link (ut = Linktext)   w = Wiki-Link (wt = Linktext)   leer = kein Link&lt;br /&gt;
   skipIf = Artikel entfällt, wenn der genannte Artikel schon in der Liste steht */&lt;br /&gt;
var ITEMS = {&lt;br /&gt;
  exl005:  { t: &amp;quot;Verlängerung EXL005&amp;quot;, d: &amp;quot;Ersetzt das Radiomodul im Kofferraum.&amp;quot;, u: SHOP + &amp;quot;detail/index/sArticle/212/&amp;quot;, img: [P.exl005, P.schema] },&lt;br /&gt;
  fakra6m: { t: &amp;quot;Verlängerung 6 m FAKRA(m) auf FAKRA(f), gewinkelt&amp;quot;, d: &amp;quot;Antennenverlängerung vom Kofferraum nach vorn.&amp;quot;, img: [P.fakra6m],&lt;br /&gt;
             u: SHOP + &amp;quot;shop/zubehoer/adapterkabel/192/verlaengerung-6m-fakra-m-auf-fakra-f-kurz-gewinkelt&amp;quot; },&lt;br /&gt;
  isoada:  { t: &amp;quot;Adapter ISO-Stecker auf FAKRA, gewinkelt (15 cm)&amp;quot;, d: &amp;quot;Nötig bei ISO-Antennenstecker (BM24, Rundpin).&amp;quot;, img: [P.isofakra],&lt;br /&gt;
             u: SHOP + &amp;quot;shop/zubehoer/adapterkabel/193/adapter-kabel-iso-f-auf-fakra-f-kurz-gewinkelt-15cm&amp;quot; },&lt;br /&gt;
  bcdsp:   { t: &amp;quot;I-BUS App - BC+DSP Lizenz&amp;quot;, d: &amp;quot;Ohne DSP-Lizenz arbeitet das Werks-DSP nicht.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/lizenzen/171/i-bus-app-bc-dsp-lizenz&amp;quot;,&lt;br /&gt;
             w: WIKI + &amp;quot;Habe_ich_DSP%3F&amp;quot;, wt: &amp;quot;Wiki: Habe ich DSP?&amp;quot; },&lt;br /&gt;
  halter:  { t: &amp;quot;Alu-Halter zur Radio-Montage im BMW E39&amp;quot;, d: &amp;quot;Empfohlen bei Radios, die nicht von AVIN stammen.&amp;quot;, img: [P.halter],&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/radiohalter/185/alu-halter-zur-radio-montage-im-bmw-e39&amp;quot; },&lt;br /&gt;
  ibus:    { t: &amp;quot;I-BUS App&amp;quot;, hl: true,&lt;br /&gt;
             d: &amp;quot;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.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;cat/index/sCategory/42&amp;quot;,&lt;br /&gt;
             links: [&lt;br /&gt;
               { u: WIKI + &amp;quot;Was_brauche_ich_um_die_I-BUS_App_nutzen_zu_k%C3%B6nnen%3F&amp;quot;, t: &amp;quot;Wiki: Was brauche ich für die I-BUS App?&amp;quot; },&lt;br /&gt;
               { u: WIKI + &amp;quot;Funktionen&amp;quot;, t: &amp;quot;Liste aller I-BUS App Funktionen (BMW E38|E39|E46|E53|E83)&amp;quot; },&lt;br /&gt;
               { u: WIKI + &amp;quot;Was_geht_beim_BMW_E46_nicht&amp;quot;, t: &amp;quot;Was geht beim BMW E46, E83, E85,.. nicht? (da werkseitig nicht verbaut)&amp;quot; },&lt;br /&gt;
               { u: WIKI + &amp;quot;Funktionseinschr%C3%A4nkungen_nach_Baujahr/Ausstattung/Modell&amp;quot;, t: &amp;quot;Funktionseinschränkungen nach Baujahr/Ausstattung/Modell&amp;quot; } ] },&lt;br /&gt;
  resler:  { t: &amp;quot;Resler USB I-BUS Modul inkl. Anschlusskabel&amp;quot;, d: &amp;quot;Verbindet I-BUS App und Fahrzeug.&amp;quot;, img: [P.resler],&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/interfaces-module/191/resler-usb-i-bus-modul-inkl.-anschlusskabel&amp;quot;,&lt;br /&gt;
             w: &amp;quot;https://wiki.ibus-app.de/index.php?title=Hauptseite#Einbauanleitung_f.C3.BCr_Resler_Modul_und_Resler_Interface&amp;quot;, wt: &amp;quot;Einbauanleitung Resler Modul&amp;quot; },&lt;br /&gt;
  bclic:   { t: &amp;quot;I-BUS App - BC Lizenz&amp;quot;, d: &amp;quot;Schaltet u. a. die BC-Daten der App frei.&amp;quot;, skipIf: &amp;quot;bcdsp&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/lizenzen/167/i-bus-app-bc-lizenz&amp;quot; },&lt;br /&gt;
  deepobd: { t: &amp;quot;Deep OBD OBD-II Bluetooth-Adapter&amp;quot;, d: &amp;quot;Live-Werte auslesen, Fehler lesen und löschen.&amp;quot;, img: [P.deepobd],&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/interfaces-module/258/deep-obd-obd-ii-bluetooth-adapter?c=54&amp;quot;,&lt;br /&gt;
             w: &amp;quot;https://xtrons.ibus-app.de/index.php?title=DeepOBD_-_Adapter_und_App_einrichten&amp;quot;, wt: &amp;quot;Wiki: DeepOBD einrichten&amp;quot; },&lt;br /&gt;
  can:     { t: &amp;quot;CAN-Bus Interface inkl. Anschlusskabel&amp;quot;, d: &amp;quot;Addon, funktioniert nur zusammen mit der I-BUS App bzw. der K-CAN App.&amp;quot;, img: [P.can],&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/interfaces-module/346/can-bus-interface-inkl.-anschlusskabel&amp;quot;,&lt;br /&gt;
             w: WIKI + &amp;quot;Einbauanleitung_CAN-Bus_Interface&amp;quot;, wt: &amp;quot;Einbauanleitung CAN-Bus Interface&amp;quot; },&lt;br /&gt;
  kcan:    { t: &amp;quot;K-CAN App (Beta)&amp;quot;, d: &amp;quot;Pendant zur I-BUS App für Fahrzeuge mit K-CAN, aktuell als Betaversion.&amp;quot;,&lt;br /&gt;
             w: &amp;quot;https://wiki.kcan-app.de/&amp;quot;, wt: &amp;quot;Wiki zur K-CAN App&amp;quot; },&lt;br /&gt;
  kcanlic: { t: &amp;quot;K-CAN App - Lizenz Betaversion&amp;quot;, d: &amp;quot;Beta-Lizenz für die K-CAN App.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/lizenzen/358/k-can-app-lizenz-betaversion&amp;quot; },&lt;br /&gt;
  tpms:    { t: &amp;quot;TPMS - Reifendruckkontrolle&amp;quot;, d: &amp;quot;&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/tpms/&amp;quot; },&lt;br /&gt;
  dab1:    { t: &amp;quot;DAB+ Empfänger inkl. Antenne (Single)&amp;quot;, d: &amp;quot;&amp;quot;, w: &amp;quot;https://xtrons.ibus-app.de/index.php?title=Installation_der_DAB%2B_Antenne&amp;quot;, wt: &amp;quot;Installation der DAB+ Antenne&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/dab/291/dab-empfaenger-inkl.-antenne-usbdab04&amp;quot; },&lt;br /&gt;
  dab2:    { t: &amp;quot;Dual DAB+ Empfänger-Stick inkl. 2 Antennen&amp;quot;, d: &amp;quot;&amp;quot;, w: &amp;quot;https://xtrons.ibus-app.de/index.php?title=Installation_der_DAB%2B_Antenne&amp;quot;, wt: &amp;quot;Installation der DAB+ Antenne&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/dab/391/dual-dab-empfaenger-stick-inkl.-2-antennen-acusbdab05t?c=75&amp;quot; },&lt;br /&gt;
  rcam:    { t: &amp;quot;Rückfahrkamera&amp;quot;, d: &amp;quot;&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/kameras/&amp;quot;, ut: &amp;quot;Kameras im Shop ansehen →&amp;quot; },&lt;br /&gt;
  fcam:    { t: &amp;quot;Front-Kamera&amp;quot;, d: &amp;quot;&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/kameras/&amp;quot;, ut: &amp;quot;Kameras im Shop ansehen →&amp;quot; },&lt;br /&gt;
  tool:    { t: &amp;quot;Einbau-Werkzeug (Kunststoffheber)&amp;quot;, d: &amp;quot;Zum schonenden Lösen der Verkleidungen.&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/einbauwerkzeug/&amp;quot; }&lt;br /&gt;
};&lt;br /&gt;
/* ---- 5) Regeln --------------------------------------------------------------&lt;br /&gt;
   type: need (Das brauchst Du) oder hint (Hinweise)   when = Bedingung auf die Felder&lt;br /&gt;
   opts = diese Zusatzoptionen müssen gewählt sein      items = Artikel   html = Text&lt;br /&gt;
   Abgeleitete Werte: gen (alt/b/c) und module (ja/nein/unk = Radiomodul im Kofferraum, nur gen alt) */&lt;br /&gt;
var RULES = [&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { current: [&amp;quot;werk&amp;quot;], module: [&amp;quot;ja&amp;quot;] }, items: [&amp;quot;exl005&amp;quot;, &amp;quot;fakra6m&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { current: [&amp;quot;nach&amp;quot;], module: [&amp;quot;ja&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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=&amp;quot; + P.noquad + &amp;quot;][img=&amp;quot; + P.noexl6 + &amp;quot;]&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;ja&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;nein&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;unk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { ant: [&amp;quot;iso&amp;quot;] }, items: [&amp;quot;isoada&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { ant: [&amp;quot;unk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Antennenstecker:[/b] [b]BM24[/b] (Rundpin) = ISO-Antennenstecker, ggf. wird der [a=&amp;quot; + SHOP + &amp;quot;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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { sound: [&amp;quot;dsp&amp;quot;] }, items: [&amp;quot;bcdsp&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { sound: [&amp;quot;dsp&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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=&amp;quot; + WIKI + &amp;quot;Habe_ich_DSP%3F]Habe ich DSP?[/a]&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { sound: [&amp;quot;hk&amp;quot;], gen: [&amp;quot;alt&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Harman Kardon:[/b] Benötigt [b]keine[/b] DSP-Lizenz. Das Remote-Signal (+12 V, wenn Radio an) genügt zum Starten.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { aux: [&amp;quot;nein&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]AUX-IN:[/b] Der AUX-IN muss codiert werden. Optional kann ein FM-Transmitter genutzt werden - das ist nicht empfohlen.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;7er-e38&amp;quot;, &amp;quot;x5-e53&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Montage:[/b] Radios für BMW E38/E53 benötigen keine extra Halterungen.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;5er-e39&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;3er-e46&amp;quot;], factory: [&amp;quot;iris&amp;quot;, &amp;quot;mid&amp;quot;, &amp;quot;pfeil&amp;quot;], current: [&amp;quot;werk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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]&amp;quot; +&lt;br /&gt;
          &amp;quot;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]&amp;quot; +&lt;br /&gt;
          &amp;quot;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=&amp;quot; + P.funktr + &amp;quot;]&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { factory: [&amp;quot;cic&amp;quot;, &amp;quot;nbt&amp;quot;, &amp;quot;nbtevo&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Lichtleiter:[/b] Ggf. vorhandene Lichtleiter (MOST) müssen aus dem BMW-Stecker in den Xtrons-Adapter umgesteckt werden.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { factory: [&amp;quot;mask&amp;quot;, &amp;quot;ccc&amp;quot;, &amp;quot;cic&amp;quot;, &amp;quot;nbt&amp;quot;, &amp;quot;nbtevo&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, opts: [&amp;quot;kcan&amp;quot;], when: {},&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, opts: [&amp;quot;ibus&amp;quot;], when: {},&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: {},&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot; }&lt;br /&gt;
];&lt;br /&gt;
/* =====================================================================&lt;br /&gt;
   PROGRAMMLOGIK&lt;br /&gt;
   ===================================================================== */&lt;br /&gt;
var $ = function (id) { return document.getElementById(id); };&lt;br /&gt;
var sel = {}, picked = {}, summary = &amp;quot;&amp;quot;, capA = 0, capB = 0, radioCache = {}, chosenRadio = null, cartFill = null;&lt;br /&gt;
var fieldsEl = $(&amp;quot;nvk-fields&amp;quot;), optsEl = $(&amp;quot;nvk-opts&amp;quot;), outEl = $(&amp;quot;nvk-out&amp;quot;);&lt;br /&gt;
function full(u) { return u.indexOf(&amp;quot;/thumb/&amp;quot;) === -1 ? u : u.replace(&amp;quot;/thumb/&amp;quot;, &amp;quot;/&amp;quot;).replace(/\/[^\/]+$/, &amp;quot;&amp;quot;); }&lt;br /&gt;
function fmt(t) {&lt;br /&gt;
  return t.replace(/\[imgw=([^\x5D]+)\]/g, function (m, u) {&lt;br /&gt;
    return &amp;quot;\u003Ca href=\&amp;quot;&amp;quot; + full(u) + &amp;quot;\&amp;quot; target=\&amp;quot;_blank\&amp;quot; rel=\&amp;quot;noopener\&amp;quot;\u003E\u003Cimg class=\&amp;quot;nvk-img wide\&amp;quot; src=\&amp;quot;&amp;quot; + u + &amp;quot;\&amp;quot; alt=\&amp;quot;\&amp;quot;\u003E\u003C/a\u003E&amp;quot;;&lt;br /&gt;
  }).replace(/\[img=([^\x5D]+)\]/g, function (m, u) {&lt;br /&gt;
    return &amp;quot;\u003Ca href=\&amp;quot;&amp;quot; + full(u) + &amp;quot;\&amp;quot; target=\&amp;quot;_blank\&amp;quot; rel=\&amp;quot;noopener\&amp;quot;\u003E\u003Cimg class=\&amp;quot;nvk-img\&amp;quot; src=\&amp;quot;&amp;quot; + u + &amp;quot;\&amp;quot; alt=\&amp;quot;\&amp;quot;\u003E\u003C/a\u003E&amp;quot;;&lt;br /&gt;
  }).replace(/\[b\]/g, &amp;quot;\u003Cb\u003E&amp;quot;).replace(/\[\/b\]/g, &amp;quot;\u003C/b\u003E&amp;quot;).replace(/\[br\]/g, &amp;quot;\u003Cbr\u003E&amp;quot;)&lt;br /&gt;
    .replace(/\[a=([^\x5D]+)\]/g, &amp;quot;\u003Ca href=\&amp;quot;$1\&amp;quot; target=\&amp;quot;_blank\&amp;quot; rel=\&amp;quot;noopener\&amp;quot;\u003E&amp;quot;).replace(/\[\/a\]/g, &amp;quot;\u003C/a\u003E&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
function match(cond, s, lenient) {&lt;br /&gt;
  if (!cond) return true;&lt;br /&gt;
  for (var k in cond) {&lt;br /&gt;
    if (!s[k]) { if (lenient) continue; return false; }&lt;br /&gt;
    if (cond[k].indexOf(s[k]) === -1) return false;&lt;br /&gt;
  }&lt;br /&gt;
  return true;&lt;br /&gt;
}&lt;br /&gt;
function vehicleOf(id) { return VEHICLES.filter(function (x) { return x.v === id; })[0]; }&lt;br /&gt;
function derive() {&lt;br /&gt;
  var s = {}, k;&lt;br /&gt;
  for (k in sel) s[k] = sel[k];&lt;br /&gt;
  var veh = vehicleOf(sel.vehicle);&lt;br /&gt;
  if (veh) s.gen = veh.gen;&lt;br /&gt;
  if (s.gen === &amp;quot;alt&amp;quot;) {&lt;br /&gt;
    if (s.factory === &amp;quot;n43&amp;quot; || s.factory === &amp;quot;n169&amp;quot;) s.module = &amp;quot;ja&amp;quot;;&lt;br /&gt;
    else if (s.factory === &amp;quot;iris&amp;quot; || s.factory === &amp;quot;mid&amp;quot;) s.module = &amp;quot;nein&amp;quot;;&lt;br /&gt;
    else if (s.factory === &amp;quot;pfeil&amp;quot;) s.module = s.trunk || &amp;quot;unk&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  return s;&lt;br /&gt;
}&lt;br /&gt;
function forced(s) {&lt;br /&gt;
  var f = {};&lt;br /&gt;
  FORCED.forEach(function (r) { if (match(r.when, s)) r.opts.forEach(function (o) { f[o] = r.why; }); });&lt;br /&gt;
  return f;&lt;br /&gt;
}&lt;br /&gt;
function onSet(s) {&lt;br /&gt;
  var f = forced(s), on = {}, k;&lt;br /&gt;
  for (k in picked) if (picked[k]) on[k] = true;&lt;br /&gt;
  for (k in f) on[k] = true;&lt;br /&gt;
  return { on: on, forced: f };&lt;br /&gt;
}&lt;br /&gt;
function optVisible(o, s, on) {&lt;br /&gt;
  if (!match(o.show, s, true)) return false;&lt;br /&gt;
  return (o.requires || []).every(function (r) { return on[r]; });&lt;br /&gt;
}&lt;br /&gt;
FIELDS.forEach(function (f) {&lt;br /&gt;
  var wrap = document.createElement(&amp;quot;div&amp;quot;); wrap.className = &amp;quot;nvk-f&amp;quot;; wrap.id = &amp;quot;nvk-w-&amp;quot; + f.id;&lt;br /&gt;
  var lab = document.createElement(&amp;quot;label&amp;quot;); lab.htmlFor = &amp;quot;nvk-&amp;quot; + f.id; lab.textContent = f.label;&lt;br /&gt;
  var s = document.createElement(&amp;quot;select&amp;quot;); s.id = &amp;quot;nvk-&amp;quot; + f.id;&lt;br /&gt;
  s.addEventListener(&amp;quot;change&amp;quot;, function () { sel[f.id] = s.value; update(); });&lt;br /&gt;
  wrap.appendChild(lab); wrap.appendChild(s);&lt;br /&gt;
  if (f.help) { var h = document.createElement(&amp;quot;div&amp;quot;); h.className = &amp;quot;nvk-help&amp;quot;; h.innerHTML = fmt(f.help); wrap.appendChild(h); }&lt;br /&gt;
  var inf = document.createElement(&amp;quot;div&amp;quot;); inf.id = &amp;quot;nvk-i-&amp;quot; + f.id; wrap.appendChild(inf);&lt;br /&gt;
  fieldsEl.appendChild(wrap);&lt;br /&gt;
});&lt;br /&gt;
function renderFields() {&lt;br /&gt;
  FIELDS.forEach(function (f) {&lt;br /&gt;
    var s = derive();&lt;br /&gt;
    var wrap = $(&amp;quot;nvk-w-&amp;quot; + f.id), el = $(&amp;quot;nvk-&amp;quot; + f.id);&lt;br /&gt;
    var vis = f.show ? match(f.show, s, false) : true;&lt;br /&gt;
    wrap.style.display = vis ? &amp;quot;&amp;quot; : &amp;quot;none&amp;quot;;&lt;br /&gt;
    if (!vis) { sel[f.id] = &amp;quot;&amp;quot;; return; }&lt;br /&gt;
    var allowed = f.values.filter(function (v) { return match(v.only, s, true); });&lt;br /&gt;
    if (sel[f.id]) { if (!allowed.some(function (v) { return v.v === sel[f.id]; })) sel[f.id] = &amp;quot;&amp;quot;; }&lt;br /&gt;
    if (!sel[f.id]) { if (f.def) sel[f.id] = f.def; }&lt;br /&gt;
    if (!sel[f.id]) { if (f.auto) { if (sel.vehicle) { if (allowed.length === 1) sel[f.id] = allowed[0].v; } } }&lt;br /&gt;
    el.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
    if (!f.def) { var p = document.createElement(&amp;quot;option&amp;quot;); p.value = &amp;quot;&amp;quot;; p.textContent = &amp;quot;– bitte wählen –&amp;quot;; el.appendChild(p); }&lt;br /&gt;
    allowed.forEach(function (v) {&lt;br /&gt;
      var o = document.createElement(&amp;quot;option&amp;quot;); o.value = v.v; o.textContent = v.t; el.appendChild(o);&lt;br /&gt;
    });&lt;br /&gt;
    el.value = sel[f.id] || &amp;quot;&amp;quot;;&lt;br /&gt;
    var cur = allowed.filter(function (v) { return v.v === sel[f.id]; })[0];&lt;br /&gt;
    var pre = f.pre ? (match(f.pre.when, s, false) ? fmt(f.pre.html) : &amp;quot;&amp;quot;) : &amp;quot;&amp;quot;;&lt;br /&gt;
    $(&amp;quot;nvk-i-&amp;quot; + f.id).innerHTML = pre + (cur ? (cur.info ? fmt(cur.info) : &amp;quot;&amp;quot;) : &amp;quot;&amp;quot;);&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
function renderOpts() {&lt;br /&gt;
  var s = derive(), st = onSet(s);&lt;br /&gt;
  OPTS.forEach(function (o) { if (!optVisible(o, s, st.on)) picked[o.id] = false; });&lt;br /&gt;
  st = onSet(s);&lt;br /&gt;
  optsEl.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
  OPTS.forEach(function (o) {&lt;br /&gt;
    if (!optVisible(o, s, st.on)) return;&lt;br /&gt;
    var lab = document.createElement(&amp;quot;label&amp;quot;); lab.className = &amp;quot;nvk-o&amp;quot;;&lt;br /&gt;
    var cb = document.createElement(&amp;quot;input&amp;quot;); cb.type = &amp;quot;checkbox&amp;quot;;&lt;br /&gt;
    cb.checked = !!st.on[o.id];&lt;br /&gt;
    var isForced = !!st.forced[o.id];&lt;br /&gt;
    if (isForced) { cb.disabled = true; lab.className += &amp;quot; dis&amp;quot;; }&lt;br /&gt;
    cb.addEventListener(&amp;quot;change&amp;quot;, function () {&lt;br /&gt;
      picked[o.id] = cb.checked;&lt;br /&gt;
      if (cb.checked) { if (o.excl) OPTS.forEach(function (x) { if (x.excl === o.excl) { if (x.id !== o.id) picked[x.id] = false; } }); }&lt;br /&gt;
      update();&lt;br /&gt;
    });&lt;br /&gt;
    lab.appendChild(cb);&lt;br /&gt;
    lab.appendChild(document.createTextNode(&amp;quot; &amp;quot; + o.t));&lt;br /&gt;
    var sub = [o.sub, isForced ? st.forced[o.id] : &amp;quot;&amp;quot;].filter(Boolean).join(&amp;quot; - &amp;quot;);&lt;br /&gt;
    if (sub) { var sm = document.createElement(&amp;quot;small&amp;quot;); sm.textContent = &amp;quot; (&amp;quot; + sub + &amp;quot;)&amp;quot;; lab.appendChild(sm); }&lt;br /&gt;
    optsEl.appendChild(lab);&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
function link(url, text) {&lt;br /&gt;
  var a = document.createElement(&amp;quot;a&amp;quot;); a.href = url; a.target = &amp;quot;_blank&amp;quot;; a.rel = &amp;quot;noopener&amp;quot;; a.textContent = text; return a;&lt;br /&gt;
}&lt;br /&gt;
function card(item, cls) {&lt;br /&gt;
  var d = document.createElement(&amp;quot;div&amp;quot;); d.className = &amp;quot;nvk-card &amp;quot; + (cls || &amp;quot;&amp;quot;) + (item.hl ? &amp;quot; hl&amp;quot; : &amp;quot;&amp;quot;);&lt;br /&gt;
  var b = document.createElement(&amp;quot;b&amp;quot;); b.textContent = item.t; d.appendChild(b);&lt;br /&gt;
  if (item.d) { var p = document.createElement(&amp;quot;span&amp;quot;); p.textContent = item.d; d.appendChild(p); }&lt;br /&gt;
  if (item.img) {&lt;br /&gt;
    var im = document.createElement(&amp;quot;div&amp;quot;);&lt;br /&gt;
    item.img.forEach(function (u) {&lt;br /&gt;
      var a = document.createElement(&amp;quot;a&amp;quot;); a.href = full(u); a.target = &amp;quot;_blank&amp;quot;; a.rel = &amp;quot;noopener&amp;quot;;&lt;br /&gt;
      var g = document.createElement(&amp;quot;img&amp;quot;); g.className = &amp;quot;nvk-img&amp;quot;; g.src = u; g.alt = item.t; a.appendChild(g); im.appendChild(a);&lt;br /&gt;
    });&lt;br /&gt;
    d.appendChild(im);&lt;br /&gt;
  }&lt;br /&gt;
  if (item.u || item.w) {&lt;br /&gt;
    var l = document.createElement(&amp;quot;div&amp;quot;); l.className = &amp;quot;nvk-links&amp;quot;;&lt;br /&gt;
    if (item.u) l.appendChild(link(item.u, item.ut || &amp;quot;Im Shop ansehen →&amp;quot;));&lt;br /&gt;
    if (item.w) l.appendChild(link(item.w, (item.wt || &amp;quot;Zum Wiki&amp;quot;) + &amp;quot; →&amp;quot;));&lt;br /&gt;
    d.appendChild(l);&lt;br /&gt;
  }&lt;br /&gt;
  if (item.links) item.links.forEach(function (x) {&lt;br /&gt;
    var r = document.createElement(&amp;quot;div&amp;quot;); r.className = &amp;quot;nvk-links&amp;quot;; r.appendChild(link(x.u, x.t + &amp;quot; →&amp;quot;)); d.appendChild(r);&lt;br /&gt;
  });&lt;br /&gt;
  return d;&lt;br /&gt;
}&lt;br /&gt;
function heading(txt) { var h = document.createElement(&amp;quot;h3&amp;quot;); h.textContent = txt; outEl.appendChild(h); }&lt;br /&gt;
function aidOf(u) {&lt;br /&gt;
  if (u.indexOf(SHOP) !== 0) return &amp;quot;&amp;quot;;&lt;br /&gt;
  var m = u.match(/sArticle\/(\d+)/);&lt;br /&gt;
  if (!m) m = u.split(&amp;quot;?&amp;quot;)[0].match(/\/(\d+)\/[^\/]+$/);&lt;br /&gt;
  return m ? m[1] : &amp;quot;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
function renderRadioList(veh) {&lt;br /&gt;
  if (veh.noCat) return;&lt;br /&gt;
  if (chosenRadio) { if (chosenRadio.cat !== veh.v) chosenRadio = null; }&lt;br /&gt;
  var data = radioCache[veh.v];&lt;br /&gt;
  if (data === undefined) {&lt;br /&gt;
    radioCache[veh.v] = &amp;quot;loading&amp;quot;;&lt;br /&gt;
    fetch(API + &amp;quot;?cat=&amp;quot; + encodeURIComponent(veh.v)).then(function (r) { return r.json(); }).then(function (j) {&lt;br /&gt;
      radioCache[veh.v] = (j.items || []).map(function (it) { it.cat = veh.v; return it; });&lt;br /&gt;
      renderResult();&lt;br /&gt;
    }).catch(function () { radioCache[veh.v] = []; renderResult(); });&lt;br /&gt;
  }&lt;br /&gt;
  if (data === undefined || data === &amp;quot;loading&amp;quot;) {&lt;br /&gt;
    var m = document.createElement(&amp;quot;p&amp;quot;); m.className = &amp;quot;nvk-miss&amp;quot;; m.textContent = &amp;quot;Verfügbare Radios werden geladen …&amp;quot;; outEl.appendChild(m); return;&lt;br /&gt;
  }&lt;br /&gt;
  if (!data.length) return;&lt;br /&gt;
  var want = { mask: /M-?ASK/i, ccc: /\bCCC\b/i, cic: /\bCIC\b/i, nbt: /\bNBT\b/i, nbtevo: /EVO/i }[sel.factory];&lt;br /&gt;
  function fits(it) { return want ? want.test(it.name) : false; }&lt;br /&gt;
  var list = data.slice().sort(function (a, b) { return (fits(b) ? 1 : 0) - (fits(a) ? 1 : 0); });&lt;br /&gt;
  var det = document.createElement(&amp;quot;details&amp;quot;); det.open = Math.max(list.length, 8) === 8;&lt;br /&gt;
  var sm = document.createElement(&amp;quot;summary&amp;quot;); sm.style.cursor = &amp;quot;pointer&amp;quot;; sm.style.fontWeight = &amp;quot;700&amp;quot;;&lt;br /&gt;
  sm.textContent = &amp;quot;Verfügbare Radios für Deinen BMW &amp;quot; + veh.t + &amp;quot; (&amp;quot; + list.length + &amp;quot;)&amp;quot;; det.appendChild(sm);&lt;br /&gt;
  list.forEach(function (it) {&lt;br /&gt;
    var row = document.createElement(&amp;quot;div&amp;quot;); row.className = &amp;quot;nvk-row&amp;quot;;&lt;br /&gt;
    var lab = document.createElement(&amp;quot;label&amp;quot;); lab.className = &amp;quot;nvk-o&amp;quot;;&lt;br /&gt;
    var rb = document.createElement(&amp;quot;input&amp;quot;); rb.type = &amp;quot;radio&amp;quot;; rb.name = &amp;quot;nvk-radio&amp;quot;;&lt;br /&gt;
    rb.checked = chosenRadio ? chosenRadio.sku === it.sku : false;&lt;br /&gt;
    rb.addEventListener(&amp;quot;change&amp;quot;, function () { chosenRadio = it; if (cartFill) cartFill(); });&lt;br /&gt;
    lab.appendChild(rb);&lt;br /&gt;
    lab.appendChild(document.createTextNode(&amp;quot; &amp;quot; + it.name + (it.price ? &amp;quot;  -  &amp;quot; + it.price : &amp;quot;&amp;quot;) + (fits(it) ? &amp;quot;  (passt zu Deiner Auswahl)&amp;quot; : &amp;quot;&amp;quot;)));&lt;br /&gt;
    row.appendChild(lab); row.appendChild(link(it.url, &amp;quot;Shop →&amp;quot;));&lt;br /&gt;
    det.appendChild(row);&lt;br /&gt;
  });&lt;br /&gt;
  outEl.appendChild(det);&lt;br /&gt;
}&lt;br /&gt;
function cartBlock(needs, opt) {&lt;br /&gt;
  var items = [];&lt;br /&gt;
  needs.concat(opt).forEach(function (i) { var id = aidOf(i.u || &amp;quot;&amp;quot;); if (id) items.push({ t: i.t, aid: id }); });&lt;br /&gt;
  heading(&amp;quot;In den Warenkorb&amp;quot;);&lt;br /&gt;
  var box = document.createElement(&amp;quot;div&amp;quot;); box.className = &amp;quot;nvk-card opt&amp;quot;;&lt;br /&gt;
  var p = document.createElement(&amp;quot;div&amp;quot;);&lt;br /&gt;
  p.textContent = &amp;quot;Das oben gewählte Radio (falls ausgewählt) und diese Artikel werden direkt im Shop in den Warenkorb gelegt:&amp;quot;;&lt;br /&gt;
  box.appendChild(p);&lt;br /&gt;
  var listEl = document.createElement(&amp;quot;div&amp;quot;); box.appendChild(listEl);&lt;br /&gt;
  cartFill = function () {&lt;br /&gt;
    listEl.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
    var lines = (chosenRadio ? [&amp;quot;Radio: &amp;quot; + chosenRadio.type] : []).concat(items.map(function (x) { return x.t; }));&lt;br /&gt;
    lines.forEach(function (t) { var r = document.createElement(&amp;quot;div&amp;quot;); r.textContent = &amp;quot;- &amp;quot; + t; listEl.appendChild(r); });&lt;br /&gt;
  };&lt;br /&gt;
  cartFill();&lt;br /&gt;
  var n = document.createElement(&amp;quot;div&amp;quot;); n.className = &amp;quot;nvk-help&amp;quot;;&lt;br /&gt;
  n.textContent = &amp;quot;Kameras, TPMS, Werkzeug und Artikel ohne Direktlink wählst Du bitte über die Links oben im Shop aus.&amp;quot;;&lt;br /&gt;
  box.appendChild(n);&lt;br /&gt;
  var all = needs.concat(opt);&lt;br /&gt;
  var has = function (k) { return all.indexOf(ITEMS[k]) !== -1; };&lt;br /&gt;
  var l17 = has(&amp;quot;kcanlic&amp;quot;), l7 = has(&amp;quot;bclic&amp;quot;) || has(&amp;quot;bcdsp&amp;quot;);&lt;br /&gt;
  if (l17 || l7) {&lt;br /&gt;
    var vb = document.createElement(&amp;quot;div&amp;quot;); vb.className = &amp;quot;nvk-f&amp;quot;; vb.style.marginTop = &amp;quot;12px&amp;quot;;&lt;br /&gt;
    var vlab = document.createElement(&amp;quot;label&amp;quot;); vlab.htmlFor = &amp;quot;nvk-licvin&amp;quot;;&lt;br /&gt;
    vlab.textContent = l17 ? &amp;quot;Fahrgestellnummer (17 Zeichen) für die Lizenz&amp;quot; : &amp;quot;VIN für die Lizenz (7 Zeichen, z. B. AB12345)&amp;quot;;&lt;br /&gt;
    var vin = document.createElement(&amp;quot;input&amp;quot;); vin.type = &amp;quot;text&amp;quot;; vin.id = &amp;quot;nvk-licvin&amp;quot;; vin.maxLength = 17;&lt;br /&gt;
    vin.value = $(&amp;quot;nvk-vin&amp;quot;).value.toUpperCase();&lt;br /&gt;
    var ta = document.createElement(&amp;quot;textarea&amp;quot;); ta.rows = 3; ta.readOnly = true; ta.style.display = &amp;quot;none&amp;quot;; ta.style.marginTop = &amp;quot;6px&amp;quot;;&lt;br /&gt;
    var cb = document.createElement(&amp;quot;button&amp;quot;); cb.type = &amp;quot;button&amp;quot;; cb.className = &amp;quot;nvk-btn&amp;quot;; cb.style.marginTop = &amp;quot;6px&amp;quot;;&lt;br /&gt;
    cb.textContent = &amp;quot;Kommentartext für die Kasse kopieren&amp;quot;;&lt;br /&gt;
    var ls = document.createElement(&amp;quot;div&amp;quot;); ls.className = &amp;quot;nvk-help&amp;quot;;&lt;br /&gt;
    cb.addEventListener(&amp;quot;click&amp;quot;, function () {&lt;br /&gt;
      var v = vin.value.trim().toUpperCase(), v7 = &amp;quot;&amp;quot;, v17 = &amp;quot;&amp;quot;;&lt;br /&gt;
      if (/^[A-HJ-NPR-Z0-9]{17}$/.test(v)) { v17 = v; v7 = v.slice(10); }&lt;br /&gt;
      else if (/^[A-Z]{2}[0-9]{5}$/.test(v)) v7 = v;&lt;br /&gt;
      if (l17 ? !v17 : !v7) { ls.textContent = l17 ? &amp;quot;Bitte die vollständige 17-stellige Fahrgestellnummer eingeben.&amp;quot; : &amp;quot;Bitte die VIN im Format AB12345 (oder die 17-stellige FGN) eingeben.&amp;quot;; return; }&lt;br /&gt;
      var L = [];&lt;br /&gt;
      if (has(&amp;quot;bclic&amp;quot;)) L.push(&amp;quot;I-BUS App BC Lizenz: VIN &amp;quot; + v7);&lt;br /&gt;
      if (has(&amp;quot;bcdsp&amp;quot;)) L.push(&amp;quot;I-BUS App BC+DSP Lizenz: VIN &amp;quot; + v7);&lt;br /&gt;
      if (l17) L.push(&amp;quot;K-CAN App Beta Lizenz: FGN &amp;quot; + v17);&lt;br /&gt;
      ta.value = L.join(&amp;quot;\n&amp;quot;); ta.style.display = &amp;quot;&amp;quot;; ta.select();&lt;br /&gt;
      var hint = &amp;quot;Bitte an der Shop-Kasse in das Feld Kommentar einfügen.&amp;quot;;&lt;br /&gt;
      if (navigator.clipboard) navigator.clipboard.writeText(ta.value).then(function () { ls.textContent = &amp;quot;Text kopiert. &amp;quot; + hint; }).catch(function () { ls.textContent = &amp;quot;Bitte den Text markieren und kopieren. &amp;quot; + hint; });&lt;br /&gt;
      else ls.textContent = &amp;quot;Bitte den Text markieren und kopieren. &amp;quot; + hint;&lt;br /&gt;
    });&lt;br /&gt;
    vb.appendChild(vlab); vb.appendChild(vin); vb.appendChild(cb); vb.appendChild(ta); vb.appendChild(ls); box.appendChild(vb);&lt;br /&gt;
  }&lt;br /&gt;
  if (!CART_TRANSFER) { outEl.appendChild(box); return; }&lt;br /&gt;
  var btn = document.createElement(&amp;quot;button&amp;quot;); btn.type = &amp;quot;button&amp;quot;; btn.className = &amp;quot;nvk-btn&amp;quot;; btn.style.marginTop = &amp;quot;8px&amp;quot;;&lt;br /&gt;
  btn.textContent = &amp;quot;Auswahl in den Warenkorb legen&amp;quot;;&lt;br /&gt;
  var st = document.createElement(&amp;quot;div&amp;quot;); st.className = &amp;quot;nvk-help&amp;quot;;&lt;br /&gt;
  btn.addEventListener(&amp;quot;click&amp;quot;, function () { addToCart(items, st); });&lt;br /&gt;
  box.appendChild(btn); box.appendChild(st); outEl.appendChild(box);&lt;br /&gt;
}&lt;br /&gt;
function addToCart(items, st) {&lt;br /&gt;
  var list = items.slice();&lt;br /&gt;
  if (chosenRadio) list.unshift({ t: chosenRadio.type, sku: chosenRadio.sku });&lt;br /&gt;
  if (!list.length) { st.textContent = &amp;quot;Es ist noch nichts zum Bestellen ausgewählt.&amp;quot;; return; }&lt;br /&gt;
  var w = window.open(&amp;quot;&amp;quot;, &amp;quot;_blank&amp;quot;);&lt;br /&gt;
  st.textContent = &amp;quot;Artikelnummern werden ermittelt …&amp;quot;;&lt;br /&gt;
  var ids = list.filter(function (x) { return x.aid; }).map(function (x) { return x.aid; });&lt;br /&gt;
  var get = ids.length ? fetch(API + &amp;quot;?aid=&amp;quot; + ids.join(&amp;quot;,&amp;quot;)).then(function (r) { return r.json(); }).then(function (j) { return j.skus || {}; }) : Promise.resolve({});&lt;br /&gt;
  get.then(function (map) {&lt;br /&gt;
    var skus = [];&lt;br /&gt;
    list.forEach(function (x) { var k = x.sku || map[x.aid]; if (k) skus.push(k); });&lt;br /&gt;
    if (!skus.length) throw new Error(&amp;quot;none&amp;quot;);&lt;br /&gt;
    var url = TRANSFER_URL + encodeURIComponent(skus.join(&amp;quot;,&amp;quot;));&lt;br /&gt;
    if (w) {&lt;br /&gt;
      w.location.href = url;&lt;br /&gt;
      st.textContent = &amp;quot;Der Shop wurde in einem neuen Tab geöffnet (&amp;quot; + skus.length + &amp;quot; von &amp;quot; + list.length + &amp;quot; Artikeln übergeben). Bitte dort den Warenkorb kontrollieren. Ist ein Artikel nicht bestellbar, weist der Shop darauf hin.&amp;quot;;&lt;br /&gt;
    } else {&lt;br /&gt;
      st.textContent = &amp;quot;Der neue Tab wurde blockiert. Bitte Pop-ups erlauben oder diesen Link nutzen: &amp;quot;;&lt;br /&gt;
      st.appendChild(link(url, &amp;quot;Warenkorb im Shop öffnen →&amp;quot;));&lt;br /&gt;
    }&lt;br /&gt;
  }).catch(function () { if (w) w.close(); st.textContent = &amp;quot;Das hat leider nicht geklappt. Bitte nutze die Shop-Links oben.&amp;quot;; });&lt;br /&gt;
}&lt;br /&gt;
function renderResult() {&lt;br /&gt;
  var s = derive(), st = onSet(s);&lt;br /&gt;
  var missing = FIELDS.filter(function (f) {&lt;br /&gt;
    var w = $(&amp;quot;nvk-w-&amp;quot; + f.id);&lt;br /&gt;
    return w.style.display !== &amp;quot;none&amp;quot; ? (!f.optional ? !sel[f.id] : false) : false;&lt;br /&gt;
  });&lt;br /&gt;
  outEl.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
  if (missing.length) {&lt;br /&gt;
    var m = document.createElement(&amp;quot;p&amp;quot;); m.className = &amp;quot;nvk-miss&amp;quot;;&lt;br /&gt;
    m.textContent = &amp;quot;Bitte noch auswählen: &amp;quot; + missing.map(function (f) { return f.label; }).join(&amp;quot;, &amp;quot;);&lt;br /&gt;
    outEl.appendChild(m); $(&amp;quot;nvk-form&amp;quot;).style.display = &amp;quot;none&amp;quot;; return;&lt;br /&gt;
  }&lt;br /&gt;
  $(&amp;quot;nvk-form&amp;quot;).style.display = &amp;quot;&amp;quot;;&lt;br /&gt;
  var veh = vehicleOf(sel.vehicle);&lt;br /&gt;
  var ru = veh.noCat ? SHOP + &amp;quot;bmw-radios/&amp;quot; : SHOP + &amp;quot;bmw-radios/&amp;quot; + veh.v + &amp;quot;/&amp;quot;;&lt;br /&gt;
  heading(&amp;quot;Passende Radios&amp;quot;);&lt;br /&gt;
  outEl.appendChild(card({ t: &amp;quot;BMW Radios für &amp;quot; + veh.t, d: &amp;quot;Alle Radios, die für Deinen BMW &amp;quot; + veh.t + &amp;quot; im Shop erhältlich sind.&amp;quot;,&lt;br /&gt;
    u: ru, ut: &amp;quot;Zu den passenden Radios →&amp;quot;, w: SHOP + &amp;quot;bmw-radios/&amp;quot;, wt: &amp;quot;Alle BMW Radios&amp;quot; }, &amp;quot;rad&amp;quot;));&lt;br /&gt;
  renderRadioList(veh);&lt;br /&gt;
  var needs = [], hints = [], seen = {};&lt;br /&gt;
  RULES.forEach(function (r) {&lt;br /&gt;
    if (!match(r.when, s)) return;&lt;br /&gt;
    if (r.opts) { if (!r.opts.every(function (o) { return st.on[o]; })) return; }&lt;br /&gt;
    if (r.type === &amp;quot;need&amp;quot;) (r.items || []).forEach(function (id) { if (!seen[id]) { seen[id] = 1; needs.push(ITEMS[id]); } });&lt;br /&gt;
    else hints.push(r.html);&lt;br /&gt;
  });&lt;br /&gt;
  heading(&amp;quot;Das brauchst Du&amp;quot;);&lt;br /&gt;
  if (needs.length) needs.forEach(function (i) { outEl.appendChild(card(i)); });&lt;br /&gt;
  else { var n = document.createElement(&amp;quot;p&amp;quot;); n.textContent = &amp;quot;Für die Grundinstallation sind keine zusätzlichen Verlängerungen oder Adapter nötig.&amp;quot;; outEl.appendChild(n); }&lt;br /&gt;
  var opt = [];&lt;br /&gt;
  OPTS.forEach(function (o) {&lt;br /&gt;
    if (!st.on[o.id]) return;&lt;br /&gt;
    if (!optVisible(o, s, st.on)) return;&lt;br /&gt;
    o.items.forEach(function (id) {&lt;br /&gt;
      if (seen[id]) return;&lt;br /&gt;
      var sk = ITEMS[id].skipIf;&lt;br /&gt;
      if (sk) { if (seen[sk]) return; }&lt;br /&gt;
      seen[id] = 1; opt.push(ITEMS[id]);&lt;br /&gt;
    });&lt;br /&gt;
  });&lt;br /&gt;
  if (opt.length) { heading(&amp;quot;Deine Zusatzoptionen&amp;quot;); opt.forEach(function (i) { outEl.appendChild(card(i, &amp;quot;opt&amp;quot;)); }); }&lt;br /&gt;
  if (hints.length) {&lt;br /&gt;
    heading(&amp;quot;Hinweise&amp;quot;);&lt;br /&gt;
    hints.forEach(function (t) { var d = document.createElement(&amp;quot;div&amp;quot;); d.className = &amp;quot;nvk-note&amp;quot;; d.innerHTML = fmt(t); outEl.appendChild(d); });&lt;br /&gt;
  }&lt;br /&gt;
  var L = [&amp;quot;KONFIGURATION&amp;quot;];&lt;br /&gt;
  FIELDS.forEach(function (f) {&lt;br /&gt;
    if (!sel[f.id]) return;&lt;br /&gt;
    var v = f.values.filter(function (x) { return x.v === sel[f.id]; })[0];&lt;br /&gt;
    if (v) L.push(&amp;quot;- &amp;quot; + f.label + &amp;quot;: &amp;quot; + v.t);&lt;br /&gt;
  });&lt;br /&gt;
  L.push(&amp;quot;&amp;quot;, &amp;quot;BENÖTIGT&amp;quot;);&lt;br /&gt;
  needs.forEach(function (i) { L.push(&amp;quot;- &amp;quot; + i.t + (i.u ? &amp;quot;  &amp;quot; + i.u : &amp;quot;&amp;quot;)); });&lt;br /&gt;
  if (opt.length) { L.push(&amp;quot;&amp;quot;, &amp;quot;ZUSATZOPTIONEN&amp;quot;); opt.forEach(function (i) { L.push(&amp;quot;- &amp;quot; + i.t + (i.u ? &amp;quot;  &amp;quot; + i.u : &amp;quot;&amp;quot;)); }); }&lt;br /&gt;
  L.push(&amp;quot;&amp;quot;, &amp;quot;Radios: &amp;quot; + ru);&lt;br /&gt;
  summary = L.join(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  cartBlock(needs, opt);&lt;br /&gt;
}&lt;br /&gt;
function update() { renderFields(); renderOpts(); renderResult(); }&lt;br /&gt;
function newCaptcha() {&lt;br /&gt;
  capA = 1 + Math.floor(Math.random() * 9); capB = 1 + Math.floor(Math.random() * 9);&lt;br /&gt;
  $(&amp;quot;nvk-capq&amp;quot;).textContent = &amp;quot;Sicherheitsfrage: Was ist &amp;quot; + capA + &amp;quot; + &amp;quot; + capB + &amp;quot;? *&amp;quot;; $(&amp;quot;nvk-cap&amp;quot;).value = &amp;quot;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
function status(msg, ok) { var e = $(&amp;quot;nvk-status&amp;quot;); e.style.display = &amp;quot;&amp;quot;; e.textContent = msg; e.style.borderLeftColor = ok ? &amp;quot;#14866d&amp;quot; : &amp;quot;#d33&amp;quot;; }&lt;br /&gt;
$(&amp;quot;nvk-send&amp;quot;).addEventListener(&amp;quot;click&amp;quot;, function () {&lt;br /&gt;
  var name = $(&amp;quot;nvk-name&amp;quot;).value.trim(), mail = $(&amp;quot;nvk-mail&amp;quot;).value.trim(), vin = $(&amp;quot;nvk-vin&amp;quot;).value.trim().toUpperCase(), msg = $(&amp;quot;nvk-msg&amp;quot;).value.trim();&lt;br /&gt;
  if (!name || !mail || !msg) return status(&amp;quot;Bitte Name, E-Mail und Kommentar ausfüllen.&amp;quot;, false);&lt;br /&gt;
  if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(mail)) return status(&amp;quot;Bitte eine gültige E-Mail-Adresse eingeben.&amp;quot;, false);&lt;br /&gt;
  if (vin) { if (!/^[A-Z]{2}[0-9]{5}$/.test(vin)) { if (!/^[A-HJ-NPR-Z0-9]{17}$/.test(vin)) return status(&amp;quot;Bitte die VIN im Format AB12345 oder die 17-stellige FGN eingeben - oder das Feld leer lassen.&amp;quot;, false); } }&lt;br /&gt;
  if (parseInt($(&amp;quot;nvk-cap&amp;quot;).value, 10) !== capA + capB) return status(&amp;quot;Die Sicherheitsfrage wurde nicht richtig beantwortet.&amp;quot;, false);&lt;br /&gt;
  if (!$(&amp;quot;nvk-dsgvo&amp;quot;).checked) return status(&amp;quot;Bitte der Verarbeitung Deiner Daten zustimmen.&amp;quot;, false);&lt;br /&gt;
  if ($(&amp;quot;nvk-hp&amp;quot;).value) return;&lt;br /&gt;
  var sz = $(&amp;quot;nvk-size&amp;quot;).value;&lt;br /&gt;
  var rad = chosenRadio ? &amp;quot;\n\nGEWÄHLTES RADIO\n- &amp;quot; + chosenRadio.type + &amp;quot;  &amp;quot; + chosenRadio.url : &amp;quot;&amp;quot;;&lt;br /&gt;
  var sum2 = summary + rad + (sz ? &amp;quot;\n\nGewünschte Displaygröße: &amp;quot; + sz : &amp;quot;&amp;quot;);&lt;br /&gt;
  var text = &amp;quot;Name: &amp;quot; + name + &amp;quot;\nE-Mail: &amp;quot; + mail + &amp;quot;\nVIN: &amp;quot; + (vin || &amp;quot;-&amp;quot;) + &amp;quot;\n\nKommentar:\n&amp;quot; + msg + &amp;quot;\n\n&amp;quot; + sum2;&lt;br /&gt;
  if (SEND_URL) {&lt;br /&gt;
    var p = new URLSearchParams();&lt;br /&gt;
    p.append(&amp;quot;name&amp;quot;, name); p.append(&amp;quot;mail&amp;quot;, mail); p.append(&amp;quot;vin&amp;quot;, vin); p.append(&amp;quot;msg&amp;quot;, msg); p.append(&amp;quot;summary&amp;quot;, sum2);&lt;br /&gt;
    p.append(&amp;quot;hp&amp;quot;, $(&amp;quot;nvk-hp&amp;quot;).value); p.append(&amp;quot;ca&amp;quot;, capA); p.append(&amp;quot;cb&amp;quot;, capB); p.append(&amp;quot;cv&amp;quot;, $(&amp;quot;nvk-cap&amp;quot;).value);&lt;br /&gt;
    fetch(SEND_URL, { method: &amp;quot;POST&amp;quot;, body: p }).then(function (r) {&lt;br /&gt;
      if (!r.ok) throw new Error(&amp;quot;send&amp;quot;);&lt;br /&gt;
      status(&amp;quot;Danke! Deine Anfrage wurde gesendet, eine Kopie geht an &amp;quot; + mail + &amp;quot;.&amp;quot;, true); newCaptcha();&lt;br /&gt;
    }).catch(function () { status(&amp;quot;Das Senden hat nicht geklappt. Bitte versuche es später noch einmal oder schreibe direkt an &amp;quot; + MAIL_TO + &amp;quot;.&amp;quot;, false); });&lt;br /&gt;
  } else {&lt;br /&gt;
    var AMP = &amp;quot;\u0026&amp;quot;;&lt;br /&gt;
    window.location.href = &amp;quot;mailto:&amp;quot; + MAIL_TO + &amp;quot;?cc=&amp;quot; + encodeURIComponent(mail) + AMP + &amp;quot;subject=&amp;quot; + encodeURIComponent(MAIL_SUBJECT) + AMP + &amp;quot;body=&amp;quot; + encodeURIComponent(text);&lt;br /&gt;
    status(&amp;quot;Dein E-Mail-Programm wurde mit der fertigen Anfrage geöffnet. Bitte dort noch auf Senden klicken.&amp;quot;, true);&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
$(&amp;quot;nvk-reset&amp;quot;).addEventListener(&amp;quot;click&amp;quot;, function () { sel = {}; picked = {}; chosenRadio = null; update(); });&lt;br /&gt;
var legalEl = $(&amp;quot;nvk-legal-links&amp;quot;), firstLink = true;&lt;br /&gt;
[ [&amp;quot;agb&amp;quot;, &amp;quot;AGB&amp;quot;], [&amp;quot;widerruf&amp;quot;, &amp;quot;Widerrufsbelehrung&amp;quot;], [&amp;quot;datenschutz&amp;quot;, &amp;quot;Datenschutzerklärung&amp;quot;] ].forEach(function (x) {&lt;br /&gt;
  var key = x[0];&lt;br /&gt;
  if (!LEGAL[key]) return;&lt;br /&gt;
  if (!firstLink) legalEl.appendChild(document.createTextNode(&amp;quot; | &amp;quot;));&lt;br /&gt;
  firstLink = false; legalEl.appendChild(link(LEGAL[key], x[1]));&lt;br /&gt;
});&lt;br /&gt;
if (LEGAL.datenschutz) {&lt;br /&gt;
  var dl = $(&amp;quot;nvk-dslink&amp;quot;);&lt;br /&gt;
  dl.appendChild(document.createTextNode(&amp;quot; (&amp;quot;)); dl.appendChild(link(LEGAL.datenschutz, &amp;quot;Datenschutzerklärung&amp;quot;)); dl.appendChild(document.createTextNode(&amp;quot;)&amp;quot;));&lt;br /&gt;
}&lt;br /&gt;
newCaptcha();&lt;br /&gt;
update();&lt;br /&gt;
})();&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;Stand: 21.10.2026&amp;lt;/small&amp;gt;&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andre</name></author>
	</entry>
	<entry>
		<id>https://xtrons.ibus-app.de/index.php?title=Android_Radio_Konfigurator&amp;diff=4093</id>
		<title>Android Radio Konfigurator</title>
		<link rel="alternate" type="text/html" href="https://xtrons.ibus-app.de/index.php?title=Android_Radio_Konfigurator&amp;diff=4093"/>
		<updated>2026-10-22T11:38:48Z</updated>

		<summary type="html">&lt;p&gt;Andre: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt; '''Mit diesem Tool kann auf Basis von Fahrzeug und vorhandenen Komponenten eine Liste nötiger Komponenten erstellt werden.&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;big&amp;gt;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.&amp;lt;br&amp;gt;'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
#nvk{max-width:900px;line-height:1.45}&lt;br /&gt;
#nvk *{box-sizing:border-box}&lt;br /&gt;
#nvk .nvk-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:14px;margin:12px 0}&lt;br /&gt;
#nvk .nvk-f label{display:block;font-weight:700;margin-bottom:4px}&lt;br /&gt;
#nvk select{width:100%;padding:9px 8px;font:inherit;color:#202122;background:#fff;border:1px solid #a2a9b1;border-radius:4px}&lt;br /&gt;
#nvk .nvk-help{font-size:.85em;opacity:.75;margin-top:3px}&lt;br /&gt;
#nvk fieldset{border:1px solid rgba(128,128,128,.45);border-radius:6px;padding:10px 14px;margin:14px 0}&lt;br /&gt;
#nvk legend{font-weight:700;padding:0 6px}&lt;br /&gt;
#nvk .nvk-o{display:block;padding:4px 0;cursor:pointer}&lt;br /&gt;
#nvk .nvk-o small{opacity:.7}&lt;br /&gt;
#nvk .nvk-o.dis{opacity:.75;cursor:default}&lt;br /&gt;
#nvk .nvk-btn{padding:7px 14px;font:inherit;border:1px solid #a2a9b1;border-radius:4px;background:#f8f9fa;color:#202122;cursor:pointer}&lt;br /&gt;
#nvk #nvk-out{margin-top:18px}&lt;br /&gt;
#nvk h3{margin:18px 0 8px}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-card.opt{border-left-color:#14866d}&lt;br /&gt;
#nvk .nvk-card.rad{border-left-color:#fff;background:rgba(255,255,255,.08)}&lt;br /&gt;
#nvk .nvk-card b{display:block}&lt;br /&gt;
#nvk .nvk-links{margin-top:4px;font-weight:600}&lt;br /&gt;
#nvk .nvk-links a{margin-right:14px}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-miss{opacity:.8;font-style:italic}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-card .nvk-img{max-width:230px;max-height:150px}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-card.hl{border:2px solid #36c;border-left-width:8px;background:rgba(51,102,204,.12);padding:12px 14px}&lt;br /&gt;
#nvk .nvk-card.hl b{font-size:1.1em}&lt;br /&gt;
#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)}&lt;br /&gt;
#nvk .nvk-row label{flex:1;margin:0;min-width:240px}&lt;br /&gt;
#nvk .nvk-row a{white-space:nowrap;font-weight:600}&lt;br /&gt;
#nvk .nvk-img.wide{max-width:min(100%,460px);max-height:none}&lt;br /&gt;
#nvk #nvk-form{margin-top:22px}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-grid&amp;quot; id=&amp;quot;nvk-fields&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;fieldset id=&amp;quot;nvk-optset&amp;quot;&amp;gt;&amp;lt;legend&amp;gt;Zusatzoptionen&amp;lt;/legend&amp;gt;&amp;lt;div id=&amp;quot;nvk-opts&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/fieldset&amp;gt;&lt;br /&gt;
&amp;lt;button type=&amp;quot;button&amp;quot; class=&amp;quot;nvk-btn&amp;quot; id=&amp;quot;nvk-reset&amp;quot;&amp;gt;Auswahl zurücksetzen&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk-out&amp;quot; aria-live=&amp;quot;polite&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;fieldset id=&amp;quot;nvk-form&amp;quot; style=&amp;quot;display:none&amp;quot;&amp;gt;&amp;lt;legend&amp;gt;Anfrage senden&amp;lt;/legend&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;nvk-help&amp;quot;&amp;gt;Deine Auswahl und die Liste oben werden automatisch mitgesendet. Alle Felder mit * sind Pflicht.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-grid&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-name&amp;quot;&amp;gt;Name *&amp;lt;/label&amp;gt;&amp;lt;input id=&amp;quot;nvk-name&amp;quot; type=&amp;quot;text&amp;quot; autocomplete=&amp;quot;name&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-mail&amp;quot;&amp;gt;E-Mail *&amp;lt;/label&amp;gt;&amp;lt;input id=&amp;quot;nvk-mail&amp;quot; type=&amp;quot;email&amp;quot; autocomplete=&amp;quot;email&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-size&amp;quot;&amp;gt;Gewünschte Displaygröße (optional)&amp;lt;/label&amp;gt;&amp;lt;select id=&amp;quot;nvk-size&amp;quot;&amp;gt;&amp;lt;option value=&amp;quot;&amp;quot;&amp;gt;Keine Angabe / Beratung gewünscht&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;7&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;8.8&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;9&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;10.25&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;12.3&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;14.9&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;Andere Größe (bitte im Kommentar nennen)&amp;lt;/option&amp;gt;&amp;lt;/select&amp;gt;&amp;lt;div class=&amp;quot;nvk-help&amp;quot;&amp;gt;Diagonale in Zoll. Nicht jede Größe gibt es für jede Baureihe, das prüfen wir für Dich.&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-vin&amp;quot;&amp;gt;VIN oder FGN (optional)&amp;lt;/label&amp;gt;&amp;lt;input id=&amp;quot;nvk-vin&amp;quot; type=&amp;quot;text&amp;quot; maxlength=&amp;quot;17&amp;quot; placeholder=&amp;quot;AB12345 oder 17-stellige FGN&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-msg&amp;quot;&amp;gt;Kommentar *&amp;lt;/label&amp;gt;&amp;lt;textarea id=&amp;quot;nvk-msg&amp;quot; rows=&amp;quot;4&amp;quot;&amp;gt;&amp;lt;/textarea&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot; style=&amp;quot;max-width:300px&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-cap&amp;quot; id=&amp;quot;nvk-capq&amp;quot;&amp;gt;Sicherheitsfrage *&amp;lt;/label&amp;gt;&amp;lt;input id=&amp;quot;nvk-cap&amp;quot; type=&amp;quot;text&amp;quot; inputmode=&amp;quot;numeric&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;input id=&amp;quot;nvk-hp&amp;quot; type=&amp;quot;text&amp;quot; tabindex=&amp;quot;-1&amp;quot; autocomplete=&amp;quot;off&amp;quot; aria-hidden=&amp;quot;true&amp;quot; style=&amp;quot;position:absolute;left:-9999px;width:1px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;label class=&amp;quot;nvk-o&amp;quot;&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; id=&amp;quot;nvk-dsgvo&amp;quot;&amp;gt; Ich stimme zu, dass meine Angaben zur Bearbeitung der Anfrage per E-Mail verarbeitet werden.&amp;lt;span id=&amp;quot;nvk-dslink&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; *&amp;lt;/label&amp;gt;&lt;br /&gt;
&amp;lt;button type=&amp;quot;button&amp;quot; class=&amp;quot;nvk-btn&amp;quot; id=&amp;quot;nvk-send&amp;quot;&amp;gt;Anfrage senden&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk-status&amp;quot; class=&amp;quot;nvk-note&amp;quot; style=&amp;quot;display:none&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/fieldset&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk-legal&amp;quot; class=&amp;quot;nvk-help&amp;quot; style=&amp;quot;margin-top:20px&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Hinweis:&amp;lt;/b&amp;gt; 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.&amp;lt;div id=&amp;quot;nvk-legal-links&amp;quot; style=&amp;quot;margin-top:4px&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;noscript&amp;gt;Für den Konfigurator wird JavaScript benötigt.&amp;lt;/noscript&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
(function () {&lt;br /&gt;
&amp;quot;use strict&amp;quot;;&lt;br /&gt;
/* =====================================================================&lt;br /&gt;
   KONFIGURATION - hier wird gepflegt.&lt;br /&gt;
   Textformat in Hinweisen: [b]fett[/b]  [br] Zeilenumbruch  [a=URL]Linktext[/a]&lt;br /&gt;
   Bitte im Skript KEIN kaufmännisches Und, kein Kleiner-/Größer-Zeichen&lt;br /&gt;
   und keine Leerzeilen verwenden (das Wiki wandelt sie um).&lt;br /&gt;
   ===================================================================== */&lt;br /&gt;
var SHOP = &amp;quot;https://shop.ibus-app.de/&amp;quot;;&lt;br /&gt;
var WIKI = &amp;quot;https://wiki.ibus-app.de/index.php?title=&amp;quot;;&lt;br /&gt;
/* Bilder aus dem Wiki (Thumbnail-Adressen; Klick öffnet automatisch das Originalbild) */&lt;br /&gt;
var IM = &amp;quot;https://xtrons.ibus-app.de/images/thumb/&amp;quot;;&lt;br /&gt;
var P = {&lt;br /&gt;
  schema:  IM + &amp;quot;e/ea/BMW_E39_Verl%C3%A4ngerungen_EXL005%2BFAKRA_.png/135px-BMW_E39_Verl%C3%A4ngerungen_EXL005%2BFAKRA_.png&amp;quot;,&lt;br /&gt;
  exl005:  IM + &amp;quot;7/70/Exl005-1.webp/257px-Exl005-1.webp.png&amp;quot;,&lt;br /&gt;
  fakra6m: IM + &amp;quot;d/d8/FM-extension_01_1.png/270px-FM-extension_01_1.png&amp;quot;,&lt;br /&gt;
  isofakra: IM + &amp;quot;4/4e/ISO-FAKRA_1.png/270px-ISO-FAKRA_1.png&amp;quot;,&lt;br /&gt;
  bm24:    IM + &amp;quot;8/82/BM24.png/130px-BM24.png&amp;quot;,&lt;br /&gt;
  iso:     IM + &amp;quot;d/dd/Iso.jpg/69px-Iso.jpg&amp;quot;,&lt;br /&gt;
  bm54:    IM + &amp;quot;3/34/BM54.png/135px-BM54.png&amp;quot;,&lt;br /&gt;
  fakra:   IM + &amp;quot;b/b3/Fakra.jpg/100px-Fakra.jpg&amp;quot;,&lt;br /&gt;
  pfeil:   IM + &amp;quot;e/ee/Navi_E46.jpg/239px-Navi_E46.jpg&amp;quot;,&lt;br /&gt;
  noquad:  IM + &amp;quot;6/68/No_elongation.jpg/180px-No_elongation.jpg&amp;quot;,&lt;br /&gt;
  noexl6:  IM + &amp;quot;7/7b/No_EXL006.jpg/180px-No_EXL006.jpg&amp;quot;,&lt;br /&gt;
  halter:  IM + &amp;quot;3/3b/Halter_Alu.webp/92px-Halter_Alu.webp.png&amp;quot;,&lt;br /&gt;
  deepobd: &amp;quot;https://xtrons.ibus-app.de/images/d/d4/DeepOBD_Interface_1.png&amp;quot;,&lt;br /&gt;
  n43:     IM + &amp;quot;e/e4/Navi4_3.jpg/240px-Navi4_3.jpg&amp;quot;,&lt;br /&gt;
  n169:    IM + &amp;quot;8/8a/Navi16_9.jpg/240px-Navi16_9.jpg&amp;quot;,&lt;br /&gt;
  radio:   IM + &amp;quot;9/96/E39_Radio.jpg/240px-E39_Radio.jpg&amp;quot;,&lt;br /&gt;
  idrive:  &amp;quot;https://xtrons.ibus-app.de/images/0/02/MASK-CCC-CIC-NBT-EVO-iDrive.jpg&amp;quot;,&lt;br /&gt;
  iris:    &amp;quot;https://xtrons.ibus-app.de/images/b/be/BusinessKas_IRISG.jpg&amp;quot;,&lt;br /&gt;
  resler:  &amp;quot;https://xtrons.ibus-app.de/images/d/d1/Resler_Modul_01.png&amp;quot;,&lt;br /&gt;
  can:     &amp;quot;https://xtrons.ibus-app.de/images/6/69/CAN_Interface.png&amp;quot;,&lt;br /&gt;
  funktr:  IM + &amp;quot;7/7e/E46_Funktionstraeger.png/240px-E46_Funktionstraeger.png&amp;quot;&lt;br /&gt;
};&lt;br /&gt;
/* Anfrage-Formular: MAIL_TO = Empfänger. SEND_URL leer = E-Mail-Programm des Kunden öffnen (mailto).&lt;br /&gt;
   SEND_URL = Adresse des Server-Skripts send-anfrage.php = Versand direkt vom Server (mit CC an den Kunden). */&lt;br /&gt;
var MAIL_TO = &amp;quot;info@ibus-app.de&amp;quot;;&lt;br /&gt;
var MAIL_SUBJECT = &amp;quot;Anfrage aus Android Radio Konfigurator&amp;quot;;&lt;br /&gt;
var SEND_URL = &amp;quot;https://xtrons.ibus-app.de/send-anfrage.php&amp;quot;;&lt;br /&gt;
/* Shop-Anbindung: API = radios.php (liefert Radio-Liste und Artikelnummern). Warenkorb = Shopware-Link pro Artikelnummer. */&lt;br /&gt;
var API = &amp;quot;https://xtrons.ibus-app.de/radios.php&amp;quot;;&lt;br /&gt;
/* 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. */&lt;br /&gt;
var CART_TRANSFER = true;&lt;br /&gt;
/* Ziel der Übergabe: Shop-Controller aus Plugin 1.1.0 (serverseitig, unabhängig vom Browser-Cache).&lt;br /&gt;
   Älterer Weg über das Theme-Skript: var TRANSFER_URL = CART + &amp;quot;?nvk=&amp;quot;;  */&lt;br /&gt;
var TRANSFER_URL = &amp;quot;https://shop.ibus-app.de/nvk?add=&amp;quot;;&lt;br /&gt;
var CART = &amp;quot;https://shop.ibus-app.de/checkout/cart&amp;quot;;&lt;br /&gt;
/* Rechtliche Seiten (Links unter dem Konfigurator und beim Datenschutz-Haken). Leer = Link wird nicht angezeigt. */&lt;br /&gt;
var LEGAL = { agb: &amp;quot;https://shop.ibus-app.de/allgemeine-geschaeftsbedingungen&amp;quot;, widerruf: &amp;quot;https://shop.ibus-app.de/widerrufsrecht&amp;quot;, datenschutz: &amp;quot;https://shop.ibus-app.de/datenschutz&amp;quot; };&lt;br /&gt;
/* ---- 1) Baureihen --------------------------------------------------------&lt;br /&gt;
   v = Shop-Kategorie (Link: SHOP + bmw-radios/ + v + /)&lt;br /&gt;
   gen: alt = I-BUS-Fahrzeuge (E38/E39/E46/E53/E83)&lt;br /&gt;
        b   = M-ASK / CCC / CIC     c = CIC / NBT / NBT EVO&lt;br /&gt;
   body = Karosserieformen (siehe BODY)                                      */&lt;br /&gt;
var BODY = { limo: &amp;quot;Limousine&amp;quot;, touring: &amp;quot;Touring&amp;quot;, coupe: &amp;quot;Coupé&amp;quot;, cabrio: &amp;quot;Cabrio&amp;quot;, schraeg: &amp;quot;Schrägheck&amp;quot;,&lt;br /&gt;
  compact: &amp;quot;Compact&amp;quot;, gt: &amp;quot;Gran Turismo&amp;quot;, gc: &amp;quot;Gran Coupé&amp;quot;, suv: &amp;quot;SUV / SAV&amp;quot;, roadster: &amp;quot;Roadster&amp;quot; };&lt;br /&gt;
var VEHICLES = [&lt;br /&gt;
  { v: &amp;quot;1er-e8x&amp;quot;, t: &amp;quot;1er E8x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;schraeg,coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;1er-f2x&amp;quot;, t: &amp;quot;1er F2x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;schraeg&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;2er-f2x&amp;quot;, t: &amp;quot;2er F2x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;3er-e46&amp;quot;, t: &amp;quot;3er E46&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;limo,touring,coupe,cabrio,compact&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;3er-e9x&amp;quot;, t: &amp;quot;3er E9x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;limo,touring,coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;3er-f3x&amp;quot;, t: &amp;quot;3er F3x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;limo,touring,gt&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;4er-f3x&amp;quot;, t: &amp;quot;4er F3x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;coupe,cabrio,gc&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;5er-e39&amp;quot;, t: &amp;quot;5er E39&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;limo,touring&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;5er-e6x&amp;quot;, t: &amp;quot;5er E6x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;limo,touring&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;5er-f1x&amp;quot;, t: &amp;quot;5er F1x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;limo,touring,gt&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;6er-e6x&amp;quot;, t: &amp;quot;6er E6x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;7er-e38&amp;quot;, t: &amp;quot;7er E38&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;limo&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;7er-e65&amp;quot;, t: &amp;quot;7er E65&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;limo&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;7er-f01&amp;quot;, t: &amp;quot;7er F01&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;limo&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x1-e84&amp;quot;, t: &amp;quot;X1 E84&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x1-f48&amp;quot;, t: &amp;quot;X1 F48&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x3-e83&amp;quot;, t: &amp;quot;X3 E83&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x3-f25&amp;quot;, t: &amp;quot;X3 F25&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x5-e53&amp;quot;, t: &amp;quot;X5 E53&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x5-e70&amp;quot;, t: &amp;quot;X5 E70&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x5-f15&amp;quot;, t: &amp;quot;X5 F15&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x6-e71&amp;quot;, t: &amp;quot;X6 E71&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;z4-e85e86&amp;quot;, t: &amp;quot;Z4 E85/E86&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;roadster,coupe&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;z4-e89&amp;quot;, t: &amp;quot;Z4 E89&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;roadster&amp;quot;, noCat: true }&lt;br /&gt;
];&lt;br /&gt;
/* Fahrzeuge mit K-CAN App (Beta) */&lt;br /&gt;
var KCAN = [&amp;quot;1er-e8x&amp;quot;, &amp;quot;3er-e9x&amp;quot;, &amp;quot;5er-e6x&amp;quot;, &amp;quot;6er-e6x&amp;quot;, &amp;quot;7er-e65&amp;quot;, &amp;quot;x1-e84&amp;quot;, &amp;quot;x5-e70&amp;quot;, &amp;quot;x6-e71&amp;quot;, &amp;quot;z4-e89&amp;quot;];&lt;br /&gt;
var bodyValues = Object.keys(BODY).map(function (k) {&lt;br /&gt;
  return { v: k, t: BODY[k], only: { vehicle: VEHICLES.filter(function (x) { return x.body.split(&amp;quot;,&amp;quot;).indexOf(k) !== -1; }).map(function (x) { return x.v; }) } };&lt;br /&gt;
});&lt;br /&gt;
/* ---- 2) Auswahlfelder ------------------------------------------------------&lt;br /&gt;
   only = Wert nur anbieten, wenn Bedingung passt   show = Feld nur dann zeigen&lt;br /&gt;
   optional = muss nicht gewählt werden             auto = bei nur einem Wert vorwählen */&lt;br /&gt;
var FIELDS = [&lt;br /&gt;
  { id: &amp;quot;vehicle&amp;quot;, label: &amp;quot;Fahrzeug&amp;quot;, values: VEHICLES.map(function (x) { return { v: x.v, t: &amp;quot;BMW &amp;quot; + x.t }; }) },&lt;br /&gt;
  { id: &amp;quot;factory&amp;quot;, label: &amp;quot;Verbaut ab Werk&amp;quot;, pre: { when: { gen: [&amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;] }, html: &amp;quot;[b]So erkennst Du Dein System:[/b][br][imgw=&amp;quot; + P.idrive + &amp;quot;]&amp;quot; }, values: [&lt;br /&gt;
    { v: &amp;quot;iris&amp;quot;,  t: &amp;quot;Radio mit IRIS&amp;quot;, only: { vehicle: [&amp;quot;3er-e46&amp;quot;, &amp;quot;5er-e39&amp;quot;, &amp;quot;7er-e38&amp;quot;, &amp;quot;x5-e53&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.iris + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;mid&amp;quot;,   t: &amp;quot;Radio mit MID&amp;quot;,  only: { gen: [&amp;quot;alt&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.radio + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;n43&amp;quot;,   t: &amp;quot;4:3 Navi&amp;quot;,       only: { vehicle: [&amp;quot;5er-e39&amp;quot;, &amp;quot;7er-e38&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.n43 + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;n169&amp;quot;,  t: &amp;quot;16:9 Navi&amp;quot;,      only: { gen: [&amp;quot;alt&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.n169 + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;pfeil&amp;quot;, t: &amp;quot;Pfeilnavi&amp;quot;,      only: { vehicle: [&amp;quot;3er-e46&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.pfeil + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;mask&amp;quot;,  t: &amp;quot;M-ASK&amp;quot;,          only: { gen: [&amp;quot;b&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;ccc&amp;quot;,   t: &amp;quot;CCC&amp;quot;,            only: { gen: [&amp;quot;b&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;cic&amp;quot;,   t: &amp;quot;CIC&amp;quot;,            only: { gen: [&amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;nbt&amp;quot;,   t: &amp;quot;NBT&amp;quot;,            only: { gen: [&amp;quot;c&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;nbtevo&amp;quot;, t: &amp;quot;NBT EVO&amp;quot;,       only: { gen: [&amp;quot;c&amp;quot;] } } ] },&lt;br /&gt;
  { id: &amp;quot;trunk&amp;quot;, label: &amp;quot;Wo sitzt das Radiomodul des Pfeilnavis?&amp;quot;, optional: true, show: { factory: [&amp;quot;pfeil&amp;quot;] },&lt;br /&gt;
    help: &amp;quot;Bitte prüfen: Sitzt das Modul im Kofferraum, oder im Pfeilnavi selbst (Quadlock hinten neben dem Antennenstecker)?[br][img=&amp;quot; + P.pfeil + &amp;quot;]&amp;quot;,&lt;br /&gt;
    values: [&lt;br /&gt;
    { v: &amp;quot;ja&amp;quot;, t: &amp;quot;Im Kofferraum (Verlängerungen nötig)&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;nein&amp;quot;, t: &amp;quot;Im Pfeilnavi, Quadlock hinten (keine Verlängerung)&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;unk&amp;quot;, t: &amp;quot;Weiß ich nicht&amp;quot; } ] },&lt;br /&gt;
  { id: &amp;quot;aux&amp;quot;, label: &amp;quot;AUX-IN verfügbar?&amp;quot;, show: { gen: [&amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;] }, values: [&lt;br /&gt;
    { v: &amp;quot;ja&amp;quot;, t: &amp;quot;Ja&amp;quot; }, { v: &amp;quot;nein&amp;quot;, t: &amp;quot;Nein&amp;quot; } ] },&lt;br /&gt;
  { id: &amp;quot;sound&amp;quot;, label: &amp;quot;Soundsystem&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;stereo&amp;quot;, t: &amp;quot;Stereo&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;hifi&amp;quot;,   t: &amp;quot;Hifi&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;dsp&amp;quot;,    t: &amp;quot;DSP&amp;quot;, only: { vehicle: [&amp;quot;7er-e38&amp;quot;, &amp;quot;5er-e39&amp;quot;, &amp;quot;x5-e53&amp;quot;, &amp;quot;x3-e83&amp;quot;] }, info: &amp;quot;[a=&amp;quot; + WIKI + &amp;quot;Habe_ich_DSP%3F]Habe ich DSP?[/a]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;hk&amp;quot;,     t: &amp;quot;Harman Kardon&amp;quot;, only: { vehicle: [&amp;quot;3er-e46&amp;quot;, &amp;quot;z4-e85e86&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;logic7&amp;quot;, t: &amp;quot;Logic7&amp;quot;, only: { vehicle: [&amp;quot;3er-e9x&amp;quot;, &amp;quot;5er-e6x&amp;quot;, &amp;quot;6er-e6x&amp;quot;, &amp;quot;7er-e65&amp;quot;, &amp;quot;1er-e8x&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;hksur&amp;quot;,  t: &amp;quot;Harman Kardon Surround&amp;quot;, only: { vehicle: [&amp;quot;1er-f2x&amp;quot;, &amp;quot;2er-f2x&amp;quot;, &amp;quot;3er-f3x&amp;quot;, &amp;quot;4er-f3x&amp;quot;, &amp;quot;5er-f1x&amp;quot;] } } ] },&lt;br /&gt;
  { id: &amp;quot;current&amp;quot;, label: &amp;quot;Aktuell verbaut&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;werk&amp;quot;, t: &amp;quot;Werksradio / Werksnavi&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;nach&amp;quot;, t: &amp;quot;Nachrüst-Radio / -Navi&amp;quot; } ] },&lt;br /&gt;
  { id: &amp;quot;body&amp;quot;, label: &amp;quot;Karosserie&amp;quot;, auto: true, values: bodyValues },&lt;br /&gt;
  { id: &amp;quot;ant&amp;quot;, label: &amp;quot;Antennenstecker am Radio (optional)&amp;quot;, optional: true, def: &amp;quot;unk&amp;quot;,&lt;br /&gt;
    show: { vehicle: [&amp;quot;7er-e38&amp;quot;, &amp;quot;5er-e39&amp;quot;, &amp;quot;3er-e46&amp;quot;, &amp;quot;x5-e53&amp;quot;] },&lt;br /&gt;
    values: [&lt;br /&gt;
    { v: &amp;quot;unk&amp;quot;,   t: &amp;quot;Weiß ich nicht&amp;quot;, info: &amp;quot;[b]BM24[/b] (Rundpin) = ISO-Antennenstecker:[br][img=&amp;quot; + P.bm24 + &amp;quot;][img=&amp;quot; + P.iso + &amp;quot;][br][b]BM54[/b] = FAKRA:[br][img=&amp;quot; + P.bm54 + &amp;quot;][img=&amp;quot; + P.fakra + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;iso&amp;quot;,   t: &amp;quot;ISO (BM24, Rundpin)&amp;quot;, info: &amp;quot;[img=&amp;quot; + P.bm24 + &amp;quot;][img=&amp;quot; + P.iso + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;fakra&amp;quot;, t: &amp;quot;FAKRA (BM54)&amp;quot;, info: &amp;quot;[img=&amp;quot; + P.bm54 + &amp;quot;][img=&amp;quot; + P.fakra + &amp;quot;]&amp;quot; } ] }&lt;br /&gt;
];&lt;br /&gt;
/* ---- 3) Zusatzoptionen (Mehrfachauswahl) ---------------------------------&lt;br /&gt;
   show = nur sichtbar wenn Bedingung passt   requires = nur sichtbar wenn diese Optionen gewählt sind&lt;br /&gt;
   excl = Optionen derselben Gruppe schließen sich aus   items = Artikel aus ITEMS */&lt;br /&gt;
var OPTS = [&lt;br /&gt;
  { id: &amp;quot;halter&amp;quot;,  t: &amp;quot;Radio-Halter&amp;quot;, sub: &amp;quot;nur BMW E39&amp;quot;, show: { vehicle: [&amp;quot;5er-e39&amp;quot;] }, items: [&amp;quot;halter&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;ibus&amp;quot;,    t: &amp;quot;I-BUS App&amp;quot;, show: { gen: [&amp;quot;alt&amp;quot;] }, items: [&amp;quot;ibus&amp;quot;, &amp;quot;resler&amp;quot;, &amp;quot;bclic&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;deepobd&amp;quot;, t: &amp;quot;DeepOBD (Diagnose)&amp;quot;, items: [&amp;quot;deepobd&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;can&amp;quot;,     t: &amp;quot;CAN Interface&amp;quot;, sub: &amp;quot;Addon - nur mit I-BUS App&amp;quot;, show: { gen: [&amp;quot;alt&amp;quot;] }, requires: [&amp;quot;ibus&amp;quot;], items: [&amp;quot;can&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;kcan&amp;quot;,    t: &amp;quot;K-CAN App (Beta)&amp;quot;, sub: &amp;quot;Pendant zur I-BUS App&amp;quot;, show: { vehicle: KCAN }, items: [&amp;quot;kcan&amp;quot;, &amp;quot;kcanlic&amp;quot;, &amp;quot;can&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;tpms&amp;quot;,    t: &amp;quot;TPMS (Reifendruck)&amp;quot;, items: [&amp;quot;tpms&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;dab1&amp;quot;,    t: &amp;quot;DAB+ (Single Receiver)&amp;quot;, excl: &amp;quot;dab&amp;quot;, items: [&amp;quot;dab1&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;dab2&amp;quot;,    t: &amp;quot;DAB+ (Dual Receiver)&amp;quot;,   excl: &amp;quot;dab&amp;quot;, items: [&amp;quot;dab2&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;rcam&amp;quot;,    t: &amp;quot;Rückfahrkamera&amp;quot;, items: [&amp;quot;rcam&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;fcam&amp;quot;,    t: &amp;quot;Front-Kamera&amp;quot;, items: [&amp;quot;fcam&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;tool&amp;quot;,    t: &amp;quot;Einbau-Werkzeug (Kunststoffheber)&amp;quot;, items: [&amp;quot;tool&amp;quot;] }&lt;br /&gt;
];&lt;br /&gt;
/* Erzwungene Optionen (werden automatisch gesetzt und gesperrt) */&lt;br /&gt;
var FORCED = [&lt;br /&gt;
  { when: { sound: [&amp;quot;dsp&amp;quot;] }, opts: [&amp;quot;ibus&amp;quot;], why: &amp;quot;wegen DSP erforderlich&amp;quot; }&lt;br /&gt;
];&lt;br /&gt;
/* ---- 4) Artikel ------------------------------------------------------------&lt;br /&gt;
   u = Shop-Link (ut = Linktext)   w = Wiki-Link (wt = Linktext)   leer = kein Link&lt;br /&gt;
   skipIf = Artikel entfällt, wenn der genannte Artikel schon in der Liste steht */&lt;br /&gt;
var ITEMS = {&lt;br /&gt;
  exl005:  { t: &amp;quot;Verlängerung EXL005&amp;quot;, d: &amp;quot;Ersetzt das Radiomodul im Kofferraum.&amp;quot;, u: SHOP + &amp;quot;detail/index/sArticle/212/&amp;quot;, img: [P.exl005, P.schema] },&lt;br /&gt;
  fakra6m: { t: &amp;quot;Verlängerung 6 m FAKRA(m) auf FAKRA(f), gewinkelt&amp;quot;, d: &amp;quot;Antennenverlängerung vom Kofferraum nach vorn.&amp;quot;, img: [P.fakra6m],&lt;br /&gt;
             u: SHOP + &amp;quot;shop/zubehoer/adapterkabel/192/verlaengerung-6m-fakra-m-auf-fakra-f-kurz-gewinkelt&amp;quot; },&lt;br /&gt;
  isoada:  { t: &amp;quot;Adapter ISO-Stecker auf FAKRA, gewinkelt (15 cm)&amp;quot;, d: &amp;quot;Nötig bei ISO-Antennenstecker (BM24, Rundpin).&amp;quot;, img: [P.isofakra],&lt;br /&gt;
             u: SHOP + &amp;quot;shop/zubehoer/adapterkabel/193/adapter-kabel-iso-f-auf-fakra-f-kurz-gewinkelt-15cm&amp;quot; },&lt;br /&gt;
  bcdsp:   { t: &amp;quot;I-BUS App - BC+DSP Lizenz&amp;quot;, d: &amp;quot;Ohne DSP-Lizenz arbeitet das Werks-DSP nicht.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/lizenzen/171/i-bus-app-bc-dsp-lizenz&amp;quot;,&lt;br /&gt;
             w: WIKI + &amp;quot;Habe_ich_DSP%3F&amp;quot;, wt: &amp;quot;Wiki: Habe ich DSP?&amp;quot; },&lt;br /&gt;
  halter:  { t: &amp;quot;Alu-Halter zur Radio-Montage im BMW E39&amp;quot;, d: &amp;quot;Empfohlen bei Radios, die nicht von AVIN stammen.&amp;quot;, img: [P.halter],&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/radiohalter/185/alu-halter-zur-radio-montage-im-bmw-e39&amp;quot; },&lt;br /&gt;
  ibus:    { t: &amp;quot;I-BUS App&amp;quot;, hl: true,&lt;br /&gt;
             d: &amp;quot;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.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;cat/index/sCategory/42&amp;quot;,&lt;br /&gt;
             links: [&lt;br /&gt;
               { u: WIKI + &amp;quot;Was_brauche_ich_um_die_I-BUS_App_nutzen_zu_k%C3%B6nnen%3F&amp;quot;, t: &amp;quot;Wiki: Was brauche ich für die I-BUS App?&amp;quot; },&lt;br /&gt;
               { u: WIKI + &amp;quot;Funktionen&amp;quot;, t: &amp;quot;Liste aller I-BUS App Funktionen (BMW E38|E39|E46|E53|E83)&amp;quot; },&lt;br /&gt;
               { u: WIKI + &amp;quot;Was_geht_beim_BMW_E46_nicht&amp;quot;, t: &amp;quot;Was geht beim BMW E46, E83, E85,.. nicht? (da werkseitig nicht verbaut)&amp;quot; },&lt;br /&gt;
               { u: WIKI + &amp;quot;Funktionseinschr%C3%A4nkungen_nach_Baujahr/Ausstattung/Modell&amp;quot;, t: &amp;quot;Funktionseinschränkungen nach Baujahr/Ausstattung/Modell&amp;quot; } ] },&lt;br /&gt;
  resler:  { t: &amp;quot;Resler USB I-BUS Modul inkl. Anschlusskabel&amp;quot;, d: &amp;quot;Verbindet I-BUS App und Fahrzeug.&amp;quot;, img: [P.resler],&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/interfaces-module/191/resler-usb-i-bus-modul-inkl.-anschlusskabel&amp;quot;,&lt;br /&gt;
             w: &amp;quot;https://wiki.ibus-app.de/index.php?title=Hauptseite#Einbauanleitung_f.C3.BCr_Resler_Modul_und_Resler_Interface&amp;quot;, wt: &amp;quot;Einbauanleitung Resler Modul&amp;quot; },&lt;br /&gt;
  bclic:   { t: &amp;quot;I-BUS App - BC Lizenz&amp;quot;, d: &amp;quot;Schaltet u. a. die BC-Daten der App frei.&amp;quot;, skipIf: &amp;quot;bcdsp&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/lizenzen/167/i-bus-app-bc-lizenz&amp;quot; },&lt;br /&gt;
  deepobd: { t: &amp;quot;Deep OBD OBD-II Bluetooth-Adapter&amp;quot;, d: &amp;quot;Live-Werte auslesen, Fehler lesen und löschen.&amp;quot;, img: [P.deepobd],&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/interfaces-module/258/deep-obd-obd-ii-bluetooth-adapter?c=54&amp;quot;,&lt;br /&gt;
             w: &amp;quot;https://xtrons.ibus-app.de/index.php?title=DeepOBD_-_Adapter_und_App_einrichten&amp;quot;, wt: &amp;quot;Wiki: DeepOBD einrichten&amp;quot; },&lt;br /&gt;
  can:     { t: &amp;quot;CAN-Bus Interface inkl. Anschlusskabel&amp;quot;, d: &amp;quot;Addon, funktioniert nur zusammen mit der I-BUS App bzw. der K-CAN App.&amp;quot;, img: [P.can],&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/interfaces-module/346/can-bus-interface-inkl.-anschlusskabel&amp;quot;,&lt;br /&gt;
             w: WIKI + &amp;quot;Einbauanleitung_CAN-Bus_Interface&amp;quot;, wt: &amp;quot;Einbauanleitung CAN-Bus Interface&amp;quot; },&lt;br /&gt;
  kcan:    { t: &amp;quot;K-CAN App (Beta)&amp;quot;, d: &amp;quot;Pendant zur I-BUS App für Fahrzeuge mit K-CAN, aktuell als Betaversion.&amp;quot;,&lt;br /&gt;
             w: &amp;quot;https://wiki.kcan-app.de/&amp;quot;, wt: &amp;quot;Wiki zur K-CAN App&amp;quot; },&lt;br /&gt;
  kcanlic: { t: &amp;quot;K-CAN App - Lizenz Betaversion&amp;quot;, d: &amp;quot;Beta-Lizenz für die K-CAN App.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/lizenzen/358/k-can-app-lizenz-betaversion&amp;quot; },&lt;br /&gt;
  tpms:    { t: &amp;quot;TPMS - Reifendruckkontrolle&amp;quot;, d: &amp;quot;&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/tpms/&amp;quot; },&lt;br /&gt;
  dab1:    { t: &amp;quot;DAB+ Empfänger inkl. Antenne (Single)&amp;quot;, d: &amp;quot;&amp;quot;, w: &amp;quot;https://xtrons.ibus-app.de/index.php?title=Installation_der_DAB%2B_Antenne&amp;quot;, wt: &amp;quot;Installation der DAB+ Antenne&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/dab/291/dab-empfaenger-inkl.-antenne-usbdab04&amp;quot; },&lt;br /&gt;
  dab2:    { t: &amp;quot;Dual DAB+ Empfänger-Stick inkl. 2 Antennen&amp;quot;, d: &amp;quot;&amp;quot;, w: &amp;quot;https://xtrons.ibus-app.de/index.php?title=Installation_der_DAB%2B_Antenne&amp;quot;, wt: &amp;quot;Installation der DAB+ Antenne&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/dab/391/dual-dab-empfaenger-stick-inkl.-2-antennen-acusbdab05t?c=75&amp;quot; },&lt;br /&gt;
  rcam:    { t: &amp;quot;Rückfahrkamera&amp;quot;, d: &amp;quot;&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/kameras/&amp;quot;, ut: &amp;quot;Kameras im Shop ansehen →&amp;quot; },&lt;br /&gt;
  fcam:    { t: &amp;quot;Front-Kamera&amp;quot;, d: &amp;quot;&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/kameras/&amp;quot;, ut: &amp;quot;Kameras im Shop ansehen →&amp;quot; },&lt;br /&gt;
  tool:    { t: &amp;quot;Einbau-Werkzeug (Kunststoffheber)&amp;quot;, d: &amp;quot;Zum schonenden Lösen der Verkleidungen.&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/einbauwerkzeug/&amp;quot; }&lt;br /&gt;
};&lt;br /&gt;
/* ---- 5) Regeln --------------------------------------------------------------&lt;br /&gt;
   type: need (Das brauchst Du) oder hint (Hinweise)   when = Bedingung auf die Felder&lt;br /&gt;
   opts = diese Zusatzoptionen müssen gewählt sein      items = Artikel   html = Text&lt;br /&gt;
   Abgeleitete Werte: gen (alt/b/c) und module (ja/nein/unk = Radiomodul im Kofferraum, nur gen alt) */&lt;br /&gt;
var RULES = [&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { current: [&amp;quot;werk&amp;quot;], module: [&amp;quot;ja&amp;quot;] }, items: [&amp;quot;exl005&amp;quot;, &amp;quot;fakra6m&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { current: [&amp;quot;nach&amp;quot;], module: [&amp;quot;ja&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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=&amp;quot; + P.noquad + &amp;quot;][img=&amp;quot; + P.noexl6 + &amp;quot;]&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;ja&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;nein&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;unk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { ant: [&amp;quot;iso&amp;quot;] }, items: [&amp;quot;isoada&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { ant: [&amp;quot;unk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Antennenstecker:[/b] [b]BM24[/b] (Rundpin) = ISO-Antennenstecker, ggf. wird der [a=&amp;quot; + SHOP + &amp;quot;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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { sound: [&amp;quot;dsp&amp;quot;] }, items: [&amp;quot;bcdsp&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { sound: [&amp;quot;dsp&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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=&amp;quot; + WIKI + &amp;quot;Habe_ich_DSP%3F]Habe ich DSP?[/a]&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { sound: [&amp;quot;hk&amp;quot;], gen: [&amp;quot;alt&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Harman Kardon:[/b] Benötigt [b]keine[/b] DSP-Lizenz. Das Remote-Signal (+12 V, wenn Radio an) genügt zum Starten.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { aux: [&amp;quot;nein&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]AUX-IN:[/b] Der AUX-IN muss codiert werden. Optional kann ein FM-Transmitter genutzt werden - das ist nicht empfohlen.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;7er-e38&amp;quot;, &amp;quot;x5-e53&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Montage:[/b] Radios für BMW E38/E53 benötigen keine extra Halterungen.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;5er-e39&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;3er-e46&amp;quot;], factory: [&amp;quot;iris&amp;quot;, &amp;quot;mid&amp;quot;, &amp;quot;pfeil&amp;quot;], current: [&amp;quot;werk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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]&amp;quot; +&lt;br /&gt;
          &amp;quot;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]&amp;quot; +&lt;br /&gt;
          &amp;quot;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=&amp;quot; + P.funktr + &amp;quot;]&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { factory: [&amp;quot;cic&amp;quot;, &amp;quot;nbt&amp;quot;, &amp;quot;nbtevo&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Lichtleiter:[/b] Ggf. vorhandene Lichtleiter (MOST) müssen aus dem BMW-Stecker in den Xtrons-Adapter umgesteckt werden.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { factory: [&amp;quot;mask&amp;quot;, &amp;quot;ccc&amp;quot;, &amp;quot;cic&amp;quot;, &amp;quot;nbt&amp;quot;, &amp;quot;nbtevo&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, opts: [&amp;quot;kcan&amp;quot;], when: {},&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, opts: [&amp;quot;ibus&amp;quot;], when: {},&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: {},&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot; }&lt;br /&gt;
];&lt;br /&gt;
/* =====================================================================&lt;br /&gt;
   PROGRAMMLOGIK&lt;br /&gt;
   ===================================================================== */&lt;br /&gt;
var $ = function (id) { return document.getElementById(id); };&lt;br /&gt;
var sel = {}, picked = {}, summary = &amp;quot;&amp;quot;, capA = 0, capB = 0, radioCache = {}, chosenRadio = null, cartFill = null;&lt;br /&gt;
var fieldsEl = $(&amp;quot;nvk-fields&amp;quot;), optsEl = $(&amp;quot;nvk-opts&amp;quot;), outEl = $(&amp;quot;nvk-out&amp;quot;);&lt;br /&gt;
function full(u) { return u.indexOf(&amp;quot;/thumb/&amp;quot;) === -1 ? u : u.replace(&amp;quot;/thumb/&amp;quot;, &amp;quot;/&amp;quot;).replace(/\/[^\/]+$/, &amp;quot;&amp;quot;); }&lt;br /&gt;
function fmt(t) {&lt;br /&gt;
  return t.replace(/\[imgw=([^\x5D]+)\]/g, function (m, u) {&lt;br /&gt;
    return &amp;quot;\u003Ca href=\&amp;quot;&amp;quot; + full(u) + &amp;quot;\&amp;quot; target=\&amp;quot;_blank\&amp;quot; rel=\&amp;quot;noopener\&amp;quot;\u003E\u003Cimg class=\&amp;quot;nvk-img wide\&amp;quot; src=\&amp;quot;&amp;quot; + u + &amp;quot;\&amp;quot; alt=\&amp;quot;\&amp;quot;\u003E\u003C/a\u003E&amp;quot;;&lt;br /&gt;
  }).replace(/\[img=([^\x5D]+)\]/g, function (m, u) {&lt;br /&gt;
    return &amp;quot;\u003Ca href=\&amp;quot;&amp;quot; + full(u) + &amp;quot;\&amp;quot; target=\&amp;quot;_blank\&amp;quot; rel=\&amp;quot;noopener\&amp;quot;\u003E\u003Cimg class=\&amp;quot;nvk-img\&amp;quot; src=\&amp;quot;&amp;quot; + u + &amp;quot;\&amp;quot; alt=\&amp;quot;\&amp;quot;\u003E\u003C/a\u003E&amp;quot;;&lt;br /&gt;
  }).replace(/\[b\]/g, &amp;quot;\u003Cb\u003E&amp;quot;).replace(/\[\/b\]/g, &amp;quot;\u003C/b\u003E&amp;quot;).replace(/\[br\]/g, &amp;quot;\u003Cbr\u003E&amp;quot;)&lt;br /&gt;
    .replace(/\[a=([^\x5D]+)\]/g, &amp;quot;\u003Ca href=\&amp;quot;$1\&amp;quot; target=\&amp;quot;_blank\&amp;quot; rel=\&amp;quot;noopener\&amp;quot;\u003E&amp;quot;).replace(/\[\/a\]/g, &amp;quot;\u003C/a\u003E&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
function match(cond, s, lenient) {&lt;br /&gt;
  if (!cond) return true;&lt;br /&gt;
  for (var k in cond) {&lt;br /&gt;
    if (!s[k]) { if (lenient) continue; return false; }&lt;br /&gt;
    if (cond[k].indexOf(s[k]) === -1) return false;&lt;br /&gt;
  }&lt;br /&gt;
  return true;&lt;br /&gt;
}&lt;br /&gt;
function vehicleOf(id) { return VEHICLES.filter(function (x) { return x.v === id; })[0]; }&lt;br /&gt;
function derive() {&lt;br /&gt;
  var s = {}, k;&lt;br /&gt;
  for (k in sel) s[k] = sel[k];&lt;br /&gt;
  var veh = vehicleOf(sel.vehicle);&lt;br /&gt;
  if (veh) s.gen = veh.gen;&lt;br /&gt;
  if (s.gen === &amp;quot;alt&amp;quot;) {&lt;br /&gt;
    if (s.factory === &amp;quot;n43&amp;quot; || s.factory === &amp;quot;n169&amp;quot;) s.module = &amp;quot;ja&amp;quot;;&lt;br /&gt;
    else if (s.factory === &amp;quot;iris&amp;quot; || s.factory === &amp;quot;mid&amp;quot;) s.module = &amp;quot;nein&amp;quot;;&lt;br /&gt;
    else if (s.factory === &amp;quot;pfeil&amp;quot;) s.module = s.trunk || &amp;quot;unk&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  return s;&lt;br /&gt;
}&lt;br /&gt;
function forced(s) {&lt;br /&gt;
  var f = {};&lt;br /&gt;
  FORCED.forEach(function (r) { if (match(r.when, s)) r.opts.forEach(function (o) { f[o] = r.why; }); });&lt;br /&gt;
  return f;&lt;br /&gt;
}&lt;br /&gt;
function onSet(s) {&lt;br /&gt;
  var f = forced(s), on = {}, k;&lt;br /&gt;
  for (k in picked) if (picked[k]) on[k] = true;&lt;br /&gt;
  for (k in f) on[k] = true;&lt;br /&gt;
  return { on: on, forced: f };&lt;br /&gt;
}&lt;br /&gt;
function optVisible(o, s, on) {&lt;br /&gt;
  if (!match(o.show, s, true)) return false;&lt;br /&gt;
  return (o.requires || []).every(function (r) { return on[r]; });&lt;br /&gt;
}&lt;br /&gt;
FIELDS.forEach(function (f) {&lt;br /&gt;
  var wrap = document.createElement(&amp;quot;div&amp;quot;); wrap.className = &amp;quot;nvk-f&amp;quot;; wrap.id = &amp;quot;nvk-w-&amp;quot; + f.id;&lt;br /&gt;
  var lab = document.createElement(&amp;quot;label&amp;quot;); lab.htmlFor = &amp;quot;nvk-&amp;quot; + f.id; lab.textContent = f.label;&lt;br /&gt;
  var s = document.createElement(&amp;quot;select&amp;quot;); s.id = &amp;quot;nvk-&amp;quot; + f.id;&lt;br /&gt;
  s.addEventListener(&amp;quot;change&amp;quot;, function () { sel[f.id] = s.value; update(); });&lt;br /&gt;
  wrap.appendChild(lab); wrap.appendChild(s);&lt;br /&gt;
  if (f.help) { var h = document.createElement(&amp;quot;div&amp;quot;); h.className = &amp;quot;nvk-help&amp;quot;; h.innerHTML = fmt(f.help); wrap.appendChild(h); }&lt;br /&gt;
  var inf = document.createElement(&amp;quot;div&amp;quot;); inf.id = &amp;quot;nvk-i-&amp;quot; + f.id; wrap.appendChild(inf);&lt;br /&gt;
  fieldsEl.appendChild(wrap);&lt;br /&gt;
});&lt;br /&gt;
function renderFields() {&lt;br /&gt;
  FIELDS.forEach(function (f) {&lt;br /&gt;
    var s = derive();&lt;br /&gt;
    var wrap = $(&amp;quot;nvk-w-&amp;quot; + f.id), el = $(&amp;quot;nvk-&amp;quot; + f.id);&lt;br /&gt;
    var vis = f.show ? match(f.show, s, false) : true;&lt;br /&gt;
    wrap.style.display = vis ? &amp;quot;&amp;quot; : &amp;quot;none&amp;quot;;&lt;br /&gt;
    if (!vis) { sel[f.id] = &amp;quot;&amp;quot;; return; }&lt;br /&gt;
    var allowed = f.values.filter(function (v) { return match(v.only, s, true); });&lt;br /&gt;
    if (sel[f.id]) { if (!allowed.some(function (v) { return v.v === sel[f.id]; })) sel[f.id] = &amp;quot;&amp;quot;; }&lt;br /&gt;
    if (!sel[f.id]) { if (f.def) sel[f.id] = f.def; }&lt;br /&gt;
    if (!sel[f.id]) { if (f.auto) { if (sel.vehicle) { if (allowed.length === 1) sel[f.id] = allowed[0].v; } } }&lt;br /&gt;
    el.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
    if (!f.def) { var p = document.createElement(&amp;quot;option&amp;quot;); p.value = &amp;quot;&amp;quot;; p.textContent = &amp;quot;– bitte wählen –&amp;quot;; el.appendChild(p); }&lt;br /&gt;
    allowed.forEach(function (v) {&lt;br /&gt;
      var o = document.createElement(&amp;quot;option&amp;quot;); o.value = v.v; o.textContent = v.t; el.appendChild(o);&lt;br /&gt;
    });&lt;br /&gt;
    el.value = sel[f.id] || &amp;quot;&amp;quot;;&lt;br /&gt;
    var cur = allowed.filter(function (v) { return v.v === sel[f.id]; })[0];&lt;br /&gt;
    var pre = f.pre ? (match(f.pre.when, s, false) ? fmt(f.pre.html) : &amp;quot;&amp;quot;) : &amp;quot;&amp;quot;;&lt;br /&gt;
    $(&amp;quot;nvk-i-&amp;quot; + f.id).innerHTML = pre + (cur ? (cur.info ? fmt(cur.info) : &amp;quot;&amp;quot;) : &amp;quot;&amp;quot;);&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
function renderOpts() {&lt;br /&gt;
  var s = derive(), st = onSet(s);&lt;br /&gt;
  OPTS.forEach(function (o) { if (!optVisible(o, s, st.on)) picked[o.id] = false; });&lt;br /&gt;
  st = onSet(s);&lt;br /&gt;
  optsEl.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
  OPTS.forEach(function (o) {&lt;br /&gt;
    if (!optVisible(o, s, st.on)) return;&lt;br /&gt;
    var lab = document.createElement(&amp;quot;label&amp;quot;); lab.className = &amp;quot;nvk-o&amp;quot;;&lt;br /&gt;
    var cb = document.createElement(&amp;quot;input&amp;quot;); cb.type = &amp;quot;checkbox&amp;quot;;&lt;br /&gt;
    cb.checked = !!st.on[o.id];&lt;br /&gt;
    var isForced = !!st.forced[o.id];&lt;br /&gt;
    if (isForced) { cb.disabled = true; lab.className += &amp;quot; dis&amp;quot;; }&lt;br /&gt;
    cb.addEventListener(&amp;quot;change&amp;quot;, function () {&lt;br /&gt;
      picked[o.id] = cb.checked;&lt;br /&gt;
      if (cb.checked) { if (o.excl) OPTS.forEach(function (x) { if (x.excl === o.excl) { if (x.id !== o.id) picked[x.id] = false; } }); }&lt;br /&gt;
      update();&lt;br /&gt;
    });&lt;br /&gt;
    lab.appendChild(cb);&lt;br /&gt;
    lab.appendChild(document.createTextNode(&amp;quot; &amp;quot; + o.t));&lt;br /&gt;
    var sub = [o.sub, isForced ? st.forced[o.id] : &amp;quot;&amp;quot;].filter(Boolean).join(&amp;quot; - &amp;quot;);&lt;br /&gt;
    if (sub) { var sm = document.createElement(&amp;quot;small&amp;quot;); sm.textContent = &amp;quot; (&amp;quot; + sub + &amp;quot;)&amp;quot;; lab.appendChild(sm); }&lt;br /&gt;
    optsEl.appendChild(lab);&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
function link(url, text) {&lt;br /&gt;
  var a = document.createElement(&amp;quot;a&amp;quot;); a.href = url; a.target = &amp;quot;_blank&amp;quot;; a.rel = &amp;quot;noopener&amp;quot;; a.textContent = text; return a;&lt;br /&gt;
}&lt;br /&gt;
function card(item, cls) {&lt;br /&gt;
  var d = document.createElement(&amp;quot;div&amp;quot;); d.className = &amp;quot;nvk-card &amp;quot; + (cls || &amp;quot;&amp;quot;) + (item.hl ? &amp;quot; hl&amp;quot; : &amp;quot;&amp;quot;);&lt;br /&gt;
  var b = document.createElement(&amp;quot;b&amp;quot;); b.textContent = item.t; d.appendChild(b);&lt;br /&gt;
  if (item.d) { var p = document.createElement(&amp;quot;span&amp;quot;); p.textContent = item.d; d.appendChild(p); }&lt;br /&gt;
  if (item.img) {&lt;br /&gt;
    var im = document.createElement(&amp;quot;div&amp;quot;);&lt;br /&gt;
    item.img.forEach(function (u) {&lt;br /&gt;
      var a = document.createElement(&amp;quot;a&amp;quot;); a.href = full(u); a.target = &amp;quot;_blank&amp;quot;; a.rel = &amp;quot;noopener&amp;quot;;&lt;br /&gt;
      var g = document.createElement(&amp;quot;img&amp;quot;); g.className = &amp;quot;nvk-img&amp;quot;; g.src = u; g.alt = item.t; a.appendChild(g); im.appendChild(a);&lt;br /&gt;
    });&lt;br /&gt;
    d.appendChild(im);&lt;br /&gt;
  }&lt;br /&gt;
  if (item.u || item.w) {&lt;br /&gt;
    var l = document.createElement(&amp;quot;div&amp;quot;); l.className = &amp;quot;nvk-links&amp;quot;;&lt;br /&gt;
    if (item.u) l.appendChild(link(item.u, item.ut || &amp;quot;Im Shop ansehen →&amp;quot;));&lt;br /&gt;
    if (item.w) l.appendChild(link(item.w, (item.wt || &amp;quot;Zum Wiki&amp;quot;) + &amp;quot; →&amp;quot;));&lt;br /&gt;
    d.appendChild(l);&lt;br /&gt;
  }&lt;br /&gt;
  if (item.links) item.links.forEach(function (x) {&lt;br /&gt;
    var r = document.createElement(&amp;quot;div&amp;quot;); r.className = &amp;quot;nvk-links&amp;quot;; r.appendChild(link(x.u, x.t + &amp;quot; →&amp;quot;)); d.appendChild(r);&lt;br /&gt;
  });&lt;br /&gt;
  return d;&lt;br /&gt;
}&lt;br /&gt;
function heading(txt) { var h = document.createElement(&amp;quot;h3&amp;quot;); h.textContent = txt; outEl.appendChild(h); }&lt;br /&gt;
function aidOf(u) {&lt;br /&gt;
  if (u.indexOf(SHOP) !== 0) return &amp;quot;&amp;quot;;&lt;br /&gt;
  var m = u.match(/sArticle\/(\d+)/);&lt;br /&gt;
  if (!m) m = u.split(&amp;quot;?&amp;quot;)[0].match(/\/(\d+)\/[^\/]+$/);&lt;br /&gt;
  return m ? m[1] : &amp;quot;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
function renderRadioList(veh) {&lt;br /&gt;
  if (veh.noCat) return;&lt;br /&gt;
  if (chosenRadio) { if (chosenRadio.cat !== veh.v) chosenRadio = null; }&lt;br /&gt;
  var data = radioCache[veh.v];&lt;br /&gt;
  if (data === undefined) {&lt;br /&gt;
    radioCache[veh.v] = &amp;quot;loading&amp;quot;;&lt;br /&gt;
    fetch(API + &amp;quot;?cat=&amp;quot; + encodeURIComponent(veh.v)).then(function (r) { return r.json(); }).then(function (j) {&lt;br /&gt;
      radioCache[veh.v] = (j.items || []).map(function (it) { it.cat = veh.v; return it; });&lt;br /&gt;
      renderResult();&lt;br /&gt;
    }).catch(function () { radioCache[veh.v] = []; renderResult(); });&lt;br /&gt;
  }&lt;br /&gt;
  if (data === undefined || data === &amp;quot;loading&amp;quot;) {&lt;br /&gt;
    var m = document.createElement(&amp;quot;p&amp;quot;); m.className = &amp;quot;nvk-miss&amp;quot;; m.textContent = &amp;quot;Verfügbare Radios werden geladen …&amp;quot;; outEl.appendChild(m); return;&lt;br /&gt;
  }&lt;br /&gt;
  if (!data.length) return;&lt;br /&gt;
  var want = { mask: /M-?ASK/i, ccc: /\bCCC\b/i, cic: /\bCIC\b/i, nbt: /\bNBT\b/i, nbtevo: /EVO/i }[sel.factory];&lt;br /&gt;
  function fits(it) { return want ? want.test(it.name) : false; }&lt;br /&gt;
  var list = data.slice().sort(function (a, b) { return (fits(b) ? 1 : 0) - (fits(a) ? 1 : 0); });&lt;br /&gt;
  var det = document.createElement(&amp;quot;details&amp;quot;); det.open = Math.max(list.length, 8) === 8;&lt;br /&gt;
  var sm = document.createElement(&amp;quot;summary&amp;quot;); sm.style.cursor = &amp;quot;pointer&amp;quot;; sm.style.fontWeight = &amp;quot;700&amp;quot;;&lt;br /&gt;
  sm.textContent = &amp;quot;Verfügbare Radios für Deinen BMW &amp;quot; + veh.t + &amp;quot; (&amp;quot; + list.length + &amp;quot;)&amp;quot;; det.appendChild(sm);&lt;br /&gt;
  list.forEach(function (it) {&lt;br /&gt;
    var row = document.createElement(&amp;quot;div&amp;quot;); row.className = &amp;quot;nvk-row&amp;quot;;&lt;br /&gt;
    var lab = document.createElement(&amp;quot;label&amp;quot;); lab.className = &amp;quot;nvk-o&amp;quot;;&lt;br /&gt;
    var rb = document.createElement(&amp;quot;input&amp;quot;); rb.type = &amp;quot;radio&amp;quot;; rb.name = &amp;quot;nvk-radio&amp;quot;;&lt;br /&gt;
    rb.checked = chosenRadio ? chosenRadio.sku === it.sku : false;&lt;br /&gt;
    rb.addEventListener(&amp;quot;change&amp;quot;, function () { chosenRadio = it; if (cartFill) cartFill(); });&lt;br /&gt;
    lab.appendChild(rb);&lt;br /&gt;
    lab.appendChild(document.createTextNode(&amp;quot; &amp;quot; + it.name + (it.price ? &amp;quot;  -  &amp;quot; + it.price : &amp;quot;&amp;quot;) + (fits(it) ? &amp;quot;  (passt zu Deiner Auswahl)&amp;quot; : &amp;quot;&amp;quot;)));&lt;br /&gt;
    row.appendChild(lab); row.appendChild(link(it.url, &amp;quot;Shop →&amp;quot;));&lt;br /&gt;
    det.appendChild(row);&lt;br /&gt;
  });&lt;br /&gt;
  outEl.appendChild(det);&lt;br /&gt;
}&lt;br /&gt;
function cartBlock(needs, opt) {&lt;br /&gt;
  var items = [];&lt;br /&gt;
  needs.concat(opt).forEach(function (i) { var id = aidOf(i.u || &amp;quot;&amp;quot;); if (id) items.push({ t: i.t, aid: id }); });&lt;br /&gt;
  heading(&amp;quot;In den Warenkorb&amp;quot;);&lt;br /&gt;
  var box = document.createElement(&amp;quot;div&amp;quot;); box.className = &amp;quot;nvk-card opt&amp;quot;;&lt;br /&gt;
  var p = document.createElement(&amp;quot;div&amp;quot;);&lt;br /&gt;
  p.textContent = &amp;quot;Das oben gewählte Radio (falls ausgewählt) und diese Artikel werden direkt im Shop in den Warenkorb gelegt:&amp;quot;;&lt;br /&gt;
  box.appendChild(p);&lt;br /&gt;
  var listEl = document.createElement(&amp;quot;div&amp;quot;); box.appendChild(listEl);&lt;br /&gt;
  cartFill = function () {&lt;br /&gt;
    listEl.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
    var lines = (chosenRadio ? [&amp;quot;Radio: &amp;quot; + chosenRadio.type] : []).concat(items.map(function (x) { return x.t; }));&lt;br /&gt;
    lines.forEach(function (t) { var r = document.createElement(&amp;quot;div&amp;quot;); r.textContent = &amp;quot;- &amp;quot; + t; listEl.appendChild(r); });&lt;br /&gt;
  };&lt;br /&gt;
  cartFill();&lt;br /&gt;
  var n = document.createElement(&amp;quot;div&amp;quot;); n.className = &amp;quot;nvk-help&amp;quot;;&lt;br /&gt;
  n.textContent = &amp;quot;Kameras, TPMS, Werkzeug und Artikel ohne Direktlink wählst Du bitte über die Links oben im Shop aus.&amp;quot;;&lt;br /&gt;
  box.appendChild(n);&lt;br /&gt;
  var all = needs.concat(opt);&lt;br /&gt;
  var has = function (k) { return all.indexOf(ITEMS[k]) !== -1; };&lt;br /&gt;
  var l17 = has(&amp;quot;kcanlic&amp;quot;), l7 = has(&amp;quot;bclic&amp;quot;) || has(&amp;quot;bcdsp&amp;quot;);&lt;br /&gt;
  if (l17 || l7) {&lt;br /&gt;
    var vb = document.createElement(&amp;quot;div&amp;quot;); vb.className = &amp;quot;nvk-f&amp;quot;; vb.style.marginTop = &amp;quot;12px&amp;quot;;&lt;br /&gt;
    var vlab = document.createElement(&amp;quot;label&amp;quot;); vlab.htmlFor = &amp;quot;nvk-licvin&amp;quot;;&lt;br /&gt;
    vlab.textContent = l17 ? &amp;quot;Fahrgestellnummer (17 Zeichen) für die Lizenz&amp;quot; : &amp;quot;VIN für die Lizenz (7 Zeichen, z. B. AB12345)&amp;quot;;&lt;br /&gt;
    var vin = document.createElement(&amp;quot;input&amp;quot;); vin.type = &amp;quot;text&amp;quot;; vin.id = &amp;quot;nvk-licvin&amp;quot;; vin.maxLength = 17;&lt;br /&gt;
    vin.value = $(&amp;quot;nvk-vin&amp;quot;).value.toUpperCase();&lt;br /&gt;
    var ta = document.createElement(&amp;quot;textarea&amp;quot;); ta.rows = 3; ta.readOnly = true; ta.style.display = &amp;quot;none&amp;quot;; ta.style.marginTop = &amp;quot;6px&amp;quot;;&lt;br /&gt;
    var cb = document.createElement(&amp;quot;button&amp;quot;); cb.type = &amp;quot;button&amp;quot;; cb.className = &amp;quot;nvk-btn&amp;quot;; cb.style.marginTop = &amp;quot;6px&amp;quot;;&lt;br /&gt;
    cb.textContent = &amp;quot;Kommentartext für die Kasse kopieren&amp;quot;;&lt;br /&gt;
    var ls = document.createElement(&amp;quot;div&amp;quot;); ls.className = &amp;quot;nvk-help&amp;quot;;&lt;br /&gt;
    cb.addEventListener(&amp;quot;click&amp;quot;, function () {&lt;br /&gt;
      var v = vin.value.trim().toUpperCase(), v7 = &amp;quot;&amp;quot;, v17 = &amp;quot;&amp;quot;;&lt;br /&gt;
      if (/^[A-HJ-NPR-Z0-9]{17}$/.test(v)) { v17 = v; v7 = v.slice(10); }&lt;br /&gt;
      else if (/^[A-Z]{2}[0-9]{5}$/.test(v)) v7 = v;&lt;br /&gt;
      if (l17 ? !v17 : !v7) { ls.textContent = l17 ? &amp;quot;Bitte die vollständige 17-stellige Fahrgestellnummer eingeben.&amp;quot; : &amp;quot;Bitte die VIN im Format AB12345 (oder die 17-stellige FGN) eingeben.&amp;quot;; return; }&lt;br /&gt;
      var L = [];&lt;br /&gt;
      if (has(&amp;quot;bclic&amp;quot;)) L.push(&amp;quot;I-BUS App BC Lizenz: VIN &amp;quot; + v7);&lt;br /&gt;
      if (has(&amp;quot;bcdsp&amp;quot;)) L.push(&amp;quot;I-BUS App BC+DSP Lizenz: VIN &amp;quot; + v7);&lt;br /&gt;
      if (l17) L.push(&amp;quot;K-CAN App Beta Lizenz: FGN &amp;quot; + v17);&lt;br /&gt;
      ta.value = L.join(&amp;quot;\n&amp;quot;); ta.style.display = &amp;quot;&amp;quot;; ta.select();&lt;br /&gt;
      var hint = &amp;quot;Bitte an der Shop-Kasse in das Feld Kommentar einfügen.&amp;quot;;&lt;br /&gt;
      if (navigator.clipboard) navigator.clipboard.writeText(ta.value).then(function () { ls.textContent = &amp;quot;Text kopiert. &amp;quot; + hint; }).catch(function () { ls.textContent = &amp;quot;Bitte den Text markieren und kopieren. &amp;quot; + hint; });&lt;br /&gt;
      else ls.textContent = &amp;quot;Bitte den Text markieren und kopieren. &amp;quot; + hint;&lt;br /&gt;
    });&lt;br /&gt;
    vb.appendChild(vlab); vb.appendChild(vin); vb.appendChild(cb); vb.appendChild(ta); vb.appendChild(ls); box.appendChild(vb);&lt;br /&gt;
  }&lt;br /&gt;
  if (!CART_TRANSFER) { outEl.appendChild(box); return; }&lt;br /&gt;
  var btn = document.createElement(&amp;quot;button&amp;quot;); btn.type = &amp;quot;button&amp;quot;; btn.className = &amp;quot;nvk-btn&amp;quot;; btn.style.marginTop = &amp;quot;8px&amp;quot;;&lt;br /&gt;
  btn.textContent = &amp;quot;Auswahl in den Warenkorb legen&amp;quot;;&lt;br /&gt;
  var st = document.createElement(&amp;quot;div&amp;quot;); st.className = &amp;quot;nvk-help&amp;quot;;&lt;br /&gt;
  btn.addEventListener(&amp;quot;click&amp;quot;, function () { addToCart(items, st); });&lt;br /&gt;
  box.appendChild(btn); box.appendChild(st); outEl.appendChild(box);&lt;br /&gt;
}&lt;br /&gt;
function addToCart(items, st) {&lt;br /&gt;
  var list = items.slice();&lt;br /&gt;
  if (chosenRadio) list.unshift({ t: chosenRadio.type, sku: chosenRadio.sku });&lt;br /&gt;
  if (!list.length) { st.textContent = &amp;quot;Es ist noch nichts zum Bestellen ausgewählt.&amp;quot;; return; }&lt;br /&gt;
  var w = window.open(&amp;quot;&amp;quot;, &amp;quot;_blank&amp;quot;);&lt;br /&gt;
  st.textContent = &amp;quot;Artikelnummern werden ermittelt …&amp;quot;;&lt;br /&gt;
  var ids = list.filter(function (x) { return x.aid; }).map(function (x) { return x.aid; });&lt;br /&gt;
  var get = ids.length ? fetch(API + &amp;quot;?aid=&amp;quot; + ids.join(&amp;quot;,&amp;quot;)).then(function (r) { return r.json(); }).then(function (j) { return j.skus || {}; }) : Promise.resolve({});&lt;br /&gt;
  get.then(function (map) {&lt;br /&gt;
    var skus = [];&lt;br /&gt;
    list.forEach(function (x) { var k = x.sku || map[x.aid]; if (k) skus.push(k); });&lt;br /&gt;
    if (!skus.length) throw new Error(&amp;quot;none&amp;quot;);&lt;br /&gt;
    var url = TRANSFER_URL + encodeURIComponent(skus.join(&amp;quot;,&amp;quot;));&lt;br /&gt;
    if (w) {&lt;br /&gt;
      w.location.href = url;&lt;br /&gt;
      st.textContent = &amp;quot;Der Shop wurde in einem neuen Tab geöffnet (&amp;quot; + skus.length + &amp;quot; von &amp;quot; + list.length + &amp;quot; Artikeln übergeben). Bitte dort den Warenkorb kontrollieren.&amp;quot;;&lt;br /&gt;
    } else {&lt;br /&gt;
      st.textContent = &amp;quot;Der neue Tab wurde blockiert. Bitte Pop-ups erlauben oder diesen Link nutzen: &amp;quot;;&lt;br /&gt;
      st.appendChild(link(url, &amp;quot;Warenkorb im Shop öffnen →&amp;quot;));&lt;br /&gt;
    }&lt;br /&gt;
  }).catch(function () { if (w) w.close(); st.textContent = &amp;quot;Das hat leider nicht geklappt. Bitte nutze die Shop-Links oben.&amp;quot;; });&lt;br /&gt;
}&lt;br /&gt;
function renderResult() {&lt;br /&gt;
  var s = derive(), st = onSet(s);&lt;br /&gt;
  var missing = FIELDS.filter(function (f) {&lt;br /&gt;
    var w = $(&amp;quot;nvk-w-&amp;quot; + f.id);&lt;br /&gt;
    return w.style.display !== &amp;quot;none&amp;quot; ? (!f.optional ? !sel[f.id] : false) : false;&lt;br /&gt;
  });&lt;br /&gt;
  outEl.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
  if (missing.length) {&lt;br /&gt;
    var m = document.createElement(&amp;quot;p&amp;quot;); m.className = &amp;quot;nvk-miss&amp;quot;;&lt;br /&gt;
    m.textContent = &amp;quot;Bitte noch auswählen: &amp;quot; + missing.map(function (f) { return f.label; }).join(&amp;quot;, &amp;quot;);&lt;br /&gt;
    outEl.appendChild(m); $(&amp;quot;nvk-form&amp;quot;).style.display = &amp;quot;none&amp;quot;; return;&lt;br /&gt;
  }&lt;br /&gt;
  $(&amp;quot;nvk-form&amp;quot;).style.display = &amp;quot;&amp;quot;;&lt;br /&gt;
  var veh = vehicleOf(sel.vehicle);&lt;br /&gt;
  var ru = veh.noCat ? SHOP + &amp;quot;bmw-radios/&amp;quot; : SHOP + &amp;quot;bmw-radios/&amp;quot; + veh.v + &amp;quot;/&amp;quot;;&lt;br /&gt;
  heading(&amp;quot;Passende Radios&amp;quot;);&lt;br /&gt;
  outEl.appendChild(card({ t: &amp;quot;BMW Radios für &amp;quot; + veh.t, d: &amp;quot;Alle Radios, die für Deinen BMW &amp;quot; + veh.t + &amp;quot; im Shop erhältlich sind.&amp;quot;,&lt;br /&gt;
    u: ru, ut: &amp;quot;Zu den passenden Radios →&amp;quot;, w: SHOP + &amp;quot;bmw-radios/&amp;quot;, wt: &amp;quot;Alle BMW Radios&amp;quot; }, &amp;quot;rad&amp;quot;));&lt;br /&gt;
  renderRadioList(veh);&lt;br /&gt;
  var needs = [], hints = [], seen = {};&lt;br /&gt;
  RULES.forEach(function (r) {&lt;br /&gt;
    if (!match(r.when, s)) return;&lt;br /&gt;
    if (r.opts) { if (!r.opts.every(function (o) { return st.on[o]; })) return; }&lt;br /&gt;
    if (r.type === &amp;quot;need&amp;quot;) (r.items || []).forEach(function (id) { if (!seen[id]) { seen[id] = 1; needs.push(ITEMS[id]); } });&lt;br /&gt;
    else hints.push(r.html);&lt;br /&gt;
  });&lt;br /&gt;
  heading(&amp;quot;Das brauchst Du&amp;quot;);&lt;br /&gt;
  if (needs.length) needs.forEach(function (i) { outEl.appendChild(card(i)); });&lt;br /&gt;
  else { var n = document.createElement(&amp;quot;p&amp;quot;); n.textContent = &amp;quot;Für die Grundinstallation sind keine zusätzlichen Verlängerungen oder Adapter nötig.&amp;quot;; outEl.appendChild(n); }&lt;br /&gt;
  var opt = [];&lt;br /&gt;
  OPTS.forEach(function (o) {&lt;br /&gt;
    if (!st.on[o.id]) return;&lt;br /&gt;
    if (!optVisible(o, s, st.on)) return;&lt;br /&gt;
    o.items.forEach(function (id) {&lt;br /&gt;
      if (seen[id]) return;&lt;br /&gt;
      var sk = ITEMS[id].skipIf;&lt;br /&gt;
      if (sk) { if (seen[sk]) return; }&lt;br /&gt;
      seen[id] = 1; opt.push(ITEMS[id]);&lt;br /&gt;
    });&lt;br /&gt;
  });&lt;br /&gt;
  if (opt.length) { heading(&amp;quot;Deine Zusatzoptionen&amp;quot;); opt.forEach(function (i) { outEl.appendChild(card(i, &amp;quot;opt&amp;quot;)); }); }&lt;br /&gt;
  if (hints.length) {&lt;br /&gt;
    heading(&amp;quot;Hinweise&amp;quot;);&lt;br /&gt;
    hints.forEach(function (t) { var d = document.createElement(&amp;quot;div&amp;quot;); d.className = &amp;quot;nvk-note&amp;quot;; d.innerHTML = fmt(t); outEl.appendChild(d); });&lt;br /&gt;
  }&lt;br /&gt;
  var L = [&amp;quot;KONFIGURATION&amp;quot;];&lt;br /&gt;
  FIELDS.forEach(function (f) {&lt;br /&gt;
    if (!sel[f.id]) return;&lt;br /&gt;
    var v = f.values.filter(function (x) { return x.v === sel[f.id]; })[0];&lt;br /&gt;
    if (v) L.push(&amp;quot;- &amp;quot; + f.label + &amp;quot;: &amp;quot; + v.t);&lt;br /&gt;
  });&lt;br /&gt;
  L.push(&amp;quot;&amp;quot;, &amp;quot;BENÖTIGT&amp;quot;);&lt;br /&gt;
  needs.forEach(function (i) { L.push(&amp;quot;- &amp;quot; + i.t + (i.u ? &amp;quot;  &amp;quot; + i.u : &amp;quot;&amp;quot;)); });&lt;br /&gt;
  if (opt.length) { L.push(&amp;quot;&amp;quot;, &amp;quot;ZUSATZOPTIONEN&amp;quot;); opt.forEach(function (i) { L.push(&amp;quot;- &amp;quot; + i.t + (i.u ? &amp;quot;  &amp;quot; + i.u : &amp;quot;&amp;quot;)); }); }&lt;br /&gt;
  L.push(&amp;quot;&amp;quot;, &amp;quot;Radios: &amp;quot; + ru);&lt;br /&gt;
  summary = L.join(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  cartBlock(needs, opt);&lt;br /&gt;
}&lt;br /&gt;
function update() { renderFields(); renderOpts(); renderResult(); }&lt;br /&gt;
function newCaptcha() {&lt;br /&gt;
  capA = 1 + Math.floor(Math.random() * 9); capB = 1 + Math.floor(Math.random() * 9);&lt;br /&gt;
  $(&amp;quot;nvk-capq&amp;quot;).textContent = &amp;quot;Sicherheitsfrage: Was ist &amp;quot; + capA + &amp;quot; + &amp;quot; + capB + &amp;quot;? *&amp;quot;; $(&amp;quot;nvk-cap&amp;quot;).value = &amp;quot;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
function status(msg, ok) { var e = $(&amp;quot;nvk-status&amp;quot;); e.style.display = &amp;quot;&amp;quot;; e.textContent = msg; e.style.borderLeftColor = ok ? &amp;quot;#14866d&amp;quot; : &amp;quot;#d33&amp;quot;; }&lt;br /&gt;
$(&amp;quot;nvk-send&amp;quot;).addEventListener(&amp;quot;click&amp;quot;, function () {&lt;br /&gt;
  var name = $(&amp;quot;nvk-name&amp;quot;).value.trim(), mail = $(&amp;quot;nvk-mail&amp;quot;).value.trim(), vin = $(&amp;quot;nvk-vin&amp;quot;).value.trim().toUpperCase(), msg = $(&amp;quot;nvk-msg&amp;quot;).value.trim();&lt;br /&gt;
  if (!name || !mail || !msg) return status(&amp;quot;Bitte Name, E-Mail und Kommentar ausfüllen.&amp;quot;, false);&lt;br /&gt;
  if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(mail)) return status(&amp;quot;Bitte eine gültige E-Mail-Adresse eingeben.&amp;quot;, false);&lt;br /&gt;
  if (vin) { if (!/^[A-Z]{2}[0-9]{5}$/.test(vin)) { if (!/^[A-HJ-NPR-Z0-9]{17}$/.test(vin)) return status(&amp;quot;Bitte die VIN im Format AB12345 oder die 17-stellige FGN eingeben - oder das Feld leer lassen.&amp;quot;, false); } }&lt;br /&gt;
  if (parseInt($(&amp;quot;nvk-cap&amp;quot;).value, 10) !== capA + capB) return status(&amp;quot;Die Sicherheitsfrage wurde nicht richtig beantwortet.&amp;quot;, false);&lt;br /&gt;
  if (!$(&amp;quot;nvk-dsgvo&amp;quot;).checked) return status(&amp;quot;Bitte der Verarbeitung Deiner Daten zustimmen.&amp;quot;, false);&lt;br /&gt;
  if ($(&amp;quot;nvk-hp&amp;quot;).value) return;&lt;br /&gt;
  var sz = $(&amp;quot;nvk-size&amp;quot;).value;&lt;br /&gt;
  var rad = chosenRadio ? &amp;quot;\n\nGEWÄHLTES RADIO\n- &amp;quot; + chosenRadio.type + &amp;quot;  &amp;quot; + chosenRadio.url : &amp;quot;&amp;quot;;&lt;br /&gt;
  var sum2 = summary + rad + (sz ? &amp;quot;\n\nGewünschte Displaygröße: &amp;quot; + sz : &amp;quot;&amp;quot;);&lt;br /&gt;
  var text = &amp;quot;Name: &amp;quot; + name + &amp;quot;\nE-Mail: &amp;quot; + mail + &amp;quot;\nVIN: &amp;quot; + (vin || &amp;quot;-&amp;quot;) + &amp;quot;\n\nKommentar:\n&amp;quot; + msg + &amp;quot;\n\n&amp;quot; + sum2;&lt;br /&gt;
  if (SEND_URL) {&lt;br /&gt;
    var p = new URLSearchParams();&lt;br /&gt;
    p.append(&amp;quot;name&amp;quot;, name); p.append(&amp;quot;mail&amp;quot;, mail); p.append(&amp;quot;vin&amp;quot;, vin); p.append(&amp;quot;msg&amp;quot;, msg); p.append(&amp;quot;summary&amp;quot;, sum2);&lt;br /&gt;
    p.append(&amp;quot;hp&amp;quot;, $(&amp;quot;nvk-hp&amp;quot;).value); p.append(&amp;quot;ca&amp;quot;, capA); p.append(&amp;quot;cb&amp;quot;, capB); p.append(&amp;quot;cv&amp;quot;, $(&amp;quot;nvk-cap&amp;quot;).value);&lt;br /&gt;
    fetch(SEND_URL, { method: &amp;quot;POST&amp;quot;, body: p }).then(function (r) {&lt;br /&gt;
      if (!r.ok) throw new Error(&amp;quot;send&amp;quot;);&lt;br /&gt;
      status(&amp;quot;Danke! Deine Anfrage wurde gesendet, eine Kopie geht an &amp;quot; + mail + &amp;quot;.&amp;quot;, true); newCaptcha();&lt;br /&gt;
    }).catch(function () { status(&amp;quot;Das Senden hat nicht geklappt. Bitte versuche es später noch einmal oder schreibe direkt an &amp;quot; + MAIL_TO + &amp;quot;.&amp;quot;, false); });&lt;br /&gt;
  } else {&lt;br /&gt;
    var AMP = &amp;quot;\u0026&amp;quot;;&lt;br /&gt;
    window.location.href = &amp;quot;mailto:&amp;quot; + MAIL_TO + &amp;quot;?cc=&amp;quot; + encodeURIComponent(mail) + AMP + &amp;quot;subject=&amp;quot; + encodeURIComponent(MAIL_SUBJECT) + AMP + &amp;quot;body=&amp;quot; + encodeURIComponent(text);&lt;br /&gt;
    status(&amp;quot;Dein E-Mail-Programm wurde mit der fertigen Anfrage geöffnet. Bitte dort noch auf Senden klicken.&amp;quot;, true);&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
$(&amp;quot;nvk-reset&amp;quot;).addEventListener(&amp;quot;click&amp;quot;, function () { sel = {}; picked = {}; chosenRadio = null; update(); });&lt;br /&gt;
var legalEl = $(&amp;quot;nvk-legal-links&amp;quot;), firstLink = true;&lt;br /&gt;
[ [&amp;quot;agb&amp;quot;, &amp;quot;AGB&amp;quot;], [&amp;quot;widerruf&amp;quot;, &amp;quot;Widerrufsbelehrung&amp;quot;], [&amp;quot;datenschutz&amp;quot;, &amp;quot;Datenschutzerklärung&amp;quot;] ].forEach(function (x) {&lt;br /&gt;
  var key = x[0];&lt;br /&gt;
  if (!LEGAL[key]) return;&lt;br /&gt;
  if (!firstLink) legalEl.appendChild(document.createTextNode(&amp;quot; | &amp;quot;));&lt;br /&gt;
  firstLink = false; legalEl.appendChild(link(LEGAL[key], x[1]));&lt;br /&gt;
});&lt;br /&gt;
if (LEGAL.datenschutz) {&lt;br /&gt;
  var dl = $(&amp;quot;nvk-dslink&amp;quot;);&lt;br /&gt;
  dl.appendChild(document.createTextNode(&amp;quot; (&amp;quot;)); dl.appendChild(link(LEGAL.datenschutz, &amp;quot;Datenschutzerklärung&amp;quot;)); dl.appendChild(document.createTextNode(&amp;quot;)&amp;quot;));&lt;br /&gt;
}&lt;br /&gt;
newCaptcha();&lt;br /&gt;
update();&lt;br /&gt;
})();&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;Stand: 21.10.2026&amp;lt;/small&amp;gt;&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andre</name></author>
	</entry>
	<entry>
		<id>https://xtrons.ibus-app.de/index.php?title=Android_Radio_Konfigurator&amp;diff=4092</id>
		<title>Android Radio Konfigurator</title>
		<link rel="alternate" type="text/html" href="https://xtrons.ibus-app.de/index.php?title=Android_Radio_Konfigurator&amp;diff=4092"/>
		<updated>2026-10-22T04:37:59Z</updated>

		<summary type="html">&lt;p&gt;Andre: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt; '''Mit diesem Tool kann auf Basis von Fahrzeug und vorhandenen Komponenten eine Liste nötiger Komponenten erstellt werden.&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;big&amp;gt;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.&amp;lt;br&amp;gt;'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
#nvk{max-width:900px;line-height:1.45}&lt;br /&gt;
#nvk *{box-sizing:border-box}&lt;br /&gt;
#nvk .nvk-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:14px;margin:12px 0}&lt;br /&gt;
#nvk .nvk-f label{display:block;font-weight:700;margin-bottom:4px}&lt;br /&gt;
#nvk select{width:100%;padding:9px 8px;font:inherit;color:#202122;background:#fff;border:1px solid #a2a9b1;border-radius:4px}&lt;br /&gt;
#nvk .nvk-help{font-size:.85em;opacity:.75;margin-top:3px}&lt;br /&gt;
#nvk fieldset{border:1px solid rgba(128,128,128,.45);border-radius:6px;padding:10px 14px;margin:14px 0}&lt;br /&gt;
#nvk legend{font-weight:700;padding:0 6px}&lt;br /&gt;
#nvk .nvk-o{display:block;padding:4px 0;cursor:pointer}&lt;br /&gt;
#nvk .nvk-o small{opacity:.7}&lt;br /&gt;
#nvk .nvk-o.dis{opacity:.75;cursor:default}&lt;br /&gt;
#nvk .nvk-btn{padding:7px 14px;font:inherit;border:1px solid #a2a9b1;border-radius:4px;background:#f8f9fa;color:#202122;cursor:pointer}&lt;br /&gt;
#nvk #nvk-out{margin-top:18px}&lt;br /&gt;
#nvk h3{margin:18px 0 8px}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-card.opt{border-left-color:#14866d}&lt;br /&gt;
#nvk .nvk-card.rad{border-left-color:#fff;background:rgba(255,255,255,.08)}&lt;br /&gt;
#nvk .nvk-card b{display:block}&lt;br /&gt;
#nvk .nvk-links{margin-top:4px;font-weight:600}&lt;br /&gt;
#nvk .nvk-links a{margin-right:14px}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-miss{opacity:.8;font-style:italic}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-card .nvk-img{max-width:230px;max-height:150px}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-card.hl{border:2px solid #36c;border-left-width:8px;background:rgba(51,102,204,.12);padding:12px 14px}&lt;br /&gt;
#nvk .nvk-card.hl b{font-size:1.1em}&lt;br /&gt;
#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)}&lt;br /&gt;
#nvk .nvk-row label{flex:1;margin:0;min-width:240px}&lt;br /&gt;
#nvk .nvk-row a{white-space:nowrap;font-weight:600}&lt;br /&gt;
#nvk .nvk-img.wide{max-width:min(100%,460px);max-height:none}&lt;br /&gt;
#nvk #nvk-form{margin-top:22px}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-grid&amp;quot; id=&amp;quot;nvk-fields&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;fieldset id=&amp;quot;nvk-optset&amp;quot;&amp;gt;&amp;lt;legend&amp;gt;Zusatzoptionen&amp;lt;/legend&amp;gt;&amp;lt;div id=&amp;quot;nvk-opts&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/fieldset&amp;gt;&lt;br /&gt;
&amp;lt;button type=&amp;quot;button&amp;quot; class=&amp;quot;nvk-btn&amp;quot; id=&amp;quot;nvk-reset&amp;quot;&amp;gt;Auswahl zurücksetzen&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk-out&amp;quot; aria-live=&amp;quot;polite&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;fieldset id=&amp;quot;nvk-form&amp;quot; style=&amp;quot;display:none&amp;quot;&amp;gt;&amp;lt;legend&amp;gt;Anfrage senden&amp;lt;/legend&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;nvk-help&amp;quot;&amp;gt;Deine Auswahl und die Liste oben werden automatisch mitgesendet. Alle Felder mit * sind Pflicht.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-grid&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-name&amp;quot;&amp;gt;Name *&amp;lt;/label&amp;gt;&amp;lt;input id=&amp;quot;nvk-name&amp;quot; type=&amp;quot;text&amp;quot; autocomplete=&amp;quot;name&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-mail&amp;quot;&amp;gt;E-Mail *&amp;lt;/label&amp;gt;&amp;lt;input id=&amp;quot;nvk-mail&amp;quot; type=&amp;quot;email&amp;quot; autocomplete=&amp;quot;email&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-size&amp;quot;&amp;gt;Gewünschte Displaygröße (optional)&amp;lt;/label&amp;gt;&amp;lt;select id=&amp;quot;nvk-size&amp;quot;&amp;gt;&amp;lt;option value=&amp;quot;&amp;quot;&amp;gt;Keine Angabe / Beratung gewünscht&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;7&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;8.8&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;9&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;10.25&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;12.3&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;14.9&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;Andere Größe (bitte im Kommentar nennen)&amp;lt;/option&amp;gt;&amp;lt;/select&amp;gt;&amp;lt;div class=&amp;quot;nvk-help&amp;quot;&amp;gt;Diagonale in Zoll. Nicht jede Größe gibt es für jede Baureihe, das prüfen wir für Dich.&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-vin&amp;quot;&amp;gt;VIN oder FGN (optional)&amp;lt;/label&amp;gt;&amp;lt;input id=&amp;quot;nvk-vin&amp;quot; type=&amp;quot;text&amp;quot; maxlength=&amp;quot;17&amp;quot; placeholder=&amp;quot;AB12345 oder 17-stellige FGN&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-msg&amp;quot;&amp;gt;Kommentar *&amp;lt;/label&amp;gt;&amp;lt;textarea id=&amp;quot;nvk-msg&amp;quot; rows=&amp;quot;4&amp;quot;&amp;gt;&amp;lt;/textarea&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot; style=&amp;quot;max-width:300px&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-cap&amp;quot; id=&amp;quot;nvk-capq&amp;quot;&amp;gt;Sicherheitsfrage *&amp;lt;/label&amp;gt;&amp;lt;input id=&amp;quot;nvk-cap&amp;quot; type=&amp;quot;text&amp;quot; inputmode=&amp;quot;numeric&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;input id=&amp;quot;nvk-hp&amp;quot; type=&amp;quot;text&amp;quot; tabindex=&amp;quot;-1&amp;quot; autocomplete=&amp;quot;off&amp;quot; aria-hidden=&amp;quot;true&amp;quot; style=&amp;quot;position:absolute;left:-9999px;width:1px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;label class=&amp;quot;nvk-o&amp;quot;&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; id=&amp;quot;nvk-dsgvo&amp;quot;&amp;gt; Ich stimme zu, dass meine Angaben zur Bearbeitung der Anfrage per E-Mail verarbeitet werden.&amp;lt;span id=&amp;quot;nvk-dslink&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; *&amp;lt;/label&amp;gt;&lt;br /&gt;
&amp;lt;button type=&amp;quot;button&amp;quot; class=&amp;quot;nvk-btn&amp;quot; id=&amp;quot;nvk-send&amp;quot;&amp;gt;Anfrage senden&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk-status&amp;quot; class=&amp;quot;nvk-note&amp;quot; style=&amp;quot;display:none&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/fieldset&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk-legal&amp;quot; class=&amp;quot;nvk-help&amp;quot; style=&amp;quot;margin-top:20px&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Hinweis:&amp;lt;/b&amp;gt; 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.&amp;lt;div id=&amp;quot;nvk-legal-links&amp;quot; style=&amp;quot;margin-top:4px&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;noscript&amp;gt;Für den Konfigurator wird JavaScript benötigt.&amp;lt;/noscript&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
(function () {&lt;br /&gt;
&amp;quot;use strict&amp;quot;;&lt;br /&gt;
/* =====================================================================&lt;br /&gt;
   KONFIGURATION - hier wird gepflegt.&lt;br /&gt;
   Textformat in Hinweisen: [b]fett[/b]  [br] Zeilenumbruch  [a=URL]Linktext[/a]&lt;br /&gt;
   Bitte im Skript KEIN kaufmännisches Und, kein Kleiner-/Größer-Zeichen&lt;br /&gt;
   und keine Leerzeilen verwenden (das Wiki wandelt sie um).&lt;br /&gt;
   ===================================================================== */&lt;br /&gt;
var SHOP = &amp;quot;https://shop.ibus-app.de/&amp;quot;;&lt;br /&gt;
var WIKI = &amp;quot;https://wiki.ibus-app.de/index.php?title=&amp;quot;;&lt;br /&gt;
/* Bilder aus dem Wiki (Thumbnail-Adressen; Klick öffnet automatisch das Originalbild) */&lt;br /&gt;
var IM = &amp;quot;https://xtrons.ibus-app.de/images/thumb/&amp;quot;;&lt;br /&gt;
var P = {&lt;br /&gt;
  schema:  IM + &amp;quot;e/ea/BMW_E39_Verl%C3%A4ngerungen_EXL005%2BFAKRA_.png/135px-BMW_E39_Verl%C3%A4ngerungen_EXL005%2BFAKRA_.png&amp;quot;,&lt;br /&gt;
  exl005:  IM + &amp;quot;7/70/Exl005-1.webp/257px-Exl005-1.webp.png&amp;quot;,&lt;br /&gt;
  fakra6m: IM + &amp;quot;d/d8/FM-extension_01_1.png/270px-FM-extension_01_1.png&amp;quot;,&lt;br /&gt;
  isofakra: IM + &amp;quot;4/4e/ISO-FAKRA_1.png/270px-ISO-FAKRA_1.png&amp;quot;,&lt;br /&gt;
  bm24:    IM + &amp;quot;8/82/BM24.png/130px-BM24.png&amp;quot;,&lt;br /&gt;
  iso:     IM + &amp;quot;d/dd/Iso.jpg/69px-Iso.jpg&amp;quot;,&lt;br /&gt;
  bm54:    IM + &amp;quot;3/34/BM54.png/135px-BM54.png&amp;quot;,&lt;br /&gt;
  fakra:   IM + &amp;quot;b/b3/Fakra.jpg/100px-Fakra.jpg&amp;quot;,&lt;br /&gt;
  pfeil:   IM + &amp;quot;e/ee/Navi_E46.jpg/239px-Navi_E46.jpg&amp;quot;,&lt;br /&gt;
  noquad:  IM + &amp;quot;6/68/No_elongation.jpg/180px-No_elongation.jpg&amp;quot;,&lt;br /&gt;
  noexl6:  IM + &amp;quot;7/7b/No_EXL006.jpg/180px-No_EXL006.jpg&amp;quot;,&lt;br /&gt;
  halter:  IM + &amp;quot;3/3b/Halter_Alu.webp/92px-Halter_Alu.webp.png&amp;quot;,&lt;br /&gt;
  deepobd: &amp;quot;https://xtrons.ibus-app.de/images/d/d4/DeepOBD_Interface_1.png&amp;quot;,&lt;br /&gt;
  n43:     IM + &amp;quot;e/e4/Navi4_3.jpg/240px-Navi4_3.jpg&amp;quot;,&lt;br /&gt;
  n169:    IM + &amp;quot;8/8a/Navi16_9.jpg/240px-Navi16_9.jpg&amp;quot;,&lt;br /&gt;
  radio:   IM + &amp;quot;9/96/E39_Radio.jpg/240px-E39_Radio.jpg&amp;quot;,&lt;br /&gt;
  idrive:  &amp;quot;https://xtrons.ibus-app.de/images/0/02/MASK-CCC-CIC-NBT-EVO-iDrive.jpg&amp;quot;,&lt;br /&gt;
  iris:    &amp;quot;https://xtrons.ibus-app.de/images/b/be/BusinessKas_IRISG.jpg&amp;quot;,&lt;br /&gt;
  resler:  &amp;quot;https://xtrons.ibus-app.de/images/d/d1/Resler_Modul_01.png&amp;quot;,&lt;br /&gt;
  can:     &amp;quot;https://xtrons.ibus-app.de/images/6/69/CAN_Interface.png&amp;quot;,&lt;br /&gt;
  funktr:  IM + &amp;quot;7/7e/E46_Funktionstraeger.png/240px-E46_Funktionstraeger.png&amp;quot;&lt;br /&gt;
};&lt;br /&gt;
/* Anfrage-Formular: MAIL_TO = Empfänger. SEND_URL leer = E-Mail-Programm des Kunden öffnen (mailto).&lt;br /&gt;
   SEND_URL = Adresse des Server-Skripts send-anfrage.php = Versand direkt vom Server (mit CC an den Kunden). */&lt;br /&gt;
var MAIL_TO = &amp;quot;info@ibus-app.de&amp;quot;;&lt;br /&gt;
var MAIL_SUBJECT = &amp;quot;Anfrage aus Android Radio Konfigurator&amp;quot;;&lt;br /&gt;
var SEND_URL = &amp;quot;https://xtrons.ibus-app.de/send-anfrage.php&amp;quot;;&lt;br /&gt;
/* Shop-Anbindung: API = radios.php (liefert Radio-Liste und Artikelnummern). Warenkorb = Shopware-Link pro Artikelnummer. */&lt;br /&gt;
var API = &amp;quot;https://xtrons.ibus-app.de/radios.php&amp;quot;;&lt;br /&gt;
/* 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. */&lt;br /&gt;
var CART_TRANSFER = true;&lt;br /&gt;
var CART = &amp;quot;https://shop.ibus-app.de/checkout/cart&amp;quot;;&lt;br /&gt;
/* Rechtliche Seiten (Links unter dem Konfigurator und beim Datenschutz-Haken). Leer = Link wird nicht angezeigt. */&lt;br /&gt;
var LEGAL = { agb: &amp;quot;https://shop.ibus-app.de/allgemeine-geschaeftsbedingungen&amp;quot;, widerruf: &amp;quot;https://shop.ibus-app.de/widerrufsrecht&amp;quot;, datenschutz: &amp;quot;https://shop.ibus-app.de/datenschutz&amp;quot; };&lt;br /&gt;
/* ---- 1) Baureihen --------------------------------------------------------&lt;br /&gt;
   v = Shop-Kategorie (Link: SHOP + bmw-radios/ + v + /)&lt;br /&gt;
   gen: alt = I-BUS-Fahrzeuge (E38/E39/E46/E53/E83)&lt;br /&gt;
        b   = M-ASK / CCC / CIC     c = CIC / NBT / NBT EVO&lt;br /&gt;
   body = Karosserieformen (siehe BODY)                                      */&lt;br /&gt;
var BODY = { limo: &amp;quot;Limousine&amp;quot;, touring: &amp;quot;Touring&amp;quot;, coupe: &amp;quot;Coupé&amp;quot;, cabrio: &amp;quot;Cabrio&amp;quot;, schraeg: &amp;quot;Schrägheck&amp;quot;,&lt;br /&gt;
  compact: &amp;quot;Compact&amp;quot;, gt: &amp;quot;Gran Turismo&amp;quot;, gc: &amp;quot;Gran Coupé&amp;quot;, suv: &amp;quot;SUV / SAV&amp;quot;, roadster: &amp;quot;Roadster&amp;quot; };&lt;br /&gt;
var VEHICLES = [&lt;br /&gt;
  { v: &amp;quot;1er-e8x&amp;quot;, t: &amp;quot;1er E8x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;schraeg,coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;1er-f2x&amp;quot;, t: &amp;quot;1er F2x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;schraeg&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;2er-f2x&amp;quot;, t: &amp;quot;2er F2x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;3er-e46&amp;quot;, t: &amp;quot;3er E46&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;limo,touring,coupe,cabrio,compact&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;3er-e9x&amp;quot;, t: &amp;quot;3er E9x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;limo,touring,coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;3er-f3x&amp;quot;, t: &amp;quot;3er F3x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;limo,touring,gt&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;4er-f3x&amp;quot;, t: &amp;quot;4er F3x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;coupe,cabrio,gc&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;5er-e39&amp;quot;, t: &amp;quot;5er E39&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;limo,touring&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;5er-e6x&amp;quot;, t: &amp;quot;5er E6x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;limo,touring&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;5er-f1x&amp;quot;, t: &amp;quot;5er F1x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;limo,touring,gt&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;6er-e6x&amp;quot;, t: &amp;quot;6er E6x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;7er-e38&amp;quot;, t: &amp;quot;7er E38&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;limo&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;7er-e65&amp;quot;, t: &amp;quot;7er E65&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;limo&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;7er-f01&amp;quot;, t: &amp;quot;7er F01&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;limo&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x1-e84&amp;quot;, t: &amp;quot;X1 E84&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x1-f48&amp;quot;, t: &amp;quot;X1 F48&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x3-e83&amp;quot;, t: &amp;quot;X3 E83&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x3-f25&amp;quot;, t: &amp;quot;X3 F25&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x5-e53&amp;quot;, t: &amp;quot;X5 E53&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x5-e70&amp;quot;, t: &amp;quot;X5 E70&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x5-f15&amp;quot;, t: &amp;quot;X5 F15&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x6-e71&amp;quot;, t: &amp;quot;X6 E71&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;z4-e85e86&amp;quot;, t: &amp;quot;Z4 E85/E86&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;roadster,coupe&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;z4-e89&amp;quot;, t: &amp;quot;Z4 E89&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;roadster&amp;quot;, noCat: true }&lt;br /&gt;
];&lt;br /&gt;
/* Fahrzeuge mit K-CAN App (Beta) */&lt;br /&gt;
var KCAN = [&amp;quot;1er-e8x&amp;quot;, &amp;quot;3er-e9x&amp;quot;, &amp;quot;5er-e6x&amp;quot;, &amp;quot;6er-e6x&amp;quot;, &amp;quot;7er-e65&amp;quot;, &amp;quot;x1-e84&amp;quot;, &amp;quot;x5-e70&amp;quot;, &amp;quot;x6-e71&amp;quot;, &amp;quot;z4-e89&amp;quot;];&lt;br /&gt;
var bodyValues = Object.keys(BODY).map(function (k) {&lt;br /&gt;
  return { v: k, t: BODY[k], only: { vehicle: VEHICLES.filter(function (x) { return x.body.split(&amp;quot;,&amp;quot;).indexOf(k) !== -1; }).map(function (x) { return x.v; }) } };&lt;br /&gt;
});&lt;br /&gt;
/* ---- 2) Auswahlfelder ------------------------------------------------------&lt;br /&gt;
   only = Wert nur anbieten, wenn Bedingung passt   show = Feld nur dann zeigen&lt;br /&gt;
   optional = muss nicht gewählt werden             auto = bei nur einem Wert vorwählen */&lt;br /&gt;
var FIELDS = [&lt;br /&gt;
  { id: &amp;quot;vehicle&amp;quot;, label: &amp;quot;Fahrzeug&amp;quot;, values: VEHICLES.map(function (x) { return { v: x.v, t: &amp;quot;BMW &amp;quot; + x.t }; }) },&lt;br /&gt;
  { id: &amp;quot;factory&amp;quot;, label: &amp;quot;Verbaut ab Werk&amp;quot;, pre: { when: { gen: [&amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;] }, html: &amp;quot;[b]So erkennst Du Dein System:[/b][br][imgw=&amp;quot; + P.idrive + &amp;quot;]&amp;quot; }, values: [&lt;br /&gt;
    { v: &amp;quot;iris&amp;quot;,  t: &amp;quot;Radio mit IRIS&amp;quot;, only: { vehicle: [&amp;quot;3er-e46&amp;quot;, &amp;quot;5er-e39&amp;quot;, &amp;quot;7er-e38&amp;quot;, &amp;quot;x5-e53&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.iris + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;mid&amp;quot;,   t: &amp;quot;Radio mit MID&amp;quot;,  only: { gen: [&amp;quot;alt&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.radio + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;n43&amp;quot;,   t: &amp;quot;4:3 Navi&amp;quot;,       only: { vehicle: [&amp;quot;5er-e39&amp;quot;, &amp;quot;7er-e38&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.n43 + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;n169&amp;quot;,  t: &amp;quot;16:9 Navi&amp;quot;,      only: { gen: [&amp;quot;alt&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.n169 + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;pfeil&amp;quot;, t: &amp;quot;Pfeilnavi&amp;quot;,      only: { vehicle: [&amp;quot;3er-e46&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.pfeil + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;mask&amp;quot;,  t: &amp;quot;M-ASK&amp;quot;,          only: { gen: [&amp;quot;b&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;ccc&amp;quot;,   t: &amp;quot;CCC&amp;quot;,            only: { gen: [&amp;quot;b&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;cic&amp;quot;,   t: &amp;quot;CIC&amp;quot;,            only: { gen: [&amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;nbt&amp;quot;,   t: &amp;quot;NBT&amp;quot;,            only: { gen: [&amp;quot;c&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;nbtevo&amp;quot;, t: &amp;quot;NBT EVO&amp;quot;,       only: { gen: [&amp;quot;c&amp;quot;] } } ] },&lt;br /&gt;
  { id: &amp;quot;trunk&amp;quot;, label: &amp;quot;Wo sitzt das Radiomodul des Pfeilnavis?&amp;quot;, optional: true, show: { factory: [&amp;quot;pfeil&amp;quot;] },&lt;br /&gt;
    help: &amp;quot;Bitte prüfen: Sitzt das Modul im Kofferraum, oder im Pfeilnavi selbst (Quadlock hinten neben dem Antennenstecker)?[br][img=&amp;quot; + P.pfeil + &amp;quot;]&amp;quot;,&lt;br /&gt;
    values: [&lt;br /&gt;
    { v: &amp;quot;ja&amp;quot;, t: &amp;quot;Im Kofferraum (Verlängerungen nötig)&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;nein&amp;quot;, t: &amp;quot;Im Pfeilnavi, Quadlock hinten (keine Verlängerung)&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;unk&amp;quot;, t: &amp;quot;Weiß ich nicht&amp;quot; } ] },&lt;br /&gt;
  { id: &amp;quot;aux&amp;quot;, label: &amp;quot;AUX-IN verfügbar?&amp;quot;, show: { gen: [&amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;] }, values: [&lt;br /&gt;
    { v: &amp;quot;ja&amp;quot;, t: &amp;quot;Ja&amp;quot; }, { v: &amp;quot;nein&amp;quot;, t: &amp;quot;Nein&amp;quot; } ] },&lt;br /&gt;
  { id: &amp;quot;sound&amp;quot;, label: &amp;quot;Soundsystem&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;stereo&amp;quot;, t: &amp;quot;Stereo&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;hifi&amp;quot;,   t: &amp;quot;Hifi&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;dsp&amp;quot;,    t: &amp;quot;DSP&amp;quot;, only: { vehicle: [&amp;quot;7er-e38&amp;quot;, &amp;quot;5er-e39&amp;quot;, &amp;quot;x5-e53&amp;quot;, &amp;quot;x3-e83&amp;quot;] }, info: &amp;quot;[a=&amp;quot; + WIKI + &amp;quot;Habe_ich_DSP%3F]Habe ich DSP?[/a]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;hk&amp;quot;,     t: &amp;quot;Harman Kardon&amp;quot;, only: { vehicle: [&amp;quot;3er-e46&amp;quot;, &amp;quot;z4-e85e86&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;logic7&amp;quot;, t: &amp;quot;Logic7&amp;quot;, only: { vehicle: [&amp;quot;3er-e9x&amp;quot;, &amp;quot;5er-e6x&amp;quot;, &amp;quot;6er-e6x&amp;quot;, &amp;quot;7er-e65&amp;quot;, &amp;quot;1er-e8x&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;hksur&amp;quot;,  t: &amp;quot;Harman Kardon Surround&amp;quot;, only: { vehicle: [&amp;quot;1er-f2x&amp;quot;, &amp;quot;2er-f2x&amp;quot;, &amp;quot;3er-f3x&amp;quot;, &amp;quot;4er-f3x&amp;quot;, &amp;quot;5er-f1x&amp;quot;] } } ] },&lt;br /&gt;
  { id: &amp;quot;current&amp;quot;, label: &amp;quot;Aktuell verbaut&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;werk&amp;quot;, t: &amp;quot;Werksradio / Werksnavi&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;nach&amp;quot;, t: &amp;quot;Nachrüst-Radio / -Navi&amp;quot; } ] },&lt;br /&gt;
  { id: &amp;quot;body&amp;quot;, label: &amp;quot;Karosserie&amp;quot;, auto: true, values: bodyValues },&lt;br /&gt;
  { id: &amp;quot;ant&amp;quot;, label: &amp;quot;Antennenstecker am Radio (optional)&amp;quot;, optional: true, def: &amp;quot;unk&amp;quot;,&lt;br /&gt;
    show: { vehicle: [&amp;quot;7er-e38&amp;quot;, &amp;quot;5er-e39&amp;quot;, &amp;quot;3er-e46&amp;quot;, &amp;quot;x5-e53&amp;quot;] },&lt;br /&gt;
    values: [&lt;br /&gt;
    { v: &amp;quot;unk&amp;quot;,   t: &amp;quot;Weiß ich nicht&amp;quot;, info: &amp;quot;[b]BM24[/b] (Rundpin) = ISO-Antennenstecker:[br][img=&amp;quot; + P.bm24 + &amp;quot;][img=&amp;quot; + P.iso + &amp;quot;][br][b]BM54[/b] = FAKRA:[br][img=&amp;quot; + P.bm54 + &amp;quot;][img=&amp;quot; + P.fakra + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;iso&amp;quot;,   t: &amp;quot;ISO (BM24, Rundpin)&amp;quot;, info: &amp;quot;[img=&amp;quot; + P.bm24 + &amp;quot;][img=&amp;quot; + P.iso + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;fakra&amp;quot;, t: &amp;quot;FAKRA (BM54)&amp;quot;, info: &amp;quot;[img=&amp;quot; + P.bm54 + &amp;quot;][img=&amp;quot; + P.fakra + &amp;quot;]&amp;quot; } ] }&lt;br /&gt;
];&lt;br /&gt;
/* ---- 3) Zusatzoptionen (Mehrfachauswahl) ---------------------------------&lt;br /&gt;
   show = nur sichtbar wenn Bedingung passt   requires = nur sichtbar wenn diese Optionen gewählt sind&lt;br /&gt;
   excl = Optionen derselben Gruppe schließen sich aus   items = Artikel aus ITEMS */&lt;br /&gt;
var OPTS = [&lt;br /&gt;
  { id: &amp;quot;halter&amp;quot;,  t: &amp;quot;Radio-Halter&amp;quot;, sub: &amp;quot;nur BMW E39&amp;quot;, show: { vehicle: [&amp;quot;5er-e39&amp;quot;] }, items: [&amp;quot;halter&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;ibus&amp;quot;,    t: &amp;quot;I-BUS App&amp;quot;, show: { gen: [&amp;quot;alt&amp;quot;] }, items: [&amp;quot;ibus&amp;quot;, &amp;quot;resler&amp;quot;, &amp;quot;bclic&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;deepobd&amp;quot;, t: &amp;quot;DeepOBD (Diagnose)&amp;quot;, items: [&amp;quot;deepobd&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;can&amp;quot;,     t: &amp;quot;CAN Interface&amp;quot;, sub: &amp;quot;Addon - nur mit I-BUS App&amp;quot;, show: { gen: [&amp;quot;alt&amp;quot;] }, requires: [&amp;quot;ibus&amp;quot;], items: [&amp;quot;can&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;kcan&amp;quot;,    t: &amp;quot;K-CAN App (Beta)&amp;quot;, sub: &amp;quot;Pendant zur I-BUS App&amp;quot;, show: { vehicle: KCAN }, items: [&amp;quot;kcan&amp;quot;, &amp;quot;kcanlic&amp;quot;, &amp;quot;can&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;tpms&amp;quot;,    t: &amp;quot;TPMS (Reifendruck)&amp;quot;, items: [&amp;quot;tpms&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;dab1&amp;quot;,    t: &amp;quot;DAB+ (Single Receiver)&amp;quot;, excl: &amp;quot;dab&amp;quot;, items: [&amp;quot;dab1&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;dab2&amp;quot;,    t: &amp;quot;DAB+ (Dual Receiver)&amp;quot;,   excl: &amp;quot;dab&amp;quot;, items: [&amp;quot;dab2&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;rcam&amp;quot;,    t: &amp;quot;Rückfahrkamera&amp;quot;, items: [&amp;quot;rcam&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;fcam&amp;quot;,    t: &amp;quot;Front-Kamera&amp;quot;, items: [&amp;quot;fcam&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;tool&amp;quot;,    t: &amp;quot;Einbau-Werkzeug (Kunststoffheber)&amp;quot;, items: [&amp;quot;tool&amp;quot;] }&lt;br /&gt;
];&lt;br /&gt;
/* Erzwungene Optionen (werden automatisch gesetzt und gesperrt) */&lt;br /&gt;
var FORCED = [&lt;br /&gt;
  { when: { sound: [&amp;quot;dsp&amp;quot;] }, opts: [&amp;quot;ibus&amp;quot;], why: &amp;quot;wegen DSP erforderlich&amp;quot; }&lt;br /&gt;
];&lt;br /&gt;
/* ---- 4) Artikel ------------------------------------------------------------&lt;br /&gt;
   u = Shop-Link (ut = Linktext)   w = Wiki-Link (wt = Linktext)   leer = kein Link&lt;br /&gt;
   skipIf = Artikel entfällt, wenn der genannte Artikel schon in der Liste steht */&lt;br /&gt;
var ITEMS = {&lt;br /&gt;
  exl005:  { t: &amp;quot;Verlängerung EXL005&amp;quot;, d: &amp;quot;Ersetzt das Radiomodul im Kofferraum.&amp;quot;, u: SHOP + &amp;quot;detail/index/sArticle/212/&amp;quot;, img: [P.exl005, P.schema] },&lt;br /&gt;
  fakra6m: { t: &amp;quot;Verlängerung 6 m FAKRA(m) auf FAKRA(f), gewinkelt&amp;quot;, d: &amp;quot;Antennenverlängerung vom Kofferraum nach vorn.&amp;quot;, img: [P.fakra6m],&lt;br /&gt;
             u: SHOP + &amp;quot;shop/zubehoer/adapterkabel/192/verlaengerung-6m-fakra-m-auf-fakra-f-kurz-gewinkelt&amp;quot; },&lt;br /&gt;
  isoada:  { t: &amp;quot;Adapter ISO-Stecker auf FAKRA, gewinkelt (15 cm)&amp;quot;, d: &amp;quot;Nötig bei ISO-Antennenstecker (BM24, Rundpin).&amp;quot;, img: [P.isofakra],&lt;br /&gt;
             u: SHOP + &amp;quot;shop/zubehoer/adapterkabel/193/adapter-kabel-iso-f-auf-fakra-f-kurz-gewinkelt-15cm&amp;quot; },&lt;br /&gt;
  bcdsp:   { t: &amp;quot;I-BUS App - BC+DSP Lizenz&amp;quot;, d: &amp;quot;Ohne DSP-Lizenz arbeitet das Werks-DSP nicht.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/lizenzen/171/i-bus-app-bc-dsp-lizenz&amp;quot;,&lt;br /&gt;
             w: WIKI + &amp;quot;Habe_ich_DSP%3F&amp;quot;, wt: &amp;quot;Wiki: Habe ich DSP?&amp;quot; },&lt;br /&gt;
  halter:  { t: &amp;quot;Alu-Halter zur Radio-Montage im BMW E39&amp;quot;, d: &amp;quot;Empfohlen bei Radios, die nicht von AVIN stammen.&amp;quot;, img: [P.halter],&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/radiohalter/185/alu-halter-zur-radio-montage-im-bmw-e39&amp;quot; },&lt;br /&gt;
  ibus:    { t: &amp;quot;I-BUS App&amp;quot;, hl: true,&lt;br /&gt;
             d: &amp;quot;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.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;cat/index/sCategory/42&amp;quot;,&lt;br /&gt;
             links: [&lt;br /&gt;
               { u: WIKI + &amp;quot;Was_brauche_ich_um_die_I-BUS_App_nutzen_zu_k%C3%B6nnen%3F&amp;quot;, t: &amp;quot;Wiki: Was brauche ich für die I-BUS App?&amp;quot; },&lt;br /&gt;
               { u: WIKI + &amp;quot;Funktionen&amp;quot;, t: &amp;quot;Liste aller I-BUS App Funktionen (BMW E38|E39|E46|E53|E83)&amp;quot; },&lt;br /&gt;
               { u: WIKI + &amp;quot;Was_geht_beim_BMW_E46_nicht&amp;quot;, t: &amp;quot;Was geht beim BMW E46, E83, E85,.. nicht? (da werkseitig nicht verbaut)&amp;quot; },&lt;br /&gt;
               { u: WIKI + &amp;quot;Funktionseinschr%C3%A4nkungen_nach_Baujahr/Ausstattung/Modell&amp;quot;, t: &amp;quot;Funktionseinschränkungen nach Baujahr/Ausstattung/Modell&amp;quot; } ] },&lt;br /&gt;
  resler:  { t: &amp;quot;Resler USB I-BUS Modul inkl. Anschlusskabel&amp;quot;, d: &amp;quot;Verbindet I-BUS App und Fahrzeug.&amp;quot;, img: [P.resler],&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/interfaces-module/191/resler-usb-i-bus-modul-inkl.-anschlusskabel&amp;quot;,&lt;br /&gt;
             w: &amp;quot;https://wiki.ibus-app.de/index.php?title=Hauptseite#Einbauanleitung_f.C3.BCr_Resler_Modul_und_Resler_Interface&amp;quot;, wt: &amp;quot;Einbauanleitung Resler Modul&amp;quot; },&lt;br /&gt;
  bclic:   { t: &amp;quot;I-BUS App - BC Lizenz&amp;quot;, d: &amp;quot;Schaltet u. a. die BC-Daten der App frei.&amp;quot;, skipIf: &amp;quot;bcdsp&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/lizenzen/167/i-bus-app-bc-lizenz&amp;quot; },&lt;br /&gt;
  deepobd: { t: &amp;quot;Deep OBD OBD-II Bluetooth-Adapter&amp;quot;, d: &amp;quot;Live-Werte auslesen, Fehler lesen und löschen.&amp;quot;, img: [P.deepobd],&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/interfaces-module/258/deep-obd-obd-ii-bluetooth-adapter?c=54&amp;quot;,&lt;br /&gt;
             w: &amp;quot;https://xtrons.ibus-app.de/index.php?title=DeepOBD_-_Adapter_und_App_einrichten&amp;quot;, wt: &amp;quot;Wiki: DeepOBD einrichten&amp;quot; },&lt;br /&gt;
  can:     { t: &amp;quot;CAN-Bus Interface inkl. Anschlusskabel&amp;quot;, d: &amp;quot;Addon, funktioniert nur zusammen mit der I-BUS App bzw. der K-CAN App.&amp;quot;, img: [P.can],&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/interfaces-module/346/can-bus-interface-inkl.-anschlusskabel&amp;quot;,&lt;br /&gt;
             w: WIKI + &amp;quot;Einbauanleitung_CAN-Bus_Interface&amp;quot;, wt: &amp;quot;Einbauanleitung CAN-Bus Interface&amp;quot; },&lt;br /&gt;
  kcan:    { t: &amp;quot;K-CAN App (Beta)&amp;quot;, d: &amp;quot;Pendant zur I-BUS App für Fahrzeuge mit K-CAN, aktuell als Betaversion.&amp;quot;,&lt;br /&gt;
             w: &amp;quot;https://wiki.kcan-app.de/&amp;quot;, wt: &amp;quot;Wiki zur K-CAN App&amp;quot; },&lt;br /&gt;
  kcanlic: { t: &amp;quot;K-CAN App - Lizenz Betaversion&amp;quot;, d: &amp;quot;Beta-Lizenz für die K-CAN App.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/lizenzen/358/k-can-app-lizenz-betaversion&amp;quot; },&lt;br /&gt;
  tpms:    { t: &amp;quot;TPMS - Reifendruckkontrolle&amp;quot;, d: &amp;quot;&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/tpms/&amp;quot; },&lt;br /&gt;
  dab1:    { t: &amp;quot;DAB+ Empfänger inkl. Antenne (Single)&amp;quot;, d: &amp;quot;&amp;quot;, w: &amp;quot;https://xtrons.ibus-app.de/index.php?title=Installation_der_DAB%2B_Antenne&amp;quot;, wt: &amp;quot;Installation der DAB+ Antenne&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/dab/291/dab-empfaenger-inkl.-antenne-usbdab04&amp;quot; },&lt;br /&gt;
  dab2:    { t: &amp;quot;Dual DAB+ Empfänger-Stick inkl. 2 Antennen&amp;quot;, d: &amp;quot;&amp;quot;, w: &amp;quot;https://xtrons.ibus-app.de/index.php?title=Installation_der_DAB%2B_Antenne&amp;quot;, wt: &amp;quot;Installation der DAB+ Antenne&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/dab/391/dual-dab-empfaenger-stick-inkl.-2-antennen-acusbdab05t?c=75&amp;quot; },&lt;br /&gt;
  rcam:    { t: &amp;quot;Rückfahrkamera&amp;quot;, d: &amp;quot;&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/kameras/&amp;quot;, ut: &amp;quot;Kameras im Shop ansehen →&amp;quot; },&lt;br /&gt;
  fcam:    { t: &amp;quot;Front-Kamera&amp;quot;, d: &amp;quot;&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/kameras/&amp;quot;, ut: &amp;quot;Kameras im Shop ansehen →&amp;quot; },&lt;br /&gt;
  tool:    { t: &amp;quot;Einbau-Werkzeug (Kunststoffheber)&amp;quot;, d: &amp;quot;Zum schonenden Lösen der Verkleidungen.&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/einbauwerkzeug/&amp;quot; }&lt;br /&gt;
};&lt;br /&gt;
/* ---- 5) Regeln --------------------------------------------------------------&lt;br /&gt;
   type: need (Das brauchst Du) oder hint (Hinweise)   when = Bedingung auf die Felder&lt;br /&gt;
   opts = diese Zusatzoptionen müssen gewählt sein      items = Artikel   html = Text&lt;br /&gt;
   Abgeleitete Werte: gen (alt/b/c) und module (ja/nein/unk = Radiomodul im Kofferraum, nur gen alt) */&lt;br /&gt;
var RULES = [&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { current: [&amp;quot;werk&amp;quot;], module: [&amp;quot;ja&amp;quot;] }, items: [&amp;quot;exl005&amp;quot;, &amp;quot;fakra6m&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { current: [&amp;quot;nach&amp;quot;], module: [&amp;quot;ja&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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=&amp;quot; + P.noquad + &amp;quot;][img=&amp;quot; + P.noexl6 + &amp;quot;]&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;ja&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;nein&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;unk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { ant: [&amp;quot;iso&amp;quot;] }, items: [&amp;quot;isoada&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { ant: [&amp;quot;unk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Antennenstecker:[/b] [b]BM24[/b] (Rundpin) = ISO-Antennenstecker, ggf. wird der [a=&amp;quot; + SHOP + &amp;quot;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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { sound: [&amp;quot;dsp&amp;quot;] }, items: [&amp;quot;bcdsp&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { sound: [&amp;quot;dsp&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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=&amp;quot; + WIKI + &amp;quot;Habe_ich_DSP%3F]Habe ich DSP?[/a]&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { sound: [&amp;quot;hk&amp;quot;], gen: [&amp;quot;alt&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Harman Kardon:[/b] Benötigt [b]keine[/b] DSP-Lizenz. Das Remote-Signal (+12 V, wenn Radio an) genügt zum Starten.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { aux: [&amp;quot;nein&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]AUX-IN:[/b] Der AUX-IN muss codiert werden. Optional kann ein FM-Transmitter genutzt werden - das ist nicht empfohlen.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;7er-e38&amp;quot;, &amp;quot;x5-e53&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Montage:[/b] Radios für BMW E38/E53 benötigen keine extra Halterungen.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;5er-e39&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;3er-e46&amp;quot;], factory: [&amp;quot;iris&amp;quot;, &amp;quot;mid&amp;quot;, &amp;quot;pfeil&amp;quot;], current: [&amp;quot;werk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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]&amp;quot; +&lt;br /&gt;
          &amp;quot;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]&amp;quot; +&lt;br /&gt;
          &amp;quot;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=&amp;quot; + P.funktr + &amp;quot;]&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { factory: [&amp;quot;cic&amp;quot;, &amp;quot;nbt&amp;quot;, &amp;quot;nbtevo&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Lichtleiter:[/b] Ggf. vorhandene Lichtleiter (MOST) müssen aus dem BMW-Stecker in den Xtrons-Adapter umgesteckt werden.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { factory: [&amp;quot;mask&amp;quot;, &amp;quot;ccc&amp;quot;, &amp;quot;cic&amp;quot;, &amp;quot;nbt&amp;quot;, &amp;quot;nbtevo&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, opts: [&amp;quot;kcan&amp;quot;], when: {},&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, opts: [&amp;quot;ibus&amp;quot;], when: {},&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: {},&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot; }&lt;br /&gt;
];&lt;br /&gt;
/* =====================================================================&lt;br /&gt;
   PROGRAMMLOGIK&lt;br /&gt;
   ===================================================================== */&lt;br /&gt;
var $ = function (id) { return document.getElementById(id); };&lt;br /&gt;
var sel = {}, picked = {}, summary = &amp;quot;&amp;quot;, capA = 0, capB = 0, radioCache = {}, chosenRadio = null, cartFill = null;&lt;br /&gt;
var fieldsEl = $(&amp;quot;nvk-fields&amp;quot;), optsEl = $(&amp;quot;nvk-opts&amp;quot;), outEl = $(&amp;quot;nvk-out&amp;quot;);&lt;br /&gt;
function full(u) { return u.indexOf(&amp;quot;/thumb/&amp;quot;) === -1 ? u : u.replace(&amp;quot;/thumb/&amp;quot;, &amp;quot;/&amp;quot;).replace(/\/[^\/]+$/, &amp;quot;&amp;quot;); }&lt;br /&gt;
function fmt(t) {&lt;br /&gt;
  return t.replace(/\[imgw=([^\x5D]+)\]/g, function (m, u) {&lt;br /&gt;
    return &amp;quot;\u003Ca href=\&amp;quot;&amp;quot; + full(u) + &amp;quot;\&amp;quot; target=\&amp;quot;_blank\&amp;quot; rel=\&amp;quot;noopener\&amp;quot;\u003E\u003Cimg class=\&amp;quot;nvk-img wide\&amp;quot; src=\&amp;quot;&amp;quot; + u + &amp;quot;\&amp;quot; alt=\&amp;quot;\&amp;quot;\u003E\u003C/a\u003E&amp;quot;;&lt;br /&gt;
  }).replace(/\[img=([^\x5D]+)\]/g, function (m, u) {&lt;br /&gt;
    return &amp;quot;\u003Ca href=\&amp;quot;&amp;quot; + full(u) + &amp;quot;\&amp;quot; target=\&amp;quot;_blank\&amp;quot; rel=\&amp;quot;noopener\&amp;quot;\u003E\u003Cimg class=\&amp;quot;nvk-img\&amp;quot; src=\&amp;quot;&amp;quot; + u + &amp;quot;\&amp;quot; alt=\&amp;quot;\&amp;quot;\u003E\u003C/a\u003E&amp;quot;;&lt;br /&gt;
  }).replace(/\[b\]/g, &amp;quot;\u003Cb\u003E&amp;quot;).replace(/\[\/b\]/g, &amp;quot;\u003C/b\u003E&amp;quot;).replace(/\[br\]/g, &amp;quot;\u003Cbr\u003E&amp;quot;)&lt;br /&gt;
    .replace(/\[a=([^\x5D]+)\]/g, &amp;quot;\u003Ca href=\&amp;quot;$1\&amp;quot; target=\&amp;quot;_blank\&amp;quot; rel=\&amp;quot;noopener\&amp;quot;\u003E&amp;quot;).replace(/\[\/a\]/g, &amp;quot;\u003C/a\u003E&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
function match(cond, s, lenient) {&lt;br /&gt;
  if (!cond) return true;&lt;br /&gt;
  for (var k in cond) {&lt;br /&gt;
    if (!s[k]) { if (lenient) continue; return false; }&lt;br /&gt;
    if (cond[k].indexOf(s[k]) === -1) return false;&lt;br /&gt;
  }&lt;br /&gt;
  return true;&lt;br /&gt;
}&lt;br /&gt;
function vehicleOf(id) { return VEHICLES.filter(function (x) { return x.v === id; })[0]; }&lt;br /&gt;
function derive() {&lt;br /&gt;
  var s = {}, k;&lt;br /&gt;
  for (k in sel) s[k] = sel[k];&lt;br /&gt;
  var veh = vehicleOf(sel.vehicle);&lt;br /&gt;
  if (veh) s.gen = veh.gen;&lt;br /&gt;
  if (s.gen === &amp;quot;alt&amp;quot;) {&lt;br /&gt;
    if (s.factory === &amp;quot;n43&amp;quot; || s.factory === &amp;quot;n169&amp;quot;) s.module = &amp;quot;ja&amp;quot;;&lt;br /&gt;
    else if (s.factory === &amp;quot;iris&amp;quot; || s.factory === &amp;quot;mid&amp;quot;) s.module = &amp;quot;nein&amp;quot;;&lt;br /&gt;
    else if (s.factory === &amp;quot;pfeil&amp;quot;) s.module = s.trunk || &amp;quot;unk&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  return s;&lt;br /&gt;
}&lt;br /&gt;
function forced(s) {&lt;br /&gt;
  var f = {};&lt;br /&gt;
  FORCED.forEach(function (r) { if (match(r.when, s)) r.opts.forEach(function (o) { f[o] = r.why; }); });&lt;br /&gt;
  return f;&lt;br /&gt;
}&lt;br /&gt;
function onSet(s) {&lt;br /&gt;
  var f = forced(s), on = {}, k;&lt;br /&gt;
  for (k in picked) if (picked[k]) on[k] = true;&lt;br /&gt;
  for (k in f) on[k] = true;&lt;br /&gt;
  return { on: on, forced: f };&lt;br /&gt;
}&lt;br /&gt;
function optVisible(o, s, on) {&lt;br /&gt;
  if (!match(o.show, s, true)) return false;&lt;br /&gt;
  return (o.requires || []).every(function (r) { return on[r]; });&lt;br /&gt;
}&lt;br /&gt;
FIELDS.forEach(function (f) {&lt;br /&gt;
  var wrap = document.createElement(&amp;quot;div&amp;quot;); wrap.className = &amp;quot;nvk-f&amp;quot;; wrap.id = &amp;quot;nvk-w-&amp;quot; + f.id;&lt;br /&gt;
  var lab = document.createElement(&amp;quot;label&amp;quot;); lab.htmlFor = &amp;quot;nvk-&amp;quot; + f.id; lab.textContent = f.label;&lt;br /&gt;
  var s = document.createElement(&amp;quot;select&amp;quot;); s.id = &amp;quot;nvk-&amp;quot; + f.id;&lt;br /&gt;
  s.addEventListener(&amp;quot;change&amp;quot;, function () { sel[f.id] = s.value; update(); });&lt;br /&gt;
  wrap.appendChild(lab); wrap.appendChild(s);&lt;br /&gt;
  if (f.help) { var h = document.createElement(&amp;quot;div&amp;quot;); h.className = &amp;quot;nvk-help&amp;quot;; h.innerHTML = fmt(f.help); wrap.appendChild(h); }&lt;br /&gt;
  var inf = document.createElement(&amp;quot;div&amp;quot;); inf.id = &amp;quot;nvk-i-&amp;quot; + f.id; wrap.appendChild(inf);&lt;br /&gt;
  fieldsEl.appendChild(wrap);&lt;br /&gt;
});&lt;br /&gt;
function renderFields() {&lt;br /&gt;
  FIELDS.forEach(function (f) {&lt;br /&gt;
    var s = derive();&lt;br /&gt;
    var wrap = $(&amp;quot;nvk-w-&amp;quot; + f.id), el = $(&amp;quot;nvk-&amp;quot; + f.id);&lt;br /&gt;
    var vis = f.show ? match(f.show, s, false) : true;&lt;br /&gt;
    wrap.style.display = vis ? &amp;quot;&amp;quot; : &amp;quot;none&amp;quot;;&lt;br /&gt;
    if (!vis) { sel[f.id] = &amp;quot;&amp;quot;; return; }&lt;br /&gt;
    var allowed = f.values.filter(function (v) { return match(v.only, s, true); });&lt;br /&gt;
    if (sel[f.id]) { if (!allowed.some(function (v) { return v.v === sel[f.id]; })) sel[f.id] = &amp;quot;&amp;quot;; }&lt;br /&gt;
    if (!sel[f.id]) { if (f.def) sel[f.id] = f.def; }&lt;br /&gt;
    if (!sel[f.id]) { if (f.auto) { if (sel.vehicle) { if (allowed.length === 1) sel[f.id] = allowed[0].v; } } }&lt;br /&gt;
    el.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
    if (!f.def) { var p = document.createElement(&amp;quot;option&amp;quot;); p.value = &amp;quot;&amp;quot;; p.textContent = &amp;quot;– bitte wählen –&amp;quot;; el.appendChild(p); }&lt;br /&gt;
    allowed.forEach(function (v) {&lt;br /&gt;
      var o = document.createElement(&amp;quot;option&amp;quot;); o.value = v.v; o.textContent = v.t; el.appendChild(o);&lt;br /&gt;
    });&lt;br /&gt;
    el.value = sel[f.id] || &amp;quot;&amp;quot;;&lt;br /&gt;
    var cur = allowed.filter(function (v) { return v.v === sel[f.id]; })[0];&lt;br /&gt;
    var pre = f.pre ? (match(f.pre.when, s, false) ? fmt(f.pre.html) : &amp;quot;&amp;quot;) : &amp;quot;&amp;quot;;&lt;br /&gt;
    $(&amp;quot;nvk-i-&amp;quot; + f.id).innerHTML = pre + (cur ? (cur.info ? fmt(cur.info) : &amp;quot;&amp;quot;) : &amp;quot;&amp;quot;);&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
function renderOpts() {&lt;br /&gt;
  var s = derive(), st = onSet(s);&lt;br /&gt;
  OPTS.forEach(function (o) { if (!optVisible(o, s, st.on)) picked[o.id] = false; });&lt;br /&gt;
  st = onSet(s);&lt;br /&gt;
  optsEl.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
  OPTS.forEach(function (o) {&lt;br /&gt;
    if (!optVisible(o, s, st.on)) return;&lt;br /&gt;
    var lab = document.createElement(&amp;quot;label&amp;quot;); lab.className = &amp;quot;nvk-o&amp;quot;;&lt;br /&gt;
    var cb = document.createElement(&amp;quot;input&amp;quot;); cb.type = &amp;quot;checkbox&amp;quot;;&lt;br /&gt;
    cb.checked = !!st.on[o.id];&lt;br /&gt;
    var isForced = !!st.forced[o.id];&lt;br /&gt;
    if (isForced) { cb.disabled = true; lab.className += &amp;quot; dis&amp;quot;; }&lt;br /&gt;
    cb.addEventListener(&amp;quot;change&amp;quot;, function () {&lt;br /&gt;
      picked[o.id] = cb.checked;&lt;br /&gt;
      if (cb.checked) { if (o.excl) OPTS.forEach(function (x) { if (x.excl === o.excl) { if (x.id !== o.id) picked[x.id] = false; } }); }&lt;br /&gt;
      update();&lt;br /&gt;
    });&lt;br /&gt;
    lab.appendChild(cb);&lt;br /&gt;
    lab.appendChild(document.createTextNode(&amp;quot; &amp;quot; + o.t));&lt;br /&gt;
    var sub = [o.sub, isForced ? st.forced[o.id] : &amp;quot;&amp;quot;].filter(Boolean).join(&amp;quot; - &amp;quot;);&lt;br /&gt;
    if (sub) { var sm = document.createElement(&amp;quot;small&amp;quot;); sm.textContent = &amp;quot; (&amp;quot; + sub + &amp;quot;)&amp;quot;; lab.appendChild(sm); }&lt;br /&gt;
    optsEl.appendChild(lab);&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
function link(url, text) {&lt;br /&gt;
  var a = document.createElement(&amp;quot;a&amp;quot;); a.href = url; a.target = &amp;quot;_blank&amp;quot;; a.rel = &amp;quot;noopener&amp;quot;; a.textContent = text; return a;&lt;br /&gt;
}&lt;br /&gt;
function card(item, cls) {&lt;br /&gt;
  var d = document.createElement(&amp;quot;div&amp;quot;); d.className = &amp;quot;nvk-card &amp;quot; + (cls || &amp;quot;&amp;quot;) + (item.hl ? &amp;quot; hl&amp;quot; : &amp;quot;&amp;quot;);&lt;br /&gt;
  var b = document.createElement(&amp;quot;b&amp;quot;); b.textContent = item.t; d.appendChild(b);&lt;br /&gt;
  if (item.d) { var p = document.createElement(&amp;quot;span&amp;quot;); p.textContent = item.d; d.appendChild(p); }&lt;br /&gt;
  if (item.img) {&lt;br /&gt;
    var im = document.createElement(&amp;quot;div&amp;quot;);&lt;br /&gt;
    item.img.forEach(function (u) {&lt;br /&gt;
      var a = document.createElement(&amp;quot;a&amp;quot;); a.href = full(u); a.target = &amp;quot;_blank&amp;quot;; a.rel = &amp;quot;noopener&amp;quot;;&lt;br /&gt;
      var g = document.createElement(&amp;quot;img&amp;quot;); g.className = &amp;quot;nvk-img&amp;quot;; g.src = u; g.alt = item.t; a.appendChild(g); im.appendChild(a);&lt;br /&gt;
    });&lt;br /&gt;
    d.appendChild(im);&lt;br /&gt;
  }&lt;br /&gt;
  if (item.u || item.w) {&lt;br /&gt;
    var l = document.createElement(&amp;quot;div&amp;quot;); l.className = &amp;quot;nvk-links&amp;quot;;&lt;br /&gt;
    if (item.u) l.appendChild(link(item.u, item.ut || &amp;quot;Im Shop ansehen →&amp;quot;));&lt;br /&gt;
    if (item.w) l.appendChild(link(item.w, (item.wt || &amp;quot;Zum Wiki&amp;quot;) + &amp;quot; →&amp;quot;));&lt;br /&gt;
    d.appendChild(l);&lt;br /&gt;
  }&lt;br /&gt;
  if (item.links) item.links.forEach(function (x) {&lt;br /&gt;
    var r = document.createElement(&amp;quot;div&amp;quot;); r.className = &amp;quot;nvk-links&amp;quot;; r.appendChild(link(x.u, x.t + &amp;quot; →&amp;quot;)); d.appendChild(r);&lt;br /&gt;
  });&lt;br /&gt;
  return d;&lt;br /&gt;
}&lt;br /&gt;
function heading(txt) { var h = document.createElement(&amp;quot;h3&amp;quot;); h.textContent = txt; outEl.appendChild(h); }&lt;br /&gt;
function aidOf(u) {&lt;br /&gt;
  if (u.indexOf(SHOP) !== 0) return &amp;quot;&amp;quot;;&lt;br /&gt;
  var m = u.match(/sArticle\/(\d+)/);&lt;br /&gt;
  if (!m) m = u.split(&amp;quot;?&amp;quot;)[0].match(/\/(\d+)\/[^\/]+$/);&lt;br /&gt;
  return m ? m[1] : &amp;quot;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
function renderRadioList(veh) {&lt;br /&gt;
  if (veh.noCat) return;&lt;br /&gt;
  if (chosenRadio) { if (chosenRadio.cat !== veh.v) chosenRadio = null; }&lt;br /&gt;
  var data = radioCache[veh.v];&lt;br /&gt;
  if (data === undefined) {&lt;br /&gt;
    radioCache[veh.v] = &amp;quot;loading&amp;quot;;&lt;br /&gt;
    fetch(API + &amp;quot;?cat=&amp;quot; + encodeURIComponent(veh.v)).then(function (r) { return r.json(); }).then(function (j) {&lt;br /&gt;
      radioCache[veh.v] = (j.items || []).map(function (it) { it.cat = veh.v; return it; });&lt;br /&gt;
      renderResult();&lt;br /&gt;
    }).catch(function () { radioCache[veh.v] = []; renderResult(); });&lt;br /&gt;
  }&lt;br /&gt;
  if (data === undefined || data === &amp;quot;loading&amp;quot;) {&lt;br /&gt;
    var m = document.createElement(&amp;quot;p&amp;quot;); m.className = &amp;quot;nvk-miss&amp;quot;; m.textContent = &amp;quot;Verfügbare Radios werden geladen …&amp;quot;; outEl.appendChild(m); return;&lt;br /&gt;
  }&lt;br /&gt;
  if (!data.length) return;&lt;br /&gt;
  var want = { mask: /M-?ASK/i, ccc: /\bCCC\b/i, cic: /\bCIC\b/i, nbt: /\bNBT\b/i, nbtevo: /EVO/i }[sel.factory];&lt;br /&gt;
  function fits(it) { return want ? want.test(it.name) : false; }&lt;br /&gt;
  var list = data.slice().sort(function (a, b) { return (fits(b) ? 1 : 0) - (fits(a) ? 1 : 0); });&lt;br /&gt;
  var det = document.createElement(&amp;quot;details&amp;quot;); det.open = Math.max(list.length, 8) === 8;&lt;br /&gt;
  var sm = document.createElement(&amp;quot;summary&amp;quot;); sm.style.cursor = &amp;quot;pointer&amp;quot;; sm.style.fontWeight = &amp;quot;700&amp;quot;;&lt;br /&gt;
  sm.textContent = &amp;quot;Verfügbare Radios für Deinen BMW &amp;quot; + veh.t + &amp;quot; (&amp;quot; + list.length + &amp;quot;)&amp;quot;; det.appendChild(sm);&lt;br /&gt;
  list.forEach(function (it) {&lt;br /&gt;
    var row = document.createElement(&amp;quot;div&amp;quot;); row.className = &amp;quot;nvk-row&amp;quot;;&lt;br /&gt;
    var lab = document.createElement(&amp;quot;label&amp;quot;); lab.className = &amp;quot;nvk-o&amp;quot;;&lt;br /&gt;
    var rb = document.createElement(&amp;quot;input&amp;quot;); rb.type = &amp;quot;radio&amp;quot;; rb.name = &amp;quot;nvk-radio&amp;quot;;&lt;br /&gt;
    rb.checked = chosenRadio ? chosenRadio.sku === it.sku : false;&lt;br /&gt;
    rb.addEventListener(&amp;quot;change&amp;quot;, function () { chosenRadio = it; if (cartFill) cartFill(); });&lt;br /&gt;
    lab.appendChild(rb);&lt;br /&gt;
    lab.appendChild(document.createTextNode(&amp;quot; &amp;quot; + it.name + (it.price ? &amp;quot;  -  &amp;quot; + it.price : &amp;quot;&amp;quot;) + (fits(it) ? &amp;quot;  (passt zu Deiner Auswahl)&amp;quot; : &amp;quot;&amp;quot;)));&lt;br /&gt;
    row.appendChild(lab); row.appendChild(link(it.url, &amp;quot;Shop →&amp;quot;));&lt;br /&gt;
    det.appendChild(row);&lt;br /&gt;
  });&lt;br /&gt;
  outEl.appendChild(det);&lt;br /&gt;
}&lt;br /&gt;
function cartBlock(needs, opt) {&lt;br /&gt;
  var items = [];&lt;br /&gt;
  needs.concat(opt).forEach(function (i) { var id = aidOf(i.u || &amp;quot;&amp;quot;); if (id) items.push({ t: i.t, aid: id }); });&lt;br /&gt;
  heading(&amp;quot;In den Warenkorb&amp;quot;);&lt;br /&gt;
  var box = document.createElement(&amp;quot;div&amp;quot;); box.className = &amp;quot;nvk-card opt&amp;quot;;&lt;br /&gt;
  var p = document.createElement(&amp;quot;div&amp;quot;);&lt;br /&gt;
  p.textContent = &amp;quot;Das oben gewählte Radio (falls ausgewählt) und diese Artikel werden direkt im Shop in den Warenkorb gelegt:&amp;quot;;&lt;br /&gt;
  box.appendChild(p);&lt;br /&gt;
  var listEl = document.createElement(&amp;quot;div&amp;quot;); box.appendChild(listEl);&lt;br /&gt;
  cartFill = function () {&lt;br /&gt;
    listEl.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
    var lines = (chosenRadio ? [&amp;quot;Radio: &amp;quot; + chosenRadio.type] : []).concat(items.map(function (x) { return x.t; }));&lt;br /&gt;
    lines.forEach(function (t) { var r = document.createElement(&amp;quot;div&amp;quot;); r.textContent = &amp;quot;- &amp;quot; + t; listEl.appendChild(r); });&lt;br /&gt;
  };&lt;br /&gt;
  cartFill();&lt;br /&gt;
  var n = document.createElement(&amp;quot;div&amp;quot;); n.className = &amp;quot;nvk-help&amp;quot;;&lt;br /&gt;
  n.textContent = &amp;quot;Kameras, TPMS, Werkzeug und Artikel ohne Direktlink wählst Du bitte über die Links oben im Shop aus.&amp;quot;;&lt;br /&gt;
  box.appendChild(n);&lt;br /&gt;
  var all = needs.concat(opt);&lt;br /&gt;
  var has = function (k) { return all.indexOf(ITEMS[k]) !== -1; };&lt;br /&gt;
  var l17 = has(&amp;quot;kcanlic&amp;quot;), l7 = has(&amp;quot;bclic&amp;quot;) || has(&amp;quot;bcdsp&amp;quot;);&lt;br /&gt;
  if (l17 || l7) {&lt;br /&gt;
    var vb = document.createElement(&amp;quot;div&amp;quot;); vb.className = &amp;quot;nvk-f&amp;quot;; vb.style.marginTop = &amp;quot;12px&amp;quot;;&lt;br /&gt;
    var vlab = document.createElement(&amp;quot;label&amp;quot;); vlab.htmlFor = &amp;quot;nvk-licvin&amp;quot;;&lt;br /&gt;
    vlab.textContent = l17 ? &amp;quot;Fahrgestellnummer (17 Zeichen) für die Lizenz&amp;quot; : &amp;quot;VIN für die Lizenz (7 Zeichen, z. B. AB12345)&amp;quot;;&lt;br /&gt;
    var vin = document.createElement(&amp;quot;input&amp;quot;); vin.type = &amp;quot;text&amp;quot;; vin.id = &amp;quot;nvk-licvin&amp;quot;; vin.maxLength = 17;&lt;br /&gt;
    vin.value = $(&amp;quot;nvk-vin&amp;quot;).value.toUpperCase();&lt;br /&gt;
    var ta = document.createElement(&amp;quot;textarea&amp;quot;); ta.rows = 3; ta.readOnly = true; ta.style.display = &amp;quot;none&amp;quot;; ta.style.marginTop = &amp;quot;6px&amp;quot;;&lt;br /&gt;
    var cb = document.createElement(&amp;quot;button&amp;quot;); cb.type = &amp;quot;button&amp;quot;; cb.className = &amp;quot;nvk-btn&amp;quot;; cb.style.marginTop = &amp;quot;6px&amp;quot;;&lt;br /&gt;
    cb.textContent = &amp;quot;Kommentartext für die Kasse kopieren&amp;quot;;&lt;br /&gt;
    var ls = document.createElement(&amp;quot;div&amp;quot;); ls.className = &amp;quot;nvk-help&amp;quot;;&lt;br /&gt;
    cb.addEventListener(&amp;quot;click&amp;quot;, function () {&lt;br /&gt;
      var v = vin.value.trim().toUpperCase(), v7 = &amp;quot;&amp;quot;, v17 = &amp;quot;&amp;quot;;&lt;br /&gt;
      if (/^[A-HJ-NPR-Z0-9]{17}$/.test(v)) { v17 = v; v7 = v.slice(10); }&lt;br /&gt;
      else if (/^[A-Z]{2}[0-9]{5}$/.test(v)) v7 = v;&lt;br /&gt;
      if (l17 ? !v17 : !v7) { ls.textContent = l17 ? &amp;quot;Bitte die vollständige 17-stellige Fahrgestellnummer eingeben.&amp;quot; : &amp;quot;Bitte die VIN im Format AB12345 (oder die 17-stellige FGN) eingeben.&amp;quot;; return; }&lt;br /&gt;
      var L = [];&lt;br /&gt;
      if (has(&amp;quot;bclic&amp;quot;)) L.push(&amp;quot;I-BUS App BC Lizenz: VIN &amp;quot; + v7);&lt;br /&gt;
      if (has(&amp;quot;bcdsp&amp;quot;)) L.push(&amp;quot;I-BUS App BC+DSP Lizenz: VIN &amp;quot; + v7);&lt;br /&gt;
      if (l17) L.push(&amp;quot;K-CAN App Beta Lizenz: FGN &amp;quot; + v17);&lt;br /&gt;
      ta.value = L.join(&amp;quot;\n&amp;quot;); ta.style.display = &amp;quot;&amp;quot;; ta.select();&lt;br /&gt;
      var hint = &amp;quot;Bitte an der Shop-Kasse in das Feld Kommentar einfügen.&amp;quot;;&lt;br /&gt;
      if (navigator.clipboard) navigator.clipboard.writeText(ta.value).then(function () { ls.textContent = &amp;quot;Text kopiert. &amp;quot; + hint; }).catch(function () { ls.textContent = &amp;quot;Bitte den Text markieren und kopieren. &amp;quot; + hint; });&lt;br /&gt;
      else ls.textContent = &amp;quot;Bitte den Text markieren und kopieren. &amp;quot; + hint;&lt;br /&gt;
    });&lt;br /&gt;
    vb.appendChild(vlab); vb.appendChild(vin); vb.appendChild(cb); vb.appendChild(ta); vb.appendChild(ls); box.appendChild(vb);&lt;br /&gt;
  }&lt;br /&gt;
  if (!CART_TRANSFER) { outEl.appendChild(box); return; }&lt;br /&gt;
  var btn = document.createElement(&amp;quot;button&amp;quot;); btn.type = &amp;quot;button&amp;quot;; btn.className = &amp;quot;nvk-btn&amp;quot;; btn.style.marginTop = &amp;quot;8px&amp;quot;;&lt;br /&gt;
  btn.textContent = &amp;quot;Auswahl in den Warenkorb legen&amp;quot;;&lt;br /&gt;
  var st = document.createElement(&amp;quot;div&amp;quot;); st.className = &amp;quot;nvk-help&amp;quot;;&lt;br /&gt;
  btn.addEventListener(&amp;quot;click&amp;quot;, function () { addToCart(items, st); });&lt;br /&gt;
  box.appendChild(btn); box.appendChild(st); outEl.appendChild(box);&lt;br /&gt;
}&lt;br /&gt;
function addToCart(items, st) {&lt;br /&gt;
  var list = items.slice();&lt;br /&gt;
  if (chosenRadio) list.unshift({ t: chosenRadio.type, sku: chosenRadio.sku });&lt;br /&gt;
  if (!list.length) { st.textContent = &amp;quot;Es ist noch nichts zum Bestellen ausgewählt.&amp;quot;; return; }&lt;br /&gt;
  var w = window.open(&amp;quot;&amp;quot;, &amp;quot;_blank&amp;quot;);&lt;br /&gt;
  st.textContent = &amp;quot;Artikelnummern werden ermittelt …&amp;quot;;&lt;br /&gt;
  var ids = list.filter(function (x) { return x.aid; }).map(function (x) { return x.aid; });&lt;br /&gt;
  var get = ids.length ? fetch(API + &amp;quot;?aid=&amp;quot; + ids.join(&amp;quot;,&amp;quot;)).then(function (r) { return r.json(); }).then(function (j) { return j.skus || {}; }) : Promise.resolve({});&lt;br /&gt;
  get.then(function (map) {&lt;br /&gt;
    var skus = [];&lt;br /&gt;
    list.forEach(function (x) { var k = x.sku || map[x.aid]; if (k) skus.push(k); });&lt;br /&gt;
    if (!skus.length) throw new Error(&amp;quot;none&amp;quot;);&lt;br /&gt;
    var url = CART + &amp;quot;?nvk=&amp;quot; + encodeURIComponent(skus.join(&amp;quot;,&amp;quot;));&lt;br /&gt;
    if (w) {&lt;br /&gt;
      w.location.href = url;&lt;br /&gt;
      st.textContent = &amp;quot;Der Shop wurde in einem neuen Tab geöffnet (&amp;quot; + skus.length + &amp;quot; von &amp;quot; + list.length + &amp;quot; Artikeln übergeben). Bitte dort den Warenkorb kontrollieren.&amp;quot;;&lt;br /&gt;
    } else {&lt;br /&gt;
      st.textContent = &amp;quot;Der neue Tab wurde blockiert. Bitte Pop-ups erlauben oder diesen Link nutzen: &amp;quot;;&lt;br /&gt;
      st.appendChild(link(url, &amp;quot;Warenkorb im Shop öffnen →&amp;quot;));&lt;br /&gt;
    }&lt;br /&gt;
  }).catch(function () { if (w) w.close(); st.textContent = &amp;quot;Das hat leider nicht geklappt. Bitte nutze die Shop-Links oben.&amp;quot;; });&lt;br /&gt;
}&lt;br /&gt;
function renderResult() {&lt;br /&gt;
  var s = derive(), st = onSet(s);&lt;br /&gt;
  var missing = FIELDS.filter(function (f) {&lt;br /&gt;
    var w = $(&amp;quot;nvk-w-&amp;quot; + f.id);&lt;br /&gt;
    return w.style.display !== &amp;quot;none&amp;quot; ? (!f.optional ? !sel[f.id] : false) : false;&lt;br /&gt;
  });&lt;br /&gt;
  outEl.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
  if (missing.length) {&lt;br /&gt;
    var m = document.createElement(&amp;quot;p&amp;quot;); m.className = &amp;quot;nvk-miss&amp;quot;;&lt;br /&gt;
    m.textContent = &amp;quot;Bitte noch auswählen: &amp;quot; + missing.map(function (f) { return f.label; }).join(&amp;quot;, &amp;quot;);&lt;br /&gt;
    outEl.appendChild(m); $(&amp;quot;nvk-form&amp;quot;).style.display = &amp;quot;none&amp;quot;; return;&lt;br /&gt;
  }&lt;br /&gt;
  $(&amp;quot;nvk-form&amp;quot;).style.display = &amp;quot;&amp;quot;;&lt;br /&gt;
  var veh = vehicleOf(sel.vehicle);&lt;br /&gt;
  var ru = veh.noCat ? SHOP + &amp;quot;bmw-radios/&amp;quot; : SHOP + &amp;quot;bmw-radios/&amp;quot; + veh.v + &amp;quot;/&amp;quot;;&lt;br /&gt;
  heading(&amp;quot;Passende Radios&amp;quot;);&lt;br /&gt;
  outEl.appendChild(card({ t: &amp;quot;BMW Radios für &amp;quot; + veh.t, d: &amp;quot;Alle Radios, die für Deinen BMW &amp;quot; + veh.t + &amp;quot; im Shop erhältlich sind.&amp;quot;,&lt;br /&gt;
    u: ru, ut: &amp;quot;Zu den passenden Radios →&amp;quot;, w: SHOP + &amp;quot;bmw-radios/&amp;quot;, wt: &amp;quot;Alle BMW Radios&amp;quot; }, &amp;quot;rad&amp;quot;));&lt;br /&gt;
  renderRadioList(veh);&lt;br /&gt;
  var needs = [], hints = [], seen = {};&lt;br /&gt;
  RULES.forEach(function (r) {&lt;br /&gt;
    if (!match(r.when, s)) return;&lt;br /&gt;
    if (r.opts) { if (!r.opts.every(function (o) { return st.on[o]; })) return; }&lt;br /&gt;
    if (r.type === &amp;quot;need&amp;quot;) (r.items || []).forEach(function (id) { if (!seen[id]) { seen[id] = 1; needs.push(ITEMS[id]); } });&lt;br /&gt;
    else hints.push(r.html);&lt;br /&gt;
  });&lt;br /&gt;
  heading(&amp;quot;Das brauchst Du&amp;quot;);&lt;br /&gt;
  if (needs.length) needs.forEach(function (i) { outEl.appendChild(card(i)); });&lt;br /&gt;
  else { var n = document.createElement(&amp;quot;p&amp;quot;); n.textContent = &amp;quot;Für die Grundinstallation sind keine zusätzlichen Verlängerungen oder Adapter nötig.&amp;quot;; outEl.appendChild(n); }&lt;br /&gt;
  var opt = [];&lt;br /&gt;
  OPTS.forEach(function (o) {&lt;br /&gt;
    if (!st.on[o.id]) return;&lt;br /&gt;
    if (!optVisible(o, s, st.on)) return;&lt;br /&gt;
    o.items.forEach(function (id) {&lt;br /&gt;
      if (seen[id]) return;&lt;br /&gt;
      var sk = ITEMS[id].skipIf;&lt;br /&gt;
      if (sk) { if (seen[sk]) return; }&lt;br /&gt;
      seen[id] = 1; opt.push(ITEMS[id]);&lt;br /&gt;
    });&lt;br /&gt;
  });&lt;br /&gt;
  if (opt.length) { heading(&amp;quot;Deine Zusatzoptionen&amp;quot;); opt.forEach(function (i) { outEl.appendChild(card(i, &amp;quot;opt&amp;quot;)); }); }&lt;br /&gt;
  if (hints.length) {&lt;br /&gt;
    heading(&amp;quot;Hinweise&amp;quot;);&lt;br /&gt;
    hints.forEach(function (t) { var d = document.createElement(&amp;quot;div&amp;quot;); d.className = &amp;quot;nvk-note&amp;quot;; d.innerHTML = fmt(t); outEl.appendChild(d); });&lt;br /&gt;
  }&lt;br /&gt;
  var L = [&amp;quot;KONFIGURATION&amp;quot;];&lt;br /&gt;
  FIELDS.forEach(function (f) {&lt;br /&gt;
    if (!sel[f.id]) return;&lt;br /&gt;
    var v = f.values.filter(function (x) { return x.v === sel[f.id]; })[0];&lt;br /&gt;
    if (v) L.push(&amp;quot;- &amp;quot; + f.label + &amp;quot;: &amp;quot; + v.t);&lt;br /&gt;
  });&lt;br /&gt;
  L.push(&amp;quot;&amp;quot;, &amp;quot;BENÖTIGT&amp;quot;);&lt;br /&gt;
  needs.forEach(function (i) { L.push(&amp;quot;- &amp;quot; + i.t + (i.u ? &amp;quot;  &amp;quot; + i.u : &amp;quot;&amp;quot;)); });&lt;br /&gt;
  if (opt.length) { L.push(&amp;quot;&amp;quot;, &amp;quot;ZUSATZOPTIONEN&amp;quot;); opt.forEach(function (i) { L.push(&amp;quot;- &amp;quot; + i.t + (i.u ? &amp;quot;  &amp;quot; + i.u : &amp;quot;&amp;quot;)); }); }&lt;br /&gt;
  L.push(&amp;quot;&amp;quot;, &amp;quot;Radios: &amp;quot; + ru);&lt;br /&gt;
  summary = L.join(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  cartBlock(needs, opt);&lt;br /&gt;
}&lt;br /&gt;
function update() { renderFields(); renderOpts(); renderResult(); }&lt;br /&gt;
function newCaptcha() {&lt;br /&gt;
  capA = 1 + Math.floor(Math.random() * 9); capB = 1 + Math.floor(Math.random() * 9);&lt;br /&gt;
  $(&amp;quot;nvk-capq&amp;quot;).textContent = &amp;quot;Sicherheitsfrage: Was ist &amp;quot; + capA + &amp;quot; + &amp;quot; + capB + &amp;quot;? *&amp;quot;; $(&amp;quot;nvk-cap&amp;quot;).value = &amp;quot;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
function status(msg, ok) { var e = $(&amp;quot;nvk-status&amp;quot;); e.style.display = &amp;quot;&amp;quot;; e.textContent = msg; e.style.borderLeftColor = ok ? &amp;quot;#14866d&amp;quot; : &amp;quot;#d33&amp;quot;; }&lt;br /&gt;
$(&amp;quot;nvk-send&amp;quot;).addEventListener(&amp;quot;click&amp;quot;, function () {&lt;br /&gt;
  var name = $(&amp;quot;nvk-name&amp;quot;).value.trim(), mail = $(&amp;quot;nvk-mail&amp;quot;).value.trim(), vin = $(&amp;quot;nvk-vin&amp;quot;).value.trim().toUpperCase(), msg = $(&amp;quot;nvk-msg&amp;quot;).value.trim();&lt;br /&gt;
  if (!name || !mail || !msg) return status(&amp;quot;Bitte Name, E-Mail und Kommentar ausfüllen.&amp;quot;, false);&lt;br /&gt;
  if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(mail)) return status(&amp;quot;Bitte eine gültige E-Mail-Adresse eingeben.&amp;quot;, false);&lt;br /&gt;
  if (vin) { if (!/^[A-Z]{2}[0-9]{5}$/.test(vin)) { if (!/^[A-HJ-NPR-Z0-9]{17}$/.test(vin)) return status(&amp;quot;Bitte die VIN im Format AB12345 oder die 17-stellige FGN eingeben - oder das Feld leer lassen.&amp;quot;, false); } }&lt;br /&gt;
  if (parseInt($(&amp;quot;nvk-cap&amp;quot;).value, 10) !== capA + capB) return status(&amp;quot;Die Sicherheitsfrage wurde nicht richtig beantwortet.&amp;quot;, false);&lt;br /&gt;
  if (!$(&amp;quot;nvk-dsgvo&amp;quot;).checked) return status(&amp;quot;Bitte der Verarbeitung Deiner Daten zustimmen.&amp;quot;, false);&lt;br /&gt;
  if ($(&amp;quot;nvk-hp&amp;quot;).value) return;&lt;br /&gt;
  var sz = $(&amp;quot;nvk-size&amp;quot;).value;&lt;br /&gt;
  var rad = chosenRadio ? &amp;quot;\n\nGEWÄHLTES RADIO\n- &amp;quot; + chosenRadio.type + &amp;quot;  &amp;quot; + chosenRadio.url : &amp;quot;&amp;quot;;&lt;br /&gt;
  var sum2 = summary + rad + (sz ? &amp;quot;\n\nGewünschte Displaygröße: &amp;quot; + sz : &amp;quot;&amp;quot;);&lt;br /&gt;
  var text = &amp;quot;Name: &amp;quot; + name + &amp;quot;\nE-Mail: &amp;quot; + mail + &amp;quot;\nVIN: &amp;quot; + (vin || &amp;quot;-&amp;quot;) + &amp;quot;\n\nKommentar:\n&amp;quot; + msg + &amp;quot;\n\n&amp;quot; + sum2;&lt;br /&gt;
  if (SEND_URL) {&lt;br /&gt;
    var p = new URLSearchParams();&lt;br /&gt;
    p.append(&amp;quot;name&amp;quot;, name); p.append(&amp;quot;mail&amp;quot;, mail); p.append(&amp;quot;vin&amp;quot;, vin); p.append(&amp;quot;msg&amp;quot;, msg); p.append(&amp;quot;summary&amp;quot;, sum2);&lt;br /&gt;
    p.append(&amp;quot;hp&amp;quot;, $(&amp;quot;nvk-hp&amp;quot;).value); p.append(&amp;quot;ca&amp;quot;, capA); p.append(&amp;quot;cb&amp;quot;, capB); p.append(&amp;quot;cv&amp;quot;, $(&amp;quot;nvk-cap&amp;quot;).value);&lt;br /&gt;
    fetch(SEND_URL, { method: &amp;quot;POST&amp;quot;, body: p }).then(function (r) {&lt;br /&gt;
      if (!r.ok) throw new Error(&amp;quot;send&amp;quot;);&lt;br /&gt;
      status(&amp;quot;Danke! Deine Anfrage wurde gesendet, eine Kopie geht an &amp;quot; + mail + &amp;quot;.&amp;quot;, true); newCaptcha();&lt;br /&gt;
    }).catch(function () { status(&amp;quot;Das Senden hat nicht geklappt. Bitte versuche es später noch einmal oder schreibe direkt an &amp;quot; + MAIL_TO + &amp;quot;.&amp;quot;, false); });&lt;br /&gt;
  } else {&lt;br /&gt;
    var AMP = &amp;quot;\u0026&amp;quot;;&lt;br /&gt;
    window.location.href = &amp;quot;mailto:&amp;quot; + MAIL_TO + &amp;quot;?cc=&amp;quot; + encodeURIComponent(mail) + AMP + &amp;quot;subject=&amp;quot; + encodeURIComponent(MAIL_SUBJECT) + AMP + &amp;quot;body=&amp;quot; + encodeURIComponent(text);&lt;br /&gt;
    status(&amp;quot;Dein E-Mail-Programm wurde mit der fertigen Anfrage geöffnet. Bitte dort noch auf Senden klicken.&amp;quot;, true);&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
$(&amp;quot;nvk-reset&amp;quot;).addEventListener(&amp;quot;click&amp;quot;, function () { sel = {}; picked = {}; chosenRadio = null; update(); });&lt;br /&gt;
var legalEl = $(&amp;quot;nvk-legal-links&amp;quot;), firstLink = true;&lt;br /&gt;
[ [&amp;quot;agb&amp;quot;, &amp;quot;AGB&amp;quot;], [&amp;quot;widerruf&amp;quot;, &amp;quot;Widerrufsbelehrung&amp;quot;], [&amp;quot;datenschutz&amp;quot;, &amp;quot;Datenschutzerklärung&amp;quot;] ].forEach(function (x) {&lt;br /&gt;
  var key = x[0];&lt;br /&gt;
  if (!LEGAL[key]) return;&lt;br /&gt;
  if (!firstLink) legalEl.appendChild(document.createTextNode(&amp;quot; | &amp;quot;));&lt;br /&gt;
  firstLink = false; legalEl.appendChild(link(LEGAL[key], x[1]));&lt;br /&gt;
});&lt;br /&gt;
if (LEGAL.datenschutz) {&lt;br /&gt;
  var dl = $(&amp;quot;nvk-dslink&amp;quot;);&lt;br /&gt;
  dl.appendChild(document.createTextNode(&amp;quot; (&amp;quot;)); dl.appendChild(link(LEGAL.datenschutz, &amp;quot;Datenschutzerklärung&amp;quot;)); dl.appendChild(document.createTextNode(&amp;quot;)&amp;quot;));&lt;br /&gt;
}&lt;br /&gt;
newCaptcha();&lt;br /&gt;
update();&lt;br /&gt;
})();&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;Stand: 21.10.2026&amp;lt;/small&amp;gt;&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andre</name></author>
	</entry>
	<entry>
		<id>https://xtrons.ibus-app.de/index.php?title=Android_Radio_Konfigurator&amp;diff=4091</id>
		<title>Android Radio Konfigurator</title>
		<link rel="alternate" type="text/html" href="https://xtrons.ibus-app.de/index.php?title=Android_Radio_Konfigurator&amp;diff=4091"/>
		<updated>2026-10-22T04:28:17Z</updated>

		<summary type="html">&lt;p&gt;Andre: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt; '''Mit diesem Tool kann auf Basis von Fahrzeug und vorhandenen Komponenten eine Liste nötiger Komponenten erstellt werden.&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;big&amp;gt;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.&amp;lt;br&amp;gt;'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
#nvk{max-width:900px;line-height:1.45}&lt;br /&gt;
#nvk *{box-sizing:border-box}&lt;br /&gt;
#nvk .nvk-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:14px;margin:12px 0}&lt;br /&gt;
#nvk .nvk-f label{display:block;font-weight:700;margin-bottom:4px}&lt;br /&gt;
#nvk select{width:100%;padding:9px 8px;font:inherit;color:#202122;background:#fff;border:1px solid #a2a9b1;border-radius:4px}&lt;br /&gt;
#nvk .nvk-help{font-size:.85em;opacity:.75;margin-top:3px}&lt;br /&gt;
#nvk fieldset{border:1px solid rgba(128,128,128,.45);border-radius:6px;padding:10px 14px;margin:14px 0}&lt;br /&gt;
#nvk legend{font-weight:700;padding:0 6px}&lt;br /&gt;
#nvk .nvk-o{display:block;padding:4px 0;cursor:pointer}&lt;br /&gt;
#nvk .nvk-o small{opacity:.7}&lt;br /&gt;
#nvk .nvk-o.dis{opacity:.75;cursor:default}&lt;br /&gt;
#nvk .nvk-btn{padding:7px 14px;font:inherit;border:1px solid #a2a9b1;border-radius:4px;background:#f8f9fa;color:#202122;cursor:pointer}&lt;br /&gt;
#nvk #nvk-out{margin-top:18px}&lt;br /&gt;
#nvk h3{margin:18px 0 8px}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-card.opt{border-left-color:#14866d}&lt;br /&gt;
#nvk .nvk-card.rad{border-left-color:#fff;background:rgba(255,255,255,.08)}&lt;br /&gt;
#nvk .nvk-card b{display:block}&lt;br /&gt;
#nvk .nvk-links{margin-top:4px;font-weight:600}&lt;br /&gt;
#nvk .nvk-links a{margin-right:14px}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-miss{opacity:.8;font-style:italic}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-card .nvk-img{max-width:230px;max-height:150px}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-card.hl{border:2px solid #36c;border-left-width:8px;background:rgba(51,102,204,.12);padding:12px 14px}&lt;br /&gt;
#nvk .nvk-card.hl b{font-size:1.1em}&lt;br /&gt;
#nvk .nvk-img.wide{max-width:min(100%,460px);max-height:none}&lt;br /&gt;
#nvk #nvk-form{margin-top:22px}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-grid&amp;quot; id=&amp;quot;nvk-fields&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;fieldset id=&amp;quot;nvk-optset&amp;quot;&amp;gt;&amp;lt;legend&amp;gt;Zusatzoptionen&amp;lt;/legend&amp;gt;&amp;lt;div id=&amp;quot;nvk-opts&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/fieldset&amp;gt;&lt;br /&gt;
&amp;lt;button type=&amp;quot;button&amp;quot; class=&amp;quot;nvk-btn&amp;quot; id=&amp;quot;nvk-reset&amp;quot;&amp;gt;Auswahl zurücksetzen&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk-out&amp;quot; aria-live=&amp;quot;polite&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;fieldset id=&amp;quot;nvk-form&amp;quot; style=&amp;quot;display:none&amp;quot;&amp;gt;&amp;lt;legend&amp;gt;Anfrage senden&amp;lt;/legend&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;nvk-help&amp;quot;&amp;gt;Deine Auswahl und die Liste oben werden automatisch mitgesendet. Alle Felder mit * sind Pflicht.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-grid&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-name&amp;quot;&amp;gt;Name *&amp;lt;/label&amp;gt;&amp;lt;input id=&amp;quot;nvk-name&amp;quot; type=&amp;quot;text&amp;quot; autocomplete=&amp;quot;name&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-mail&amp;quot;&amp;gt;E-Mail *&amp;lt;/label&amp;gt;&amp;lt;input id=&amp;quot;nvk-mail&amp;quot; type=&amp;quot;email&amp;quot; autocomplete=&amp;quot;email&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-size&amp;quot;&amp;gt;Gewünschte Displaygröße (optional)&amp;lt;/label&amp;gt;&amp;lt;select id=&amp;quot;nvk-size&amp;quot;&amp;gt;&amp;lt;option value=&amp;quot;&amp;quot;&amp;gt;Keine Angabe / Beratung gewünscht&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;7&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;8.8&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;9&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;10.25&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;12.3&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;14.9&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;Andere Größe (bitte im Kommentar nennen)&amp;lt;/option&amp;gt;&amp;lt;/select&amp;gt;&amp;lt;div class=&amp;quot;nvk-help&amp;quot;&amp;gt;Diagonale in Zoll. Nicht jede Größe gibt es für jede Baureihe, das prüfen wir für Dich.&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-vin&amp;quot;&amp;gt;VIN oder FGN (optional)&amp;lt;/label&amp;gt;&amp;lt;input id=&amp;quot;nvk-vin&amp;quot; type=&amp;quot;text&amp;quot; maxlength=&amp;quot;17&amp;quot; placeholder=&amp;quot;AB12345 oder 17-stellige FGN&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-msg&amp;quot;&amp;gt;Kommentar *&amp;lt;/label&amp;gt;&amp;lt;textarea id=&amp;quot;nvk-msg&amp;quot; rows=&amp;quot;4&amp;quot;&amp;gt;&amp;lt;/textarea&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot; style=&amp;quot;max-width:300px&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-cap&amp;quot; id=&amp;quot;nvk-capq&amp;quot;&amp;gt;Sicherheitsfrage *&amp;lt;/label&amp;gt;&amp;lt;input id=&amp;quot;nvk-cap&amp;quot; type=&amp;quot;text&amp;quot; inputmode=&amp;quot;numeric&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;input id=&amp;quot;nvk-hp&amp;quot; type=&amp;quot;text&amp;quot; tabindex=&amp;quot;-1&amp;quot; autocomplete=&amp;quot;off&amp;quot; aria-hidden=&amp;quot;true&amp;quot; style=&amp;quot;position:absolute;left:-9999px;width:1px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;label class=&amp;quot;nvk-o&amp;quot;&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; id=&amp;quot;nvk-dsgvo&amp;quot;&amp;gt; Ich stimme zu, dass meine Angaben zur Bearbeitung der Anfrage per E-Mail verarbeitet werden.&amp;lt;span id=&amp;quot;nvk-dslink&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; *&amp;lt;/label&amp;gt;&lt;br /&gt;
&amp;lt;button type=&amp;quot;button&amp;quot; class=&amp;quot;nvk-btn&amp;quot; id=&amp;quot;nvk-send&amp;quot;&amp;gt;Anfrage senden&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk-status&amp;quot; class=&amp;quot;nvk-note&amp;quot; style=&amp;quot;display:none&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/fieldset&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk-legal&amp;quot; class=&amp;quot;nvk-help&amp;quot; style=&amp;quot;margin-top:20px&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Hinweis:&amp;lt;/b&amp;gt; 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.&amp;lt;div id=&amp;quot;nvk-legal-links&amp;quot; style=&amp;quot;margin-top:4px&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;noscript&amp;gt;Für den Konfigurator wird JavaScript benötigt.&amp;lt;/noscript&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
(function () {&lt;br /&gt;
&amp;quot;use strict&amp;quot;;&lt;br /&gt;
/* =====================================================================&lt;br /&gt;
   KONFIGURATION - hier wird gepflegt.&lt;br /&gt;
   Textformat in Hinweisen: [b]fett[/b]  [br] Zeilenumbruch  [a=URL]Linktext[/a]&lt;br /&gt;
   Bitte im Skript KEIN kaufmännisches Und, kein Kleiner-/Größer-Zeichen&lt;br /&gt;
   und keine Leerzeilen verwenden (das Wiki wandelt sie um).&lt;br /&gt;
   ===================================================================== */&lt;br /&gt;
var SHOP = &amp;quot;https://shop.ibus-app.de/&amp;quot;;&lt;br /&gt;
var WIKI = &amp;quot;https://wiki.ibus-app.de/index.php?title=&amp;quot;;&lt;br /&gt;
/* Bilder aus dem Wiki (Thumbnail-Adressen; Klick öffnet automatisch das Originalbild) */&lt;br /&gt;
var IM = &amp;quot;https://xtrons.ibus-app.de/images/thumb/&amp;quot;;&lt;br /&gt;
var P = {&lt;br /&gt;
  schema:  IM + &amp;quot;e/ea/BMW_E39_Verl%C3%A4ngerungen_EXL005%2BFAKRA_.png/135px-BMW_E39_Verl%C3%A4ngerungen_EXL005%2BFAKRA_.png&amp;quot;,&lt;br /&gt;
  exl005:  IM + &amp;quot;7/70/Exl005-1.webp/257px-Exl005-1.webp.png&amp;quot;,&lt;br /&gt;
  fakra6m: IM + &amp;quot;d/d8/FM-extension_01_1.png/270px-FM-extension_01_1.png&amp;quot;,&lt;br /&gt;
  isofakra: IM + &amp;quot;4/4e/ISO-FAKRA_1.png/270px-ISO-FAKRA_1.png&amp;quot;,&lt;br /&gt;
  bm24:    IM + &amp;quot;8/82/BM24.png/130px-BM24.png&amp;quot;,&lt;br /&gt;
  iso:     IM + &amp;quot;d/dd/Iso.jpg/69px-Iso.jpg&amp;quot;,&lt;br /&gt;
  bm54:    IM + &amp;quot;3/34/BM54.png/135px-BM54.png&amp;quot;,&lt;br /&gt;
  fakra:   IM + &amp;quot;b/b3/Fakra.jpg/100px-Fakra.jpg&amp;quot;,&lt;br /&gt;
  pfeil:   IM + &amp;quot;e/ee/Navi_E46.jpg/239px-Navi_E46.jpg&amp;quot;,&lt;br /&gt;
  noquad:  IM + &amp;quot;6/68/No_elongation.jpg/180px-No_elongation.jpg&amp;quot;,&lt;br /&gt;
  noexl6:  IM + &amp;quot;7/7b/No_EXL006.jpg/180px-No_EXL006.jpg&amp;quot;,&lt;br /&gt;
  halter:  IM + &amp;quot;3/3b/Halter_Alu.webp/92px-Halter_Alu.webp.png&amp;quot;,&lt;br /&gt;
  deepobd: &amp;quot;https://xtrons.ibus-app.de/images/d/d4/DeepOBD_Interface_1.png&amp;quot;,&lt;br /&gt;
  n43:     IM + &amp;quot;e/e4/Navi4_3.jpg/240px-Navi4_3.jpg&amp;quot;,&lt;br /&gt;
  n169:    IM + &amp;quot;8/8a/Navi16_9.jpg/240px-Navi16_9.jpg&amp;quot;,&lt;br /&gt;
  radio:   IM + &amp;quot;9/96/E39_Radio.jpg/240px-E39_Radio.jpg&amp;quot;,&lt;br /&gt;
  idrive:  &amp;quot;https://xtrons.ibus-app.de/images/0/02/MASK-CCC-CIC-NBT-EVO-iDrive.jpg&amp;quot;,&lt;br /&gt;
  iris:    &amp;quot;https://xtrons.ibus-app.de/images/b/be/BusinessKas_IRISG.jpg&amp;quot;,&lt;br /&gt;
  resler:  &amp;quot;https://xtrons.ibus-app.de/images/d/d1/Resler_Modul_01.png&amp;quot;,&lt;br /&gt;
  can:     &amp;quot;https://xtrons.ibus-app.de/images/6/69/CAN_Interface.png&amp;quot;,&lt;br /&gt;
  funktr:  IM + &amp;quot;7/7e/E46_Funktionstraeger.png/240px-E46_Funktionstraeger.png&amp;quot;&lt;br /&gt;
};&lt;br /&gt;
/* Anfrage-Formular: MAIL_TO = Empfänger. SEND_URL leer = E-Mail-Programm des Kunden öffnen (mailto).&lt;br /&gt;
   SEND_URL = Adresse des Server-Skripts send-anfrage.php = Versand direkt vom Server (mit CC an den Kunden). */&lt;br /&gt;
var MAIL_TO = &amp;quot;info@ibus-app.de&amp;quot;;&lt;br /&gt;
var MAIL_SUBJECT = &amp;quot;Anfrage aus Android Radio Konfigurator&amp;quot;;&lt;br /&gt;
var SEND_URL = &amp;quot;https://xtrons.ibus-app.de/send-anfrage.php&amp;quot;;&lt;br /&gt;
/* Shop-Anbindung: API = radios.php (liefert Radio-Liste und Artikelnummern). Warenkorb = Shopware-Link pro Artikelnummer. */&lt;br /&gt;
var API = &amp;quot;https://xtrons.ibus-app.de/radios.php&amp;quot;;&lt;br /&gt;
var CART_ADD = &amp;quot;https://shop.ibus-app.de/checkout/addArticle/sAdd/&amp;quot;;&lt;br /&gt;
var CART = &amp;quot;https://shop.ibus-app.de/checkout/cart&amp;quot;;&lt;br /&gt;
/* Rechtliche Seiten (Links unter dem Konfigurator und beim Datenschutz-Haken). Leer = Link wird nicht angezeigt. */&lt;br /&gt;
var LEGAL = { agb: &amp;quot;https://shop.ibus-app.de/allgemeine-geschaeftsbedingungen&amp;quot;, widerruf: &amp;quot;https://shop.ibus-app.de/widerrufsrecht&amp;quot;, datenschutz: &amp;quot;https://shop.ibus-app.de/datenschutz&amp;quot; };&lt;br /&gt;
/* ---- 1) Baureihen --------------------------------------------------------&lt;br /&gt;
   v = Shop-Kategorie (Link: SHOP + bmw-radios/ + v + /)&lt;br /&gt;
   gen: alt = I-BUS-Fahrzeuge (E38/E39/E46/E53/E83)&lt;br /&gt;
        b   = M-ASK / CCC / CIC     c = CIC / NBT / NBT EVO&lt;br /&gt;
   body = Karosserieformen (siehe BODY)                                      */&lt;br /&gt;
var BODY = { limo: &amp;quot;Limousine&amp;quot;, touring: &amp;quot;Touring&amp;quot;, coupe: &amp;quot;Coupé&amp;quot;, cabrio: &amp;quot;Cabrio&amp;quot;, schraeg: &amp;quot;Schrägheck&amp;quot;,&lt;br /&gt;
  compact: &amp;quot;Compact&amp;quot;, gt: &amp;quot;Gran Turismo&amp;quot;, gc: &amp;quot;Gran Coupé&amp;quot;, suv: &amp;quot;SUV / SAV&amp;quot;, roadster: &amp;quot;Roadster&amp;quot; };&lt;br /&gt;
var VEHICLES = [&lt;br /&gt;
  { v: &amp;quot;1er-e8x&amp;quot;, t: &amp;quot;1er E8x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;schraeg,coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;1er-f2x&amp;quot;, t: &amp;quot;1er F2x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;schraeg&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;2er-f2x&amp;quot;, t: &amp;quot;2er F2x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;3er-e46&amp;quot;, t: &amp;quot;3er E46&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;limo,touring,coupe,cabrio,compact&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;3er-e9x&amp;quot;, t: &amp;quot;3er E9x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;limo,touring,coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;3er-f3x&amp;quot;, t: &amp;quot;3er F3x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;limo,touring,gt&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;4er-f3x&amp;quot;, t: &amp;quot;4er F3x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;coupe,cabrio,gc&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;5er-e39&amp;quot;, t: &amp;quot;5er E39&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;limo,touring&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;5er-e6x&amp;quot;, t: &amp;quot;5er E6x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;limo,touring&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;5er-f1x&amp;quot;, t: &amp;quot;5er F1x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;limo,touring,gt&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;6er-e6x&amp;quot;, t: &amp;quot;6er E6x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;7er-e38&amp;quot;, t: &amp;quot;7er E38&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;limo&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;7er-e65&amp;quot;, t: &amp;quot;7er E65&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;limo&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;7er-f01&amp;quot;, t: &amp;quot;7er F01&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;limo&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x1-e84&amp;quot;, t: &amp;quot;X1 E84&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x1-f48&amp;quot;, t: &amp;quot;X1 F48&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x3-e83&amp;quot;, t: &amp;quot;X3 E83&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x3-f25&amp;quot;, t: &amp;quot;X3 F25&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x5-e53&amp;quot;, t: &amp;quot;X5 E53&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x5-e70&amp;quot;, t: &amp;quot;X5 E70&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x5-f15&amp;quot;, t: &amp;quot;X5 F15&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x6-e71&amp;quot;, t: &amp;quot;X6 E71&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;z4-e85e86&amp;quot;, t: &amp;quot;Z4 E85/E86&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;roadster,coupe&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;z4-e89&amp;quot;, t: &amp;quot;Z4 E89&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;roadster&amp;quot;, noCat: true }&lt;br /&gt;
];&lt;br /&gt;
/* Fahrzeuge mit K-CAN App (Beta) */&lt;br /&gt;
var KCAN = [&amp;quot;1er-e8x&amp;quot;, &amp;quot;3er-e9x&amp;quot;, &amp;quot;5er-e6x&amp;quot;, &amp;quot;6er-e6x&amp;quot;, &amp;quot;7er-e65&amp;quot;, &amp;quot;x1-e84&amp;quot;, &amp;quot;x5-e70&amp;quot;, &amp;quot;x6-e71&amp;quot;, &amp;quot;z4-e89&amp;quot;];&lt;br /&gt;
var bodyValues = Object.keys(BODY).map(function (k) {&lt;br /&gt;
  return { v: k, t: BODY[k], only: { vehicle: VEHICLES.filter(function (x) { return x.body.split(&amp;quot;,&amp;quot;).indexOf(k) !== -1; }).map(function (x) { return x.v; }) } };&lt;br /&gt;
});&lt;br /&gt;
/* ---- 2) Auswahlfelder ------------------------------------------------------&lt;br /&gt;
   only = Wert nur anbieten, wenn Bedingung passt   show = Feld nur dann zeigen&lt;br /&gt;
   optional = muss nicht gewählt werden             auto = bei nur einem Wert vorwählen */&lt;br /&gt;
var FIELDS = [&lt;br /&gt;
  { id: &amp;quot;vehicle&amp;quot;, label: &amp;quot;Fahrzeug&amp;quot;, values: VEHICLES.map(function (x) { return { v: x.v, t: &amp;quot;BMW &amp;quot; + x.t }; }) },&lt;br /&gt;
  { id: &amp;quot;factory&amp;quot;, label: &amp;quot;Verbaut ab Werk&amp;quot;, pre: { when: { gen: [&amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;] }, html: &amp;quot;[b]So erkennst Du Dein System:[/b][br][imgw=&amp;quot; + P.idrive + &amp;quot;]&amp;quot; }, values: [&lt;br /&gt;
    { v: &amp;quot;iris&amp;quot;,  t: &amp;quot;Radio mit IRIS&amp;quot;, only: { vehicle: [&amp;quot;3er-e46&amp;quot;, &amp;quot;5er-e39&amp;quot;, &amp;quot;7er-e38&amp;quot;, &amp;quot;x5-e53&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.iris + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;mid&amp;quot;,   t: &amp;quot;Radio mit MID&amp;quot;,  only: { gen: [&amp;quot;alt&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.radio + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;n43&amp;quot;,   t: &amp;quot;4:3 Navi&amp;quot;,       only: { vehicle: [&amp;quot;5er-e39&amp;quot;, &amp;quot;7er-e38&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.n43 + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;n169&amp;quot;,  t: &amp;quot;16:9 Navi&amp;quot;,      only: { gen: [&amp;quot;alt&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.n169 + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;pfeil&amp;quot;, t: &amp;quot;Pfeilnavi&amp;quot;,      only: { vehicle: [&amp;quot;3er-e46&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.pfeil + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;mask&amp;quot;,  t: &amp;quot;M-ASK&amp;quot;,          only: { gen: [&amp;quot;b&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;ccc&amp;quot;,   t: &amp;quot;CCC&amp;quot;,            only: { gen: [&amp;quot;b&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;cic&amp;quot;,   t: &amp;quot;CIC&amp;quot;,            only: { gen: [&amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;nbt&amp;quot;,   t: &amp;quot;NBT&amp;quot;,            only: { gen: [&amp;quot;c&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;nbtevo&amp;quot;, t: &amp;quot;NBT EVO&amp;quot;,       only: { gen: [&amp;quot;c&amp;quot;] } } ] },&lt;br /&gt;
  { id: &amp;quot;trunk&amp;quot;, label: &amp;quot;Wo sitzt das Radiomodul des Pfeilnavis?&amp;quot;, optional: true, show: { factory: [&amp;quot;pfeil&amp;quot;] },&lt;br /&gt;
    help: &amp;quot;Bitte prüfen: Sitzt das Modul im Kofferraum, oder im Pfeilnavi selbst (Quadlock hinten neben dem Antennenstecker)?[br][img=&amp;quot; + P.pfeil + &amp;quot;]&amp;quot;,&lt;br /&gt;
    values: [&lt;br /&gt;
    { v: &amp;quot;ja&amp;quot;, t: &amp;quot;Im Kofferraum (Verlängerungen nötig)&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;nein&amp;quot;, t: &amp;quot;Im Pfeilnavi, Quadlock hinten (keine Verlängerung)&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;unk&amp;quot;, t: &amp;quot;Weiß ich nicht&amp;quot; } ] },&lt;br /&gt;
  { id: &amp;quot;aux&amp;quot;, label: &amp;quot;AUX-IN verfügbar?&amp;quot;, show: { gen: [&amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;] }, values: [&lt;br /&gt;
    { v: &amp;quot;ja&amp;quot;, t: &amp;quot;Ja&amp;quot; }, { v: &amp;quot;nein&amp;quot;, t: &amp;quot;Nein&amp;quot; } ] },&lt;br /&gt;
  { id: &amp;quot;sound&amp;quot;, label: &amp;quot;Soundsystem&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;stereo&amp;quot;, t: &amp;quot;Stereo&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;hifi&amp;quot;,   t: &amp;quot;Hifi&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;dsp&amp;quot;,    t: &amp;quot;DSP&amp;quot;, only: { vehicle: [&amp;quot;7er-e38&amp;quot;, &amp;quot;5er-e39&amp;quot;, &amp;quot;x5-e53&amp;quot;, &amp;quot;x3-e83&amp;quot;] }, info: &amp;quot;[a=&amp;quot; + WIKI + &amp;quot;Habe_ich_DSP%3F]Habe ich DSP?[/a]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;hk&amp;quot;,     t: &amp;quot;Harman Kardon&amp;quot;, only: { vehicle: [&amp;quot;3er-e46&amp;quot;, &amp;quot;z4-e85e86&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;logic7&amp;quot;, t: &amp;quot;Logic7&amp;quot;, only: { vehicle: [&amp;quot;3er-e9x&amp;quot;, &amp;quot;5er-e6x&amp;quot;, &amp;quot;6er-e6x&amp;quot;, &amp;quot;7er-e65&amp;quot;, &amp;quot;1er-e8x&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;hksur&amp;quot;,  t: &amp;quot;Harman Kardon Surround&amp;quot;, only: { vehicle: [&amp;quot;1er-f2x&amp;quot;, &amp;quot;2er-f2x&amp;quot;, &amp;quot;3er-f3x&amp;quot;, &amp;quot;4er-f3x&amp;quot;, &amp;quot;5er-f1x&amp;quot;] } } ] },&lt;br /&gt;
  { id: &amp;quot;current&amp;quot;, label: &amp;quot;Aktuell verbaut&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;werk&amp;quot;, t: &amp;quot;Werksradio / Werksnavi&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;nach&amp;quot;, t: &amp;quot;Nachrüst-Radio / -Navi&amp;quot; } ] },&lt;br /&gt;
  { id: &amp;quot;body&amp;quot;, label: &amp;quot;Karosserie&amp;quot;, auto: true, values: bodyValues },&lt;br /&gt;
  { id: &amp;quot;ant&amp;quot;, label: &amp;quot;Antennenstecker am Radio (optional)&amp;quot;, optional: true, def: &amp;quot;unk&amp;quot;,&lt;br /&gt;
    show: { vehicle: [&amp;quot;7er-e38&amp;quot;, &amp;quot;5er-e39&amp;quot;, &amp;quot;3er-e46&amp;quot;, &amp;quot;x5-e53&amp;quot;] },&lt;br /&gt;
    values: [&lt;br /&gt;
    { v: &amp;quot;unk&amp;quot;,   t: &amp;quot;Weiß ich nicht&amp;quot;, info: &amp;quot;[b]BM24[/b] (Rundpin) = ISO-Antennenstecker:[br][img=&amp;quot; + P.bm24 + &amp;quot;][img=&amp;quot; + P.iso + &amp;quot;][br][b]BM54[/b] = FAKRA:[br][img=&amp;quot; + P.bm54 + &amp;quot;][img=&amp;quot; + P.fakra + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;iso&amp;quot;,   t: &amp;quot;ISO (BM24, Rundpin)&amp;quot;, info: &amp;quot;[img=&amp;quot; + P.bm24 + &amp;quot;][img=&amp;quot; + P.iso + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;fakra&amp;quot;, t: &amp;quot;FAKRA (BM54)&amp;quot;, info: &amp;quot;[img=&amp;quot; + P.bm54 + &amp;quot;][img=&amp;quot; + P.fakra + &amp;quot;]&amp;quot; } ] }&lt;br /&gt;
];&lt;br /&gt;
/* ---- 3) Zusatzoptionen (Mehrfachauswahl) ---------------------------------&lt;br /&gt;
   show = nur sichtbar wenn Bedingung passt   requires = nur sichtbar wenn diese Optionen gewählt sind&lt;br /&gt;
   excl = Optionen derselben Gruppe schließen sich aus   items = Artikel aus ITEMS */&lt;br /&gt;
var OPTS = [&lt;br /&gt;
  { id: &amp;quot;halter&amp;quot;,  t: &amp;quot;Radio-Halter&amp;quot;, sub: &amp;quot;nur BMW E39&amp;quot;, show: { vehicle: [&amp;quot;5er-e39&amp;quot;] }, items: [&amp;quot;halter&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;ibus&amp;quot;,    t: &amp;quot;I-BUS App&amp;quot;, show: { gen: [&amp;quot;alt&amp;quot;] }, items: [&amp;quot;ibus&amp;quot;, &amp;quot;resler&amp;quot;, &amp;quot;bclic&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;deepobd&amp;quot;, t: &amp;quot;DeepOBD (Diagnose)&amp;quot;, items: [&amp;quot;deepobd&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;can&amp;quot;,     t: &amp;quot;CAN Interface&amp;quot;, sub: &amp;quot;Addon - nur mit I-BUS App&amp;quot;, show: { gen: [&amp;quot;alt&amp;quot;] }, requires: [&amp;quot;ibus&amp;quot;], items: [&amp;quot;can&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;kcan&amp;quot;,    t: &amp;quot;K-CAN App (Beta)&amp;quot;, sub: &amp;quot;Pendant zur I-BUS App&amp;quot;, show: { vehicle: KCAN }, items: [&amp;quot;kcan&amp;quot;, &amp;quot;kcanlic&amp;quot;, &amp;quot;can&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;tpms&amp;quot;,    t: &amp;quot;TPMS (Reifendruck)&amp;quot;, items: [&amp;quot;tpms&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;dab1&amp;quot;,    t: &amp;quot;DAB+ (Single Receiver)&amp;quot;, excl: &amp;quot;dab&amp;quot;, items: [&amp;quot;dab1&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;dab2&amp;quot;,    t: &amp;quot;DAB+ (Dual Receiver)&amp;quot;,   excl: &amp;quot;dab&amp;quot;, items: [&amp;quot;dab2&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;rcam&amp;quot;,    t: &amp;quot;Rückfahrkamera&amp;quot;, items: [&amp;quot;rcam&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;fcam&amp;quot;,    t: &amp;quot;Front-Kamera&amp;quot;, items: [&amp;quot;fcam&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;tool&amp;quot;,    t: &amp;quot;Einbau-Werkzeug (Kunststoffheber)&amp;quot;, items: [&amp;quot;tool&amp;quot;] }&lt;br /&gt;
];&lt;br /&gt;
/* Erzwungene Optionen (werden automatisch gesetzt und gesperrt) */&lt;br /&gt;
var FORCED = [&lt;br /&gt;
  { when: { sound: [&amp;quot;dsp&amp;quot;] }, opts: [&amp;quot;ibus&amp;quot;], why: &amp;quot;wegen DSP erforderlich&amp;quot; }&lt;br /&gt;
];&lt;br /&gt;
/* ---- 4) Artikel ------------------------------------------------------------&lt;br /&gt;
   u = Shop-Link (ut = Linktext)   w = Wiki-Link (wt = Linktext)   leer = kein Link&lt;br /&gt;
   skipIf = Artikel entfällt, wenn der genannte Artikel schon in der Liste steht */&lt;br /&gt;
var ITEMS = {&lt;br /&gt;
  exl005:  { t: &amp;quot;Verlängerung EXL005&amp;quot;, d: &amp;quot;Ersetzt das Radiomodul im Kofferraum.&amp;quot;, u: SHOP + &amp;quot;detail/index/sArticle/212/&amp;quot;, img: [P.exl005, P.schema] },&lt;br /&gt;
  fakra6m: { t: &amp;quot;Verlängerung 6 m FAKRA(m) auf FAKRA(f), gewinkelt&amp;quot;, d: &amp;quot;Antennenverlängerung vom Kofferraum nach vorn.&amp;quot;, img: [P.fakra6m],&lt;br /&gt;
             u: SHOP + &amp;quot;shop/zubehoer/adapterkabel/192/verlaengerung-6m-fakra-m-auf-fakra-f-kurz-gewinkelt&amp;quot; },&lt;br /&gt;
  isoada:  { t: &amp;quot;Adapter ISO-Stecker auf FAKRA, gewinkelt (15 cm)&amp;quot;, d: &amp;quot;Nötig bei ISO-Antennenstecker (BM24, Rundpin).&amp;quot;, img: [P.isofakra],&lt;br /&gt;
             u: SHOP + &amp;quot;shop/zubehoer/adapterkabel/193/adapter-kabel-iso-f-auf-fakra-f-kurz-gewinkelt-15cm&amp;quot; },&lt;br /&gt;
  bcdsp:   { t: &amp;quot;I-BUS App - BC+DSP Lizenz&amp;quot;, d: &amp;quot;Ohne DSP-Lizenz arbeitet das Werks-DSP nicht.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/lizenzen/171/i-bus-app-bc-dsp-lizenz&amp;quot;,&lt;br /&gt;
             w: WIKI + &amp;quot;Habe_ich_DSP%3F&amp;quot;, wt: &amp;quot;Wiki: Habe ich DSP?&amp;quot; },&lt;br /&gt;
  halter:  { t: &amp;quot;Alu-Halter zur Radio-Montage im BMW E39&amp;quot;, d: &amp;quot;Empfohlen bei Radios, die nicht von AVIN stammen.&amp;quot;, img: [P.halter],&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/radiohalter/185/alu-halter-zur-radio-montage-im-bmw-e39&amp;quot; },&lt;br /&gt;
  ibus:    { t: &amp;quot;I-BUS App&amp;quot;, hl: true,&lt;br /&gt;
             d: &amp;quot;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.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;cat/index/sCategory/42&amp;quot;,&lt;br /&gt;
             links: [&lt;br /&gt;
               { u: WIKI + &amp;quot;Was_brauche_ich_um_die_I-BUS_App_nutzen_zu_k%C3%B6nnen%3F&amp;quot;, t: &amp;quot;Wiki: Was brauche ich für die I-BUS App?&amp;quot; },&lt;br /&gt;
               { u: WIKI + &amp;quot;Funktionen&amp;quot;, t: &amp;quot;Liste aller I-BUS App Funktionen (BMW E38|E39|E46|E53|E83)&amp;quot; },&lt;br /&gt;
               { u: WIKI + &amp;quot;Was_geht_beim_BMW_E46_nicht&amp;quot;, t: &amp;quot;Was geht beim BMW E46, E83, E85,.. nicht? (da werkseitig nicht verbaut)&amp;quot; },&lt;br /&gt;
               { u: WIKI + &amp;quot;Funktionseinschr%C3%A4nkungen_nach_Baujahr/Ausstattung/Modell&amp;quot;, t: &amp;quot;Funktionseinschränkungen nach Baujahr/Ausstattung/Modell&amp;quot; } ] },&lt;br /&gt;
  resler:  { t: &amp;quot;Resler USB I-BUS Modul inkl. Anschlusskabel&amp;quot;, d: &amp;quot;Verbindet I-BUS App und Fahrzeug.&amp;quot;, img: [P.resler],&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/interfaces-module/191/resler-usb-i-bus-modul-inkl.-anschlusskabel&amp;quot;,&lt;br /&gt;
             w: &amp;quot;https://wiki.ibus-app.de/index.php?title=Hauptseite#Einbauanleitung_f.C3.BCr_Resler_Modul_und_Resler_Interface&amp;quot;, wt: &amp;quot;Einbauanleitung Resler Modul&amp;quot; },&lt;br /&gt;
  bclic:   { t: &amp;quot;I-BUS App - BC Lizenz&amp;quot;, d: &amp;quot;Schaltet u. a. die BC-Daten der App frei.&amp;quot;, skipIf: &amp;quot;bcdsp&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/lizenzen/167/i-bus-app-bc-lizenz&amp;quot; },&lt;br /&gt;
  deepobd: { t: &amp;quot;Deep OBD OBD-II Bluetooth-Adapter&amp;quot;, d: &amp;quot;Live-Werte auslesen, Fehler lesen und löschen.&amp;quot;, img: [P.deepobd],&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/interfaces-module/258/deep-obd-obd-ii-bluetooth-adapter?c=54&amp;quot;,&lt;br /&gt;
             w: &amp;quot;https://xtrons.ibus-app.de/index.php?title=DeepOBD_-_Adapter_und_App_einrichten&amp;quot;, wt: &amp;quot;Wiki: DeepOBD einrichten&amp;quot; },&lt;br /&gt;
  can:     { t: &amp;quot;CAN-Bus Interface inkl. Anschlusskabel&amp;quot;, d: &amp;quot;Addon, funktioniert nur zusammen mit der I-BUS App bzw. der K-CAN App.&amp;quot;, img: [P.can],&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/interfaces-module/346/can-bus-interface-inkl.-anschlusskabel&amp;quot;,&lt;br /&gt;
             w: WIKI + &amp;quot;Einbauanleitung_CAN-Bus_Interface&amp;quot;, wt: &amp;quot;Einbauanleitung CAN-Bus Interface&amp;quot; },&lt;br /&gt;
  kcan:    { t: &amp;quot;K-CAN App (Beta)&amp;quot;, d: &amp;quot;Pendant zur I-BUS App für Fahrzeuge mit K-CAN, aktuell als Betaversion.&amp;quot;,&lt;br /&gt;
             w: &amp;quot;https://wiki.kcan-app.de/&amp;quot;, wt: &amp;quot;Wiki zur K-CAN App&amp;quot; },&lt;br /&gt;
  kcanlic: { t: &amp;quot;K-CAN App - Lizenz Betaversion&amp;quot;, d: &amp;quot;Beta-Lizenz für die K-CAN App.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/lizenzen/358/k-can-app-lizenz-betaversion&amp;quot; },&lt;br /&gt;
  tpms:    { t: &amp;quot;TPMS - Reifendruckkontrolle&amp;quot;, d: &amp;quot;&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/tpms/&amp;quot; },&lt;br /&gt;
  dab1:    { t: &amp;quot;DAB+ Empfänger inkl. Antenne (Single)&amp;quot;, d: &amp;quot;&amp;quot;, w: &amp;quot;https://xtrons.ibus-app.de/index.php?title=Installation_der_DAB%2B_Antenne&amp;quot;, wt: &amp;quot;Installation der DAB+ Antenne&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/dab/291/dab-empfaenger-inkl.-antenne-usbdab04&amp;quot; },&lt;br /&gt;
  dab2:    { t: &amp;quot;Dual DAB+ Empfänger-Stick inkl. 2 Antennen&amp;quot;, d: &amp;quot;&amp;quot;, w: &amp;quot;https://xtrons.ibus-app.de/index.php?title=Installation_der_DAB%2B_Antenne&amp;quot;, wt: &amp;quot;Installation der DAB+ Antenne&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/dab/391/dual-dab-empfaenger-stick-inkl.-2-antennen-acusbdab05t?c=75&amp;quot; },&lt;br /&gt;
  rcam:    { t: &amp;quot;Rückfahrkamera&amp;quot;, d: &amp;quot;&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/kameras/&amp;quot;, ut: &amp;quot;Kameras im Shop ansehen →&amp;quot; },&lt;br /&gt;
  fcam:    { t: &amp;quot;Front-Kamera&amp;quot;, d: &amp;quot;&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/kameras/&amp;quot;, ut: &amp;quot;Kameras im Shop ansehen →&amp;quot; },&lt;br /&gt;
  tool:    { t: &amp;quot;Einbau-Werkzeug (Kunststoffheber)&amp;quot;, d: &amp;quot;Zum schonenden Lösen der Verkleidungen.&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/einbauwerkzeug/&amp;quot; }&lt;br /&gt;
};&lt;br /&gt;
/* ---- 5) Regeln --------------------------------------------------------------&lt;br /&gt;
   type: need (Das brauchst Du) oder hint (Hinweise)   when = Bedingung auf die Felder&lt;br /&gt;
   opts = diese Zusatzoptionen müssen gewählt sein      items = Artikel   html = Text&lt;br /&gt;
   Abgeleitete Werte: gen (alt/b/c) und module (ja/nein/unk = Radiomodul im Kofferraum, nur gen alt) */&lt;br /&gt;
var RULES = [&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { current: [&amp;quot;werk&amp;quot;], module: [&amp;quot;ja&amp;quot;] }, items: [&amp;quot;exl005&amp;quot;, &amp;quot;fakra6m&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { current: [&amp;quot;nach&amp;quot;], module: [&amp;quot;ja&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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=&amp;quot; + P.noquad + &amp;quot;][img=&amp;quot; + P.noexl6 + &amp;quot;]&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;ja&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;nein&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;unk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { ant: [&amp;quot;iso&amp;quot;] }, items: [&amp;quot;isoada&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { ant: [&amp;quot;unk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Antennenstecker:[/b] [b]BM24[/b] (Rundpin) = ISO-Antennenstecker, ggf. wird der [a=&amp;quot; + SHOP + &amp;quot;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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { sound: [&amp;quot;dsp&amp;quot;] }, items: [&amp;quot;bcdsp&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { sound: [&amp;quot;dsp&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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=&amp;quot; + WIKI + &amp;quot;Habe_ich_DSP%3F]Habe ich DSP?[/a]&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { sound: [&amp;quot;hk&amp;quot;], gen: [&amp;quot;alt&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Harman Kardon:[/b] Benötigt [b]keine[/b] DSP-Lizenz. Das Remote-Signal (+12 V, wenn Radio an) genügt zum Starten.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { aux: [&amp;quot;nein&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]AUX-IN:[/b] Der AUX-IN muss codiert werden. Optional kann ein FM-Transmitter genutzt werden - das ist nicht empfohlen.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;7er-e38&amp;quot;, &amp;quot;x5-e53&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Montage:[/b] Radios für BMW E38/E53 benötigen keine extra Halterungen.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;5er-e39&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;3er-e46&amp;quot;], factory: [&amp;quot;iris&amp;quot;, &amp;quot;mid&amp;quot;, &amp;quot;pfeil&amp;quot;], current: [&amp;quot;werk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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]&amp;quot; +&lt;br /&gt;
          &amp;quot;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]&amp;quot; +&lt;br /&gt;
          &amp;quot;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=&amp;quot; + P.funktr + &amp;quot;]&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { factory: [&amp;quot;cic&amp;quot;, &amp;quot;nbt&amp;quot;, &amp;quot;nbtevo&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Lichtleiter:[/b] Ggf. vorhandene Lichtleiter (MOST) müssen aus dem BMW-Stecker in den Xtrons-Adapter umgesteckt werden.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { factory: [&amp;quot;mask&amp;quot;, &amp;quot;ccc&amp;quot;, &amp;quot;cic&amp;quot;, &amp;quot;nbt&amp;quot;, &amp;quot;nbtevo&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, opts: [&amp;quot;kcan&amp;quot;], when: {},&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, opts: [&amp;quot;ibus&amp;quot;], when: {},&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: {},&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot; }&lt;br /&gt;
];&lt;br /&gt;
/* =====================================================================&lt;br /&gt;
   PROGRAMMLOGIK&lt;br /&gt;
   ===================================================================== */&lt;br /&gt;
var $ = function (id) { return document.getElementById(id); };&lt;br /&gt;
var sel = {}, picked = {}, summary = &amp;quot;&amp;quot;, capA = 0, capB = 0, radioCache = {}, chosenRadio = null;&lt;br /&gt;
var fieldsEl = $(&amp;quot;nvk-fields&amp;quot;), optsEl = $(&amp;quot;nvk-opts&amp;quot;), outEl = $(&amp;quot;nvk-out&amp;quot;);&lt;br /&gt;
function full(u) { return u.indexOf(&amp;quot;/thumb/&amp;quot;) === -1 ? u : u.replace(&amp;quot;/thumb/&amp;quot;, &amp;quot;/&amp;quot;).replace(/\/[^\/]+$/, &amp;quot;&amp;quot;); }&lt;br /&gt;
function fmt(t) {&lt;br /&gt;
  return t.replace(/\[imgw=([^\x5D]+)\]/g, function (m, u) {&lt;br /&gt;
    return &amp;quot;\u003Ca href=\&amp;quot;&amp;quot; + full(u) + &amp;quot;\&amp;quot; target=\&amp;quot;_blank\&amp;quot; rel=\&amp;quot;noopener\&amp;quot;\u003E\u003Cimg class=\&amp;quot;nvk-img wide\&amp;quot; src=\&amp;quot;&amp;quot; + u + &amp;quot;\&amp;quot; alt=\&amp;quot;\&amp;quot;\u003E\u003C/a\u003E&amp;quot;;&lt;br /&gt;
  }).replace(/\[img=([^\x5D]+)\]/g, function (m, u) {&lt;br /&gt;
    return &amp;quot;\u003Ca href=\&amp;quot;&amp;quot; + full(u) + &amp;quot;\&amp;quot; target=\&amp;quot;_blank\&amp;quot; rel=\&amp;quot;noopener\&amp;quot;\u003E\u003Cimg class=\&amp;quot;nvk-img\&amp;quot; src=\&amp;quot;&amp;quot; + u + &amp;quot;\&amp;quot; alt=\&amp;quot;\&amp;quot;\u003E\u003C/a\u003E&amp;quot;;&lt;br /&gt;
  }).replace(/\[b\]/g, &amp;quot;\u003Cb\u003E&amp;quot;).replace(/\[\/b\]/g, &amp;quot;\u003C/b\u003E&amp;quot;).replace(/\[br\]/g, &amp;quot;\u003Cbr\u003E&amp;quot;)&lt;br /&gt;
    .replace(/\[a=([^\x5D]+)\]/g, &amp;quot;\u003Ca href=\&amp;quot;$1\&amp;quot; target=\&amp;quot;_blank\&amp;quot; rel=\&amp;quot;noopener\&amp;quot;\u003E&amp;quot;).replace(/\[\/a\]/g, &amp;quot;\u003C/a\u003E&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
function match(cond, s, lenient) {&lt;br /&gt;
  if (!cond) return true;&lt;br /&gt;
  for (var k in cond) {&lt;br /&gt;
    if (!s[k]) { if (lenient) continue; return false; }&lt;br /&gt;
    if (cond[k].indexOf(s[k]) === -1) return false;&lt;br /&gt;
  }&lt;br /&gt;
  return true;&lt;br /&gt;
}&lt;br /&gt;
function vehicleOf(id) { return VEHICLES.filter(function (x) { return x.v === id; })[0]; }&lt;br /&gt;
function derive() {&lt;br /&gt;
  var s = {}, k;&lt;br /&gt;
  for (k in sel) s[k] = sel[k];&lt;br /&gt;
  var veh = vehicleOf(sel.vehicle);&lt;br /&gt;
  if (veh) s.gen = veh.gen;&lt;br /&gt;
  if (s.gen === &amp;quot;alt&amp;quot;) {&lt;br /&gt;
    if (s.factory === &amp;quot;n43&amp;quot; || s.factory === &amp;quot;n169&amp;quot;) s.module = &amp;quot;ja&amp;quot;;&lt;br /&gt;
    else if (s.factory === &amp;quot;iris&amp;quot; || s.factory === &amp;quot;mid&amp;quot;) s.module = &amp;quot;nein&amp;quot;;&lt;br /&gt;
    else if (s.factory === &amp;quot;pfeil&amp;quot;) s.module = s.trunk || &amp;quot;unk&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  return s;&lt;br /&gt;
}&lt;br /&gt;
function forced(s) {&lt;br /&gt;
  var f = {};&lt;br /&gt;
  FORCED.forEach(function (r) { if (match(r.when, s)) r.opts.forEach(function (o) { f[o] = r.why; }); });&lt;br /&gt;
  return f;&lt;br /&gt;
}&lt;br /&gt;
function onSet(s) {&lt;br /&gt;
  var f = forced(s), on = {}, k;&lt;br /&gt;
  for (k in picked) if (picked[k]) on[k] = true;&lt;br /&gt;
  for (k in f) on[k] = true;&lt;br /&gt;
  return { on: on, forced: f };&lt;br /&gt;
}&lt;br /&gt;
function optVisible(o, s, on) {&lt;br /&gt;
  if (!match(o.show, s, true)) return false;&lt;br /&gt;
  return (o.requires || []).every(function (r) { return on[r]; });&lt;br /&gt;
}&lt;br /&gt;
FIELDS.forEach(function (f) {&lt;br /&gt;
  var wrap = document.createElement(&amp;quot;div&amp;quot;); wrap.className = &amp;quot;nvk-f&amp;quot;; wrap.id = &amp;quot;nvk-w-&amp;quot; + f.id;&lt;br /&gt;
  var lab = document.createElement(&amp;quot;label&amp;quot;); lab.htmlFor = &amp;quot;nvk-&amp;quot; + f.id; lab.textContent = f.label;&lt;br /&gt;
  var s = document.createElement(&amp;quot;select&amp;quot;); s.id = &amp;quot;nvk-&amp;quot; + f.id;&lt;br /&gt;
  s.addEventListener(&amp;quot;change&amp;quot;, function () { sel[f.id] = s.value; update(); });&lt;br /&gt;
  wrap.appendChild(lab); wrap.appendChild(s);&lt;br /&gt;
  if (f.help) { var h = document.createElement(&amp;quot;div&amp;quot;); h.className = &amp;quot;nvk-help&amp;quot;; h.innerHTML = fmt(f.help); wrap.appendChild(h); }&lt;br /&gt;
  var inf = document.createElement(&amp;quot;div&amp;quot;); inf.id = &amp;quot;nvk-i-&amp;quot; + f.id; wrap.appendChild(inf);&lt;br /&gt;
  fieldsEl.appendChild(wrap);&lt;br /&gt;
});&lt;br /&gt;
function renderFields() {&lt;br /&gt;
  FIELDS.forEach(function (f) {&lt;br /&gt;
    var s = derive();&lt;br /&gt;
    var wrap = $(&amp;quot;nvk-w-&amp;quot; + f.id), el = $(&amp;quot;nvk-&amp;quot; + f.id);&lt;br /&gt;
    var vis = f.show ? match(f.show, s, false) : true;&lt;br /&gt;
    wrap.style.display = vis ? &amp;quot;&amp;quot; : &amp;quot;none&amp;quot;;&lt;br /&gt;
    if (!vis) { sel[f.id] = &amp;quot;&amp;quot;; return; }&lt;br /&gt;
    var allowed = f.values.filter(function (v) { return match(v.only, s, true); });&lt;br /&gt;
    if (sel[f.id]) { if (!allowed.some(function (v) { return v.v === sel[f.id]; })) sel[f.id] = &amp;quot;&amp;quot;; }&lt;br /&gt;
    if (!sel[f.id]) { if (f.def) sel[f.id] = f.def; }&lt;br /&gt;
    if (!sel[f.id]) { if (f.auto) { if (sel.vehicle) { if (allowed.length === 1) sel[f.id] = allowed[0].v; } } }&lt;br /&gt;
    el.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
    if (!f.def) { var p = document.createElement(&amp;quot;option&amp;quot;); p.value = &amp;quot;&amp;quot;; p.textContent = &amp;quot;– bitte wählen –&amp;quot;; el.appendChild(p); }&lt;br /&gt;
    allowed.forEach(function (v) {&lt;br /&gt;
      var o = document.createElement(&amp;quot;option&amp;quot;); o.value = v.v; o.textContent = v.t; el.appendChild(o);&lt;br /&gt;
    });&lt;br /&gt;
    el.value = sel[f.id] || &amp;quot;&amp;quot;;&lt;br /&gt;
    var cur = allowed.filter(function (v) { return v.v === sel[f.id]; })[0];&lt;br /&gt;
    var pre = f.pre ? (match(f.pre.when, s, false) ? fmt(f.pre.html) : &amp;quot;&amp;quot;) : &amp;quot;&amp;quot;;&lt;br /&gt;
    $(&amp;quot;nvk-i-&amp;quot; + f.id).innerHTML = pre + (cur ? (cur.info ? fmt(cur.info) : &amp;quot;&amp;quot;) : &amp;quot;&amp;quot;);&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
function renderOpts() {&lt;br /&gt;
  var s = derive(), st = onSet(s);&lt;br /&gt;
  OPTS.forEach(function (o) { if (!optVisible(o, s, st.on)) picked[o.id] = false; });&lt;br /&gt;
  st = onSet(s);&lt;br /&gt;
  optsEl.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
  OPTS.forEach(function (o) {&lt;br /&gt;
    if (!optVisible(o, s, st.on)) return;&lt;br /&gt;
    var lab = document.createElement(&amp;quot;label&amp;quot;); lab.className = &amp;quot;nvk-o&amp;quot;;&lt;br /&gt;
    var cb = document.createElement(&amp;quot;input&amp;quot;); cb.type = &amp;quot;checkbox&amp;quot;;&lt;br /&gt;
    cb.checked = !!st.on[o.id];&lt;br /&gt;
    var isForced = !!st.forced[o.id];&lt;br /&gt;
    if (isForced) { cb.disabled = true; lab.className += &amp;quot; dis&amp;quot;; }&lt;br /&gt;
    cb.addEventListener(&amp;quot;change&amp;quot;, function () {&lt;br /&gt;
      picked[o.id] = cb.checked;&lt;br /&gt;
      if (cb.checked) { if (o.excl) OPTS.forEach(function (x) { if (x.excl === o.excl) { if (x.id !== o.id) picked[x.id] = false; } }); }&lt;br /&gt;
      update();&lt;br /&gt;
    });&lt;br /&gt;
    lab.appendChild(cb);&lt;br /&gt;
    lab.appendChild(document.createTextNode(&amp;quot; &amp;quot; + o.t));&lt;br /&gt;
    var sub = [o.sub, isForced ? st.forced[o.id] : &amp;quot;&amp;quot;].filter(Boolean).join(&amp;quot; - &amp;quot;);&lt;br /&gt;
    if (sub) { var sm = document.createElement(&amp;quot;small&amp;quot;); sm.textContent = &amp;quot; (&amp;quot; + sub + &amp;quot;)&amp;quot;; lab.appendChild(sm); }&lt;br /&gt;
    optsEl.appendChild(lab);&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
function link(url, text) {&lt;br /&gt;
  var a = document.createElement(&amp;quot;a&amp;quot;); a.href = url; a.target = &amp;quot;_blank&amp;quot;; a.rel = &amp;quot;noopener&amp;quot;; a.textContent = text; return a;&lt;br /&gt;
}&lt;br /&gt;
function card(item, cls) {&lt;br /&gt;
  var d = document.createElement(&amp;quot;div&amp;quot;); d.className = &amp;quot;nvk-card &amp;quot; + (cls || &amp;quot;&amp;quot;) + (item.hl ? &amp;quot; hl&amp;quot; : &amp;quot;&amp;quot;);&lt;br /&gt;
  var b = document.createElement(&amp;quot;b&amp;quot;); b.textContent = item.t; d.appendChild(b);&lt;br /&gt;
  if (item.d) { var p = document.createElement(&amp;quot;span&amp;quot;); p.textContent = item.d; d.appendChild(p); }&lt;br /&gt;
  if (item.img) {&lt;br /&gt;
    var im = document.createElement(&amp;quot;div&amp;quot;);&lt;br /&gt;
    item.img.forEach(function (u) {&lt;br /&gt;
      var a = document.createElement(&amp;quot;a&amp;quot;); a.href = full(u); a.target = &amp;quot;_blank&amp;quot;; a.rel = &amp;quot;noopener&amp;quot;;&lt;br /&gt;
      var g = document.createElement(&amp;quot;img&amp;quot;); g.className = &amp;quot;nvk-img&amp;quot;; g.src = u; g.alt = item.t; a.appendChild(g); im.appendChild(a);&lt;br /&gt;
    });&lt;br /&gt;
    d.appendChild(im);&lt;br /&gt;
  }&lt;br /&gt;
  if (item.u || item.w) {&lt;br /&gt;
    var l = document.createElement(&amp;quot;div&amp;quot;); l.className = &amp;quot;nvk-links&amp;quot;;&lt;br /&gt;
    if (item.u) l.appendChild(link(item.u, item.ut || &amp;quot;Im Shop ansehen →&amp;quot;));&lt;br /&gt;
    if (item.w) l.appendChild(link(item.w, (item.wt || &amp;quot;Zum Wiki&amp;quot;) + &amp;quot; →&amp;quot;));&lt;br /&gt;
    d.appendChild(l);&lt;br /&gt;
  }&lt;br /&gt;
  if (item.links) item.links.forEach(function (x) {&lt;br /&gt;
    var r = document.createElement(&amp;quot;div&amp;quot;); r.className = &amp;quot;nvk-links&amp;quot;; r.appendChild(link(x.u, x.t + &amp;quot; →&amp;quot;)); d.appendChild(r);&lt;br /&gt;
  });&lt;br /&gt;
  return d;&lt;br /&gt;
}&lt;br /&gt;
function heading(txt) { var h = document.createElement(&amp;quot;h3&amp;quot;); h.textContent = txt; outEl.appendChild(h); }&lt;br /&gt;
function aidOf(u) {&lt;br /&gt;
  if (u.indexOf(SHOP) !== 0) return &amp;quot;&amp;quot;;&lt;br /&gt;
  var m = u.match(/sArticle\/(\d+)/);&lt;br /&gt;
  if (!m) m = u.split(&amp;quot;?&amp;quot;)[0].match(/\/(\d+)\/[^\/]+$/);&lt;br /&gt;
  return m ? m[1] : &amp;quot;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
function renderRadioList(veh) {&lt;br /&gt;
  if (veh.noCat) return;&lt;br /&gt;
  if (chosenRadio) { if (chosenRadio.cat !== veh.v) chosenRadio = null; }&lt;br /&gt;
  var data = radioCache[veh.v];&lt;br /&gt;
  if (data === undefined) {&lt;br /&gt;
    radioCache[veh.v] = &amp;quot;loading&amp;quot;;&lt;br /&gt;
    fetch(API + &amp;quot;?cat=&amp;quot; + encodeURIComponent(veh.v)).then(function (r) { return r.json(); }).then(function (j) {&lt;br /&gt;
      radioCache[veh.v] = (j.items || []).map(function (it) { it.cat = veh.v; return it; });&lt;br /&gt;
      renderResult();&lt;br /&gt;
    }).catch(function () { radioCache[veh.v] = []; renderResult(); });&lt;br /&gt;
  }&lt;br /&gt;
  if (data === undefined || data === &amp;quot;loading&amp;quot;) {&lt;br /&gt;
    var m = document.createElement(&amp;quot;p&amp;quot;); m.className = &amp;quot;nvk-miss&amp;quot;; m.textContent = &amp;quot;Verfügbare Radios werden geladen …&amp;quot;; outEl.appendChild(m); return;&lt;br /&gt;
  }&lt;br /&gt;
  if (!data.length) return;&lt;br /&gt;
  var want = { mask: /M-?ASK/i, ccc: /\bCCC\b/i, cic: /\bCIC\b/i, nbt: /\bNBT\b/i, nbtevo: /EVO/i }[sel.factory];&lt;br /&gt;
  function fits(it) { return want ? want.test(it.name) : false; }&lt;br /&gt;
  var list = data.slice().sort(function (a, b) { return (fits(b) ? 1 : 0) - (fits(a) ? 1 : 0); });&lt;br /&gt;
  var det = document.createElement(&amp;quot;details&amp;quot;); det.open = Math.max(list.length, 8) === 8;&lt;br /&gt;
  var sm = document.createElement(&amp;quot;summary&amp;quot;); sm.style.cursor = &amp;quot;pointer&amp;quot;; sm.style.fontWeight = &amp;quot;700&amp;quot;;&lt;br /&gt;
  sm.textContent = &amp;quot;Verfügbare Radios für Deinen BMW &amp;quot; + veh.t + &amp;quot; (&amp;quot; + list.length + &amp;quot;)&amp;quot;; det.appendChild(sm);&lt;br /&gt;
  list.forEach(function (it) {&lt;br /&gt;
    var d = document.createElement(&amp;quot;div&amp;quot;); d.className = &amp;quot;nvk-card rad&amp;quot;;&lt;br /&gt;
    var lab = document.createElement(&amp;quot;label&amp;quot;); lab.className = &amp;quot;nvk-o&amp;quot;;&lt;br /&gt;
    var rb = document.createElement(&amp;quot;input&amp;quot;); rb.type = &amp;quot;radio&amp;quot;; rb.name = &amp;quot;nvk-radio&amp;quot;;&lt;br /&gt;
    rb.checked = chosenRadio ? chosenRadio.sku === it.sku : false;&lt;br /&gt;
    rb.addEventListener(&amp;quot;change&amp;quot;, function () { chosenRadio = it; });&lt;br /&gt;
    var sp = document.createElement(&amp;quot;span&amp;quot;); sp.style.fontWeight = &amp;quot;700&amp;quot;;&lt;br /&gt;
    sp.textContent = &amp;quot; &amp;quot; + it.type + (fits(it) ? &amp;quot;  (passt zu Deiner Auswahl)&amp;quot; : &amp;quot;&amp;quot;);&lt;br /&gt;
    lab.appendChild(rb); lab.appendChild(sp); d.appendChild(lab);&lt;br /&gt;
    var t = document.createElement(&amp;quot;div&amp;quot;); t.textContent = it.name + (it.price ? &amp;quot;  -  &amp;quot; + it.price : &amp;quot;&amp;quot;); d.appendChild(t);&lt;br /&gt;
    var l = document.createElement(&amp;quot;div&amp;quot;); l.className = &amp;quot;nvk-links&amp;quot;; l.appendChild(link(it.url, &amp;quot;Im Shop ansehen →&amp;quot;)); d.appendChild(l);&lt;br /&gt;
    det.appendChild(d);&lt;br /&gt;
  });&lt;br /&gt;
  outEl.appendChild(det);&lt;br /&gt;
}&lt;br /&gt;
function cartBlock(needs, opt) {&lt;br /&gt;
  var items = [];&lt;br /&gt;
  needs.concat(opt).forEach(function (i) { var id = aidOf(i.u || &amp;quot;&amp;quot;); if (id) items.push({ t: i.t, aid: id }); });&lt;br /&gt;
  heading(&amp;quot;In den Warenkorb&amp;quot;);&lt;br /&gt;
  var box = document.createElement(&amp;quot;div&amp;quot;); box.className = &amp;quot;nvk-card opt&amp;quot;;&lt;br /&gt;
  var p = document.createElement(&amp;quot;div&amp;quot;);&lt;br /&gt;
  p.textContent = &amp;quot;Das oben gewählte Radio (falls ausgewählt) und diese Artikel werden direkt im Shop in den Warenkorb gelegt:&amp;quot;;&lt;br /&gt;
  box.appendChild(p);&lt;br /&gt;
  items.forEach(function (x) { var r = document.createElement(&amp;quot;div&amp;quot;); r.textContent = &amp;quot;- &amp;quot; + x.t; box.appendChild(r); });&lt;br /&gt;
  var n = document.createElement(&amp;quot;div&amp;quot;); n.className = &amp;quot;nvk-help&amp;quot;;&lt;br /&gt;
  n.textContent = &amp;quot;Kameras, TPMS, Werkzeug und Artikel ohne Direktlink wählst Du bitte über die Links oben im Shop aus.&amp;quot;;&lt;br /&gt;
  box.appendChild(n);&lt;br /&gt;
  var all = needs.concat(opt);&lt;br /&gt;
  var has = function (k) { return all.indexOf(ITEMS[k]) !== -1; };&lt;br /&gt;
  var l17 = has(&amp;quot;kcanlic&amp;quot;), l7 = has(&amp;quot;bclic&amp;quot;) || has(&amp;quot;bcdsp&amp;quot;);&lt;br /&gt;
  if (l17 || l7) {&lt;br /&gt;
    var vb = document.createElement(&amp;quot;div&amp;quot;); vb.className = &amp;quot;nvk-f&amp;quot;; vb.style.marginTop = &amp;quot;12px&amp;quot;;&lt;br /&gt;
    var vlab = document.createElement(&amp;quot;label&amp;quot;); vlab.htmlFor = &amp;quot;nvk-licvin&amp;quot;;&lt;br /&gt;
    vlab.textContent = l17 ? &amp;quot;Fahrgestellnummer (17 Zeichen) für die Lizenz&amp;quot; : &amp;quot;VIN für die Lizenz (7 Zeichen, z. B. AB12345)&amp;quot;;&lt;br /&gt;
    var vin = document.createElement(&amp;quot;input&amp;quot;); vin.type = &amp;quot;text&amp;quot;; vin.id = &amp;quot;nvk-licvin&amp;quot;; vin.maxLength = 17;&lt;br /&gt;
    vin.value = $(&amp;quot;nvk-vin&amp;quot;).value.toUpperCase();&lt;br /&gt;
    var ta = document.createElement(&amp;quot;textarea&amp;quot;); ta.rows = 3; ta.readOnly = true; ta.style.display = &amp;quot;none&amp;quot;; ta.style.marginTop = &amp;quot;6px&amp;quot;;&lt;br /&gt;
    var cb = document.createElement(&amp;quot;button&amp;quot;); cb.type = &amp;quot;button&amp;quot;; cb.className = &amp;quot;nvk-btn&amp;quot;; cb.style.marginTop = &amp;quot;6px&amp;quot;;&lt;br /&gt;
    cb.textContent = &amp;quot;Kommentartext für die Kasse kopieren&amp;quot;;&lt;br /&gt;
    var ls = document.createElement(&amp;quot;div&amp;quot;); ls.className = &amp;quot;nvk-help&amp;quot;;&lt;br /&gt;
    cb.addEventListener(&amp;quot;click&amp;quot;, function () {&lt;br /&gt;
      var v = vin.value.trim().toUpperCase(), v7 = &amp;quot;&amp;quot;, v17 = &amp;quot;&amp;quot;;&lt;br /&gt;
      if (/^[A-HJ-NPR-Z0-9]{17}$/.test(v)) { v17 = v; v7 = v.slice(10); }&lt;br /&gt;
      else if (/^[A-Z]{2}[0-9]{5}$/.test(v)) v7 = v;&lt;br /&gt;
      if (l17 ? !v17 : !v7) { ls.textContent = l17 ? &amp;quot;Bitte die vollständige 17-stellige Fahrgestellnummer eingeben.&amp;quot; : &amp;quot;Bitte die VIN im Format AB12345 (oder die 17-stellige FGN) eingeben.&amp;quot;; return; }&lt;br /&gt;
      var L = [];&lt;br /&gt;
      if (has(&amp;quot;bclic&amp;quot;)) L.push(&amp;quot;I-BUS App BC Lizenz: VIN &amp;quot; + v7);&lt;br /&gt;
      if (has(&amp;quot;bcdsp&amp;quot;)) L.push(&amp;quot;I-BUS App BC+DSP Lizenz: VIN &amp;quot; + v7);&lt;br /&gt;
      if (l17) L.push(&amp;quot;K-CAN App Beta Lizenz: FGN &amp;quot; + v17);&lt;br /&gt;
      ta.value = L.join(&amp;quot;\n&amp;quot;); ta.style.display = &amp;quot;&amp;quot;; ta.select();&lt;br /&gt;
      var hint = &amp;quot;Bitte an der Shop-Kasse in das Feld Kommentar einfügen.&amp;quot;;&lt;br /&gt;
      if (navigator.clipboard) navigator.clipboard.writeText(ta.value).then(function () { ls.textContent = &amp;quot;Text kopiert. &amp;quot; + hint; }).catch(function () { ls.textContent = &amp;quot;Bitte den Text markieren und kopieren. &amp;quot; + hint; });&lt;br /&gt;
      else ls.textContent = &amp;quot;Bitte den Text markieren und kopieren. &amp;quot; + hint;&lt;br /&gt;
    });&lt;br /&gt;
    vb.appendChild(vlab); vb.appendChild(vin); vb.appendChild(cb); vb.appendChild(ta); vb.appendChild(ls); box.appendChild(vb);&lt;br /&gt;
  }&lt;br /&gt;
  var btn = document.createElement(&amp;quot;button&amp;quot;); btn.type = &amp;quot;button&amp;quot;; btn.className = &amp;quot;nvk-btn&amp;quot;; btn.style.marginTop = &amp;quot;8px&amp;quot;;&lt;br /&gt;
  btn.textContent = &amp;quot;Auswahl in den Warenkorb legen&amp;quot;;&lt;br /&gt;
  var st = document.createElement(&amp;quot;div&amp;quot;); st.className = &amp;quot;nvk-help&amp;quot;;&lt;br /&gt;
  btn.addEventListener(&amp;quot;click&amp;quot;, function () { addToCart(items, st); });&lt;br /&gt;
  box.appendChild(btn); box.appendChild(st); outEl.appendChild(box);&lt;br /&gt;
}&lt;br /&gt;
function addToCart(items, st) {&lt;br /&gt;
  var list = items.slice();&lt;br /&gt;
  if (chosenRadio) list.unshift({ t: chosenRadio.type, sku: chosenRadio.sku });&lt;br /&gt;
  if (!list.length) { st.textContent = &amp;quot;Es ist noch nichts zum Bestellen ausgewählt.&amp;quot;; return; }&lt;br /&gt;
  st.textContent = &amp;quot;Artikel werden an den Shop übergeben …&amp;quot;;&lt;br /&gt;
  var ids = list.filter(function (x) { return x.aid; }).map(function (x) { return x.aid; });&lt;br /&gt;
  var get = ids.length ? fetch(API + &amp;quot;?aid=&amp;quot; + ids.join(&amp;quot;,&amp;quot;)).then(function (r) { return r.json(); }).then(function (j) { return j.skus || {}; }) : Promise.resolve({});&lt;br /&gt;
  get.then(function (map) {&lt;br /&gt;
    var skus = [];&lt;br /&gt;
    list.forEach(function (x) { var s = x.sku || map[x.aid]; if (s) skus.push(s); });&lt;br /&gt;
    if (!skus.length) throw new Error(&amp;quot;none&amp;quot;);&lt;br /&gt;
    return skus.reduce(function (p, s) {&lt;br /&gt;
      return p.then(function () { return fetch(CART_ADD + encodeURIComponent(s) + &amp;quot;/sQuantity/1&amp;quot;, { mode: &amp;quot;no-cors&amp;quot;, credentials: &amp;quot;include&amp;quot; }); });&lt;br /&gt;
    }, Promise.resolve()).then(function () { return skus.length; });&lt;br /&gt;
  }).then(function (n) {&lt;br /&gt;
    st.textContent = n + &amp;quot; von &amp;quot; + list.length + &amp;quot; Artikeln wurden an den Warenkorb übergeben. Bitte dort kontrollieren: &amp;quot;;&lt;br /&gt;
    st.appendChild(link(CART, &amp;quot;Zum Warenkorb →&amp;quot;));&lt;br /&gt;
  }).catch(function () { st.textContent = &amp;quot;Das hat leider nicht geklappt. Bitte nutze die Shop-Links oben.&amp;quot;; });&lt;br /&gt;
}&lt;br /&gt;
function renderResult() {&lt;br /&gt;
  var s = derive(), st = onSet(s);&lt;br /&gt;
  var missing = FIELDS.filter(function (f) {&lt;br /&gt;
    var w = $(&amp;quot;nvk-w-&amp;quot; + f.id);&lt;br /&gt;
    return w.style.display !== &amp;quot;none&amp;quot; ? (!f.optional ? !sel[f.id] : false) : false;&lt;br /&gt;
  });&lt;br /&gt;
  outEl.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
  if (missing.length) {&lt;br /&gt;
    var m = document.createElement(&amp;quot;p&amp;quot;); m.className = &amp;quot;nvk-miss&amp;quot;;&lt;br /&gt;
    m.textContent = &amp;quot;Bitte noch auswählen: &amp;quot; + missing.map(function (f) { return f.label; }).join(&amp;quot;, &amp;quot;);&lt;br /&gt;
    outEl.appendChild(m); $(&amp;quot;nvk-form&amp;quot;).style.display = &amp;quot;none&amp;quot;; return;&lt;br /&gt;
  }&lt;br /&gt;
  $(&amp;quot;nvk-form&amp;quot;).style.display = &amp;quot;&amp;quot;;&lt;br /&gt;
  var veh = vehicleOf(sel.vehicle);&lt;br /&gt;
  var ru = veh.noCat ? SHOP + &amp;quot;bmw-radios/&amp;quot; : SHOP + &amp;quot;bmw-radios/&amp;quot; + veh.v + &amp;quot;/&amp;quot;;&lt;br /&gt;
  heading(&amp;quot;Passende Radios&amp;quot;);&lt;br /&gt;
  outEl.appendChild(card({ t: &amp;quot;BMW Radios für &amp;quot; + veh.t, d: &amp;quot;Alle Radios, die für Deinen BMW &amp;quot; + veh.t + &amp;quot; im Shop erhältlich sind.&amp;quot;,&lt;br /&gt;
    u: ru, ut: &amp;quot;Zu den passenden Radios →&amp;quot;, w: SHOP + &amp;quot;bmw-radios/&amp;quot;, wt: &amp;quot;Alle BMW Radios&amp;quot; }, &amp;quot;rad&amp;quot;));&lt;br /&gt;
  renderRadioList(veh);&lt;br /&gt;
  var needs = [], hints = [], seen = {};&lt;br /&gt;
  RULES.forEach(function (r) {&lt;br /&gt;
    if (!match(r.when, s)) return;&lt;br /&gt;
    if (r.opts) { if (!r.opts.every(function (o) { return st.on[o]; })) return; }&lt;br /&gt;
    if (r.type === &amp;quot;need&amp;quot;) (r.items || []).forEach(function (id) { if (!seen[id]) { seen[id] = 1; needs.push(ITEMS[id]); } });&lt;br /&gt;
    else hints.push(r.html);&lt;br /&gt;
  });&lt;br /&gt;
  heading(&amp;quot;Das brauchst Du&amp;quot;);&lt;br /&gt;
  if (needs.length) needs.forEach(function (i) { outEl.appendChild(card(i)); });&lt;br /&gt;
  else { var n = document.createElement(&amp;quot;p&amp;quot;); n.textContent = &amp;quot;Für die Grundinstallation sind keine zusätzlichen Verlängerungen oder Adapter nötig.&amp;quot;; outEl.appendChild(n); }&lt;br /&gt;
  var opt = [];&lt;br /&gt;
  OPTS.forEach(function (o) {&lt;br /&gt;
    if (!st.on[o.id]) return;&lt;br /&gt;
    if (!optVisible(o, s, st.on)) return;&lt;br /&gt;
    o.items.forEach(function (id) {&lt;br /&gt;
      if (seen[id]) return;&lt;br /&gt;
      var sk = ITEMS[id].skipIf;&lt;br /&gt;
      if (sk) { if (seen[sk]) return; }&lt;br /&gt;
      seen[id] = 1; opt.push(ITEMS[id]);&lt;br /&gt;
    });&lt;br /&gt;
  });&lt;br /&gt;
  if (opt.length) { heading(&amp;quot;Deine Zusatzoptionen&amp;quot;); opt.forEach(function (i) { outEl.appendChild(card(i, &amp;quot;opt&amp;quot;)); }); }&lt;br /&gt;
  if (hints.length) {&lt;br /&gt;
    heading(&amp;quot;Hinweise&amp;quot;);&lt;br /&gt;
    hints.forEach(function (t) { var d = document.createElement(&amp;quot;div&amp;quot;); d.className = &amp;quot;nvk-note&amp;quot;; d.innerHTML = fmt(t); outEl.appendChild(d); });&lt;br /&gt;
  }&lt;br /&gt;
  var L = [&amp;quot;KONFIGURATION&amp;quot;];&lt;br /&gt;
  FIELDS.forEach(function (f) {&lt;br /&gt;
    if (!sel[f.id]) return;&lt;br /&gt;
    var v = f.values.filter(function (x) { return x.v === sel[f.id]; })[0];&lt;br /&gt;
    if (v) L.push(&amp;quot;- &amp;quot; + f.label + &amp;quot;: &amp;quot; + v.t);&lt;br /&gt;
  });&lt;br /&gt;
  L.push(&amp;quot;&amp;quot;, &amp;quot;BENÖTIGT&amp;quot;);&lt;br /&gt;
  needs.forEach(function (i) { L.push(&amp;quot;- &amp;quot; + i.t + (i.u ? &amp;quot;  &amp;quot; + i.u : &amp;quot;&amp;quot;)); });&lt;br /&gt;
  if (opt.length) { L.push(&amp;quot;&amp;quot;, &amp;quot;ZUSATZOPTIONEN&amp;quot;); opt.forEach(function (i) { L.push(&amp;quot;- &amp;quot; + i.t + (i.u ? &amp;quot;  &amp;quot; + i.u : &amp;quot;&amp;quot;)); }); }&lt;br /&gt;
  L.push(&amp;quot;&amp;quot;, &amp;quot;Radios: &amp;quot; + ru);&lt;br /&gt;
  summary = L.join(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  cartBlock(needs, opt);&lt;br /&gt;
}&lt;br /&gt;
function update() { renderFields(); renderOpts(); renderResult(); }&lt;br /&gt;
function newCaptcha() {&lt;br /&gt;
  capA = 1 + Math.floor(Math.random() * 9); capB = 1 + Math.floor(Math.random() * 9);&lt;br /&gt;
  $(&amp;quot;nvk-capq&amp;quot;).textContent = &amp;quot;Sicherheitsfrage: Was ist &amp;quot; + capA + &amp;quot; + &amp;quot; + capB + &amp;quot;? *&amp;quot;; $(&amp;quot;nvk-cap&amp;quot;).value = &amp;quot;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
function status(msg, ok) { var e = $(&amp;quot;nvk-status&amp;quot;); e.style.display = &amp;quot;&amp;quot;; e.textContent = msg; e.style.borderLeftColor = ok ? &amp;quot;#14866d&amp;quot; : &amp;quot;#d33&amp;quot;; }&lt;br /&gt;
$(&amp;quot;nvk-send&amp;quot;).addEventListener(&amp;quot;click&amp;quot;, function () {&lt;br /&gt;
  var name = $(&amp;quot;nvk-name&amp;quot;).value.trim(), mail = $(&amp;quot;nvk-mail&amp;quot;).value.trim(), vin = $(&amp;quot;nvk-vin&amp;quot;).value.trim().toUpperCase(), msg = $(&amp;quot;nvk-msg&amp;quot;).value.trim();&lt;br /&gt;
  if (!name || !mail || !msg) return status(&amp;quot;Bitte Name, E-Mail und Kommentar ausfüllen.&amp;quot;, false);&lt;br /&gt;
  if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(mail)) return status(&amp;quot;Bitte eine gültige E-Mail-Adresse eingeben.&amp;quot;, false);&lt;br /&gt;
  if (vin) { if (!/^[A-Z]{2}[0-9]{5}$/.test(vin)) { if (!/^[A-HJ-NPR-Z0-9]{17}$/.test(vin)) return status(&amp;quot;Bitte die VIN im Format AB12345 oder die 17-stellige FGN eingeben - oder das Feld leer lassen.&amp;quot;, false); } }&lt;br /&gt;
  if (parseInt($(&amp;quot;nvk-cap&amp;quot;).value, 10) !== capA + capB) return status(&amp;quot;Die Sicherheitsfrage wurde nicht richtig beantwortet.&amp;quot;, false);&lt;br /&gt;
  if (!$(&amp;quot;nvk-dsgvo&amp;quot;).checked) return status(&amp;quot;Bitte der Verarbeitung Deiner Daten zustimmen.&amp;quot;, false);&lt;br /&gt;
  if ($(&amp;quot;nvk-hp&amp;quot;).value) return;&lt;br /&gt;
  var sz = $(&amp;quot;nvk-size&amp;quot;).value;&lt;br /&gt;
  var rad = chosenRadio ? &amp;quot;\n\nGEWÄHLTES RADIO\n- &amp;quot; + chosenRadio.type + &amp;quot;  &amp;quot; + chosenRadio.url : &amp;quot;&amp;quot;;&lt;br /&gt;
  var sum2 = summary + rad + (sz ? &amp;quot;\n\nGewünschte Displaygröße: &amp;quot; + sz : &amp;quot;&amp;quot;);&lt;br /&gt;
  var text = &amp;quot;Name: &amp;quot; + name + &amp;quot;\nE-Mail: &amp;quot; + mail + &amp;quot;\nVIN: &amp;quot; + (vin || &amp;quot;-&amp;quot;) + &amp;quot;\n\nKommentar:\n&amp;quot; + msg + &amp;quot;\n\n&amp;quot; + sum2;&lt;br /&gt;
  if (SEND_URL) {&lt;br /&gt;
    var p = new URLSearchParams();&lt;br /&gt;
    p.append(&amp;quot;name&amp;quot;, name); p.append(&amp;quot;mail&amp;quot;, mail); p.append(&amp;quot;vin&amp;quot;, vin); p.append(&amp;quot;msg&amp;quot;, msg); p.append(&amp;quot;summary&amp;quot;, sum2);&lt;br /&gt;
    p.append(&amp;quot;hp&amp;quot;, $(&amp;quot;nvk-hp&amp;quot;).value); p.append(&amp;quot;ca&amp;quot;, capA); p.append(&amp;quot;cb&amp;quot;, capB); p.append(&amp;quot;cv&amp;quot;, $(&amp;quot;nvk-cap&amp;quot;).value);&lt;br /&gt;
    fetch(SEND_URL, { method: &amp;quot;POST&amp;quot;, body: p }).then(function (r) {&lt;br /&gt;
      if (!r.ok) throw new Error(&amp;quot;send&amp;quot;);&lt;br /&gt;
      status(&amp;quot;Danke! Deine Anfrage wurde gesendet, eine Kopie geht an &amp;quot; + mail + &amp;quot;.&amp;quot;, true); newCaptcha();&lt;br /&gt;
    }).catch(function () { status(&amp;quot;Das Senden hat nicht geklappt. Bitte versuche es später noch einmal oder schreibe direkt an &amp;quot; + MAIL_TO + &amp;quot;.&amp;quot;, false); });&lt;br /&gt;
  } else {&lt;br /&gt;
    var AMP = &amp;quot;\u0026&amp;quot;;&lt;br /&gt;
    window.location.href = &amp;quot;mailto:&amp;quot; + MAIL_TO + &amp;quot;?cc=&amp;quot; + encodeURIComponent(mail) + AMP + &amp;quot;subject=&amp;quot; + encodeURIComponent(MAIL_SUBJECT) + AMP + &amp;quot;body=&amp;quot; + encodeURIComponent(text);&lt;br /&gt;
    status(&amp;quot;Dein E-Mail-Programm wurde mit der fertigen Anfrage geöffnet. Bitte dort noch auf Senden klicken.&amp;quot;, true);&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
$(&amp;quot;nvk-reset&amp;quot;).addEventListener(&amp;quot;click&amp;quot;, function () { sel = {}; picked = {}; chosenRadio = null; update(); });&lt;br /&gt;
var legalEl = $(&amp;quot;nvk-legal-links&amp;quot;), firstLink = true;&lt;br /&gt;
[ [&amp;quot;agb&amp;quot;, &amp;quot;AGB&amp;quot;], [&amp;quot;widerruf&amp;quot;, &amp;quot;Widerrufsbelehrung&amp;quot;], [&amp;quot;datenschutz&amp;quot;, &amp;quot;Datenschutzerklärung&amp;quot;] ].forEach(function (x) {&lt;br /&gt;
  var key = x[0];&lt;br /&gt;
  if (!LEGAL[key]) return;&lt;br /&gt;
  if (!firstLink) legalEl.appendChild(document.createTextNode(&amp;quot; | &amp;quot;));&lt;br /&gt;
  firstLink = false; legalEl.appendChild(link(LEGAL[key], x[1]));&lt;br /&gt;
});&lt;br /&gt;
if (LEGAL.datenschutz) {&lt;br /&gt;
  var dl = $(&amp;quot;nvk-dslink&amp;quot;);&lt;br /&gt;
  dl.appendChild(document.createTextNode(&amp;quot; (&amp;quot;)); dl.appendChild(link(LEGAL.datenschutz, &amp;quot;Datenschutzerklärung&amp;quot;)); dl.appendChild(document.createTextNode(&amp;quot;)&amp;quot;));&lt;br /&gt;
}&lt;br /&gt;
newCaptcha();&lt;br /&gt;
update();&lt;br /&gt;
})();&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;Stand: 21.10.2026&amp;lt;/small&amp;gt;&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andre</name></author>
	</entry>
	<entry>
		<id>https://xtrons.ibus-app.de/index.php?title=Android_Radio_Konfigurator&amp;diff=4090</id>
		<title>Android Radio Konfigurator</title>
		<link rel="alternate" type="text/html" href="https://xtrons.ibus-app.de/index.php?title=Android_Radio_Konfigurator&amp;diff=4090"/>
		<updated>2026-10-22T04:26:20Z</updated>

		<summary type="html">&lt;p&gt;Andre: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt; '''Mit diesem Tool kann auf Basis von Fahrzeug und vorhandenen Komponenten eine Liste nötiger Komponenten erstellt werden.&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;big&amp;gt;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.&amp;lt;br&amp;gt;'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
#nvk{max-width:900px;line-height:1.45}&lt;br /&gt;
#nvk *{box-sizing:border-box}&lt;br /&gt;
#nvk .nvk-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:14px;margin:12px 0}&lt;br /&gt;
#nvk .nvk-f label{display:block;font-weight:700;margin-bottom:4px}&lt;br /&gt;
#nvk select{width:100%;padding:9px 8px;font:inherit;color:#202122;background:#fff;border:1px solid #a2a9b1;border-radius:4px}&lt;br /&gt;
#nvk .nvk-help{font-size:.85em;opacity:.75;margin-top:3px}&lt;br /&gt;
#nvk fieldset{border:1px solid rgba(128,128,128,.45);border-radius:6px;padding:10px 14px;margin:14px 0}&lt;br /&gt;
#nvk legend{font-weight:700;padding:0 6px}&lt;br /&gt;
#nvk .nvk-o{display:block;padding:4px 0;cursor:pointer}&lt;br /&gt;
#nvk .nvk-o small{opacity:.7}&lt;br /&gt;
#nvk .nvk-o.dis{opacity:.75;cursor:default}&lt;br /&gt;
#nvk .nvk-btn{padding:7px 14px;font:inherit;border:1px solid #a2a9b1;border-radius:4px;background:#f8f9fa;color:#202122;cursor:pointer}&lt;br /&gt;
#nvk #nvk-out{margin-top:18px}&lt;br /&gt;
#nvk h3{margin:18px 0 8px}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-card.opt{border-left-color:#14866d}&lt;br /&gt;
#nvk .nvk-card.rad{border-left-color:#fff;background:rgba(255,255,255,.08)}&lt;br /&gt;
#nvk .nvk-card b{display:block}&lt;br /&gt;
#nvk .nvk-links{margin-top:4px;font-weight:600}&lt;br /&gt;
#nvk .nvk-links a{margin-right:14px}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-miss{opacity:.8;font-style:italic}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-card .nvk-img{max-width:230px;max-height:150px}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-card.hl{border:2px solid #36c;border-left-width:8px;background:rgba(51,102,204,.12);padding:12px 14px}&lt;br /&gt;
#nvk .nvk-card.hl b{font-size:1.1em}&lt;br /&gt;
#nvk .nvk-img.wide{max-width:min(100%,460px);max-height:none}&lt;br /&gt;
#nvk #nvk-form{margin-top:22px}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-grid&amp;quot; id=&amp;quot;nvk-fields&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;fieldset id=&amp;quot;nvk-optset&amp;quot;&amp;gt;&amp;lt;legend&amp;gt;Zusatzoptionen&amp;lt;/legend&amp;gt;&amp;lt;div id=&amp;quot;nvk-opts&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/fieldset&amp;gt;&lt;br /&gt;
&amp;lt;button type=&amp;quot;button&amp;quot; class=&amp;quot;nvk-btn&amp;quot; id=&amp;quot;nvk-reset&amp;quot;&amp;gt;Auswahl zurücksetzen&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk-out&amp;quot; aria-live=&amp;quot;polite&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;fieldset id=&amp;quot;nvk-form&amp;quot; style=&amp;quot;display:none&amp;quot;&amp;gt;&amp;lt;legend&amp;gt;Anfrage senden&amp;lt;/legend&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;nvk-help&amp;quot;&amp;gt;Deine Auswahl und die Liste oben werden automatisch mitgesendet. Alle Felder mit * sind Pflicht.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-grid&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-name&amp;quot;&amp;gt;Name *&amp;lt;/label&amp;gt;&amp;lt;input id=&amp;quot;nvk-name&amp;quot; type=&amp;quot;text&amp;quot; autocomplete=&amp;quot;name&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-mail&amp;quot;&amp;gt;E-Mail *&amp;lt;/label&amp;gt;&amp;lt;input id=&amp;quot;nvk-mail&amp;quot; type=&amp;quot;email&amp;quot; autocomplete=&amp;quot;email&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-size&amp;quot;&amp;gt;Gewünschte Displaygröße (optional)&amp;lt;/label&amp;gt;&amp;lt;select id=&amp;quot;nvk-size&amp;quot;&amp;gt;&amp;lt;option value=&amp;quot;&amp;quot;&amp;gt;Keine Angabe / Beratung gewünscht&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;7&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;8.8&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;9&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;10.25&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;12.3&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;14.9&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;Andere Größe (bitte im Kommentar nennen)&amp;lt;/option&amp;gt;&amp;lt;/select&amp;gt;&amp;lt;div class=&amp;quot;nvk-help&amp;quot;&amp;gt;Diagonale in Zoll. Nicht jede Größe gibt es für jede Baureihe, das prüfen wir für Dich.&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-vin&amp;quot;&amp;gt;VIN oder FGN (optional)&amp;lt;/label&amp;gt;&amp;lt;input id=&amp;quot;nvk-vin&amp;quot; type=&amp;quot;text&amp;quot; maxlength=&amp;quot;17&amp;quot; placeholder=&amp;quot;AB12345 oder 17-stellige FGN&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-msg&amp;quot;&amp;gt;Kommentar *&amp;lt;/label&amp;gt;&amp;lt;textarea id=&amp;quot;nvk-msg&amp;quot; rows=&amp;quot;4&amp;quot;&amp;gt;&amp;lt;/textarea&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot; style=&amp;quot;max-width:300px&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-cap&amp;quot; id=&amp;quot;nvk-capq&amp;quot;&amp;gt;Sicherheitsfrage *&amp;lt;/label&amp;gt;&amp;lt;input id=&amp;quot;nvk-cap&amp;quot; type=&amp;quot;text&amp;quot; inputmode=&amp;quot;numeric&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;input id=&amp;quot;nvk-hp&amp;quot; type=&amp;quot;text&amp;quot; tabindex=&amp;quot;-1&amp;quot; autocomplete=&amp;quot;off&amp;quot; aria-hidden=&amp;quot;true&amp;quot; style=&amp;quot;position:absolute;left:-9999px;width:1px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;label class=&amp;quot;nvk-o&amp;quot;&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; id=&amp;quot;nvk-dsgvo&amp;quot;&amp;gt; Ich stimme zu, dass meine Angaben zur Bearbeitung der Anfrage per E-Mail verarbeitet werden. *&amp;lt;/label&amp;gt;&lt;br /&gt;
&amp;lt;button type=&amp;quot;button&amp;quot; class=&amp;quot;nvk-btn&amp;quot; id=&amp;quot;nvk-send&amp;quot;&amp;gt;Anfrage senden&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk-status&amp;quot; class=&amp;quot;nvk-note&amp;quot; style=&amp;quot;display:none&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/fieldset&amp;gt;&lt;br /&gt;
&amp;lt;noscript&amp;gt;Für den Konfigurator wird JavaScript benötigt.&amp;lt;/noscript&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
(function () {&lt;br /&gt;
&amp;quot;use strict&amp;quot;;&lt;br /&gt;
/* =====================================================================&lt;br /&gt;
   KONFIGURATION - hier wird gepflegt.&lt;br /&gt;
   Textformat in Hinweisen: [b]fett[/b]  [br] Zeilenumbruch  [a=URL]Linktext[/a]&lt;br /&gt;
   Bitte im Skript KEIN kaufmännisches Und, kein Kleiner-/Größer-Zeichen&lt;br /&gt;
   und keine Leerzeilen verwenden (das Wiki wandelt sie um).&lt;br /&gt;
   ===================================================================== */&lt;br /&gt;
var SHOP = &amp;quot;https://shop.ibus-app.de/&amp;quot;;&lt;br /&gt;
var WIKI = &amp;quot;https://wiki.ibus-app.de/index.php?title=&amp;quot;;&lt;br /&gt;
/* Bilder aus dem Wiki (Thumbnail-Adressen; Klick öffnet automatisch das Originalbild) */&lt;br /&gt;
var IM = &amp;quot;https://xtrons.ibus-app.de/images/thumb/&amp;quot;;&lt;br /&gt;
var P = {&lt;br /&gt;
  schema:  IM + &amp;quot;e/ea/BMW_E39_Verl%C3%A4ngerungen_EXL005%2BFAKRA_.png/135px-BMW_E39_Verl%C3%A4ngerungen_EXL005%2BFAKRA_.png&amp;quot;,&lt;br /&gt;
  exl005:  IM + &amp;quot;7/70/Exl005-1.webp/257px-Exl005-1.webp.png&amp;quot;,&lt;br /&gt;
  fakra6m: IM + &amp;quot;d/d8/FM-extension_01_1.png/270px-FM-extension_01_1.png&amp;quot;,&lt;br /&gt;
  isofakra: IM + &amp;quot;4/4e/ISO-FAKRA_1.png/270px-ISO-FAKRA_1.png&amp;quot;,&lt;br /&gt;
  bm24:    IM + &amp;quot;8/82/BM24.png/130px-BM24.png&amp;quot;,&lt;br /&gt;
  iso:     IM + &amp;quot;d/dd/Iso.jpg/69px-Iso.jpg&amp;quot;,&lt;br /&gt;
  bm54:    IM + &amp;quot;3/34/BM54.png/135px-BM54.png&amp;quot;,&lt;br /&gt;
  fakra:   IM + &amp;quot;b/b3/Fakra.jpg/100px-Fakra.jpg&amp;quot;,&lt;br /&gt;
  pfeil:   IM + &amp;quot;e/ee/Navi_E46.jpg/239px-Navi_E46.jpg&amp;quot;,&lt;br /&gt;
  noquad:  IM + &amp;quot;6/68/No_elongation.jpg/180px-No_elongation.jpg&amp;quot;,&lt;br /&gt;
  noexl6:  IM + &amp;quot;7/7b/No_EXL006.jpg/180px-No_EXL006.jpg&amp;quot;,&lt;br /&gt;
  halter:  IM + &amp;quot;3/3b/Halter_Alu.webp/92px-Halter_Alu.webp.png&amp;quot;,&lt;br /&gt;
  deepobd: &amp;quot;https://xtrons.ibus-app.de/images/d/d4/DeepOBD_Interface_1.png&amp;quot;,&lt;br /&gt;
  n43:     IM + &amp;quot;e/e4/Navi4_3.jpg/240px-Navi4_3.jpg&amp;quot;,&lt;br /&gt;
  n169:    IM + &amp;quot;8/8a/Navi16_9.jpg/240px-Navi16_9.jpg&amp;quot;,&lt;br /&gt;
  radio:   IM + &amp;quot;9/96/E39_Radio.jpg/240px-E39_Radio.jpg&amp;quot;,&lt;br /&gt;
  idrive:  &amp;quot;https://xtrons.ibus-app.de/images/0/02/MASK-CCC-CIC-NBT-EVO-iDrive.jpg&amp;quot;,&lt;br /&gt;
  iris:    &amp;quot;https://xtrons.ibus-app.de/images/b/be/BusinessKas_IRISG.jpg&amp;quot;,&lt;br /&gt;
  resler:  &amp;quot;https://xtrons.ibus-app.de/images/d/d1/Resler_Modul_01.png&amp;quot;,&lt;br /&gt;
  can:     &amp;quot;https://xtrons.ibus-app.de/images/6/69/CAN_Interface.png&amp;quot;,&lt;br /&gt;
  funktr:  IM + &amp;quot;7/7e/E46_Funktionstraeger.png/240px-E46_Funktionstraeger.png&amp;quot;&lt;br /&gt;
};&lt;br /&gt;
/* Anfrage-Formular: MAIL_TO = Empfänger. SEND_URL leer = E-Mail-Programm des Kunden öffnen (mailto).&lt;br /&gt;
   SEND_URL = Adresse des Server-Skripts send-anfrage.php = Versand direkt vom Server (mit CC an den Kunden). */&lt;br /&gt;
var MAIL_TO = &amp;quot;info@ibus-app.de&amp;quot;;&lt;br /&gt;
var MAIL_SUBJECT = &amp;quot;Anfrage aus Android Radio Konfigurator&amp;quot;;&lt;br /&gt;
var SEND_URL = &amp;quot;https://xtrons.ibus-app.de/send-anfrage.php&amp;quot;;&lt;br /&gt;
/* Shop-Anbindung: API = radios.php (liefert Radio-Liste und Artikelnummern). Warenkorb = Shopware-Link pro Artikelnummer. */&lt;br /&gt;
var API = &amp;quot;https://xtrons.ibus-app.de/radios.php&amp;quot;;&lt;br /&gt;
var CART_ADD = &amp;quot;https://shop.ibus-app.de/checkout/addArticle/sAdd/&amp;quot;;&lt;br /&gt;
var CART = &amp;quot;https://shop.ibus-app.de/checkout/cart&amp;quot;;&lt;br /&gt;
/* ---- 1) Baureihen --------------------------------------------------------&lt;br /&gt;
   v = Shop-Kategorie (Link: SHOP + bmw-radios/ + v + /)&lt;br /&gt;
   gen: alt = I-BUS-Fahrzeuge (E38/E39/E46/E53/E83)&lt;br /&gt;
        b   = M-ASK / CCC / CIC     c = CIC / NBT / NBT EVO&lt;br /&gt;
   body = Karosserieformen (siehe BODY)                                      */&lt;br /&gt;
var BODY = { limo: &amp;quot;Limousine&amp;quot;, touring: &amp;quot;Touring&amp;quot;, coupe: &amp;quot;Coupé&amp;quot;, cabrio: &amp;quot;Cabrio&amp;quot;, schraeg: &amp;quot;Schrägheck&amp;quot;,&lt;br /&gt;
  compact: &amp;quot;Compact&amp;quot;, gt: &amp;quot;Gran Turismo&amp;quot;, gc: &amp;quot;Gran Coupé&amp;quot;, suv: &amp;quot;SUV / SAV&amp;quot;, roadster: &amp;quot;Roadster&amp;quot; };&lt;br /&gt;
var VEHICLES = [&lt;br /&gt;
  { v: &amp;quot;1er-e8x&amp;quot;, t: &amp;quot;1er E8x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;schraeg,coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;1er-f2x&amp;quot;, t: &amp;quot;1er F2x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;schraeg&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;2er-f2x&amp;quot;, t: &amp;quot;2er F2x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;3er-e46&amp;quot;, t: &amp;quot;3er E46&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;limo,touring,coupe,cabrio,compact&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;3er-e9x&amp;quot;, t: &amp;quot;3er E9x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;limo,touring,coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;3er-f3x&amp;quot;, t: &amp;quot;3er F3x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;limo,touring,gt&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;4er-f3x&amp;quot;, t: &amp;quot;4er F3x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;coupe,cabrio,gc&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;5er-e39&amp;quot;, t: &amp;quot;5er E39&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;limo,touring&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;5er-e6x&amp;quot;, t: &amp;quot;5er E6x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;limo,touring&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;5er-f1x&amp;quot;, t: &amp;quot;5er F1x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;limo,touring,gt&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;6er-e6x&amp;quot;, t: &amp;quot;6er E6x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;7er-e38&amp;quot;, t: &amp;quot;7er E38&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;limo&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;7er-e65&amp;quot;, t: &amp;quot;7er E65&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;limo&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;7er-f01&amp;quot;, t: &amp;quot;7er F01&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;limo&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x1-e84&amp;quot;, t: &amp;quot;X1 E84&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x1-f48&amp;quot;, t: &amp;quot;X1 F48&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x3-e83&amp;quot;, t: &amp;quot;X3 E83&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x3-f25&amp;quot;, t: &amp;quot;X3 F25&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x5-e53&amp;quot;, t: &amp;quot;X5 E53&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x5-e70&amp;quot;, t: &amp;quot;X5 E70&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x5-f15&amp;quot;, t: &amp;quot;X5 F15&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x6-e71&amp;quot;, t: &amp;quot;X6 E71&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;z4-e85e86&amp;quot;, t: &amp;quot;Z4 E85/E86&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;roadster,coupe&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;z4-e89&amp;quot;, t: &amp;quot;Z4 E89&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;roadster&amp;quot;, noCat: true }&lt;br /&gt;
];&lt;br /&gt;
/* Fahrzeuge mit K-CAN App (Beta) */&lt;br /&gt;
var KCAN = [&amp;quot;1er-e8x&amp;quot;, &amp;quot;3er-e9x&amp;quot;, &amp;quot;5er-e6x&amp;quot;, &amp;quot;6er-e6x&amp;quot;, &amp;quot;7er-e65&amp;quot;, &amp;quot;x1-e84&amp;quot;, &amp;quot;x5-e70&amp;quot;, &amp;quot;x6-e71&amp;quot;, &amp;quot;z4-e89&amp;quot;];&lt;br /&gt;
var bodyValues = Object.keys(BODY).map(function (k) {&lt;br /&gt;
  return { v: k, t: BODY[k], only: { vehicle: VEHICLES.filter(function (x) { return x.body.split(&amp;quot;,&amp;quot;).indexOf(k) !== -1; }).map(function (x) { return x.v; }) } };&lt;br /&gt;
});&lt;br /&gt;
/* ---- 2) Auswahlfelder ------------------------------------------------------&lt;br /&gt;
   only = Wert nur anbieten, wenn Bedingung passt   show = Feld nur dann zeigen&lt;br /&gt;
   optional = muss nicht gewählt werden             auto = bei nur einem Wert vorwählen */&lt;br /&gt;
var FIELDS = [&lt;br /&gt;
  { id: &amp;quot;vehicle&amp;quot;, label: &amp;quot;Fahrzeug&amp;quot;, values: VEHICLES.map(function (x) { return { v: x.v, t: &amp;quot;BMW &amp;quot; + x.t }; }) },&lt;br /&gt;
  { id: &amp;quot;factory&amp;quot;, label: &amp;quot;Verbaut ab Werk&amp;quot;, pre: { when: { gen: [&amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;] }, html: &amp;quot;[b]So erkennst Du Dein System:[/b][br][imgw=&amp;quot; + P.idrive + &amp;quot;]&amp;quot; }, values: [&lt;br /&gt;
    { v: &amp;quot;iris&amp;quot;,  t: &amp;quot;Radio mit IRIS&amp;quot;, only: { vehicle: [&amp;quot;3er-e46&amp;quot;, &amp;quot;5er-e39&amp;quot;, &amp;quot;7er-e38&amp;quot;, &amp;quot;x5-e53&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.iris + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;mid&amp;quot;,   t: &amp;quot;Radio mit MID&amp;quot;,  only: { gen: [&amp;quot;alt&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.radio + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;n43&amp;quot;,   t: &amp;quot;4:3 Navi&amp;quot;,       only: { vehicle: [&amp;quot;5er-e39&amp;quot;, &amp;quot;7er-e38&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.n43 + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;n169&amp;quot;,  t: &amp;quot;16:9 Navi&amp;quot;,      only: { gen: [&amp;quot;alt&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.n169 + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;pfeil&amp;quot;, t: &amp;quot;Pfeilnavi&amp;quot;,      only: { vehicle: [&amp;quot;3er-e46&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.pfeil + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;mask&amp;quot;,  t: &amp;quot;M-ASK&amp;quot;,          only: { gen: [&amp;quot;b&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;ccc&amp;quot;,   t: &amp;quot;CCC&amp;quot;,            only: { gen: [&amp;quot;b&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;cic&amp;quot;,   t: &amp;quot;CIC&amp;quot;,            only: { gen: [&amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;nbt&amp;quot;,   t: &amp;quot;NBT&amp;quot;,            only: { gen: [&amp;quot;c&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;nbtevo&amp;quot;, t: &amp;quot;NBT EVO&amp;quot;,       only: { gen: [&amp;quot;c&amp;quot;] } } ] },&lt;br /&gt;
  { id: &amp;quot;trunk&amp;quot;, label: &amp;quot;Wo sitzt das Radiomodul des Pfeilnavis?&amp;quot;, optional: true, show: { factory: [&amp;quot;pfeil&amp;quot;] },&lt;br /&gt;
    help: &amp;quot;Bitte prüfen: Sitzt das Modul im Kofferraum, oder im Pfeilnavi selbst (Quadlock hinten neben dem Antennenstecker)?[br][img=&amp;quot; + P.pfeil + &amp;quot;]&amp;quot;,&lt;br /&gt;
    values: [&lt;br /&gt;
    { v: &amp;quot;ja&amp;quot;, t: &amp;quot;Im Kofferraum (Verlängerungen nötig)&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;nein&amp;quot;, t: &amp;quot;Im Pfeilnavi, Quadlock hinten (keine Verlängerung)&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;unk&amp;quot;, t: &amp;quot;Weiß ich nicht&amp;quot; } ] },&lt;br /&gt;
  { id: &amp;quot;aux&amp;quot;, label: &amp;quot;AUX-IN verfügbar?&amp;quot;, show: { gen: [&amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;] }, values: [&lt;br /&gt;
    { v: &amp;quot;ja&amp;quot;, t: &amp;quot;Ja&amp;quot; }, { v: &amp;quot;nein&amp;quot;, t: &amp;quot;Nein&amp;quot; } ] },&lt;br /&gt;
  { id: &amp;quot;sound&amp;quot;, label: &amp;quot;Soundsystem&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;stereo&amp;quot;, t: &amp;quot;Stereo&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;hifi&amp;quot;,   t: &amp;quot;Hifi&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;dsp&amp;quot;,    t: &amp;quot;DSP&amp;quot;, only: { vehicle: [&amp;quot;7er-e38&amp;quot;, &amp;quot;5er-e39&amp;quot;, &amp;quot;x5-e53&amp;quot;, &amp;quot;x3-e83&amp;quot;] }, info: &amp;quot;[a=&amp;quot; + WIKI + &amp;quot;Habe_ich_DSP%3F]Habe ich DSP?[/a]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;hk&amp;quot;,     t: &amp;quot;Harman Kardon&amp;quot;, only: { vehicle: [&amp;quot;3er-e46&amp;quot;, &amp;quot;z4-e85e86&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;logic7&amp;quot;, t: &amp;quot;Logic7&amp;quot;, only: { vehicle: [&amp;quot;3er-e9x&amp;quot;, &amp;quot;5er-e6x&amp;quot;, &amp;quot;6er-e6x&amp;quot;, &amp;quot;7er-e65&amp;quot;, &amp;quot;1er-e8x&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;hksur&amp;quot;,  t: &amp;quot;Harman Kardon Surround&amp;quot;, only: { vehicle: [&amp;quot;1er-f2x&amp;quot;, &amp;quot;2er-f2x&amp;quot;, &amp;quot;3er-f3x&amp;quot;, &amp;quot;4er-f3x&amp;quot;, &amp;quot;5er-f1x&amp;quot;] } } ] },&lt;br /&gt;
  { id: &amp;quot;current&amp;quot;, label: &amp;quot;Aktuell verbaut&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;werk&amp;quot;, t: &amp;quot;Werksradio / Werksnavi&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;nach&amp;quot;, t: &amp;quot;Nachrüst-Radio / -Navi&amp;quot; } ] },&lt;br /&gt;
  { id: &amp;quot;body&amp;quot;, label: &amp;quot;Karosserie&amp;quot;, auto: true, values: bodyValues },&lt;br /&gt;
  { id: &amp;quot;ant&amp;quot;, label: &amp;quot;Antennenstecker am Radio (optional)&amp;quot;, optional: true, def: &amp;quot;unk&amp;quot;,&lt;br /&gt;
    show: { vehicle: [&amp;quot;7er-e38&amp;quot;, &amp;quot;5er-e39&amp;quot;, &amp;quot;3er-e46&amp;quot;, &amp;quot;x5-e53&amp;quot;] },&lt;br /&gt;
    values: [&lt;br /&gt;
    { v: &amp;quot;unk&amp;quot;,   t: &amp;quot;Weiß ich nicht&amp;quot;, info: &amp;quot;[b]BM24[/b] (Rundpin) = ISO-Antennenstecker:[br][img=&amp;quot; + P.bm24 + &amp;quot;][img=&amp;quot; + P.iso + &amp;quot;][br][b]BM54[/b] = FAKRA:[br][img=&amp;quot; + P.bm54 + &amp;quot;][img=&amp;quot; + P.fakra + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;iso&amp;quot;,   t: &amp;quot;ISO (BM24, Rundpin)&amp;quot;, info: &amp;quot;[img=&amp;quot; + P.bm24 + &amp;quot;][img=&amp;quot; + P.iso + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;fakra&amp;quot;, t: &amp;quot;FAKRA (BM54)&amp;quot;, info: &amp;quot;[img=&amp;quot; + P.bm54 + &amp;quot;][img=&amp;quot; + P.fakra + &amp;quot;]&amp;quot; } ] }&lt;br /&gt;
];&lt;br /&gt;
/* ---- 3) Zusatzoptionen (Mehrfachauswahl) ---------------------------------&lt;br /&gt;
   show = nur sichtbar wenn Bedingung passt   requires = nur sichtbar wenn diese Optionen gewählt sind&lt;br /&gt;
   excl = Optionen derselben Gruppe schließen sich aus   items = Artikel aus ITEMS */&lt;br /&gt;
var OPTS = [&lt;br /&gt;
  { id: &amp;quot;halter&amp;quot;,  t: &amp;quot;Radio-Halter&amp;quot;, sub: &amp;quot;nur BMW E39&amp;quot;, show: { vehicle: [&amp;quot;5er-e39&amp;quot;] }, items: [&amp;quot;halter&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;ibus&amp;quot;,    t: &amp;quot;I-BUS App&amp;quot;, show: { gen: [&amp;quot;alt&amp;quot;] }, items: [&amp;quot;ibus&amp;quot;, &amp;quot;resler&amp;quot;, &amp;quot;bclic&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;deepobd&amp;quot;, t: &amp;quot;DeepOBD (Diagnose)&amp;quot;, items: [&amp;quot;deepobd&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;can&amp;quot;,     t: &amp;quot;CAN Interface&amp;quot;, sub: &amp;quot;Addon - nur mit I-BUS App&amp;quot;, show: { gen: [&amp;quot;alt&amp;quot;] }, requires: [&amp;quot;ibus&amp;quot;], items: [&amp;quot;can&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;kcan&amp;quot;,    t: &amp;quot;K-CAN App (Beta)&amp;quot;, sub: &amp;quot;Pendant zur I-BUS App&amp;quot;, show: { vehicle: KCAN }, items: [&amp;quot;kcan&amp;quot;, &amp;quot;kcanlic&amp;quot;, &amp;quot;can&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;tpms&amp;quot;,    t: &amp;quot;TPMS (Reifendruck)&amp;quot;, items: [&amp;quot;tpms&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;dab1&amp;quot;,    t: &amp;quot;DAB+ (Single Receiver)&amp;quot;, excl: &amp;quot;dab&amp;quot;, items: [&amp;quot;dab1&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;dab2&amp;quot;,    t: &amp;quot;DAB+ (Dual Receiver)&amp;quot;,   excl: &amp;quot;dab&amp;quot;, items: [&amp;quot;dab2&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;rcam&amp;quot;,    t: &amp;quot;Rückfahrkamera&amp;quot;, items: [&amp;quot;rcam&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;fcam&amp;quot;,    t: &amp;quot;Front-Kamera&amp;quot;, items: [&amp;quot;fcam&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;tool&amp;quot;,    t: &amp;quot;Einbau-Werkzeug (Kunststoffheber)&amp;quot;, items: [&amp;quot;tool&amp;quot;] }&lt;br /&gt;
];&lt;br /&gt;
/* Erzwungene Optionen (werden automatisch gesetzt und gesperrt) */&lt;br /&gt;
var FORCED = [&lt;br /&gt;
  { when: { sound: [&amp;quot;dsp&amp;quot;] }, opts: [&amp;quot;ibus&amp;quot;], why: &amp;quot;wegen DSP erforderlich&amp;quot; }&lt;br /&gt;
];&lt;br /&gt;
/* ---- 4) Artikel ------------------------------------------------------------&lt;br /&gt;
   u = Shop-Link (ut = Linktext)   w = Wiki-Link (wt = Linktext)   leer = kein Link&lt;br /&gt;
   skipIf = Artikel entfällt, wenn der genannte Artikel schon in der Liste steht */&lt;br /&gt;
var ITEMS = {&lt;br /&gt;
  exl005:  { t: &amp;quot;Verlängerung EXL005&amp;quot;, d: &amp;quot;Ersetzt das Radiomodul im Kofferraum.&amp;quot;, u: SHOP + &amp;quot;detail/index/sArticle/212/&amp;quot;, img: [P.exl005, P.schema] },&lt;br /&gt;
  fakra6m: { t: &amp;quot;Verlängerung 6 m FAKRA(m) auf FAKRA(f), gewinkelt&amp;quot;, d: &amp;quot;Antennenverlängerung vom Kofferraum nach vorn.&amp;quot;, img: [P.fakra6m],&lt;br /&gt;
             u: SHOP + &amp;quot;shop/zubehoer/adapterkabel/192/verlaengerung-6m-fakra-m-auf-fakra-f-kurz-gewinkelt&amp;quot; },&lt;br /&gt;
  isoada:  { t: &amp;quot;Adapter ISO-Stecker auf FAKRA, gewinkelt (15 cm)&amp;quot;, d: &amp;quot;Nötig bei ISO-Antennenstecker (BM24, Rundpin).&amp;quot;, img: [P.isofakra],&lt;br /&gt;
             u: SHOP + &amp;quot;shop/zubehoer/adapterkabel/193/adapter-kabel-iso-f-auf-fakra-f-kurz-gewinkelt-15cm&amp;quot; },&lt;br /&gt;
  bcdsp:   { t: &amp;quot;I-BUS App - BC+DSP Lizenz&amp;quot;, d: &amp;quot;Ohne DSP-Lizenz arbeitet das Werks-DSP nicht.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/lizenzen/171/i-bus-app-bc-dsp-lizenz&amp;quot;,&lt;br /&gt;
             w: WIKI + &amp;quot;Habe_ich_DSP%3F&amp;quot;, wt: &amp;quot;Wiki: Habe ich DSP?&amp;quot; },&lt;br /&gt;
  halter:  { t: &amp;quot;Alu-Halter zur Radio-Montage im BMW E39&amp;quot;, d: &amp;quot;Empfohlen bei Radios, die nicht von AVIN stammen.&amp;quot;, img: [P.halter],&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/radiohalter/185/alu-halter-zur-radio-montage-im-bmw-e39&amp;quot; },&lt;br /&gt;
  ibus:    { t: &amp;quot;I-BUS App&amp;quot;, hl: true,&lt;br /&gt;
             d: &amp;quot;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.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;cat/index/sCategory/42&amp;quot;,&lt;br /&gt;
             links: [&lt;br /&gt;
               { u: WIKI + &amp;quot;Was_brauche_ich_um_die_I-BUS_App_nutzen_zu_k%C3%B6nnen%3F&amp;quot;, t: &amp;quot;Wiki: Was brauche ich für die I-BUS App?&amp;quot; },&lt;br /&gt;
               { u: WIKI + &amp;quot;Funktionen&amp;quot;, t: &amp;quot;Liste aller I-BUS App Funktionen (BMW E38|E39|E46|E53|E83)&amp;quot; },&lt;br /&gt;
               { u: WIKI + &amp;quot;Was_geht_beim_BMW_E46_nicht&amp;quot;, t: &amp;quot;Was geht beim BMW E46, E83, E85,.. nicht? (da werkseitig nicht verbaut)&amp;quot; },&lt;br /&gt;
               { u: WIKI + &amp;quot;Funktionseinschr%C3%A4nkungen_nach_Baujahr/Ausstattung/Modell&amp;quot;, t: &amp;quot;Funktionseinschränkungen nach Baujahr/Ausstattung/Modell&amp;quot; } ] },&lt;br /&gt;
  resler:  { t: &amp;quot;Resler USB I-BUS Modul inkl. Anschlusskabel&amp;quot;, d: &amp;quot;Verbindet I-BUS App und Fahrzeug.&amp;quot;, img: [P.resler],&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/interfaces-module/191/resler-usb-i-bus-modul-inkl.-anschlusskabel&amp;quot;,&lt;br /&gt;
             w: &amp;quot;https://wiki.ibus-app.de/index.php?title=Hauptseite#Einbauanleitung_f.C3.BCr_Resler_Modul_und_Resler_Interface&amp;quot;, wt: &amp;quot;Einbauanleitung Resler Modul&amp;quot; },&lt;br /&gt;
  bclic:   { t: &amp;quot;I-BUS App - BC Lizenz&amp;quot;, d: &amp;quot;Schaltet u. a. die BC-Daten der App frei.&amp;quot;, skipIf: &amp;quot;bcdsp&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/lizenzen/167/i-bus-app-bc-lizenz&amp;quot; },&lt;br /&gt;
  deepobd: { t: &amp;quot;Deep OBD OBD-II Bluetooth-Adapter&amp;quot;, d: &amp;quot;Live-Werte auslesen, Fehler lesen und löschen.&amp;quot;, img: [P.deepobd],&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/interfaces-module/258/deep-obd-obd-ii-bluetooth-adapter?c=54&amp;quot;,&lt;br /&gt;
             w: &amp;quot;https://xtrons.ibus-app.de/index.php?title=DeepOBD_-_Adapter_und_App_einrichten&amp;quot;, wt: &amp;quot;Wiki: DeepOBD einrichten&amp;quot; },&lt;br /&gt;
  can:     { t: &amp;quot;CAN-Bus Interface inkl. Anschlusskabel&amp;quot;, d: &amp;quot;Addon, funktioniert nur zusammen mit der I-BUS App bzw. der K-CAN App.&amp;quot;, img: [P.can],&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/interfaces-module/346/can-bus-interface-inkl.-anschlusskabel&amp;quot;,&lt;br /&gt;
             w: WIKI + &amp;quot;Einbauanleitung_CAN-Bus_Interface&amp;quot;, wt: &amp;quot;Einbauanleitung CAN-Bus Interface&amp;quot; },&lt;br /&gt;
  kcan:    { t: &amp;quot;K-CAN App (Beta)&amp;quot;, d: &amp;quot;Pendant zur I-BUS App für Fahrzeuge mit K-CAN, aktuell als Betaversion.&amp;quot;,&lt;br /&gt;
             w: &amp;quot;https://wiki.kcan-app.de/&amp;quot;, wt: &amp;quot;Wiki zur K-CAN App&amp;quot; },&lt;br /&gt;
  kcanlic: { t: &amp;quot;K-CAN App - Lizenz Betaversion&amp;quot;, d: &amp;quot;Beta-Lizenz für die K-CAN App.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/lizenzen/358/k-can-app-lizenz-betaversion&amp;quot; },&lt;br /&gt;
  tpms:    { t: &amp;quot;TPMS - Reifendruckkontrolle&amp;quot;, d: &amp;quot;&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/tpms/&amp;quot; },&lt;br /&gt;
  dab1:    { t: &amp;quot;DAB+ Empfänger inkl. Antenne (Single)&amp;quot;, d: &amp;quot;&amp;quot;, w: &amp;quot;https://xtrons.ibus-app.de/index.php?title=Installation_der_DAB%2B_Antenne&amp;quot;, wt: &amp;quot;Installation der DAB+ Antenne&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/dab/291/dab-empfaenger-inkl.-antenne-usbdab04&amp;quot; },&lt;br /&gt;
  dab2:    { t: &amp;quot;Dual DAB+ Empfänger-Stick inkl. 2 Antennen&amp;quot;, d: &amp;quot;&amp;quot;, w: &amp;quot;https://xtrons.ibus-app.de/index.php?title=Installation_der_DAB%2B_Antenne&amp;quot;, wt: &amp;quot;Installation der DAB+ Antenne&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/dab/391/dual-dab-empfaenger-stick-inkl.-2-antennen-acusbdab05t?c=75&amp;quot; },&lt;br /&gt;
  rcam:    { t: &amp;quot;Rückfahrkamera&amp;quot;, d: &amp;quot;&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/kameras/&amp;quot;, ut: &amp;quot;Kameras im Shop ansehen →&amp;quot; },&lt;br /&gt;
  fcam:    { t: &amp;quot;Front-Kamera&amp;quot;, d: &amp;quot;&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/kameras/&amp;quot;, ut: &amp;quot;Kameras im Shop ansehen →&amp;quot; },&lt;br /&gt;
  tool:    { t: &amp;quot;Einbau-Werkzeug (Kunststoffheber)&amp;quot;, d: &amp;quot;Zum schonenden Lösen der Verkleidungen.&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/einbauwerkzeug/&amp;quot; }&lt;br /&gt;
};&lt;br /&gt;
/* ---- 5) Regeln --------------------------------------------------------------&lt;br /&gt;
   type: need (Das brauchst Du) oder hint (Hinweise)   when = Bedingung auf die Felder&lt;br /&gt;
   opts = diese Zusatzoptionen müssen gewählt sein      items = Artikel   html = Text&lt;br /&gt;
   Abgeleitete Werte: gen (alt/b/c) und module (ja/nein/unk = Radiomodul im Kofferraum, nur gen alt) */&lt;br /&gt;
var RULES = [&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { current: [&amp;quot;werk&amp;quot;], module: [&amp;quot;ja&amp;quot;] }, items: [&amp;quot;exl005&amp;quot;, &amp;quot;fakra6m&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { current: [&amp;quot;nach&amp;quot;], module: [&amp;quot;ja&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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=&amp;quot; + P.noquad + &amp;quot;][img=&amp;quot; + P.noexl6 + &amp;quot;]&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;ja&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;nein&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;unk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { ant: [&amp;quot;iso&amp;quot;] }, items: [&amp;quot;isoada&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { ant: [&amp;quot;unk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Antennenstecker:[/b] [b]BM24[/b] (Rundpin) = ISO-Antennenstecker, ggf. wird der [a=&amp;quot; + SHOP + &amp;quot;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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { sound: [&amp;quot;dsp&amp;quot;] }, items: [&amp;quot;bcdsp&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { sound: [&amp;quot;dsp&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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=&amp;quot; + WIKI + &amp;quot;Habe_ich_DSP%3F]Habe ich DSP?[/a]&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { sound: [&amp;quot;hk&amp;quot;], gen: [&amp;quot;alt&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Harman Kardon:[/b] Benötigt [b]keine[/b] DSP-Lizenz. Das Remote-Signal (+12 V, wenn Radio an) genügt zum Starten.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { aux: [&amp;quot;nein&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]AUX-IN:[/b] Der AUX-IN muss codiert werden. Optional kann ein FM-Transmitter genutzt werden - das ist nicht empfohlen.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;7er-e38&amp;quot;, &amp;quot;x5-e53&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Montage:[/b] Radios für BMW E38/E53 benötigen keine extra Halterungen.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;5er-e39&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;3er-e46&amp;quot;], factory: [&amp;quot;iris&amp;quot;, &amp;quot;mid&amp;quot;, &amp;quot;pfeil&amp;quot;], current: [&amp;quot;werk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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]&amp;quot; +&lt;br /&gt;
          &amp;quot;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]&amp;quot; +&lt;br /&gt;
          &amp;quot;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=&amp;quot; + P.funktr + &amp;quot;]&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { factory: [&amp;quot;cic&amp;quot;, &amp;quot;nbt&amp;quot;, &amp;quot;nbtevo&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Lichtleiter:[/b] Ggf. vorhandene Lichtleiter (MOST) müssen aus dem BMW-Stecker in den Xtrons-Adapter umgesteckt werden.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { factory: [&amp;quot;mask&amp;quot;, &amp;quot;ccc&amp;quot;, &amp;quot;cic&amp;quot;, &amp;quot;nbt&amp;quot;, &amp;quot;nbtevo&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, opts: [&amp;quot;kcan&amp;quot;], when: {},&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, opts: [&amp;quot;ibus&amp;quot;], when: {},&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: {},&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot; }&lt;br /&gt;
];&lt;br /&gt;
/* =====================================================================&lt;br /&gt;
   PROGRAMMLOGIK&lt;br /&gt;
   ===================================================================== */&lt;br /&gt;
var $ = function (id) { return document.getElementById(id); };&lt;br /&gt;
var sel = {}, picked = {}, summary = &amp;quot;&amp;quot;, capA = 0, capB = 0, radioCache = {}, chosenRadio = null;&lt;br /&gt;
var fieldsEl = $(&amp;quot;nvk-fields&amp;quot;), optsEl = $(&amp;quot;nvk-opts&amp;quot;), outEl = $(&amp;quot;nvk-out&amp;quot;);&lt;br /&gt;
function full(u) { return u.indexOf(&amp;quot;/thumb/&amp;quot;) === -1 ? u : u.replace(&amp;quot;/thumb/&amp;quot;, &amp;quot;/&amp;quot;).replace(/\/[^\/]+$/, &amp;quot;&amp;quot;); }&lt;br /&gt;
function fmt(t) {&lt;br /&gt;
  return t.replace(/\[imgw=([^\x5D]+)\]/g, function (m, u) {&lt;br /&gt;
    return &amp;quot;\u003Ca href=\&amp;quot;&amp;quot; + full(u) + &amp;quot;\&amp;quot; target=\&amp;quot;_blank\&amp;quot; rel=\&amp;quot;noopener\&amp;quot;\u003E\u003Cimg class=\&amp;quot;nvk-img wide\&amp;quot; src=\&amp;quot;&amp;quot; + u + &amp;quot;\&amp;quot; alt=\&amp;quot;\&amp;quot;\u003E\u003C/a\u003E&amp;quot;;&lt;br /&gt;
  }).replace(/\[img=([^\x5D]+)\]/g, function (m, u) {&lt;br /&gt;
    return &amp;quot;\u003Ca href=\&amp;quot;&amp;quot; + full(u) + &amp;quot;\&amp;quot; target=\&amp;quot;_blank\&amp;quot; rel=\&amp;quot;noopener\&amp;quot;\u003E\u003Cimg class=\&amp;quot;nvk-img\&amp;quot; src=\&amp;quot;&amp;quot; + u + &amp;quot;\&amp;quot; alt=\&amp;quot;\&amp;quot;\u003E\u003C/a\u003E&amp;quot;;&lt;br /&gt;
  }).replace(/\[b\]/g, &amp;quot;\u003Cb\u003E&amp;quot;).replace(/\[\/b\]/g, &amp;quot;\u003C/b\u003E&amp;quot;).replace(/\[br\]/g, &amp;quot;\u003Cbr\u003E&amp;quot;)&lt;br /&gt;
    .replace(/\[a=([^\x5D]+)\]/g, &amp;quot;\u003Ca href=\&amp;quot;$1\&amp;quot; target=\&amp;quot;_blank\&amp;quot; rel=\&amp;quot;noopener\&amp;quot;\u003E&amp;quot;).replace(/\[\/a\]/g, &amp;quot;\u003C/a\u003E&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
function match(cond, s, lenient) {&lt;br /&gt;
  if (!cond) return true;&lt;br /&gt;
  for (var k in cond) {&lt;br /&gt;
    if (!s[k]) { if (lenient) continue; return false; }&lt;br /&gt;
    if (cond[k].indexOf(s[k]) === -1) return false;&lt;br /&gt;
  }&lt;br /&gt;
  return true;&lt;br /&gt;
}&lt;br /&gt;
function vehicleOf(id) { return VEHICLES.filter(function (x) { return x.v === id; })[0]; }&lt;br /&gt;
function derive() {&lt;br /&gt;
  var s = {}, k;&lt;br /&gt;
  for (k in sel) s[k] = sel[k];&lt;br /&gt;
  var veh = vehicleOf(sel.vehicle);&lt;br /&gt;
  if (veh) s.gen = veh.gen;&lt;br /&gt;
  if (s.gen === &amp;quot;alt&amp;quot;) {&lt;br /&gt;
    if (s.factory === &amp;quot;n43&amp;quot; || s.factory === &amp;quot;n169&amp;quot;) s.module = &amp;quot;ja&amp;quot;;&lt;br /&gt;
    else if (s.factory === &amp;quot;iris&amp;quot; || s.factory === &amp;quot;mid&amp;quot;) s.module = &amp;quot;nein&amp;quot;;&lt;br /&gt;
    else if (s.factory === &amp;quot;pfeil&amp;quot;) s.module = s.trunk || &amp;quot;unk&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  return s;&lt;br /&gt;
}&lt;br /&gt;
function forced(s) {&lt;br /&gt;
  var f = {};&lt;br /&gt;
  FORCED.forEach(function (r) { if (match(r.when, s)) r.opts.forEach(function (o) { f[o] = r.why; }); });&lt;br /&gt;
  return f;&lt;br /&gt;
}&lt;br /&gt;
function onSet(s) {&lt;br /&gt;
  var f = forced(s), on = {}, k;&lt;br /&gt;
  for (k in picked) if (picked[k]) on[k] = true;&lt;br /&gt;
  for (k in f) on[k] = true;&lt;br /&gt;
  return { on: on, forced: f };&lt;br /&gt;
}&lt;br /&gt;
function optVisible(o, s, on) {&lt;br /&gt;
  if (!match(o.show, s, true)) return false;&lt;br /&gt;
  return (o.requires || []).every(function (r) { return on[r]; });&lt;br /&gt;
}&lt;br /&gt;
FIELDS.forEach(function (f) {&lt;br /&gt;
  var wrap = document.createElement(&amp;quot;div&amp;quot;); wrap.className = &amp;quot;nvk-f&amp;quot;; wrap.id = &amp;quot;nvk-w-&amp;quot; + f.id;&lt;br /&gt;
  var lab = document.createElement(&amp;quot;label&amp;quot;); lab.htmlFor = &amp;quot;nvk-&amp;quot; + f.id; lab.textContent = f.label;&lt;br /&gt;
  var s = document.createElement(&amp;quot;select&amp;quot;); s.id = &amp;quot;nvk-&amp;quot; + f.id;&lt;br /&gt;
  s.addEventListener(&amp;quot;change&amp;quot;, function () { sel[f.id] = s.value; update(); });&lt;br /&gt;
  wrap.appendChild(lab); wrap.appendChild(s);&lt;br /&gt;
  if (f.help) { var h = document.createElement(&amp;quot;div&amp;quot;); h.className = &amp;quot;nvk-help&amp;quot;; h.innerHTML = fmt(f.help); wrap.appendChild(h); }&lt;br /&gt;
  var inf = document.createElement(&amp;quot;div&amp;quot;); inf.id = &amp;quot;nvk-i-&amp;quot; + f.id; wrap.appendChild(inf);&lt;br /&gt;
  fieldsEl.appendChild(wrap);&lt;br /&gt;
});&lt;br /&gt;
function renderFields() {&lt;br /&gt;
  FIELDS.forEach(function (f) {&lt;br /&gt;
    var s = derive();&lt;br /&gt;
    var wrap = $(&amp;quot;nvk-w-&amp;quot; + f.id), el = $(&amp;quot;nvk-&amp;quot; + f.id);&lt;br /&gt;
    var vis = f.show ? match(f.show, s, false) : true;&lt;br /&gt;
    wrap.style.display = vis ? &amp;quot;&amp;quot; : &amp;quot;none&amp;quot;;&lt;br /&gt;
    if (!vis) { sel[f.id] = &amp;quot;&amp;quot;; return; }&lt;br /&gt;
    var allowed = f.values.filter(function (v) { return match(v.only, s, true); });&lt;br /&gt;
    if (sel[f.id]) { if (!allowed.some(function (v) { return v.v === sel[f.id]; })) sel[f.id] = &amp;quot;&amp;quot;; }&lt;br /&gt;
    if (!sel[f.id]) { if (f.def) sel[f.id] = f.def; }&lt;br /&gt;
    if (!sel[f.id]) { if (f.auto) { if (sel.vehicle) { if (allowed.length === 1) sel[f.id] = allowed[0].v; } } }&lt;br /&gt;
    el.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
    if (!f.def) { var p = document.createElement(&amp;quot;option&amp;quot;); p.value = &amp;quot;&amp;quot;; p.textContent = &amp;quot;– bitte wählen –&amp;quot;; el.appendChild(p); }&lt;br /&gt;
    allowed.forEach(function (v) {&lt;br /&gt;
      var o = document.createElement(&amp;quot;option&amp;quot;); o.value = v.v; o.textContent = v.t; el.appendChild(o);&lt;br /&gt;
    });&lt;br /&gt;
    el.value = sel[f.id] || &amp;quot;&amp;quot;;&lt;br /&gt;
    var cur = allowed.filter(function (v) { return v.v === sel[f.id]; })[0];&lt;br /&gt;
    var pre = f.pre ? (match(f.pre.when, s, false) ? fmt(f.pre.html) : &amp;quot;&amp;quot;) : &amp;quot;&amp;quot;;&lt;br /&gt;
    $(&amp;quot;nvk-i-&amp;quot; + f.id).innerHTML = pre + (cur ? (cur.info ? fmt(cur.info) : &amp;quot;&amp;quot;) : &amp;quot;&amp;quot;);&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
function renderOpts() {&lt;br /&gt;
  var s = derive(), st = onSet(s);&lt;br /&gt;
  OPTS.forEach(function (o) { if (!optVisible(o, s, st.on)) picked[o.id] = false; });&lt;br /&gt;
  st = onSet(s);&lt;br /&gt;
  optsEl.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
  OPTS.forEach(function (o) {&lt;br /&gt;
    if (!optVisible(o, s, st.on)) return;&lt;br /&gt;
    var lab = document.createElement(&amp;quot;label&amp;quot;); lab.className = &amp;quot;nvk-o&amp;quot;;&lt;br /&gt;
    var cb = document.createElement(&amp;quot;input&amp;quot;); cb.type = &amp;quot;checkbox&amp;quot;;&lt;br /&gt;
    cb.checked = !!st.on[o.id];&lt;br /&gt;
    var isForced = !!st.forced[o.id];&lt;br /&gt;
    if (isForced) { cb.disabled = true; lab.className += &amp;quot; dis&amp;quot;; }&lt;br /&gt;
    cb.addEventListener(&amp;quot;change&amp;quot;, function () {&lt;br /&gt;
      picked[o.id] = cb.checked;&lt;br /&gt;
      if (cb.checked) { if (o.excl) OPTS.forEach(function (x) { if (x.excl === o.excl) { if (x.id !== o.id) picked[x.id] = false; } }); }&lt;br /&gt;
      update();&lt;br /&gt;
    });&lt;br /&gt;
    lab.appendChild(cb);&lt;br /&gt;
    lab.appendChild(document.createTextNode(&amp;quot; &amp;quot; + o.t));&lt;br /&gt;
    var sub = [o.sub, isForced ? st.forced[o.id] : &amp;quot;&amp;quot;].filter(Boolean).join(&amp;quot; - &amp;quot;);&lt;br /&gt;
    if (sub) { var sm = document.createElement(&amp;quot;small&amp;quot;); sm.textContent = &amp;quot; (&amp;quot; + sub + &amp;quot;)&amp;quot;; lab.appendChild(sm); }&lt;br /&gt;
    optsEl.appendChild(lab);&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
function link(url, text) {&lt;br /&gt;
  var a = document.createElement(&amp;quot;a&amp;quot;); a.href = url; a.target = &amp;quot;_blank&amp;quot;; a.rel = &amp;quot;noopener&amp;quot;; a.textContent = text; return a;&lt;br /&gt;
}&lt;br /&gt;
function card(item, cls) {&lt;br /&gt;
  var d = document.createElement(&amp;quot;div&amp;quot;); d.className = &amp;quot;nvk-card &amp;quot; + (cls || &amp;quot;&amp;quot;) + (item.hl ? &amp;quot; hl&amp;quot; : &amp;quot;&amp;quot;);&lt;br /&gt;
  var b = document.createElement(&amp;quot;b&amp;quot;); b.textContent = item.t; d.appendChild(b);&lt;br /&gt;
  if (item.d) { var p = document.createElement(&amp;quot;span&amp;quot;); p.textContent = item.d; d.appendChild(p); }&lt;br /&gt;
  if (item.img) {&lt;br /&gt;
    var im = document.createElement(&amp;quot;div&amp;quot;);&lt;br /&gt;
    item.img.forEach(function (u) {&lt;br /&gt;
      var a = document.createElement(&amp;quot;a&amp;quot;); a.href = full(u); a.target = &amp;quot;_blank&amp;quot;; a.rel = &amp;quot;noopener&amp;quot;;&lt;br /&gt;
      var g = document.createElement(&amp;quot;img&amp;quot;); g.className = &amp;quot;nvk-img&amp;quot;; g.src = u; g.alt = item.t; a.appendChild(g); im.appendChild(a);&lt;br /&gt;
    });&lt;br /&gt;
    d.appendChild(im);&lt;br /&gt;
  }&lt;br /&gt;
  if (item.u || item.w) {&lt;br /&gt;
    var l = document.createElement(&amp;quot;div&amp;quot;); l.className = &amp;quot;nvk-links&amp;quot;;&lt;br /&gt;
    if (item.u) l.appendChild(link(item.u, item.ut || &amp;quot;Im Shop ansehen →&amp;quot;));&lt;br /&gt;
    if (item.w) l.appendChild(link(item.w, (item.wt || &amp;quot;Zum Wiki&amp;quot;) + &amp;quot; →&amp;quot;));&lt;br /&gt;
    d.appendChild(l);&lt;br /&gt;
  }&lt;br /&gt;
  if (item.links) item.links.forEach(function (x) {&lt;br /&gt;
    var r = document.createElement(&amp;quot;div&amp;quot;); r.className = &amp;quot;nvk-links&amp;quot;; r.appendChild(link(x.u, x.t + &amp;quot; →&amp;quot;)); d.appendChild(r);&lt;br /&gt;
  });&lt;br /&gt;
  return d;&lt;br /&gt;
}&lt;br /&gt;
function heading(txt) { var h = document.createElement(&amp;quot;h3&amp;quot;); h.textContent = txt; outEl.appendChild(h); }&lt;br /&gt;
function aidOf(u) {&lt;br /&gt;
  if (u.indexOf(SHOP) !== 0) return &amp;quot;&amp;quot;;&lt;br /&gt;
  var m = u.match(/sArticle\/(\d+)/);&lt;br /&gt;
  if (!m) m = u.split(&amp;quot;?&amp;quot;)[0].match(/\/(\d+)\/[^\/]+$/);&lt;br /&gt;
  return m ? m[1] : &amp;quot;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
function renderRadioList(veh) {&lt;br /&gt;
  if (veh.noCat) return;&lt;br /&gt;
  if (chosenRadio) { if (chosenRadio.cat !== veh.v) chosenRadio = null; }&lt;br /&gt;
  var data = radioCache[veh.v];&lt;br /&gt;
  if (data === undefined) {&lt;br /&gt;
    radioCache[veh.v] = &amp;quot;loading&amp;quot;;&lt;br /&gt;
    fetch(API + &amp;quot;?cat=&amp;quot; + encodeURIComponent(veh.v)).then(function (r) { return r.json(); }).then(function (j) {&lt;br /&gt;
      radioCache[veh.v] = (j.items || []).map(function (it) { it.cat = veh.v; return it; });&lt;br /&gt;
      renderResult();&lt;br /&gt;
    }).catch(function () { radioCache[veh.v] = []; renderResult(); });&lt;br /&gt;
  }&lt;br /&gt;
  if (data === undefined || data === &amp;quot;loading&amp;quot;) {&lt;br /&gt;
    var m = document.createElement(&amp;quot;p&amp;quot;); m.className = &amp;quot;nvk-miss&amp;quot;; m.textContent = &amp;quot;Verfügbare Radios werden geladen …&amp;quot;; outEl.appendChild(m); return;&lt;br /&gt;
  }&lt;br /&gt;
  if (!data.length) return;&lt;br /&gt;
  var want = { mask: /M-?ASK/i, ccc: /\bCCC\b/i, cic: /\bCIC\b/i, nbt: /\bNBT\b/i, nbtevo: /EVO/i }[sel.factory];&lt;br /&gt;
  function fits(it) { return want ? want.test(it.name) : false; }&lt;br /&gt;
  var list = data.slice().sort(function (a, b) { return (fits(b) ? 1 : 0) - (fits(a) ? 1 : 0); });&lt;br /&gt;
  var det = document.createElement(&amp;quot;details&amp;quot;); det.open = Math.max(list.length, 8) === 8;&lt;br /&gt;
  var sm = document.createElement(&amp;quot;summary&amp;quot;); sm.style.cursor = &amp;quot;pointer&amp;quot;; sm.style.fontWeight = &amp;quot;700&amp;quot;;&lt;br /&gt;
  sm.textContent = &amp;quot;Verfügbare Radios für Deinen BMW &amp;quot; + veh.t + &amp;quot; (&amp;quot; + list.length + &amp;quot;)&amp;quot;; det.appendChild(sm);&lt;br /&gt;
  list.forEach(function (it) {&lt;br /&gt;
    var d = document.createElement(&amp;quot;div&amp;quot;); d.className = &amp;quot;nvk-card rad&amp;quot;;&lt;br /&gt;
    var lab = document.createElement(&amp;quot;label&amp;quot;); lab.className = &amp;quot;nvk-o&amp;quot;;&lt;br /&gt;
    var rb = document.createElement(&amp;quot;input&amp;quot;); rb.type = &amp;quot;radio&amp;quot;; rb.name = &amp;quot;nvk-radio&amp;quot;;&lt;br /&gt;
    rb.checked = chosenRadio ? chosenRadio.sku === it.sku : false;&lt;br /&gt;
    rb.addEventListener(&amp;quot;change&amp;quot;, function () { chosenRadio = it; });&lt;br /&gt;
    var sp = document.createElement(&amp;quot;span&amp;quot;); sp.style.fontWeight = &amp;quot;700&amp;quot;;&lt;br /&gt;
    sp.textContent = &amp;quot; &amp;quot; + it.type + (fits(it) ? &amp;quot;  (passt zu Deiner Auswahl)&amp;quot; : &amp;quot;&amp;quot;);&lt;br /&gt;
    lab.appendChild(rb); lab.appendChild(sp); d.appendChild(lab);&lt;br /&gt;
    var t = document.createElement(&amp;quot;div&amp;quot;); t.textContent = it.name + (it.price ? &amp;quot;  -  &amp;quot; + it.price : &amp;quot;&amp;quot;); d.appendChild(t);&lt;br /&gt;
    var l = document.createElement(&amp;quot;div&amp;quot;); l.className = &amp;quot;nvk-links&amp;quot;; l.appendChild(link(it.url, &amp;quot;Im Shop ansehen →&amp;quot;)); d.appendChild(l);&lt;br /&gt;
    det.appendChild(d);&lt;br /&gt;
  });&lt;br /&gt;
  outEl.appendChild(det);&lt;br /&gt;
}&lt;br /&gt;
function cartBlock(needs, opt) {&lt;br /&gt;
  var items = [];&lt;br /&gt;
  needs.concat(opt).forEach(function (i) { var id = aidOf(i.u || &amp;quot;&amp;quot;); if (id) items.push({ t: i.t, aid: id }); });&lt;br /&gt;
  heading(&amp;quot;In den Warenkorb&amp;quot;);&lt;br /&gt;
  var box = document.createElement(&amp;quot;div&amp;quot;); box.className = &amp;quot;nvk-card opt&amp;quot;;&lt;br /&gt;
  var p = document.createElement(&amp;quot;div&amp;quot;);&lt;br /&gt;
  p.textContent = &amp;quot;Das oben gewählte Radio (falls ausgewählt) und diese Artikel werden direkt im Shop in den Warenkorb gelegt:&amp;quot;;&lt;br /&gt;
  box.appendChild(p);&lt;br /&gt;
  items.forEach(function (x) { var r = document.createElement(&amp;quot;div&amp;quot;); r.textContent = &amp;quot;- &amp;quot; + x.t; box.appendChild(r); });&lt;br /&gt;
  var n = document.createElement(&amp;quot;div&amp;quot;); n.className = &amp;quot;nvk-help&amp;quot;;&lt;br /&gt;
  n.textContent = &amp;quot;Kameras, TPMS, Werkzeug und Artikel ohne Direktlink wählst Du bitte über die Links oben im Shop aus.&amp;quot;;&lt;br /&gt;
  box.appendChild(n);&lt;br /&gt;
  var all = needs.concat(opt);&lt;br /&gt;
  var has = function (k) { return all.indexOf(ITEMS[k]) !== -1; };&lt;br /&gt;
  var l17 = has(&amp;quot;kcanlic&amp;quot;), l7 = has(&amp;quot;bclic&amp;quot;) || has(&amp;quot;bcdsp&amp;quot;);&lt;br /&gt;
  if (l17 || l7) {&lt;br /&gt;
    var vb = document.createElement(&amp;quot;div&amp;quot;); vb.className = &amp;quot;nvk-f&amp;quot;; vb.style.marginTop = &amp;quot;12px&amp;quot;;&lt;br /&gt;
    var vlab = document.createElement(&amp;quot;label&amp;quot;); vlab.htmlFor = &amp;quot;nvk-licvin&amp;quot;;&lt;br /&gt;
    vlab.textContent = l17 ? &amp;quot;Fahrgestellnummer (17 Zeichen) für die Lizenz&amp;quot; : &amp;quot;VIN für die Lizenz (7 Zeichen, z. B. AB12345)&amp;quot;;&lt;br /&gt;
    var vin = document.createElement(&amp;quot;input&amp;quot;); vin.type = &amp;quot;text&amp;quot;; vin.id = &amp;quot;nvk-licvin&amp;quot;; vin.maxLength = 17;&lt;br /&gt;
    vin.value = $(&amp;quot;nvk-vin&amp;quot;).value.toUpperCase();&lt;br /&gt;
    var ta = document.createElement(&amp;quot;textarea&amp;quot;); ta.rows = 3; ta.readOnly = true; ta.style.display = &amp;quot;none&amp;quot;; ta.style.marginTop = &amp;quot;6px&amp;quot;;&lt;br /&gt;
    var cb = document.createElement(&amp;quot;button&amp;quot;); cb.type = &amp;quot;button&amp;quot;; cb.className = &amp;quot;nvk-btn&amp;quot;; cb.style.marginTop = &amp;quot;6px&amp;quot;;&lt;br /&gt;
    cb.textContent = &amp;quot;Kommentartext für die Kasse kopieren&amp;quot;;&lt;br /&gt;
    var ls = document.createElement(&amp;quot;div&amp;quot;); ls.className = &amp;quot;nvk-help&amp;quot;;&lt;br /&gt;
    cb.addEventListener(&amp;quot;click&amp;quot;, function () {&lt;br /&gt;
      var v = vin.value.trim().toUpperCase(), v7 = &amp;quot;&amp;quot;, v17 = &amp;quot;&amp;quot;;&lt;br /&gt;
      if (/^[A-HJ-NPR-Z0-9]{17}$/.test(v)) { v17 = v; v7 = v.slice(10); }&lt;br /&gt;
      else if (/^[A-Z]{2}[0-9]{5}$/.test(v)) v7 = v;&lt;br /&gt;
      if (l17 ? !v17 : !v7) { ls.textContent = l17 ? &amp;quot;Bitte die vollständige 17-stellige Fahrgestellnummer eingeben.&amp;quot; : &amp;quot;Bitte die VIN im Format AB12345 (oder die 17-stellige FGN) eingeben.&amp;quot;; return; }&lt;br /&gt;
      var L = [];&lt;br /&gt;
      if (has(&amp;quot;bclic&amp;quot;)) L.push(&amp;quot;I-BUS App BC Lizenz: VIN &amp;quot; + v7);&lt;br /&gt;
      if (has(&amp;quot;bcdsp&amp;quot;)) L.push(&amp;quot;I-BUS App BC+DSP Lizenz: VIN &amp;quot; + v7);&lt;br /&gt;
      if (l17) L.push(&amp;quot;K-CAN App Beta Lizenz: FGN &amp;quot; + v17);&lt;br /&gt;
      ta.value = L.join(&amp;quot;\n&amp;quot;); ta.style.display = &amp;quot;&amp;quot;; ta.select();&lt;br /&gt;
      var hint = &amp;quot;Bitte an der Shop-Kasse in das Feld Kommentar einfügen.&amp;quot;;&lt;br /&gt;
      if (navigator.clipboard) navigator.clipboard.writeText(ta.value).then(function () { ls.textContent = &amp;quot;Text kopiert. &amp;quot; + hint; }).catch(function () { ls.textContent = &amp;quot;Bitte den Text markieren und kopieren. &amp;quot; + hint; });&lt;br /&gt;
      else ls.textContent = &amp;quot;Bitte den Text markieren und kopieren. &amp;quot; + hint;&lt;br /&gt;
    });&lt;br /&gt;
    vb.appendChild(vlab); vb.appendChild(vin); vb.appendChild(cb); vb.appendChild(ta); vb.appendChild(ls); box.appendChild(vb);&lt;br /&gt;
  }&lt;br /&gt;
  var btn = document.createElement(&amp;quot;button&amp;quot;); btn.type = &amp;quot;button&amp;quot;; btn.className = &amp;quot;nvk-btn&amp;quot;; btn.style.marginTop = &amp;quot;8px&amp;quot;;&lt;br /&gt;
  btn.textContent = &amp;quot;Auswahl in den Warenkorb legen&amp;quot;;&lt;br /&gt;
  var st = document.createElement(&amp;quot;div&amp;quot;); st.className = &amp;quot;nvk-help&amp;quot;;&lt;br /&gt;
  btn.addEventListener(&amp;quot;click&amp;quot;, function () { addToCart(items, st); });&lt;br /&gt;
  box.appendChild(btn); box.appendChild(st); outEl.appendChild(box);&lt;br /&gt;
}&lt;br /&gt;
function addToCart(items, st) {&lt;br /&gt;
  var list = items.slice();&lt;br /&gt;
  if (chosenRadio) list.unshift({ t: chosenRadio.type, sku: chosenRadio.sku });&lt;br /&gt;
  if (!list.length) { st.textContent = &amp;quot;Es ist noch nichts zum Bestellen ausgewählt.&amp;quot;; return; }&lt;br /&gt;
  st.textContent = &amp;quot;Artikel werden an den Shop übergeben …&amp;quot;;&lt;br /&gt;
  var ids = list.filter(function (x) { return x.aid; }).map(function (x) { return x.aid; });&lt;br /&gt;
  var get = ids.length ? fetch(API + &amp;quot;?aid=&amp;quot; + ids.join(&amp;quot;,&amp;quot;)).then(function (r) { return r.json(); }).then(function (j) { return j.skus || {}; }) : Promise.resolve({});&lt;br /&gt;
  get.then(function (map) {&lt;br /&gt;
    var skus = [];&lt;br /&gt;
    list.forEach(function (x) { var s = x.sku || map[x.aid]; if (s) skus.push(s); });&lt;br /&gt;
    if (!skus.length) throw new Error(&amp;quot;none&amp;quot;);&lt;br /&gt;
    return skus.reduce(function (p, s) {&lt;br /&gt;
      return p.then(function () { return fetch(CART_ADD + encodeURIComponent(s) + &amp;quot;/sQuantity/1&amp;quot;, { mode: &amp;quot;no-cors&amp;quot;, credentials: &amp;quot;include&amp;quot; }); });&lt;br /&gt;
    }, Promise.resolve()).then(function () { return skus.length; });&lt;br /&gt;
  }).then(function (n) {&lt;br /&gt;
    st.textContent = n + &amp;quot; von &amp;quot; + list.length + &amp;quot; Artikeln wurden an den Warenkorb übergeben. Bitte dort kontrollieren: &amp;quot;;&lt;br /&gt;
    st.appendChild(link(CART, &amp;quot;Zum Warenkorb →&amp;quot;));&lt;br /&gt;
  }).catch(function () { st.textContent = &amp;quot;Das hat leider nicht geklappt. Bitte nutze die Shop-Links oben.&amp;quot;; });&lt;br /&gt;
}&lt;br /&gt;
function renderResult() {&lt;br /&gt;
  var s = derive(), st = onSet(s);&lt;br /&gt;
  var missing = FIELDS.filter(function (f) {&lt;br /&gt;
    var w = $(&amp;quot;nvk-w-&amp;quot; + f.id);&lt;br /&gt;
    return w.style.display !== &amp;quot;none&amp;quot; ? (!f.optional ? !sel[f.id] : false) : false;&lt;br /&gt;
  });&lt;br /&gt;
  outEl.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
  if (missing.length) {&lt;br /&gt;
    var m = document.createElement(&amp;quot;p&amp;quot;); m.className = &amp;quot;nvk-miss&amp;quot;;&lt;br /&gt;
    m.textContent = &amp;quot;Bitte noch auswählen: &amp;quot; + missing.map(function (f) { return f.label; }).join(&amp;quot;, &amp;quot;);&lt;br /&gt;
    outEl.appendChild(m); $(&amp;quot;nvk-form&amp;quot;).style.display = &amp;quot;none&amp;quot;; return;&lt;br /&gt;
  }&lt;br /&gt;
  $(&amp;quot;nvk-form&amp;quot;).style.display = &amp;quot;&amp;quot;;&lt;br /&gt;
  var veh = vehicleOf(sel.vehicle);&lt;br /&gt;
  var ru = veh.noCat ? SHOP + &amp;quot;bmw-radios/&amp;quot; : SHOP + &amp;quot;bmw-radios/&amp;quot; + veh.v + &amp;quot;/&amp;quot;;&lt;br /&gt;
  heading(&amp;quot;Passende Radios&amp;quot;);&lt;br /&gt;
  outEl.appendChild(card({ t: &amp;quot;BMW Radios für &amp;quot; + veh.t, d: &amp;quot;Alle Radios, die für Deinen BMW &amp;quot; + veh.t + &amp;quot; im Shop erhältlich sind.&amp;quot;,&lt;br /&gt;
    u: ru, ut: &amp;quot;Zu den passenden Radios →&amp;quot;, w: SHOP + &amp;quot;bmw-radios/&amp;quot;, wt: &amp;quot;Alle BMW Radios&amp;quot; }, &amp;quot;rad&amp;quot;));&lt;br /&gt;
  renderRadioList(veh);&lt;br /&gt;
  var needs = [], hints = [], seen = {};&lt;br /&gt;
  RULES.forEach(function (r) {&lt;br /&gt;
    if (!match(r.when, s)) return;&lt;br /&gt;
    if (r.opts) { if (!r.opts.every(function (o) { return st.on[o]; })) return; }&lt;br /&gt;
    if (r.type === &amp;quot;need&amp;quot;) (r.items || []).forEach(function (id) { if (!seen[id]) { seen[id] = 1; needs.push(ITEMS[id]); } });&lt;br /&gt;
    else hints.push(r.html);&lt;br /&gt;
  });&lt;br /&gt;
  heading(&amp;quot;Das brauchst Du&amp;quot;);&lt;br /&gt;
  if (needs.length) needs.forEach(function (i) { outEl.appendChild(card(i)); });&lt;br /&gt;
  else { var n = document.createElement(&amp;quot;p&amp;quot;); n.textContent = &amp;quot;Für die Grundinstallation sind keine zusätzlichen Verlängerungen oder Adapter nötig.&amp;quot;; outEl.appendChild(n); }&lt;br /&gt;
  var opt = [];&lt;br /&gt;
  OPTS.forEach(function (o) {&lt;br /&gt;
    if (!st.on[o.id]) return;&lt;br /&gt;
    if (!optVisible(o, s, st.on)) return;&lt;br /&gt;
    o.items.forEach(function (id) {&lt;br /&gt;
      if (seen[id]) return;&lt;br /&gt;
      var sk = ITEMS[id].skipIf;&lt;br /&gt;
      if (sk) { if (seen[sk]) return; }&lt;br /&gt;
      seen[id] = 1; opt.push(ITEMS[id]);&lt;br /&gt;
    });&lt;br /&gt;
  });&lt;br /&gt;
  if (opt.length) { heading(&amp;quot;Deine Zusatzoptionen&amp;quot;); opt.forEach(function (i) { outEl.appendChild(card(i, &amp;quot;opt&amp;quot;)); }); }&lt;br /&gt;
  if (hints.length) {&lt;br /&gt;
    heading(&amp;quot;Hinweise&amp;quot;);&lt;br /&gt;
    hints.forEach(function (t) { var d = document.createElement(&amp;quot;div&amp;quot;); d.className = &amp;quot;nvk-note&amp;quot;; d.innerHTML = fmt(t); outEl.appendChild(d); });&lt;br /&gt;
  }&lt;br /&gt;
  var L = [&amp;quot;KONFIGURATION&amp;quot;];&lt;br /&gt;
  FIELDS.forEach(function (f) {&lt;br /&gt;
    if (!sel[f.id]) return;&lt;br /&gt;
    var v = f.values.filter(function (x) { return x.v === sel[f.id]; })[0];&lt;br /&gt;
    if (v) L.push(&amp;quot;- &amp;quot; + f.label + &amp;quot;: &amp;quot; + v.t);&lt;br /&gt;
  });&lt;br /&gt;
  L.push(&amp;quot;&amp;quot;, &amp;quot;BENÖTIGT&amp;quot;);&lt;br /&gt;
  needs.forEach(function (i) { L.push(&amp;quot;- &amp;quot; + i.t + (i.u ? &amp;quot;  &amp;quot; + i.u : &amp;quot;&amp;quot;)); });&lt;br /&gt;
  if (opt.length) { L.push(&amp;quot;&amp;quot;, &amp;quot;ZUSATZOPTIONEN&amp;quot;); opt.forEach(function (i) { L.push(&amp;quot;- &amp;quot; + i.t + (i.u ? &amp;quot;  &amp;quot; + i.u : &amp;quot;&amp;quot;)); }); }&lt;br /&gt;
  L.push(&amp;quot;&amp;quot;, &amp;quot;Radios: &amp;quot; + ru);&lt;br /&gt;
  summary = L.join(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  cartBlock(needs, opt);&lt;br /&gt;
}&lt;br /&gt;
function update() { renderFields(); renderOpts(); renderResult(); }&lt;br /&gt;
function newCaptcha() {&lt;br /&gt;
  capA = 1 + Math.floor(Math.random() * 9); capB = 1 + Math.floor(Math.random() * 9);&lt;br /&gt;
  $(&amp;quot;nvk-capq&amp;quot;).textContent = &amp;quot;Sicherheitsfrage: Was ist &amp;quot; + capA + &amp;quot; + &amp;quot; + capB + &amp;quot;? *&amp;quot;; $(&amp;quot;nvk-cap&amp;quot;).value = &amp;quot;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
function status(msg, ok) { var e = $(&amp;quot;nvk-status&amp;quot;); e.style.display = &amp;quot;&amp;quot;; e.textContent = msg; e.style.borderLeftColor = ok ? &amp;quot;#14866d&amp;quot; : &amp;quot;#d33&amp;quot;; }&lt;br /&gt;
$(&amp;quot;nvk-send&amp;quot;).addEventListener(&amp;quot;click&amp;quot;, function () {&lt;br /&gt;
  var name = $(&amp;quot;nvk-name&amp;quot;).value.trim(), mail = $(&amp;quot;nvk-mail&amp;quot;).value.trim(), vin = $(&amp;quot;nvk-vin&amp;quot;).value.trim().toUpperCase(), msg = $(&amp;quot;nvk-msg&amp;quot;).value.trim();&lt;br /&gt;
  if (!name || !mail || !msg) return status(&amp;quot;Bitte Name, E-Mail und Kommentar ausfüllen.&amp;quot;, false);&lt;br /&gt;
  if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(mail)) return status(&amp;quot;Bitte eine gültige E-Mail-Adresse eingeben.&amp;quot;, false);&lt;br /&gt;
  if (vin) { if (!/^[A-Z]{2}[0-9]{5}$/.test(vin)) { if (!/^[A-HJ-NPR-Z0-9]{17}$/.test(vin)) return status(&amp;quot;Bitte die VIN im Format AB12345 oder die 17-stellige FGN eingeben - oder das Feld leer lassen.&amp;quot;, false); } }&lt;br /&gt;
  if (parseInt($(&amp;quot;nvk-cap&amp;quot;).value, 10) !== capA + capB) return status(&amp;quot;Die Sicherheitsfrage wurde nicht richtig beantwortet.&amp;quot;, false);&lt;br /&gt;
  if (!$(&amp;quot;nvk-dsgvo&amp;quot;).checked) return status(&amp;quot;Bitte der Verarbeitung Deiner Daten zustimmen.&amp;quot;, false);&lt;br /&gt;
  if ($(&amp;quot;nvk-hp&amp;quot;).value) return;&lt;br /&gt;
  var sz = $(&amp;quot;nvk-size&amp;quot;).value;&lt;br /&gt;
  var rad = chosenRadio ? &amp;quot;\n\nGEWÄHLTES RADIO\n- &amp;quot; + chosenRadio.type + &amp;quot;  &amp;quot; + chosenRadio.url : &amp;quot;&amp;quot;;&lt;br /&gt;
  var sum2 = summary + rad + (sz ? &amp;quot;\n\nGewünschte Displaygröße: &amp;quot; + sz : &amp;quot;&amp;quot;);&lt;br /&gt;
  var text = &amp;quot;Name: &amp;quot; + name + &amp;quot;\nE-Mail: &amp;quot; + mail + &amp;quot;\nVIN: &amp;quot; + (vin || &amp;quot;-&amp;quot;) + &amp;quot;\n\nKommentar:\n&amp;quot; + msg + &amp;quot;\n\n&amp;quot; + sum2;&lt;br /&gt;
  if (SEND_URL) {&lt;br /&gt;
    var p = new URLSearchParams();&lt;br /&gt;
    p.append(&amp;quot;name&amp;quot;, name); p.append(&amp;quot;mail&amp;quot;, mail); p.append(&amp;quot;vin&amp;quot;, vin); p.append(&amp;quot;msg&amp;quot;, msg); p.append(&amp;quot;summary&amp;quot;, sum2);&lt;br /&gt;
    p.append(&amp;quot;hp&amp;quot;, $(&amp;quot;nvk-hp&amp;quot;).value); p.append(&amp;quot;ca&amp;quot;, capA); p.append(&amp;quot;cb&amp;quot;, capB); p.append(&amp;quot;cv&amp;quot;, $(&amp;quot;nvk-cap&amp;quot;).value);&lt;br /&gt;
    fetch(SEND_URL, { method: &amp;quot;POST&amp;quot;, body: p }).then(function (r) {&lt;br /&gt;
      if (!r.ok) throw new Error(&amp;quot;send&amp;quot;);&lt;br /&gt;
      status(&amp;quot;Danke! Deine Anfrage wurde gesendet, eine Kopie geht an &amp;quot; + mail + &amp;quot;.&amp;quot;, true); newCaptcha();&lt;br /&gt;
    }).catch(function () { status(&amp;quot;Das Senden hat nicht geklappt. Bitte versuche es später noch einmal oder schreibe direkt an &amp;quot; + MAIL_TO + &amp;quot;.&amp;quot;, false); });&lt;br /&gt;
  } else {&lt;br /&gt;
    var AMP = &amp;quot;\u0026&amp;quot;;&lt;br /&gt;
    window.location.href = &amp;quot;mailto:&amp;quot; + MAIL_TO + &amp;quot;?cc=&amp;quot; + encodeURIComponent(mail) + AMP + &amp;quot;subject=&amp;quot; + encodeURIComponent(MAIL_SUBJECT) + AMP + &amp;quot;body=&amp;quot; + encodeURIComponent(text);&lt;br /&gt;
    status(&amp;quot;Dein E-Mail-Programm wurde mit der fertigen Anfrage geöffnet. Bitte dort noch auf Senden klicken.&amp;quot;, true);&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
$(&amp;quot;nvk-reset&amp;quot;).addEventListener(&amp;quot;click&amp;quot;, function () { sel = {}; picked = {}; chosenRadio = null; update(); });&lt;br /&gt;
newCaptcha();&lt;br /&gt;
update();&lt;br /&gt;
})();&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;Stand: 21.10.2026&amp;lt;/small&amp;gt;&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andre</name></author>
	</entry>
	<entry>
		<id>https://xtrons.ibus-app.de/index.php?title=Android_Radio_Konfigurator&amp;diff=4089</id>
		<title>Android Radio Konfigurator</title>
		<link rel="alternate" type="text/html" href="https://xtrons.ibus-app.de/index.php?title=Android_Radio_Konfigurator&amp;diff=4089"/>
		<updated>2026-10-21T12:59:07Z</updated>

		<summary type="html">&lt;p&gt;Andre: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt; '''Mit diesem Tool kann auf Basis von Fahrzeug und vorhandenen Komponenten eine Liste nötiger Komponenten erstellt werden.&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;big&amp;gt;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.&amp;lt;br&amp;gt;'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Stand: 21.10.2026&amp;lt;/small&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
#nvk{max-width:900px;line-height:1.45}&lt;br /&gt;
#nvk *{box-sizing:border-box}&lt;br /&gt;
#nvk .nvk-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:14px;margin:12px 0}&lt;br /&gt;
#nvk .nvk-f label{display:block;font-weight:700;margin-bottom:4px}&lt;br /&gt;
#nvk select{width:100%;padding:9px 8px;font:inherit;color:#202122;background:#fff;border:1px solid #a2a9b1;border-radius:4px}&lt;br /&gt;
#nvk .nvk-help{font-size:.85em;opacity:.75;margin-top:3px}&lt;br /&gt;
#nvk fieldset{border:1px solid rgba(128,128,128,.45);border-radius:6px;padding:10px 14px;margin:14px 0}&lt;br /&gt;
#nvk legend{font-weight:700;padding:0 6px}&lt;br /&gt;
#nvk .nvk-o{display:block;padding:4px 0;cursor:pointer}&lt;br /&gt;
#nvk .nvk-o small{opacity:.7}&lt;br /&gt;
#nvk .nvk-o.dis{opacity:.75;cursor:default}&lt;br /&gt;
#nvk .nvk-btn{padding:7px 14px;font:inherit;border:1px solid #a2a9b1;border-radius:4px;background:#f8f9fa;color:#202122;cursor:pointer}&lt;br /&gt;
#nvk #nvk-out{margin-top:18px}&lt;br /&gt;
#nvk h3{margin:18px 0 8px}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-card.opt{border-left-color:#14866d}&lt;br /&gt;
#nvk .nvk-card.rad{border-left-color:#fff;background:rgba(255,255,255,.08)}&lt;br /&gt;
#nvk .nvk-card b{display:block}&lt;br /&gt;
#nvk .nvk-links{margin-top:4px;font-weight:600}&lt;br /&gt;
#nvk .nvk-links a{margin-right:14px}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-miss{opacity:.8;font-style:italic}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-card .nvk-img{max-width:230px;max-height:150px}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-card.hl{border:2px solid #36c;border-left-width:8px;background:rgba(51,102,204,.12);padding:12px 14px}&lt;br /&gt;
#nvk .nvk-card.hl b{font-size:1.1em}&lt;br /&gt;
#nvk .nvk-img.wide{max-width:min(100%,460px);max-height:none}&lt;br /&gt;
#nvk #nvk-form{margin-top:22px}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-grid&amp;quot; id=&amp;quot;nvk-fields&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;fieldset id=&amp;quot;nvk-optset&amp;quot;&amp;gt;&amp;lt;legend&amp;gt;Zusatzoptionen&amp;lt;/legend&amp;gt;&amp;lt;div id=&amp;quot;nvk-opts&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/fieldset&amp;gt;&lt;br /&gt;
&amp;lt;button type=&amp;quot;button&amp;quot; class=&amp;quot;nvk-btn&amp;quot; id=&amp;quot;nvk-reset&amp;quot;&amp;gt;Auswahl zurücksetzen&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk-out&amp;quot; aria-live=&amp;quot;polite&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;fieldset id=&amp;quot;nvk-form&amp;quot; style=&amp;quot;display:none&amp;quot;&amp;gt;&amp;lt;legend&amp;gt;Anfrage senden&amp;lt;/legend&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;nvk-help&amp;quot;&amp;gt;Deine Auswahl und die Liste oben werden automatisch mitgesendet. Alle Felder mit * sind Pflicht.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-grid&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-name&amp;quot;&amp;gt;Name *&amp;lt;/label&amp;gt;&amp;lt;input id=&amp;quot;nvk-name&amp;quot; type=&amp;quot;text&amp;quot; autocomplete=&amp;quot;name&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-mail&amp;quot;&amp;gt;E-Mail *&amp;lt;/label&amp;gt;&amp;lt;input id=&amp;quot;nvk-mail&amp;quot; type=&amp;quot;email&amp;quot; autocomplete=&amp;quot;email&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-size&amp;quot;&amp;gt;Gewünschte Displaygröße (optional)&amp;lt;/label&amp;gt;&amp;lt;select id=&amp;quot;nvk-size&amp;quot;&amp;gt;&amp;lt;option value=&amp;quot;&amp;quot;&amp;gt;Keine Angabe / Beratung gewünscht&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;7&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;8.8&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;9&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;10.25&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;12.3&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;14.9&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;Andere Größe (bitte im Kommentar nennen)&amp;lt;/option&amp;gt;&amp;lt;/select&amp;gt;&amp;lt;div class=&amp;quot;nvk-help&amp;quot;&amp;gt;Diagonale in Zoll. Nicht jede Größe gibt es für jede Baureihe, das prüfen wir für Dich.&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-vin&amp;quot;&amp;gt;VIN oder FGN (optional)&amp;lt;/label&amp;gt;&amp;lt;input id=&amp;quot;nvk-vin&amp;quot; type=&amp;quot;text&amp;quot; maxlength=&amp;quot;17&amp;quot; placeholder=&amp;quot;AB12345 oder 17-stellige FGN&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-msg&amp;quot;&amp;gt;Kommentar *&amp;lt;/label&amp;gt;&amp;lt;textarea id=&amp;quot;nvk-msg&amp;quot; rows=&amp;quot;4&amp;quot;&amp;gt;&amp;lt;/textarea&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot; style=&amp;quot;max-width:300px&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-cap&amp;quot; id=&amp;quot;nvk-capq&amp;quot;&amp;gt;Sicherheitsfrage *&amp;lt;/label&amp;gt;&amp;lt;input id=&amp;quot;nvk-cap&amp;quot; type=&amp;quot;text&amp;quot; inputmode=&amp;quot;numeric&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;input id=&amp;quot;nvk-hp&amp;quot; type=&amp;quot;text&amp;quot; tabindex=&amp;quot;-1&amp;quot; autocomplete=&amp;quot;off&amp;quot; aria-hidden=&amp;quot;true&amp;quot; style=&amp;quot;position:absolute;left:-9999px;width:1px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;label class=&amp;quot;nvk-o&amp;quot;&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; id=&amp;quot;nvk-dsgvo&amp;quot;&amp;gt; Ich stimme zu, dass meine Angaben zur Bearbeitung der Anfrage per E-Mail verarbeitet werden. *&amp;lt;/label&amp;gt;&lt;br /&gt;
&amp;lt;button type=&amp;quot;button&amp;quot; class=&amp;quot;nvk-btn&amp;quot; id=&amp;quot;nvk-send&amp;quot;&amp;gt;Anfrage senden&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk-status&amp;quot; class=&amp;quot;nvk-note&amp;quot; style=&amp;quot;display:none&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/fieldset&amp;gt;&lt;br /&gt;
&amp;lt;noscript&amp;gt;Für den Konfigurator wird JavaScript benötigt.&amp;lt;/noscript&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
(function () {&lt;br /&gt;
&amp;quot;use strict&amp;quot;;&lt;br /&gt;
/* =====================================================================&lt;br /&gt;
   KONFIGURATION - hier wird gepflegt.&lt;br /&gt;
   Textformat in Hinweisen: [b]fett[/b]  [br] Zeilenumbruch  [a=URL]Linktext[/a]&lt;br /&gt;
   Bitte im Skript KEIN kaufmännisches Und, kein Kleiner-/Größer-Zeichen&lt;br /&gt;
   und keine Leerzeilen verwenden (das Wiki wandelt sie um).&lt;br /&gt;
   ===================================================================== */&lt;br /&gt;
var SHOP = &amp;quot;https://shop.ibus-app.de/&amp;quot;;&lt;br /&gt;
var WIKI = &amp;quot;https://wiki.ibus-app.de/index.php?title=&amp;quot;;&lt;br /&gt;
/* Bilder aus dem Wiki (Thumbnail-Adressen; Klick öffnet automatisch das Originalbild) */&lt;br /&gt;
var IM = &amp;quot;https://xtrons.ibus-app.de/images/thumb/&amp;quot;;&lt;br /&gt;
var P = {&lt;br /&gt;
  schema:  IM + &amp;quot;e/ea/BMW_E39_Verl%C3%A4ngerungen_EXL005%2BFAKRA_.png/135px-BMW_E39_Verl%C3%A4ngerungen_EXL005%2BFAKRA_.png&amp;quot;,&lt;br /&gt;
  exl005:  IM + &amp;quot;7/70/Exl005-1.webp/257px-Exl005-1.webp.png&amp;quot;,&lt;br /&gt;
  fakra6m: IM + &amp;quot;d/d8/FM-extension_01_1.png/270px-FM-extension_01_1.png&amp;quot;,&lt;br /&gt;
  isofakra: IM + &amp;quot;4/4e/ISO-FAKRA_1.png/270px-ISO-FAKRA_1.png&amp;quot;,&lt;br /&gt;
  bm24:    IM + &amp;quot;8/82/BM24.png/130px-BM24.png&amp;quot;,&lt;br /&gt;
  iso:     IM + &amp;quot;d/dd/Iso.jpg/69px-Iso.jpg&amp;quot;,&lt;br /&gt;
  bm54:    IM + &amp;quot;3/34/BM54.png/135px-BM54.png&amp;quot;,&lt;br /&gt;
  fakra:   IM + &amp;quot;b/b3/Fakra.jpg/100px-Fakra.jpg&amp;quot;,&lt;br /&gt;
  pfeil:   IM + &amp;quot;e/ee/Navi_E46.jpg/239px-Navi_E46.jpg&amp;quot;,&lt;br /&gt;
  noquad:  IM + &amp;quot;6/68/No_elongation.jpg/180px-No_elongation.jpg&amp;quot;,&lt;br /&gt;
  noexl6:  IM + &amp;quot;7/7b/No_EXL006.jpg/180px-No_EXL006.jpg&amp;quot;,&lt;br /&gt;
  halter:  IM + &amp;quot;3/3b/Halter_Alu.webp/92px-Halter_Alu.webp.png&amp;quot;,&lt;br /&gt;
  deepobd: &amp;quot;https://xtrons.ibus-app.de/images/d/d4/DeepOBD_Interface_1.png&amp;quot;,&lt;br /&gt;
  n43:     IM + &amp;quot;e/e4/Navi4_3.jpg/240px-Navi4_3.jpg&amp;quot;,&lt;br /&gt;
  n169:    IM + &amp;quot;8/8a/Navi16_9.jpg/240px-Navi16_9.jpg&amp;quot;,&lt;br /&gt;
  radio:   IM + &amp;quot;9/96/E39_Radio.jpg/240px-E39_Radio.jpg&amp;quot;,&lt;br /&gt;
  idrive:  &amp;quot;https://xtrons.ibus-app.de/images/0/02/MASK-CCC-CIC-NBT-EVO-iDrive.jpg&amp;quot;,&lt;br /&gt;
  iris:    &amp;quot;https://xtrons.ibus-app.de/images/b/be/BusinessKas_IRISG.jpg&amp;quot;,&lt;br /&gt;
  resler:  &amp;quot;https://xtrons.ibus-app.de/images/d/d1/Resler_Modul_01.png&amp;quot;,&lt;br /&gt;
  can:     &amp;quot;https://xtrons.ibus-app.de/images/6/69/CAN_Interface.png&amp;quot;,&lt;br /&gt;
  funktr:  IM + &amp;quot;7/7e/E46_Funktionstraeger.png/240px-E46_Funktionstraeger.png&amp;quot;&lt;br /&gt;
};&lt;br /&gt;
/* Anfrage-Formular: MAIL_TO = Empfänger. SEND_URL leer = E-Mail-Programm des Kunden öffnen (mailto).&lt;br /&gt;
   SEND_URL = Adresse des Server-Skripts send-anfrage.php = Versand direkt vom Server (mit CC an den Kunden). */&lt;br /&gt;
var MAIL_TO = &amp;quot;info@ibus-app.de&amp;quot;;&lt;br /&gt;
var MAIL_SUBJECT = &amp;quot;Anfrage aus Android Radio Konfigurator&amp;quot;;&lt;br /&gt;
var SEND_URL = &amp;quot;https://xtrons.ibus-app.de/send-anfrage.php&amp;quot;;&lt;br /&gt;
/* ---- 1) Baureihen --------------------------------------------------------&lt;br /&gt;
   v = Shop-Kategorie (Link: SHOP + bmw-radios/ + v + /)&lt;br /&gt;
   gen: alt = I-BUS-Fahrzeuge (E38/E39/E46/E53/E83)&lt;br /&gt;
        b   = M-ASK / CCC / CIC     c = CIC / NBT / NBT EVO&lt;br /&gt;
   body = Karosserieformen (siehe BODY)                                      */&lt;br /&gt;
var BODY = { limo: &amp;quot;Limousine&amp;quot;, touring: &amp;quot;Touring&amp;quot;, coupe: &amp;quot;Coupé&amp;quot;, cabrio: &amp;quot;Cabrio&amp;quot;, schraeg: &amp;quot;Schrägheck&amp;quot;,&lt;br /&gt;
  compact: &amp;quot;Compact&amp;quot;, gt: &amp;quot;Gran Turismo&amp;quot;, gc: &amp;quot;Gran Coupé&amp;quot;, suv: &amp;quot;SUV / SAV&amp;quot;, roadster: &amp;quot;Roadster&amp;quot; };&lt;br /&gt;
var VEHICLES = [&lt;br /&gt;
  { v: &amp;quot;1er-e8x&amp;quot;, t: &amp;quot;1er E8x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;schraeg,coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;1er-f2x&amp;quot;, t: &amp;quot;1er F2x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;schraeg&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;2er-f2x&amp;quot;, t: &amp;quot;2er F2x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;3er-e46&amp;quot;, t: &amp;quot;3er E46&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;limo,touring,coupe,cabrio,compact&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;3er-e9x&amp;quot;, t: &amp;quot;3er E9x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;limo,touring,coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;3er-f3x&amp;quot;, t: &amp;quot;3er F3x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;limo,touring,gt&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;4er-f3x&amp;quot;, t: &amp;quot;4er F3x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;coupe,cabrio,gc&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;5er-e39&amp;quot;, t: &amp;quot;5er E39&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;limo,touring&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;5er-e6x&amp;quot;, t: &amp;quot;5er E6x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;limo,touring&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;5er-f1x&amp;quot;, t: &amp;quot;5er F1x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;limo,touring,gt&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;6er-e6x&amp;quot;, t: &amp;quot;6er E6x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;7er-e38&amp;quot;, t: &amp;quot;7er E38&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;limo&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;7er-e65&amp;quot;, t: &amp;quot;7er E65&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;limo&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;7er-f01&amp;quot;, t: &amp;quot;7er F01&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;limo&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x1-e84&amp;quot;, t: &amp;quot;X1 E84&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x1-f48&amp;quot;, t: &amp;quot;X1 F48&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x3-e83&amp;quot;, t: &amp;quot;X3 E83&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x3-f25&amp;quot;, t: &amp;quot;X3 F25&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x5-e53&amp;quot;, t: &amp;quot;X5 E53&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x5-e70&amp;quot;, t: &amp;quot;X5 E70&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x5-f15&amp;quot;, t: &amp;quot;X5 F15&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x6-e71&amp;quot;, t: &amp;quot;X6 E71&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;z4-e85e86&amp;quot;, t: &amp;quot;Z4 E85/E86&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;roadster,coupe&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;z4-e89&amp;quot;, t: &amp;quot;Z4 E89&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;roadster&amp;quot;, noCat: true }&lt;br /&gt;
];&lt;br /&gt;
/* Fahrzeuge mit K-CAN App (Beta) */&lt;br /&gt;
var KCAN = [&amp;quot;1er-e8x&amp;quot;, &amp;quot;3er-e9x&amp;quot;, &amp;quot;5er-e6x&amp;quot;, &amp;quot;6er-e6x&amp;quot;, &amp;quot;7er-e65&amp;quot;, &amp;quot;x1-e84&amp;quot;, &amp;quot;x5-e70&amp;quot;, &amp;quot;x6-e71&amp;quot;, &amp;quot;z4-e89&amp;quot;];&lt;br /&gt;
var bodyValues = Object.keys(BODY).map(function (k) {&lt;br /&gt;
  return { v: k, t: BODY[k], only: { vehicle: VEHICLES.filter(function (x) { return x.body.split(&amp;quot;,&amp;quot;).indexOf(k) !== -1; }).map(function (x) { return x.v; }) } };&lt;br /&gt;
});&lt;br /&gt;
/* ---- 2) Auswahlfelder ------------------------------------------------------&lt;br /&gt;
   only = Wert nur anbieten, wenn Bedingung passt   show = Feld nur dann zeigen&lt;br /&gt;
   optional = muss nicht gewählt werden             auto = bei nur einem Wert vorwählen */&lt;br /&gt;
var FIELDS = [&lt;br /&gt;
  { id: &amp;quot;vehicle&amp;quot;, label: &amp;quot;Fahrzeug&amp;quot;, values: VEHICLES.map(function (x) { return { v: x.v, t: &amp;quot;BMW &amp;quot; + x.t }; }) },&lt;br /&gt;
  { id: &amp;quot;factory&amp;quot;, label: &amp;quot;Verbaut ab Werk&amp;quot;, pre: { when: { gen: [&amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;] }, html: &amp;quot;[b]So erkennst Du Dein System:[/b][br][imgw=&amp;quot; + P.idrive + &amp;quot;]&amp;quot; }, values: [&lt;br /&gt;
    { v: &amp;quot;iris&amp;quot;,  t: &amp;quot;Radio mit IRIS&amp;quot;, only: { vehicle: [&amp;quot;3er-e46&amp;quot;, &amp;quot;5er-e39&amp;quot;, &amp;quot;7er-e38&amp;quot;, &amp;quot;x5-e53&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.iris + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;mid&amp;quot;,   t: &amp;quot;Radio mit MID&amp;quot;,  only: { gen: [&amp;quot;alt&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.radio + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;n43&amp;quot;,   t: &amp;quot;4:3 Navi&amp;quot;,       only: { vehicle: [&amp;quot;5er-e39&amp;quot;, &amp;quot;7er-e38&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.n43 + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;n169&amp;quot;,  t: &amp;quot;16:9 Navi&amp;quot;,      only: { gen: [&amp;quot;alt&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.n169 + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;pfeil&amp;quot;, t: &amp;quot;Pfeilnavi&amp;quot;,      only: { vehicle: [&amp;quot;3er-e46&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.pfeil + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;mask&amp;quot;,  t: &amp;quot;M-ASK&amp;quot;,          only: { gen: [&amp;quot;b&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;ccc&amp;quot;,   t: &amp;quot;CCC&amp;quot;,            only: { gen: [&amp;quot;b&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;cic&amp;quot;,   t: &amp;quot;CIC&amp;quot;,            only: { gen: [&amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;nbt&amp;quot;,   t: &amp;quot;NBT&amp;quot;,            only: { gen: [&amp;quot;c&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;nbtevo&amp;quot;, t: &amp;quot;NBT EVO&amp;quot;,       only: { gen: [&amp;quot;c&amp;quot;] } } ] },&lt;br /&gt;
  { id: &amp;quot;trunk&amp;quot;, label: &amp;quot;Wo sitzt das Radiomodul des Pfeilnavis?&amp;quot;, optional: true, show: { factory: [&amp;quot;pfeil&amp;quot;] },&lt;br /&gt;
    help: &amp;quot;Bitte prüfen: Sitzt das Modul im Kofferraum, oder im Pfeilnavi selbst (Quadlock hinten neben dem Antennenstecker)?[br][img=&amp;quot; + P.pfeil + &amp;quot;]&amp;quot;,&lt;br /&gt;
    values: [&lt;br /&gt;
    { v: &amp;quot;ja&amp;quot;, t: &amp;quot;Im Kofferraum (Verlängerungen nötig)&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;nein&amp;quot;, t: &amp;quot;Im Pfeilnavi, Quadlock hinten (keine Verlängerung)&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;unk&amp;quot;, t: &amp;quot;Weiß ich nicht&amp;quot; } ] },&lt;br /&gt;
  { id: &amp;quot;aux&amp;quot;, label: &amp;quot;AUX-IN verfügbar?&amp;quot;, show: { gen: [&amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;] }, values: [&lt;br /&gt;
    { v: &amp;quot;ja&amp;quot;, t: &amp;quot;Ja&amp;quot; }, { v: &amp;quot;nein&amp;quot;, t: &amp;quot;Nein&amp;quot; } ] },&lt;br /&gt;
  { id: &amp;quot;sound&amp;quot;, label: &amp;quot;Soundsystem&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;stereo&amp;quot;, t: &amp;quot;Stereo&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;hifi&amp;quot;,   t: &amp;quot;Hifi&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;dsp&amp;quot;,    t: &amp;quot;DSP&amp;quot;, only: { vehicle: [&amp;quot;7er-e38&amp;quot;, &amp;quot;5er-e39&amp;quot;, &amp;quot;x5-e53&amp;quot;, &amp;quot;x3-e83&amp;quot;] }, info: &amp;quot;[a=&amp;quot; + WIKI + &amp;quot;Habe_ich_DSP%3F]Habe ich DSP?[/a]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;hk&amp;quot;,     t: &amp;quot;Harman Kardon&amp;quot;, only: { vehicle: [&amp;quot;3er-e46&amp;quot;, &amp;quot;z4-e85e86&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;logic7&amp;quot;, t: &amp;quot;Logic7&amp;quot;, only: { vehicle: [&amp;quot;3er-e9x&amp;quot;, &amp;quot;5er-e6x&amp;quot;, &amp;quot;6er-e6x&amp;quot;, &amp;quot;7er-e65&amp;quot;, &amp;quot;1er-e8x&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;hksur&amp;quot;,  t: &amp;quot;Harman Kardon Surround&amp;quot;, only: { vehicle: [&amp;quot;1er-f2x&amp;quot;, &amp;quot;2er-f2x&amp;quot;, &amp;quot;3er-f3x&amp;quot;, &amp;quot;4er-f3x&amp;quot;, &amp;quot;5er-f1x&amp;quot;] } } ] },&lt;br /&gt;
  { id: &amp;quot;current&amp;quot;, label: &amp;quot;Aktuell verbaut&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;werk&amp;quot;, t: &amp;quot;Werksradio / Werksnavi&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;nach&amp;quot;, t: &amp;quot;Nachrüst-Radio / -Navi&amp;quot; } ] },&lt;br /&gt;
  { id: &amp;quot;body&amp;quot;, label: &amp;quot;Karosserie&amp;quot;, auto: true, values: bodyValues },&lt;br /&gt;
  { id: &amp;quot;ant&amp;quot;, label: &amp;quot;Antennenstecker am Radio (optional)&amp;quot;, optional: true, def: &amp;quot;unk&amp;quot;,&lt;br /&gt;
    show: { vehicle: [&amp;quot;7er-e38&amp;quot;, &amp;quot;5er-e39&amp;quot;, &amp;quot;3er-e46&amp;quot;, &amp;quot;x5-e53&amp;quot;] },&lt;br /&gt;
    values: [&lt;br /&gt;
    { v: &amp;quot;unk&amp;quot;,   t: &amp;quot;Weiß ich nicht&amp;quot;, info: &amp;quot;[b]BM24[/b] (Rundpin) = ISO-Antennenstecker:[br][img=&amp;quot; + P.bm24 + &amp;quot;][img=&amp;quot; + P.iso + &amp;quot;][br][b]BM54[/b] = FAKRA:[br][img=&amp;quot; + P.bm54 + &amp;quot;][img=&amp;quot; + P.fakra + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;iso&amp;quot;,   t: &amp;quot;ISO (BM24, Rundpin)&amp;quot;, info: &amp;quot;[img=&amp;quot; + P.bm24 + &amp;quot;][img=&amp;quot; + P.iso + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;fakra&amp;quot;, t: &amp;quot;FAKRA (BM54)&amp;quot;, info: &amp;quot;[img=&amp;quot; + P.bm54 + &amp;quot;][img=&amp;quot; + P.fakra + &amp;quot;]&amp;quot; } ] }&lt;br /&gt;
];&lt;br /&gt;
/* ---- 3) Zusatzoptionen (Mehrfachauswahl) ---------------------------------&lt;br /&gt;
   show = nur sichtbar wenn Bedingung passt   requires = nur sichtbar wenn diese Optionen gewählt sind&lt;br /&gt;
   excl = Optionen derselben Gruppe schließen sich aus   items = Artikel aus ITEMS */&lt;br /&gt;
var OPTS = [&lt;br /&gt;
  { id: &amp;quot;halter&amp;quot;,  t: &amp;quot;Radio-Halter&amp;quot;, sub: &amp;quot;nur BMW E39&amp;quot;, show: { vehicle: [&amp;quot;5er-e39&amp;quot;] }, items: [&amp;quot;halter&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;ibus&amp;quot;,    t: &amp;quot;I-BUS App&amp;quot;, show: { gen: [&amp;quot;alt&amp;quot;] }, items: [&amp;quot;ibus&amp;quot;, &amp;quot;resler&amp;quot;, &amp;quot;bclic&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;deepobd&amp;quot;, t: &amp;quot;DeepOBD (Diagnose)&amp;quot;, items: [&amp;quot;deepobd&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;can&amp;quot;,     t: &amp;quot;CAN Interface&amp;quot;, sub: &amp;quot;Addon - nur mit I-BUS App&amp;quot;, show: { gen: [&amp;quot;alt&amp;quot;] }, requires: [&amp;quot;ibus&amp;quot;], items: [&amp;quot;can&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;kcan&amp;quot;,    t: &amp;quot;K-CAN App (Beta)&amp;quot;, sub: &amp;quot;Pendant zur I-BUS App&amp;quot;, show: { vehicle: KCAN }, items: [&amp;quot;kcan&amp;quot;, &amp;quot;kcanlic&amp;quot;, &amp;quot;can&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;tpms&amp;quot;,    t: &amp;quot;TPMS (Reifendruck)&amp;quot;, items: [&amp;quot;tpms&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;dab1&amp;quot;,    t: &amp;quot;DAB+ (Single Receiver)&amp;quot;, excl: &amp;quot;dab&amp;quot;, items: [&amp;quot;dab1&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;dab2&amp;quot;,    t: &amp;quot;DAB+ (Dual Receiver)&amp;quot;,   excl: &amp;quot;dab&amp;quot;, items: [&amp;quot;dab2&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;rcam&amp;quot;,    t: &amp;quot;Rückfahrkamera&amp;quot;, items: [&amp;quot;rcam&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;fcam&amp;quot;,    t: &amp;quot;Front-Kamera&amp;quot;, items: [&amp;quot;fcam&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;tool&amp;quot;,    t: &amp;quot;Einbau-Werkzeug (Kunststoffheber)&amp;quot;, items: [&amp;quot;tool&amp;quot;] }&lt;br /&gt;
];&lt;br /&gt;
/* Erzwungene Optionen (werden automatisch gesetzt und gesperrt) */&lt;br /&gt;
var FORCED = [&lt;br /&gt;
  { when: { sound: [&amp;quot;dsp&amp;quot;] }, opts: [&amp;quot;ibus&amp;quot;], why: &amp;quot;wegen DSP erforderlich&amp;quot; }&lt;br /&gt;
];&lt;br /&gt;
/* ---- 4) Artikel ------------------------------------------------------------&lt;br /&gt;
   u = Shop-Link (ut = Linktext)   w = Wiki-Link (wt = Linktext)   leer = kein Link&lt;br /&gt;
   skipIf = Artikel entfällt, wenn der genannte Artikel schon in der Liste steht */&lt;br /&gt;
var ITEMS = {&lt;br /&gt;
  exl005:  { t: &amp;quot;Verlängerung EXL005&amp;quot;, d: &amp;quot;Ersetzt das Radiomodul im Kofferraum.&amp;quot;, u: SHOP + &amp;quot;detail/index/sArticle/212/&amp;quot;, img: [P.exl005, P.schema] },&lt;br /&gt;
  fakra6m: { t: &amp;quot;Verlängerung 6 m FAKRA(m) auf FAKRA(f), gewinkelt&amp;quot;, d: &amp;quot;Antennenverlängerung vom Kofferraum nach vorn.&amp;quot;, img: [P.fakra6m],&lt;br /&gt;
             u: SHOP + &amp;quot;shop/zubehoer/adapterkabel/192/verlaengerung-6m-fakra-m-auf-fakra-f-kurz-gewinkelt&amp;quot; },&lt;br /&gt;
  isoada:  { t: &amp;quot;Adapter ISO-Stecker auf FAKRA, gewinkelt (15 cm)&amp;quot;, d: &amp;quot;Nötig bei ISO-Antennenstecker (BM24, Rundpin).&amp;quot;, img: [P.isofakra],&lt;br /&gt;
             u: SHOP + &amp;quot;shop/zubehoer/adapterkabel/193/adapter-kabel-iso-f-auf-fakra-f-kurz-gewinkelt-15cm&amp;quot; },&lt;br /&gt;
  bcdsp:   { t: &amp;quot;I-BUS App - BC+DSP Lizenz&amp;quot;, d: &amp;quot;Ohne DSP-Lizenz arbeitet das Werks-DSP nicht.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/lizenzen/171/i-bus-app-bc-dsp-lizenz&amp;quot;,&lt;br /&gt;
             w: WIKI + &amp;quot;Habe_ich_DSP%3F&amp;quot;, wt: &amp;quot;Wiki: Habe ich DSP?&amp;quot; },&lt;br /&gt;
  halter:  { t: &amp;quot;Alu-Halter zur Radio-Montage im BMW E39&amp;quot;, d: &amp;quot;Empfohlen bei Radios, die nicht von AVIN stammen.&amp;quot;, img: [P.halter],&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/radiohalter/185/alu-halter-zur-radio-montage-im-bmw-e39&amp;quot; },&lt;br /&gt;
  ibus:    { t: &amp;quot;I-BUS App&amp;quot;, hl: true,&lt;br /&gt;
             d: &amp;quot;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.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;cat/index/sCategory/42&amp;quot;,&lt;br /&gt;
             links: [&lt;br /&gt;
               { u: WIKI + &amp;quot;Was_brauche_ich_um_die_I-BUS_App_nutzen_zu_k%C3%B6nnen%3F&amp;quot;, t: &amp;quot;Wiki: Was brauche ich für die I-BUS App?&amp;quot; },&lt;br /&gt;
               { u: WIKI + &amp;quot;Funktionen&amp;quot;, t: &amp;quot;Liste aller I-BUS App Funktionen (BMW E38|E39|E46|E53|E83)&amp;quot; },&lt;br /&gt;
               { u: WIKI + &amp;quot;Was_geht_beim_BMW_E46_nicht&amp;quot;, t: &amp;quot;Was geht beim BMW E46, E83, E85,.. nicht? (da werkseitig nicht verbaut)&amp;quot; },&lt;br /&gt;
               { u: WIKI + &amp;quot;Funktionseinschr%C3%A4nkungen_nach_Baujahr/Ausstattung/Modell&amp;quot;, t: &amp;quot;Funktionseinschränkungen nach Baujahr/Ausstattung/Modell&amp;quot; } ] },&lt;br /&gt;
  resler:  { t: &amp;quot;Resler USB I-BUS Modul inkl. Anschlusskabel&amp;quot;, d: &amp;quot;Verbindet I-BUS App und Fahrzeug.&amp;quot;, img: [P.resler],&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/interfaces-module/191/resler-usb-i-bus-modul-inkl.-anschlusskabel&amp;quot;,&lt;br /&gt;
             w: &amp;quot;https://wiki.ibus-app.de/index.php?title=Hauptseite#Einbauanleitung_f.C3.BCr_Resler_Modul_und_Resler_Interface&amp;quot;, wt: &amp;quot;Einbauanleitung Resler Modul&amp;quot; },&lt;br /&gt;
  bclic:   { t: &amp;quot;I-BUS App - BC Lizenz&amp;quot;, d: &amp;quot;Schaltet u. a. die BC-Daten der App frei.&amp;quot;, skipIf: &amp;quot;bcdsp&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/lizenzen/167/i-bus-app-bc-lizenz&amp;quot; },&lt;br /&gt;
  deepobd: { t: &amp;quot;Deep OBD OBD-II Bluetooth-Adapter&amp;quot;, d: &amp;quot;Live-Werte auslesen, Fehler lesen und löschen.&amp;quot;, img: [P.deepobd],&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/interfaces-module/258/deep-obd-obd-ii-bluetooth-adapter?c=54&amp;quot;,&lt;br /&gt;
             w: &amp;quot;https://xtrons.ibus-app.de/index.php?title=DeepOBD_-_Adapter_und_App_einrichten&amp;quot;, wt: &amp;quot;Wiki: DeepOBD einrichten&amp;quot; },&lt;br /&gt;
  can:     { t: &amp;quot;CAN-Bus Interface inkl. Anschlusskabel&amp;quot;, d: &amp;quot;Addon, funktioniert nur zusammen mit der I-BUS App bzw. der K-CAN App.&amp;quot;, img: [P.can],&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/interfaces-module/346/can-bus-interface-inkl.-anschlusskabel&amp;quot;,&lt;br /&gt;
             w: WIKI + &amp;quot;Einbauanleitung_CAN-Bus_Interface&amp;quot;, wt: &amp;quot;Einbauanleitung CAN-Bus Interface&amp;quot; },&lt;br /&gt;
  kcan:    { t: &amp;quot;K-CAN App (Beta)&amp;quot;, d: &amp;quot;Pendant zur I-BUS App für Fahrzeuge mit K-CAN, aktuell als Betaversion.&amp;quot;,&lt;br /&gt;
             w: &amp;quot;https://wiki.kcan-app.de/&amp;quot;, wt: &amp;quot;Wiki zur K-CAN App&amp;quot; },&lt;br /&gt;
  kcanlic: { t: &amp;quot;K-CAN App - Lizenz Betaversion&amp;quot;, d: &amp;quot;Beta-Lizenz für die K-CAN App.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/lizenzen/358/k-can-app-lizenz-betaversion&amp;quot; },&lt;br /&gt;
  tpms:    { t: &amp;quot;TPMS - Reifendruckkontrolle&amp;quot;, d: &amp;quot;&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/tpms/&amp;quot; },&lt;br /&gt;
  dab1:    { t: &amp;quot;DAB+ Empfänger inkl. Antenne (Single)&amp;quot;, d: &amp;quot;&amp;quot;, w: &amp;quot;https://xtrons.ibus-app.de/index.php?title=Installation_der_DAB%2B_Antenne&amp;quot;, wt: &amp;quot;Installation der DAB+ Antenne&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/dab/291/dab-empfaenger-inkl.-antenne-usbdab04&amp;quot; },&lt;br /&gt;
  dab2:    { t: &amp;quot;Dual DAB+ Empfänger-Stick inkl. 2 Antennen&amp;quot;, d: &amp;quot;&amp;quot;, w: &amp;quot;https://xtrons.ibus-app.de/index.php?title=Installation_der_DAB%2B_Antenne&amp;quot;, wt: &amp;quot;Installation der DAB+ Antenne&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/dab/391/dual-dab-empfaenger-stick-inkl.-2-antennen-acusbdab05t?c=75&amp;quot; },&lt;br /&gt;
  rcam:    { t: &amp;quot;Rückfahrkamera&amp;quot;, d: &amp;quot;&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/kameras/&amp;quot;, ut: &amp;quot;Kameras im Shop ansehen →&amp;quot; },&lt;br /&gt;
  fcam:    { t: &amp;quot;Front-Kamera&amp;quot;, d: &amp;quot;&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/kameras/&amp;quot;, ut: &amp;quot;Kameras im Shop ansehen →&amp;quot; },&lt;br /&gt;
  tool:    { t: &amp;quot;Einbau-Werkzeug (Kunststoffheber)&amp;quot;, d: &amp;quot;Zum schonenden Lösen der Verkleidungen.&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/einbauwerkzeug/&amp;quot; }&lt;br /&gt;
};&lt;br /&gt;
/* ---- 5) Regeln --------------------------------------------------------------&lt;br /&gt;
   type: need (Das brauchst Du) oder hint (Hinweise)   when = Bedingung auf die Felder&lt;br /&gt;
   opts = diese Zusatzoptionen müssen gewählt sein      items = Artikel   html = Text&lt;br /&gt;
   Abgeleitete Werte: gen (alt/b/c) und module (ja/nein/unk = Radiomodul im Kofferraum, nur gen alt) */&lt;br /&gt;
var RULES = [&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { current: [&amp;quot;werk&amp;quot;], module: [&amp;quot;ja&amp;quot;] }, items: [&amp;quot;exl005&amp;quot;, &amp;quot;fakra6m&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { current: [&amp;quot;nach&amp;quot;], module: [&amp;quot;ja&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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=&amp;quot; + P.noquad + &amp;quot;][img=&amp;quot; + P.noexl6 + &amp;quot;]&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;ja&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;nein&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;unk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { ant: [&amp;quot;iso&amp;quot;] }, items: [&amp;quot;isoada&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { ant: [&amp;quot;unk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Antennenstecker:[/b] [b]BM24[/b] (Rundpin) = ISO-Antennenstecker, ggf. wird der [a=&amp;quot; + SHOP + &amp;quot;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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { sound: [&amp;quot;dsp&amp;quot;] }, items: [&amp;quot;bcdsp&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { sound: [&amp;quot;dsp&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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=&amp;quot; + WIKI + &amp;quot;Habe_ich_DSP%3F]Habe ich DSP?[/a]&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { sound: [&amp;quot;hk&amp;quot;], gen: [&amp;quot;alt&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Harman Kardon:[/b] Benötigt [b]keine[/b] DSP-Lizenz. Das Remote-Signal (+12 V, wenn Radio an) genügt zum Starten.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { aux: [&amp;quot;nein&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]AUX-IN:[/b] Der AUX-IN muss codiert werden. Optional kann ein FM-Transmitter genutzt werden - das ist nicht empfohlen.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;7er-e38&amp;quot;, &amp;quot;x5-e53&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Montage:[/b] Radios für BMW E38/E53 benötigen keine extra Halterungen.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;5er-e39&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;3er-e46&amp;quot;], factory: [&amp;quot;iris&amp;quot;, &amp;quot;mid&amp;quot;, &amp;quot;pfeil&amp;quot;], current: [&amp;quot;werk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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]&amp;quot; +&lt;br /&gt;
          &amp;quot;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]&amp;quot; +&lt;br /&gt;
          &amp;quot;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=&amp;quot; + P.funktr + &amp;quot;]&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { factory: [&amp;quot;cic&amp;quot;, &amp;quot;nbt&amp;quot;, &amp;quot;nbtevo&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Lichtleiter:[/b] Ggf. vorhandene Lichtleiter (MOST) müssen aus dem BMW-Stecker in den Xtrons-Adapter umgesteckt werden.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { factory: [&amp;quot;mask&amp;quot;, &amp;quot;ccc&amp;quot;, &amp;quot;cic&amp;quot;, &amp;quot;nbt&amp;quot;, &amp;quot;nbtevo&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, opts: [&amp;quot;kcan&amp;quot;], when: {},&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, opts: [&amp;quot;ibus&amp;quot;], when: {},&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: {},&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot; }&lt;br /&gt;
];&lt;br /&gt;
/* =====================================================================&lt;br /&gt;
   PROGRAMMLOGIK&lt;br /&gt;
   ===================================================================== */&lt;br /&gt;
var $ = function (id) { return document.getElementById(id); };&lt;br /&gt;
var sel = {}, picked = {}, summary = &amp;quot;&amp;quot;, capA = 0, capB = 0;&lt;br /&gt;
var fieldsEl = $(&amp;quot;nvk-fields&amp;quot;), optsEl = $(&amp;quot;nvk-opts&amp;quot;), outEl = $(&amp;quot;nvk-out&amp;quot;);&lt;br /&gt;
function full(u) { return u.indexOf(&amp;quot;/thumb/&amp;quot;) === -1 ? u : u.replace(&amp;quot;/thumb/&amp;quot;, &amp;quot;/&amp;quot;).replace(/\/[^\/]+$/, &amp;quot;&amp;quot;); }&lt;br /&gt;
function fmt(t) {&lt;br /&gt;
  return t.replace(/\[imgw=([^\x5D]+)\]/g, function (m, u) {&lt;br /&gt;
    return &amp;quot;\u003Ca href=\&amp;quot;&amp;quot; + full(u) + &amp;quot;\&amp;quot; target=\&amp;quot;_blank\&amp;quot; rel=\&amp;quot;noopener\&amp;quot;\u003E\u003Cimg class=\&amp;quot;nvk-img wide\&amp;quot; src=\&amp;quot;&amp;quot; + u + &amp;quot;\&amp;quot; alt=\&amp;quot;\&amp;quot;\u003E\u003C/a\u003E&amp;quot;;&lt;br /&gt;
  }).replace(/\[img=([^\x5D]+)\]/g, function (m, u) {&lt;br /&gt;
    return &amp;quot;\u003Ca href=\&amp;quot;&amp;quot; + full(u) + &amp;quot;\&amp;quot; target=\&amp;quot;_blank\&amp;quot; rel=\&amp;quot;noopener\&amp;quot;\u003E\u003Cimg class=\&amp;quot;nvk-img\&amp;quot; src=\&amp;quot;&amp;quot; + u + &amp;quot;\&amp;quot; alt=\&amp;quot;\&amp;quot;\u003E\u003C/a\u003E&amp;quot;;&lt;br /&gt;
  }).replace(/\[b\]/g, &amp;quot;\u003Cb\u003E&amp;quot;).replace(/\[\/b\]/g, &amp;quot;\u003C/b\u003E&amp;quot;).replace(/\[br\]/g, &amp;quot;\u003Cbr\u003E&amp;quot;)&lt;br /&gt;
    .replace(/\[a=([^\x5D]+)\]/g, &amp;quot;\u003Ca href=\&amp;quot;$1\&amp;quot; target=\&amp;quot;_blank\&amp;quot; rel=\&amp;quot;noopener\&amp;quot;\u003E&amp;quot;).replace(/\[\/a\]/g, &amp;quot;\u003C/a\u003E&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
function match(cond, s, lenient) {&lt;br /&gt;
  if (!cond) return true;&lt;br /&gt;
  for (var k in cond) {&lt;br /&gt;
    if (!s[k]) { if (lenient) continue; return false; }&lt;br /&gt;
    if (cond[k].indexOf(s[k]) === -1) return false;&lt;br /&gt;
  }&lt;br /&gt;
  return true;&lt;br /&gt;
}&lt;br /&gt;
function vehicleOf(id) { return VEHICLES.filter(function (x) { return x.v === id; })[0]; }&lt;br /&gt;
function derive() {&lt;br /&gt;
  var s = {}, k;&lt;br /&gt;
  for (k in sel) s[k] = sel[k];&lt;br /&gt;
  var veh = vehicleOf(sel.vehicle);&lt;br /&gt;
  if (veh) s.gen = veh.gen;&lt;br /&gt;
  if (s.gen === &amp;quot;alt&amp;quot;) {&lt;br /&gt;
    if (s.factory === &amp;quot;n43&amp;quot; || s.factory === &amp;quot;n169&amp;quot;) s.module = &amp;quot;ja&amp;quot;;&lt;br /&gt;
    else if (s.factory === &amp;quot;iris&amp;quot; || s.factory === &amp;quot;mid&amp;quot;) s.module = &amp;quot;nein&amp;quot;;&lt;br /&gt;
    else if (s.factory === &amp;quot;pfeil&amp;quot;) s.module = s.trunk || &amp;quot;unk&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  return s;&lt;br /&gt;
}&lt;br /&gt;
function forced(s) {&lt;br /&gt;
  var f = {};&lt;br /&gt;
  FORCED.forEach(function (r) { if (match(r.when, s)) r.opts.forEach(function (o) { f[o] = r.why; }); });&lt;br /&gt;
  return f;&lt;br /&gt;
}&lt;br /&gt;
function onSet(s) {&lt;br /&gt;
  var f = forced(s), on = {}, k;&lt;br /&gt;
  for (k in picked) if (picked[k]) on[k] = true;&lt;br /&gt;
  for (k in f) on[k] = true;&lt;br /&gt;
  return { on: on, forced: f };&lt;br /&gt;
}&lt;br /&gt;
function optVisible(o, s, on) {&lt;br /&gt;
  if (!match(o.show, s, true)) return false;&lt;br /&gt;
  return (o.requires || []).every(function (r) { return on[r]; });&lt;br /&gt;
}&lt;br /&gt;
FIELDS.forEach(function (f) {&lt;br /&gt;
  var wrap = document.createElement(&amp;quot;div&amp;quot;); wrap.className = &amp;quot;nvk-f&amp;quot;; wrap.id = &amp;quot;nvk-w-&amp;quot; + f.id;&lt;br /&gt;
  var lab = document.createElement(&amp;quot;label&amp;quot;); lab.htmlFor = &amp;quot;nvk-&amp;quot; + f.id; lab.textContent = f.label;&lt;br /&gt;
  var s = document.createElement(&amp;quot;select&amp;quot;); s.id = &amp;quot;nvk-&amp;quot; + f.id;&lt;br /&gt;
  s.addEventListener(&amp;quot;change&amp;quot;, function () { sel[f.id] = s.value; update(); });&lt;br /&gt;
  wrap.appendChild(lab); wrap.appendChild(s);&lt;br /&gt;
  if (f.help) { var h = document.createElement(&amp;quot;div&amp;quot;); h.className = &amp;quot;nvk-help&amp;quot;; h.innerHTML = fmt(f.help); wrap.appendChild(h); }&lt;br /&gt;
  var inf = document.createElement(&amp;quot;div&amp;quot;); inf.id = &amp;quot;nvk-i-&amp;quot; + f.id; wrap.appendChild(inf);&lt;br /&gt;
  fieldsEl.appendChild(wrap);&lt;br /&gt;
});&lt;br /&gt;
function renderFields() {&lt;br /&gt;
  FIELDS.forEach(function (f) {&lt;br /&gt;
    var s = derive();&lt;br /&gt;
    var wrap = $(&amp;quot;nvk-w-&amp;quot; + f.id), el = $(&amp;quot;nvk-&amp;quot; + f.id);&lt;br /&gt;
    var vis = f.show ? match(f.show, s, false) : true;&lt;br /&gt;
    wrap.style.display = vis ? &amp;quot;&amp;quot; : &amp;quot;none&amp;quot;;&lt;br /&gt;
    if (!vis) { sel[f.id] = &amp;quot;&amp;quot;; return; }&lt;br /&gt;
    var allowed = f.values.filter(function (v) { return match(v.only, s, true); });&lt;br /&gt;
    if (sel[f.id]) { if (!allowed.some(function (v) { return v.v === sel[f.id]; })) sel[f.id] = &amp;quot;&amp;quot;; }&lt;br /&gt;
    if (!sel[f.id]) { if (f.def) sel[f.id] = f.def; }&lt;br /&gt;
    if (!sel[f.id]) { if (f.auto) { if (sel.vehicle) { if (allowed.length === 1) sel[f.id] = allowed[0].v; } } }&lt;br /&gt;
    el.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
    if (!f.def) { var p = document.createElement(&amp;quot;option&amp;quot;); p.value = &amp;quot;&amp;quot;; p.textContent = &amp;quot;– bitte wählen –&amp;quot;; el.appendChild(p); }&lt;br /&gt;
    allowed.forEach(function (v) {&lt;br /&gt;
      var o = document.createElement(&amp;quot;option&amp;quot;); o.value = v.v; o.textContent = v.t; el.appendChild(o);&lt;br /&gt;
    });&lt;br /&gt;
    el.value = sel[f.id] || &amp;quot;&amp;quot;;&lt;br /&gt;
    var cur = allowed.filter(function (v) { return v.v === sel[f.id]; })[0];&lt;br /&gt;
    var pre = f.pre ? (match(f.pre.when, s, false) ? fmt(f.pre.html) : &amp;quot;&amp;quot;) : &amp;quot;&amp;quot;;&lt;br /&gt;
    $(&amp;quot;nvk-i-&amp;quot; + f.id).innerHTML = pre + (cur ? (cur.info ? fmt(cur.info) : &amp;quot;&amp;quot;) : &amp;quot;&amp;quot;);&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
function renderOpts() {&lt;br /&gt;
  var s = derive(), st = onSet(s);&lt;br /&gt;
  OPTS.forEach(function (o) { if (!optVisible(o, s, st.on)) picked[o.id] = false; });&lt;br /&gt;
  st = onSet(s);&lt;br /&gt;
  optsEl.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
  OPTS.forEach(function (o) {&lt;br /&gt;
    if (!optVisible(o, s, st.on)) return;&lt;br /&gt;
    var lab = document.createElement(&amp;quot;label&amp;quot;); lab.className = &amp;quot;nvk-o&amp;quot;;&lt;br /&gt;
    var cb = document.createElement(&amp;quot;input&amp;quot;); cb.type = &amp;quot;checkbox&amp;quot;;&lt;br /&gt;
    cb.checked = !!st.on[o.id];&lt;br /&gt;
    var isForced = !!st.forced[o.id];&lt;br /&gt;
    if (isForced) { cb.disabled = true; lab.className += &amp;quot; dis&amp;quot;; }&lt;br /&gt;
    cb.addEventListener(&amp;quot;change&amp;quot;, function () {&lt;br /&gt;
      picked[o.id] = cb.checked;&lt;br /&gt;
      if (cb.checked) { if (o.excl) OPTS.forEach(function (x) { if (x.excl === o.excl) { if (x.id !== o.id) picked[x.id] = false; } }); }&lt;br /&gt;
      update();&lt;br /&gt;
    });&lt;br /&gt;
    lab.appendChild(cb);&lt;br /&gt;
    lab.appendChild(document.createTextNode(&amp;quot; &amp;quot; + o.t));&lt;br /&gt;
    var sub = [o.sub, isForced ? st.forced[o.id] : &amp;quot;&amp;quot;].filter(Boolean).join(&amp;quot; - &amp;quot;);&lt;br /&gt;
    if (sub) { var sm = document.createElement(&amp;quot;small&amp;quot;); sm.textContent = &amp;quot; (&amp;quot; + sub + &amp;quot;)&amp;quot;; lab.appendChild(sm); }&lt;br /&gt;
    optsEl.appendChild(lab);&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
function link(url, text) {&lt;br /&gt;
  var a = document.createElement(&amp;quot;a&amp;quot;); a.href = url; a.target = &amp;quot;_blank&amp;quot;; a.rel = &amp;quot;noopener&amp;quot;; a.textContent = text; return a;&lt;br /&gt;
}&lt;br /&gt;
function card(item, cls) {&lt;br /&gt;
  var d = document.createElement(&amp;quot;div&amp;quot;); d.className = &amp;quot;nvk-card &amp;quot; + (cls || &amp;quot;&amp;quot;) + (item.hl ? &amp;quot; hl&amp;quot; : &amp;quot;&amp;quot;);&lt;br /&gt;
  var b = document.createElement(&amp;quot;b&amp;quot;); b.textContent = item.t; d.appendChild(b);&lt;br /&gt;
  if (item.d) { var p = document.createElement(&amp;quot;span&amp;quot;); p.textContent = item.d; d.appendChild(p); }&lt;br /&gt;
  if (item.img) {&lt;br /&gt;
    var im = document.createElement(&amp;quot;div&amp;quot;);&lt;br /&gt;
    item.img.forEach(function (u) {&lt;br /&gt;
      var a = document.createElement(&amp;quot;a&amp;quot;); a.href = full(u); a.target = &amp;quot;_blank&amp;quot;; a.rel = &amp;quot;noopener&amp;quot;;&lt;br /&gt;
      var g = document.createElement(&amp;quot;img&amp;quot;); g.className = &amp;quot;nvk-img&amp;quot;; g.src = u; g.alt = item.t; a.appendChild(g); im.appendChild(a);&lt;br /&gt;
    });&lt;br /&gt;
    d.appendChild(im);&lt;br /&gt;
  }&lt;br /&gt;
  if (item.u || item.w) {&lt;br /&gt;
    var l = document.createElement(&amp;quot;div&amp;quot;); l.className = &amp;quot;nvk-links&amp;quot;;&lt;br /&gt;
    if (item.u) l.appendChild(link(item.u, item.ut || &amp;quot;Im Shop ansehen →&amp;quot;));&lt;br /&gt;
    if (item.w) l.appendChild(link(item.w, (item.wt || &amp;quot;Zum Wiki&amp;quot;) + &amp;quot; →&amp;quot;));&lt;br /&gt;
    d.appendChild(l);&lt;br /&gt;
  }&lt;br /&gt;
  if (item.links) item.links.forEach(function (x) {&lt;br /&gt;
    var r = document.createElement(&amp;quot;div&amp;quot;); r.className = &amp;quot;nvk-links&amp;quot;; r.appendChild(link(x.u, x.t + &amp;quot; →&amp;quot;)); d.appendChild(r);&lt;br /&gt;
  });&lt;br /&gt;
  return d;&lt;br /&gt;
}&lt;br /&gt;
function heading(txt) { var h = document.createElement(&amp;quot;h3&amp;quot;); h.textContent = txt; outEl.appendChild(h); }&lt;br /&gt;
function renderResult() {&lt;br /&gt;
  var s = derive(), st = onSet(s);&lt;br /&gt;
  var missing = FIELDS.filter(function (f) {&lt;br /&gt;
    var w = $(&amp;quot;nvk-w-&amp;quot; + f.id);&lt;br /&gt;
    return w.style.display !== &amp;quot;none&amp;quot; ? (!f.optional ? !sel[f.id] : false) : false;&lt;br /&gt;
  });&lt;br /&gt;
  outEl.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
  if (missing.length) {&lt;br /&gt;
    var m = document.createElement(&amp;quot;p&amp;quot;); m.className = &amp;quot;nvk-miss&amp;quot;;&lt;br /&gt;
    m.textContent = &amp;quot;Bitte noch auswählen: &amp;quot; + missing.map(function (f) { return f.label; }).join(&amp;quot;, &amp;quot;);&lt;br /&gt;
    outEl.appendChild(m); $(&amp;quot;nvk-form&amp;quot;).style.display = &amp;quot;none&amp;quot;; return;&lt;br /&gt;
  }&lt;br /&gt;
  $(&amp;quot;nvk-form&amp;quot;).style.display = &amp;quot;&amp;quot;;&lt;br /&gt;
  var veh = vehicleOf(sel.vehicle);&lt;br /&gt;
  var ru = veh.noCat ? SHOP + &amp;quot;bmw-radios/&amp;quot; : SHOP + &amp;quot;bmw-radios/&amp;quot; + veh.v + &amp;quot;/&amp;quot;;&lt;br /&gt;
  heading(&amp;quot;Passende Radios&amp;quot;);&lt;br /&gt;
  outEl.appendChild(card({ t: &amp;quot;BMW Radios für &amp;quot; + veh.t, d: &amp;quot;Alle Radios, die für Deinen BMW &amp;quot; + veh.t + &amp;quot; im Shop erhältlich sind.&amp;quot;,&lt;br /&gt;
    u: ru, ut: &amp;quot;Zu den passenden Radios →&amp;quot;, w: SHOP + &amp;quot;bmw-radios/&amp;quot;, wt: &amp;quot;Alle BMW Radios&amp;quot; }, &amp;quot;rad&amp;quot;));&lt;br /&gt;
  var needs = [], hints = [], seen = {};&lt;br /&gt;
  RULES.forEach(function (r) {&lt;br /&gt;
    if (!match(r.when, s)) return;&lt;br /&gt;
    if (r.opts) { if (!r.opts.every(function (o) { return st.on[o]; })) return; }&lt;br /&gt;
    if (r.type === &amp;quot;need&amp;quot;) (r.items || []).forEach(function (id) { if (!seen[id]) { seen[id] = 1; needs.push(ITEMS[id]); } });&lt;br /&gt;
    else hints.push(r.html);&lt;br /&gt;
  });&lt;br /&gt;
  heading(&amp;quot;Das brauchst Du&amp;quot;);&lt;br /&gt;
  if (needs.length) needs.forEach(function (i) { outEl.appendChild(card(i)); });&lt;br /&gt;
  else { var n = document.createElement(&amp;quot;p&amp;quot;); n.textContent = &amp;quot;Für die Grundinstallation sind keine zusätzlichen Verlängerungen oder Adapter nötig.&amp;quot;; outEl.appendChild(n); }&lt;br /&gt;
  var opt = [];&lt;br /&gt;
  OPTS.forEach(function (o) {&lt;br /&gt;
    if (!st.on[o.id]) return;&lt;br /&gt;
    if (!optVisible(o, s, st.on)) return;&lt;br /&gt;
    o.items.forEach(function (id) {&lt;br /&gt;
      if (seen[id]) return;&lt;br /&gt;
      var sk = ITEMS[id].skipIf;&lt;br /&gt;
      if (sk) { if (seen[sk]) return; }&lt;br /&gt;
      seen[id] = 1; opt.push(ITEMS[id]);&lt;br /&gt;
    });&lt;br /&gt;
  });&lt;br /&gt;
  if (opt.length) { heading(&amp;quot;Deine Zusatzoptionen&amp;quot;); opt.forEach(function (i) { outEl.appendChild(card(i, &amp;quot;opt&amp;quot;)); }); }&lt;br /&gt;
  if (hints.length) {&lt;br /&gt;
    heading(&amp;quot;Hinweise&amp;quot;);&lt;br /&gt;
    hints.forEach(function (t) { var d = document.createElement(&amp;quot;div&amp;quot;); d.className = &amp;quot;nvk-note&amp;quot;; d.innerHTML = fmt(t); outEl.appendChild(d); });&lt;br /&gt;
  }&lt;br /&gt;
  var L = [&amp;quot;KONFIGURATION&amp;quot;];&lt;br /&gt;
  FIELDS.forEach(function (f) {&lt;br /&gt;
    if (!sel[f.id]) return;&lt;br /&gt;
    var v = f.values.filter(function (x) { return x.v === sel[f.id]; })[0];&lt;br /&gt;
    if (v) L.push(&amp;quot;- &amp;quot; + f.label + &amp;quot;: &amp;quot; + v.t);&lt;br /&gt;
  });&lt;br /&gt;
  L.push(&amp;quot;&amp;quot;, &amp;quot;BENÖTIGT&amp;quot;);&lt;br /&gt;
  needs.forEach(function (i) { L.push(&amp;quot;- &amp;quot; + i.t + (i.u ? &amp;quot;  &amp;quot; + i.u : &amp;quot;&amp;quot;)); });&lt;br /&gt;
  if (opt.length) { L.push(&amp;quot;&amp;quot;, &amp;quot;ZUSATZOPTIONEN&amp;quot;); opt.forEach(function (i) { L.push(&amp;quot;- &amp;quot; + i.t + (i.u ? &amp;quot;  &amp;quot; + i.u : &amp;quot;&amp;quot;)); }); }&lt;br /&gt;
  L.push(&amp;quot;&amp;quot;, &amp;quot;Radios: &amp;quot; + ru);&lt;br /&gt;
  summary = L.join(&amp;quot;\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
function update() { renderFields(); renderOpts(); renderResult(); }&lt;br /&gt;
function newCaptcha() {&lt;br /&gt;
  capA = 1 + Math.floor(Math.random() * 9); capB = 1 + Math.floor(Math.random() * 9);&lt;br /&gt;
  $(&amp;quot;nvk-capq&amp;quot;).textContent = &amp;quot;Sicherheitsfrage: Was ist &amp;quot; + capA + &amp;quot; + &amp;quot; + capB + &amp;quot;? *&amp;quot;; $(&amp;quot;nvk-cap&amp;quot;).value = &amp;quot;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
function status(msg, ok) { var e = $(&amp;quot;nvk-status&amp;quot;); e.style.display = &amp;quot;&amp;quot;; e.textContent = msg; e.style.borderLeftColor = ok ? &amp;quot;#14866d&amp;quot; : &amp;quot;#d33&amp;quot;; }&lt;br /&gt;
$(&amp;quot;nvk-send&amp;quot;).addEventListener(&amp;quot;click&amp;quot;, function () {&lt;br /&gt;
  var name = $(&amp;quot;nvk-name&amp;quot;).value.trim(), mail = $(&amp;quot;nvk-mail&amp;quot;).value.trim(), vin = $(&amp;quot;nvk-vin&amp;quot;).value.trim().toUpperCase(), msg = $(&amp;quot;nvk-msg&amp;quot;).value.trim();&lt;br /&gt;
  if (!name || !mail || !msg) return status(&amp;quot;Bitte Name, E-Mail und Kommentar ausfüllen.&amp;quot;, false);&lt;br /&gt;
  if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(mail)) return status(&amp;quot;Bitte eine gültige E-Mail-Adresse eingeben.&amp;quot;, false);&lt;br /&gt;
  if (vin) { if (!/^[A-Z]{2}[0-9]{5}$/.test(vin)) { if (!/^[A-HJ-NPR-Z0-9]{17}$/.test(vin)) return status(&amp;quot;Bitte die VIN im Format AB12345 oder die 17-stellige FGN eingeben - oder das Feld leer lassen.&amp;quot;, false); } }&lt;br /&gt;
  if (parseInt($(&amp;quot;nvk-cap&amp;quot;).value, 10) !== capA + capB) return status(&amp;quot;Die Sicherheitsfrage wurde nicht richtig beantwortet.&amp;quot;, false);&lt;br /&gt;
  if (!$(&amp;quot;nvk-dsgvo&amp;quot;).checked) return status(&amp;quot;Bitte der Verarbeitung Deiner Daten zustimmen.&amp;quot;, false);&lt;br /&gt;
  if ($(&amp;quot;nvk-hp&amp;quot;).value) return;&lt;br /&gt;
  var sz = $(&amp;quot;nvk-size&amp;quot;).value;&lt;br /&gt;
  var sum2 = summary + (sz ? &amp;quot;\n\nGewünschte Displaygröße: &amp;quot; + sz : &amp;quot;&amp;quot;);&lt;br /&gt;
  var text = &amp;quot;Name: &amp;quot; + name + &amp;quot;\nE-Mail: &amp;quot; + mail + &amp;quot;\nVIN: &amp;quot; + (vin || &amp;quot;-&amp;quot;) + &amp;quot;\n\nKommentar:\n&amp;quot; + msg + &amp;quot;\n\n&amp;quot; + sum2;&lt;br /&gt;
  if (SEND_URL) {&lt;br /&gt;
    var p = new URLSearchParams();&lt;br /&gt;
    p.append(&amp;quot;name&amp;quot;, name); p.append(&amp;quot;mail&amp;quot;, mail); p.append(&amp;quot;vin&amp;quot;, vin); p.append(&amp;quot;msg&amp;quot;, msg); p.append(&amp;quot;summary&amp;quot;, sum2);&lt;br /&gt;
    p.append(&amp;quot;hp&amp;quot;, $(&amp;quot;nvk-hp&amp;quot;).value); p.append(&amp;quot;ca&amp;quot;, capA); p.append(&amp;quot;cb&amp;quot;, capB); p.append(&amp;quot;cv&amp;quot;, $(&amp;quot;nvk-cap&amp;quot;).value);&lt;br /&gt;
    fetch(SEND_URL, { method: &amp;quot;POST&amp;quot;, body: p }).then(function (r) {&lt;br /&gt;
      if (!r.ok) throw new Error(&amp;quot;send&amp;quot;);&lt;br /&gt;
      status(&amp;quot;Danke! Deine Anfrage wurde gesendet, eine Kopie geht an &amp;quot; + mail + &amp;quot;.&amp;quot;, true); newCaptcha();&lt;br /&gt;
    }).catch(function () { status(&amp;quot;Das Senden hat nicht geklappt. Bitte versuche es später noch einmal oder schreibe direkt an &amp;quot; + MAIL_TO + &amp;quot;.&amp;quot;, false); });&lt;br /&gt;
  } else {&lt;br /&gt;
    var AMP = &amp;quot;\u0026&amp;quot;;&lt;br /&gt;
    window.location.href = &amp;quot;mailto:&amp;quot; + MAIL_TO + &amp;quot;?cc=&amp;quot; + encodeURIComponent(mail) + AMP + &amp;quot;subject=&amp;quot; + encodeURIComponent(MAIL_SUBJECT) + AMP + &amp;quot;body=&amp;quot; + encodeURIComponent(text);&lt;br /&gt;
    status(&amp;quot;Dein E-Mail-Programm wurde mit der fertigen Anfrage geöffnet. Bitte dort noch auf Senden klicken.&amp;quot;, true);&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
$(&amp;quot;nvk-reset&amp;quot;).addEventListener(&amp;quot;click&amp;quot;, function () { sel = {}; picked = {}; update(); });&lt;br /&gt;
newCaptcha();&lt;br /&gt;
update();&lt;br /&gt;
})();&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andre</name></author>
	</entry>
	<entry>
		<id>https://xtrons.ibus-app.de/index.php?title=Hauptseite&amp;diff=4088</id>
		<title>Hauptseite</title>
		<link rel="alternate" type="text/html" href="https://xtrons.ibus-app.de/index.php?title=Hauptseite&amp;diff=4088"/>
		<updated>2026-10-21T12:58:35Z</updated>

		<summary type="html">&lt;p&gt;Andre: /* Neu hier? Das musst Du wissen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''Willkommen im Wiki rund um Android-Navis, insbesondere für BMW E38/E39/E46/E53'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;Hier findet ihr eine Übersicht an empfohlenen Radios, Einbauanleitungen, Adapter, Firmware (Updates), Apps, Modifikationen sowie Tipps und Tricks &amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
=== &amp;lt;big&amp;gt;Alle Informationen zur I-Bus App&amp;lt;/big&amp;gt; ===&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
* '''&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;[http://www.ibus-app.de/ BMW I-BUS App Homepage]&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;'''&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* '''&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;[http://wiki.ibus-app.de/ Wiki zur BMW I-BUS App]&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;'''&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* '''&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;[https://www.facebook.com/groups/1954844871468973/ BMW Xtrons, AVIN und I-BUS Android App - Facebook Gruppe]&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;'''&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* '''&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;[https://forum.ibus-app.de/ I-BUS App Forum]&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;'''&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;big&amp;gt;Neu hier? Das musst Du wissen&amp;lt;/big&amp;gt; ===&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''[[Android Radio Konfigurator]]'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''[[Was brauche ich um meinen BMW E38/E39/E46/E53 auf ein Android-Navi umzurüsten?]]'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;big&amp;gt;Empfohlene Radiomodelle&amp;lt;/big&amp;gt; ===&lt;br /&gt;
* &amp;lt;big&amp;gt;&amp;lt;big&amp;gt;[[aktuelle Xtrons-Radiomodelle|'''aktuelle Xtrons-Radiomodelle + Zubehör''']]&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
*&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;[[aktuelle AVIN-Radiomodelle|aktuelle '''AVIN'''-Radiomodelle + Zubehör]]&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
** [https://help.avinusa.com/en/article/ibus-bmw-app-install-update-guide-dl24h0/ Anschlüsse, Hilfe und FAQ von AVIN (Englisch)]&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;'''!ACHTUNG! [[Anschlussfehler CAN-BUS Box und Zündungssignal]]''' (AVIN Avant 4, Xtrons MA-, IA-, PQS-, IQ-, IX- und PX-Serie - '''außer IQ..IBUS''')&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;'''[[Xtrons IX-Serie|Einstellungen und Tipps für Xtrons IX- und PX-Serie]]'''&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;'''[[Xtrons IQ-IBUS-Serie|Einstellungen und Tipps für Xtrons IQ-Serie für IBUS]]'''&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''[[Entscheidungshilfe: AVIN oder XTRONS?|Entscheidungshilfe: XTRONS oder AVIN?]]'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* [[Warum ein Xtrons-Radio? Geht nicht auch Eonon, Erisin, Pumpkin,.. ?|Warum ein AVIN oder Xtrons Radio? Geht nicht auch Eonon, Erisin, Pumpkin, MyRadical, HIZPO, XOMAX, .. ?]]&lt;br /&gt;
* [[Warum nur empfohlene Android-Radios kaufen?]]&lt;br /&gt;
* &amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''[[grobe Kostenübersicht|grobe Kostenübersicht / Einkaufsliste]]'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;big&amp;gt;Zubehör&amp;lt;/big&amp;gt; ===&lt;br /&gt;
* [https://wiki.ibus-app.de/index.php?title=Was_brauche_ich_um_die_I-BUS_App_nutzen_zu_k%C3%B6nnen%3F &amp;lt;big&amp;gt;'''Was brauche ich um die I-BUS App nutzen zu können? =&amp;gt; BC erhalten, Uhr stellen, Standheizung weiter nutzen,..'''&amp;lt;/big&amp;gt;]&lt;br /&gt;
* [[Warum empfehlen wir nur das &amp;quot;Resler-USB-Interface&amp;quot;/&amp;quot;Resler Modul&amp;quot; und kein anderes Interface?]]&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;'''[[Apple Carplay &amp;amp; Android Auto]]'''&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;'''[[OBD2 Diagnose]]'''&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;'''[[DAB+]]'''&amp;lt;/big&amp;gt;&lt;br /&gt;
* [[Installation der DAB+ Antenne]]&lt;br /&gt;
* [[Splitter für DAB+ zur Nutzung der OEM-Scheibenantennen]]&lt;br /&gt;
* [[DAB Antenne Empfang verbessern|DAB Antenne Empfang verbessern/Kalte Lötstelle im DAB+ Stick reparieren]]&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;'''[[TPMS - Reifendruckkontrolle]]'''&amp;lt;/big&amp;gt;&lt;br /&gt;
* [[Installations TPMS App (Reifenluftdruck)]]&lt;br /&gt;
* [[TPMS Sensoren anlernen]]&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;'''[https://shop.ibus-app.de/detail/index/sArticle/249 Quadlock-Adapter mit Rauschunterdrückung]'''&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* [[Übersicht 3G/4G Internetsticks]]&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* [[Aktiver USB-HUB, USB-Ladedose im Handschuhfach nachrüsten (z.B. für 3G/4G-Stick)]]&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;'''[[Anschluss Rückfahrkamera]]'''&amp;lt;/big&amp;gt;&lt;br /&gt;
* [[Rückfahrkamera mit Taster für E39/E46 touring|Rückfahrkamera mit Taster für E39/E46 touring und E38]] (Fa. Höfig)&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* [[NBT iDrive mit Xtrons]] (Yam Droid)&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;big&amp;gt;Firmware und Bedienanleitung&amp;lt;/big&amp;gt; ===&lt;br /&gt;
* '''&amp;lt;big&amp;gt;[[aktuelle Firmware]]&amp;lt;/big&amp;gt;''' (AAS, AVIN, Xtrons: PX3/PX30/PX5/PX6/Qualcomm - Hal9k und Malaysk ROM, MCU Updates,..)&lt;br /&gt;
* '''&amp;lt;big&amp;gt;[[Firmware]]&amp;lt;/big&amp;gt;''' (für E6x/E7x/E9x/..)&lt;br /&gt;
* Wie funktioniert ein [[Firmwareupdate]]&lt;br /&gt;
* [https://xtrons.ibus-app.de/index.php?title=Aktuelle_Firmware#Welche_MCU_und_Firmware-Version_habe_ich_installiert.3F Welche MCU und Firmware-Version habe ich installiert?]&lt;br /&gt;
* '''[[Bedienanleitung]]'''&lt;br /&gt;
* [[Wie kommt man ins Recovery Menü?]]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;big&amp;gt;Montageanleitungen / Adapter&amp;amp;Verlängerungen / PIN Belegungen ..&amp;lt;/big&amp;gt; ===&lt;br /&gt;
* '''[[Montageanleitungen]]'''&lt;br /&gt;
* &amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''[[Adapter und Verlängerungen]]'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
* [[Anpassung der Montagewinkel]]&lt;br /&gt;
* [[Alternative zu den beigelegten Montagewinkeln|Alternative zu den beigelegten Montagewinkeln/Haltern]] (Nur BMW E39)&lt;br /&gt;
* [https://www.google.com/maps/d/viewer?mid=1TMCVoZn225Aqsg4H_aoXpDr7aJ0&amp;amp;ll=42.757111958542374%2C-35.38434504999998&amp;amp;z=4 Übersichtskarte: Einbauhelfer]&lt;br /&gt;
* [[Was bleibt beim Umbau im Wagen und was fliegt raus?]]&lt;br /&gt;
* [[Installation der DAB+ Antenne]] &lt;br /&gt;
* [[PIN-Belegung Xtrons - Radiostecker - CAN-BUS-Box|PIN-Belegung Xtrons - Radiostecker - CAN-BUS-Box // Anschlussplan Radio / Steckerübersicht]]&lt;br /&gt;
* [https://wiki.ibus-app.de/index.php?title=Einbauanleitung_f%C3%BCr_Resler_Modul_und_Resler_Interface Einbauanleitung für Resler Modul und Resler Interface]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;big&amp;gt;Modifikationen / Anpassungen / Einstellungen&amp;lt;/big&amp;gt; ===&lt;br /&gt;
* [[Radiosender dauerhaft speichern/Verlust der Radiostationen bei Neustart oder spannungsfreiem Radio vermeiden]]&lt;br /&gt;
&lt;br /&gt;
* [[Änderung der Tasten-Beleuchtungsfarbe]]&lt;br /&gt;
&lt;br /&gt;
* [[Tastenbeleuchtung abdimmbar machen]] (nur für ältere Xtrons)&lt;br /&gt;
&lt;br /&gt;
* [http://download.speedy-pics.de/uploads/safe/dritte_usb-buchse_xtrons-pb7639bap.pdf Dritte USB-Buchse nachrüsten]&lt;br /&gt;
&lt;br /&gt;
* [[Bootlogo ändern]]&lt;br /&gt;
&lt;br /&gt;
* [[Einstellungen: Uhrzeit / Video während der Fahrt / Reverse Reduktion / ..]]&lt;br /&gt;
&lt;br /&gt;
* [http://download.speedy-pics.de/uploads/weblink/Tastenbelegung_aendern_mtctools.pdf Tastenbelegung mit MTCD-Tools ändern] '''(Bedarf eines Roots, oder Malaysk-ROM!!!)'''&lt;br /&gt;
&lt;br /&gt;
* [[Tastenbelegung OHNE Root ändern - MTC-Tools]]&lt;br /&gt;
&lt;br /&gt;
* [[Tastenbelegung OHNE Root ändern|Tastenbelegung OHNE Root ändern - Xtrons PB-, PQ-, PQS-, IQ-Serie u.ä.]]&lt;br /&gt;
&lt;br /&gt;
* [http://download.speedy-pics.de/uploads/weblink/XTRONS_Tastenbelegung-aendern.pdf Radio-Tastenbelegung ändern] '''Root/[[Aktuelle Firmware|Malaysk]] erforderlich!'''&lt;br /&gt;
&lt;br /&gt;
* [[Root für Android 8 (MTCD oder MTCE Geräte mit PX5 2gb oder 4gb Ram)]]&lt;br /&gt;
&lt;br /&gt;
* [[Equalizer-Modifikation für PX3/PX5 Radios - Sound-Mod]]&lt;br /&gt;
&lt;br /&gt;
* [[DSP-Equalizer-Modifikation für Radios mit internem DSP]] (z.b. AAS, AVIN,..)&lt;br /&gt;
&lt;br /&gt;
* [[DSP-Chip im Radio nachrüsten]]&lt;br /&gt;
&lt;br /&gt;
* [[Was ist DSP? Digitaler Soundprozessor|Was ist DSP? Digitaler Soundprozessor // DSP Nachrüstlösungen]]&lt;br /&gt;
&lt;br /&gt;
* [[Kein WLAN/USB/Bluetooth wenn es kalt ist|Kein WLAN / USB / Bluetooth wenn es kalt ist]]''' (Diese Lösung benötigt ein gerootetes Android!''')&lt;br /&gt;
&lt;br /&gt;
* [[DAB Antenne Empfang verbessern|DAB Antenne Empfang verbessern/Kalte Lötstelle im DAB+ Stick reparieren]]&lt;br /&gt;
&lt;br /&gt;
* [[Lüfter/Kühlkörper nachrüsten|CPU/Prozessor wird zu heiß: Lüfter/Kühlkörper nachrüsten]]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;big&amp;gt;Tipps/Reparaturen&amp;lt;/big&amp;gt; ===&lt;br /&gt;
* [[Abschalten des schwarzen Bildschirms (Rückfahrkamera) beim Einlegen des Rückwärtsganges]][[Datei:Back.jpg|100px|miniatur|ohne]]&lt;br /&gt;
* '''[[Kein Ton nach Radio-Einbau]] (DSP und Remote für Hifi-Endstufe/schlechter Radioempfang )'''&lt;br /&gt;
* '''[[Das Radio/Navi geht nicht (mehr) an. Kein Bild. Kein Ton|Das Radio / Navi geht nicht (mehr) an. Kein Bild. Kein Ton]]'''&lt;br /&gt;
* [https://youtu.be/EUKq-B06gg0?t=467 Xtrons PQS-/IQ-Serie und AVIN: Zündungssignal von CAN BUS Box auf Radiostecker umstecken]&lt;br /&gt;
* [http://download.speedy-pics.de/uploads/weblink/OBD02-Connection-Guide.pdf OBD-Interface einrichten für Torque] [english]&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''[[DeepOBD - Adapter und App einrichten|DeepOBD - Adapter und App einrichten und mit der I-BUS App verbinden]]'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
* [http://download.speedy-pics.de/uploads/weblink/obd1-obd2.pdf Nachrüstung oder Vervollständigung der OBD2 Diagnose Buchse &amp;lt;small&amp;gt;(V1.3   2021-02-27)&amp;lt;/small&amp;gt;] [BMW E38/E39/E46]&lt;br /&gt;
* [https://www.youtube.com/watch?v=kWKcWBMESDQ Install wire bridge on OBD1 cap board to fully access OBD2 diagnostics in the cabin] [BMW E38/E39/E46 - with both: OBD1 + OBD2]&lt;br /&gt;
* [[Reparatur bei Ausfall Tastenbeleuchtung am Radio oder Funktionsstörung der Knöpfe/Drehregler]]&lt;br /&gt;
* [[Entstörkondensator einbauen - E39 525d und 530d]] (LiMa Pfeiffen beheben)&lt;br /&gt;
* [http://download.speedy-pics.de/uploads/safe/eba_oem-mikro%20mit%20xtrons.pdf?fbclid=IwAR3GnAlWntSKKQ0132B2H0u7R8MoPnJVYNcXgRhZ9JLUeR8H8MLGakVoIHU EBA OEM Mikro BMW E39 als externes Mikro]  Danke Mirko&lt;br /&gt;
* Ersatzmikrofon in originale Halterung im Himmel: [https://kufatec.com/de/kufatec-fiscon-mikrofon-fuer-die-bmw-mini-deckenleuchte/36338-5 Kufatec 36338-5]&lt;br /&gt;
* [[iPhone / iOS ab Version 13: Kontakte frei geben / Hotspot sichtbar schalten|iPhone / iOS ab Version 13: Kontakte frei geben / Hotspot sichtbar schalten / Umschalten zw. 5GHz und 2,4GHz]]&lt;br /&gt;
* [[Persönlicher Hotspot funktioniert nicht auf dem iPhone]]&lt;br /&gt;
* [[Kontakte synchronisieren mit iPhone (via Bluetooth)]]&lt;br /&gt;
* [[Wie kommt man ins Recovery Menü?]]&lt;br /&gt;
* [[Passwort für Werkseinstellungen|Passwort / Code für Werkseinstellungen]]&lt;br /&gt;
* [https://bbs.xtrons.com/viewtopic.php?f=41&amp;amp;t=582983 BMW E6x/E9x/E70 etc - kein Ton nach Installation eines Android Radios (AUX-in)]&lt;br /&gt;
* [[Verbesserung Radioempfang für Audi/VW/Seat/Skoda mit Phantomspeisung]]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;big&amp;gt;Apps&amp;lt;/big&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;[[App-Link Sammlung]]&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;'''[https://idrive.ibus-app.de/ iDrive Launcher]'''&amp;lt;/big&amp;gt;&lt;br /&gt;
* [https://www.media-broadcast.com/hoerfunk/dabplus-logo-service/ Download DAB+ Logos], alternativ: [https://www.seat.de/content/dam/countries/de/seat-website/download/senderlogos/senderlogos.zip Download DAB+ Logos]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;big&amp;gt; Bugs &amp;amp; Fehler &amp;lt;/big&amp;gt;===&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* [[Liste über Bugs &amp;amp; Fehler]]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;big&amp;gt;ToDo-Liste&amp;lt;/big&amp;gt; ===&lt;br /&gt;
* [[ToDo-Liste]]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Spenden ===&lt;br /&gt;
&lt;br /&gt;
Wenn Ihnen unser Wiki/unsere App gefallen und Sie uns unterstützen möchten, würden wir uns über eine [https://ibus-app.de/spenden Spende] freuen.&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Datei:Paypal-logo.png|rahmenlos|link=https://ibus-app.de/spenden]]&lt;/div&gt;</summary>
		<author><name>Andre</name></author>
	</entry>
	<entry>
		<id>https://xtrons.ibus-app.de/index.php?title=Android_Radio_Konfigurator&amp;diff=4087</id>
		<title>Android Radio Konfigurator</title>
		<link rel="alternate" type="text/html" href="https://xtrons.ibus-app.de/index.php?title=Android_Radio_Konfigurator&amp;diff=4087"/>
		<updated>2026-10-21T12:37:49Z</updated>

		<summary type="html">&lt;p&gt;Andre: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt; '''Mit diesem Tool kann auf Basis von Fahrzeug und vorhandenen Komponenten eine Liste nötiger Komponenten erstellt werden.&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;big&amp;gt;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.&amp;lt;br&amp;gt;'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
#nvk{max-width:900px;line-height:1.45}&lt;br /&gt;
#nvk *{box-sizing:border-box}&lt;br /&gt;
#nvk .nvk-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:14px;margin:12px 0}&lt;br /&gt;
#nvk .nvk-f label{display:block;font-weight:700;margin-bottom:4px}&lt;br /&gt;
#nvk select{width:100%;padding:9px 8px;font:inherit;color:#202122;background:#fff;border:1px solid #a2a9b1;border-radius:4px}&lt;br /&gt;
#nvk .nvk-help{font-size:.85em;opacity:.75;margin-top:3px}&lt;br /&gt;
#nvk fieldset{border:1px solid rgba(128,128,128,.45);border-radius:6px;padding:10px 14px;margin:14px 0}&lt;br /&gt;
#nvk legend{font-weight:700;padding:0 6px}&lt;br /&gt;
#nvk .nvk-o{display:block;padding:4px 0;cursor:pointer}&lt;br /&gt;
#nvk .nvk-o small{opacity:.7}&lt;br /&gt;
#nvk .nvk-o.dis{opacity:.75;cursor:default}&lt;br /&gt;
#nvk .nvk-btn{padding:7px 14px;font:inherit;border:1px solid #a2a9b1;border-radius:4px;background:#f8f9fa;color:#202122;cursor:pointer}&lt;br /&gt;
#nvk #nvk-out{margin-top:18px}&lt;br /&gt;
#nvk h3{margin:18px 0 8px}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-card.opt{border-left-color:#14866d}&lt;br /&gt;
#nvk .nvk-card.rad{border-left-color:#fff;background:rgba(255,255,255,.08)}&lt;br /&gt;
#nvk .nvk-card b{display:block}&lt;br /&gt;
#nvk .nvk-links{margin-top:4px;font-weight:600}&lt;br /&gt;
#nvk .nvk-links a{margin-right:14px}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-miss{opacity:.8;font-style:italic}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-card .nvk-img{max-width:230px;max-height:150px}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-card.hl{border:2px solid #36c;border-left-width:8px;background:rgba(51,102,204,.12);padding:12px 14px}&lt;br /&gt;
#nvk .nvk-card.hl b{font-size:1.1em}&lt;br /&gt;
#nvk .nvk-img.wide{max-width:min(100%,460px);max-height:none}&lt;br /&gt;
#nvk #nvk-form{margin-top:22px}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-grid&amp;quot; id=&amp;quot;nvk-fields&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;fieldset id=&amp;quot;nvk-optset&amp;quot;&amp;gt;&amp;lt;legend&amp;gt;Zusatzoptionen&amp;lt;/legend&amp;gt;&amp;lt;div id=&amp;quot;nvk-opts&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/fieldset&amp;gt;&lt;br /&gt;
&amp;lt;button type=&amp;quot;button&amp;quot; class=&amp;quot;nvk-btn&amp;quot; id=&amp;quot;nvk-reset&amp;quot;&amp;gt;Auswahl zurücksetzen&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk-out&amp;quot; aria-live=&amp;quot;polite&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;fieldset id=&amp;quot;nvk-form&amp;quot; style=&amp;quot;display:none&amp;quot;&amp;gt;&amp;lt;legend&amp;gt;Anfrage senden&amp;lt;/legend&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;nvk-help&amp;quot;&amp;gt;Deine Auswahl und die Liste oben werden automatisch mitgesendet. Alle Felder mit * sind Pflicht.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-grid&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-name&amp;quot;&amp;gt;Name *&amp;lt;/label&amp;gt;&amp;lt;input id=&amp;quot;nvk-name&amp;quot; type=&amp;quot;text&amp;quot; autocomplete=&amp;quot;name&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-mail&amp;quot;&amp;gt;E-Mail *&amp;lt;/label&amp;gt;&amp;lt;input id=&amp;quot;nvk-mail&amp;quot; type=&amp;quot;email&amp;quot; autocomplete=&amp;quot;email&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-size&amp;quot;&amp;gt;Gewünschte Displaygröße (optional)&amp;lt;/label&amp;gt;&amp;lt;select id=&amp;quot;nvk-size&amp;quot;&amp;gt;&amp;lt;option value=&amp;quot;&amp;quot;&amp;gt;Keine Angabe / Beratung gewünscht&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;7&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;8.8&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;9&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;10.25&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;12.3&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;14.9&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;Andere Größe (bitte im Kommentar nennen)&amp;lt;/option&amp;gt;&amp;lt;/select&amp;gt;&amp;lt;div class=&amp;quot;nvk-help&amp;quot;&amp;gt;Diagonale in Zoll. Nicht jede Größe gibt es für jede Baureihe, das prüfen wir für Dich.&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-vin&amp;quot;&amp;gt;VIN oder FGN (optional)&amp;lt;/label&amp;gt;&amp;lt;input id=&amp;quot;nvk-vin&amp;quot; type=&amp;quot;text&amp;quot; maxlength=&amp;quot;17&amp;quot; placeholder=&amp;quot;AB12345 oder 17-stellige FGN&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-msg&amp;quot;&amp;gt;Kommentar *&amp;lt;/label&amp;gt;&amp;lt;textarea id=&amp;quot;nvk-msg&amp;quot; rows=&amp;quot;4&amp;quot;&amp;gt;&amp;lt;/textarea&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot; style=&amp;quot;max-width:300px&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-cap&amp;quot; id=&amp;quot;nvk-capq&amp;quot;&amp;gt;Sicherheitsfrage *&amp;lt;/label&amp;gt;&amp;lt;input id=&amp;quot;nvk-cap&amp;quot; type=&amp;quot;text&amp;quot; inputmode=&amp;quot;numeric&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;input id=&amp;quot;nvk-hp&amp;quot; type=&amp;quot;text&amp;quot; tabindex=&amp;quot;-1&amp;quot; autocomplete=&amp;quot;off&amp;quot; aria-hidden=&amp;quot;true&amp;quot; style=&amp;quot;position:absolute;left:-9999px;width:1px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;label class=&amp;quot;nvk-o&amp;quot;&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; id=&amp;quot;nvk-dsgvo&amp;quot;&amp;gt; Ich stimme zu, dass meine Angaben zur Bearbeitung der Anfrage per E-Mail verarbeitet werden. *&amp;lt;/label&amp;gt;&lt;br /&gt;
&amp;lt;button type=&amp;quot;button&amp;quot; class=&amp;quot;nvk-btn&amp;quot; id=&amp;quot;nvk-send&amp;quot;&amp;gt;Anfrage senden&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk-status&amp;quot; class=&amp;quot;nvk-note&amp;quot; style=&amp;quot;display:none&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/fieldset&amp;gt;&lt;br /&gt;
&amp;lt;noscript&amp;gt;Für den Konfigurator wird JavaScript benötigt.&amp;lt;/noscript&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
(function () {&lt;br /&gt;
&amp;quot;use strict&amp;quot;;&lt;br /&gt;
/* =====================================================================&lt;br /&gt;
   KONFIGURATION - hier wird gepflegt.&lt;br /&gt;
   Textformat in Hinweisen: [b]fett[/b]  [br] Zeilenumbruch  [a=URL]Linktext[/a]&lt;br /&gt;
   Bitte im Skript KEIN kaufmännisches Und, kein Kleiner-/Größer-Zeichen&lt;br /&gt;
   und keine Leerzeilen verwenden (das Wiki wandelt sie um).&lt;br /&gt;
   ===================================================================== */&lt;br /&gt;
var SHOP = &amp;quot;https://shop.ibus-app.de/&amp;quot;;&lt;br /&gt;
var WIKI = &amp;quot;https://wiki.ibus-app.de/index.php?title=&amp;quot;;&lt;br /&gt;
/* Bilder aus dem Wiki (Thumbnail-Adressen; Klick öffnet automatisch das Originalbild) */&lt;br /&gt;
var IM = &amp;quot;https://xtrons.ibus-app.de/images/thumb/&amp;quot;;&lt;br /&gt;
var P = {&lt;br /&gt;
  schema:  IM + &amp;quot;e/ea/BMW_E39_Verl%C3%A4ngerungen_EXL005%2BFAKRA_.png/135px-BMW_E39_Verl%C3%A4ngerungen_EXL005%2BFAKRA_.png&amp;quot;,&lt;br /&gt;
  exl005:  IM + &amp;quot;7/70/Exl005-1.webp/257px-Exl005-1.webp.png&amp;quot;,&lt;br /&gt;
  fakra6m: IM + &amp;quot;d/d8/FM-extension_01_1.png/270px-FM-extension_01_1.png&amp;quot;,&lt;br /&gt;
  isofakra: IM + &amp;quot;4/4e/ISO-FAKRA_1.png/270px-ISO-FAKRA_1.png&amp;quot;,&lt;br /&gt;
  bm24:    IM + &amp;quot;8/82/BM24.png/130px-BM24.png&amp;quot;,&lt;br /&gt;
  iso:     IM + &amp;quot;d/dd/Iso.jpg/69px-Iso.jpg&amp;quot;,&lt;br /&gt;
  bm54:    IM + &amp;quot;3/34/BM54.png/135px-BM54.png&amp;quot;,&lt;br /&gt;
  fakra:   IM + &amp;quot;b/b3/Fakra.jpg/100px-Fakra.jpg&amp;quot;,&lt;br /&gt;
  pfeil:   IM + &amp;quot;e/ee/Navi_E46.jpg/239px-Navi_E46.jpg&amp;quot;,&lt;br /&gt;
  noquad:  IM + &amp;quot;6/68/No_elongation.jpg/180px-No_elongation.jpg&amp;quot;,&lt;br /&gt;
  noexl6:  IM + &amp;quot;7/7b/No_EXL006.jpg/180px-No_EXL006.jpg&amp;quot;,&lt;br /&gt;
  halter:  IM + &amp;quot;3/3b/Halter_Alu.webp/92px-Halter_Alu.webp.png&amp;quot;,&lt;br /&gt;
  deepobd: &amp;quot;https://xtrons.ibus-app.de/images/d/d4/DeepOBD_Interface_1.png&amp;quot;,&lt;br /&gt;
  n43:     IM + &amp;quot;e/e4/Navi4_3.jpg/240px-Navi4_3.jpg&amp;quot;,&lt;br /&gt;
  n169:    IM + &amp;quot;8/8a/Navi16_9.jpg/240px-Navi16_9.jpg&amp;quot;,&lt;br /&gt;
  radio:   IM + &amp;quot;9/96/E39_Radio.jpg/240px-E39_Radio.jpg&amp;quot;,&lt;br /&gt;
  idrive:  &amp;quot;https://xtrons.ibus-app.de/images/0/02/MASK-CCC-CIC-NBT-EVO-iDrive.jpg&amp;quot;,&lt;br /&gt;
  iris:    &amp;quot;https://xtrons.ibus-app.de/images/b/be/BusinessKas_IRISG.jpg&amp;quot;,&lt;br /&gt;
  resler:  &amp;quot;https://xtrons.ibus-app.de/images/d/d1/Resler_Modul_01.png&amp;quot;,&lt;br /&gt;
  can:     &amp;quot;https://xtrons.ibus-app.de/images/6/69/CAN_Interface.png&amp;quot;,&lt;br /&gt;
  funktr:  IM + &amp;quot;7/7e/E46_Funktionstraeger.png/240px-E46_Funktionstraeger.png&amp;quot;&lt;br /&gt;
};&lt;br /&gt;
/* Anfrage-Formular: MAIL_TO = Empfänger. SEND_URL leer = E-Mail-Programm des Kunden öffnen (mailto).&lt;br /&gt;
   SEND_URL = Adresse des Server-Skripts send-anfrage.php = Versand direkt vom Server (mit CC an den Kunden). */&lt;br /&gt;
var MAIL_TO = &amp;quot;info@ibus-app.de&amp;quot;;&lt;br /&gt;
var MAIL_SUBJECT = &amp;quot;Anfrage aus Android Radio Konfigurator&amp;quot;;&lt;br /&gt;
var SEND_URL = &amp;quot;https://xtrons.ibus-app.de/send-anfrage.php&amp;quot;;&lt;br /&gt;
/* ---- 1) Baureihen --------------------------------------------------------&lt;br /&gt;
   v = Shop-Kategorie (Link: SHOP + bmw-radios/ + v + /)&lt;br /&gt;
   gen: alt = I-BUS-Fahrzeuge (E38/E39/E46/E53/E83)&lt;br /&gt;
        b   = M-ASK / CCC / CIC     c = CIC / NBT / NBT EVO&lt;br /&gt;
   body = Karosserieformen (siehe BODY)                                      */&lt;br /&gt;
var BODY = { limo: &amp;quot;Limousine&amp;quot;, touring: &amp;quot;Touring&amp;quot;, coupe: &amp;quot;Coupé&amp;quot;, cabrio: &amp;quot;Cabrio&amp;quot;, schraeg: &amp;quot;Schrägheck&amp;quot;,&lt;br /&gt;
  compact: &amp;quot;Compact&amp;quot;, gt: &amp;quot;Gran Turismo&amp;quot;, gc: &amp;quot;Gran Coupé&amp;quot;, suv: &amp;quot;SUV / SAV&amp;quot;, roadster: &amp;quot;Roadster&amp;quot; };&lt;br /&gt;
var VEHICLES = [&lt;br /&gt;
  { v: &amp;quot;1er-e8x&amp;quot;, t: &amp;quot;1er E8x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;schraeg,coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;1er-f2x&amp;quot;, t: &amp;quot;1er F2x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;schraeg&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;2er-f2x&amp;quot;, t: &amp;quot;2er F2x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;3er-e46&amp;quot;, t: &amp;quot;3er E46&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;limo,touring,coupe,cabrio,compact&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;3er-e9x&amp;quot;, t: &amp;quot;3er E9x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;limo,touring,coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;3er-f3x&amp;quot;, t: &amp;quot;3er F3x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;limo,touring,gt&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;4er-f3x&amp;quot;, t: &amp;quot;4er F3x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;coupe,cabrio,gc&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;5er-e39&amp;quot;, t: &amp;quot;5er E39&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;limo,touring&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;5er-e6x&amp;quot;, t: &amp;quot;5er E6x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;limo,touring&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;5er-f1x&amp;quot;, t: &amp;quot;5er F1x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;limo,touring,gt&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;6er-e6x&amp;quot;, t: &amp;quot;6er E6x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;7er-e38&amp;quot;, t: &amp;quot;7er E38&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;limo&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;7er-e65&amp;quot;, t: &amp;quot;7er E65&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;limo&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;7er-f01&amp;quot;, t: &amp;quot;7er F01&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;limo&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x1-e84&amp;quot;, t: &amp;quot;X1 E84&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x1-f48&amp;quot;, t: &amp;quot;X1 F48&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x3-e83&amp;quot;, t: &amp;quot;X3 E83&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x3-f25&amp;quot;, t: &amp;quot;X3 F25&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x5-e53&amp;quot;, t: &amp;quot;X5 E53&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x5-e70&amp;quot;, t: &amp;quot;X5 E70&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x5-f15&amp;quot;, t: &amp;quot;X5 F15&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x6-e71&amp;quot;, t: &amp;quot;X6 E71&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;z4-e85e86&amp;quot;, t: &amp;quot;Z4 E85/E86&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;roadster,coupe&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;z4-e89&amp;quot;, t: &amp;quot;Z4 E89&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;roadster&amp;quot;, noCat: true }&lt;br /&gt;
];&lt;br /&gt;
/* Fahrzeuge mit K-CAN App (Beta) */&lt;br /&gt;
var KCAN = [&amp;quot;1er-e8x&amp;quot;, &amp;quot;3er-e9x&amp;quot;, &amp;quot;5er-e6x&amp;quot;, &amp;quot;6er-e6x&amp;quot;, &amp;quot;7er-e65&amp;quot;, &amp;quot;x1-e84&amp;quot;, &amp;quot;x5-e70&amp;quot;, &amp;quot;x6-e71&amp;quot;, &amp;quot;z4-e89&amp;quot;];&lt;br /&gt;
var bodyValues = Object.keys(BODY).map(function (k) {&lt;br /&gt;
  return { v: k, t: BODY[k], only: { vehicle: VEHICLES.filter(function (x) { return x.body.split(&amp;quot;,&amp;quot;).indexOf(k) !== -1; }).map(function (x) { return x.v; }) } };&lt;br /&gt;
});&lt;br /&gt;
/* ---- 2) Auswahlfelder ------------------------------------------------------&lt;br /&gt;
   only = Wert nur anbieten, wenn Bedingung passt   show = Feld nur dann zeigen&lt;br /&gt;
   optional = muss nicht gewählt werden             auto = bei nur einem Wert vorwählen */&lt;br /&gt;
var FIELDS = [&lt;br /&gt;
  { id: &amp;quot;vehicle&amp;quot;, label: &amp;quot;Fahrzeug&amp;quot;, values: VEHICLES.map(function (x) { return { v: x.v, t: &amp;quot;BMW &amp;quot; + x.t }; }) },&lt;br /&gt;
  { id: &amp;quot;factory&amp;quot;, label: &amp;quot;Verbaut ab Werk&amp;quot;, pre: { when: { gen: [&amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;] }, html: &amp;quot;[b]So erkennst Du Dein System:[/b][br][imgw=&amp;quot; + P.idrive + &amp;quot;]&amp;quot; }, values: [&lt;br /&gt;
    { v: &amp;quot;iris&amp;quot;,  t: &amp;quot;Radio mit IRIS&amp;quot;, only: { vehicle: [&amp;quot;3er-e46&amp;quot;, &amp;quot;5er-e39&amp;quot;, &amp;quot;7er-e38&amp;quot;, &amp;quot;x5-e53&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.iris + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;mid&amp;quot;,   t: &amp;quot;Radio mit MID&amp;quot;,  only: { gen: [&amp;quot;alt&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.radio + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;n43&amp;quot;,   t: &amp;quot;4:3 Navi&amp;quot;,       only: { vehicle: [&amp;quot;5er-e39&amp;quot;, &amp;quot;7er-e38&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.n43 + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;n169&amp;quot;,  t: &amp;quot;16:9 Navi&amp;quot;,      only: { gen: [&amp;quot;alt&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.n169 + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;pfeil&amp;quot;, t: &amp;quot;Pfeilnavi&amp;quot;,      only: { vehicle: [&amp;quot;3er-e46&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.pfeil + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;mask&amp;quot;,  t: &amp;quot;M-ASK&amp;quot;,          only: { gen: [&amp;quot;b&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;ccc&amp;quot;,   t: &amp;quot;CCC&amp;quot;,            only: { gen: [&amp;quot;b&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;cic&amp;quot;,   t: &amp;quot;CIC&amp;quot;,            only: { gen: [&amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;nbt&amp;quot;,   t: &amp;quot;NBT&amp;quot;,            only: { gen: [&amp;quot;c&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;nbtevo&amp;quot;, t: &amp;quot;NBT EVO&amp;quot;,       only: { gen: [&amp;quot;c&amp;quot;] } } ] },&lt;br /&gt;
  { id: &amp;quot;trunk&amp;quot;, label: &amp;quot;Wo sitzt das Radiomodul des Pfeilnavis?&amp;quot;, optional: true, show: { factory: [&amp;quot;pfeil&amp;quot;] },&lt;br /&gt;
    help: &amp;quot;Bitte prüfen: Sitzt das Modul im Kofferraum, oder im Pfeilnavi selbst (Quadlock hinten neben dem Antennenstecker)?[br][img=&amp;quot; + P.pfeil + &amp;quot;]&amp;quot;,&lt;br /&gt;
    values: [&lt;br /&gt;
    { v: &amp;quot;ja&amp;quot;, t: &amp;quot;Im Kofferraum (Verlängerungen nötig)&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;nein&amp;quot;, t: &amp;quot;Im Pfeilnavi, Quadlock hinten (keine Verlängerung)&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;unk&amp;quot;, t: &amp;quot;Weiß ich nicht&amp;quot; } ] },&lt;br /&gt;
  { id: &amp;quot;aux&amp;quot;, label: &amp;quot;AUX-IN verfügbar?&amp;quot;, show: { gen: [&amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;] }, values: [&lt;br /&gt;
    { v: &amp;quot;ja&amp;quot;, t: &amp;quot;Ja&amp;quot; }, { v: &amp;quot;nein&amp;quot;, t: &amp;quot;Nein&amp;quot; } ] },&lt;br /&gt;
  { id: &amp;quot;sound&amp;quot;, label: &amp;quot;Soundsystem&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;stereo&amp;quot;, t: &amp;quot;Stereo&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;hifi&amp;quot;,   t: &amp;quot;Hifi&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;dsp&amp;quot;,    t: &amp;quot;DSP&amp;quot;, only: { vehicle: [&amp;quot;7er-e38&amp;quot;, &amp;quot;5er-e39&amp;quot;, &amp;quot;x5-e53&amp;quot;, &amp;quot;x3-e83&amp;quot;] }, info: &amp;quot;[a=&amp;quot; + WIKI + &amp;quot;Habe_ich_DSP%3F]Habe ich DSP?[/a]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;hk&amp;quot;,     t: &amp;quot;Harman Kardon&amp;quot;, only: { vehicle: [&amp;quot;3er-e46&amp;quot;, &amp;quot;z4-e85e86&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;logic7&amp;quot;, t: &amp;quot;Logic7&amp;quot;, only: { vehicle: [&amp;quot;3er-e9x&amp;quot;, &amp;quot;5er-e6x&amp;quot;, &amp;quot;6er-e6x&amp;quot;, &amp;quot;7er-e65&amp;quot;, &amp;quot;1er-e8x&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;hksur&amp;quot;,  t: &amp;quot;Harman Kardon Surround&amp;quot;, only: { vehicle: [&amp;quot;1er-f2x&amp;quot;, &amp;quot;2er-f2x&amp;quot;, &amp;quot;3er-f3x&amp;quot;, &amp;quot;4er-f3x&amp;quot;, &amp;quot;5er-f1x&amp;quot;] } } ] },&lt;br /&gt;
  { id: &amp;quot;current&amp;quot;, label: &amp;quot;Aktuell verbaut&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;werk&amp;quot;, t: &amp;quot;Werksradio / Werksnavi&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;nach&amp;quot;, t: &amp;quot;Nachrüst-Radio / -Navi&amp;quot; } ] },&lt;br /&gt;
  { id: &amp;quot;body&amp;quot;, label: &amp;quot;Karosserie&amp;quot;, auto: true, values: bodyValues },&lt;br /&gt;
  { id: &amp;quot;ant&amp;quot;, label: &amp;quot;Antennenstecker am Radio (optional)&amp;quot;, optional: true, def: &amp;quot;unk&amp;quot;,&lt;br /&gt;
    show: { vehicle: [&amp;quot;7er-e38&amp;quot;, &amp;quot;5er-e39&amp;quot;, &amp;quot;3er-e46&amp;quot;, &amp;quot;x5-e53&amp;quot;] },&lt;br /&gt;
    values: [&lt;br /&gt;
    { v: &amp;quot;unk&amp;quot;,   t: &amp;quot;Weiß ich nicht&amp;quot;, info: &amp;quot;[b]BM24[/b] (Rundpin) = ISO-Antennenstecker:[br][img=&amp;quot; + P.bm24 + &amp;quot;][img=&amp;quot; + P.iso + &amp;quot;][br][b]BM54[/b] = FAKRA:[br][img=&amp;quot; + P.bm54 + &amp;quot;][img=&amp;quot; + P.fakra + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;iso&amp;quot;,   t: &amp;quot;ISO (BM24, Rundpin)&amp;quot;, info: &amp;quot;[img=&amp;quot; + P.bm24 + &amp;quot;][img=&amp;quot; + P.iso + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;fakra&amp;quot;, t: &amp;quot;FAKRA (BM54)&amp;quot;, info: &amp;quot;[img=&amp;quot; + P.bm54 + &amp;quot;][img=&amp;quot; + P.fakra + &amp;quot;]&amp;quot; } ] }&lt;br /&gt;
];&lt;br /&gt;
/* ---- 3) Zusatzoptionen (Mehrfachauswahl) ---------------------------------&lt;br /&gt;
   show = nur sichtbar wenn Bedingung passt   requires = nur sichtbar wenn diese Optionen gewählt sind&lt;br /&gt;
   excl = Optionen derselben Gruppe schließen sich aus   items = Artikel aus ITEMS */&lt;br /&gt;
var OPTS = [&lt;br /&gt;
  { id: &amp;quot;halter&amp;quot;,  t: &amp;quot;Radio-Halter&amp;quot;, sub: &amp;quot;nur BMW E39&amp;quot;, show: { vehicle: [&amp;quot;5er-e39&amp;quot;] }, items: [&amp;quot;halter&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;ibus&amp;quot;,    t: &amp;quot;I-BUS App&amp;quot;, show: { gen: [&amp;quot;alt&amp;quot;] }, items: [&amp;quot;ibus&amp;quot;, &amp;quot;resler&amp;quot;, &amp;quot;bclic&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;deepobd&amp;quot;, t: &amp;quot;DeepOBD (Diagnose)&amp;quot;, items: [&amp;quot;deepobd&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;can&amp;quot;,     t: &amp;quot;CAN Interface&amp;quot;, sub: &amp;quot;Addon - nur mit I-BUS App&amp;quot;, show: { gen: [&amp;quot;alt&amp;quot;] }, requires: [&amp;quot;ibus&amp;quot;], items: [&amp;quot;can&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;kcan&amp;quot;,    t: &amp;quot;K-CAN App (Beta)&amp;quot;, sub: &amp;quot;Pendant zur I-BUS App&amp;quot;, show: { vehicle: KCAN }, items: [&amp;quot;kcan&amp;quot;, &amp;quot;kcanlic&amp;quot;, &amp;quot;can&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;tpms&amp;quot;,    t: &amp;quot;TPMS (Reifendruck)&amp;quot;, items: [&amp;quot;tpms&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;dab1&amp;quot;,    t: &amp;quot;DAB+ (Single Receiver)&amp;quot;, excl: &amp;quot;dab&amp;quot;, items: [&amp;quot;dab1&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;dab2&amp;quot;,    t: &amp;quot;DAB+ (Dual Receiver)&amp;quot;,   excl: &amp;quot;dab&amp;quot;, items: [&amp;quot;dab2&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;rcam&amp;quot;,    t: &amp;quot;Rückfahrkamera&amp;quot;, items: [&amp;quot;rcam&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;fcam&amp;quot;,    t: &amp;quot;Front-Kamera&amp;quot;, items: [&amp;quot;fcam&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;tool&amp;quot;,    t: &amp;quot;Einbau-Werkzeug (Kunststoffheber)&amp;quot;, items: [&amp;quot;tool&amp;quot;] }&lt;br /&gt;
];&lt;br /&gt;
/* Erzwungene Optionen (werden automatisch gesetzt und gesperrt) */&lt;br /&gt;
var FORCED = [&lt;br /&gt;
  { when: { sound: [&amp;quot;dsp&amp;quot;] }, opts: [&amp;quot;ibus&amp;quot;], why: &amp;quot;wegen DSP erforderlich&amp;quot; }&lt;br /&gt;
];&lt;br /&gt;
/* ---- 4) Artikel ------------------------------------------------------------&lt;br /&gt;
   u = Shop-Link (ut = Linktext)   w = Wiki-Link (wt = Linktext)   leer = kein Link&lt;br /&gt;
   skipIf = Artikel entfällt, wenn der genannte Artikel schon in der Liste steht */&lt;br /&gt;
var ITEMS = {&lt;br /&gt;
  exl005:  { t: &amp;quot;Verlängerung EXL005&amp;quot;, d: &amp;quot;Ersetzt das Radiomodul im Kofferraum.&amp;quot;, u: SHOP + &amp;quot;detail/index/sArticle/212/&amp;quot;, img: [P.exl005, P.schema] },&lt;br /&gt;
  fakra6m: { t: &amp;quot;Verlängerung 6 m FAKRA(m) auf FAKRA(f), gewinkelt&amp;quot;, d: &amp;quot;Antennenverlängerung vom Kofferraum nach vorn.&amp;quot;, img: [P.fakra6m],&lt;br /&gt;
             u: SHOP + &amp;quot;shop/zubehoer/adapterkabel/192/verlaengerung-6m-fakra-m-auf-fakra-f-kurz-gewinkelt&amp;quot; },&lt;br /&gt;
  isoada:  { t: &amp;quot;Adapter ISO-Stecker auf FAKRA, gewinkelt (15 cm)&amp;quot;, d: &amp;quot;Nötig bei ISO-Antennenstecker (BM24, Rundpin).&amp;quot;, img: [P.isofakra],&lt;br /&gt;
             u: SHOP + &amp;quot;shop/zubehoer/adapterkabel/193/adapter-kabel-iso-f-auf-fakra-f-kurz-gewinkelt-15cm&amp;quot; },&lt;br /&gt;
  bcdsp:   { t: &amp;quot;I-BUS App - BC+DSP Lizenz&amp;quot;, d: &amp;quot;Ohne DSP-Lizenz arbeitet das Werks-DSP nicht.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/lizenzen/171/i-bus-app-bc-dsp-lizenz&amp;quot;,&lt;br /&gt;
             w: WIKI + &amp;quot;Habe_ich_DSP%3F&amp;quot;, wt: &amp;quot;Wiki: Habe ich DSP?&amp;quot; },&lt;br /&gt;
  halter:  { t: &amp;quot;Alu-Halter zur Radio-Montage im BMW E39&amp;quot;, d: &amp;quot;Empfohlen bei Radios, die nicht von AVIN stammen.&amp;quot;, img: [P.halter],&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/radiohalter/185/alu-halter-zur-radio-montage-im-bmw-e39&amp;quot; },&lt;br /&gt;
  ibus:    { t: &amp;quot;I-BUS App&amp;quot;, hl: true,&lt;br /&gt;
             d: &amp;quot;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.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;cat/index/sCategory/42&amp;quot;,&lt;br /&gt;
             links: [&lt;br /&gt;
               { u: WIKI + &amp;quot;Was_brauche_ich_um_die_I-BUS_App_nutzen_zu_k%C3%B6nnen%3F&amp;quot;, t: &amp;quot;Wiki: Was brauche ich für die I-BUS App?&amp;quot; },&lt;br /&gt;
               { u: WIKI + &amp;quot;Funktionen&amp;quot;, t: &amp;quot;Liste aller I-BUS App Funktionen (BMW E38|E39|E46|E53|E83)&amp;quot; },&lt;br /&gt;
               { u: WIKI + &amp;quot;Was_geht_beim_BMW_E46_nicht&amp;quot;, t: &amp;quot;Was geht beim BMW E46, E83, E85,.. nicht? (da werkseitig nicht verbaut)&amp;quot; },&lt;br /&gt;
               { u: WIKI + &amp;quot;Funktionseinschr%C3%A4nkungen_nach_Baujahr/Ausstattung/Modell&amp;quot;, t: &amp;quot;Funktionseinschränkungen nach Baujahr/Ausstattung/Modell&amp;quot; } ] },&lt;br /&gt;
  resler:  { t: &amp;quot;Resler USB I-BUS Modul inkl. Anschlusskabel&amp;quot;, d: &amp;quot;Verbindet I-BUS App und Fahrzeug.&amp;quot;, img: [P.resler],&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/interfaces-module/191/resler-usb-i-bus-modul-inkl.-anschlusskabel&amp;quot;,&lt;br /&gt;
             w: &amp;quot;https://wiki.ibus-app.de/index.php?title=Hauptseite#Einbauanleitung_f.C3.BCr_Resler_Modul_und_Resler_Interface&amp;quot;, wt: &amp;quot;Einbauanleitung Resler Modul&amp;quot; },&lt;br /&gt;
  bclic:   { t: &amp;quot;I-BUS App - BC Lizenz&amp;quot;, d: &amp;quot;Schaltet u. a. die BC-Daten der App frei.&amp;quot;, skipIf: &amp;quot;bcdsp&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/lizenzen/167/i-bus-app-bc-lizenz&amp;quot; },&lt;br /&gt;
  deepobd: { t: &amp;quot;Deep OBD OBD-II Bluetooth-Adapter&amp;quot;, d: &amp;quot;Live-Werte auslesen, Fehler lesen und löschen.&amp;quot;, img: [P.deepobd],&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/interfaces-module/258/deep-obd-obd-ii-bluetooth-adapter?c=54&amp;quot;,&lt;br /&gt;
             w: &amp;quot;https://xtrons.ibus-app.de/index.php?title=DeepOBD_-_Adapter_und_App_einrichten&amp;quot;, wt: &amp;quot;Wiki: DeepOBD einrichten&amp;quot; },&lt;br /&gt;
  can:     { t: &amp;quot;CAN-Bus Interface inkl. Anschlusskabel&amp;quot;, d: &amp;quot;Addon, funktioniert nur zusammen mit der I-BUS App bzw. der K-CAN App.&amp;quot;, img: [P.can],&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/interfaces-module/346/can-bus-interface-inkl.-anschlusskabel&amp;quot;,&lt;br /&gt;
             w: WIKI + &amp;quot;Einbauanleitung_CAN-Bus_Interface&amp;quot;, wt: &amp;quot;Einbauanleitung CAN-Bus Interface&amp;quot; },&lt;br /&gt;
  kcan:    { t: &amp;quot;K-CAN App (Beta)&amp;quot;, d: &amp;quot;Pendant zur I-BUS App für Fahrzeuge mit K-CAN, aktuell als Betaversion.&amp;quot;,&lt;br /&gt;
             w: &amp;quot;https://wiki.kcan-app.de/&amp;quot;, wt: &amp;quot;Wiki zur K-CAN App&amp;quot; },&lt;br /&gt;
  kcanlic: { t: &amp;quot;K-CAN App - Lizenz Betaversion&amp;quot;, d: &amp;quot;Beta-Lizenz für die K-CAN App.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/lizenzen/358/k-can-app-lizenz-betaversion&amp;quot; },&lt;br /&gt;
  tpms:    { t: &amp;quot;TPMS - Reifendruckkontrolle&amp;quot;, d: &amp;quot;&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/tpms/&amp;quot; },&lt;br /&gt;
  dab1:    { t: &amp;quot;DAB+ Empfänger inkl. Antenne (Single)&amp;quot;, d: &amp;quot;&amp;quot;, w: &amp;quot;https://xtrons.ibus-app.de/index.php?title=Installation_der_DAB%2B_Antenne&amp;quot;, wt: &amp;quot;Installation der DAB+ Antenne&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/dab/291/dab-empfaenger-inkl.-antenne-usbdab04&amp;quot; },&lt;br /&gt;
  dab2:    { t: &amp;quot;Dual DAB+ Empfänger-Stick inkl. 2 Antennen&amp;quot;, d: &amp;quot;&amp;quot;, w: &amp;quot;https://xtrons.ibus-app.de/index.php?title=Installation_der_DAB%2B_Antenne&amp;quot;, wt: &amp;quot;Installation der DAB+ Antenne&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/dab/391/dual-dab-empfaenger-stick-inkl.-2-antennen-acusbdab05t?c=75&amp;quot; },&lt;br /&gt;
  rcam:    { t: &amp;quot;Rückfahrkamera&amp;quot;, d: &amp;quot;&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/kameras/&amp;quot;, ut: &amp;quot;Kameras im Shop ansehen →&amp;quot; },&lt;br /&gt;
  fcam:    { t: &amp;quot;Front-Kamera&amp;quot;, d: &amp;quot;&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/kameras/&amp;quot;, ut: &amp;quot;Kameras im Shop ansehen →&amp;quot; },&lt;br /&gt;
  tool:    { t: &amp;quot;Einbau-Werkzeug (Kunststoffheber)&amp;quot;, d: &amp;quot;Zum schonenden Lösen der Verkleidungen.&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/einbauwerkzeug/&amp;quot; }&lt;br /&gt;
};&lt;br /&gt;
/* ---- 5) Regeln --------------------------------------------------------------&lt;br /&gt;
   type: need (Das brauchst Du) oder hint (Hinweise)   when = Bedingung auf die Felder&lt;br /&gt;
   opts = diese Zusatzoptionen müssen gewählt sein      items = Artikel   html = Text&lt;br /&gt;
   Abgeleitete Werte: gen (alt/b/c) und module (ja/nein/unk = Radiomodul im Kofferraum, nur gen alt) */&lt;br /&gt;
var RULES = [&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { current: [&amp;quot;werk&amp;quot;], module: [&amp;quot;ja&amp;quot;] }, items: [&amp;quot;exl005&amp;quot;, &amp;quot;fakra6m&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { current: [&amp;quot;nach&amp;quot;], module: [&amp;quot;ja&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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=&amp;quot; + P.noquad + &amp;quot;][img=&amp;quot; + P.noexl6 + &amp;quot;]&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;ja&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;nein&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;unk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { ant: [&amp;quot;iso&amp;quot;] }, items: [&amp;quot;isoada&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { ant: [&amp;quot;unk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Antennenstecker:[/b] [b]BM24[/b] (Rundpin) = ISO-Antennenstecker, ggf. wird der [a=&amp;quot; + SHOP + &amp;quot;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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { sound: [&amp;quot;dsp&amp;quot;] }, items: [&amp;quot;bcdsp&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { sound: [&amp;quot;dsp&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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=&amp;quot; + WIKI + &amp;quot;Habe_ich_DSP%3F]Habe ich DSP?[/a]&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { sound: [&amp;quot;hk&amp;quot;], gen: [&amp;quot;alt&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Harman Kardon:[/b] Benötigt [b]keine[/b] DSP-Lizenz. Das Remote-Signal (+12 V, wenn Radio an) genügt zum Starten.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { aux: [&amp;quot;nein&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]AUX-IN:[/b] Der AUX-IN muss codiert werden. Optional kann ein FM-Transmitter genutzt werden - das ist nicht empfohlen.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;7er-e38&amp;quot;, &amp;quot;x5-e53&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Montage:[/b] Radios für BMW E38/E53 benötigen keine extra Halterungen.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;5er-e39&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;3er-e46&amp;quot;], factory: [&amp;quot;iris&amp;quot;, &amp;quot;mid&amp;quot;, &amp;quot;pfeil&amp;quot;], current: [&amp;quot;werk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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]&amp;quot; +&lt;br /&gt;
          &amp;quot;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]&amp;quot; +&lt;br /&gt;
          &amp;quot;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=&amp;quot; + P.funktr + &amp;quot;]&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { factory: [&amp;quot;cic&amp;quot;, &amp;quot;nbt&amp;quot;, &amp;quot;nbtevo&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Lichtleiter:[/b] Ggf. vorhandene Lichtleiter (MOST) müssen aus dem BMW-Stecker in den Xtrons-Adapter umgesteckt werden.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { factory: [&amp;quot;mask&amp;quot;, &amp;quot;ccc&amp;quot;, &amp;quot;cic&amp;quot;, &amp;quot;nbt&amp;quot;, &amp;quot;nbtevo&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, opts: [&amp;quot;kcan&amp;quot;], when: {},&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, opts: [&amp;quot;ibus&amp;quot;], when: {},&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: {},&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot; }&lt;br /&gt;
];&lt;br /&gt;
/* =====================================================================&lt;br /&gt;
   PROGRAMMLOGIK&lt;br /&gt;
   ===================================================================== */&lt;br /&gt;
var $ = function (id) { return document.getElementById(id); };&lt;br /&gt;
var sel = {}, picked = {}, summary = &amp;quot;&amp;quot;, capA = 0, capB = 0;&lt;br /&gt;
var fieldsEl = $(&amp;quot;nvk-fields&amp;quot;), optsEl = $(&amp;quot;nvk-opts&amp;quot;), outEl = $(&amp;quot;nvk-out&amp;quot;);&lt;br /&gt;
function full(u) { return u.indexOf(&amp;quot;/thumb/&amp;quot;) === -1 ? u : u.replace(&amp;quot;/thumb/&amp;quot;, &amp;quot;/&amp;quot;).replace(/\/[^\/]+$/, &amp;quot;&amp;quot;); }&lt;br /&gt;
function fmt(t) {&lt;br /&gt;
  return t.replace(/\[imgw=([^\x5D]+)\]/g, function (m, u) {&lt;br /&gt;
    return &amp;quot;\u003Ca href=\&amp;quot;&amp;quot; + full(u) + &amp;quot;\&amp;quot; target=\&amp;quot;_blank\&amp;quot; rel=\&amp;quot;noopener\&amp;quot;\u003E\u003Cimg class=\&amp;quot;nvk-img wide\&amp;quot; src=\&amp;quot;&amp;quot; + u + &amp;quot;\&amp;quot; alt=\&amp;quot;\&amp;quot;\u003E\u003C/a\u003E&amp;quot;;&lt;br /&gt;
  }).replace(/\[img=([^\x5D]+)\]/g, function (m, u) {&lt;br /&gt;
    return &amp;quot;\u003Ca href=\&amp;quot;&amp;quot; + full(u) + &amp;quot;\&amp;quot; target=\&amp;quot;_blank\&amp;quot; rel=\&amp;quot;noopener\&amp;quot;\u003E\u003Cimg class=\&amp;quot;nvk-img\&amp;quot; src=\&amp;quot;&amp;quot; + u + &amp;quot;\&amp;quot; alt=\&amp;quot;\&amp;quot;\u003E\u003C/a\u003E&amp;quot;;&lt;br /&gt;
  }).replace(/\[b\]/g, &amp;quot;\u003Cb\u003E&amp;quot;).replace(/\[\/b\]/g, &amp;quot;\u003C/b\u003E&amp;quot;).replace(/\[br\]/g, &amp;quot;\u003Cbr\u003E&amp;quot;)&lt;br /&gt;
    .replace(/\[a=([^\x5D]+)\]/g, &amp;quot;\u003Ca href=\&amp;quot;$1\&amp;quot; target=\&amp;quot;_blank\&amp;quot; rel=\&amp;quot;noopener\&amp;quot;\u003E&amp;quot;).replace(/\[\/a\]/g, &amp;quot;\u003C/a\u003E&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
function match(cond, s, lenient) {&lt;br /&gt;
  if (!cond) return true;&lt;br /&gt;
  for (var k in cond) {&lt;br /&gt;
    if (!s[k]) { if (lenient) continue; return false; }&lt;br /&gt;
    if (cond[k].indexOf(s[k]) === -1) return false;&lt;br /&gt;
  }&lt;br /&gt;
  return true;&lt;br /&gt;
}&lt;br /&gt;
function vehicleOf(id) { return VEHICLES.filter(function (x) { return x.v === id; })[0]; }&lt;br /&gt;
function derive() {&lt;br /&gt;
  var s = {}, k;&lt;br /&gt;
  for (k in sel) s[k] = sel[k];&lt;br /&gt;
  var veh = vehicleOf(sel.vehicle);&lt;br /&gt;
  if (veh) s.gen = veh.gen;&lt;br /&gt;
  if (s.gen === &amp;quot;alt&amp;quot;) {&lt;br /&gt;
    if (s.factory === &amp;quot;n43&amp;quot; || s.factory === &amp;quot;n169&amp;quot;) s.module = &amp;quot;ja&amp;quot;;&lt;br /&gt;
    else if (s.factory === &amp;quot;iris&amp;quot; || s.factory === &amp;quot;mid&amp;quot;) s.module = &amp;quot;nein&amp;quot;;&lt;br /&gt;
    else if (s.factory === &amp;quot;pfeil&amp;quot;) s.module = s.trunk || &amp;quot;unk&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  return s;&lt;br /&gt;
}&lt;br /&gt;
function forced(s) {&lt;br /&gt;
  var f = {};&lt;br /&gt;
  FORCED.forEach(function (r) { if (match(r.when, s)) r.opts.forEach(function (o) { f[o] = r.why; }); });&lt;br /&gt;
  return f;&lt;br /&gt;
}&lt;br /&gt;
function onSet(s) {&lt;br /&gt;
  var f = forced(s), on = {}, k;&lt;br /&gt;
  for (k in picked) if (picked[k]) on[k] = true;&lt;br /&gt;
  for (k in f) on[k] = true;&lt;br /&gt;
  return { on: on, forced: f };&lt;br /&gt;
}&lt;br /&gt;
function optVisible(o, s, on) {&lt;br /&gt;
  if (!match(o.show, s, true)) return false;&lt;br /&gt;
  return (o.requires || []).every(function (r) { return on[r]; });&lt;br /&gt;
}&lt;br /&gt;
FIELDS.forEach(function (f) {&lt;br /&gt;
  var wrap = document.createElement(&amp;quot;div&amp;quot;); wrap.className = &amp;quot;nvk-f&amp;quot;; wrap.id = &amp;quot;nvk-w-&amp;quot; + f.id;&lt;br /&gt;
  var lab = document.createElement(&amp;quot;label&amp;quot;); lab.htmlFor = &amp;quot;nvk-&amp;quot; + f.id; lab.textContent = f.label;&lt;br /&gt;
  var s = document.createElement(&amp;quot;select&amp;quot;); s.id = &amp;quot;nvk-&amp;quot; + f.id;&lt;br /&gt;
  s.addEventListener(&amp;quot;change&amp;quot;, function () { sel[f.id] = s.value; update(); });&lt;br /&gt;
  wrap.appendChild(lab); wrap.appendChild(s);&lt;br /&gt;
  if (f.help) { var h = document.createElement(&amp;quot;div&amp;quot;); h.className = &amp;quot;nvk-help&amp;quot;; h.innerHTML = fmt(f.help); wrap.appendChild(h); }&lt;br /&gt;
  var inf = document.createElement(&amp;quot;div&amp;quot;); inf.id = &amp;quot;nvk-i-&amp;quot; + f.id; wrap.appendChild(inf);&lt;br /&gt;
  fieldsEl.appendChild(wrap);&lt;br /&gt;
});&lt;br /&gt;
function renderFields() {&lt;br /&gt;
  FIELDS.forEach(function (f) {&lt;br /&gt;
    var s = derive();&lt;br /&gt;
    var wrap = $(&amp;quot;nvk-w-&amp;quot; + f.id), el = $(&amp;quot;nvk-&amp;quot; + f.id);&lt;br /&gt;
    var vis = f.show ? match(f.show, s, false) : true;&lt;br /&gt;
    wrap.style.display = vis ? &amp;quot;&amp;quot; : &amp;quot;none&amp;quot;;&lt;br /&gt;
    if (!vis) { sel[f.id] = &amp;quot;&amp;quot;; return; }&lt;br /&gt;
    var allowed = f.values.filter(function (v) { return match(v.only, s, true); });&lt;br /&gt;
    if (sel[f.id]) { if (!allowed.some(function (v) { return v.v === sel[f.id]; })) sel[f.id] = &amp;quot;&amp;quot;; }&lt;br /&gt;
    if (!sel[f.id]) { if (f.def) sel[f.id] = f.def; }&lt;br /&gt;
    if (!sel[f.id]) { if (f.auto) { if (sel.vehicle) { if (allowed.length === 1) sel[f.id] = allowed[0].v; } } }&lt;br /&gt;
    el.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
    if (!f.def) { var p = document.createElement(&amp;quot;option&amp;quot;); p.value = &amp;quot;&amp;quot;; p.textContent = &amp;quot;– bitte wählen –&amp;quot;; el.appendChild(p); }&lt;br /&gt;
    allowed.forEach(function (v) {&lt;br /&gt;
      var o = document.createElement(&amp;quot;option&amp;quot;); o.value = v.v; o.textContent = v.t; el.appendChild(o);&lt;br /&gt;
    });&lt;br /&gt;
    el.value = sel[f.id] || &amp;quot;&amp;quot;;&lt;br /&gt;
    var cur = allowed.filter(function (v) { return v.v === sel[f.id]; })[0];&lt;br /&gt;
    var pre = f.pre ? (match(f.pre.when, s, false) ? fmt(f.pre.html) : &amp;quot;&amp;quot;) : &amp;quot;&amp;quot;;&lt;br /&gt;
    $(&amp;quot;nvk-i-&amp;quot; + f.id).innerHTML = pre + (cur ? (cur.info ? fmt(cur.info) : &amp;quot;&amp;quot;) : &amp;quot;&amp;quot;);&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
function renderOpts() {&lt;br /&gt;
  var s = derive(), st = onSet(s);&lt;br /&gt;
  OPTS.forEach(function (o) { if (!optVisible(o, s, st.on)) picked[o.id] = false; });&lt;br /&gt;
  st = onSet(s);&lt;br /&gt;
  optsEl.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
  OPTS.forEach(function (o) {&lt;br /&gt;
    if (!optVisible(o, s, st.on)) return;&lt;br /&gt;
    var lab = document.createElement(&amp;quot;label&amp;quot;); lab.className = &amp;quot;nvk-o&amp;quot;;&lt;br /&gt;
    var cb = document.createElement(&amp;quot;input&amp;quot;); cb.type = &amp;quot;checkbox&amp;quot;;&lt;br /&gt;
    cb.checked = !!st.on[o.id];&lt;br /&gt;
    var isForced = !!st.forced[o.id];&lt;br /&gt;
    if (isForced) { cb.disabled = true; lab.className += &amp;quot; dis&amp;quot;; }&lt;br /&gt;
    cb.addEventListener(&amp;quot;change&amp;quot;, function () {&lt;br /&gt;
      picked[o.id] = cb.checked;&lt;br /&gt;
      if (cb.checked) { if (o.excl) OPTS.forEach(function (x) { if (x.excl === o.excl) { if (x.id !== o.id) picked[x.id] = false; } }); }&lt;br /&gt;
      update();&lt;br /&gt;
    });&lt;br /&gt;
    lab.appendChild(cb);&lt;br /&gt;
    lab.appendChild(document.createTextNode(&amp;quot; &amp;quot; + o.t));&lt;br /&gt;
    var sub = [o.sub, isForced ? st.forced[o.id] : &amp;quot;&amp;quot;].filter(Boolean).join(&amp;quot; - &amp;quot;);&lt;br /&gt;
    if (sub) { var sm = document.createElement(&amp;quot;small&amp;quot;); sm.textContent = &amp;quot; (&amp;quot; + sub + &amp;quot;)&amp;quot;; lab.appendChild(sm); }&lt;br /&gt;
    optsEl.appendChild(lab);&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
function link(url, text) {&lt;br /&gt;
  var a = document.createElement(&amp;quot;a&amp;quot;); a.href = url; a.target = &amp;quot;_blank&amp;quot;; a.rel = &amp;quot;noopener&amp;quot;; a.textContent = text; return a;&lt;br /&gt;
}&lt;br /&gt;
function card(item, cls) {&lt;br /&gt;
  var d = document.createElement(&amp;quot;div&amp;quot;); d.className = &amp;quot;nvk-card &amp;quot; + (cls || &amp;quot;&amp;quot;) + (item.hl ? &amp;quot; hl&amp;quot; : &amp;quot;&amp;quot;);&lt;br /&gt;
  var b = document.createElement(&amp;quot;b&amp;quot;); b.textContent = item.t; d.appendChild(b);&lt;br /&gt;
  if (item.d) { var p = document.createElement(&amp;quot;span&amp;quot;); p.textContent = item.d; d.appendChild(p); }&lt;br /&gt;
  if (item.img) {&lt;br /&gt;
    var im = document.createElement(&amp;quot;div&amp;quot;);&lt;br /&gt;
    item.img.forEach(function (u) {&lt;br /&gt;
      var a = document.createElement(&amp;quot;a&amp;quot;); a.href = full(u); a.target = &amp;quot;_blank&amp;quot;; a.rel = &amp;quot;noopener&amp;quot;;&lt;br /&gt;
      var g = document.createElement(&amp;quot;img&amp;quot;); g.className = &amp;quot;nvk-img&amp;quot;; g.src = u; g.alt = item.t; a.appendChild(g); im.appendChild(a);&lt;br /&gt;
    });&lt;br /&gt;
    d.appendChild(im);&lt;br /&gt;
  }&lt;br /&gt;
  if (item.u || item.w) {&lt;br /&gt;
    var l = document.createElement(&amp;quot;div&amp;quot;); l.className = &amp;quot;nvk-links&amp;quot;;&lt;br /&gt;
    if (item.u) l.appendChild(link(item.u, item.ut || &amp;quot;Im Shop ansehen →&amp;quot;));&lt;br /&gt;
    if (item.w) l.appendChild(link(item.w, (item.wt || &amp;quot;Zum Wiki&amp;quot;) + &amp;quot; →&amp;quot;));&lt;br /&gt;
    d.appendChild(l);&lt;br /&gt;
  }&lt;br /&gt;
  if (item.links) item.links.forEach(function (x) {&lt;br /&gt;
    var r = document.createElement(&amp;quot;div&amp;quot;); r.className = &amp;quot;nvk-links&amp;quot;; r.appendChild(link(x.u, x.t + &amp;quot; →&amp;quot;)); d.appendChild(r);&lt;br /&gt;
  });&lt;br /&gt;
  return d;&lt;br /&gt;
}&lt;br /&gt;
function heading(txt) { var h = document.createElement(&amp;quot;h3&amp;quot;); h.textContent = txt; outEl.appendChild(h); }&lt;br /&gt;
function renderResult() {&lt;br /&gt;
  var s = derive(), st = onSet(s);&lt;br /&gt;
  var missing = FIELDS.filter(function (f) {&lt;br /&gt;
    var w = $(&amp;quot;nvk-w-&amp;quot; + f.id);&lt;br /&gt;
    return w.style.display !== &amp;quot;none&amp;quot; ? (!f.optional ? !sel[f.id] : false) : false;&lt;br /&gt;
  });&lt;br /&gt;
  outEl.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
  if (missing.length) {&lt;br /&gt;
    var m = document.createElement(&amp;quot;p&amp;quot;); m.className = &amp;quot;nvk-miss&amp;quot;;&lt;br /&gt;
    m.textContent = &amp;quot;Bitte noch auswählen: &amp;quot; + missing.map(function (f) { return f.label; }).join(&amp;quot;, &amp;quot;);&lt;br /&gt;
    outEl.appendChild(m); $(&amp;quot;nvk-form&amp;quot;).style.display = &amp;quot;none&amp;quot;; return;&lt;br /&gt;
  }&lt;br /&gt;
  $(&amp;quot;nvk-form&amp;quot;).style.display = &amp;quot;&amp;quot;;&lt;br /&gt;
  var veh = vehicleOf(sel.vehicle);&lt;br /&gt;
  var ru = veh.noCat ? SHOP + &amp;quot;bmw-radios/&amp;quot; : SHOP + &amp;quot;bmw-radios/&amp;quot; + veh.v + &amp;quot;/&amp;quot;;&lt;br /&gt;
  heading(&amp;quot;Passende Radios&amp;quot;);&lt;br /&gt;
  outEl.appendChild(card({ t: &amp;quot;BMW Radios für &amp;quot; + veh.t, d: &amp;quot;Alle Radios, die für Deinen BMW &amp;quot; + veh.t + &amp;quot; im Shop erhältlich sind.&amp;quot;,&lt;br /&gt;
    u: ru, ut: &amp;quot;Zu den passenden Radios →&amp;quot;, w: SHOP + &amp;quot;bmw-radios/&amp;quot;, wt: &amp;quot;Alle BMW Radios&amp;quot; }, &amp;quot;rad&amp;quot;));&lt;br /&gt;
  var needs = [], hints = [], seen = {};&lt;br /&gt;
  RULES.forEach(function (r) {&lt;br /&gt;
    if (!match(r.when, s)) return;&lt;br /&gt;
    if (r.opts) { if (!r.opts.every(function (o) { return st.on[o]; })) return; }&lt;br /&gt;
    if (r.type === &amp;quot;need&amp;quot;) (r.items || []).forEach(function (id) { if (!seen[id]) { seen[id] = 1; needs.push(ITEMS[id]); } });&lt;br /&gt;
    else hints.push(r.html);&lt;br /&gt;
  });&lt;br /&gt;
  heading(&amp;quot;Das brauchst Du&amp;quot;);&lt;br /&gt;
  if (needs.length) needs.forEach(function (i) { outEl.appendChild(card(i)); });&lt;br /&gt;
  else { var n = document.createElement(&amp;quot;p&amp;quot;); n.textContent = &amp;quot;Für die Grundinstallation sind keine zusätzlichen Verlängerungen oder Adapter nötig.&amp;quot;; outEl.appendChild(n); }&lt;br /&gt;
  var opt = [];&lt;br /&gt;
  OPTS.forEach(function (o) {&lt;br /&gt;
    if (!st.on[o.id]) return;&lt;br /&gt;
    if (!optVisible(o, s, st.on)) return;&lt;br /&gt;
    o.items.forEach(function (id) {&lt;br /&gt;
      if (seen[id]) return;&lt;br /&gt;
      var sk = ITEMS[id].skipIf;&lt;br /&gt;
      if (sk) { if (seen[sk]) return; }&lt;br /&gt;
      seen[id] = 1; opt.push(ITEMS[id]);&lt;br /&gt;
    });&lt;br /&gt;
  });&lt;br /&gt;
  if (opt.length) { heading(&amp;quot;Deine Zusatzoptionen&amp;quot;); opt.forEach(function (i) { outEl.appendChild(card(i, &amp;quot;opt&amp;quot;)); }); }&lt;br /&gt;
  if (hints.length) {&lt;br /&gt;
    heading(&amp;quot;Hinweise&amp;quot;);&lt;br /&gt;
    hints.forEach(function (t) { var d = document.createElement(&amp;quot;div&amp;quot;); d.className = &amp;quot;nvk-note&amp;quot;; d.innerHTML = fmt(t); outEl.appendChild(d); });&lt;br /&gt;
  }&lt;br /&gt;
  var L = [&amp;quot;KONFIGURATION&amp;quot;];&lt;br /&gt;
  FIELDS.forEach(function (f) {&lt;br /&gt;
    if (!sel[f.id]) return;&lt;br /&gt;
    var v = f.values.filter(function (x) { return x.v === sel[f.id]; })[0];&lt;br /&gt;
    if (v) L.push(&amp;quot;- &amp;quot; + f.label + &amp;quot;: &amp;quot; + v.t);&lt;br /&gt;
  });&lt;br /&gt;
  L.push(&amp;quot;&amp;quot;, &amp;quot;BENÖTIGT&amp;quot;);&lt;br /&gt;
  needs.forEach(function (i) { L.push(&amp;quot;- &amp;quot; + i.t + (i.u ? &amp;quot;  &amp;quot; + i.u : &amp;quot;&amp;quot;)); });&lt;br /&gt;
  if (opt.length) { L.push(&amp;quot;&amp;quot;, &amp;quot;ZUSATZOPTIONEN&amp;quot;); opt.forEach(function (i) { L.push(&amp;quot;- &amp;quot; + i.t + (i.u ? &amp;quot;  &amp;quot; + i.u : &amp;quot;&amp;quot;)); }); }&lt;br /&gt;
  L.push(&amp;quot;&amp;quot;, &amp;quot;Radios: &amp;quot; + ru);&lt;br /&gt;
  summary = L.join(&amp;quot;\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
function update() { renderFields(); renderOpts(); renderResult(); }&lt;br /&gt;
function newCaptcha() {&lt;br /&gt;
  capA = 1 + Math.floor(Math.random() * 9); capB = 1 + Math.floor(Math.random() * 9);&lt;br /&gt;
  $(&amp;quot;nvk-capq&amp;quot;).textContent = &amp;quot;Sicherheitsfrage: Was ist &amp;quot; + capA + &amp;quot; + &amp;quot; + capB + &amp;quot;? *&amp;quot;; $(&amp;quot;nvk-cap&amp;quot;).value = &amp;quot;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
function status(msg, ok) { var e = $(&amp;quot;nvk-status&amp;quot;); e.style.display = &amp;quot;&amp;quot;; e.textContent = msg; e.style.borderLeftColor = ok ? &amp;quot;#14866d&amp;quot; : &amp;quot;#d33&amp;quot;; }&lt;br /&gt;
$(&amp;quot;nvk-send&amp;quot;).addEventListener(&amp;quot;click&amp;quot;, function () {&lt;br /&gt;
  var name = $(&amp;quot;nvk-name&amp;quot;).value.trim(), mail = $(&amp;quot;nvk-mail&amp;quot;).value.trim(), vin = $(&amp;quot;nvk-vin&amp;quot;).value.trim().toUpperCase(), msg = $(&amp;quot;nvk-msg&amp;quot;).value.trim();&lt;br /&gt;
  if (!name || !mail || !msg) return status(&amp;quot;Bitte Name, E-Mail und Kommentar ausfüllen.&amp;quot;, false);&lt;br /&gt;
  if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(mail)) return status(&amp;quot;Bitte eine gültige E-Mail-Adresse eingeben.&amp;quot;, false);&lt;br /&gt;
  if (vin) { if (!/^[A-Z]{2}[0-9]{5}$/.test(vin)) { if (!/^[A-HJ-NPR-Z0-9]{17}$/.test(vin)) return status(&amp;quot;Bitte die VIN im Format AB12345 oder die 17-stellige FGN eingeben - oder das Feld leer lassen.&amp;quot;, false); } }&lt;br /&gt;
  if (parseInt($(&amp;quot;nvk-cap&amp;quot;).value, 10) !== capA + capB) return status(&amp;quot;Die Sicherheitsfrage wurde nicht richtig beantwortet.&amp;quot;, false);&lt;br /&gt;
  if (!$(&amp;quot;nvk-dsgvo&amp;quot;).checked) return status(&amp;quot;Bitte der Verarbeitung Deiner Daten zustimmen.&amp;quot;, false);&lt;br /&gt;
  if ($(&amp;quot;nvk-hp&amp;quot;).value) return;&lt;br /&gt;
  var sz = $(&amp;quot;nvk-size&amp;quot;).value;&lt;br /&gt;
  var sum2 = summary + (sz ? &amp;quot;\n\nGewünschte Displaygröße: &amp;quot; + sz : &amp;quot;&amp;quot;);&lt;br /&gt;
  var text = &amp;quot;Name: &amp;quot; + name + &amp;quot;\nE-Mail: &amp;quot; + mail + &amp;quot;\nVIN: &amp;quot; + (vin || &amp;quot;-&amp;quot;) + &amp;quot;\n\nKommentar:\n&amp;quot; + msg + &amp;quot;\n\n&amp;quot; + sum2;&lt;br /&gt;
  if (SEND_URL) {&lt;br /&gt;
    var p = new URLSearchParams();&lt;br /&gt;
    p.append(&amp;quot;name&amp;quot;, name); p.append(&amp;quot;mail&amp;quot;, mail); p.append(&amp;quot;vin&amp;quot;, vin); p.append(&amp;quot;msg&amp;quot;, msg); p.append(&amp;quot;summary&amp;quot;, sum2);&lt;br /&gt;
    p.append(&amp;quot;hp&amp;quot;, $(&amp;quot;nvk-hp&amp;quot;).value); p.append(&amp;quot;ca&amp;quot;, capA); p.append(&amp;quot;cb&amp;quot;, capB); p.append(&amp;quot;cv&amp;quot;, $(&amp;quot;nvk-cap&amp;quot;).value);&lt;br /&gt;
    fetch(SEND_URL, { method: &amp;quot;POST&amp;quot;, body: p }).then(function (r) {&lt;br /&gt;
      if (!r.ok) throw new Error(&amp;quot;send&amp;quot;);&lt;br /&gt;
      status(&amp;quot;Danke! Deine Anfrage wurde gesendet, eine Kopie geht an &amp;quot; + mail + &amp;quot;.&amp;quot;, true); newCaptcha();&lt;br /&gt;
    }).catch(function () { status(&amp;quot;Das Senden hat nicht geklappt. Bitte versuche es später noch einmal oder schreibe direkt an &amp;quot; + MAIL_TO + &amp;quot;.&amp;quot;, false); });&lt;br /&gt;
  } else {&lt;br /&gt;
    var AMP = &amp;quot;\u0026&amp;quot;;&lt;br /&gt;
    window.location.href = &amp;quot;mailto:&amp;quot; + MAIL_TO + &amp;quot;?cc=&amp;quot; + encodeURIComponent(mail) + AMP + &amp;quot;subject=&amp;quot; + encodeURIComponent(MAIL_SUBJECT) + AMP + &amp;quot;body=&amp;quot; + encodeURIComponent(text);&lt;br /&gt;
    status(&amp;quot;Dein E-Mail-Programm wurde mit der fertigen Anfrage geöffnet. Bitte dort noch auf Senden klicken.&amp;quot;, true);&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
$(&amp;quot;nvk-reset&amp;quot;).addEventListener(&amp;quot;click&amp;quot;, function () { sel = {}; picked = {}; update(); });&lt;br /&gt;
newCaptcha();&lt;br /&gt;
update();&lt;br /&gt;
})();&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andre</name></author>
	</entry>
	<entry>
		<id>https://xtrons.ibus-app.de/index.php?title=Android_Radio_Konfigurator&amp;diff=4086</id>
		<title>Android Radio Konfigurator</title>
		<link rel="alternate" type="text/html" href="https://xtrons.ibus-app.de/index.php?title=Android_Radio_Konfigurator&amp;diff=4086"/>
		<updated>2026-10-21T12:37:03Z</updated>

		<summary type="html">&lt;p&gt;Andre: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Mit diesem Tool kann auf Basis von Fahrzeug und vorhandenen Komponenten eine Liste nötiger Komponenten erstellt werden.&amp;lt;br&amp;gt; ==&lt;br /&gt;
&amp;lt;big&amp;gt;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.&amp;lt;br&amp;gt;'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
#nvk{max-width:900px;line-height:1.45}&lt;br /&gt;
#nvk *{box-sizing:border-box}&lt;br /&gt;
#nvk .nvk-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:14px;margin:12px 0}&lt;br /&gt;
#nvk .nvk-f label{display:block;font-weight:700;margin-bottom:4px}&lt;br /&gt;
#nvk select{width:100%;padding:9px 8px;font:inherit;color:#202122;background:#fff;border:1px solid #a2a9b1;border-radius:4px}&lt;br /&gt;
#nvk .nvk-help{font-size:.85em;opacity:.75;margin-top:3px}&lt;br /&gt;
#nvk fieldset{border:1px solid rgba(128,128,128,.45);border-radius:6px;padding:10px 14px;margin:14px 0}&lt;br /&gt;
#nvk legend{font-weight:700;padding:0 6px}&lt;br /&gt;
#nvk .nvk-o{display:block;padding:4px 0;cursor:pointer}&lt;br /&gt;
#nvk .nvk-o small{opacity:.7}&lt;br /&gt;
#nvk .nvk-o.dis{opacity:.75;cursor:default}&lt;br /&gt;
#nvk .nvk-btn{padding:7px 14px;font:inherit;border:1px solid #a2a9b1;border-radius:4px;background:#f8f9fa;color:#202122;cursor:pointer}&lt;br /&gt;
#nvk #nvk-out{margin-top:18px}&lt;br /&gt;
#nvk h3{margin:18px 0 8px}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-card.opt{border-left-color:#14866d}&lt;br /&gt;
#nvk .nvk-card.rad{border-left-color:#fff;background:rgba(255,255,255,.08)}&lt;br /&gt;
#nvk .nvk-card b{display:block}&lt;br /&gt;
#nvk .nvk-links{margin-top:4px;font-weight:600}&lt;br /&gt;
#nvk .nvk-links a{margin-right:14px}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-miss{opacity:.8;font-style:italic}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-card .nvk-img{max-width:230px;max-height:150px}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-card.hl{border:2px solid #36c;border-left-width:8px;background:rgba(51,102,204,.12);padding:12px 14px}&lt;br /&gt;
#nvk .nvk-card.hl b{font-size:1.1em}&lt;br /&gt;
#nvk .nvk-img.wide{max-width:min(100%,460px);max-height:none}&lt;br /&gt;
#nvk #nvk-form{margin-top:22px}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-grid&amp;quot; id=&amp;quot;nvk-fields&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;fieldset id=&amp;quot;nvk-optset&amp;quot;&amp;gt;&amp;lt;legend&amp;gt;Zusatzoptionen&amp;lt;/legend&amp;gt;&amp;lt;div id=&amp;quot;nvk-opts&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/fieldset&amp;gt;&lt;br /&gt;
&amp;lt;button type=&amp;quot;button&amp;quot; class=&amp;quot;nvk-btn&amp;quot; id=&amp;quot;nvk-reset&amp;quot;&amp;gt;Auswahl zurücksetzen&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk-out&amp;quot; aria-live=&amp;quot;polite&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;fieldset id=&amp;quot;nvk-form&amp;quot; style=&amp;quot;display:none&amp;quot;&amp;gt;&amp;lt;legend&amp;gt;Anfrage senden&amp;lt;/legend&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;nvk-help&amp;quot;&amp;gt;Deine Auswahl und die Liste oben werden automatisch mitgesendet. Alle Felder mit * sind Pflicht.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-grid&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-name&amp;quot;&amp;gt;Name *&amp;lt;/label&amp;gt;&amp;lt;input id=&amp;quot;nvk-name&amp;quot; type=&amp;quot;text&amp;quot; autocomplete=&amp;quot;name&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-mail&amp;quot;&amp;gt;E-Mail *&amp;lt;/label&amp;gt;&amp;lt;input id=&amp;quot;nvk-mail&amp;quot; type=&amp;quot;email&amp;quot; autocomplete=&amp;quot;email&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-size&amp;quot;&amp;gt;Gewünschte Displaygröße (optional)&amp;lt;/label&amp;gt;&amp;lt;select id=&amp;quot;nvk-size&amp;quot;&amp;gt;&amp;lt;option value=&amp;quot;&amp;quot;&amp;gt;Keine Angabe / Beratung gewünscht&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;7&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;8.8&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;9&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;10.25&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;12.3&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;14.9&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;Andere Größe (bitte im Kommentar nennen)&amp;lt;/option&amp;gt;&amp;lt;/select&amp;gt;&amp;lt;div class=&amp;quot;nvk-help&amp;quot;&amp;gt;Diagonale in Zoll. Nicht jede Größe gibt es für jede Baureihe, das prüfen wir für Dich.&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-vin&amp;quot;&amp;gt;VIN oder FGN (optional)&amp;lt;/label&amp;gt;&amp;lt;input id=&amp;quot;nvk-vin&amp;quot; type=&amp;quot;text&amp;quot; maxlength=&amp;quot;17&amp;quot; placeholder=&amp;quot;AB12345 oder 17-stellige FGN&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-msg&amp;quot;&amp;gt;Kommentar *&amp;lt;/label&amp;gt;&amp;lt;textarea id=&amp;quot;nvk-msg&amp;quot; rows=&amp;quot;4&amp;quot;&amp;gt;&amp;lt;/textarea&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot; style=&amp;quot;max-width:300px&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-cap&amp;quot; id=&amp;quot;nvk-capq&amp;quot;&amp;gt;Sicherheitsfrage *&amp;lt;/label&amp;gt;&amp;lt;input id=&amp;quot;nvk-cap&amp;quot; type=&amp;quot;text&amp;quot; inputmode=&amp;quot;numeric&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;input id=&amp;quot;nvk-hp&amp;quot; type=&amp;quot;text&amp;quot; tabindex=&amp;quot;-1&amp;quot; autocomplete=&amp;quot;off&amp;quot; aria-hidden=&amp;quot;true&amp;quot; style=&amp;quot;position:absolute;left:-9999px;width:1px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;label class=&amp;quot;nvk-o&amp;quot;&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; id=&amp;quot;nvk-dsgvo&amp;quot;&amp;gt; Ich stimme zu, dass meine Angaben zur Bearbeitung der Anfrage per E-Mail verarbeitet werden. *&amp;lt;/label&amp;gt;&lt;br /&gt;
&amp;lt;button type=&amp;quot;button&amp;quot; class=&amp;quot;nvk-btn&amp;quot; id=&amp;quot;nvk-send&amp;quot;&amp;gt;Anfrage senden&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk-status&amp;quot; class=&amp;quot;nvk-note&amp;quot; style=&amp;quot;display:none&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/fieldset&amp;gt;&lt;br /&gt;
&amp;lt;noscript&amp;gt;Für den Konfigurator wird JavaScript benötigt.&amp;lt;/noscript&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
(function () {&lt;br /&gt;
&amp;quot;use strict&amp;quot;;&lt;br /&gt;
/* =====================================================================&lt;br /&gt;
   KONFIGURATION - hier wird gepflegt.&lt;br /&gt;
   Textformat in Hinweisen: [b]fett[/b]  [br] Zeilenumbruch  [a=URL]Linktext[/a]&lt;br /&gt;
   Bitte im Skript KEIN kaufmännisches Und, kein Kleiner-/Größer-Zeichen&lt;br /&gt;
   und keine Leerzeilen verwenden (das Wiki wandelt sie um).&lt;br /&gt;
   ===================================================================== */&lt;br /&gt;
var SHOP = &amp;quot;https://shop.ibus-app.de/&amp;quot;;&lt;br /&gt;
var WIKI = &amp;quot;https://wiki.ibus-app.de/index.php?title=&amp;quot;;&lt;br /&gt;
/* Bilder aus dem Wiki (Thumbnail-Adressen; Klick öffnet automatisch das Originalbild) */&lt;br /&gt;
var IM = &amp;quot;https://xtrons.ibus-app.de/images/thumb/&amp;quot;;&lt;br /&gt;
var P = {&lt;br /&gt;
  schema:  IM + &amp;quot;e/ea/BMW_E39_Verl%C3%A4ngerungen_EXL005%2BFAKRA_.png/135px-BMW_E39_Verl%C3%A4ngerungen_EXL005%2BFAKRA_.png&amp;quot;,&lt;br /&gt;
  exl005:  IM + &amp;quot;7/70/Exl005-1.webp/257px-Exl005-1.webp.png&amp;quot;,&lt;br /&gt;
  fakra6m: IM + &amp;quot;d/d8/FM-extension_01_1.png/270px-FM-extension_01_1.png&amp;quot;,&lt;br /&gt;
  isofakra: IM + &amp;quot;4/4e/ISO-FAKRA_1.png/270px-ISO-FAKRA_1.png&amp;quot;,&lt;br /&gt;
  bm24:    IM + &amp;quot;8/82/BM24.png/130px-BM24.png&amp;quot;,&lt;br /&gt;
  iso:     IM + &amp;quot;d/dd/Iso.jpg/69px-Iso.jpg&amp;quot;,&lt;br /&gt;
  bm54:    IM + &amp;quot;3/34/BM54.png/135px-BM54.png&amp;quot;,&lt;br /&gt;
  fakra:   IM + &amp;quot;b/b3/Fakra.jpg/100px-Fakra.jpg&amp;quot;,&lt;br /&gt;
  pfeil:   IM + &amp;quot;e/ee/Navi_E46.jpg/239px-Navi_E46.jpg&amp;quot;,&lt;br /&gt;
  noquad:  IM + &amp;quot;6/68/No_elongation.jpg/180px-No_elongation.jpg&amp;quot;,&lt;br /&gt;
  noexl6:  IM + &amp;quot;7/7b/No_EXL006.jpg/180px-No_EXL006.jpg&amp;quot;,&lt;br /&gt;
  halter:  IM + &amp;quot;3/3b/Halter_Alu.webp/92px-Halter_Alu.webp.png&amp;quot;,&lt;br /&gt;
  deepobd: &amp;quot;https://xtrons.ibus-app.de/images/d/d4/DeepOBD_Interface_1.png&amp;quot;,&lt;br /&gt;
  n43:     IM + &amp;quot;e/e4/Navi4_3.jpg/240px-Navi4_3.jpg&amp;quot;,&lt;br /&gt;
  n169:    IM + &amp;quot;8/8a/Navi16_9.jpg/240px-Navi16_9.jpg&amp;quot;,&lt;br /&gt;
  radio:   IM + &amp;quot;9/96/E39_Radio.jpg/240px-E39_Radio.jpg&amp;quot;,&lt;br /&gt;
  idrive:  &amp;quot;https://xtrons.ibus-app.de/images/0/02/MASK-CCC-CIC-NBT-EVO-iDrive.jpg&amp;quot;,&lt;br /&gt;
  iris:    &amp;quot;https://xtrons.ibus-app.de/images/b/be/BusinessKas_IRISG.jpg&amp;quot;,&lt;br /&gt;
  resler:  &amp;quot;https://xtrons.ibus-app.de/images/d/d1/Resler_Modul_01.png&amp;quot;,&lt;br /&gt;
  can:     &amp;quot;https://xtrons.ibus-app.de/images/6/69/CAN_Interface.png&amp;quot;,&lt;br /&gt;
  funktr:  IM + &amp;quot;7/7e/E46_Funktionstraeger.png/240px-E46_Funktionstraeger.png&amp;quot;&lt;br /&gt;
};&lt;br /&gt;
/* Anfrage-Formular: MAIL_TO = Empfänger. SEND_URL leer = E-Mail-Programm des Kunden öffnen (mailto).&lt;br /&gt;
   SEND_URL = Adresse des Server-Skripts send-anfrage.php = Versand direkt vom Server (mit CC an den Kunden). */&lt;br /&gt;
var MAIL_TO = &amp;quot;info@ibus-app.de&amp;quot;;&lt;br /&gt;
var MAIL_SUBJECT = &amp;quot;Anfrage aus Android Radio Konfigurator&amp;quot;;&lt;br /&gt;
var SEND_URL = &amp;quot;https://xtrons.ibus-app.de/send-anfrage.php&amp;quot;;&lt;br /&gt;
/* ---- 1) Baureihen --------------------------------------------------------&lt;br /&gt;
   v = Shop-Kategorie (Link: SHOP + bmw-radios/ + v + /)&lt;br /&gt;
   gen: alt = I-BUS-Fahrzeuge (E38/E39/E46/E53/E83)&lt;br /&gt;
        b   = M-ASK / CCC / CIC     c = CIC / NBT / NBT EVO&lt;br /&gt;
   body = Karosserieformen (siehe BODY)                                      */&lt;br /&gt;
var BODY = { limo: &amp;quot;Limousine&amp;quot;, touring: &amp;quot;Touring&amp;quot;, coupe: &amp;quot;Coupé&amp;quot;, cabrio: &amp;quot;Cabrio&amp;quot;, schraeg: &amp;quot;Schrägheck&amp;quot;,&lt;br /&gt;
  compact: &amp;quot;Compact&amp;quot;, gt: &amp;quot;Gran Turismo&amp;quot;, gc: &amp;quot;Gran Coupé&amp;quot;, suv: &amp;quot;SUV / SAV&amp;quot;, roadster: &amp;quot;Roadster&amp;quot; };&lt;br /&gt;
var VEHICLES = [&lt;br /&gt;
  { v: &amp;quot;1er-e8x&amp;quot;, t: &amp;quot;1er E8x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;schraeg,coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;1er-f2x&amp;quot;, t: &amp;quot;1er F2x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;schraeg&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;2er-f2x&amp;quot;, t: &amp;quot;2er F2x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;3er-e46&amp;quot;, t: &amp;quot;3er E46&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;limo,touring,coupe,cabrio,compact&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;3er-e9x&amp;quot;, t: &amp;quot;3er E9x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;limo,touring,coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;3er-f3x&amp;quot;, t: &amp;quot;3er F3x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;limo,touring,gt&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;4er-f3x&amp;quot;, t: &amp;quot;4er F3x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;coupe,cabrio,gc&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;5er-e39&amp;quot;, t: &amp;quot;5er E39&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;limo,touring&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;5er-e6x&amp;quot;, t: &amp;quot;5er E6x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;limo,touring&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;5er-f1x&amp;quot;, t: &amp;quot;5er F1x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;limo,touring,gt&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;6er-e6x&amp;quot;, t: &amp;quot;6er E6x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;7er-e38&amp;quot;, t: &amp;quot;7er E38&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;limo&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;7er-e65&amp;quot;, t: &amp;quot;7er E65&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;limo&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;7er-f01&amp;quot;, t: &amp;quot;7er F01&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;limo&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x1-e84&amp;quot;, t: &amp;quot;X1 E84&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x1-f48&amp;quot;, t: &amp;quot;X1 F48&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x3-e83&amp;quot;, t: &amp;quot;X3 E83&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x3-f25&amp;quot;, t: &amp;quot;X3 F25&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x5-e53&amp;quot;, t: &amp;quot;X5 E53&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x5-e70&amp;quot;, t: &amp;quot;X5 E70&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x5-f15&amp;quot;, t: &amp;quot;X5 F15&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x6-e71&amp;quot;, t: &amp;quot;X6 E71&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;z4-e85e86&amp;quot;, t: &amp;quot;Z4 E85/E86&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;roadster,coupe&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;z4-e89&amp;quot;, t: &amp;quot;Z4 E89&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;roadster&amp;quot;, noCat: true }&lt;br /&gt;
];&lt;br /&gt;
/* Fahrzeuge mit K-CAN App (Beta) */&lt;br /&gt;
var KCAN = [&amp;quot;1er-e8x&amp;quot;, &amp;quot;3er-e9x&amp;quot;, &amp;quot;5er-e6x&amp;quot;, &amp;quot;6er-e6x&amp;quot;, &amp;quot;7er-e65&amp;quot;, &amp;quot;x1-e84&amp;quot;, &amp;quot;x5-e70&amp;quot;, &amp;quot;x6-e71&amp;quot;, &amp;quot;z4-e89&amp;quot;];&lt;br /&gt;
var bodyValues = Object.keys(BODY).map(function (k) {&lt;br /&gt;
  return { v: k, t: BODY[k], only: { vehicle: VEHICLES.filter(function (x) { return x.body.split(&amp;quot;,&amp;quot;).indexOf(k) !== -1; }).map(function (x) { return x.v; }) } };&lt;br /&gt;
});&lt;br /&gt;
/* ---- 2) Auswahlfelder ------------------------------------------------------&lt;br /&gt;
   only = Wert nur anbieten, wenn Bedingung passt   show = Feld nur dann zeigen&lt;br /&gt;
   optional = muss nicht gewählt werden             auto = bei nur einem Wert vorwählen */&lt;br /&gt;
var FIELDS = [&lt;br /&gt;
  { id: &amp;quot;vehicle&amp;quot;, label: &amp;quot;Fahrzeug&amp;quot;, values: VEHICLES.map(function (x) { return { v: x.v, t: &amp;quot;BMW &amp;quot; + x.t }; }) },&lt;br /&gt;
  { id: &amp;quot;factory&amp;quot;, label: &amp;quot;Verbaut ab Werk&amp;quot;, pre: { when: { gen: [&amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;] }, html: &amp;quot;[b]So erkennst Du Dein System:[/b][br][imgw=&amp;quot; + P.idrive + &amp;quot;]&amp;quot; }, values: [&lt;br /&gt;
    { v: &amp;quot;iris&amp;quot;,  t: &amp;quot;Radio mit IRIS&amp;quot;, only: { vehicle: [&amp;quot;3er-e46&amp;quot;, &amp;quot;5er-e39&amp;quot;, &amp;quot;7er-e38&amp;quot;, &amp;quot;x5-e53&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.iris + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;mid&amp;quot;,   t: &amp;quot;Radio mit MID&amp;quot;,  only: { gen: [&amp;quot;alt&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.radio + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;n43&amp;quot;,   t: &amp;quot;4:3 Navi&amp;quot;,       only: { vehicle: [&amp;quot;5er-e39&amp;quot;, &amp;quot;7er-e38&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.n43 + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;n169&amp;quot;,  t: &amp;quot;16:9 Navi&amp;quot;,      only: { gen: [&amp;quot;alt&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.n169 + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;pfeil&amp;quot;, t: &amp;quot;Pfeilnavi&amp;quot;,      only: { vehicle: [&amp;quot;3er-e46&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.pfeil + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;mask&amp;quot;,  t: &amp;quot;M-ASK&amp;quot;,          only: { gen: [&amp;quot;b&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;ccc&amp;quot;,   t: &amp;quot;CCC&amp;quot;,            only: { gen: [&amp;quot;b&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;cic&amp;quot;,   t: &amp;quot;CIC&amp;quot;,            only: { gen: [&amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;nbt&amp;quot;,   t: &amp;quot;NBT&amp;quot;,            only: { gen: [&amp;quot;c&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;nbtevo&amp;quot;, t: &amp;quot;NBT EVO&amp;quot;,       only: { gen: [&amp;quot;c&amp;quot;] } } ] },&lt;br /&gt;
  { id: &amp;quot;trunk&amp;quot;, label: &amp;quot;Wo sitzt das Radiomodul des Pfeilnavis?&amp;quot;, optional: true, show: { factory: [&amp;quot;pfeil&amp;quot;] },&lt;br /&gt;
    help: &amp;quot;Bitte prüfen: Sitzt das Modul im Kofferraum, oder im Pfeilnavi selbst (Quadlock hinten neben dem Antennenstecker)?[br][img=&amp;quot; + P.pfeil + &amp;quot;]&amp;quot;,&lt;br /&gt;
    values: [&lt;br /&gt;
    { v: &amp;quot;ja&amp;quot;, t: &amp;quot;Im Kofferraum (Verlängerungen nötig)&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;nein&amp;quot;, t: &amp;quot;Im Pfeilnavi, Quadlock hinten (keine Verlängerung)&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;unk&amp;quot;, t: &amp;quot;Weiß ich nicht&amp;quot; } ] },&lt;br /&gt;
  { id: &amp;quot;aux&amp;quot;, label: &amp;quot;AUX-IN verfügbar?&amp;quot;, show: { gen: [&amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;] }, values: [&lt;br /&gt;
    { v: &amp;quot;ja&amp;quot;, t: &amp;quot;Ja&amp;quot; }, { v: &amp;quot;nein&amp;quot;, t: &amp;quot;Nein&amp;quot; } ] },&lt;br /&gt;
  { id: &amp;quot;sound&amp;quot;, label: &amp;quot;Soundsystem&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;stereo&amp;quot;, t: &amp;quot;Stereo&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;hifi&amp;quot;,   t: &amp;quot;Hifi&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;dsp&amp;quot;,    t: &amp;quot;DSP&amp;quot;, only: { vehicle: [&amp;quot;7er-e38&amp;quot;, &amp;quot;5er-e39&amp;quot;, &amp;quot;x5-e53&amp;quot;, &amp;quot;x3-e83&amp;quot;] }, info: &amp;quot;[a=&amp;quot; + WIKI + &amp;quot;Habe_ich_DSP%3F]Habe ich DSP?[/a]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;hk&amp;quot;,     t: &amp;quot;Harman Kardon&amp;quot;, only: { vehicle: [&amp;quot;3er-e46&amp;quot;, &amp;quot;z4-e85e86&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;logic7&amp;quot;, t: &amp;quot;Logic7&amp;quot;, only: { vehicle: [&amp;quot;3er-e9x&amp;quot;, &amp;quot;5er-e6x&amp;quot;, &amp;quot;6er-e6x&amp;quot;, &amp;quot;7er-e65&amp;quot;, &amp;quot;1er-e8x&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;hksur&amp;quot;,  t: &amp;quot;Harman Kardon Surround&amp;quot;, only: { vehicle: [&amp;quot;1er-f2x&amp;quot;, &amp;quot;2er-f2x&amp;quot;, &amp;quot;3er-f3x&amp;quot;, &amp;quot;4er-f3x&amp;quot;, &amp;quot;5er-f1x&amp;quot;] } } ] },&lt;br /&gt;
  { id: &amp;quot;current&amp;quot;, label: &amp;quot;Aktuell verbaut&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;werk&amp;quot;, t: &amp;quot;Werksradio / Werksnavi&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;nach&amp;quot;, t: &amp;quot;Nachrüst-Radio / -Navi&amp;quot; } ] },&lt;br /&gt;
  { id: &amp;quot;body&amp;quot;, label: &amp;quot;Karosserie&amp;quot;, auto: true, values: bodyValues },&lt;br /&gt;
  { id: &amp;quot;ant&amp;quot;, label: &amp;quot;Antennenstecker am Radio (optional)&amp;quot;, optional: true, def: &amp;quot;unk&amp;quot;,&lt;br /&gt;
    show: { vehicle: [&amp;quot;7er-e38&amp;quot;, &amp;quot;5er-e39&amp;quot;, &amp;quot;3er-e46&amp;quot;, &amp;quot;x5-e53&amp;quot;] },&lt;br /&gt;
    values: [&lt;br /&gt;
    { v: &amp;quot;unk&amp;quot;,   t: &amp;quot;Weiß ich nicht&amp;quot;, info: &amp;quot;[b]BM24[/b] (Rundpin) = ISO-Antennenstecker:[br][img=&amp;quot; + P.bm24 + &amp;quot;][img=&amp;quot; + P.iso + &amp;quot;][br][b]BM54[/b] = FAKRA:[br][img=&amp;quot; + P.bm54 + &amp;quot;][img=&amp;quot; + P.fakra + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;iso&amp;quot;,   t: &amp;quot;ISO (BM24, Rundpin)&amp;quot;, info: &amp;quot;[img=&amp;quot; + P.bm24 + &amp;quot;][img=&amp;quot; + P.iso + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;fakra&amp;quot;, t: &amp;quot;FAKRA (BM54)&amp;quot;, info: &amp;quot;[img=&amp;quot; + P.bm54 + &amp;quot;][img=&amp;quot; + P.fakra + &amp;quot;]&amp;quot; } ] }&lt;br /&gt;
];&lt;br /&gt;
/* ---- 3) Zusatzoptionen (Mehrfachauswahl) ---------------------------------&lt;br /&gt;
   show = nur sichtbar wenn Bedingung passt   requires = nur sichtbar wenn diese Optionen gewählt sind&lt;br /&gt;
   excl = Optionen derselben Gruppe schließen sich aus   items = Artikel aus ITEMS */&lt;br /&gt;
var OPTS = [&lt;br /&gt;
  { id: &amp;quot;halter&amp;quot;,  t: &amp;quot;Radio-Halter&amp;quot;, sub: &amp;quot;nur BMW E39&amp;quot;, show: { vehicle: [&amp;quot;5er-e39&amp;quot;] }, items: [&amp;quot;halter&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;ibus&amp;quot;,    t: &amp;quot;I-BUS App&amp;quot;, show: { gen: [&amp;quot;alt&amp;quot;] }, items: [&amp;quot;ibus&amp;quot;, &amp;quot;resler&amp;quot;, &amp;quot;bclic&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;deepobd&amp;quot;, t: &amp;quot;DeepOBD (Diagnose)&amp;quot;, items: [&amp;quot;deepobd&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;can&amp;quot;,     t: &amp;quot;CAN Interface&amp;quot;, sub: &amp;quot;Addon - nur mit I-BUS App&amp;quot;, show: { gen: [&amp;quot;alt&amp;quot;] }, requires: [&amp;quot;ibus&amp;quot;], items: [&amp;quot;can&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;kcan&amp;quot;,    t: &amp;quot;K-CAN App (Beta)&amp;quot;, sub: &amp;quot;Pendant zur I-BUS App&amp;quot;, show: { vehicle: KCAN }, items: [&amp;quot;kcan&amp;quot;, &amp;quot;kcanlic&amp;quot;, &amp;quot;can&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;tpms&amp;quot;,    t: &amp;quot;TPMS (Reifendruck)&amp;quot;, items: [&amp;quot;tpms&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;dab1&amp;quot;,    t: &amp;quot;DAB+ (Single Receiver)&amp;quot;, excl: &amp;quot;dab&amp;quot;, items: [&amp;quot;dab1&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;dab2&amp;quot;,    t: &amp;quot;DAB+ (Dual Receiver)&amp;quot;,   excl: &amp;quot;dab&amp;quot;, items: [&amp;quot;dab2&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;rcam&amp;quot;,    t: &amp;quot;Rückfahrkamera&amp;quot;, items: [&amp;quot;rcam&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;fcam&amp;quot;,    t: &amp;quot;Front-Kamera&amp;quot;, items: [&amp;quot;fcam&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;tool&amp;quot;,    t: &amp;quot;Einbau-Werkzeug (Kunststoffheber)&amp;quot;, items: [&amp;quot;tool&amp;quot;] }&lt;br /&gt;
];&lt;br /&gt;
/* Erzwungene Optionen (werden automatisch gesetzt und gesperrt) */&lt;br /&gt;
var FORCED = [&lt;br /&gt;
  { when: { sound: [&amp;quot;dsp&amp;quot;] }, opts: [&amp;quot;ibus&amp;quot;], why: &amp;quot;wegen DSP erforderlich&amp;quot; }&lt;br /&gt;
];&lt;br /&gt;
/* ---- 4) Artikel ------------------------------------------------------------&lt;br /&gt;
   u = Shop-Link (ut = Linktext)   w = Wiki-Link (wt = Linktext)   leer = kein Link&lt;br /&gt;
   skipIf = Artikel entfällt, wenn der genannte Artikel schon in der Liste steht */&lt;br /&gt;
var ITEMS = {&lt;br /&gt;
  exl005:  { t: &amp;quot;Verlängerung EXL005&amp;quot;, d: &amp;quot;Ersetzt das Radiomodul im Kofferraum.&amp;quot;, u: SHOP + &amp;quot;detail/index/sArticle/212/&amp;quot;, img: [P.exl005, P.schema] },&lt;br /&gt;
  fakra6m: { t: &amp;quot;Verlängerung 6 m FAKRA(m) auf FAKRA(f), gewinkelt&amp;quot;, d: &amp;quot;Antennenverlängerung vom Kofferraum nach vorn.&amp;quot;, img: [P.fakra6m],&lt;br /&gt;
             u: SHOP + &amp;quot;shop/zubehoer/adapterkabel/192/verlaengerung-6m-fakra-m-auf-fakra-f-kurz-gewinkelt&amp;quot; },&lt;br /&gt;
  isoada:  { t: &amp;quot;Adapter ISO-Stecker auf FAKRA, gewinkelt (15 cm)&amp;quot;, d: &amp;quot;Nötig bei ISO-Antennenstecker (BM24, Rundpin).&amp;quot;, img: [P.isofakra],&lt;br /&gt;
             u: SHOP + &amp;quot;shop/zubehoer/adapterkabel/193/adapter-kabel-iso-f-auf-fakra-f-kurz-gewinkelt-15cm&amp;quot; },&lt;br /&gt;
  bcdsp:   { t: &amp;quot;I-BUS App - BC+DSP Lizenz&amp;quot;, d: &amp;quot;Ohne DSP-Lizenz arbeitet das Werks-DSP nicht.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/lizenzen/171/i-bus-app-bc-dsp-lizenz&amp;quot;,&lt;br /&gt;
             w: WIKI + &amp;quot;Habe_ich_DSP%3F&amp;quot;, wt: &amp;quot;Wiki: Habe ich DSP?&amp;quot; },&lt;br /&gt;
  halter:  { t: &amp;quot;Alu-Halter zur Radio-Montage im BMW E39&amp;quot;, d: &amp;quot;Empfohlen bei Radios, die nicht von AVIN stammen.&amp;quot;, img: [P.halter],&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/radiohalter/185/alu-halter-zur-radio-montage-im-bmw-e39&amp;quot; },&lt;br /&gt;
  ibus:    { t: &amp;quot;I-BUS App&amp;quot;, hl: true,&lt;br /&gt;
             d: &amp;quot;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.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;cat/index/sCategory/42&amp;quot;,&lt;br /&gt;
             links: [&lt;br /&gt;
               { u: WIKI + &amp;quot;Was_brauche_ich_um_die_I-BUS_App_nutzen_zu_k%C3%B6nnen%3F&amp;quot;, t: &amp;quot;Wiki: Was brauche ich für die I-BUS App?&amp;quot; },&lt;br /&gt;
               { u: WIKI + &amp;quot;Funktionen&amp;quot;, t: &amp;quot;Liste aller I-BUS App Funktionen (BMW E38|E39|E46|E53|E83)&amp;quot; },&lt;br /&gt;
               { u: WIKI + &amp;quot;Was_geht_beim_BMW_E46_nicht&amp;quot;, t: &amp;quot;Was geht beim BMW E46, E83, E85,.. nicht? (da werkseitig nicht verbaut)&amp;quot; },&lt;br /&gt;
               { u: WIKI + &amp;quot;Funktionseinschr%C3%A4nkungen_nach_Baujahr/Ausstattung/Modell&amp;quot;, t: &amp;quot;Funktionseinschränkungen nach Baujahr/Ausstattung/Modell&amp;quot; } ] },&lt;br /&gt;
  resler:  { t: &amp;quot;Resler USB I-BUS Modul inkl. Anschlusskabel&amp;quot;, d: &amp;quot;Verbindet I-BUS App und Fahrzeug.&amp;quot;, img: [P.resler],&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/interfaces-module/191/resler-usb-i-bus-modul-inkl.-anschlusskabel&amp;quot;,&lt;br /&gt;
             w: &amp;quot;https://wiki.ibus-app.de/index.php?title=Hauptseite#Einbauanleitung_f.C3.BCr_Resler_Modul_und_Resler_Interface&amp;quot;, wt: &amp;quot;Einbauanleitung Resler Modul&amp;quot; },&lt;br /&gt;
  bclic:   { t: &amp;quot;I-BUS App - BC Lizenz&amp;quot;, d: &amp;quot;Schaltet u. a. die BC-Daten der App frei.&amp;quot;, skipIf: &amp;quot;bcdsp&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/lizenzen/167/i-bus-app-bc-lizenz&amp;quot; },&lt;br /&gt;
  deepobd: { t: &amp;quot;Deep OBD OBD-II Bluetooth-Adapter&amp;quot;, d: &amp;quot;Live-Werte auslesen, Fehler lesen und löschen.&amp;quot;, img: [P.deepobd],&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/interfaces-module/258/deep-obd-obd-ii-bluetooth-adapter?c=54&amp;quot;,&lt;br /&gt;
             w: &amp;quot;https://xtrons.ibus-app.de/index.php?title=DeepOBD_-_Adapter_und_App_einrichten&amp;quot;, wt: &amp;quot;Wiki: DeepOBD einrichten&amp;quot; },&lt;br /&gt;
  can:     { t: &amp;quot;CAN-Bus Interface inkl. Anschlusskabel&amp;quot;, d: &amp;quot;Addon, funktioniert nur zusammen mit der I-BUS App bzw. der K-CAN App.&amp;quot;, img: [P.can],&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/interfaces-module/346/can-bus-interface-inkl.-anschlusskabel&amp;quot;,&lt;br /&gt;
             w: WIKI + &amp;quot;Einbauanleitung_CAN-Bus_Interface&amp;quot;, wt: &amp;quot;Einbauanleitung CAN-Bus Interface&amp;quot; },&lt;br /&gt;
  kcan:    { t: &amp;quot;K-CAN App (Beta)&amp;quot;, d: &amp;quot;Pendant zur I-BUS App für Fahrzeuge mit K-CAN, aktuell als Betaversion.&amp;quot;,&lt;br /&gt;
             w: &amp;quot;https://wiki.kcan-app.de/&amp;quot;, wt: &amp;quot;Wiki zur K-CAN App&amp;quot; },&lt;br /&gt;
  kcanlic: { t: &amp;quot;K-CAN App - Lizenz Betaversion&amp;quot;, d: &amp;quot;Beta-Lizenz für die K-CAN App.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/lizenzen/358/k-can-app-lizenz-betaversion&amp;quot; },&lt;br /&gt;
  tpms:    { t: &amp;quot;TPMS - Reifendruckkontrolle&amp;quot;, d: &amp;quot;&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/tpms/&amp;quot; },&lt;br /&gt;
  dab1:    { t: &amp;quot;DAB+ Empfänger inkl. Antenne (Single)&amp;quot;, d: &amp;quot;&amp;quot;, w: &amp;quot;https://xtrons.ibus-app.de/index.php?title=Installation_der_DAB%2B_Antenne&amp;quot;, wt: &amp;quot;Installation der DAB+ Antenne&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/dab/291/dab-empfaenger-inkl.-antenne-usbdab04&amp;quot; },&lt;br /&gt;
  dab2:    { t: &amp;quot;Dual DAB+ Empfänger-Stick inkl. 2 Antennen&amp;quot;, d: &amp;quot;&amp;quot;, w: &amp;quot;https://xtrons.ibus-app.de/index.php?title=Installation_der_DAB%2B_Antenne&amp;quot;, wt: &amp;quot;Installation der DAB+ Antenne&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/dab/391/dual-dab-empfaenger-stick-inkl.-2-antennen-acusbdab05t?c=75&amp;quot; },&lt;br /&gt;
  rcam:    { t: &amp;quot;Rückfahrkamera&amp;quot;, d: &amp;quot;&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/kameras/&amp;quot;, ut: &amp;quot;Kameras im Shop ansehen →&amp;quot; },&lt;br /&gt;
  fcam:    { t: &amp;quot;Front-Kamera&amp;quot;, d: &amp;quot;&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/kameras/&amp;quot;, ut: &amp;quot;Kameras im Shop ansehen →&amp;quot; },&lt;br /&gt;
  tool:    { t: &amp;quot;Einbau-Werkzeug (Kunststoffheber)&amp;quot;, d: &amp;quot;Zum schonenden Lösen der Verkleidungen.&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/einbauwerkzeug/&amp;quot; }&lt;br /&gt;
};&lt;br /&gt;
/* ---- 5) Regeln --------------------------------------------------------------&lt;br /&gt;
   type: need (Das brauchst Du) oder hint (Hinweise)   when = Bedingung auf die Felder&lt;br /&gt;
   opts = diese Zusatzoptionen müssen gewählt sein      items = Artikel   html = Text&lt;br /&gt;
   Abgeleitete Werte: gen (alt/b/c) und module (ja/nein/unk = Radiomodul im Kofferraum, nur gen alt) */&lt;br /&gt;
var RULES = [&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { current: [&amp;quot;werk&amp;quot;], module: [&amp;quot;ja&amp;quot;] }, items: [&amp;quot;exl005&amp;quot;, &amp;quot;fakra6m&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { current: [&amp;quot;nach&amp;quot;], module: [&amp;quot;ja&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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=&amp;quot; + P.noquad + &amp;quot;][img=&amp;quot; + P.noexl6 + &amp;quot;]&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;ja&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;nein&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;unk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { ant: [&amp;quot;iso&amp;quot;] }, items: [&amp;quot;isoada&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { ant: [&amp;quot;unk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Antennenstecker:[/b] [b]BM24[/b] (Rundpin) = ISO-Antennenstecker, ggf. wird der [a=&amp;quot; + SHOP + &amp;quot;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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { sound: [&amp;quot;dsp&amp;quot;] }, items: [&amp;quot;bcdsp&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { sound: [&amp;quot;dsp&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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=&amp;quot; + WIKI + &amp;quot;Habe_ich_DSP%3F]Habe ich DSP?[/a]&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { sound: [&amp;quot;hk&amp;quot;], gen: [&amp;quot;alt&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Harman Kardon:[/b] Benötigt [b]keine[/b] DSP-Lizenz. Das Remote-Signal (+12 V, wenn Radio an) genügt zum Starten.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { aux: [&amp;quot;nein&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]AUX-IN:[/b] Der AUX-IN muss codiert werden. Optional kann ein FM-Transmitter genutzt werden - das ist nicht empfohlen.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;7er-e38&amp;quot;, &amp;quot;x5-e53&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Montage:[/b] Radios für BMW E38/E53 benötigen keine extra Halterungen.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;5er-e39&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;3er-e46&amp;quot;], factory: [&amp;quot;iris&amp;quot;, &amp;quot;mid&amp;quot;, &amp;quot;pfeil&amp;quot;], current: [&amp;quot;werk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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]&amp;quot; +&lt;br /&gt;
          &amp;quot;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]&amp;quot; +&lt;br /&gt;
          &amp;quot;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=&amp;quot; + P.funktr + &amp;quot;]&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { factory: [&amp;quot;cic&amp;quot;, &amp;quot;nbt&amp;quot;, &amp;quot;nbtevo&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Lichtleiter:[/b] Ggf. vorhandene Lichtleiter (MOST) müssen aus dem BMW-Stecker in den Xtrons-Adapter umgesteckt werden.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { factory: [&amp;quot;mask&amp;quot;, &amp;quot;ccc&amp;quot;, &amp;quot;cic&amp;quot;, &amp;quot;nbt&amp;quot;, &amp;quot;nbtevo&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, opts: [&amp;quot;kcan&amp;quot;], when: {},&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, opts: [&amp;quot;ibus&amp;quot;], when: {},&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: {},&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot; }&lt;br /&gt;
];&lt;br /&gt;
/* =====================================================================&lt;br /&gt;
   PROGRAMMLOGIK&lt;br /&gt;
   ===================================================================== */&lt;br /&gt;
var $ = function (id) { return document.getElementById(id); };&lt;br /&gt;
var sel = {}, picked = {}, summary = &amp;quot;&amp;quot;, capA = 0, capB = 0;&lt;br /&gt;
var fieldsEl = $(&amp;quot;nvk-fields&amp;quot;), optsEl = $(&amp;quot;nvk-opts&amp;quot;), outEl = $(&amp;quot;nvk-out&amp;quot;);&lt;br /&gt;
function full(u) { return u.indexOf(&amp;quot;/thumb/&amp;quot;) === -1 ? u : u.replace(&amp;quot;/thumb/&amp;quot;, &amp;quot;/&amp;quot;).replace(/\/[^\/]+$/, &amp;quot;&amp;quot;); }&lt;br /&gt;
function fmt(t) {&lt;br /&gt;
  return t.replace(/\[imgw=([^\x5D]+)\]/g, function (m, u) {&lt;br /&gt;
    return &amp;quot;\u003Ca href=\&amp;quot;&amp;quot; + full(u) + &amp;quot;\&amp;quot; target=\&amp;quot;_blank\&amp;quot; rel=\&amp;quot;noopener\&amp;quot;\u003E\u003Cimg class=\&amp;quot;nvk-img wide\&amp;quot; src=\&amp;quot;&amp;quot; + u + &amp;quot;\&amp;quot; alt=\&amp;quot;\&amp;quot;\u003E\u003C/a\u003E&amp;quot;;&lt;br /&gt;
  }).replace(/\[img=([^\x5D]+)\]/g, function (m, u) {&lt;br /&gt;
    return &amp;quot;\u003Ca href=\&amp;quot;&amp;quot; + full(u) + &amp;quot;\&amp;quot; target=\&amp;quot;_blank\&amp;quot; rel=\&amp;quot;noopener\&amp;quot;\u003E\u003Cimg class=\&amp;quot;nvk-img\&amp;quot; src=\&amp;quot;&amp;quot; + u + &amp;quot;\&amp;quot; alt=\&amp;quot;\&amp;quot;\u003E\u003C/a\u003E&amp;quot;;&lt;br /&gt;
  }).replace(/\[b\]/g, &amp;quot;\u003Cb\u003E&amp;quot;).replace(/\[\/b\]/g, &amp;quot;\u003C/b\u003E&amp;quot;).replace(/\[br\]/g, &amp;quot;\u003Cbr\u003E&amp;quot;)&lt;br /&gt;
    .replace(/\[a=([^\x5D]+)\]/g, &amp;quot;\u003Ca href=\&amp;quot;$1\&amp;quot; target=\&amp;quot;_blank\&amp;quot; rel=\&amp;quot;noopener\&amp;quot;\u003E&amp;quot;).replace(/\[\/a\]/g, &amp;quot;\u003C/a\u003E&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
function match(cond, s, lenient) {&lt;br /&gt;
  if (!cond) return true;&lt;br /&gt;
  for (var k in cond) {&lt;br /&gt;
    if (!s[k]) { if (lenient) continue; return false; }&lt;br /&gt;
    if (cond[k].indexOf(s[k]) === -1) return false;&lt;br /&gt;
  }&lt;br /&gt;
  return true;&lt;br /&gt;
}&lt;br /&gt;
function vehicleOf(id) { return VEHICLES.filter(function (x) { return x.v === id; })[0]; }&lt;br /&gt;
function derive() {&lt;br /&gt;
  var s = {}, k;&lt;br /&gt;
  for (k in sel) s[k] = sel[k];&lt;br /&gt;
  var veh = vehicleOf(sel.vehicle);&lt;br /&gt;
  if (veh) s.gen = veh.gen;&lt;br /&gt;
  if (s.gen === &amp;quot;alt&amp;quot;) {&lt;br /&gt;
    if (s.factory === &amp;quot;n43&amp;quot; || s.factory === &amp;quot;n169&amp;quot;) s.module = &amp;quot;ja&amp;quot;;&lt;br /&gt;
    else if (s.factory === &amp;quot;iris&amp;quot; || s.factory === &amp;quot;mid&amp;quot;) s.module = &amp;quot;nein&amp;quot;;&lt;br /&gt;
    else if (s.factory === &amp;quot;pfeil&amp;quot;) s.module = s.trunk || &amp;quot;unk&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  return s;&lt;br /&gt;
}&lt;br /&gt;
function forced(s) {&lt;br /&gt;
  var f = {};&lt;br /&gt;
  FORCED.forEach(function (r) { if (match(r.when, s)) r.opts.forEach(function (o) { f[o] = r.why; }); });&lt;br /&gt;
  return f;&lt;br /&gt;
}&lt;br /&gt;
function onSet(s) {&lt;br /&gt;
  var f = forced(s), on = {}, k;&lt;br /&gt;
  for (k in picked) if (picked[k]) on[k] = true;&lt;br /&gt;
  for (k in f) on[k] = true;&lt;br /&gt;
  return { on: on, forced: f };&lt;br /&gt;
}&lt;br /&gt;
function optVisible(o, s, on) {&lt;br /&gt;
  if (!match(o.show, s, true)) return false;&lt;br /&gt;
  return (o.requires || []).every(function (r) { return on[r]; });&lt;br /&gt;
}&lt;br /&gt;
FIELDS.forEach(function (f) {&lt;br /&gt;
  var wrap = document.createElement(&amp;quot;div&amp;quot;); wrap.className = &amp;quot;nvk-f&amp;quot;; wrap.id = &amp;quot;nvk-w-&amp;quot; + f.id;&lt;br /&gt;
  var lab = document.createElement(&amp;quot;label&amp;quot;); lab.htmlFor = &amp;quot;nvk-&amp;quot; + f.id; lab.textContent = f.label;&lt;br /&gt;
  var s = document.createElement(&amp;quot;select&amp;quot;); s.id = &amp;quot;nvk-&amp;quot; + f.id;&lt;br /&gt;
  s.addEventListener(&amp;quot;change&amp;quot;, function () { sel[f.id] = s.value; update(); });&lt;br /&gt;
  wrap.appendChild(lab); wrap.appendChild(s);&lt;br /&gt;
  if (f.help) { var h = document.createElement(&amp;quot;div&amp;quot;); h.className = &amp;quot;nvk-help&amp;quot;; h.innerHTML = fmt(f.help); wrap.appendChild(h); }&lt;br /&gt;
  var inf = document.createElement(&amp;quot;div&amp;quot;); inf.id = &amp;quot;nvk-i-&amp;quot; + f.id; wrap.appendChild(inf);&lt;br /&gt;
  fieldsEl.appendChild(wrap);&lt;br /&gt;
});&lt;br /&gt;
function renderFields() {&lt;br /&gt;
  FIELDS.forEach(function (f) {&lt;br /&gt;
    var s = derive();&lt;br /&gt;
    var wrap = $(&amp;quot;nvk-w-&amp;quot; + f.id), el = $(&amp;quot;nvk-&amp;quot; + f.id);&lt;br /&gt;
    var vis = f.show ? match(f.show, s, false) : true;&lt;br /&gt;
    wrap.style.display = vis ? &amp;quot;&amp;quot; : &amp;quot;none&amp;quot;;&lt;br /&gt;
    if (!vis) { sel[f.id] = &amp;quot;&amp;quot;; return; }&lt;br /&gt;
    var allowed = f.values.filter(function (v) { return match(v.only, s, true); });&lt;br /&gt;
    if (sel[f.id]) { if (!allowed.some(function (v) { return v.v === sel[f.id]; })) sel[f.id] = &amp;quot;&amp;quot;; }&lt;br /&gt;
    if (!sel[f.id]) { if (f.def) sel[f.id] = f.def; }&lt;br /&gt;
    if (!sel[f.id]) { if (f.auto) { if (sel.vehicle) { if (allowed.length === 1) sel[f.id] = allowed[0].v; } } }&lt;br /&gt;
    el.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
    if (!f.def) { var p = document.createElement(&amp;quot;option&amp;quot;); p.value = &amp;quot;&amp;quot;; p.textContent = &amp;quot;– bitte wählen –&amp;quot;; el.appendChild(p); }&lt;br /&gt;
    allowed.forEach(function (v) {&lt;br /&gt;
      var o = document.createElement(&amp;quot;option&amp;quot;); o.value = v.v; o.textContent = v.t; el.appendChild(o);&lt;br /&gt;
    });&lt;br /&gt;
    el.value = sel[f.id] || &amp;quot;&amp;quot;;&lt;br /&gt;
    var cur = allowed.filter(function (v) { return v.v === sel[f.id]; })[0];&lt;br /&gt;
    var pre = f.pre ? (match(f.pre.when, s, false) ? fmt(f.pre.html) : &amp;quot;&amp;quot;) : &amp;quot;&amp;quot;;&lt;br /&gt;
    $(&amp;quot;nvk-i-&amp;quot; + f.id).innerHTML = pre + (cur ? (cur.info ? fmt(cur.info) : &amp;quot;&amp;quot;) : &amp;quot;&amp;quot;);&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
function renderOpts() {&lt;br /&gt;
  var s = derive(), st = onSet(s);&lt;br /&gt;
  OPTS.forEach(function (o) { if (!optVisible(o, s, st.on)) picked[o.id] = false; });&lt;br /&gt;
  st = onSet(s);&lt;br /&gt;
  optsEl.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
  OPTS.forEach(function (o) {&lt;br /&gt;
    if (!optVisible(o, s, st.on)) return;&lt;br /&gt;
    var lab = document.createElement(&amp;quot;label&amp;quot;); lab.className = &amp;quot;nvk-o&amp;quot;;&lt;br /&gt;
    var cb = document.createElement(&amp;quot;input&amp;quot;); cb.type = &amp;quot;checkbox&amp;quot;;&lt;br /&gt;
    cb.checked = !!st.on[o.id];&lt;br /&gt;
    var isForced = !!st.forced[o.id];&lt;br /&gt;
    if (isForced) { cb.disabled = true; lab.className += &amp;quot; dis&amp;quot;; }&lt;br /&gt;
    cb.addEventListener(&amp;quot;change&amp;quot;, function () {&lt;br /&gt;
      picked[o.id] = cb.checked;&lt;br /&gt;
      if (cb.checked) { if (o.excl) OPTS.forEach(function (x) { if (x.excl === o.excl) { if (x.id !== o.id) picked[x.id] = false; } }); }&lt;br /&gt;
      update();&lt;br /&gt;
    });&lt;br /&gt;
    lab.appendChild(cb);&lt;br /&gt;
    lab.appendChild(document.createTextNode(&amp;quot; &amp;quot; + o.t));&lt;br /&gt;
    var sub = [o.sub, isForced ? st.forced[o.id] : &amp;quot;&amp;quot;].filter(Boolean).join(&amp;quot; - &amp;quot;);&lt;br /&gt;
    if (sub) { var sm = document.createElement(&amp;quot;small&amp;quot;); sm.textContent = &amp;quot; (&amp;quot; + sub + &amp;quot;)&amp;quot;; lab.appendChild(sm); }&lt;br /&gt;
    optsEl.appendChild(lab);&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
function link(url, text) {&lt;br /&gt;
  var a = document.createElement(&amp;quot;a&amp;quot;); a.href = url; a.target = &amp;quot;_blank&amp;quot;; a.rel = &amp;quot;noopener&amp;quot;; a.textContent = text; return a;&lt;br /&gt;
}&lt;br /&gt;
function card(item, cls) {&lt;br /&gt;
  var d = document.createElement(&amp;quot;div&amp;quot;); d.className = &amp;quot;nvk-card &amp;quot; + (cls || &amp;quot;&amp;quot;) + (item.hl ? &amp;quot; hl&amp;quot; : &amp;quot;&amp;quot;);&lt;br /&gt;
  var b = document.createElement(&amp;quot;b&amp;quot;); b.textContent = item.t; d.appendChild(b);&lt;br /&gt;
  if (item.d) { var p = document.createElement(&amp;quot;span&amp;quot;); p.textContent = item.d; d.appendChild(p); }&lt;br /&gt;
  if (item.img) {&lt;br /&gt;
    var im = document.createElement(&amp;quot;div&amp;quot;);&lt;br /&gt;
    item.img.forEach(function (u) {&lt;br /&gt;
      var a = document.createElement(&amp;quot;a&amp;quot;); a.href = full(u); a.target = &amp;quot;_blank&amp;quot;; a.rel = &amp;quot;noopener&amp;quot;;&lt;br /&gt;
      var g = document.createElement(&amp;quot;img&amp;quot;); g.className = &amp;quot;nvk-img&amp;quot;; g.src = u; g.alt = item.t; a.appendChild(g); im.appendChild(a);&lt;br /&gt;
    });&lt;br /&gt;
    d.appendChild(im);&lt;br /&gt;
  }&lt;br /&gt;
  if (item.u || item.w) {&lt;br /&gt;
    var l = document.createElement(&amp;quot;div&amp;quot;); l.className = &amp;quot;nvk-links&amp;quot;;&lt;br /&gt;
    if (item.u) l.appendChild(link(item.u, item.ut || &amp;quot;Im Shop ansehen →&amp;quot;));&lt;br /&gt;
    if (item.w) l.appendChild(link(item.w, (item.wt || &amp;quot;Zum Wiki&amp;quot;) + &amp;quot; →&amp;quot;));&lt;br /&gt;
    d.appendChild(l);&lt;br /&gt;
  }&lt;br /&gt;
  if (item.links) item.links.forEach(function (x) {&lt;br /&gt;
    var r = document.createElement(&amp;quot;div&amp;quot;); r.className = &amp;quot;nvk-links&amp;quot;; r.appendChild(link(x.u, x.t + &amp;quot; →&amp;quot;)); d.appendChild(r);&lt;br /&gt;
  });&lt;br /&gt;
  return d;&lt;br /&gt;
}&lt;br /&gt;
function heading(txt) { var h = document.createElement(&amp;quot;h3&amp;quot;); h.textContent = txt; outEl.appendChild(h); }&lt;br /&gt;
function renderResult() {&lt;br /&gt;
  var s = derive(), st = onSet(s);&lt;br /&gt;
  var missing = FIELDS.filter(function (f) {&lt;br /&gt;
    var w = $(&amp;quot;nvk-w-&amp;quot; + f.id);&lt;br /&gt;
    return w.style.display !== &amp;quot;none&amp;quot; ? (!f.optional ? !sel[f.id] : false) : false;&lt;br /&gt;
  });&lt;br /&gt;
  outEl.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
  if (missing.length) {&lt;br /&gt;
    var m = document.createElement(&amp;quot;p&amp;quot;); m.className = &amp;quot;nvk-miss&amp;quot;;&lt;br /&gt;
    m.textContent = &amp;quot;Bitte noch auswählen: &amp;quot; + missing.map(function (f) { return f.label; }).join(&amp;quot;, &amp;quot;);&lt;br /&gt;
    outEl.appendChild(m); $(&amp;quot;nvk-form&amp;quot;).style.display = &amp;quot;none&amp;quot;; return;&lt;br /&gt;
  }&lt;br /&gt;
  $(&amp;quot;nvk-form&amp;quot;).style.display = &amp;quot;&amp;quot;;&lt;br /&gt;
  var veh = vehicleOf(sel.vehicle);&lt;br /&gt;
  var ru = veh.noCat ? SHOP + &amp;quot;bmw-radios/&amp;quot; : SHOP + &amp;quot;bmw-radios/&amp;quot; + veh.v + &amp;quot;/&amp;quot;;&lt;br /&gt;
  heading(&amp;quot;Passende Radios&amp;quot;);&lt;br /&gt;
  outEl.appendChild(card({ t: &amp;quot;BMW Radios für &amp;quot; + veh.t, d: &amp;quot;Alle Radios, die für Deinen BMW &amp;quot; + veh.t + &amp;quot; im Shop erhältlich sind.&amp;quot;,&lt;br /&gt;
    u: ru, ut: &amp;quot;Zu den passenden Radios →&amp;quot;, w: SHOP + &amp;quot;bmw-radios/&amp;quot;, wt: &amp;quot;Alle BMW Radios&amp;quot; }, &amp;quot;rad&amp;quot;));&lt;br /&gt;
  var needs = [], hints = [], seen = {};&lt;br /&gt;
  RULES.forEach(function (r) {&lt;br /&gt;
    if (!match(r.when, s)) return;&lt;br /&gt;
    if (r.opts) { if (!r.opts.every(function (o) { return st.on[o]; })) return; }&lt;br /&gt;
    if (r.type === &amp;quot;need&amp;quot;) (r.items || []).forEach(function (id) { if (!seen[id]) { seen[id] = 1; needs.push(ITEMS[id]); } });&lt;br /&gt;
    else hints.push(r.html);&lt;br /&gt;
  });&lt;br /&gt;
  heading(&amp;quot;Das brauchst Du&amp;quot;);&lt;br /&gt;
  if (needs.length) needs.forEach(function (i) { outEl.appendChild(card(i)); });&lt;br /&gt;
  else { var n = document.createElement(&amp;quot;p&amp;quot;); n.textContent = &amp;quot;Für die Grundinstallation sind keine zusätzlichen Verlängerungen oder Adapter nötig.&amp;quot;; outEl.appendChild(n); }&lt;br /&gt;
  var opt = [];&lt;br /&gt;
  OPTS.forEach(function (o) {&lt;br /&gt;
    if (!st.on[o.id]) return;&lt;br /&gt;
    if (!optVisible(o, s, st.on)) return;&lt;br /&gt;
    o.items.forEach(function (id) {&lt;br /&gt;
      if (seen[id]) return;&lt;br /&gt;
      var sk = ITEMS[id].skipIf;&lt;br /&gt;
      if (sk) { if (seen[sk]) return; }&lt;br /&gt;
      seen[id] = 1; opt.push(ITEMS[id]);&lt;br /&gt;
    });&lt;br /&gt;
  });&lt;br /&gt;
  if (opt.length) { heading(&amp;quot;Deine Zusatzoptionen&amp;quot;); opt.forEach(function (i) { outEl.appendChild(card(i, &amp;quot;opt&amp;quot;)); }); }&lt;br /&gt;
  if (hints.length) {&lt;br /&gt;
    heading(&amp;quot;Hinweise&amp;quot;);&lt;br /&gt;
    hints.forEach(function (t) { var d = document.createElement(&amp;quot;div&amp;quot;); d.className = &amp;quot;nvk-note&amp;quot;; d.innerHTML = fmt(t); outEl.appendChild(d); });&lt;br /&gt;
  }&lt;br /&gt;
  var L = [&amp;quot;KONFIGURATION&amp;quot;];&lt;br /&gt;
  FIELDS.forEach(function (f) {&lt;br /&gt;
    if (!sel[f.id]) return;&lt;br /&gt;
    var v = f.values.filter(function (x) { return x.v === sel[f.id]; })[0];&lt;br /&gt;
    if (v) L.push(&amp;quot;- &amp;quot; + f.label + &amp;quot;: &amp;quot; + v.t);&lt;br /&gt;
  });&lt;br /&gt;
  L.push(&amp;quot;&amp;quot;, &amp;quot;BENÖTIGT&amp;quot;);&lt;br /&gt;
  needs.forEach(function (i) { L.push(&amp;quot;- &amp;quot; + i.t + (i.u ? &amp;quot;  &amp;quot; + i.u : &amp;quot;&amp;quot;)); });&lt;br /&gt;
  if (opt.length) { L.push(&amp;quot;&amp;quot;, &amp;quot;ZUSATZOPTIONEN&amp;quot;); opt.forEach(function (i) { L.push(&amp;quot;- &amp;quot; + i.t + (i.u ? &amp;quot;  &amp;quot; + i.u : &amp;quot;&amp;quot;)); }); }&lt;br /&gt;
  L.push(&amp;quot;&amp;quot;, &amp;quot;Radios: &amp;quot; + ru);&lt;br /&gt;
  summary = L.join(&amp;quot;\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
function update() { renderFields(); renderOpts(); renderResult(); }&lt;br /&gt;
function newCaptcha() {&lt;br /&gt;
  capA = 1 + Math.floor(Math.random() * 9); capB = 1 + Math.floor(Math.random() * 9);&lt;br /&gt;
  $(&amp;quot;nvk-capq&amp;quot;).textContent = &amp;quot;Sicherheitsfrage: Was ist &amp;quot; + capA + &amp;quot; + &amp;quot; + capB + &amp;quot;? *&amp;quot;; $(&amp;quot;nvk-cap&amp;quot;).value = &amp;quot;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
function status(msg, ok) { var e = $(&amp;quot;nvk-status&amp;quot;); e.style.display = &amp;quot;&amp;quot;; e.textContent = msg; e.style.borderLeftColor = ok ? &amp;quot;#14866d&amp;quot; : &amp;quot;#d33&amp;quot;; }&lt;br /&gt;
$(&amp;quot;nvk-send&amp;quot;).addEventListener(&amp;quot;click&amp;quot;, function () {&lt;br /&gt;
  var name = $(&amp;quot;nvk-name&amp;quot;).value.trim(), mail = $(&amp;quot;nvk-mail&amp;quot;).value.trim(), vin = $(&amp;quot;nvk-vin&amp;quot;).value.trim().toUpperCase(), msg = $(&amp;quot;nvk-msg&amp;quot;).value.trim();&lt;br /&gt;
  if (!name || !mail || !msg) return status(&amp;quot;Bitte Name, E-Mail und Kommentar ausfüllen.&amp;quot;, false);&lt;br /&gt;
  if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(mail)) return status(&amp;quot;Bitte eine gültige E-Mail-Adresse eingeben.&amp;quot;, false);&lt;br /&gt;
  if (vin) { if (!/^[A-Z]{2}[0-9]{5}$/.test(vin)) { if (!/^[A-HJ-NPR-Z0-9]{17}$/.test(vin)) return status(&amp;quot;Bitte die VIN im Format AB12345 oder die 17-stellige FGN eingeben - oder das Feld leer lassen.&amp;quot;, false); } }&lt;br /&gt;
  if (parseInt($(&amp;quot;nvk-cap&amp;quot;).value, 10) !== capA + capB) return status(&amp;quot;Die Sicherheitsfrage wurde nicht richtig beantwortet.&amp;quot;, false);&lt;br /&gt;
  if (!$(&amp;quot;nvk-dsgvo&amp;quot;).checked) return status(&amp;quot;Bitte der Verarbeitung Deiner Daten zustimmen.&amp;quot;, false);&lt;br /&gt;
  if ($(&amp;quot;nvk-hp&amp;quot;).value) return;&lt;br /&gt;
  var sz = $(&amp;quot;nvk-size&amp;quot;).value;&lt;br /&gt;
  var sum2 = summary + (sz ? &amp;quot;\n\nGewünschte Displaygröße: &amp;quot; + sz : &amp;quot;&amp;quot;);&lt;br /&gt;
  var text = &amp;quot;Name: &amp;quot; + name + &amp;quot;\nE-Mail: &amp;quot; + mail + &amp;quot;\nVIN: &amp;quot; + (vin || &amp;quot;-&amp;quot;) + &amp;quot;\n\nKommentar:\n&amp;quot; + msg + &amp;quot;\n\n&amp;quot; + sum2;&lt;br /&gt;
  if (SEND_URL) {&lt;br /&gt;
    var p = new URLSearchParams();&lt;br /&gt;
    p.append(&amp;quot;name&amp;quot;, name); p.append(&amp;quot;mail&amp;quot;, mail); p.append(&amp;quot;vin&amp;quot;, vin); p.append(&amp;quot;msg&amp;quot;, msg); p.append(&amp;quot;summary&amp;quot;, sum2);&lt;br /&gt;
    p.append(&amp;quot;hp&amp;quot;, $(&amp;quot;nvk-hp&amp;quot;).value); p.append(&amp;quot;ca&amp;quot;, capA); p.append(&amp;quot;cb&amp;quot;, capB); p.append(&amp;quot;cv&amp;quot;, $(&amp;quot;nvk-cap&amp;quot;).value);&lt;br /&gt;
    fetch(SEND_URL, { method: &amp;quot;POST&amp;quot;, body: p }).then(function (r) {&lt;br /&gt;
      if (!r.ok) throw new Error(&amp;quot;send&amp;quot;);&lt;br /&gt;
      status(&amp;quot;Danke! Deine Anfrage wurde gesendet, eine Kopie geht an &amp;quot; + mail + &amp;quot;.&amp;quot;, true); newCaptcha();&lt;br /&gt;
    }).catch(function () { status(&amp;quot;Das Senden hat nicht geklappt. Bitte versuche es später noch einmal oder schreibe direkt an &amp;quot; + MAIL_TO + &amp;quot;.&amp;quot;, false); });&lt;br /&gt;
  } else {&lt;br /&gt;
    var AMP = &amp;quot;\u0026&amp;quot;;&lt;br /&gt;
    window.location.href = &amp;quot;mailto:&amp;quot; + MAIL_TO + &amp;quot;?cc=&amp;quot; + encodeURIComponent(mail) + AMP + &amp;quot;subject=&amp;quot; + encodeURIComponent(MAIL_SUBJECT) + AMP + &amp;quot;body=&amp;quot; + encodeURIComponent(text);&lt;br /&gt;
    status(&amp;quot;Dein E-Mail-Programm wurde mit der fertigen Anfrage geöffnet. Bitte dort noch auf Senden klicken.&amp;quot;, true);&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
$(&amp;quot;nvk-reset&amp;quot;).addEventListener(&amp;quot;click&amp;quot;, function () { sel = {}; picked = {}; update(); });&lt;br /&gt;
newCaptcha();&lt;br /&gt;
update();&lt;br /&gt;
})();&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andre</name></author>
	</entry>
	<entry>
		<id>https://xtrons.ibus-app.de/index.php?title=Android_Radio_Konfigurator&amp;diff=4085</id>
		<title>Android Radio Konfigurator</title>
		<link rel="alternate" type="text/html" href="https://xtrons.ibus-app.de/index.php?title=Android_Radio_Konfigurator&amp;diff=4085"/>
		<updated>2026-10-21T12:32:39Z</updated>

		<summary type="html">&lt;p&gt;Andre: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
#nvk{max-width:900px;line-height:1.45}&lt;br /&gt;
#nvk *{box-sizing:border-box}&lt;br /&gt;
#nvk .nvk-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:14px;margin:12px 0}&lt;br /&gt;
#nvk .nvk-f label{display:block;font-weight:700;margin-bottom:4px}&lt;br /&gt;
#nvk select{width:100%;padding:9px 8px;font:inherit;color:#202122;background:#fff;border:1px solid #a2a9b1;border-radius:4px}&lt;br /&gt;
#nvk .nvk-help{font-size:.85em;opacity:.75;margin-top:3px}&lt;br /&gt;
#nvk fieldset{border:1px solid rgba(128,128,128,.45);border-radius:6px;padding:10px 14px;margin:14px 0}&lt;br /&gt;
#nvk legend{font-weight:700;padding:0 6px}&lt;br /&gt;
#nvk .nvk-o{display:block;padding:4px 0;cursor:pointer}&lt;br /&gt;
#nvk .nvk-o small{opacity:.7}&lt;br /&gt;
#nvk .nvk-o.dis{opacity:.75;cursor:default}&lt;br /&gt;
#nvk .nvk-btn{padding:7px 14px;font:inherit;border:1px solid #a2a9b1;border-radius:4px;background:#f8f9fa;color:#202122;cursor:pointer}&lt;br /&gt;
#nvk #nvk-out{margin-top:18px}&lt;br /&gt;
#nvk h3{margin:18px 0 8px}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-card.opt{border-left-color:#14866d}&lt;br /&gt;
#nvk .nvk-card.rad{border-left-color:#fff;background:rgba(255,255,255,.08)}&lt;br /&gt;
#nvk .nvk-card b{display:block}&lt;br /&gt;
#nvk .nvk-links{margin-top:4px;font-weight:600}&lt;br /&gt;
#nvk .nvk-links a{margin-right:14px}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-miss{opacity:.8;font-style:italic}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-card .nvk-img{max-width:230px;max-height:150px}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-card.hl{border:2px solid #36c;border-left-width:8px;background:rgba(51,102,204,.12);padding:12px 14px}&lt;br /&gt;
#nvk .nvk-card.hl b{font-size:1.1em}&lt;br /&gt;
#nvk .nvk-img.wide{max-width:min(100%,460px);max-height:none}&lt;br /&gt;
#nvk #nvk-form{margin-top:22px}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-grid&amp;quot; id=&amp;quot;nvk-fields&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;fieldset id=&amp;quot;nvk-optset&amp;quot;&amp;gt;&amp;lt;legend&amp;gt;Zusatzoptionen&amp;lt;/legend&amp;gt;&amp;lt;div id=&amp;quot;nvk-opts&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/fieldset&amp;gt;&lt;br /&gt;
&amp;lt;button type=&amp;quot;button&amp;quot; class=&amp;quot;nvk-btn&amp;quot; id=&amp;quot;nvk-reset&amp;quot;&amp;gt;Auswahl zurücksetzen&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk-out&amp;quot; aria-live=&amp;quot;polite&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;fieldset id=&amp;quot;nvk-form&amp;quot; style=&amp;quot;display:none&amp;quot;&amp;gt;&amp;lt;legend&amp;gt;Anfrage senden&amp;lt;/legend&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;nvk-help&amp;quot;&amp;gt;Deine Auswahl und die Liste oben werden automatisch mitgesendet. Alle Felder mit * sind Pflicht.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-grid&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-name&amp;quot;&amp;gt;Name *&amp;lt;/label&amp;gt;&amp;lt;input id=&amp;quot;nvk-name&amp;quot; type=&amp;quot;text&amp;quot; autocomplete=&amp;quot;name&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-mail&amp;quot;&amp;gt;E-Mail *&amp;lt;/label&amp;gt;&amp;lt;input id=&amp;quot;nvk-mail&amp;quot; type=&amp;quot;email&amp;quot; autocomplete=&amp;quot;email&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-size&amp;quot;&amp;gt;Gewünschte Displaygröße (optional)&amp;lt;/label&amp;gt;&amp;lt;select id=&amp;quot;nvk-size&amp;quot;&amp;gt;&amp;lt;option value=&amp;quot;&amp;quot;&amp;gt;Keine Angabe / Beratung gewünscht&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;7&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;8.8&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;9&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;10.25&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;12.3&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;14.9&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;Andere Größe (bitte im Kommentar nennen)&amp;lt;/option&amp;gt;&amp;lt;/select&amp;gt;&amp;lt;div class=&amp;quot;nvk-help&amp;quot;&amp;gt;Diagonale in Zoll. Nicht jede Größe gibt es für jede Baureihe, das prüfen wir für Dich.&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-vin&amp;quot;&amp;gt;VIN oder FGN (optional)&amp;lt;/label&amp;gt;&amp;lt;input id=&amp;quot;nvk-vin&amp;quot; type=&amp;quot;text&amp;quot; maxlength=&amp;quot;17&amp;quot; placeholder=&amp;quot;AB12345 oder 17-stellige FGN&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-msg&amp;quot;&amp;gt;Kommentar *&amp;lt;/label&amp;gt;&amp;lt;textarea id=&amp;quot;nvk-msg&amp;quot; rows=&amp;quot;4&amp;quot;&amp;gt;&amp;lt;/textarea&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot; style=&amp;quot;max-width:300px&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-cap&amp;quot; id=&amp;quot;nvk-capq&amp;quot;&amp;gt;Sicherheitsfrage *&amp;lt;/label&amp;gt;&amp;lt;input id=&amp;quot;nvk-cap&amp;quot; type=&amp;quot;text&amp;quot; inputmode=&amp;quot;numeric&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;input id=&amp;quot;nvk-hp&amp;quot; type=&amp;quot;text&amp;quot; tabindex=&amp;quot;-1&amp;quot; autocomplete=&amp;quot;off&amp;quot; aria-hidden=&amp;quot;true&amp;quot; style=&amp;quot;position:absolute;left:-9999px;width:1px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;label class=&amp;quot;nvk-o&amp;quot;&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; id=&amp;quot;nvk-dsgvo&amp;quot;&amp;gt; Ich stimme zu, dass meine Angaben zur Bearbeitung der Anfrage per E-Mail verarbeitet werden. *&amp;lt;/label&amp;gt;&lt;br /&gt;
&amp;lt;button type=&amp;quot;button&amp;quot; class=&amp;quot;nvk-btn&amp;quot; id=&amp;quot;nvk-send&amp;quot;&amp;gt;Anfrage senden&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk-status&amp;quot; class=&amp;quot;nvk-note&amp;quot; style=&amp;quot;display:none&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/fieldset&amp;gt;&lt;br /&gt;
&amp;lt;noscript&amp;gt;Für den Konfigurator wird JavaScript benötigt.&amp;lt;/noscript&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
(function () {&lt;br /&gt;
&amp;quot;use strict&amp;quot;;&lt;br /&gt;
/* =====================================================================&lt;br /&gt;
   KONFIGURATION - hier wird gepflegt.&lt;br /&gt;
   Textformat in Hinweisen: [b]fett[/b]  [br] Zeilenumbruch  [a=URL]Linktext[/a]&lt;br /&gt;
   Bitte im Skript KEIN kaufmännisches Und, kein Kleiner-/Größer-Zeichen&lt;br /&gt;
   und keine Leerzeilen verwenden (das Wiki wandelt sie um).&lt;br /&gt;
   ===================================================================== */&lt;br /&gt;
var SHOP = &amp;quot;https://shop.ibus-app.de/&amp;quot;;&lt;br /&gt;
var WIKI = &amp;quot;https://wiki.ibus-app.de/index.php?title=&amp;quot;;&lt;br /&gt;
/* Bilder aus dem Wiki (Thumbnail-Adressen; Klick öffnet automatisch das Originalbild) */&lt;br /&gt;
var IM = &amp;quot;https://xtrons.ibus-app.de/images/thumb/&amp;quot;;&lt;br /&gt;
var P = {&lt;br /&gt;
  schema:  IM + &amp;quot;e/ea/BMW_E39_Verl%C3%A4ngerungen_EXL005%2BFAKRA_.png/135px-BMW_E39_Verl%C3%A4ngerungen_EXL005%2BFAKRA_.png&amp;quot;,&lt;br /&gt;
  exl005:  IM + &amp;quot;7/70/Exl005-1.webp/257px-Exl005-1.webp.png&amp;quot;,&lt;br /&gt;
  fakra6m: IM + &amp;quot;d/d8/FM-extension_01_1.png/270px-FM-extension_01_1.png&amp;quot;,&lt;br /&gt;
  isofakra: IM + &amp;quot;4/4e/ISO-FAKRA_1.png/270px-ISO-FAKRA_1.png&amp;quot;,&lt;br /&gt;
  bm24:    IM + &amp;quot;8/82/BM24.png/130px-BM24.png&amp;quot;,&lt;br /&gt;
  iso:     IM + &amp;quot;d/dd/Iso.jpg/69px-Iso.jpg&amp;quot;,&lt;br /&gt;
  bm54:    IM + &amp;quot;3/34/BM54.png/135px-BM54.png&amp;quot;,&lt;br /&gt;
  fakra:   IM + &amp;quot;b/b3/Fakra.jpg/100px-Fakra.jpg&amp;quot;,&lt;br /&gt;
  pfeil:   IM + &amp;quot;e/ee/Navi_E46.jpg/239px-Navi_E46.jpg&amp;quot;,&lt;br /&gt;
  noquad:  IM + &amp;quot;6/68/No_elongation.jpg/180px-No_elongation.jpg&amp;quot;,&lt;br /&gt;
  noexl6:  IM + &amp;quot;7/7b/No_EXL006.jpg/180px-No_EXL006.jpg&amp;quot;,&lt;br /&gt;
  halter:  IM + &amp;quot;3/3b/Halter_Alu.webp/92px-Halter_Alu.webp.png&amp;quot;,&lt;br /&gt;
  deepobd: &amp;quot;https://xtrons.ibus-app.de/images/d/d4/DeepOBD_Interface_1.png&amp;quot;,&lt;br /&gt;
  n43:     IM + &amp;quot;e/e4/Navi4_3.jpg/240px-Navi4_3.jpg&amp;quot;,&lt;br /&gt;
  n169:    IM + &amp;quot;8/8a/Navi16_9.jpg/240px-Navi16_9.jpg&amp;quot;,&lt;br /&gt;
  radio:   IM + &amp;quot;9/96/E39_Radio.jpg/240px-E39_Radio.jpg&amp;quot;,&lt;br /&gt;
  idrive:  &amp;quot;https://xtrons.ibus-app.de/images/0/02/MASK-CCC-CIC-NBT-EVO-iDrive.jpg&amp;quot;,&lt;br /&gt;
  iris:    &amp;quot;https://xtrons.ibus-app.de/images/b/be/BusinessKas_IRISG.jpg&amp;quot;,&lt;br /&gt;
  resler:  &amp;quot;https://xtrons.ibus-app.de/images/d/d1/Resler_Modul_01.png&amp;quot;,&lt;br /&gt;
  can:     &amp;quot;https://xtrons.ibus-app.de/images/6/69/CAN_Interface.png&amp;quot;,&lt;br /&gt;
  funktr:  IM + &amp;quot;7/7e/E46_Funktionstraeger.png/240px-E46_Funktionstraeger.png&amp;quot;&lt;br /&gt;
};&lt;br /&gt;
/* Anfrage-Formular: MAIL_TO = Empfänger. SEND_URL leer = E-Mail-Programm des Kunden öffnen (mailto).&lt;br /&gt;
   SEND_URL = Adresse des Server-Skripts send-anfrage.php = Versand direkt vom Server (mit CC an den Kunden). */&lt;br /&gt;
var MAIL_TO = &amp;quot;info@ibus-app.de&amp;quot;;&lt;br /&gt;
var MAIL_SUBJECT = &amp;quot;Anfrage aus Android Radio Konfigurator&amp;quot;;&lt;br /&gt;
var SEND_URL = &amp;quot;https://xtrons.ibus-app.de/send-anfrage.php&amp;quot;;&lt;br /&gt;
/* ---- 1) Baureihen --------------------------------------------------------&lt;br /&gt;
   v = Shop-Kategorie (Link: SHOP + bmw-radios/ + v + /)&lt;br /&gt;
   gen: alt = I-BUS-Fahrzeuge (E38/E39/E46/E53/E83)&lt;br /&gt;
        b   = M-ASK / CCC / CIC     c = CIC / NBT / NBT EVO&lt;br /&gt;
   body = Karosserieformen (siehe BODY)                                      */&lt;br /&gt;
var BODY = { limo: &amp;quot;Limousine&amp;quot;, touring: &amp;quot;Touring&amp;quot;, coupe: &amp;quot;Coupé&amp;quot;, cabrio: &amp;quot;Cabrio&amp;quot;, schraeg: &amp;quot;Schrägheck&amp;quot;,&lt;br /&gt;
  compact: &amp;quot;Compact&amp;quot;, gt: &amp;quot;Gran Turismo&amp;quot;, gc: &amp;quot;Gran Coupé&amp;quot;, suv: &amp;quot;SUV / SAV&amp;quot;, roadster: &amp;quot;Roadster&amp;quot; };&lt;br /&gt;
var VEHICLES = [&lt;br /&gt;
  { v: &amp;quot;1er-e8x&amp;quot;, t: &amp;quot;1er E8x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;schraeg,coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;1er-f2x&amp;quot;, t: &amp;quot;1er F2x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;schraeg&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;2er-f2x&amp;quot;, t: &amp;quot;2er F2x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;3er-e46&amp;quot;, t: &amp;quot;3er E46&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;limo,touring,coupe,cabrio,compact&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;3er-e9x&amp;quot;, t: &amp;quot;3er E9x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;limo,touring,coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;3er-f3x&amp;quot;, t: &amp;quot;3er F3x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;limo,touring,gt&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;4er-f3x&amp;quot;, t: &amp;quot;4er F3x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;coupe,cabrio,gc&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;5er-e39&amp;quot;, t: &amp;quot;5er E39&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;limo,touring&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;5er-e6x&amp;quot;, t: &amp;quot;5er E6x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;limo,touring&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;5er-f1x&amp;quot;, t: &amp;quot;5er F1x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;limo,touring,gt&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;6er-e6x&amp;quot;, t: &amp;quot;6er E6x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;7er-e38&amp;quot;, t: &amp;quot;7er E38&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;limo&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;7er-e65&amp;quot;, t: &amp;quot;7er E65&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;limo&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;7er-f01&amp;quot;, t: &amp;quot;7er F01&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;limo&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x1-e84&amp;quot;, t: &amp;quot;X1 E84&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x1-f48&amp;quot;, t: &amp;quot;X1 F48&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x3-e83&amp;quot;, t: &amp;quot;X3 E83&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x3-f25&amp;quot;, t: &amp;quot;X3 F25&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x5-e53&amp;quot;, t: &amp;quot;X5 E53&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x5-e70&amp;quot;, t: &amp;quot;X5 E70&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x5-f15&amp;quot;, t: &amp;quot;X5 F15&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x6-e71&amp;quot;, t: &amp;quot;X6 E71&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;z4-e85e86&amp;quot;, t: &amp;quot;Z4 E85/E86&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;roadster,coupe&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;z4-e89&amp;quot;, t: &amp;quot;Z4 E89&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;roadster&amp;quot;, noCat: true }&lt;br /&gt;
];&lt;br /&gt;
/* Fahrzeuge mit K-CAN App (Beta) */&lt;br /&gt;
var KCAN = [&amp;quot;1er-e8x&amp;quot;, &amp;quot;3er-e9x&amp;quot;, &amp;quot;5er-e6x&amp;quot;, &amp;quot;6er-e6x&amp;quot;, &amp;quot;7er-e65&amp;quot;, &amp;quot;x1-e84&amp;quot;, &amp;quot;x5-e70&amp;quot;, &amp;quot;x6-e71&amp;quot;, &amp;quot;z4-e89&amp;quot;];&lt;br /&gt;
var bodyValues = Object.keys(BODY).map(function (k) {&lt;br /&gt;
  return { v: k, t: BODY[k], only: { vehicle: VEHICLES.filter(function (x) { return x.body.split(&amp;quot;,&amp;quot;).indexOf(k) !== -1; }).map(function (x) { return x.v; }) } };&lt;br /&gt;
});&lt;br /&gt;
/* ---- 2) Auswahlfelder ------------------------------------------------------&lt;br /&gt;
   only = Wert nur anbieten, wenn Bedingung passt   show = Feld nur dann zeigen&lt;br /&gt;
   optional = muss nicht gewählt werden             auto = bei nur einem Wert vorwählen */&lt;br /&gt;
var FIELDS = [&lt;br /&gt;
  { id: &amp;quot;vehicle&amp;quot;, label: &amp;quot;Fahrzeug&amp;quot;, values: VEHICLES.map(function (x) { return { v: x.v, t: &amp;quot;BMW &amp;quot; + x.t }; }) },&lt;br /&gt;
  { id: &amp;quot;factory&amp;quot;, label: &amp;quot;Verbaut ab Werk&amp;quot;, pre: { when: { gen: [&amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;] }, html: &amp;quot;[b]So erkennst Du Dein System:[/b][br][imgw=&amp;quot; + P.idrive + &amp;quot;]&amp;quot; }, values: [&lt;br /&gt;
    { v: &amp;quot;iris&amp;quot;,  t: &amp;quot;Radio mit IRIS&amp;quot;, only: { vehicle: [&amp;quot;3er-e46&amp;quot;, &amp;quot;5er-e39&amp;quot;, &amp;quot;7er-e38&amp;quot;, &amp;quot;x5-e53&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.iris + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;mid&amp;quot;,   t: &amp;quot;Radio mit MID&amp;quot;,  only: { gen: [&amp;quot;alt&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.radio + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;n43&amp;quot;,   t: &amp;quot;4:3 Navi&amp;quot;,       only: { vehicle: [&amp;quot;5er-e39&amp;quot;, &amp;quot;7er-e38&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.n43 + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;n169&amp;quot;,  t: &amp;quot;16:9 Navi&amp;quot;,      only: { gen: [&amp;quot;alt&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.n169 + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;pfeil&amp;quot;, t: &amp;quot;Pfeilnavi&amp;quot;,      only: { vehicle: [&amp;quot;3er-e46&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.pfeil + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;mask&amp;quot;,  t: &amp;quot;M-ASK&amp;quot;,          only: { gen: [&amp;quot;b&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;ccc&amp;quot;,   t: &amp;quot;CCC&amp;quot;,            only: { gen: [&amp;quot;b&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;cic&amp;quot;,   t: &amp;quot;CIC&amp;quot;,            only: { gen: [&amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;nbt&amp;quot;,   t: &amp;quot;NBT&amp;quot;,            only: { gen: [&amp;quot;c&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;nbtevo&amp;quot;, t: &amp;quot;NBT EVO&amp;quot;,       only: { gen: [&amp;quot;c&amp;quot;] } } ] },&lt;br /&gt;
  { id: &amp;quot;trunk&amp;quot;, label: &amp;quot;Wo sitzt das Radiomodul des Pfeilnavis?&amp;quot;, optional: true, show: { factory: [&amp;quot;pfeil&amp;quot;] },&lt;br /&gt;
    help: &amp;quot;Bitte prüfen: Sitzt das Modul im Kofferraum, oder im Pfeilnavi selbst (Quadlock hinten neben dem Antennenstecker)?[br][img=&amp;quot; + P.pfeil + &amp;quot;]&amp;quot;,&lt;br /&gt;
    values: [&lt;br /&gt;
    { v: &amp;quot;ja&amp;quot;, t: &amp;quot;Im Kofferraum (Verlängerungen nötig)&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;nein&amp;quot;, t: &amp;quot;Im Pfeilnavi, Quadlock hinten (keine Verlängerung)&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;unk&amp;quot;, t: &amp;quot;Weiß ich nicht&amp;quot; } ] },&lt;br /&gt;
  { id: &amp;quot;aux&amp;quot;, label: &amp;quot;AUX-IN verfügbar?&amp;quot;, show: { gen: [&amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;] }, values: [&lt;br /&gt;
    { v: &amp;quot;ja&amp;quot;, t: &amp;quot;Ja&amp;quot; }, { v: &amp;quot;nein&amp;quot;, t: &amp;quot;Nein&amp;quot; } ] },&lt;br /&gt;
  { id: &amp;quot;sound&amp;quot;, label: &amp;quot;Soundsystem&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;stereo&amp;quot;, t: &amp;quot;Stereo&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;hifi&amp;quot;,   t: &amp;quot;Hifi&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;dsp&amp;quot;,    t: &amp;quot;DSP&amp;quot;, only: { vehicle: [&amp;quot;7er-e38&amp;quot;, &amp;quot;5er-e39&amp;quot;, &amp;quot;x5-e53&amp;quot;, &amp;quot;x3-e83&amp;quot;] }, info: &amp;quot;[a=&amp;quot; + WIKI + &amp;quot;Habe_ich_DSP%3F]Habe ich DSP?[/a]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;hk&amp;quot;,     t: &amp;quot;Harman Kardon&amp;quot;, only: { vehicle: [&amp;quot;3er-e46&amp;quot;, &amp;quot;z4-e85e86&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;logic7&amp;quot;, t: &amp;quot;Logic7&amp;quot;, only: { vehicle: [&amp;quot;3er-e9x&amp;quot;, &amp;quot;5er-e6x&amp;quot;, &amp;quot;6er-e6x&amp;quot;, &amp;quot;7er-e65&amp;quot;, &amp;quot;1er-e8x&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;hksur&amp;quot;,  t: &amp;quot;Harman Kardon Surround&amp;quot;, only: { vehicle: [&amp;quot;1er-f2x&amp;quot;, &amp;quot;2er-f2x&amp;quot;, &amp;quot;3er-f3x&amp;quot;, &amp;quot;4er-f3x&amp;quot;, &amp;quot;5er-f1x&amp;quot;] } } ] },&lt;br /&gt;
  { id: &amp;quot;current&amp;quot;, label: &amp;quot;Aktuell verbaut&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;werk&amp;quot;, t: &amp;quot;Werksradio / Werksnavi&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;nach&amp;quot;, t: &amp;quot;Nachrüst-Radio / -Navi&amp;quot; } ] },&lt;br /&gt;
  { id: &amp;quot;body&amp;quot;, label: &amp;quot;Karosserie&amp;quot;, auto: true, values: bodyValues },&lt;br /&gt;
  { id: &amp;quot;ant&amp;quot;, label: &amp;quot;Antennenstecker am Radio (optional)&amp;quot;, optional: true, def: &amp;quot;unk&amp;quot;,&lt;br /&gt;
    show: { vehicle: [&amp;quot;7er-e38&amp;quot;, &amp;quot;5er-e39&amp;quot;, &amp;quot;3er-e46&amp;quot;, &amp;quot;x5-e53&amp;quot;] },&lt;br /&gt;
    values: [&lt;br /&gt;
    { v: &amp;quot;unk&amp;quot;,   t: &amp;quot;Weiß ich nicht&amp;quot;, info: &amp;quot;[b]BM24[/b] (Rundpin) = ISO-Antennenstecker:[br][img=&amp;quot; + P.bm24 + &amp;quot;][img=&amp;quot; + P.iso + &amp;quot;][br][b]BM54[/b] = FAKRA:[br][img=&amp;quot; + P.bm54 + &amp;quot;][img=&amp;quot; + P.fakra + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;iso&amp;quot;,   t: &amp;quot;ISO (BM24, Rundpin)&amp;quot;, info: &amp;quot;[img=&amp;quot; + P.bm24 + &amp;quot;][img=&amp;quot; + P.iso + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;fakra&amp;quot;, t: &amp;quot;FAKRA (BM54)&amp;quot;, info: &amp;quot;[img=&amp;quot; + P.bm54 + &amp;quot;][img=&amp;quot; + P.fakra + &amp;quot;]&amp;quot; } ] }&lt;br /&gt;
];&lt;br /&gt;
/* ---- 3) Zusatzoptionen (Mehrfachauswahl) ---------------------------------&lt;br /&gt;
   show = nur sichtbar wenn Bedingung passt   requires = nur sichtbar wenn diese Optionen gewählt sind&lt;br /&gt;
   excl = Optionen derselben Gruppe schließen sich aus   items = Artikel aus ITEMS */&lt;br /&gt;
var OPTS = [&lt;br /&gt;
  { id: &amp;quot;halter&amp;quot;,  t: &amp;quot;Radio-Halter&amp;quot;, sub: &amp;quot;nur BMW E39&amp;quot;, show: { vehicle: [&amp;quot;5er-e39&amp;quot;] }, items: [&amp;quot;halter&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;ibus&amp;quot;,    t: &amp;quot;I-BUS App&amp;quot;, show: { gen: [&amp;quot;alt&amp;quot;] }, items: [&amp;quot;ibus&amp;quot;, &amp;quot;resler&amp;quot;, &amp;quot;bclic&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;deepobd&amp;quot;, t: &amp;quot;DeepOBD (Diagnose)&amp;quot;, items: [&amp;quot;deepobd&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;can&amp;quot;,     t: &amp;quot;CAN Interface&amp;quot;, sub: &amp;quot;Addon - nur mit I-BUS App&amp;quot;, show: { gen: [&amp;quot;alt&amp;quot;] }, requires: [&amp;quot;ibus&amp;quot;], items: [&amp;quot;can&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;kcan&amp;quot;,    t: &amp;quot;K-CAN App (Beta)&amp;quot;, sub: &amp;quot;Pendant zur I-BUS App&amp;quot;, show: { vehicle: KCAN }, items: [&amp;quot;kcan&amp;quot;, &amp;quot;kcanlic&amp;quot;, &amp;quot;can&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;tpms&amp;quot;,    t: &amp;quot;TPMS (Reifendruck)&amp;quot;, items: [&amp;quot;tpms&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;dab1&amp;quot;,    t: &amp;quot;DAB+ (Single Receiver)&amp;quot;, excl: &amp;quot;dab&amp;quot;, items: [&amp;quot;dab1&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;dab2&amp;quot;,    t: &amp;quot;DAB+ (Dual Receiver)&amp;quot;,   excl: &amp;quot;dab&amp;quot;, items: [&amp;quot;dab2&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;rcam&amp;quot;,    t: &amp;quot;Rückfahrkamera&amp;quot;, items: [&amp;quot;rcam&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;fcam&amp;quot;,    t: &amp;quot;Front-Kamera&amp;quot;, items: [&amp;quot;fcam&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;tool&amp;quot;,    t: &amp;quot;Einbau-Werkzeug (Kunststoffheber)&amp;quot;, items: [&amp;quot;tool&amp;quot;] }&lt;br /&gt;
];&lt;br /&gt;
/* Erzwungene Optionen (werden automatisch gesetzt und gesperrt) */&lt;br /&gt;
var FORCED = [&lt;br /&gt;
  { when: { sound: [&amp;quot;dsp&amp;quot;] }, opts: [&amp;quot;ibus&amp;quot;], why: &amp;quot;wegen DSP erforderlich&amp;quot; }&lt;br /&gt;
];&lt;br /&gt;
/* ---- 4) Artikel ------------------------------------------------------------&lt;br /&gt;
   u = Shop-Link (ut = Linktext)   w = Wiki-Link (wt = Linktext)   leer = kein Link&lt;br /&gt;
   skipIf = Artikel entfällt, wenn der genannte Artikel schon in der Liste steht */&lt;br /&gt;
var ITEMS = {&lt;br /&gt;
  exl005:  { t: &amp;quot;Verlängerung EXL005&amp;quot;, d: &amp;quot;Ersetzt das Radiomodul im Kofferraum.&amp;quot;, u: SHOP + &amp;quot;detail/index/sArticle/212/&amp;quot;, img: [P.exl005, P.schema] },&lt;br /&gt;
  fakra6m: { t: &amp;quot;Verlängerung 6 m FAKRA(m) auf FAKRA(f), gewinkelt&amp;quot;, d: &amp;quot;Antennenverlängerung vom Kofferraum nach vorn.&amp;quot;, img: [P.fakra6m],&lt;br /&gt;
             u: SHOP + &amp;quot;shop/zubehoer/adapterkabel/192/verlaengerung-6m-fakra-m-auf-fakra-f-kurz-gewinkelt&amp;quot; },&lt;br /&gt;
  isoada:  { t: &amp;quot;Adapter ISO-Stecker auf FAKRA, gewinkelt (15 cm)&amp;quot;, d: &amp;quot;Nötig bei ISO-Antennenstecker (BM24, Rundpin).&amp;quot;, img: [P.isofakra],&lt;br /&gt;
             u: SHOP + &amp;quot;shop/zubehoer/adapterkabel/193/adapter-kabel-iso-f-auf-fakra-f-kurz-gewinkelt-15cm&amp;quot; },&lt;br /&gt;
  bcdsp:   { t: &amp;quot;I-BUS App - BC+DSP Lizenz&amp;quot;, d: &amp;quot;Ohne DSP-Lizenz arbeitet das Werks-DSP nicht.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/lizenzen/171/i-bus-app-bc-dsp-lizenz&amp;quot;,&lt;br /&gt;
             w: WIKI + &amp;quot;Habe_ich_DSP%3F&amp;quot;, wt: &amp;quot;Wiki: Habe ich DSP?&amp;quot; },&lt;br /&gt;
  halter:  { t: &amp;quot;Alu-Halter zur Radio-Montage im BMW E39&amp;quot;, d: &amp;quot;Empfohlen bei Radios, die nicht von AVIN stammen.&amp;quot;, img: [P.halter],&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/radiohalter/185/alu-halter-zur-radio-montage-im-bmw-e39&amp;quot; },&lt;br /&gt;
  ibus:    { t: &amp;quot;I-BUS App&amp;quot;, hl: true,&lt;br /&gt;
             d: &amp;quot;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.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;cat/index/sCategory/42&amp;quot;,&lt;br /&gt;
             links: [&lt;br /&gt;
               { u: WIKI + &amp;quot;Was_brauche_ich_um_die_I-BUS_App_nutzen_zu_k%C3%B6nnen%3F&amp;quot;, t: &amp;quot;Wiki: Was brauche ich für die I-BUS App?&amp;quot; },&lt;br /&gt;
               { u: WIKI + &amp;quot;Funktionen&amp;quot;, t: &amp;quot;Liste aller I-BUS App Funktionen (BMW E38|E39|E46|E53|E83)&amp;quot; },&lt;br /&gt;
               { u: WIKI + &amp;quot;Was_geht_beim_BMW_E46_nicht&amp;quot;, t: &amp;quot;Was geht beim BMW E46, E83, E85,.. nicht? (da werkseitig nicht verbaut)&amp;quot; },&lt;br /&gt;
               { u: WIKI + &amp;quot;Funktionseinschr%C3%A4nkungen_nach_Baujahr/Ausstattung/Modell&amp;quot;, t: &amp;quot;Funktionseinschränkungen nach Baujahr/Ausstattung/Modell&amp;quot; } ] },&lt;br /&gt;
  resler:  { t: &amp;quot;Resler USB I-BUS Modul inkl. Anschlusskabel&amp;quot;, d: &amp;quot;Verbindet I-BUS App und Fahrzeug.&amp;quot;, img: [P.resler],&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/interfaces-module/191/resler-usb-i-bus-modul-inkl.-anschlusskabel&amp;quot;,&lt;br /&gt;
             w: &amp;quot;https://wiki.ibus-app.de/index.php?title=Hauptseite#Einbauanleitung_f.C3.BCr_Resler_Modul_und_Resler_Interface&amp;quot;, wt: &amp;quot;Einbauanleitung Resler Modul&amp;quot; },&lt;br /&gt;
  bclic:   { t: &amp;quot;I-BUS App - BC Lizenz&amp;quot;, d: &amp;quot;Schaltet u. a. die BC-Daten der App frei.&amp;quot;, skipIf: &amp;quot;bcdsp&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/lizenzen/167/i-bus-app-bc-lizenz&amp;quot; },&lt;br /&gt;
  deepobd: { t: &amp;quot;Deep OBD OBD-II Bluetooth-Adapter&amp;quot;, d: &amp;quot;Live-Werte auslesen, Fehler lesen und löschen.&amp;quot;, img: [P.deepobd],&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/interfaces-module/258/deep-obd-obd-ii-bluetooth-adapter?c=54&amp;quot;,&lt;br /&gt;
             w: &amp;quot;https://xtrons.ibus-app.de/index.php?title=DeepOBD_-_Adapter_und_App_einrichten&amp;quot;, wt: &amp;quot;Wiki: DeepOBD einrichten&amp;quot; },&lt;br /&gt;
  can:     { t: &amp;quot;CAN-Bus Interface inkl. Anschlusskabel&amp;quot;, d: &amp;quot;Addon, funktioniert nur zusammen mit der I-BUS App bzw. der K-CAN App.&amp;quot;, img: [P.can],&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/interfaces-module/346/can-bus-interface-inkl.-anschlusskabel&amp;quot;,&lt;br /&gt;
             w: WIKI + &amp;quot;Einbauanleitung_CAN-Bus_Interface&amp;quot;, wt: &amp;quot;Einbauanleitung CAN-Bus Interface&amp;quot; },&lt;br /&gt;
  kcan:    { t: &amp;quot;K-CAN App (Beta)&amp;quot;, d: &amp;quot;Pendant zur I-BUS App für Fahrzeuge mit K-CAN, aktuell als Betaversion.&amp;quot;,&lt;br /&gt;
             w: &amp;quot;https://wiki.kcan-app.de/&amp;quot;, wt: &amp;quot;Wiki zur K-CAN App&amp;quot; },&lt;br /&gt;
  kcanlic: { t: &amp;quot;K-CAN App - Lizenz Betaversion&amp;quot;, d: &amp;quot;Beta-Lizenz für die K-CAN App.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/lizenzen/358/k-can-app-lizenz-betaversion&amp;quot; },&lt;br /&gt;
  tpms:    { t: &amp;quot;TPMS - Reifendruckkontrolle&amp;quot;, d: &amp;quot;&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/tpms/&amp;quot; },&lt;br /&gt;
  dab1:    { t: &amp;quot;DAB+ Empfänger inkl. Antenne (Single)&amp;quot;, d: &amp;quot;&amp;quot;, w: &amp;quot;https://xtrons.ibus-app.de/index.php?title=Installation_der_DAB%2B_Antenne&amp;quot;, wt: &amp;quot;Installation der DAB+ Antenne&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/dab/291/dab-empfaenger-inkl.-antenne-usbdab04&amp;quot; },&lt;br /&gt;
  dab2:    { t: &amp;quot;Dual DAB+ Empfänger-Stick inkl. 2 Antennen&amp;quot;, d: &amp;quot;&amp;quot;, w: &amp;quot;https://xtrons.ibus-app.de/index.php?title=Installation_der_DAB%2B_Antenne&amp;quot;, wt: &amp;quot;Installation der DAB+ Antenne&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/dab/391/dual-dab-empfaenger-stick-inkl.-2-antennen-acusbdab05t?c=75&amp;quot; },&lt;br /&gt;
  rcam:    { t: &amp;quot;Rückfahrkamera&amp;quot;, d: &amp;quot;&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/kameras/&amp;quot;, ut: &amp;quot;Kameras im Shop ansehen →&amp;quot; },&lt;br /&gt;
  fcam:    { t: &amp;quot;Front-Kamera&amp;quot;, d: &amp;quot;&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/kameras/&amp;quot;, ut: &amp;quot;Kameras im Shop ansehen →&amp;quot; },&lt;br /&gt;
  tool:    { t: &amp;quot;Einbau-Werkzeug (Kunststoffheber)&amp;quot;, d: &amp;quot;Zum schonenden Lösen der Verkleidungen.&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/einbauwerkzeug/&amp;quot; }&lt;br /&gt;
};&lt;br /&gt;
/* ---- 5) Regeln --------------------------------------------------------------&lt;br /&gt;
   type: need (Das brauchst Du) oder hint (Hinweise)   when = Bedingung auf die Felder&lt;br /&gt;
   opts = diese Zusatzoptionen müssen gewählt sein      items = Artikel   html = Text&lt;br /&gt;
   Abgeleitete Werte: gen (alt/b/c) und module (ja/nein/unk = Radiomodul im Kofferraum, nur gen alt) */&lt;br /&gt;
var RULES = [&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { current: [&amp;quot;werk&amp;quot;], module: [&amp;quot;ja&amp;quot;] }, items: [&amp;quot;exl005&amp;quot;, &amp;quot;fakra6m&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { current: [&amp;quot;nach&amp;quot;], module: [&amp;quot;ja&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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=&amp;quot; + P.noquad + &amp;quot;][img=&amp;quot; + P.noexl6 + &amp;quot;]&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;ja&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;nein&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;unk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { ant: [&amp;quot;iso&amp;quot;] }, items: [&amp;quot;isoada&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { ant: [&amp;quot;unk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Antennenstecker:[/b] [b]BM24[/b] (Rundpin) = ISO-Antennenstecker, ggf. wird der [a=&amp;quot; + SHOP + &amp;quot;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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { sound: [&amp;quot;dsp&amp;quot;] }, items: [&amp;quot;bcdsp&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { sound: [&amp;quot;dsp&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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=&amp;quot; + WIKI + &amp;quot;Habe_ich_DSP%3F]Habe ich DSP?[/a]&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { sound: [&amp;quot;hk&amp;quot;], gen: [&amp;quot;alt&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Harman Kardon:[/b] Benötigt [b]keine[/b] DSP-Lizenz. Das Remote-Signal (+12 V, wenn Radio an) genügt zum Starten.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { aux: [&amp;quot;nein&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]AUX-IN:[/b] Der AUX-IN muss codiert werden. Optional kann ein FM-Transmitter genutzt werden - das ist nicht empfohlen.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;7er-e38&amp;quot;, &amp;quot;x5-e53&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Montage:[/b] Radios für BMW E38/E53 benötigen keine extra Halterungen.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;5er-e39&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;3er-e46&amp;quot;], factory: [&amp;quot;iris&amp;quot;, &amp;quot;mid&amp;quot;, &amp;quot;pfeil&amp;quot;], current: [&amp;quot;werk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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]&amp;quot; +&lt;br /&gt;
          &amp;quot;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]&amp;quot; +&lt;br /&gt;
          &amp;quot;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=&amp;quot; + P.funktr + &amp;quot;]&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { factory: [&amp;quot;cic&amp;quot;, &amp;quot;nbt&amp;quot;, &amp;quot;nbtevo&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Lichtleiter:[/b] Ggf. vorhandene Lichtleiter (MOST) müssen aus dem BMW-Stecker in den Xtrons-Adapter umgesteckt werden.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { factory: [&amp;quot;mask&amp;quot;, &amp;quot;ccc&amp;quot;, &amp;quot;cic&amp;quot;, &amp;quot;nbt&amp;quot;, &amp;quot;nbtevo&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, opts: [&amp;quot;kcan&amp;quot;], when: {},&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, opts: [&amp;quot;ibus&amp;quot;], when: {},&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: {},&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot; }&lt;br /&gt;
];&lt;br /&gt;
/* =====================================================================&lt;br /&gt;
   PROGRAMMLOGIK&lt;br /&gt;
   ===================================================================== */&lt;br /&gt;
var $ = function (id) { return document.getElementById(id); };&lt;br /&gt;
var sel = {}, picked = {}, summary = &amp;quot;&amp;quot;, capA = 0, capB = 0;&lt;br /&gt;
var fieldsEl = $(&amp;quot;nvk-fields&amp;quot;), optsEl = $(&amp;quot;nvk-opts&amp;quot;), outEl = $(&amp;quot;nvk-out&amp;quot;);&lt;br /&gt;
function full(u) { return u.indexOf(&amp;quot;/thumb/&amp;quot;) === -1 ? u : u.replace(&amp;quot;/thumb/&amp;quot;, &amp;quot;/&amp;quot;).replace(/\/[^\/]+$/, &amp;quot;&amp;quot;); }&lt;br /&gt;
function fmt(t) {&lt;br /&gt;
  return t.replace(/\[imgw=([^\x5D]+)\]/g, function (m, u) {&lt;br /&gt;
    return &amp;quot;\u003Ca href=\&amp;quot;&amp;quot; + full(u) + &amp;quot;\&amp;quot; target=\&amp;quot;_blank\&amp;quot; rel=\&amp;quot;noopener\&amp;quot;\u003E\u003Cimg class=\&amp;quot;nvk-img wide\&amp;quot; src=\&amp;quot;&amp;quot; + u + &amp;quot;\&amp;quot; alt=\&amp;quot;\&amp;quot;\u003E\u003C/a\u003E&amp;quot;;&lt;br /&gt;
  }).replace(/\[img=([^\x5D]+)\]/g, function (m, u) {&lt;br /&gt;
    return &amp;quot;\u003Ca href=\&amp;quot;&amp;quot; + full(u) + &amp;quot;\&amp;quot; target=\&amp;quot;_blank\&amp;quot; rel=\&amp;quot;noopener\&amp;quot;\u003E\u003Cimg class=\&amp;quot;nvk-img\&amp;quot; src=\&amp;quot;&amp;quot; + u + &amp;quot;\&amp;quot; alt=\&amp;quot;\&amp;quot;\u003E\u003C/a\u003E&amp;quot;;&lt;br /&gt;
  }).replace(/\[b\]/g, &amp;quot;\u003Cb\u003E&amp;quot;).replace(/\[\/b\]/g, &amp;quot;\u003C/b\u003E&amp;quot;).replace(/\[br\]/g, &amp;quot;\u003Cbr\u003E&amp;quot;)&lt;br /&gt;
    .replace(/\[a=([^\x5D]+)\]/g, &amp;quot;\u003Ca href=\&amp;quot;$1\&amp;quot; target=\&amp;quot;_blank\&amp;quot; rel=\&amp;quot;noopener\&amp;quot;\u003E&amp;quot;).replace(/\[\/a\]/g, &amp;quot;\u003C/a\u003E&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
function match(cond, s, lenient) {&lt;br /&gt;
  if (!cond) return true;&lt;br /&gt;
  for (var k in cond) {&lt;br /&gt;
    if (!s[k]) { if (lenient) continue; return false; }&lt;br /&gt;
    if (cond[k].indexOf(s[k]) === -1) return false;&lt;br /&gt;
  }&lt;br /&gt;
  return true;&lt;br /&gt;
}&lt;br /&gt;
function vehicleOf(id) { return VEHICLES.filter(function (x) { return x.v === id; })[0]; }&lt;br /&gt;
function derive() {&lt;br /&gt;
  var s = {}, k;&lt;br /&gt;
  for (k in sel) s[k] = sel[k];&lt;br /&gt;
  var veh = vehicleOf(sel.vehicle);&lt;br /&gt;
  if (veh) s.gen = veh.gen;&lt;br /&gt;
  if (s.gen === &amp;quot;alt&amp;quot;) {&lt;br /&gt;
    if (s.factory === &amp;quot;n43&amp;quot; || s.factory === &amp;quot;n169&amp;quot;) s.module = &amp;quot;ja&amp;quot;;&lt;br /&gt;
    else if (s.factory === &amp;quot;iris&amp;quot; || s.factory === &amp;quot;mid&amp;quot;) s.module = &amp;quot;nein&amp;quot;;&lt;br /&gt;
    else if (s.factory === &amp;quot;pfeil&amp;quot;) s.module = s.trunk || &amp;quot;unk&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  return s;&lt;br /&gt;
}&lt;br /&gt;
function forced(s) {&lt;br /&gt;
  var f = {};&lt;br /&gt;
  FORCED.forEach(function (r) { if (match(r.when, s)) r.opts.forEach(function (o) { f[o] = r.why; }); });&lt;br /&gt;
  return f;&lt;br /&gt;
}&lt;br /&gt;
function onSet(s) {&lt;br /&gt;
  var f = forced(s), on = {}, k;&lt;br /&gt;
  for (k in picked) if (picked[k]) on[k] = true;&lt;br /&gt;
  for (k in f) on[k] = true;&lt;br /&gt;
  return { on: on, forced: f };&lt;br /&gt;
}&lt;br /&gt;
function optVisible(o, s, on) {&lt;br /&gt;
  if (!match(o.show, s, true)) return false;&lt;br /&gt;
  return (o.requires || []).every(function (r) { return on[r]; });&lt;br /&gt;
}&lt;br /&gt;
FIELDS.forEach(function (f) {&lt;br /&gt;
  var wrap = document.createElement(&amp;quot;div&amp;quot;); wrap.className = &amp;quot;nvk-f&amp;quot;; wrap.id = &amp;quot;nvk-w-&amp;quot; + f.id;&lt;br /&gt;
  var lab = document.createElement(&amp;quot;label&amp;quot;); lab.htmlFor = &amp;quot;nvk-&amp;quot; + f.id; lab.textContent = f.label;&lt;br /&gt;
  var s = document.createElement(&amp;quot;select&amp;quot;); s.id = &amp;quot;nvk-&amp;quot; + f.id;&lt;br /&gt;
  s.addEventListener(&amp;quot;change&amp;quot;, function () { sel[f.id] = s.value; update(); });&lt;br /&gt;
  wrap.appendChild(lab); wrap.appendChild(s);&lt;br /&gt;
  if (f.help) { var h = document.createElement(&amp;quot;div&amp;quot;); h.className = &amp;quot;nvk-help&amp;quot;; h.innerHTML = fmt(f.help); wrap.appendChild(h); }&lt;br /&gt;
  var inf = document.createElement(&amp;quot;div&amp;quot;); inf.id = &amp;quot;nvk-i-&amp;quot; + f.id; wrap.appendChild(inf);&lt;br /&gt;
  fieldsEl.appendChild(wrap);&lt;br /&gt;
});&lt;br /&gt;
function renderFields() {&lt;br /&gt;
  FIELDS.forEach(function (f) {&lt;br /&gt;
    var s = derive();&lt;br /&gt;
    var wrap = $(&amp;quot;nvk-w-&amp;quot; + f.id), el = $(&amp;quot;nvk-&amp;quot; + f.id);&lt;br /&gt;
    var vis = f.show ? match(f.show, s, false) : true;&lt;br /&gt;
    wrap.style.display = vis ? &amp;quot;&amp;quot; : &amp;quot;none&amp;quot;;&lt;br /&gt;
    if (!vis) { sel[f.id] = &amp;quot;&amp;quot;; return; }&lt;br /&gt;
    var allowed = f.values.filter(function (v) { return match(v.only, s, true); });&lt;br /&gt;
    if (sel[f.id]) { if (!allowed.some(function (v) { return v.v === sel[f.id]; })) sel[f.id] = &amp;quot;&amp;quot;; }&lt;br /&gt;
    if (!sel[f.id]) { if (f.def) sel[f.id] = f.def; }&lt;br /&gt;
    if (!sel[f.id]) { if (f.auto) { if (sel.vehicle) { if (allowed.length === 1) sel[f.id] = allowed[0].v; } } }&lt;br /&gt;
    el.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
    if (!f.def) { var p = document.createElement(&amp;quot;option&amp;quot;); p.value = &amp;quot;&amp;quot;; p.textContent = &amp;quot;– bitte wählen –&amp;quot;; el.appendChild(p); }&lt;br /&gt;
    allowed.forEach(function (v) {&lt;br /&gt;
      var o = document.createElement(&amp;quot;option&amp;quot;); o.value = v.v; o.textContent = v.t; el.appendChild(o);&lt;br /&gt;
    });&lt;br /&gt;
    el.value = sel[f.id] || &amp;quot;&amp;quot;;&lt;br /&gt;
    var cur = allowed.filter(function (v) { return v.v === sel[f.id]; })[0];&lt;br /&gt;
    var pre = f.pre ? (match(f.pre.when, s, false) ? fmt(f.pre.html) : &amp;quot;&amp;quot;) : &amp;quot;&amp;quot;;&lt;br /&gt;
    $(&amp;quot;nvk-i-&amp;quot; + f.id).innerHTML = pre + (cur ? (cur.info ? fmt(cur.info) : &amp;quot;&amp;quot;) : &amp;quot;&amp;quot;);&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
function renderOpts() {&lt;br /&gt;
  var s = derive(), st = onSet(s);&lt;br /&gt;
  OPTS.forEach(function (o) { if (!optVisible(o, s, st.on)) picked[o.id] = false; });&lt;br /&gt;
  st = onSet(s);&lt;br /&gt;
  optsEl.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
  OPTS.forEach(function (o) {&lt;br /&gt;
    if (!optVisible(o, s, st.on)) return;&lt;br /&gt;
    var lab = document.createElement(&amp;quot;label&amp;quot;); lab.className = &amp;quot;nvk-o&amp;quot;;&lt;br /&gt;
    var cb = document.createElement(&amp;quot;input&amp;quot;); cb.type = &amp;quot;checkbox&amp;quot;;&lt;br /&gt;
    cb.checked = !!st.on[o.id];&lt;br /&gt;
    var isForced = !!st.forced[o.id];&lt;br /&gt;
    if (isForced) { cb.disabled = true; lab.className += &amp;quot; dis&amp;quot;; }&lt;br /&gt;
    cb.addEventListener(&amp;quot;change&amp;quot;, function () {&lt;br /&gt;
      picked[o.id] = cb.checked;&lt;br /&gt;
      if (cb.checked) { if (o.excl) OPTS.forEach(function (x) { if (x.excl === o.excl) { if (x.id !== o.id) picked[x.id] = false; } }); }&lt;br /&gt;
      update();&lt;br /&gt;
    });&lt;br /&gt;
    lab.appendChild(cb);&lt;br /&gt;
    lab.appendChild(document.createTextNode(&amp;quot; &amp;quot; + o.t));&lt;br /&gt;
    var sub = [o.sub, isForced ? st.forced[o.id] : &amp;quot;&amp;quot;].filter(Boolean).join(&amp;quot; - &amp;quot;);&lt;br /&gt;
    if (sub) { var sm = document.createElement(&amp;quot;small&amp;quot;); sm.textContent = &amp;quot; (&amp;quot; + sub + &amp;quot;)&amp;quot;; lab.appendChild(sm); }&lt;br /&gt;
    optsEl.appendChild(lab);&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
function link(url, text) {&lt;br /&gt;
  var a = document.createElement(&amp;quot;a&amp;quot;); a.href = url; a.target = &amp;quot;_blank&amp;quot;; a.rel = &amp;quot;noopener&amp;quot;; a.textContent = text; return a;&lt;br /&gt;
}&lt;br /&gt;
function card(item, cls) {&lt;br /&gt;
  var d = document.createElement(&amp;quot;div&amp;quot;); d.className = &amp;quot;nvk-card &amp;quot; + (cls || &amp;quot;&amp;quot;) + (item.hl ? &amp;quot; hl&amp;quot; : &amp;quot;&amp;quot;);&lt;br /&gt;
  var b = document.createElement(&amp;quot;b&amp;quot;); b.textContent = item.t; d.appendChild(b);&lt;br /&gt;
  if (item.d) { var p = document.createElement(&amp;quot;span&amp;quot;); p.textContent = item.d; d.appendChild(p); }&lt;br /&gt;
  if (item.img) {&lt;br /&gt;
    var im = document.createElement(&amp;quot;div&amp;quot;);&lt;br /&gt;
    item.img.forEach(function (u) {&lt;br /&gt;
      var a = document.createElement(&amp;quot;a&amp;quot;); a.href = full(u); a.target = &amp;quot;_blank&amp;quot;; a.rel = &amp;quot;noopener&amp;quot;;&lt;br /&gt;
      var g = document.createElement(&amp;quot;img&amp;quot;); g.className = &amp;quot;nvk-img&amp;quot;; g.src = u; g.alt = item.t; a.appendChild(g); im.appendChild(a);&lt;br /&gt;
    });&lt;br /&gt;
    d.appendChild(im);&lt;br /&gt;
  }&lt;br /&gt;
  if (item.u || item.w) {&lt;br /&gt;
    var l = document.createElement(&amp;quot;div&amp;quot;); l.className = &amp;quot;nvk-links&amp;quot;;&lt;br /&gt;
    if (item.u) l.appendChild(link(item.u, item.ut || &amp;quot;Im Shop ansehen →&amp;quot;));&lt;br /&gt;
    if (item.w) l.appendChild(link(item.w, (item.wt || &amp;quot;Zum Wiki&amp;quot;) + &amp;quot; →&amp;quot;));&lt;br /&gt;
    d.appendChild(l);&lt;br /&gt;
  }&lt;br /&gt;
  if (item.links) item.links.forEach(function (x) {&lt;br /&gt;
    var r = document.createElement(&amp;quot;div&amp;quot;); r.className = &amp;quot;nvk-links&amp;quot;; r.appendChild(link(x.u, x.t + &amp;quot; →&amp;quot;)); d.appendChild(r);&lt;br /&gt;
  });&lt;br /&gt;
  return d;&lt;br /&gt;
}&lt;br /&gt;
function heading(txt) { var h = document.createElement(&amp;quot;h3&amp;quot;); h.textContent = txt; outEl.appendChild(h); }&lt;br /&gt;
function renderResult() {&lt;br /&gt;
  var s = derive(), st = onSet(s);&lt;br /&gt;
  var missing = FIELDS.filter(function (f) {&lt;br /&gt;
    var w = $(&amp;quot;nvk-w-&amp;quot; + f.id);&lt;br /&gt;
    return w.style.display !== &amp;quot;none&amp;quot; ? (!f.optional ? !sel[f.id] : false) : false;&lt;br /&gt;
  });&lt;br /&gt;
  outEl.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
  if (missing.length) {&lt;br /&gt;
    var m = document.createElement(&amp;quot;p&amp;quot;); m.className = &amp;quot;nvk-miss&amp;quot;;&lt;br /&gt;
    m.textContent = &amp;quot;Bitte noch auswählen: &amp;quot; + missing.map(function (f) { return f.label; }).join(&amp;quot;, &amp;quot;);&lt;br /&gt;
    outEl.appendChild(m); $(&amp;quot;nvk-form&amp;quot;).style.display = &amp;quot;none&amp;quot;; return;&lt;br /&gt;
  }&lt;br /&gt;
  $(&amp;quot;nvk-form&amp;quot;).style.display = &amp;quot;&amp;quot;;&lt;br /&gt;
  var veh = vehicleOf(sel.vehicle);&lt;br /&gt;
  var ru = veh.noCat ? SHOP + &amp;quot;bmw-radios/&amp;quot; : SHOP + &amp;quot;bmw-radios/&amp;quot; + veh.v + &amp;quot;/&amp;quot;;&lt;br /&gt;
  heading(&amp;quot;Passende Radios&amp;quot;);&lt;br /&gt;
  outEl.appendChild(card({ t: &amp;quot;BMW Radios für &amp;quot; + veh.t, d: &amp;quot;Alle Radios, die für Deinen BMW &amp;quot; + veh.t + &amp;quot; im Shop erhältlich sind.&amp;quot;,&lt;br /&gt;
    u: ru, ut: &amp;quot;Zu den passenden Radios →&amp;quot;, w: SHOP + &amp;quot;bmw-radios/&amp;quot;, wt: &amp;quot;Alle BMW Radios&amp;quot; }, &amp;quot;rad&amp;quot;));&lt;br /&gt;
  var needs = [], hints = [], seen = {};&lt;br /&gt;
  RULES.forEach(function (r) {&lt;br /&gt;
    if (!match(r.when, s)) return;&lt;br /&gt;
    if (r.opts) { if (!r.opts.every(function (o) { return st.on[o]; })) return; }&lt;br /&gt;
    if (r.type === &amp;quot;need&amp;quot;) (r.items || []).forEach(function (id) { if (!seen[id]) { seen[id] = 1; needs.push(ITEMS[id]); } });&lt;br /&gt;
    else hints.push(r.html);&lt;br /&gt;
  });&lt;br /&gt;
  heading(&amp;quot;Das brauchst Du&amp;quot;);&lt;br /&gt;
  if (needs.length) needs.forEach(function (i) { outEl.appendChild(card(i)); });&lt;br /&gt;
  else { var n = document.createElement(&amp;quot;p&amp;quot;); n.textContent = &amp;quot;Für die Grundinstallation sind keine zusätzlichen Verlängerungen oder Adapter nötig.&amp;quot;; outEl.appendChild(n); }&lt;br /&gt;
  var opt = [];&lt;br /&gt;
  OPTS.forEach(function (o) {&lt;br /&gt;
    if (!st.on[o.id]) return;&lt;br /&gt;
    if (!optVisible(o, s, st.on)) return;&lt;br /&gt;
    o.items.forEach(function (id) {&lt;br /&gt;
      if (seen[id]) return;&lt;br /&gt;
      var sk = ITEMS[id].skipIf;&lt;br /&gt;
      if (sk) { if (seen[sk]) return; }&lt;br /&gt;
      seen[id] = 1; opt.push(ITEMS[id]);&lt;br /&gt;
    });&lt;br /&gt;
  });&lt;br /&gt;
  if (opt.length) { heading(&amp;quot;Deine Zusatzoptionen&amp;quot;); opt.forEach(function (i) { outEl.appendChild(card(i, &amp;quot;opt&amp;quot;)); }); }&lt;br /&gt;
  if (hints.length) {&lt;br /&gt;
    heading(&amp;quot;Hinweise&amp;quot;);&lt;br /&gt;
    hints.forEach(function (t) { var d = document.createElement(&amp;quot;div&amp;quot;); d.className = &amp;quot;nvk-note&amp;quot;; d.innerHTML = fmt(t); outEl.appendChild(d); });&lt;br /&gt;
  }&lt;br /&gt;
  var L = [&amp;quot;KONFIGURATION&amp;quot;];&lt;br /&gt;
  FIELDS.forEach(function (f) {&lt;br /&gt;
    if (!sel[f.id]) return;&lt;br /&gt;
    var v = f.values.filter(function (x) { return x.v === sel[f.id]; })[0];&lt;br /&gt;
    if (v) L.push(&amp;quot;- &amp;quot; + f.label + &amp;quot;: &amp;quot; + v.t);&lt;br /&gt;
  });&lt;br /&gt;
  L.push(&amp;quot;&amp;quot;, &amp;quot;BENÖTIGT&amp;quot;);&lt;br /&gt;
  needs.forEach(function (i) { L.push(&amp;quot;- &amp;quot; + i.t + (i.u ? &amp;quot;  &amp;quot; + i.u : &amp;quot;&amp;quot;)); });&lt;br /&gt;
  if (opt.length) { L.push(&amp;quot;&amp;quot;, &amp;quot;ZUSATZOPTIONEN&amp;quot;); opt.forEach(function (i) { L.push(&amp;quot;- &amp;quot; + i.t + (i.u ? &amp;quot;  &amp;quot; + i.u : &amp;quot;&amp;quot;)); }); }&lt;br /&gt;
  L.push(&amp;quot;&amp;quot;, &amp;quot;Radios: &amp;quot; + ru);&lt;br /&gt;
  summary = L.join(&amp;quot;\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
function update() { renderFields(); renderOpts(); renderResult(); }&lt;br /&gt;
function newCaptcha() {&lt;br /&gt;
  capA = 1 + Math.floor(Math.random() * 9); capB = 1 + Math.floor(Math.random() * 9);&lt;br /&gt;
  $(&amp;quot;nvk-capq&amp;quot;).textContent = &amp;quot;Sicherheitsfrage: Was ist &amp;quot; + capA + &amp;quot; + &amp;quot; + capB + &amp;quot;? *&amp;quot;; $(&amp;quot;nvk-cap&amp;quot;).value = &amp;quot;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
function status(msg, ok) { var e = $(&amp;quot;nvk-status&amp;quot;); e.style.display = &amp;quot;&amp;quot;; e.textContent = msg; e.style.borderLeftColor = ok ? &amp;quot;#14866d&amp;quot; : &amp;quot;#d33&amp;quot;; }&lt;br /&gt;
$(&amp;quot;nvk-send&amp;quot;).addEventListener(&amp;quot;click&amp;quot;, function () {&lt;br /&gt;
  var name = $(&amp;quot;nvk-name&amp;quot;).value.trim(), mail = $(&amp;quot;nvk-mail&amp;quot;).value.trim(), vin = $(&amp;quot;nvk-vin&amp;quot;).value.trim().toUpperCase(), msg = $(&amp;quot;nvk-msg&amp;quot;).value.trim();&lt;br /&gt;
  if (!name || !mail || !msg) return status(&amp;quot;Bitte Name, E-Mail und Kommentar ausfüllen.&amp;quot;, false);&lt;br /&gt;
  if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(mail)) return status(&amp;quot;Bitte eine gültige E-Mail-Adresse eingeben.&amp;quot;, false);&lt;br /&gt;
  if (vin) { if (!/^[A-Z]{2}[0-9]{5}$/.test(vin)) { if (!/^[A-HJ-NPR-Z0-9]{17}$/.test(vin)) return status(&amp;quot;Bitte die VIN im Format AB12345 oder die 17-stellige FGN eingeben - oder das Feld leer lassen.&amp;quot;, false); } }&lt;br /&gt;
  if (parseInt($(&amp;quot;nvk-cap&amp;quot;).value, 10) !== capA + capB) return status(&amp;quot;Die Sicherheitsfrage wurde nicht richtig beantwortet.&amp;quot;, false);&lt;br /&gt;
  if (!$(&amp;quot;nvk-dsgvo&amp;quot;).checked) return status(&amp;quot;Bitte der Verarbeitung Deiner Daten zustimmen.&amp;quot;, false);&lt;br /&gt;
  if ($(&amp;quot;nvk-hp&amp;quot;).value) return;&lt;br /&gt;
  var sz = $(&amp;quot;nvk-size&amp;quot;).value;&lt;br /&gt;
  var sum2 = summary + (sz ? &amp;quot;\n\nGewünschte Displaygröße: &amp;quot; + sz : &amp;quot;&amp;quot;);&lt;br /&gt;
  var text = &amp;quot;Name: &amp;quot; + name + &amp;quot;\nE-Mail: &amp;quot; + mail + &amp;quot;\nVIN: &amp;quot; + (vin || &amp;quot;-&amp;quot;) + &amp;quot;\n\nKommentar:\n&amp;quot; + msg + &amp;quot;\n\n&amp;quot; + sum2;&lt;br /&gt;
  if (SEND_URL) {&lt;br /&gt;
    var p = new URLSearchParams();&lt;br /&gt;
    p.append(&amp;quot;name&amp;quot;, name); p.append(&amp;quot;mail&amp;quot;, mail); p.append(&amp;quot;vin&amp;quot;, vin); p.append(&amp;quot;msg&amp;quot;, msg); p.append(&amp;quot;summary&amp;quot;, sum2);&lt;br /&gt;
    p.append(&amp;quot;hp&amp;quot;, $(&amp;quot;nvk-hp&amp;quot;).value); p.append(&amp;quot;ca&amp;quot;, capA); p.append(&amp;quot;cb&amp;quot;, capB); p.append(&amp;quot;cv&amp;quot;, $(&amp;quot;nvk-cap&amp;quot;).value);&lt;br /&gt;
    fetch(SEND_URL, { method: &amp;quot;POST&amp;quot;, body: p }).then(function (r) {&lt;br /&gt;
      if (!r.ok) throw new Error(&amp;quot;send&amp;quot;);&lt;br /&gt;
      status(&amp;quot;Danke! Deine Anfrage wurde gesendet, eine Kopie geht an &amp;quot; + mail + &amp;quot;.&amp;quot;, true); newCaptcha();&lt;br /&gt;
    }).catch(function () { status(&amp;quot;Das Senden hat nicht geklappt. Bitte versuche es später noch einmal oder schreibe direkt an &amp;quot; + MAIL_TO + &amp;quot;.&amp;quot;, false); });&lt;br /&gt;
  } else {&lt;br /&gt;
    var AMP = &amp;quot;\u0026&amp;quot;;&lt;br /&gt;
    window.location.href = &amp;quot;mailto:&amp;quot; + MAIL_TO + &amp;quot;?cc=&amp;quot; + encodeURIComponent(mail) + AMP + &amp;quot;subject=&amp;quot; + encodeURIComponent(MAIL_SUBJECT) + AMP + &amp;quot;body=&amp;quot; + encodeURIComponent(text);&lt;br /&gt;
    status(&amp;quot;Dein E-Mail-Programm wurde mit der fertigen Anfrage geöffnet. Bitte dort noch auf Senden klicken.&amp;quot;, true);&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
$(&amp;quot;nvk-reset&amp;quot;).addEventListener(&amp;quot;click&amp;quot;, function () { sel = {}; picked = {}; update(); });&lt;br /&gt;
newCaptcha();&lt;br /&gt;
update();&lt;br /&gt;
})();&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andre</name></author>
	</entry>
	<entry>
		<id>https://xtrons.ibus-app.de/index.php?title=Datei:CAN_Interface.png&amp;diff=4084</id>
		<title>Datei:CAN Interface.png</title>
		<link rel="alternate" type="text/html" href="https://xtrons.ibus-app.de/index.php?title=Datei:CAN_Interface.png&amp;diff=4084"/>
		<updated>2026-10-21T12:30:35Z</updated>

		<summary type="html">&lt;p&gt;Andre: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Andre</name></author>
	</entry>
	<entry>
		<id>https://xtrons.ibus-app.de/index.php?title=Datei:Resler_Modul_01.png&amp;diff=4083</id>
		<title>Datei:Resler Modul 01.png</title>
		<link rel="alternate" type="text/html" href="https://xtrons.ibus-app.de/index.php?title=Datei:Resler_Modul_01.png&amp;diff=4083"/>
		<updated>2026-10-21T12:29:57Z</updated>

		<summary type="html">&lt;p&gt;Andre: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Andre</name></author>
	</entry>
	<entry>
		<id>https://xtrons.ibus-app.de/index.php?title=Android_Radio_Konfigurator&amp;diff=4082</id>
		<title>Android Radio Konfigurator</title>
		<link rel="alternate" type="text/html" href="https://xtrons.ibus-app.de/index.php?title=Android_Radio_Konfigurator&amp;diff=4082"/>
		<updated>2026-10-21T12:28:04Z</updated>

		<summary type="html">&lt;p&gt;Andre: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
#nvk{max-width:900px;line-height:1.45}&lt;br /&gt;
#nvk *{box-sizing:border-box}&lt;br /&gt;
#nvk .nvk-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:14px;margin:12px 0}&lt;br /&gt;
#nvk .nvk-f label{display:block;font-weight:700;margin-bottom:4px}&lt;br /&gt;
#nvk select{width:100%;padding:9px 8px;font:inherit;color:#202122;background:#fff;border:1px solid #a2a9b1;border-radius:4px}&lt;br /&gt;
#nvk .nvk-help{font-size:.85em;opacity:.75;margin-top:3px}&lt;br /&gt;
#nvk fieldset{border:1px solid rgba(128,128,128,.45);border-radius:6px;padding:10px 14px;margin:14px 0}&lt;br /&gt;
#nvk legend{font-weight:700;padding:0 6px}&lt;br /&gt;
#nvk .nvk-o{display:block;padding:4px 0;cursor:pointer}&lt;br /&gt;
#nvk .nvk-o small{opacity:.7}&lt;br /&gt;
#nvk .nvk-o.dis{opacity:.75;cursor:default}&lt;br /&gt;
#nvk .nvk-btn{padding:7px 14px;font:inherit;border:1px solid #a2a9b1;border-radius:4px;background:#f8f9fa;color:#202122;cursor:pointer}&lt;br /&gt;
#nvk #nvk-out{margin-top:18px}&lt;br /&gt;
#nvk h3{margin:18px 0 8px}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-card.opt{border-left-color:#14866d}&lt;br /&gt;
#nvk .nvk-card.rad{border-left-color:#fff;background:rgba(255,255,255,.08)}&lt;br /&gt;
#nvk .nvk-card b{display:block}&lt;br /&gt;
#nvk .nvk-links{margin-top:4px;font-weight:600}&lt;br /&gt;
#nvk .nvk-links a{margin-right:14px}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-miss{opacity:.8;font-style:italic}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-card .nvk-img{max-width:230px;max-height:150px}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-card.hl{border:2px solid #36c;border-left-width:8px;background:rgba(51,102,204,.12);padding:12px 14px}&lt;br /&gt;
#nvk .nvk-card.hl b{font-size:1.1em}&lt;br /&gt;
#nvk .nvk-img.wide{max-width:min(100%,460px);max-height:none}&lt;br /&gt;
#nvk #nvk-form{margin-top:22px}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-grid&amp;quot; id=&amp;quot;nvk-fields&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;fieldset id=&amp;quot;nvk-optset&amp;quot;&amp;gt;&amp;lt;legend&amp;gt;Zusatzoptionen&amp;lt;/legend&amp;gt;&amp;lt;div id=&amp;quot;nvk-opts&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/fieldset&amp;gt;&lt;br /&gt;
&amp;lt;button type=&amp;quot;button&amp;quot; class=&amp;quot;nvk-btn&amp;quot; id=&amp;quot;nvk-reset&amp;quot;&amp;gt;Auswahl zurücksetzen&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk-out&amp;quot; aria-live=&amp;quot;polite&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;fieldset id=&amp;quot;nvk-form&amp;quot; style=&amp;quot;display:none&amp;quot;&amp;gt;&amp;lt;legend&amp;gt;Anfrage senden&amp;lt;/legend&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;nvk-help&amp;quot;&amp;gt;Deine Auswahl und die Liste oben werden automatisch mitgesendet. Alle Felder mit * sind Pflicht.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-grid&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-name&amp;quot;&amp;gt;Name *&amp;lt;/label&amp;gt;&amp;lt;input id=&amp;quot;nvk-name&amp;quot; type=&amp;quot;text&amp;quot; autocomplete=&amp;quot;name&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-mail&amp;quot;&amp;gt;E-Mail *&amp;lt;/label&amp;gt;&amp;lt;input id=&amp;quot;nvk-mail&amp;quot; type=&amp;quot;email&amp;quot; autocomplete=&amp;quot;email&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-size&amp;quot;&amp;gt;Gewünschte Displaygröße (optional)&amp;lt;/label&amp;gt;&amp;lt;select id=&amp;quot;nvk-size&amp;quot;&amp;gt;&amp;lt;option value=&amp;quot;&amp;quot;&amp;gt;Keine Angabe / Beratung gewünscht&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;7&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;8.8&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;9&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;10.25&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;12.3&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;14.9&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;Andere Größe (bitte im Kommentar nennen)&amp;lt;/option&amp;gt;&amp;lt;/select&amp;gt;&amp;lt;div class=&amp;quot;nvk-help&amp;quot;&amp;gt;Diagonale in Zoll. Nicht jede Größe gibt es für jede Baureihe, das prüfen wir für Dich.&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-vin&amp;quot;&amp;gt;VIN oder FGN (optional)&amp;lt;/label&amp;gt;&amp;lt;input id=&amp;quot;nvk-vin&amp;quot; type=&amp;quot;text&amp;quot; maxlength=&amp;quot;17&amp;quot; placeholder=&amp;quot;AB12345 oder 17-stellige FGN&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-msg&amp;quot;&amp;gt;Kommentar *&amp;lt;/label&amp;gt;&amp;lt;textarea id=&amp;quot;nvk-msg&amp;quot; rows=&amp;quot;4&amp;quot;&amp;gt;&amp;lt;/textarea&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot; style=&amp;quot;max-width:300px&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-cap&amp;quot; id=&amp;quot;nvk-capq&amp;quot;&amp;gt;Sicherheitsfrage *&amp;lt;/label&amp;gt;&amp;lt;input id=&amp;quot;nvk-cap&amp;quot; type=&amp;quot;text&amp;quot; inputmode=&amp;quot;numeric&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;input id=&amp;quot;nvk-hp&amp;quot; type=&amp;quot;text&amp;quot; tabindex=&amp;quot;-1&amp;quot; autocomplete=&amp;quot;off&amp;quot; aria-hidden=&amp;quot;true&amp;quot; style=&amp;quot;position:absolute;left:-9999px;width:1px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;label class=&amp;quot;nvk-o&amp;quot;&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; id=&amp;quot;nvk-dsgvo&amp;quot;&amp;gt; Ich stimme zu, dass meine Angaben zur Bearbeitung der Anfrage per E-Mail verarbeitet werden. *&amp;lt;/label&amp;gt;&lt;br /&gt;
&amp;lt;button type=&amp;quot;button&amp;quot; class=&amp;quot;nvk-btn&amp;quot; id=&amp;quot;nvk-send&amp;quot;&amp;gt;Anfrage senden&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk-status&amp;quot; class=&amp;quot;nvk-note&amp;quot; style=&amp;quot;display:none&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/fieldset&amp;gt;&lt;br /&gt;
&amp;lt;noscript&amp;gt;Für den Konfigurator wird JavaScript benötigt.&amp;lt;/noscript&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
(function () {&lt;br /&gt;
&amp;quot;use strict&amp;quot;;&lt;br /&gt;
/* =====================================================================&lt;br /&gt;
   KONFIGURATION - hier wird gepflegt.&lt;br /&gt;
   Textformat in Hinweisen: [b]fett[/b]  [br] Zeilenumbruch  [a=URL]Linktext[/a]&lt;br /&gt;
   Bitte im Skript KEIN kaufmännisches Und, kein Kleiner-/Größer-Zeichen&lt;br /&gt;
   und keine Leerzeilen verwenden (das Wiki wandelt sie um).&lt;br /&gt;
   ===================================================================== */&lt;br /&gt;
var SHOP = &amp;quot;https://shop.ibus-app.de/&amp;quot;;&lt;br /&gt;
var WIKI = &amp;quot;https://wiki.ibus-app.de/index.php?title=&amp;quot;;&lt;br /&gt;
/* Bilder aus dem Wiki (Thumbnail-Adressen; Klick öffnet automatisch das Originalbild) */&lt;br /&gt;
var IM = &amp;quot;https://xtrons.ibus-app.de/images/thumb/&amp;quot;;&lt;br /&gt;
var P = {&lt;br /&gt;
  schema:  IM + &amp;quot;e/ea/BMW_E39_Verl%C3%A4ngerungen_EXL005%2BFAKRA_.png/135px-BMW_E39_Verl%C3%A4ngerungen_EXL005%2BFAKRA_.png&amp;quot;,&lt;br /&gt;
  exl005:  IM + &amp;quot;7/70/Exl005-1.webp/257px-Exl005-1.webp.png&amp;quot;,&lt;br /&gt;
  fakra6m: IM + &amp;quot;d/d8/FM-extension_01_1.png/270px-FM-extension_01_1.png&amp;quot;,&lt;br /&gt;
  isofakra: IM + &amp;quot;4/4e/ISO-FAKRA_1.png/270px-ISO-FAKRA_1.png&amp;quot;,&lt;br /&gt;
  bm24:    IM + &amp;quot;8/82/BM24.png/130px-BM24.png&amp;quot;,&lt;br /&gt;
  iso:     IM + &amp;quot;d/dd/Iso.jpg/69px-Iso.jpg&amp;quot;,&lt;br /&gt;
  bm54:    IM + &amp;quot;3/34/BM54.png/135px-BM54.png&amp;quot;,&lt;br /&gt;
  fakra:   IM + &amp;quot;b/b3/Fakra.jpg/100px-Fakra.jpg&amp;quot;,&lt;br /&gt;
  pfeil:   IM + &amp;quot;e/ee/Navi_E46.jpg/239px-Navi_E46.jpg&amp;quot;,&lt;br /&gt;
  noquad:  IM + &amp;quot;6/68/No_elongation.jpg/180px-No_elongation.jpg&amp;quot;,&lt;br /&gt;
  noexl6:  IM + &amp;quot;7/7b/No_EXL006.jpg/180px-No_EXL006.jpg&amp;quot;,&lt;br /&gt;
  halter:  IM + &amp;quot;3/3b/Halter_Alu.webp/92px-Halter_Alu.webp.png&amp;quot;,&lt;br /&gt;
  deepobd: &amp;quot;https://xtrons.ibus-app.de/images/d/d4/DeepOBD_Interface_1.png&amp;quot;,&lt;br /&gt;
  n43:     IM + &amp;quot;e/e4/Navi4_3.jpg/240px-Navi4_3.jpg&amp;quot;,&lt;br /&gt;
  n169:    IM + &amp;quot;8/8a/Navi16_9.jpg/240px-Navi16_9.jpg&amp;quot;,&lt;br /&gt;
  radio:   IM + &amp;quot;9/96/E39_Radio.jpg/240px-E39_Radio.jpg&amp;quot;,&lt;br /&gt;
  idrive:  &amp;quot;https://xtrons.ibus-app.de/images/0/02/MASK-CCC-CIC-NBT-EVO-iDrive.jpg&amp;quot;,&lt;br /&gt;
  iris:    &amp;quot;https://xtrons.ibus-app.de/images/b/be/BusinessKas_IRISG.jpg&amp;quot;,&lt;br /&gt;
  funktr:  IM + &amp;quot;7/7e/E46_Funktionstraeger.png/240px-E46_Funktionstraeger.png&amp;quot;&lt;br /&gt;
};&lt;br /&gt;
/* Anfrage-Formular: MAIL_TO = Empfänger. SEND_URL leer = E-Mail-Programm des Kunden öffnen (mailto).&lt;br /&gt;
   SEND_URL = Adresse des Server-Skripts send-anfrage.php = Versand direkt vom Server (mit CC an den Kunden). */&lt;br /&gt;
var MAIL_TO = &amp;quot;info@ibus-app.de&amp;quot;;&lt;br /&gt;
var MAIL_SUBJECT = &amp;quot;Anfrage aus Android Radio Konfigurator&amp;quot;;&lt;br /&gt;
var SEND_URL = &amp;quot;https://xtrons.ibus-app.de/send-anfrage.php&amp;quot;;&lt;br /&gt;
/* ---- 1) Baureihen --------------------------------------------------------&lt;br /&gt;
   v = Shop-Kategorie (Link: SHOP + bmw-radios/ + v + /)&lt;br /&gt;
   gen: alt = I-BUS-Fahrzeuge (E38/E39/E46/E53/E83)&lt;br /&gt;
        b   = M-ASK / CCC / CIC     c = CIC / NBT / NBT EVO&lt;br /&gt;
   body = Karosserieformen (siehe BODY)                                      */&lt;br /&gt;
var BODY = { limo: &amp;quot;Limousine&amp;quot;, touring: &amp;quot;Touring&amp;quot;, coupe: &amp;quot;Coupé&amp;quot;, cabrio: &amp;quot;Cabrio&amp;quot;, schraeg: &amp;quot;Schrägheck&amp;quot;,&lt;br /&gt;
  compact: &amp;quot;Compact&amp;quot;, gt: &amp;quot;Gran Turismo&amp;quot;, gc: &amp;quot;Gran Coupé&amp;quot;, suv: &amp;quot;SUV / SAV&amp;quot;, roadster: &amp;quot;Roadster&amp;quot; };&lt;br /&gt;
var VEHICLES = [&lt;br /&gt;
  { v: &amp;quot;1er-e8x&amp;quot;, t: &amp;quot;1er E8x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;schraeg,coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;1er-f2x&amp;quot;, t: &amp;quot;1er F2x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;schraeg&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;2er-f2x&amp;quot;, t: &amp;quot;2er F2x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;3er-e46&amp;quot;, t: &amp;quot;3er E46&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;limo,touring,coupe,cabrio,compact&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;3er-e9x&amp;quot;, t: &amp;quot;3er E9x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;limo,touring,coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;3er-f3x&amp;quot;, t: &amp;quot;3er F3x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;limo,touring,gt&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;4er-f3x&amp;quot;, t: &amp;quot;4er F3x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;coupe,cabrio,gc&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;5er-e39&amp;quot;, t: &amp;quot;5er E39&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;limo,touring&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;5er-e6x&amp;quot;, t: &amp;quot;5er E6x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;limo,touring&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;5er-f1x&amp;quot;, t: &amp;quot;5er F1x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;limo,touring,gt&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;6er-e6x&amp;quot;, t: &amp;quot;6er E6x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;7er-e38&amp;quot;, t: &amp;quot;7er E38&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;limo&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;7er-e65&amp;quot;, t: &amp;quot;7er E65&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;limo&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;7er-f01&amp;quot;, t: &amp;quot;7er F01&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;limo&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x1-e84&amp;quot;, t: &amp;quot;X1 E84&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x1-f48&amp;quot;, t: &amp;quot;X1 F48&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x3-e83&amp;quot;, t: &amp;quot;X3 E83&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x3-f25&amp;quot;, t: &amp;quot;X3 F25&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x5-e53&amp;quot;, t: &amp;quot;X5 E53&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x5-e70&amp;quot;, t: &amp;quot;X5 E70&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x5-f15&amp;quot;, t: &amp;quot;X5 F15&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x6-e71&amp;quot;, t: &amp;quot;X6 E71&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;z4-e85e86&amp;quot;, t: &amp;quot;Z4 E85/E86&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;roadster,coupe&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;z4-e89&amp;quot;, t: &amp;quot;Z4 E89&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;roadster&amp;quot;, noCat: true }&lt;br /&gt;
];&lt;br /&gt;
/* Fahrzeuge mit K-CAN App (Beta) */&lt;br /&gt;
var KCAN = [&amp;quot;1er-e8x&amp;quot;, &amp;quot;3er-e9x&amp;quot;, &amp;quot;5er-e6x&amp;quot;, &amp;quot;6er-e6x&amp;quot;, &amp;quot;7er-e65&amp;quot;, &amp;quot;x1-e84&amp;quot;, &amp;quot;x5-e70&amp;quot;, &amp;quot;x6-e71&amp;quot;, &amp;quot;z4-e89&amp;quot;];&lt;br /&gt;
var bodyValues = Object.keys(BODY).map(function (k) {&lt;br /&gt;
  return { v: k, t: BODY[k], only: { vehicle: VEHICLES.filter(function (x) { return x.body.split(&amp;quot;,&amp;quot;).indexOf(k) !== -1; }).map(function (x) { return x.v; }) } };&lt;br /&gt;
});&lt;br /&gt;
/* ---- 2) Auswahlfelder ------------------------------------------------------&lt;br /&gt;
   only = Wert nur anbieten, wenn Bedingung passt   show = Feld nur dann zeigen&lt;br /&gt;
   optional = muss nicht gewählt werden             auto = bei nur einem Wert vorwählen */&lt;br /&gt;
var FIELDS = [&lt;br /&gt;
  { id: &amp;quot;vehicle&amp;quot;, label: &amp;quot;Fahrzeug&amp;quot;, values: VEHICLES.map(function (x) { return { v: x.v, t: &amp;quot;BMW &amp;quot; + x.t }; }) },&lt;br /&gt;
  { id: &amp;quot;factory&amp;quot;, label: &amp;quot;Verbaut ab Werk&amp;quot;, pre: { when: { gen: [&amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;] }, html: &amp;quot;[b]So erkennst Du Dein System:[/b][br][imgw=&amp;quot; + P.idrive + &amp;quot;]&amp;quot; }, values: [&lt;br /&gt;
    { v: &amp;quot;iris&amp;quot;,  t: &amp;quot;Radio mit IRIS&amp;quot;, only: { vehicle: [&amp;quot;3er-e46&amp;quot;, &amp;quot;5er-e39&amp;quot;, &amp;quot;7er-e38&amp;quot;, &amp;quot;x5-e53&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.iris + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;mid&amp;quot;,   t: &amp;quot;Radio mit MID&amp;quot;,  only: { gen: [&amp;quot;alt&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.radio + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;n43&amp;quot;,   t: &amp;quot;4:3 Navi&amp;quot;,       only: { vehicle: [&amp;quot;5er-e39&amp;quot;, &amp;quot;7er-e38&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.n43 + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;n169&amp;quot;,  t: &amp;quot;16:9 Navi&amp;quot;,      only: { gen: [&amp;quot;alt&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.n169 + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;pfeil&amp;quot;, t: &amp;quot;Pfeilnavi&amp;quot;,      only: { vehicle: [&amp;quot;3er-e46&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.pfeil + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;mask&amp;quot;,  t: &amp;quot;M-ASK&amp;quot;,          only: { gen: [&amp;quot;b&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;ccc&amp;quot;,   t: &amp;quot;CCC&amp;quot;,            only: { gen: [&amp;quot;b&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;cic&amp;quot;,   t: &amp;quot;CIC&amp;quot;,            only: { gen: [&amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;nbt&amp;quot;,   t: &amp;quot;NBT&amp;quot;,            only: { gen: [&amp;quot;c&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;nbtevo&amp;quot;, t: &amp;quot;NBT EVO&amp;quot;,       only: { gen: [&amp;quot;c&amp;quot;] } } ] },&lt;br /&gt;
  { id: &amp;quot;trunk&amp;quot;, label: &amp;quot;Wo sitzt das Radiomodul des Pfeilnavis?&amp;quot;, optional: true, show: { factory: [&amp;quot;pfeil&amp;quot;] },&lt;br /&gt;
    help: &amp;quot;Bitte prüfen: Sitzt das Modul im Kofferraum, oder im Pfeilnavi selbst (Quadlock hinten neben dem Antennenstecker)?[br][img=&amp;quot; + P.pfeil + &amp;quot;]&amp;quot;,&lt;br /&gt;
    values: [&lt;br /&gt;
    { v: &amp;quot;ja&amp;quot;, t: &amp;quot;Im Kofferraum (Verlängerungen nötig)&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;nein&amp;quot;, t: &amp;quot;Im Pfeilnavi, Quadlock hinten (keine Verlängerung)&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;unk&amp;quot;, t: &amp;quot;Weiß ich nicht&amp;quot; } ] },&lt;br /&gt;
  { id: &amp;quot;aux&amp;quot;, label: &amp;quot;AUX-IN verfügbar?&amp;quot;, show: { gen: [&amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;] }, values: [&lt;br /&gt;
    { v: &amp;quot;ja&amp;quot;, t: &amp;quot;Ja&amp;quot; }, { v: &amp;quot;nein&amp;quot;, t: &amp;quot;Nein&amp;quot; } ] },&lt;br /&gt;
  { id: &amp;quot;sound&amp;quot;, label: &amp;quot;Soundsystem&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;stereo&amp;quot;, t: &amp;quot;Stereo&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;hifi&amp;quot;,   t: &amp;quot;Hifi&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;dsp&amp;quot;,    t: &amp;quot;DSP&amp;quot;, only: { vehicle: [&amp;quot;7er-e38&amp;quot;, &amp;quot;5er-e39&amp;quot;, &amp;quot;x5-e53&amp;quot;, &amp;quot;x3-e83&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;hk&amp;quot;,     t: &amp;quot;Harman Kardon&amp;quot;, only: { vehicle: [&amp;quot;3er-e46&amp;quot;, &amp;quot;z4-e85e86&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;logic7&amp;quot;, t: &amp;quot;Logic7&amp;quot;, only: { vehicle: [&amp;quot;3er-e9x&amp;quot;, &amp;quot;5er-e6x&amp;quot;, &amp;quot;6er-e6x&amp;quot;, &amp;quot;7er-e65&amp;quot;, &amp;quot;1er-e8x&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;hksur&amp;quot;,  t: &amp;quot;Harman Kardon Surround&amp;quot;, only: { vehicle: [&amp;quot;1er-f2x&amp;quot;, &amp;quot;2er-f2x&amp;quot;, &amp;quot;3er-f3x&amp;quot;, &amp;quot;4er-f3x&amp;quot;, &amp;quot;5er-f1x&amp;quot;] } } ] },&lt;br /&gt;
  { id: &amp;quot;current&amp;quot;, label: &amp;quot;Aktuell verbaut&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;werk&amp;quot;, t: &amp;quot;Werksradio / Werksnavi&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;nach&amp;quot;, t: &amp;quot;Nachrüst-Radio / -Navi&amp;quot; } ] },&lt;br /&gt;
  { id: &amp;quot;body&amp;quot;, label: &amp;quot;Karosserie&amp;quot;, auto: true, values: bodyValues },&lt;br /&gt;
  { id: &amp;quot;ant&amp;quot;, label: &amp;quot;Antennenstecker am Radio (optional)&amp;quot;, optional: true, def: &amp;quot;unk&amp;quot;,&lt;br /&gt;
    show: { vehicle: [&amp;quot;7er-e38&amp;quot;, &amp;quot;5er-e39&amp;quot;, &amp;quot;3er-e46&amp;quot;, &amp;quot;x5-e53&amp;quot;] },&lt;br /&gt;
    values: [&lt;br /&gt;
    { v: &amp;quot;unk&amp;quot;,   t: &amp;quot;Weiß ich nicht&amp;quot;, info: &amp;quot;[b]BM24[/b] (Rundpin) = ISO-Antennenstecker:[br][img=&amp;quot; + P.bm24 + &amp;quot;][img=&amp;quot; + P.iso + &amp;quot;][br][b]BM54[/b] = FAKRA:[br][img=&amp;quot; + P.bm54 + &amp;quot;][img=&amp;quot; + P.fakra + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;iso&amp;quot;,   t: &amp;quot;ISO (BM24, Rundpin)&amp;quot;, info: &amp;quot;[img=&amp;quot; + P.bm24 + &amp;quot;][img=&amp;quot; + P.iso + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;fakra&amp;quot;, t: &amp;quot;FAKRA (BM54)&amp;quot;, info: &amp;quot;[img=&amp;quot; + P.bm54 + &amp;quot;][img=&amp;quot; + P.fakra + &amp;quot;]&amp;quot; } ] }&lt;br /&gt;
];&lt;br /&gt;
/* ---- 3) Zusatzoptionen (Mehrfachauswahl) ---------------------------------&lt;br /&gt;
   show = nur sichtbar wenn Bedingung passt   requires = nur sichtbar wenn diese Optionen gewählt sind&lt;br /&gt;
   excl = Optionen derselben Gruppe schließen sich aus   items = Artikel aus ITEMS */&lt;br /&gt;
var OPTS = [&lt;br /&gt;
  { id: &amp;quot;halter&amp;quot;,  t: &amp;quot;Radio-Halter&amp;quot;, sub: &amp;quot;nur BMW E39&amp;quot;, show: { vehicle: [&amp;quot;5er-e39&amp;quot;] }, items: [&amp;quot;halter&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;ibus&amp;quot;,    t: &amp;quot;I-BUS App&amp;quot;, show: { gen: [&amp;quot;alt&amp;quot;] }, items: [&amp;quot;ibus&amp;quot;, &amp;quot;resler&amp;quot;, &amp;quot;bclic&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;deepobd&amp;quot;, t: &amp;quot;DeepOBD (Diagnose)&amp;quot;, items: [&amp;quot;deepobd&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;can&amp;quot;,     t: &amp;quot;CAN Interface&amp;quot;, sub: &amp;quot;Addon - nur mit I-BUS App&amp;quot;, show: { gen: [&amp;quot;alt&amp;quot;] }, requires: [&amp;quot;ibus&amp;quot;], items: [&amp;quot;can&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;kcan&amp;quot;,    t: &amp;quot;K-CAN App (Beta)&amp;quot;, sub: &amp;quot;Pendant zur I-BUS App&amp;quot;, show: { vehicle: KCAN }, items: [&amp;quot;kcan&amp;quot;, &amp;quot;kcanlic&amp;quot;, &amp;quot;can&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;tpms&amp;quot;,    t: &amp;quot;TPMS (Reifendruck)&amp;quot;, items: [&amp;quot;tpms&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;dab1&amp;quot;,    t: &amp;quot;DAB+ (Single Receiver)&amp;quot;, excl: &amp;quot;dab&amp;quot;, items: [&amp;quot;dab1&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;dab2&amp;quot;,    t: &amp;quot;DAB+ (Dual Receiver)&amp;quot;,   excl: &amp;quot;dab&amp;quot;, items: [&amp;quot;dab2&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;rcam&amp;quot;,    t: &amp;quot;Rückfahrkamera&amp;quot;, items: [&amp;quot;rcam&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;fcam&amp;quot;,    t: &amp;quot;Front-Kamera&amp;quot;, items: [&amp;quot;fcam&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;tool&amp;quot;,    t: &amp;quot;Einbau-Werkzeug (Kunststoffheber)&amp;quot;, items: [&amp;quot;tool&amp;quot;] }&lt;br /&gt;
];&lt;br /&gt;
/* Erzwungene Optionen (werden automatisch gesetzt und gesperrt) */&lt;br /&gt;
var FORCED = [&lt;br /&gt;
  { when: { sound: [&amp;quot;dsp&amp;quot;] }, opts: [&amp;quot;ibus&amp;quot;], why: &amp;quot;wegen DSP erforderlich&amp;quot; }&lt;br /&gt;
];&lt;br /&gt;
/* ---- 4) Artikel ------------------------------------------------------------&lt;br /&gt;
   u = Shop-Link (ut = Linktext)   w = Wiki-Link (wt = Linktext)   leer = kein Link&lt;br /&gt;
   skipIf = Artikel entfällt, wenn der genannte Artikel schon in der Liste steht */&lt;br /&gt;
var ITEMS = {&lt;br /&gt;
  exl005:  { t: &amp;quot;Verlängerung EXL005&amp;quot;, d: &amp;quot;Ersetzt das Radiomodul im Kofferraum.&amp;quot;, u: SHOP + &amp;quot;detail/index/sArticle/212/&amp;quot;, img: [P.exl005, P.schema] },&lt;br /&gt;
  fakra6m: { t: &amp;quot;Verlängerung 6 m FAKRA(m) auf FAKRA(f), gewinkelt&amp;quot;, d: &amp;quot;Antennenverlängerung vom Kofferraum nach vorn.&amp;quot;, img: [P.fakra6m],&lt;br /&gt;
             u: SHOP + &amp;quot;shop/zubehoer/adapterkabel/192/verlaengerung-6m-fakra-m-auf-fakra-f-kurz-gewinkelt&amp;quot; },&lt;br /&gt;
  isoada:  { t: &amp;quot;Adapter ISO-Stecker auf FAKRA, gewinkelt (15 cm)&amp;quot;, d: &amp;quot;Nötig bei ISO-Antennenstecker (BM24, Rundpin).&amp;quot;, img: [P.isofakra],&lt;br /&gt;
             u: SHOP + &amp;quot;shop/zubehoer/adapterkabel/193/adapter-kabel-iso-f-auf-fakra-f-kurz-gewinkelt-15cm&amp;quot; },&lt;br /&gt;
  bcdsp:   { t: &amp;quot;I-BUS App - BC+DSP Lizenz&amp;quot;, d: &amp;quot;Ohne DSP-Lizenz arbeitet das Werks-DSP nicht.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/lizenzen/171/i-bus-app-bc-dsp-lizenz&amp;quot;,&lt;br /&gt;
             w: WIKI + &amp;quot;Habe_ich_DSP%3F&amp;quot;, wt: &amp;quot;Wiki: Habe ich DSP?&amp;quot; },&lt;br /&gt;
  halter:  { t: &amp;quot;Alu-Halter zur Radio-Montage im BMW E39&amp;quot;, d: &amp;quot;Empfohlen bei Radios, die nicht von AVIN stammen.&amp;quot;, img: [P.halter],&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/radiohalter/185/alu-halter-zur-radio-montage-im-bmw-e39&amp;quot; },&lt;br /&gt;
  ibus:    { t: &amp;quot;I-BUS App&amp;quot;, hl: true,&lt;br /&gt;
             d: &amp;quot;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.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;cat/index/sCategory/42&amp;quot;,&lt;br /&gt;
             links: [&lt;br /&gt;
               { u: WIKI + &amp;quot;Was_brauche_ich_um_die_I-BUS_App_nutzen_zu_k%C3%B6nnen%3F&amp;quot;, t: &amp;quot;Wiki: Was brauche ich für die I-BUS App?&amp;quot; },&lt;br /&gt;
               { u: WIKI + &amp;quot;Funktionen&amp;quot;, t: &amp;quot;Liste aller I-BUS App Funktionen (BMW E38|E39|E46|E53|E83)&amp;quot; },&lt;br /&gt;
               { u: WIKI + &amp;quot;Was_geht_beim_BMW_E46_nicht&amp;quot;, t: &amp;quot;Was geht beim BMW E46, E83, E85,.. nicht? (da werkseitig nicht verbaut)&amp;quot; },&lt;br /&gt;
               { u: WIKI + &amp;quot;Funktionseinschr%C3%A4nkungen_nach_Baujahr/Ausstattung/Modell&amp;quot;, t: &amp;quot;Funktionseinschränkungen nach Baujahr/Ausstattung/Modell&amp;quot; } ] },&lt;br /&gt;
  resler:  { t: &amp;quot;Resler USB I-BUS Modul inkl. Anschlusskabel&amp;quot;, d: &amp;quot;Verbindet I-BUS App und Fahrzeug.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/interfaces-module/191/resler-usb-i-bus-modul-inkl.-anschlusskabel&amp;quot;,&lt;br /&gt;
             w: &amp;quot;https://wiki.ibus-app.de/index.php?title=Hauptseite#Einbauanleitung_f.C3.BCr_Resler_Modul_und_Resler_Interface&amp;quot;, wt: &amp;quot;Einbauanleitung Resler Modul&amp;quot; },&lt;br /&gt;
  bclic:   { t: &amp;quot;I-BUS App - BC Lizenz&amp;quot;, d: &amp;quot;Schaltet u. a. die BC-Daten der App frei.&amp;quot;, skipIf: &amp;quot;bcdsp&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/lizenzen/167/i-bus-app-bc-lizenz&amp;quot; },&lt;br /&gt;
  deepobd: { t: &amp;quot;Deep OBD OBD-II Bluetooth-Adapter&amp;quot;, d: &amp;quot;Live-Werte auslesen, Fehler lesen und löschen.&amp;quot;, img: [P.deepobd],&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/interfaces-module/258/deep-obd-obd-ii-bluetooth-adapter?c=54&amp;quot;,&lt;br /&gt;
             w: &amp;quot;https://xtrons.ibus-app.de/index.php?title=DeepOBD_-_Adapter_und_App_einrichten&amp;quot;, wt: &amp;quot;Wiki: DeepOBD einrichten&amp;quot; },&lt;br /&gt;
  can:     { t: &amp;quot;CAN-Bus Interface inkl. Anschlusskabel&amp;quot;, d: &amp;quot;Addon, funktioniert nur zusammen mit der I-BUS App bzw. der K-CAN App.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/interfaces-module/346/can-bus-interface-inkl.-anschlusskabel&amp;quot;,&lt;br /&gt;
             w: WIKI + &amp;quot;Einbauanleitung_CAN-Bus_Interface&amp;quot;, wt: &amp;quot;Einbauanleitung CAN-Bus Interface&amp;quot; },&lt;br /&gt;
  kcan:    { t: &amp;quot;K-CAN App (Beta)&amp;quot;, d: &amp;quot;Pendant zur I-BUS App für Fahrzeuge mit K-CAN, aktuell als Betaversion.&amp;quot;,&lt;br /&gt;
             w: &amp;quot;https://wiki.kcan-app.de/&amp;quot;, wt: &amp;quot;Wiki zur K-CAN App&amp;quot; },&lt;br /&gt;
  kcanlic: { t: &amp;quot;K-CAN App - Lizenz Betaversion&amp;quot;, d: &amp;quot;Beta-Lizenz für die K-CAN App.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/lizenzen/358/k-can-app-lizenz-betaversion&amp;quot; },&lt;br /&gt;
  tpms:    { t: &amp;quot;TPMS - Reifendruckkontrolle&amp;quot;, d: &amp;quot;&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/tpms/&amp;quot; },&lt;br /&gt;
  dab1:    { t: &amp;quot;DAB+ Empfänger inkl. Antenne (Single)&amp;quot;, d: &amp;quot;&amp;quot;, w: &amp;quot;https://xtrons.ibus-app.de/index.php?title=Installation_der_DAB%2B_Antenne&amp;quot;, wt: &amp;quot;Installation der DAB+ Antenne&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/dab/291/dab-empfaenger-inkl.-antenne-usbdab04&amp;quot; },&lt;br /&gt;
  dab2:    { t: &amp;quot;Dual DAB+ Empfänger-Stick inkl. 2 Antennen&amp;quot;, d: &amp;quot;&amp;quot;, w: &amp;quot;https://xtrons.ibus-app.de/index.php?title=Installation_der_DAB%2B_Antenne&amp;quot;, wt: &amp;quot;Installation der DAB+ Antenne&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/dab/391/dual-dab-empfaenger-stick-inkl.-2-antennen-acusbdab05t?c=75&amp;quot; },&lt;br /&gt;
  rcam:    { t: &amp;quot;Rückfahrkamera&amp;quot;, d: &amp;quot;&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/kameras/&amp;quot;, ut: &amp;quot;Kameras im Shop ansehen →&amp;quot; },&lt;br /&gt;
  fcam:    { t: &amp;quot;Front-Kamera&amp;quot;, d: &amp;quot;&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/kameras/&amp;quot;, ut: &amp;quot;Kameras im Shop ansehen →&amp;quot; },&lt;br /&gt;
  tool:    { t: &amp;quot;Einbau-Werkzeug (Kunststoffheber)&amp;quot;, d: &amp;quot;Zum schonenden Lösen der Verkleidungen.&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/einbauwerkzeug/&amp;quot; }&lt;br /&gt;
};&lt;br /&gt;
/* ---- 5) Regeln --------------------------------------------------------------&lt;br /&gt;
   type: need (Das brauchst Du) oder hint (Hinweise)   when = Bedingung auf die Felder&lt;br /&gt;
   opts = diese Zusatzoptionen müssen gewählt sein      items = Artikel   html = Text&lt;br /&gt;
   Abgeleitete Werte: gen (alt/b/c) und module (ja/nein/unk = Radiomodul im Kofferraum, nur gen alt) */&lt;br /&gt;
var RULES = [&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { current: [&amp;quot;werk&amp;quot;], module: [&amp;quot;ja&amp;quot;] }, items: [&amp;quot;exl005&amp;quot;, &amp;quot;fakra6m&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { current: [&amp;quot;nach&amp;quot;], module: [&amp;quot;ja&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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=&amp;quot; + P.noquad + &amp;quot;][img=&amp;quot; + P.noexl6 + &amp;quot;]&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;ja&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;nein&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;unk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { ant: [&amp;quot;iso&amp;quot;] }, items: [&amp;quot;isoada&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { ant: [&amp;quot;unk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Antennenstecker:[/b] [b]BM24[/b] (Rundpin) = ISO-Antennenstecker, ggf. wird der [a=&amp;quot; + SHOP + &amp;quot;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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { sound: [&amp;quot;dsp&amp;quot;] }, items: [&amp;quot;bcdsp&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { sound: [&amp;quot;dsp&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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=&amp;quot; + WIKI + &amp;quot;Habe_ich_DSP%3F]Habe ich DSP?[/a]&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { sound: [&amp;quot;hk&amp;quot;], gen: [&amp;quot;alt&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Harman Kardon:[/b] Benötigt [b]keine[/b] DSP-Lizenz. Das Remote-Signal (+12 V, wenn Radio an) genügt zum Starten.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { aux: [&amp;quot;nein&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]AUX-IN:[/b] Der AUX-IN muss codiert werden. Optional kann ein FM-Transmitter genutzt werden - das ist nicht empfohlen.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;7er-e38&amp;quot;, &amp;quot;x5-e53&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Montage:[/b] Radios für BMW E38/E53 benötigen keine extra Halterungen.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;5er-e39&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;3er-e46&amp;quot;], factory: [&amp;quot;iris&amp;quot;, &amp;quot;mid&amp;quot;, &amp;quot;pfeil&amp;quot;], current: [&amp;quot;werk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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]&amp;quot; +&lt;br /&gt;
          &amp;quot;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]&amp;quot; +&lt;br /&gt;
          &amp;quot;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=&amp;quot; + P.funktr + &amp;quot;]&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { factory: [&amp;quot;cic&amp;quot;, &amp;quot;nbt&amp;quot;, &amp;quot;nbtevo&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Lichtleiter:[/b] Ggf. vorhandene Lichtleiter (MOST) müssen aus dem BMW-Stecker in den Xtrons-Adapter umgesteckt werden.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { factory: [&amp;quot;mask&amp;quot;, &amp;quot;ccc&amp;quot;, &amp;quot;cic&amp;quot;, &amp;quot;nbt&amp;quot;, &amp;quot;nbtevo&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, opts: [&amp;quot;kcan&amp;quot;], when: {},&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, opts: [&amp;quot;ibus&amp;quot;], when: {},&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: {},&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot; }&lt;br /&gt;
];&lt;br /&gt;
/* =====================================================================&lt;br /&gt;
   PROGRAMMLOGIK&lt;br /&gt;
   ===================================================================== */&lt;br /&gt;
var $ = function (id) { return document.getElementById(id); };&lt;br /&gt;
var sel = {}, picked = {}, summary = &amp;quot;&amp;quot;, capA = 0, capB = 0;&lt;br /&gt;
var fieldsEl = $(&amp;quot;nvk-fields&amp;quot;), optsEl = $(&amp;quot;nvk-opts&amp;quot;), outEl = $(&amp;quot;nvk-out&amp;quot;);&lt;br /&gt;
function full(u) { return u.indexOf(&amp;quot;/thumb/&amp;quot;) === -1 ? u : u.replace(&amp;quot;/thumb/&amp;quot;, &amp;quot;/&amp;quot;).replace(/\/[^\/]+$/, &amp;quot;&amp;quot;); }&lt;br /&gt;
function fmt(t) {&lt;br /&gt;
  return t.replace(/\[imgw=([^\x5D]+)\]/g, function (m, u) {&lt;br /&gt;
    return &amp;quot;\u003Ca href=\&amp;quot;&amp;quot; + full(u) + &amp;quot;\&amp;quot; target=\&amp;quot;_blank\&amp;quot; rel=\&amp;quot;noopener\&amp;quot;\u003E\u003Cimg class=\&amp;quot;nvk-img wide\&amp;quot; src=\&amp;quot;&amp;quot; + u + &amp;quot;\&amp;quot; alt=\&amp;quot;\&amp;quot;\u003E\u003C/a\u003E&amp;quot;;&lt;br /&gt;
  }).replace(/\[img=([^\x5D]+)\]/g, function (m, u) {&lt;br /&gt;
    return &amp;quot;\u003Ca href=\&amp;quot;&amp;quot; + full(u) + &amp;quot;\&amp;quot; target=\&amp;quot;_blank\&amp;quot; rel=\&amp;quot;noopener\&amp;quot;\u003E\u003Cimg class=\&amp;quot;nvk-img\&amp;quot; src=\&amp;quot;&amp;quot; + u + &amp;quot;\&amp;quot; alt=\&amp;quot;\&amp;quot;\u003E\u003C/a\u003E&amp;quot;;&lt;br /&gt;
  }).replace(/\[b\]/g, &amp;quot;\u003Cb\u003E&amp;quot;).replace(/\[\/b\]/g, &amp;quot;\u003C/b\u003E&amp;quot;).replace(/\[br\]/g, &amp;quot;\u003Cbr\u003E&amp;quot;)&lt;br /&gt;
    .replace(/\[a=([^\x5D]+)\]/g, &amp;quot;\u003Ca href=\&amp;quot;$1\&amp;quot; target=\&amp;quot;_blank\&amp;quot; rel=\&amp;quot;noopener\&amp;quot;\u003E&amp;quot;).replace(/\[\/a\]/g, &amp;quot;\u003C/a\u003E&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
function match(cond, s, lenient) {&lt;br /&gt;
  if (!cond) return true;&lt;br /&gt;
  for (var k in cond) {&lt;br /&gt;
    if (!s[k]) { if (lenient) continue; return false; }&lt;br /&gt;
    if (cond[k].indexOf(s[k]) === -1) return false;&lt;br /&gt;
  }&lt;br /&gt;
  return true;&lt;br /&gt;
}&lt;br /&gt;
function vehicleOf(id) { return VEHICLES.filter(function (x) { return x.v === id; })[0]; }&lt;br /&gt;
function derive() {&lt;br /&gt;
  var s = {}, k;&lt;br /&gt;
  for (k in sel) s[k] = sel[k];&lt;br /&gt;
  var veh = vehicleOf(sel.vehicle);&lt;br /&gt;
  if (veh) s.gen = veh.gen;&lt;br /&gt;
  if (s.gen === &amp;quot;alt&amp;quot;) {&lt;br /&gt;
    if (s.factory === &amp;quot;n43&amp;quot; || s.factory === &amp;quot;n169&amp;quot;) s.module = &amp;quot;ja&amp;quot;;&lt;br /&gt;
    else if (s.factory === &amp;quot;iris&amp;quot; || s.factory === &amp;quot;mid&amp;quot;) s.module = &amp;quot;nein&amp;quot;;&lt;br /&gt;
    else if (s.factory === &amp;quot;pfeil&amp;quot;) s.module = s.trunk || &amp;quot;unk&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  return s;&lt;br /&gt;
}&lt;br /&gt;
function forced(s) {&lt;br /&gt;
  var f = {};&lt;br /&gt;
  FORCED.forEach(function (r) { if (match(r.when, s)) r.opts.forEach(function (o) { f[o] = r.why; }); });&lt;br /&gt;
  return f;&lt;br /&gt;
}&lt;br /&gt;
function onSet(s) {&lt;br /&gt;
  var f = forced(s), on = {}, k;&lt;br /&gt;
  for (k in picked) if (picked[k]) on[k] = true;&lt;br /&gt;
  for (k in f) on[k] = true;&lt;br /&gt;
  return { on: on, forced: f };&lt;br /&gt;
}&lt;br /&gt;
function optVisible(o, s, on) {&lt;br /&gt;
  if (!match(o.show, s, true)) return false;&lt;br /&gt;
  return (o.requires || []).every(function (r) { return on[r]; });&lt;br /&gt;
}&lt;br /&gt;
FIELDS.forEach(function (f) {&lt;br /&gt;
  var wrap = document.createElement(&amp;quot;div&amp;quot;); wrap.className = &amp;quot;nvk-f&amp;quot;; wrap.id = &amp;quot;nvk-w-&amp;quot; + f.id;&lt;br /&gt;
  var lab = document.createElement(&amp;quot;label&amp;quot;); lab.htmlFor = &amp;quot;nvk-&amp;quot; + f.id; lab.textContent = f.label;&lt;br /&gt;
  var s = document.createElement(&amp;quot;select&amp;quot;); s.id = &amp;quot;nvk-&amp;quot; + f.id;&lt;br /&gt;
  s.addEventListener(&amp;quot;change&amp;quot;, function () { sel[f.id] = s.value; update(); });&lt;br /&gt;
  wrap.appendChild(lab); wrap.appendChild(s);&lt;br /&gt;
  if (f.help) { var h = document.createElement(&amp;quot;div&amp;quot;); h.className = &amp;quot;nvk-help&amp;quot;; h.innerHTML = fmt(f.help); wrap.appendChild(h); }&lt;br /&gt;
  var inf = document.createElement(&amp;quot;div&amp;quot;); inf.id = &amp;quot;nvk-i-&amp;quot; + f.id; wrap.appendChild(inf);&lt;br /&gt;
  fieldsEl.appendChild(wrap);&lt;br /&gt;
});&lt;br /&gt;
function renderFields() {&lt;br /&gt;
  FIELDS.forEach(function (f) {&lt;br /&gt;
    var s = derive();&lt;br /&gt;
    var wrap = $(&amp;quot;nvk-w-&amp;quot; + f.id), el = $(&amp;quot;nvk-&amp;quot; + f.id);&lt;br /&gt;
    var vis = f.show ? match(f.show, s, false) : true;&lt;br /&gt;
    wrap.style.display = vis ? &amp;quot;&amp;quot; : &amp;quot;none&amp;quot;;&lt;br /&gt;
    if (!vis) { sel[f.id] = &amp;quot;&amp;quot;; return; }&lt;br /&gt;
    var allowed = f.values.filter(function (v) { return match(v.only, s, true); });&lt;br /&gt;
    if (sel[f.id]) { if (!allowed.some(function (v) { return v.v === sel[f.id]; })) sel[f.id] = &amp;quot;&amp;quot;; }&lt;br /&gt;
    if (!sel[f.id]) { if (f.def) sel[f.id] = f.def; }&lt;br /&gt;
    if (!sel[f.id]) { if (f.auto) { if (sel.vehicle) { if (allowed.length === 1) sel[f.id] = allowed[0].v; } } }&lt;br /&gt;
    el.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
    if (!f.def) { var p = document.createElement(&amp;quot;option&amp;quot;); p.value = &amp;quot;&amp;quot;; p.textContent = &amp;quot;– bitte wählen –&amp;quot;; el.appendChild(p); }&lt;br /&gt;
    allowed.forEach(function (v) {&lt;br /&gt;
      var o = document.createElement(&amp;quot;option&amp;quot;); o.value = v.v; o.textContent = v.t; el.appendChild(o);&lt;br /&gt;
    });&lt;br /&gt;
    el.value = sel[f.id] || &amp;quot;&amp;quot;;&lt;br /&gt;
    var cur = allowed.filter(function (v) { return v.v === sel[f.id]; })[0];&lt;br /&gt;
    var pre = f.pre ? (match(f.pre.when, s, false) ? fmt(f.pre.html) : &amp;quot;&amp;quot;) : &amp;quot;&amp;quot;;&lt;br /&gt;
    $(&amp;quot;nvk-i-&amp;quot; + f.id).innerHTML = pre + (cur ? (cur.info ? fmt(cur.info) : &amp;quot;&amp;quot;) : &amp;quot;&amp;quot;);&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
function renderOpts() {&lt;br /&gt;
  var s = derive(), st = onSet(s);&lt;br /&gt;
  OPTS.forEach(function (o) { if (!optVisible(o, s, st.on)) picked[o.id] = false; });&lt;br /&gt;
  st = onSet(s);&lt;br /&gt;
  optsEl.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
  OPTS.forEach(function (o) {&lt;br /&gt;
    if (!optVisible(o, s, st.on)) return;&lt;br /&gt;
    var lab = document.createElement(&amp;quot;label&amp;quot;); lab.className = &amp;quot;nvk-o&amp;quot;;&lt;br /&gt;
    var cb = document.createElement(&amp;quot;input&amp;quot;); cb.type = &amp;quot;checkbox&amp;quot;;&lt;br /&gt;
    cb.checked = !!st.on[o.id];&lt;br /&gt;
    var isForced = !!st.forced[o.id];&lt;br /&gt;
    if (isForced) { cb.disabled = true; lab.className += &amp;quot; dis&amp;quot;; }&lt;br /&gt;
    cb.addEventListener(&amp;quot;change&amp;quot;, function () {&lt;br /&gt;
      picked[o.id] = cb.checked;&lt;br /&gt;
      if (cb.checked) { if (o.excl) OPTS.forEach(function (x) { if (x.excl === o.excl) { if (x.id !== o.id) picked[x.id] = false; } }); }&lt;br /&gt;
      update();&lt;br /&gt;
    });&lt;br /&gt;
    lab.appendChild(cb);&lt;br /&gt;
    lab.appendChild(document.createTextNode(&amp;quot; &amp;quot; + o.t));&lt;br /&gt;
    var sub = [o.sub, isForced ? st.forced[o.id] : &amp;quot;&amp;quot;].filter(Boolean).join(&amp;quot; - &amp;quot;);&lt;br /&gt;
    if (sub) { var sm = document.createElement(&amp;quot;small&amp;quot;); sm.textContent = &amp;quot; (&amp;quot; + sub + &amp;quot;)&amp;quot;; lab.appendChild(sm); }&lt;br /&gt;
    optsEl.appendChild(lab);&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
function link(url, text) {&lt;br /&gt;
  var a = document.createElement(&amp;quot;a&amp;quot;); a.href = url; a.target = &amp;quot;_blank&amp;quot;; a.rel = &amp;quot;noopener&amp;quot;; a.textContent = text; return a;&lt;br /&gt;
}&lt;br /&gt;
function card(item, cls) {&lt;br /&gt;
  var d = document.createElement(&amp;quot;div&amp;quot;); d.className = &amp;quot;nvk-card &amp;quot; + (cls || &amp;quot;&amp;quot;) + (item.hl ? &amp;quot; hl&amp;quot; : &amp;quot;&amp;quot;);&lt;br /&gt;
  var b = document.createElement(&amp;quot;b&amp;quot;); b.textContent = item.t; d.appendChild(b);&lt;br /&gt;
  if (item.d) { var p = document.createElement(&amp;quot;span&amp;quot;); p.textContent = item.d; d.appendChild(p); }&lt;br /&gt;
  if (item.img) {&lt;br /&gt;
    var im = document.createElement(&amp;quot;div&amp;quot;);&lt;br /&gt;
    item.img.forEach(function (u) {&lt;br /&gt;
      var a = document.createElement(&amp;quot;a&amp;quot;); a.href = full(u); a.target = &amp;quot;_blank&amp;quot;; a.rel = &amp;quot;noopener&amp;quot;;&lt;br /&gt;
      var g = document.createElement(&amp;quot;img&amp;quot;); g.className = &amp;quot;nvk-img&amp;quot;; g.src = u; g.alt = item.t; a.appendChild(g); im.appendChild(a);&lt;br /&gt;
    });&lt;br /&gt;
    d.appendChild(im);&lt;br /&gt;
  }&lt;br /&gt;
  if (item.u || item.w) {&lt;br /&gt;
    var l = document.createElement(&amp;quot;div&amp;quot;); l.className = &amp;quot;nvk-links&amp;quot;;&lt;br /&gt;
    if (item.u) l.appendChild(link(item.u, item.ut || &amp;quot;Im Shop ansehen →&amp;quot;));&lt;br /&gt;
    if (item.w) l.appendChild(link(item.w, (item.wt || &amp;quot;Zum Wiki&amp;quot;) + &amp;quot; →&amp;quot;));&lt;br /&gt;
    d.appendChild(l);&lt;br /&gt;
  }&lt;br /&gt;
  if (item.links) item.links.forEach(function (x) {&lt;br /&gt;
    var r = document.createElement(&amp;quot;div&amp;quot;); r.className = &amp;quot;nvk-links&amp;quot;; r.appendChild(link(x.u, x.t + &amp;quot; →&amp;quot;)); d.appendChild(r);&lt;br /&gt;
  });&lt;br /&gt;
  return d;&lt;br /&gt;
}&lt;br /&gt;
function heading(txt) { var h = document.createElement(&amp;quot;h3&amp;quot;); h.textContent = txt; outEl.appendChild(h); }&lt;br /&gt;
function renderResult() {&lt;br /&gt;
  var s = derive(), st = onSet(s);&lt;br /&gt;
  var missing = FIELDS.filter(function (f) {&lt;br /&gt;
    var w = $(&amp;quot;nvk-w-&amp;quot; + f.id);&lt;br /&gt;
    return w.style.display !== &amp;quot;none&amp;quot; ? (!f.optional ? !sel[f.id] : false) : false;&lt;br /&gt;
  });&lt;br /&gt;
  outEl.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
  if (missing.length) {&lt;br /&gt;
    var m = document.createElement(&amp;quot;p&amp;quot;); m.className = &amp;quot;nvk-miss&amp;quot;;&lt;br /&gt;
    m.textContent = &amp;quot;Bitte noch auswählen: &amp;quot; + missing.map(function (f) { return f.label; }).join(&amp;quot;, &amp;quot;);&lt;br /&gt;
    outEl.appendChild(m); $(&amp;quot;nvk-form&amp;quot;).style.display = &amp;quot;none&amp;quot;; return;&lt;br /&gt;
  }&lt;br /&gt;
  $(&amp;quot;nvk-form&amp;quot;).style.display = &amp;quot;&amp;quot;;&lt;br /&gt;
  var veh = vehicleOf(sel.vehicle);&lt;br /&gt;
  var ru = veh.noCat ? SHOP + &amp;quot;bmw-radios/&amp;quot; : SHOP + &amp;quot;bmw-radios/&amp;quot; + veh.v + &amp;quot;/&amp;quot;;&lt;br /&gt;
  heading(&amp;quot;Passende Radios&amp;quot;);&lt;br /&gt;
  outEl.appendChild(card({ t: &amp;quot;BMW Radios für &amp;quot; + veh.t, d: &amp;quot;Alle Radios, die für Deinen BMW &amp;quot; + veh.t + &amp;quot; im Shop erhältlich sind.&amp;quot;,&lt;br /&gt;
    u: ru, ut: &amp;quot;Zu den passenden Radios →&amp;quot;, w: SHOP + &amp;quot;bmw-radios/&amp;quot;, wt: &amp;quot;Alle BMW Radios&amp;quot; }, &amp;quot;rad&amp;quot;));&lt;br /&gt;
  var needs = [], hints = [], seen = {};&lt;br /&gt;
  RULES.forEach(function (r) {&lt;br /&gt;
    if (!match(r.when, s)) return;&lt;br /&gt;
    if (r.opts) { if (!r.opts.every(function (o) { return st.on[o]; })) return; }&lt;br /&gt;
    if (r.type === &amp;quot;need&amp;quot;) (r.items || []).forEach(function (id) { if (!seen[id]) { seen[id] = 1; needs.push(ITEMS[id]); } });&lt;br /&gt;
    else hints.push(r.html);&lt;br /&gt;
  });&lt;br /&gt;
  heading(&amp;quot;Das brauchst Du&amp;quot;);&lt;br /&gt;
  if (needs.length) needs.forEach(function (i) { outEl.appendChild(card(i)); });&lt;br /&gt;
  else { var n = document.createElement(&amp;quot;p&amp;quot;); n.textContent = &amp;quot;Für die Grundinstallation sind keine zusätzlichen Verlängerungen oder Adapter nötig.&amp;quot;; outEl.appendChild(n); }&lt;br /&gt;
  var opt = [];&lt;br /&gt;
  OPTS.forEach(function (o) {&lt;br /&gt;
    if (!st.on[o.id]) return;&lt;br /&gt;
    if (!optVisible(o, s, st.on)) return;&lt;br /&gt;
    o.items.forEach(function (id) {&lt;br /&gt;
      if (seen[id]) return;&lt;br /&gt;
      var sk = ITEMS[id].skipIf;&lt;br /&gt;
      if (sk) { if (seen[sk]) return; }&lt;br /&gt;
      seen[id] = 1; opt.push(ITEMS[id]);&lt;br /&gt;
    });&lt;br /&gt;
  });&lt;br /&gt;
  if (opt.length) { heading(&amp;quot;Deine Zusatzoptionen&amp;quot;); opt.forEach(function (i) { outEl.appendChild(card(i, &amp;quot;opt&amp;quot;)); }); }&lt;br /&gt;
  if (hints.length) {&lt;br /&gt;
    heading(&amp;quot;Hinweise&amp;quot;);&lt;br /&gt;
    hints.forEach(function (t) { var d = document.createElement(&amp;quot;div&amp;quot;); d.className = &amp;quot;nvk-note&amp;quot;; d.innerHTML = fmt(t); outEl.appendChild(d); });&lt;br /&gt;
  }&lt;br /&gt;
  var L = [&amp;quot;KONFIGURATION&amp;quot;];&lt;br /&gt;
  FIELDS.forEach(function (f) {&lt;br /&gt;
    if (!sel[f.id]) return;&lt;br /&gt;
    var v = f.values.filter(function (x) { return x.v === sel[f.id]; })[0];&lt;br /&gt;
    if (v) L.push(&amp;quot;- &amp;quot; + f.label + &amp;quot;: &amp;quot; + v.t);&lt;br /&gt;
  });&lt;br /&gt;
  L.push(&amp;quot;&amp;quot;, &amp;quot;BENÖTIGT&amp;quot;);&lt;br /&gt;
  needs.forEach(function (i) { L.push(&amp;quot;- &amp;quot; + i.t + (i.u ? &amp;quot;  &amp;quot; + i.u : &amp;quot;&amp;quot;)); });&lt;br /&gt;
  if (opt.length) { L.push(&amp;quot;&amp;quot;, &amp;quot;ZUSATZOPTIONEN&amp;quot;); opt.forEach(function (i) { L.push(&amp;quot;- &amp;quot; + i.t + (i.u ? &amp;quot;  &amp;quot; + i.u : &amp;quot;&amp;quot;)); }); }&lt;br /&gt;
  L.push(&amp;quot;&amp;quot;, &amp;quot;Radios: &amp;quot; + ru);&lt;br /&gt;
  summary = L.join(&amp;quot;\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
function update() { renderFields(); renderOpts(); renderResult(); }&lt;br /&gt;
function newCaptcha() {&lt;br /&gt;
  capA = 1 + Math.floor(Math.random() * 9); capB = 1 + Math.floor(Math.random() * 9);&lt;br /&gt;
  $(&amp;quot;nvk-capq&amp;quot;).textContent = &amp;quot;Sicherheitsfrage: Was ist &amp;quot; + capA + &amp;quot; + &amp;quot; + capB + &amp;quot;? *&amp;quot;; $(&amp;quot;nvk-cap&amp;quot;).value = &amp;quot;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
function status(msg, ok) { var e = $(&amp;quot;nvk-status&amp;quot;); e.style.display = &amp;quot;&amp;quot;; e.textContent = msg; e.style.borderLeftColor = ok ? &amp;quot;#14866d&amp;quot; : &amp;quot;#d33&amp;quot;; }&lt;br /&gt;
$(&amp;quot;nvk-send&amp;quot;).addEventListener(&amp;quot;click&amp;quot;, function () {&lt;br /&gt;
  var name = $(&amp;quot;nvk-name&amp;quot;).value.trim(), mail = $(&amp;quot;nvk-mail&amp;quot;).value.trim(), vin = $(&amp;quot;nvk-vin&amp;quot;).value.trim().toUpperCase(), msg = $(&amp;quot;nvk-msg&amp;quot;).value.trim();&lt;br /&gt;
  if (!name || !mail || !msg) return status(&amp;quot;Bitte Name, E-Mail und Kommentar ausfüllen.&amp;quot;, false);&lt;br /&gt;
  if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(mail)) return status(&amp;quot;Bitte eine gültige E-Mail-Adresse eingeben.&amp;quot;, false);&lt;br /&gt;
  if (vin) { if (!/^[A-Z]{2}[0-9]{5}$/.test(vin)) { if (!/^[A-HJ-NPR-Z0-9]{17}$/.test(vin)) return status(&amp;quot;Bitte die VIN im Format AB12345 oder die 17-stellige FGN eingeben - oder das Feld leer lassen.&amp;quot;, false); } }&lt;br /&gt;
  if (parseInt($(&amp;quot;nvk-cap&amp;quot;).value, 10) !== capA + capB) return status(&amp;quot;Die Sicherheitsfrage wurde nicht richtig beantwortet.&amp;quot;, false);&lt;br /&gt;
  if (!$(&amp;quot;nvk-dsgvo&amp;quot;).checked) return status(&amp;quot;Bitte der Verarbeitung Deiner Daten zustimmen.&amp;quot;, false);&lt;br /&gt;
  if ($(&amp;quot;nvk-hp&amp;quot;).value) return;&lt;br /&gt;
  var sz = $(&amp;quot;nvk-size&amp;quot;).value;&lt;br /&gt;
  var sum2 = summary + (sz ? &amp;quot;\n\nGewünschte Displaygröße: &amp;quot; + sz : &amp;quot;&amp;quot;);&lt;br /&gt;
  var text = &amp;quot;Name: &amp;quot; + name + &amp;quot;\nE-Mail: &amp;quot; + mail + &amp;quot;\nVIN: &amp;quot; + (vin || &amp;quot;-&amp;quot;) + &amp;quot;\n\nKommentar:\n&amp;quot; + msg + &amp;quot;\n\n&amp;quot; + sum2;&lt;br /&gt;
  if (SEND_URL) {&lt;br /&gt;
    var p = new URLSearchParams();&lt;br /&gt;
    p.append(&amp;quot;name&amp;quot;, name); p.append(&amp;quot;mail&amp;quot;, mail); p.append(&amp;quot;vin&amp;quot;, vin); p.append(&amp;quot;msg&amp;quot;, msg); p.append(&amp;quot;summary&amp;quot;, sum2);&lt;br /&gt;
    p.append(&amp;quot;hp&amp;quot;, $(&amp;quot;nvk-hp&amp;quot;).value); p.append(&amp;quot;ca&amp;quot;, capA); p.append(&amp;quot;cb&amp;quot;, capB); p.append(&amp;quot;cv&amp;quot;, $(&amp;quot;nvk-cap&amp;quot;).value);&lt;br /&gt;
    fetch(SEND_URL, { method: &amp;quot;POST&amp;quot;, body: p }).then(function (r) {&lt;br /&gt;
      if (!r.ok) throw new Error(&amp;quot;send&amp;quot;);&lt;br /&gt;
      status(&amp;quot;Danke! Deine Anfrage wurde gesendet, eine Kopie geht an &amp;quot; + mail + &amp;quot;.&amp;quot;, true); newCaptcha();&lt;br /&gt;
    }).catch(function () { status(&amp;quot;Das Senden hat nicht geklappt. Bitte versuche es später noch einmal oder schreibe direkt an &amp;quot; + MAIL_TO + &amp;quot;.&amp;quot;, false); });&lt;br /&gt;
  } else {&lt;br /&gt;
    var AMP = &amp;quot;\u0026&amp;quot;;&lt;br /&gt;
    window.location.href = &amp;quot;mailto:&amp;quot; + MAIL_TO + &amp;quot;?cc=&amp;quot; + encodeURIComponent(mail) + AMP + &amp;quot;subject=&amp;quot; + encodeURIComponent(MAIL_SUBJECT) + AMP + &amp;quot;body=&amp;quot; + encodeURIComponent(text);&lt;br /&gt;
    status(&amp;quot;Dein E-Mail-Programm wurde mit der fertigen Anfrage geöffnet. Bitte dort noch auf Senden klicken.&amp;quot;, true);&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
$(&amp;quot;nvk-reset&amp;quot;).addEventListener(&amp;quot;click&amp;quot;, function () { sel = {}; picked = {}; update(); });&lt;br /&gt;
newCaptcha();&lt;br /&gt;
update();&lt;br /&gt;
})();&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andre</name></author>
	</entry>
	<entry>
		<id>https://xtrons.ibus-app.de/index.php?title=Android_Radio_Konfigurator&amp;diff=4081</id>
		<title>Android Radio Konfigurator</title>
		<link rel="alternate" type="text/html" href="https://xtrons.ibus-app.de/index.php?title=Android_Radio_Konfigurator&amp;diff=4081"/>
		<updated>2026-10-21T12:20:56Z</updated>

		<summary type="html">&lt;p&gt;Andre: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;html&amp;gt;&amp;lt;div id=&amp;quot;nvk&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
#nvk{max-width:900px;line-height:1.45}&lt;br /&gt;
#nvk *{box-sizing:border-box}&lt;br /&gt;
#nvk .nvk-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:14px;margin:12px 0}&lt;br /&gt;
#nvk .nvk-f label{display:block;font-weight:700;margin-bottom:4px}&lt;br /&gt;
#nvk select{width:100%;padding:9px 8px;font:inherit;color:#202122;background:#fff;border:1px solid #a2a9b1;border-radius:4px}&lt;br /&gt;
#nvk .nvk-help{font-size:.85em;opacity:.75;margin-top:3px}&lt;br /&gt;
#nvk fieldset{border:1px solid rgba(128,128,128,.45);border-radius:6px;padding:10px 14px;margin:14px 0}&lt;br /&gt;
#nvk legend{font-weight:700;padding:0 6px}&lt;br /&gt;
#nvk .nvk-o{display:block;padding:4px 0;cursor:pointer}&lt;br /&gt;
#nvk .nvk-o small{opacity:.7}&lt;br /&gt;
#nvk .nvk-o.dis{opacity:.75;cursor:default}&lt;br /&gt;
#nvk .nvk-btn{padding:7px 14px;font:inherit;border:1px solid #a2a9b1;border-radius:4px;background:#f8f9fa;color:#202122;cursor:pointer}&lt;br /&gt;
#nvk #nvk-out{margin-top:18px}&lt;br /&gt;
#nvk h3{margin:18px 0 8px}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-card.opt{border-left-color:#14866d}&lt;br /&gt;
#nvk .nvk-card.rad{border-left-color:#fff;background:rgba(255,255,255,.08)}&lt;br /&gt;
#nvk .nvk-card b{display:block}&lt;br /&gt;
#nvk .nvk-links{margin-top:4px;font-weight:600}&lt;br /&gt;
#nvk .nvk-links a{margin-right:14px}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-miss{opacity:.8;font-style:italic}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-card .nvk-img{max-width:230px;max-height:150px}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-img.wide{max-width:min(100%,460px);max-height:none}&lt;br /&gt;
#nvk #nvk-form{margin-top:22px}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-grid&amp;quot; id=&amp;quot;nvk-fields&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;fieldset id=&amp;quot;nvk-optset&amp;quot;&amp;gt;&amp;lt;legend&amp;gt;Zusatzoptionen&amp;lt;/legend&amp;gt;&amp;lt;div id=&amp;quot;nvk-opts&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/fieldset&amp;gt;&lt;br /&gt;
&amp;lt;button type=&amp;quot;button&amp;quot; class=&amp;quot;nvk-btn&amp;quot; id=&amp;quot;nvk-reset&amp;quot;&amp;gt;Auswahl zurücksetzen&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk-out&amp;quot; aria-live=&amp;quot;polite&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;fieldset id=&amp;quot;nvk-form&amp;quot; style=&amp;quot;display:none&amp;quot;&amp;gt;&amp;lt;legend&amp;gt;Anfrage senden&amp;lt;/legend&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;nvk-help&amp;quot;&amp;gt;Deine Auswahl und die Liste oben werden automatisch mitgesendet. Alle Felder mit * sind Pflicht.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-grid&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-name&amp;quot;&amp;gt;Name *&amp;lt;/label&amp;gt;&amp;lt;input id=&amp;quot;nvk-name&amp;quot; type=&amp;quot;text&amp;quot; autocomplete=&amp;quot;name&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-mail&amp;quot;&amp;gt;E-Mail *&amp;lt;/label&amp;gt;&amp;lt;input id=&amp;quot;nvk-mail&amp;quot; type=&amp;quot;email&amp;quot; autocomplete=&amp;quot;email&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-size&amp;quot;&amp;gt;Gewünschte Displaygröße (optional)&amp;lt;/label&amp;gt;&amp;lt;select id=&amp;quot;nvk-size&amp;quot;&amp;gt;&amp;lt;option value=&amp;quot;&amp;quot;&amp;gt;Keine Angabe / Beratung gewünscht&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;7&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;8.8&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;9&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;10.25&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;12.3&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;14.9&amp;quot;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;Andere Größe (bitte im Kommentar nennen)&amp;lt;/option&amp;gt;&amp;lt;/select&amp;gt;&amp;lt;div class=&amp;quot;nvk-help&amp;quot;&amp;gt;Diagonale in Zoll. Nicht jede Größe gibt es für jede Baureihe, das prüfen wir für Dich.&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-vin&amp;quot;&amp;gt;VIN oder FGN (optional)&amp;lt;/label&amp;gt;&amp;lt;input id=&amp;quot;nvk-vin&amp;quot; type=&amp;quot;text&amp;quot; maxlength=&amp;quot;17&amp;quot; placeholder=&amp;quot;AB12345 oder 17-stellige FGN&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-msg&amp;quot;&amp;gt;Kommentar *&amp;lt;/label&amp;gt;&amp;lt;textarea id=&amp;quot;nvk-msg&amp;quot; rows=&amp;quot;4&amp;quot;&amp;gt;&amp;lt;/textarea&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot; style=&amp;quot;max-width:300px&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-cap&amp;quot; id=&amp;quot;nvk-capq&amp;quot;&amp;gt;Sicherheitsfrage *&amp;lt;/label&amp;gt;&amp;lt;input id=&amp;quot;nvk-cap&amp;quot; type=&amp;quot;text&amp;quot; inputmode=&amp;quot;numeric&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;input id=&amp;quot;nvk-hp&amp;quot; type=&amp;quot;text&amp;quot; tabindex=&amp;quot;-1&amp;quot; autocomplete=&amp;quot;off&amp;quot; aria-hidden=&amp;quot;true&amp;quot; style=&amp;quot;position:absolute;left:-9999px;width:1px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;label class=&amp;quot;nvk-o&amp;quot;&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; id=&amp;quot;nvk-dsgvo&amp;quot;&amp;gt; Ich stimme zu, dass meine Angaben zur Bearbeitung der Anfrage per E-Mail verarbeitet werden. *&amp;lt;/label&amp;gt;&lt;br /&gt;
&amp;lt;button type=&amp;quot;button&amp;quot; class=&amp;quot;nvk-btn&amp;quot; id=&amp;quot;nvk-send&amp;quot;&amp;gt;Anfrage senden&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk-status&amp;quot; class=&amp;quot;nvk-note&amp;quot; style=&amp;quot;display:none&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/fieldset&amp;gt;&lt;br /&gt;
&amp;lt;noscript&amp;gt;Für den Konfigurator wird JavaScript benötigt.&amp;lt;/noscript&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
(function () {&lt;br /&gt;
&amp;quot;use strict&amp;quot;;&lt;br /&gt;
/* =====================================================================&lt;br /&gt;
   KONFIGURATION - hier wird gepflegt.&lt;br /&gt;
   Textformat in Hinweisen: [b]fett[/b]  [br] Zeilenumbruch  [a=URL]Linktext[/a]&lt;br /&gt;
   Bitte im Skript KEIN kaufmännisches Und, kein Kleiner-/Größer-Zeichen&lt;br /&gt;
   und keine Leerzeilen verwenden (das Wiki wandelt sie um).&lt;br /&gt;
   ===================================================================== */&lt;br /&gt;
var SHOP = &amp;quot;https://shop.ibus-app.de/&amp;quot;;&lt;br /&gt;
var WIKI = &amp;quot;https://wiki.ibus-app.de/index.php?title=&amp;quot;;&lt;br /&gt;
/* Bilder aus dem Wiki (Thumbnail-Adressen; Klick öffnet automatisch das Originalbild) */&lt;br /&gt;
var IM = &amp;quot;https://xtrons.ibus-app.de/images/thumb/&amp;quot;;&lt;br /&gt;
var P = {&lt;br /&gt;
  schema:  IM + &amp;quot;e/ea/BMW_E39_Verl%C3%A4ngerungen_EXL005%2BFAKRA_.png/135px-BMW_E39_Verl%C3%A4ngerungen_EXL005%2BFAKRA_.png&amp;quot;,&lt;br /&gt;
  exl005:  IM + &amp;quot;7/70/Exl005-1.webp/257px-Exl005-1.webp.png&amp;quot;,&lt;br /&gt;
  fakra6m: IM + &amp;quot;d/d8/FM-extension_01_1.png/270px-FM-extension_01_1.png&amp;quot;,&lt;br /&gt;
  isofakra: IM + &amp;quot;4/4e/ISO-FAKRA_1.png/270px-ISO-FAKRA_1.png&amp;quot;,&lt;br /&gt;
  bm24:    IM + &amp;quot;8/82/BM24.png/130px-BM24.png&amp;quot;,&lt;br /&gt;
  iso:     IM + &amp;quot;d/dd/Iso.jpg/69px-Iso.jpg&amp;quot;,&lt;br /&gt;
  bm54:    IM + &amp;quot;3/34/BM54.png/135px-BM54.png&amp;quot;,&lt;br /&gt;
  fakra:   IM + &amp;quot;b/b3/Fakra.jpg/100px-Fakra.jpg&amp;quot;,&lt;br /&gt;
  pfeil:   IM + &amp;quot;e/ee/Navi_E46.jpg/239px-Navi_E46.jpg&amp;quot;,&lt;br /&gt;
  noquad:  IM + &amp;quot;6/68/No_elongation.jpg/180px-No_elongation.jpg&amp;quot;,&lt;br /&gt;
  noexl6:  IM + &amp;quot;7/7b/No_EXL006.jpg/180px-No_EXL006.jpg&amp;quot;,&lt;br /&gt;
  halter:  IM + &amp;quot;3/3b/Halter_Alu.webp/92px-Halter_Alu.webp.png&amp;quot;,&lt;br /&gt;
  deepobd: &amp;quot;https://xtrons.ibus-app.de/images/d/d4/DeepOBD_Interface_1.png&amp;quot;,&lt;br /&gt;
  n43:     IM + &amp;quot;e/e4/Navi4_3.jpg/240px-Navi4_3.jpg&amp;quot;,&lt;br /&gt;
  n169:    IM + &amp;quot;8/8a/Navi16_9.jpg/240px-Navi16_9.jpg&amp;quot;,&lt;br /&gt;
  radio:   IM + &amp;quot;9/96/E39_Radio.jpg/240px-E39_Radio.jpg&amp;quot;,&lt;br /&gt;
  idrive:  &amp;quot;https://xtrons.ibus-app.de/images/0/02/MASK-CCC-CIC-NBT-EVO-iDrive.jpg&amp;quot;,&lt;br /&gt;
  iris:    &amp;quot;https://xtrons.ibus-app.de/images/b/be/BusinessKas_IRISG.jpg&amp;quot;,&lt;br /&gt;
  funktr:  IM + &amp;quot;7/7e/E46_Funktionstraeger.png/240px-E46_Funktionstraeger.png&amp;quot;&lt;br /&gt;
};&lt;br /&gt;
/* Anfrage-Formular: MAIL_TO = Empfänger. SEND_URL leer = E-Mail-Programm des Kunden öffnen (mailto).&lt;br /&gt;
   SEND_URL = Adresse des Server-Skripts send-anfrage.php = Versand direkt vom Server (mit CC an den Kunden). */&lt;br /&gt;
var MAIL_TO = &amp;quot;info@ibus-app.de&amp;quot;;&lt;br /&gt;
var MAIL_SUBJECT = &amp;quot;Anfrage aus Android Radio Konfigurator&amp;quot;;&lt;br /&gt;
var SEND_URL = &amp;quot;https://xtrons.ibus-app.de/send-anfrage.php&amp;quot;;&lt;br /&gt;
/* ---- 1) Baureihen --------------------------------------------------------&lt;br /&gt;
   v = Shop-Kategorie (Link: SHOP + bmw-radios/ + v + /)&lt;br /&gt;
   gen: alt = I-BUS-Fahrzeuge (E38/E39/E46/E53/E83)&lt;br /&gt;
        b   = M-ASK / CCC / CIC     c = CIC / NBT / NBT EVO&lt;br /&gt;
   body = Karosserieformen (siehe BODY)                                      */&lt;br /&gt;
var BODY = { limo: &amp;quot;Limousine&amp;quot;, touring: &amp;quot;Touring&amp;quot;, coupe: &amp;quot;Coupé&amp;quot;, cabrio: &amp;quot;Cabrio&amp;quot;, schraeg: &amp;quot;Schrägheck&amp;quot;,&lt;br /&gt;
  compact: &amp;quot;Compact&amp;quot;, gt: &amp;quot;Gran Turismo&amp;quot;, gc: &amp;quot;Gran Coupé&amp;quot;, suv: &amp;quot;SUV / SAV&amp;quot;, roadster: &amp;quot;Roadster&amp;quot; };&lt;br /&gt;
var VEHICLES = [&lt;br /&gt;
  { v: &amp;quot;1er-e8x&amp;quot;, t: &amp;quot;1er E8x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;schraeg,coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;1er-f2x&amp;quot;, t: &amp;quot;1er F2x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;schraeg&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;2er-f2x&amp;quot;, t: &amp;quot;2er F2x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;3er-e46&amp;quot;, t: &amp;quot;3er E46&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;limo,touring,coupe,cabrio,compact&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;3er-e9x&amp;quot;, t: &amp;quot;3er E9x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;limo,touring,coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;3er-f3x&amp;quot;, t: &amp;quot;3er F3x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;limo,touring,gt&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;4er-f3x&amp;quot;, t: &amp;quot;4er F3x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;coupe,cabrio,gc&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;5er-e39&amp;quot;, t: &amp;quot;5er E39&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;limo,touring&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;5er-e6x&amp;quot;, t: &amp;quot;5er E6x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;limo,touring&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;5er-f1x&amp;quot;, t: &amp;quot;5er F1x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;limo,touring,gt&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;6er-e6x&amp;quot;, t: &amp;quot;6er E6x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;7er-e38&amp;quot;, t: &amp;quot;7er E38&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;limo&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;7er-e65&amp;quot;, t: &amp;quot;7er E65&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;limo&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;7er-f01&amp;quot;, t: &amp;quot;7er F01&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;limo&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x1-e84&amp;quot;, t: &amp;quot;X1 E84&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x1-f48&amp;quot;, t: &amp;quot;X1 F48&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x3-e83&amp;quot;, t: &amp;quot;X3 E83&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x3-f25&amp;quot;, t: &amp;quot;X3 F25&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x5-e53&amp;quot;, t: &amp;quot;X5 E53&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x5-e70&amp;quot;, t: &amp;quot;X5 E70&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x5-f15&amp;quot;, t: &amp;quot;X5 F15&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x6-e71&amp;quot;, t: &amp;quot;X6 E71&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;z4-e85e86&amp;quot;, t: &amp;quot;Z4 E85/E86&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;roadster,coupe&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;z4-e89&amp;quot;, t: &amp;quot;Z4 E89&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;roadster&amp;quot;, noCat: true }&lt;br /&gt;
];&lt;br /&gt;
/* Fahrzeuge mit K-CAN App (Beta) */&lt;br /&gt;
var KCAN = [&amp;quot;1er-e8x&amp;quot;, &amp;quot;3er-e9x&amp;quot;, &amp;quot;5er-e6x&amp;quot;, &amp;quot;6er-e6x&amp;quot;, &amp;quot;7er-e65&amp;quot;, &amp;quot;x1-e84&amp;quot;, &amp;quot;x5-e70&amp;quot;, &amp;quot;x6-e71&amp;quot;, &amp;quot;z4-e89&amp;quot;];&lt;br /&gt;
var bodyValues = Object.keys(BODY).map(function (k) {&lt;br /&gt;
  return { v: k, t: BODY[k], only: { vehicle: VEHICLES.filter(function (x) { return x.body.split(&amp;quot;,&amp;quot;).indexOf(k) !== -1; }).map(function (x) { return x.v; }) } };&lt;br /&gt;
});&lt;br /&gt;
/* ---- 2) Auswahlfelder ------------------------------------------------------&lt;br /&gt;
   only = Wert nur anbieten, wenn Bedingung passt   show = Feld nur dann zeigen&lt;br /&gt;
   optional = muss nicht gewählt werden             auto = bei nur einem Wert vorwählen */&lt;br /&gt;
var FIELDS = [&lt;br /&gt;
  { id: &amp;quot;vehicle&amp;quot;, label: &amp;quot;Fahrzeug&amp;quot;, values: VEHICLES.map(function (x) { return { v: x.v, t: &amp;quot;BMW &amp;quot; + x.t }; }) },&lt;br /&gt;
  { id: &amp;quot;factory&amp;quot;, label: &amp;quot;Verbaut ab Werk&amp;quot;, pre: { when: { gen: [&amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;] }, html: &amp;quot;[b]So erkennst Du Dein System:[/b][br][imgw=&amp;quot; + P.idrive + &amp;quot;]&amp;quot; }, values: [&lt;br /&gt;
    { v: &amp;quot;iris&amp;quot;,  t: &amp;quot;Radio mit IRIS&amp;quot;, only: { vehicle: [&amp;quot;3er-e46&amp;quot;, &amp;quot;5er-e39&amp;quot;, &amp;quot;7er-e38&amp;quot;, &amp;quot;x5-e53&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.iris + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;mid&amp;quot;,   t: &amp;quot;Radio mit MID&amp;quot;,  only: { gen: [&amp;quot;alt&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.radio + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;n43&amp;quot;,   t: &amp;quot;4:3 Navi&amp;quot;,       only: { vehicle: [&amp;quot;5er-e39&amp;quot;, &amp;quot;7er-e38&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.n43 + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;n169&amp;quot;,  t: &amp;quot;16:9 Navi&amp;quot;,      only: { gen: [&amp;quot;alt&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.n169 + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;pfeil&amp;quot;, t: &amp;quot;Pfeilnavi&amp;quot;,      only: { vehicle: [&amp;quot;3er-e46&amp;quot;] }, info: &amp;quot;[img=&amp;quot; + P.pfeil + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;mask&amp;quot;,  t: &amp;quot;M-ASK&amp;quot;,          only: { gen: [&amp;quot;b&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;ccc&amp;quot;,   t: &amp;quot;CCC&amp;quot;,            only: { gen: [&amp;quot;b&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;cic&amp;quot;,   t: &amp;quot;CIC&amp;quot;,            only: { gen: [&amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;nbt&amp;quot;,   t: &amp;quot;NBT&amp;quot;,            only: { gen: [&amp;quot;c&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;nbtevo&amp;quot;, t: &amp;quot;NBT EVO&amp;quot;,       only: { gen: [&amp;quot;c&amp;quot;] } } ] },&lt;br /&gt;
  { id: &amp;quot;trunk&amp;quot;, label: &amp;quot;Wo sitzt das Radiomodul des Pfeilnavis?&amp;quot;, optional: true, show: { factory: [&amp;quot;pfeil&amp;quot;] },&lt;br /&gt;
    help: &amp;quot;Bitte prüfen: Sitzt das Modul im Kofferraum, oder im Pfeilnavi selbst (Quadlock hinten neben dem Antennenstecker)?[br][img=&amp;quot; + P.pfeil + &amp;quot;]&amp;quot;,&lt;br /&gt;
    values: [&lt;br /&gt;
    { v: &amp;quot;ja&amp;quot;, t: &amp;quot;Im Kofferraum (Verlängerungen nötig)&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;nein&amp;quot;, t: &amp;quot;Im Pfeilnavi, Quadlock hinten (keine Verlängerung)&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;unk&amp;quot;, t: &amp;quot;Weiß ich nicht&amp;quot; } ] },&lt;br /&gt;
  { id: &amp;quot;aux&amp;quot;, label: &amp;quot;AUX-IN verfügbar?&amp;quot;, show: { gen: [&amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;] }, values: [&lt;br /&gt;
    { v: &amp;quot;ja&amp;quot;, t: &amp;quot;Ja&amp;quot; }, { v: &amp;quot;nein&amp;quot;, t: &amp;quot;Nein&amp;quot; } ] },&lt;br /&gt;
  { id: &amp;quot;sound&amp;quot;, label: &amp;quot;Soundsystem&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;stereo&amp;quot;, t: &amp;quot;Stereo&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;hifi&amp;quot;,   t: &amp;quot;Hifi&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;dsp&amp;quot;,    t: &amp;quot;DSP&amp;quot;, only: { vehicle: [&amp;quot;7er-e38&amp;quot;, &amp;quot;5er-e39&amp;quot;, &amp;quot;x5-e53&amp;quot;, &amp;quot;x3-e83&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;hk&amp;quot;,     t: &amp;quot;Harman Kardon&amp;quot;, only: { vehicle: [&amp;quot;3er-e46&amp;quot;, &amp;quot;z4-e85e86&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;logic7&amp;quot;, t: &amp;quot;Logic7&amp;quot;, only: { vehicle: [&amp;quot;3er-e9x&amp;quot;, &amp;quot;5er-e6x&amp;quot;, &amp;quot;6er-e6x&amp;quot;, &amp;quot;7er-e65&amp;quot;, &amp;quot;1er-e8x&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;hksur&amp;quot;,  t: &amp;quot;Harman Kardon Surround&amp;quot;, only: { vehicle: [&amp;quot;1er-f2x&amp;quot;, &amp;quot;2er-f2x&amp;quot;, &amp;quot;3er-f3x&amp;quot;, &amp;quot;4er-f3x&amp;quot;, &amp;quot;5er-f1x&amp;quot;] } } ] },&lt;br /&gt;
  { id: &amp;quot;current&amp;quot;, label: &amp;quot;Aktuell verbaut&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;werk&amp;quot;, t: &amp;quot;Werksradio / Werksnavi&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;nach&amp;quot;, t: &amp;quot;Nachrüst-Radio / -Navi&amp;quot; } ] },&lt;br /&gt;
  { id: &amp;quot;body&amp;quot;, label: &amp;quot;Karosserie&amp;quot;, auto: true, values: bodyValues },&lt;br /&gt;
  { id: &amp;quot;ant&amp;quot;, label: &amp;quot;Antennenstecker am Radio (optional)&amp;quot;, optional: true, def: &amp;quot;unk&amp;quot;,&lt;br /&gt;
    show: { vehicle: [&amp;quot;7er-e38&amp;quot;, &amp;quot;5er-e39&amp;quot;, &amp;quot;3er-e46&amp;quot;, &amp;quot;x5-e53&amp;quot;] },&lt;br /&gt;
    values: [&lt;br /&gt;
    { v: &amp;quot;unk&amp;quot;,   t: &amp;quot;Weiß ich nicht&amp;quot;, info: &amp;quot;[b]BM24[/b] (Rundpin) = ISO-Antennenstecker:[br][img=&amp;quot; + P.bm24 + &amp;quot;][img=&amp;quot; + P.iso + &amp;quot;][br][b]BM54[/b] = FAKRA:[br][img=&amp;quot; + P.bm54 + &amp;quot;][img=&amp;quot; + P.fakra + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;iso&amp;quot;,   t: &amp;quot;ISO (BM24, Rundpin)&amp;quot;, info: &amp;quot;[img=&amp;quot; + P.bm24 + &amp;quot;][img=&amp;quot; + P.iso + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;fakra&amp;quot;, t: &amp;quot;FAKRA (BM54)&amp;quot;, info: &amp;quot;[img=&amp;quot; + P.bm54 + &amp;quot;][img=&amp;quot; + P.fakra + &amp;quot;]&amp;quot; } ] }&lt;br /&gt;
];&lt;br /&gt;
/* ---- 3) Zusatzoptionen (Mehrfachauswahl) ---------------------------------&lt;br /&gt;
   show = nur sichtbar wenn Bedingung passt   requires = nur sichtbar wenn diese Optionen gewählt sind&lt;br /&gt;
   excl = Optionen derselben Gruppe schließen sich aus   items = Artikel aus ITEMS */&lt;br /&gt;
var OPTS = [&lt;br /&gt;
  { id: &amp;quot;halter&amp;quot;,  t: &amp;quot;Radio-Halter&amp;quot;, sub: &amp;quot;nur BMW E39&amp;quot;, show: { vehicle: [&amp;quot;5er-e39&amp;quot;] }, items: [&amp;quot;halter&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;ibus&amp;quot;,    t: &amp;quot;I-BUS App&amp;quot;, show: { gen: [&amp;quot;alt&amp;quot;] }, items: [&amp;quot;ibus&amp;quot;, &amp;quot;resler&amp;quot;, &amp;quot;bclic&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;deepobd&amp;quot;, t: &amp;quot;DeepOBD (Diagnose)&amp;quot;, items: [&amp;quot;deepobd&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;can&amp;quot;,     t: &amp;quot;CAN Interface&amp;quot;, sub: &amp;quot;Addon - nur mit I-BUS App&amp;quot;, show: { gen: [&amp;quot;alt&amp;quot;] }, requires: [&amp;quot;ibus&amp;quot;], items: [&amp;quot;can&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;kcan&amp;quot;,    t: &amp;quot;K-CAN App (Beta)&amp;quot;, sub: &amp;quot;Pendant zur I-BUS App&amp;quot;, show: { vehicle: KCAN }, items: [&amp;quot;kcan&amp;quot;, &amp;quot;kcanlic&amp;quot;, &amp;quot;can&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;tpms&amp;quot;,    t: &amp;quot;TPMS (Reifendruck)&amp;quot;, items: [&amp;quot;tpms&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;dab1&amp;quot;,    t: &amp;quot;DAB+ (Single Receiver)&amp;quot;, excl: &amp;quot;dab&amp;quot;, items: [&amp;quot;dab1&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;dab2&amp;quot;,    t: &amp;quot;DAB+ (Dual Receiver)&amp;quot;,   excl: &amp;quot;dab&amp;quot;, items: [&amp;quot;dab2&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;rcam&amp;quot;,    t: &amp;quot;Rückfahrkamera&amp;quot;, items: [&amp;quot;rcam&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;fcam&amp;quot;,    t: &amp;quot;Front-Kamera&amp;quot;, items: [&amp;quot;fcam&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;tool&amp;quot;,    t: &amp;quot;Einbau-Werkzeug (Kunststoffheber)&amp;quot;, items: [&amp;quot;tool&amp;quot;] }&lt;br /&gt;
];&lt;br /&gt;
/* Erzwungene Optionen (werden automatisch gesetzt und gesperrt) */&lt;br /&gt;
var FORCED = [&lt;br /&gt;
  { when: { sound: [&amp;quot;dsp&amp;quot;] }, opts: [&amp;quot;ibus&amp;quot;], why: &amp;quot;wegen DSP erforderlich&amp;quot; }&lt;br /&gt;
];&lt;br /&gt;
/* ---- 4) Artikel ------------------------------------------------------------&lt;br /&gt;
   u = Shop-Link (ut = Linktext)   w = Wiki-Link (wt = Linktext)   leer = kein Link&lt;br /&gt;
   skipIf = Artikel entfällt, wenn der genannte Artikel schon in der Liste steht */&lt;br /&gt;
var ITEMS = {&lt;br /&gt;
  exl005:  { t: &amp;quot;Verlängerung EXL005&amp;quot;, d: &amp;quot;Ersetzt das Radiomodul im Kofferraum.&amp;quot;, u: SHOP + &amp;quot;detail/index/sArticle/212/&amp;quot;, img: [P.exl005, P.schema] },&lt;br /&gt;
  fakra6m: { t: &amp;quot;Verlängerung 6 m FAKRA(m) auf FAKRA(f), gewinkelt&amp;quot;, d: &amp;quot;Antennenverlängerung vom Kofferraum nach vorn.&amp;quot;, img: [P.fakra6m],&lt;br /&gt;
             u: SHOP + &amp;quot;shop/zubehoer/adapterkabel/192/verlaengerung-6m-fakra-m-auf-fakra-f-kurz-gewinkelt&amp;quot; },&lt;br /&gt;
  isoada:  { t: &amp;quot;Adapter ISO-Stecker auf FAKRA, gewinkelt (15 cm)&amp;quot;, d: &amp;quot;Nötig bei ISO-Antennenstecker (BM24, Rundpin).&amp;quot;, img: [P.isofakra],&lt;br /&gt;
             u: SHOP + &amp;quot;shop/zubehoer/adapterkabel/193/adapter-kabel-iso-f-auf-fakra-f-kurz-gewinkelt-15cm&amp;quot; },&lt;br /&gt;
  bcdsp:   { t: &amp;quot;I-BUS App - BC+DSP Lizenz&amp;quot;, d: &amp;quot;Ohne DSP-Lizenz arbeitet das Werks-DSP nicht.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/lizenzen/171/i-bus-app-bc-dsp-lizenz&amp;quot; },&lt;br /&gt;
  halter:  { t: &amp;quot;Alu-Halter zur Radio-Montage im BMW E39&amp;quot;, d: &amp;quot;Empfohlen bei Radios, die nicht von AVIN stammen.&amp;quot;, img: [P.halter],&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/radiohalter/185/alu-halter-zur-radio-montage-im-bmw-e39&amp;quot; },&lt;br /&gt;
  ibus:    { t: &amp;quot;I-BUS App&amp;quot;, d: &amp;quot;Erhält die Bordcomputer-Funktionen und steuert z. B. den Original-CD-Wechsler.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;cat/index/sCategory/42&amp;quot;,&lt;br /&gt;
             w: WIKI + &amp;quot;Was_brauche_ich_um_die_I-BUS_App_nutzen_zu_k%C3%B6nnen%3F&amp;quot;, wt: &amp;quot;Wiki: Was brauche ich für die I-BUS App?&amp;quot; },&lt;br /&gt;
  resler:  { t: &amp;quot;Resler USB I-BUS Modul inkl. Anschlusskabel&amp;quot;, d: &amp;quot;Verbindet I-BUS App und Fahrzeug.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/interfaces-module/191/resler-usb-i-bus-modul-inkl.-anschlusskabel&amp;quot;,&lt;br /&gt;
             w: &amp;quot;https://wiki.ibus-app.de/index.php?title=Hauptseite#Einbauanleitung_f.C3.BCr_Resler_Modul_und_Resler_Interface&amp;quot;, wt: &amp;quot;Einbauanleitung Resler Modul&amp;quot; },&lt;br /&gt;
  bclic:   { t: &amp;quot;I-BUS App - BC Lizenz&amp;quot;, d: &amp;quot;Schaltet u. a. die BC-Daten der App frei.&amp;quot;, skipIf: &amp;quot;bcdsp&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/lizenzen/167/i-bus-app-bc-lizenz&amp;quot; },&lt;br /&gt;
  deepobd: { t: &amp;quot;Deep OBD OBD-II Bluetooth-Adapter&amp;quot;, d: &amp;quot;Live-Werte auslesen, Fehler lesen und löschen.&amp;quot;, img: [P.deepobd],&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/interfaces-module/258/deep-obd-obd-ii-bluetooth-adapter?c=54&amp;quot;,&lt;br /&gt;
             w: &amp;quot;https://xtrons.ibus-app.de/index.php?title=DeepOBD_-_Adapter_und_App_einrichten&amp;quot;, wt: &amp;quot;Wiki: DeepOBD einrichten&amp;quot; },&lt;br /&gt;
  can:     { t: &amp;quot;CAN-Bus Interface inkl. Anschlusskabel&amp;quot;, d: &amp;quot;Addon, funktioniert nur zusammen mit der I-BUS App bzw. der K-CAN App.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/interfaces-module/346/can-bus-interface-inkl.-anschlusskabel&amp;quot;,&lt;br /&gt;
             w: WIKI + &amp;quot;Einbauanleitung_CAN-Bus_Interface&amp;quot;, wt: &amp;quot;Einbauanleitung CAN-Bus Interface&amp;quot; },&lt;br /&gt;
  kcan:    { t: &amp;quot;K-CAN App (Beta)&amp;quot;, d: &amp;quot;Pendant zur I-BUS App für Fahrzeuge mit K-CAN, aktuell als Betaversion.&amp;quot;,&lt;br /&gt;
             w: &amp;quot;https://wiki.kcan-app.de/&amp;quot;, wt: &amp;quot;Wiki zur K-CAN App&amp;quot; },&lt;br /&gt;
  kcanlic: { t: &amp;quot;K-CAN App - Lizenz Betaversion&amp;quot;, d: &amp;quot;Beta-Lizenz für die K-CAN App.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/lizenzen/358/k-can-app-lizenz-betaversion&amp;quot; },&lt;br /&gt;
  tpms:    { t: &amp;quot;TPMS - Reifendruckkontrolle&amp;quot;, d: &amp;quot;&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/tpms/&amp;quot; },&lt;br /&gt;
  dab1:    { t: &amp;quot;DAB+ Empfänger inkl. Antenne (Single)&amp;quot;, d: &amp;quot;&amp;quot;, w: &amp;quot;https://xtrons.ibus-app.de/index.php?title=Installation_der_DAB%2B_Antenne&amp;quot;, wt: &amp;quot;Installation der DAB+ Antenne&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/dab/291/dab-empfaenger-inkl.-antenne-usbdab04&amp;quot; },&lt;br /&gt;
  dab2:    { t: &amp;quot;Dual DAB+ Empfänger-Stick inkl. 2 Antennen&amp;quot;, d: &amp;quot;&amp;quot;, w: &amp;quot;https://xtrons.ibus-app.de/index.php?title=Installation_der_DAB%2B_Antenne&amp;quot;, wt: &amp;quot;Installation der DAB+ Antenne&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/dab/391/dual-dab-empfaenger-stick-inkl.-2-antennen-acusbdab05t?c=75&amp;quot; },&lt;br /&gt;
  rcam:    { t: &amp;quot;Rückfahrkamera&amp;quot;, d: &amp;quot;&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/kameras/&amp;quot;, ut: &amp;quot;Kameras im Shop ansehen →&amp;quot; },&lt;br /&gt;
  fcam:    { t: &amp;quot;Front-Kamera&amp;quot;, d: &amp;quot;&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/kameras/&amp;quot;, ut: &amp;quot;Kameras im Shop ansehen →&amp;quot; },&lt;br /&gt;
  tool:    { t: &amp;quot;Einbau-Werkzeug (Kunststoffheber)&amp;quot;, d: &amp;quot;Zum schonenden Lösen der Verkleidungen.&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/einbauwerkzeug/&amp;quot; }&lt;br /&gt;
};&lt;br /&gt;
/* ---- 5) Regeln --------------------------------------------------------------&lt;br /&gt;
   type: need (Das brauchst Du) oder hint (Hinweise)   when = Bedingung auf die Felder&lt;br /&gt;
   opts = diese Zusatzoptionen müssen gewählt sein      items = Artikel   html = Text&lt;br /&gt;
   Abgeleitete Werte: gen (alt/b/c) und module (ja/nein/unk = Radiomodul im Kofferraum, nur gen alt) */&lt;br /&gt;
var RULES = [&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { current: [&amp;quot;werk&amp;quot;], module: [&amp;quot;ja&amp;quot;] }, items: [&amp;quot;exl005&amp;quot;, &amp;quot;fakra6m&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { current: [&amp;quot;nach&amp;quot;], module: [&amp;quot;ja&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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=&amp;quot; + P.noquad + &amp;quot;][img=&amp;quot; + P.noexl6 + &amp;quot;]&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;ja&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;nein&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;unk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { ant: [&amp;quot;iso&amp;quot;] }, items: [&amp;quot;isoada&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { ant: [&amp;quot;unk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Antennenstecker:[/b] [b]BM24[/b] (Rundpin) = ISO-Antennenstecker, ggf. wird der [a=&amp;quot; + SHOP + &amp;quot;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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { sound: [&amp;quot;dsp&amp;quot;] }, items: [&amp;quot;bcdsp&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { sound: [&amp;quot;dsp&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]DSP:[/b] Damit das Werks-DSP überhaupt arbeitet, wird die I-BUS App mit BC+DSP Lizenz benötigt.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { sound: [&amp;quot;hk&amp;quot;], gen: [&amp;quot;alt&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Harman Kardon:[/b] Benötigt [b]keine[/b] DSP-Lizenz. Das Remote-Signal (+12 V, wenn Radio an) genügt zum Starten.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { aux: [&amp;quot;nein&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]AUX-IN:[/b] Der AUX-IN muss codiert werden. Optional kann ein FM-Transmitter genutzt werden - das ist nicht empfohlen.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;7er-e38&amp;quot;, &amp;quot;x5-e53&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Montage:[/b] Radios für BMW E38/E53 benötigen keine extra Halterungen.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;5er-e39&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;3er-e46&amp;quot;], factory: [&amp;quot;iris&amp;quot;, &amp;quot;mid&amp;quot;, &amp;quot;pfeil&amp;quot;], current: [&amp;quot;werk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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]&amp;quot; +&lt;br /&gt;
          &amp;quot;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]&amp;quot; +&lt;br /&gt;
          &amp;quot;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=&amp;quot; + P.funktr + &amp;quot;]&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { factory: [&amp;quot;cic&amp;quot;, &amp;quot;nbt&amp;quot;, &amp;quot;nbtevo&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Lichtleiter:[/b] Ggf. vorhandene Lichtleiter (MOST) müssen aus dem BMW-Stecker in den Xtrons-Adapter umgesteckt werden.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { factory: [&amp;quot;mask&amp;quot;, &amp;quot;ccc&amp;quot;, &amp;quot;cic&amp;quot;, &amp;quot;nbt&amp;quot;, &amp;quot;nbtevo&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, opts: [&amp;quot;kcan&amp;quot;], when: {},&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, opts: [&amp;quot;ibus&amp;quot;], when: {},&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: {},&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot; }&lt;br /&gt;
];&lt;br /&gt;
/* =====================================================================&lt;br /&gt;
   PROGRAMMLOGIK&lt;br /&gt;
   ===================================================================== */&lt;br /&gt;
var $ = function (id) { return document.getElementById(id); };&lt;br /&gt;
var sel = {}, picked = {}, summary = &amp;quot;&amp;quot;, capA = 0, capB = 0;&lt;br /&gt;
var fieldsEl = $(&amp;quot;nvk-fields&amp;quot;), optsEl = $(&amp;quot;nvk-opts&amp;quot;), outEl = $(&amp;quot;nvk-out&amp;quot;);&lt;br /&gt;
function full(u) { return u.indexOf(&amp;quot;/thumb/&amp;quot;) === -1 ? u : u.replace(&amp;quot;/thumb/&amp;quot;, &amp;quot;/&amp;quot;).replace(/\/[^\/]+$/, &amp;quot;&amp;quot;); }&lt;br /&gt;
function fmt(t) {&lt;br /&gt;
  return t.replace(/\[imgw=([^\x5D]+)\]/g, function (m, u) {&lt;br /&gt;
    return &amp;quot;\u003Ca href=\&amp;quot;&amp;quot; + full(u) + &amp;quot;\&amp;quot; target=\&amp;quot;_blank\&amp;quot; rel=\&amp;quot;noopener\&amp;quot;\u003E\u003Cimg class=\&amp;quot;nvk-img wide\&amp;quot; src=\&amp;quot;&amp;quot; + u + &amp;quot;\&amp;quot; alt=\&amp;quot;\&amp;quot;\u003E\u003C/a\u003E&amp;quot;;&lt;br /&gt;
  }).replace(/\[img=([^\x5D]+)\]/g, function (m, u) {&lt;br /&gt;
    return &amp;quot;\u003Ca href=\&amp;quot;&amp;quot; + full(u) + &amp;quot;\&amp;quot; target=\&amp;quot;_blank\&amp;quot; rel=\&amp;quot;noopener\&amp;quot;\u003E\u003Cimg class=\&amp;quot;nvk-img\&amp;quot; src=\&amp;quot;&amp;quot; + u + &amp;quot;\&amp;quot; alt=\&amp;quot;\&amp;quot;\u003E\u003C/a\u003E&amp;quot;;&lt;br /&gt;
  }).replace(/\[b\]/g, &amp;quot;\u003Cb\u003E&amp;quot;).replace(/\[\/b\]/g, &amp;quot;\u003C/b\u003E&amp;quot;).replace(/\[br\]/g, &amp;quot;\u003Cbr\u003E&amp;quot;)&lt;br /&gt;
    .replace(/\[a=([^\x5D]+)\]/g, &amp;quot;\u003Ca href=\&amp;quot;$1\&amp;quot; target=\&amp;quot;_blank\&amp;quot; rel=\&amp;quot;noopener\&amp;quot;\u003E&amp;quot;).replace(/\[\/a\]/g, &amp;quot;\u003C/a\u003E&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
function match(cond, s, lenient) {&lt;br /&gt;
  if (!cond) return true;&lt;br /&gt;
  for (var k in cond) {&lt;br /&gt;
    if (!s[k]) { if (lenient) continue; return false; }&lt;br /&gt;
    if (cond[k].indexOf(s[k]) === -1) return false;&lt;br /&gt;
  }&lt;br /&gt;
  return true;&lt;br /&gt;
}&lt;br /&gt;
function vehicleOf(id) { return VEHICLES.filter(function (x) { return x.v === id; })[0]; }&lt;br /&gt;
function derive() {&lt;br /&gt;
  var s = {}, k;&lt;br /&gt;
  for (k in sel) s[k] = sel[k];&lt;br /&gt;
  var veh = vehicleOf(sel.vehicle);&lt;br /&gt;
  if (veh) s.gen = veh.gen;&lt;br /&gt;
  if (s.gen === &amp;quot;alt&amp;quot;) {&lt;br /&gt;
    if (s.factory === &amp;quot;n43&amp;quot; || s.factory === &amp;quot;n169&amp;quot;) s.module = &amp;quot;ja&amp;quot;;&lt;br /&gt;
    else if (s.factory === &amp;quot;iris&amp;quot; || s.factory === &amp;quot;mid&amp;quot;) s.module = &amp;quot;nein&amp;quot;;&lt;br /&gt;
    else if (s.factory === &amp;quot;pfeil&amp;quot;) s.module = s.trunk || &amp;quot;unk&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  return s;&lt;br /&gt;
}&lt;br /&gt;
function forced(s) {&lt;br /&gt;
  var f = {};&lt;br /&gt;
  FORCED.forEach(function (r) { if (match(r.when, s)) r.opts.forEach(function (o) { f[o] = r.why; }); });&lt;br /&gt;
  return f;&lt;br /&gt;
}&lt;br /&gt;
function onSet(s) {&lt;br /&gt;
  var f = forced(s), on = {}, k;&lt;br /&gt;
  for (k in picked) if (picked[k]) on[k] = true;&lt;br /&gt;
  for (k in f) on[k] = true;&lt;br /&gt;
  return { on: on, forced: f };&lt;br /&gt;
}&lt;br /&gt;
function optVisible(o, s, on) {&lt;br /&gt;
  if (!match(o.show, s, true)) return false;&lt;br /&gt;
  return (o.requires || []).every(function (r) { return on[r]; });&lt;br /&gt;
}&lt;br /&gt;
FIELDS.forEach(function (f) {&lt;br /&gt;
  var wrap = document.createElement(&amp;quot;div&amp;quot;); wrap.className = &amp;quot;nvk-f&amp;quot;; wrap.id = &amp;quot;nvk-w-&amp;quot; + f.id;&lt;br /&gt;
  var lab = document.createElement(&amp;quot;label&amp;quot;); lab.htmlFor = &amp;quot;nvk-&amp;quot; + f.id; lab.textContent = f.label;&lt;br /&gt;
  var s = document.createElement(&amp;quot;select&amp;quot;); s.id = &amp;quot;nvk-&amp;quot; + f.id;&lt;br /&gt;
  s.addEventListener(&amp;quot;change&amp;quot;, function () { sel[f.id] = s.value; update(); });&lt;br /&gt;
  wrap.appendChild(lab); wrap.appendChild(s);&lt;br /&gt;
  if (f.help) { var h = document.createElement(&amp;quot;div&amp;quot;); h.className = &amp;quot;nvk-help&amp;quot;; h.innerHTML = fmt(f.help); wrap.appendChild(h); }&lt;br /&gt;
  var inf = document.createElement(&amp;quot;div&amp;quot;); inf.id = &amp;quot;nvk-i-&amp;quot; + f.id; wrap.appendChild(inf);&lt;br /&gt;
  fieldsEl.appendChild(wrap);&lt;br /&gt;
});&lt;br /&gt;
function renderFields() {&lt;br /&gt;
  FIELDS.forEach(function (f) {&lt;br /&gt;
    var s = derive();&lt;br /&gt;
    var wrap = $(&amp;quot;nvk-w-&amp;quot; + f.id), el = $(&amp;quot;nvk-&amp;quot; + f.id);&lt;br /&gt;
    var vis = f.show ? match(f.show, s, false) : true;&lt;br /&gt;
    wrap.style.display = vis ? &amp;quot;&amp;quot; : &amp;quot;none&amp;quot;;&lt;br /&gt;
    if (!vis) { sel[f.id] = &amp;quot;&amp;quot;; return; }&lt;br /&gt;
    var allowed = f.values.filter(function (v) { return match(v.only, s, true); });&lt;br /&gt;
    if (sel[f.id]) { if (!allowed.some(function (v) { return v.v === sel[f.id]; })) sel[f.id] = &amp;quot;&amp;quot;; }&lt;br /&gt;
    if (!sel[f.id]) { if (f.def) sel[f.id] = f.def; }&lt;br /&gt;
    if (!sel[f.id]) { if (f.auto) { if (sel.vehicle) { if (allowed.length === 1) sel[f.id] = allowed[0].v; } } }&lt;br /&gt;
    el.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
    if (!f.def) { var p = document.createElement(&amp;quot;option&amp;quot;); p.value = &amp;quot;&amp;quot;; p.textContent = &amp;quot;– bitte wählen –&amp;quot;; el.appendChild(p); }&lt;br /&gt;
    allowed.forEach(function (v) {&lt;br /&gt;
      var o = document.createElement(&amp;quot;option&amp;quot;); o.value = v.v; o.textContent = v.t; el.appendChild(o);&lt;br /&gt;
    });&lt;br /&gt;
    el.value = sel[f.id] || &amp;quot;&amp;quot;;&lt;br /&gt;
    var cur = allowed.filter(function (v) { return v.v === sel[f.id]; })[0];&lt;br /&gt;
    var pre = f.pre ? (match(f.pre.when, s, false) ? fmt(f.pre.html) : &amp;quot;&amp;quot;) : &amp;quot;&amp;quot;;&lt;br /&gt;
    $(&amp;quot;nvk-i-&amp;quot; + f.id).innerHTML = pre + (cur ? (cur.info ? fmt(cur.info) : &amp;quot;&amp;quot;) : &amp;quot;&amp;quot;);&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
function renderOpts() {&lt;br /&gt;
  var s = derive(), st = onSet(s);&lt;br /&gt;
  OPTS.forEach(function (o) { if (!optVisible(o, s, st.on)) picked[o.id] = false; });&lt;br /&gt;
  st = onSet(s);&lt;br /&gt;
  optsEl.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
  OPTS.forEach(function (o) {&lt;br /&gt;
    if (!optVisible(o, s, st.on)) return;&lt;br /&gt;
    var lab = document.createElement(&amp;quot;label&amp;quot;); lab.className = &amp;quot;nvk-o&amp;quot;;&lt;br /&gt;
    var cb = document.createElement(&amp;quot;input&amp;quot;); cb.type = &amp;quot;checkbox&amp;quot;;&lt;br /&gt;
    cb.checked = !!st.on[o.id];&lt;br /&gt;
    var isForced = !!st.forced[o.id];&lt;br /&gt;
    if (isForced) { cb.disabled = true; lab.className += &amp;quot; dis&amp;quot;; }&lt;br /&gt;
    cb.addEventListener(&amp;quot;change&amp;quot;, function () {&lt;br /&gt;
      picked[o.id] = cb.checked;&lt;br /&gt;
      if (cb.checked) { if (o.excl) OPTS.forEach(function (x) { if (x.excl === o.excl) { if (x.id !== o.id) picked[x.id] = false; } }); }&lt;br /&gt;
      update();&lt;br /&gt;
    });&lt;br /&gt;
    lab.appendChild(cb);&lt;br /&gt;
    lab.appendChild(document.createTextNode(&amp;quot; &amp;quot; + o.t));&lt;br /&gt;
    var sub = [o.sub, isForced ? st.forced[o.id] : &amp;quot;&amp;quot;].filter(Boolean).join(&amp;quot; - &amp;quot;);&lt;br /&gt;
    if (sub) { var sm = document.createElement(&amp;quot;small&amp;quot;); sm.textContent = &amp;quot; (&amp;quot; + sub + &amp;quot;)&amp;quot;; lab.appendChild(sm); }&lt;br /&gt;
    optsEl.appendChild(lab);&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
function link(url, text) {&lt;br /&gt;
  var a = document.createElement(&amp;quot;a&amp;quot;); a.href = url; a.target = &amp;quot;_blank&amp;quot;; a.rel = &amp;quot;noopener&amp;quot;; a.textContent = text; return a;&lt;br /&gt;
}&lt;br /&gt;
function card(item, cls) {&lt;br /&gt;
  var d = document.createElement(&amp;quot;div&amp;quot;); d.className = &amp;quot;nvk-card &amp;quot; + (cls || &amp;quot;&amp;quot;);&lt;br /&gt;
  var b = document.createElement(&amp;quot;b&amp;quot;); b.textContent = item.t; d.appendChild(b);&lt;br /&gt;
  if (item.d) { var p = document.createElement(&amp;quot;span&amp;quot;); p.textContent = item.d; d.appendChild(p); }&lt;br /&gt;
  if (item.img) {&lt;br /&gt;
    var im = document.createElement(&amp;quot;div&amp;quot;);&lt;br /&gt;
    item.img.forEach(function (u) {&lt;br /&gt;
      var a = document.createElement(&amp;quot;a&amp;quot;); a.href = full(u); a.target = &amp;quot;_blank&amp;quot;; a.rel = &amp;quot;noopener&amp;quot;;&lt;br /&gt;
      var g = document.createElement(&amp;quot;img&amp;quot;); g.className = &amp;quot;nvk-img&amp;quot;; g.src = u; g.alt = item.t; a.appendChild(g); im.appendChild(a);&lt;br /&gt;
    });&lt;br /&gt;
    d.appendChild(im);&lt;br /&gt;
  }&lt;br /&gt;
  if (item.u || item.w) {&lt;br /&gt;
    var l = document.createElement(&amp;quot;div&amp;quot;); l.className = &amp;quot;nvk-links&amp;quot;;&lt;br /&gt;
    if (item.u) l.appendChild(link(item.u, item.ut || &amp;quot;Im Shop ansehen →&amp;quot;));&lt;br /&gt;
    if (item.w) l.appendChild(link(item.w, (item.wt || &amp;quot;Zum Wiki&amp;quot;) + &amp;quot; →&amp;quot;));&lt;br /&gt;
    d.appendChild(l);&lt;br /&gt;
  }&lt;br /&gt;
  return d;&lt;br /&gt;
}&lt;br /&gt;
function heading(txt) { var h = document.createElement(&amp;quot;h3&amp;quot;); h.textContent = txt; outEl.appendChild(h); }&lt;br /&gt;
function renderResult() {&lt;br /&gt;
  var s = derive(), st = onSet(s);&lt;br /&gt;
  var missing = FIELDS.filter(function (f) {&lt;br /&gt;
    var w = $(&amp;quot;nvk-w-&amp;quot; + f.id);&lt;br /&gt;
    return w.style.display !== &amp;quot;none&amp;quot; ? (!f.optional ? !sel[f.id] : false) : false;&lt;br /&gt;
  });&lt;br /&gt;
  outEl.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
  if (missing.length) {&lt;br /&gt;
    var m = document.createElement(&amp;quot;p&amp;quot;); m.className = &amp;quot;nvk-miss&amp;quot;;&lt;br /&gt;
    m.textContent = &amp;quot;Bitte noch auswählen: &amp;quot; + missing.map(function (f) { return f.label; }).join(&amp;quot;, &amp;quot;);&lt;br /&gt;
    outEl.appendChild(m); $(&amp;quot;nvk-form&amp;quot;).style.display = &amp;quot;none&amp;quot;; return;&lt;br /&gt;
  }&lt;br /&gt;
  $(&amp;quot;nvk-form&amp;quot;).style.display = &amp;quot;&amp;quot;;&lt;br /&gt;
  var veh = vehicleOf(sel.vehicle);&lt;br /&gt;
  var ru = veh.noCat ? SHOP + &amp;quot;bmw-radios/&amp;quot; : SHOP + &amp;quot;bmw-radios/&amp;quot; + veh.v + &amp;quot;/&amp;quot;;&lt;br /&gt;
  heading(&amp;quot;Passende Radios&amp;quot;);&lt;br /&gt;
  outEl.appendChild(card({ t: &amp;quot;BMW Radios für &amp;quot; + veh.t, d: &amp;quot;Alle Radios, die für Deinen BMW &amp;quot; + veh.t + &amp;quot; im Shop erhältlich sind.&amp;quot;,&lt;br /&gt;
    u: ru, ut: &amp;quot;Zu den passenden Radios →&amp;quot;, w: SHOP + &amp;quot;bmw-radios/&amp;quot;, wt: &amp;quot;Alle BMW Radios&amp;quot; }, &amp;quot;rad&amp;quot;));&lt;br /&gt;
  var needs = [], hints = [], seen = {};&lt;br /&gt;
  RULES.forEach(function (r) {&lt;br /&gt;
    if (!match(r.when, s)) return;&lt;br /&gt;
    if (r.opts) { if (!r.opts.every(function (o) { return st.on[o]; })) return; }&lt;br /&gt;
    if (r.type === &amp;quot;need&amp;quot;) (r.items || []).forEach(function (id) { if (!seen[id]) { seen[id] = 1; needs.push(ITEMS[id]); } });&lt;br /&gt;
    else hints.push(r.html);&lt;br /&gt;
  });&lt;br /&gt;
  heading(&amp;quot;Das brauchst Du&amp;quot;);&lt;br /&gt;
  if (needs.length) needs.forEach(function (i) { outEl.appendChild(card(i)); });&lt;br /&gt;
  else { var n = document.createElement(&amp;quot;p&amp;quot;); n.textContent = &amp;quot;Für die Grundinstallation sind keine zusätzlichen Verlängerungen oder Adapter nötig.&amp;quot;; outEl.appendChild(n); }&lt;br /&gt;
  var opt = [];&lt;br /&gt;
  OPTS.forEach(function (o) {&lt;br /&gt;
    if (!st.on[o.id]) return;&lt;br /&gt;
    if (!optVisible(o, s, st.on)) return;&lt;br /&gt;
    o.items.forEach(function (id) {&lt;br /&gt;
      if (seen[id]) return;&lt;br /&gt;
      var sk = ITEMS[id].skipIf;&lt;br /&gt;
      if (sk) { if (seen[sk]) return; }&lt;br /&gt;
      seen[id] = 1; opt.push(ITEMS[id]);&lt;br /&gt;
    });&lt;br /&gt;
  });&lt;br /&gt;
  if (opt.length) { heading(&amp;quot;Deine Zusatzoptionen&amp;quot;); opt.forEach(function (i) { outEl.appendChild(card(i, &amp;quot;opt&amp;quot;)); }); }&lt;br /&gt;
  if (hints.length) {&lt;br /&gt;
    heading(&amp;quot;Hinweise&amp;quot;);&lt;br /&gt;
    hints.forEach(function (t) { var d = document.createElement(&amp;quot;div&amp;quot;); d.className = &amp;quot;nvk-note&amp;quot;; d.innerHTML = fmt(t); outEl.appendChild(d); });&lt;br /&gt;
  }&lt;br /&gt;
  var L = [&amp;quot;KONFIGURATION&amp;quot;];&lt;br /&gt;
  FIELDS.forEach(function (f) {&lt;br /&gt;
    if (!sel[f.id]) return;&lt;br /&gt;
    var v = f.values.filter(function (x) { return x.v === sel[f.id]; })[0];&lt;br /&gt;
    if (v) L.push(&amp;quot;- &amp;quot; + f.label + &amp;quot;: &amp;quot; + v.t);&lt;br /&gt;
  });&lt;br /&gt;
  L.push(&amp;quot;&amp;quot;, &amp;quot;BENÖTIGT&amp;quot;);&lt;br /&gt;
  needs.forEach(function (i) { L.push(&amp;quot;- &amp;quot; + i.t + (i.u ? &amp;quot;  &amp;quot; + i.u : &amp;quot;&amp;quot;)); });&lt;br /&gt;
  if (opt.length) { L.push(&amp;quot;&amp;quot;, &amp;quot;ZUSATZOPTIONEN&amp;quot;); opt.forEach(function (i) { L.push(&amp;quot;- &amp;quot; + i.t + (i.u ? &amp;quot;  &amp;quot; + i.u : &amp;quot;&amp;quot;)); }); }&lt;br /&gt;
  L.push(&amp;quot;&amp;quot;, &amp;quot;Radios: &amp;quot; + ru);&lt;br /&gt;
  summary = L.join(&amp;quot;\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
function update() { renderFields(); renderOpts(); renderResult(); }&lt;br /&gt;
function newCaptcha() {&lt;br /&gt;
  capA = 1 + Math.floor(Math.random() * 9); capB = 1 + Math.floor(Math.random() * 9);&lt;br /&gt;
  $(&amp;quot;nvk-capq&amp;quot;).textContent = &amp;quot;Sicherheitsfrage: Was ist &amp;quot; + capA + &amp;quot; + &amp;quot; + capB + &amp;quot;? *&amp;quot;; $(&amp;quot;nvk-cap&amp;quot;).value = &amp;quot;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
function status(msg, ok) { var e = $(&amp;quot;nvk-status&amp;quot;); e.style.display = &amp;quot;&amp;quot;; e.textContent = msg; e.style.borderLeftColor = ok ? &amp;quot;#14866d&amp;quot; : &amp;quot;#d33&amp;quot;; }&lt;br /&gt;
$(&amp;quot;nvk-send&amp;quot;).addEventListener(&amp;quot;click&amp;quot;, function () {&lt;br /&gt;
  var name = $(&amp;quot;nvk-name&amp;quot;).value.trim(), mail = $(&amp;quot;nvk-mail&amp;quot;).value.trim(), vin = $(&amp;quot;nvk-vin&amp;quot;).value.trim().toUpperCase(), msg = $(&amp;quot;nvk-msg&amp;quot;).value.trim();&lt;br /&gt;
  if (!name || !mail || !msg) return status(&amp;quot;Bitte Name, E-Mail und Kommentar ausfüllen.&amp;quot;, false);&lt;br /&gt;
  if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(mail)) return status(&amp;quot;Bitte eine gültige E-Mail-Adresse eingeben.&amp;quot;, false);&lt;br /&gt;
  if (vin) { if (!/^[A-Z]{2}[0-9]{5}$/.test(vin)) { if (!/^[A-HJ-NPR-Z0-9]{17}$/.test(vin)) return status(&amp;quot;Bitte die VIN im Format AB12345 oder die 17-stellige FGN eingeben - oder das Feld leer lassen.&amp;quot;, false); } }&lt;br /&gt;
  if (parseInt($(&amp;quot;nvk-cap&amp;quot;).value, 10) !== capA + capB) return status(&amp;quot;Die Sicherheitsfrage wurde nicht richtig beantwortet.&amp;quot;, false);&lt;br /&gt;
  if (!$(&amp;quot;nvk-dsgvo&amp;quot;).checked) return status(&amp;quot;Bitte der Verarbeitung Deiner Daten zustimmen.&amp;quot;, false);&lt;br /&gt;
  if ($(&amp;quot;nvk-hp&amp;quot;).value) return;&lt;br /&gt;
  var sz = $(&amp;quot;nvk-size&amp;quot;).value;&lt;br /&gt;
  var sum2 = summary + (sz ? &amp;quot;\n\nGewünschte Displaygröße: &amp;quot; + sz : &amp;quot;&amp;quot;);&lt;br /&gt;
  var text = &amp;quot;Name: &amp;quot; + name + &amp;quot;\nE-Mail: &amp;quot; + mail + &amp;quot;\nVIN: &amp;quot; + (vin || &amp;quot;-&amp;quot;) + &amp;quot;\n\nKommentar:\n&amp;quot; + msg + &amp;quot;\n\n&amp;quot; + sum2;&lt;br /&gt;
  if (SEND_URL) {&lt;br /&gt;
    var p = new URLSearchParams();&lt;br /&gt;
    p.append(&amp;quot;name&amp;quot;, name); p.append(&amp;quot;mail&amp;quot;, mail); p.append(&amp;quot;vin&amp;quot;, vin); p.append(&amp;quot;msg&amp;quot;, msg); p.append(&amp;quot;summary&amp;quot;, sum2);&lt;br /&gt;
    p.append(&amp;quot;hp&amp;quot;, $(&amp;quot;nvk-hp&amp;quot;).value); p.append(&amp;quot;ca&amp;quot;, capA); p.append(&amp;quot;cb&amp;quot;, capB); p.append(&amp;quot;cv&amp;quot;, $(&amp;quot;nvk-cap&amp;quot;).value);&lt;br /&gt;
    fetch(SEND_URL, { method: &amp;quot;POST&amp;quot;, body: p }).then(function (r) {&lt;br /&gt;
      if (!r.ok) throw new Error(&amp;quot;send&amp;quot;);&lt;br /&gt;
      status(&amp;quot;Danke! Deine Anfrage wurde gesendet, eine Kopie geht an &amp;quot; + mail + &amp;quot;.&amp;quot;, true); newCaptcha();&lt;br /&gt;
    }).catch(function () { status(&amp;quot;Das Senden hat nicht geklappt. Bitte versuche es später noch einmal oder schreibe direkt an &amp;quot; + MAIL_TO + &amp;quot;.&amp;quot;, false); });&lt;br /&gt;
  } else {&lt;br /&gt;
    var AMP = &amp;quot;\u0026&amp;quot;;&lt;br /&gt;
    window.location.href = &amp;quot;mailto:&amp;quot; + MAIL_TO + &amp;quot;?cc=&amp;quot; + encodeURIComponent(mail) + AMP + &amp;quot;subject=&amp;quot; + encodeURIComponent(MAIL_SUBJECT) + AMP + &amp;quot;body=&amp;quot; + encodeURIComponent(text);&lt;br /&gt;
    status(&amp;quot;Dein E-Mail-Programm wurde mit der fertigen Anfrage geöffnet. Bitte dort noch auf Senden klicken.&amp;quot;, true);&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
$(&amp;quot;nvk-reset&amp;quot;).addEventListener(&amp;quot;click&amp;quot;, function () { sel = {}; picked = {}; update(); });&lt;br /&gt;
newCaptcha();&lt;br /&gt;
update();&lt;br /&gt;
})();&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andre</name></author>
	</entry>
	<entry>
		<id>https://xtrons.ibus-app.de/index.php?title=Datei:BusinessKas_IRISG.jpg&amp;diff=4080</id>
		<title>Datei:BusinessKas IRISG.jpg</title>
		<link rel="alternate" type="text/html" href="https://xtrons.ibus-app.de/index.php?title=Datei:BusinessKas_IRISG.jpg&amp;diff=4080"/>
		<updated>2026-10-21T12:18:47Z</updated>

		<summary type="html">&lt;p&gt;Andre: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Andre</name></author>
	</entry>
	<entry>
		<id>https://xtrons.ibus-app.de/index.php?title=Datei:MASK-CCC-CIC-NBT-EVO-iDrive.jpg&amp;diff=4079</id>
		<title>Datei:MASK-CCC-CIC-NBT-EVO-iDrive.jpg</title>
		<link rel="alternate" type="text/html" href="https://xtrons.ibus-app.de/index.php?title=Datei:MASK-CCC-CIC-NBT-EVO-iDrive.jpg&amp;diff=4079"/>
		<updated>2026-10-21T12:17:43Z</updated>

		<summary type="html">&lt;p&gt;Andre: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Andre</name></author>
	</entry>
	<entry>
		<id>https://xtrons.ibus-app.de/index.php?title=Android_Radio_Konfigurator&amp;diff=4078</id>
		<title>Android Radio Konfigurator</title>
		<link rel="alternate" type="text/html" href="https://xtrons.ibus-app.de/index.php?title=Android_Radio_Konfigurator&amp;diff=4078"/>
		<updated>2026-10-21T11:58:16Z</updated>

		<summary type="html">&lt;p&gt;Andre: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;html&amp;gt;&amp;lt;div id=&amp;quot;nvk&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
#nvk{max-width:900px;line-height:1.45}&lt;br /&gt;
#nvk *{box-sizing:border-box}&lt;br /&gt;
#nvk .nvk-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:14px;margin:12px 0}&lt;br /&gt;
#nvk .nvk-f label{display:block;font-weight:700;margin-bottom:4px}&lt;br /&gt;
#nvk select{width:100%;padding:9px 8px;font:inherit;color:#202122;background:#fff;border:1px solid #a2a9b1;border-radius:4px}&lt;br /&gt;
#nvk .nvk-help{font-size:.85em;opacity:.75;margin-top:3px}&lt;br /&gt;
#nvk fieldset{border:1px solid rgba(128,128,128,.45);border-radius:6px;padding:10px 14px;margin:14px 0}&lt;br /&gt;
#nvk legend{font-weight:700;padding:0 6px}&lt;br /&gt;
#nvk .nvk-o{display:block;padding:4px 0;cursor:pointer}&lt;br /&gt;
#nvk .nvk-o small{opacity:.7}&lt;br /&gt;
#nvk .nvk-o.dis{opacity:.75;cursor:default}&lt;br /&gt;
#nvk .nvk-btn{padding:7px 14px;font:inherit;border:1px solid #a2a9b1;border-radius:4px;background:#f8f9fa;color:#202122;cursor:pointer}&lt;br /&gt;
#nvk #nvk-out{margin-top:18px}&lt;br /&gt;
#nvk h3{margin:18px 0 8px}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-card.opt{border-left-color:#14866d}&lt;br /&gt;
#nvk .nvk-card.rad{border-left-color:#d9400b}&lt;br /&gt;
#nvk .nvk-card b{display:block}&lt;br /&gt;
#nvk .nvk-links{margin-top:4px;font-weight:600}&lt;br /&gt;
#nvk .nvk-links a{margin-right:14px}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-miss{opacity:.8;font-style:italic}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-card .nvk-img{max-width:230px;max-height:150px}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk #nvk-form{margin-top:22px}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-grid&amp;quot; id=&amp;quot;nvk-fields&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;fieldset id=&amp;quot;nvk-optset&amp;quot;&amp;gt;&amp;lt;legend&amp;gt;Zusatzoptionen&amp;lt;/legend&amp;gt;&amp;lt;div id=&amp;quot;nvk-opts&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/fieldset&amp;gt;&lt;br /&gt;
&amp;lt;button type=&amp;quot;button&amp;quot; class=&amp;quot;nvk-btn&amp;quot; id=&amp;quot;nvk-reset&amp;quot;&amp;gt;Auswahl zurücksetzen&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk-out&amp;quot; aria-live=&amp;quot;polite&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;fieldset id=&amp;quot;nvk-form&amp;quot; style=&amp;quot;display:none&amp;quot;&amp;gt;&amp;lt;legend&amp;gt;Anfrage senden&amp;lt;/legend&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;nvk-help&amp;quot;&amp;gt;Deine Auswahl und die Liste oben werden automatisch mitgesendet. Alle Felder mit * sind Pflicht.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-grid&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-name&amp;quot;&amp;gt;Name *&amp;lt;/label&amp;gt;&amp;lt;input id=&amp;quot;nvk-name&amp;quot; type=&amp;quot;text&amp;quot; autocomplete=&amp;quot;name&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-mail&amp;quot;&amp;gt;E-Mail *&amp;lt;/label&amp;gt;&amp;lt;input id=&amp;quot;nvk-mail&amp;quot; type=&amp;quot;email&amp;quot; autocomplete=&amp;quot;email&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-vin&amp;quot;&amp;gt;VIN oder FGN (optional)&amp;lt;/label&amp;gt;&amp;lt;input id=&amp;quot;nvk-vin&amp;quot; type=&amp;quot;text&amp;quot; maxlength=&amp;quot;17&amp;quot; placeholder=&amp;quot;AB12345 oder 17-stellige FGN&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-msg&amp;quot;&amp;gt;Kommentar *&amp;lt;/label&amp;gt;&amp;lt;textarea id=&amp;quot;nvk-msg&amp;quot; rows=&amp;quot;4&amp;quot;&amp;gt;&amp;lt;/textarea&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot; style=&amp;quot;max-width:300px&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-cap&amp;quot; id=&amp;quot;nvk-capq&amp;quot;&amp;gt;Sicherheitsfrage *&amp;lt;/label&amp;gt;&amp;lt;input id=&amp;quot;nvk-cap&amp;quot; type=&amp;quot;text&amp;quot; inputmode=&amp;quot;numeric&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;input id=&amp;quot;nvk-hp&amp;quot; type=&amp;quot;text&amp;quot; tabindex=&amp;quot;-1&amp;quot; autocomplete=&amp;quot;off&amp;quot; aria-hidden=&amp;quot;true&amp;quot; style=&amp;quot;position:absolute;left:-9999px;width:1px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;label class=&amp;quot;nvk-o&amp;quot;&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; id=&amp;quot;nvk-dsgvo&amp;quot;&amp;gt; Ich stimme zu, dass meine Angaben zur Bearbeitung der Anfrage per E-Mail verarbeitet werden. *&amp;lt;/label&amp;gt;&lt;br /&gt;
&amp;lt;button type=&amp;quot;button&amp;quot; class=&amp;quot;nvk-btn&amp;quot; id=&amp;quot;nvk-send&amp;quot;&amp;gt;Anfrage senden&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk-status&amp;quot; class=&amp;quot;nvk-note&amp;quot; style=&amp;quot;display:none&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/fieldset&amp;gt;&lt;br /&gt;
&amp;lt;noscript&amp;gt;Für den Konfigurator wird JavaScript benötigt.&amp;lt;/noscript&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
(function () {&lt;br /&gt;
&amp;quot;use strict&amp;quot;;&lt;br /&gt;
/* =====================================================================&lt;br /&gt;
   KONFIGURATION - hier wird gepflegt.&lt;br /&gt;
   Textformat in Hinweisen: [b]fett[/b]  [br] Zeilenumbruch  [a=URL]Linktext[/a]&lt;br /&gt;
   Bitte im Skript KEIN kaufmännisches Und, kein Kleiner-/Größer-Zeichen&lt;br /&gt;
   und keine Leerzeilen verwenden (das Wiki wandelt sie um).&lt;br /&gt;
   ===================================================================== */&lt;br /&gt;
var SHOP = &amp;quot;https://shop.ibus-app.de/&amp;quot;;&lt;br /&gt;
var WIKI = &amp;quot;https://wiki.ibus-app.de/index.php?title=&amp;quot;;&lt;br /&gt;
/* Bilder aus dem Wiki (Thumbnail-Adressen; Klick öffnet automatisch das Originalbild) */&lt;br /&gt;
var IM = &amp;quot;https://xtrons.ibus-app.de/images/thumb/&amp;quot;;&lt;br /&gt;
var P = {&lt;br /&gt;
  schema:  IM + &amp;quot;e/ea/BMW_E39_Verl%C3%A4ngerungen_EXL005%2BFAKRA_.png/135px-BMW_E39_Verl%C3%A4ngerungen_EXL005%2BFAKRA_.png&amp;quot;,&lt;br /&gt;
  exl005:  IM + &amp;quot;7/70/Exl005-1.webp/257px-Exl005-1.webp.png&amp;quot;,&lt;br /&gt;
  fakra6m: IM + &amp;quot;d/d8/FM-extension_01_1.png/270px-FM-extension_01_1.png&amp;quot;,&lt;br /&gt;
  isofakra: IM + &amp;quot;4/4e/ISO-FAKRA_1.png/270px-ISO-FAKRA_1.png&amp;quot;,&lt;br /&gt;
  bm24:    IM + &amp;quot;8/82/BM24.png/130px-BM24.png&amp;quot;,&lt;br /&gt;
  iso:     IM + &amp;quot;d/dd/Iso.jpg/69px-Iso.jpg&amp;quot;,&lt;br /&gt;
  bm54:    IM + &amp;quot;3/34/BM54.png/135px-BM54.png&amp;quot;,&lt;br /&gt;
  fakra:   IM + &amp;quot;b/b3/Fakra.jpg/100px-Fakra.jpg&amp;quot;,&lt;br /&gt;
  pfeil:   IM + &amp;quot;e/ee/Navi_E46.jpg/239px-Navi_E46.jpg&amp;quot;,&lt;br /&gt;
  noquad:  IM + &amp;quot;6/68/No_elongation.jpg/180px-No_elongation.jpg&amp;quot;,&lt;br /&gt;
  noexl6:  IM + &amp;quot;7/7b/No_EXL006.jpg/180px-No_EXL006.jpg&amp;quot;,&lt;br /&gt;
  halter:  IM + &amp;quot;3/3b/Halter_Alu.webp/92px-Halter_Alu.webp.png&amp;quot;,&lt;br /&gt;
  funktr:  IM + &amp;quot;7/7e/E46_Funktionstraeger.png/240px-E46_Funktionstraeger.png&amp;quot;&lt;br /&gt;
};&lt;br /&gt;
/* Anfrage-Formular: MAIL_TO = Empfänger. SEND_URL leer = E-Mail-Programm des Kunden öffnen (mailto).&lt;br /&gt;
   SEND_URL = Adresse des Server-Skripts send-anfrage.php = Versand direkt vom Server (mit CC an den Kunden). */&lt;br /&gt;
var MAIL_TO = &amp;quot;info@ibus-app.de&amp;quot;;&lt;br /&gt;
var MAIL_SUBJECT = &amp;quot;Anfrage aus Android Radio Konfigurator&amp;quot;;&lt;br /&gt;
var SEND_URL = &amp;quot;https://xtrons.ibus-app.de/send-anfrage.php&amp;quot;;&lt;br /&gt;
/* ---- 1) Baureihen --------------------------------------------------------&lt;br /&gt;
   v = Shop-Kategorie (Link: SHOP + bmw-radios/ + v + /)&lt;br /&gt;
   gen: alt = I-BUS-Fahrzeuge (E38/E39/E46/E53/E83)&lt;br /&gt;
        b   = M-ASK / CCC / CIC     c = CIC / NBT / NBT EVO&lt;br /&gt;
   body = Karosserieformen (siehe BODY)                                      */&lt;br /&gt;
var BODY = { limo: &amp;quot;Limousine&amp;quot;, touring: &amp;quot;Touring&amp;quot;, coupe: &amp;quot;Coupé&amp;quot;, cabrio: &amp;quot;Cabrio&amp;quot;, schraeg: &amp;quot;Schrägheck&amp;quot;,&lt;br /&gt;
  compact: &amp;quot;Compact&amp;quot;, gt: &amp;quot;Gran Turismo&amp;quot;, gc: &amp;quot;Gran Coupé&amp;quot;, suv: &amp;quot;SUV / SAV&amp;quot;, roadster: &amp;quot;Roadster&amp;quot; };&lt;br /&gt;
var VEHICLES = [&lt;br /&gt;
  { v: &amp;quot;1er-e8x&amp;quot;, t: &amp;quot;1er E8x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;schraeg,coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;1er-f2x&amp;quot;, t: &amp;quot;1er F2x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;schraeg&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;2er-f2x&amp;quot;, t: &amp;quot;2er F2x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;3er-e46&amp;quot;, t: &amp;quot;3er E46&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;limo,touring,coupe,cabrio,compact&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;3er-e9x&amp;quot;, t: &amp;quot;3er E9x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;limo,touring,coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;3er-f3x&amp;quot;, t: &amp;quot;3er F3x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;limo,touring,gt&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;4er-f3x&amp;quot;, t: &amp;quot;4er F3x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;coupe,cabrio,gc&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;5er-e39&amp;quot;, t: &amp;quot;5er E39&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;limo,touring&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;5er-e6x&amp;quot;, t: &amp;quot;5er E6x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;limo,touring&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;5er-f1x&amp;quot;, t: &amp;quot;5er F1x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;limo,touring,gt&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;6er-e6x&amp;quot;, t: &amp;quot;6er E6x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;7er-e38&amp;quot;, t: &amp;quot;7er E38&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;limo&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;7er-e65&amp;quot;, t: &amp;quot;7er E65&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;limo&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;7er-f01&amp;quot;, t: &amp;quot;7er F01&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;limo&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x1-e84&amp;quot;, t: &amp;quot;X1 E84&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x1-f48&amp;quot;, t: &amp;quot;X1 F48&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x3-e83&amp;quot;, t: &amp;quot;X3 E83&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x3-f25&amp;quot;, t: &amp;quot;X3 F25&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x5-e53&amp;quot;, t: &amp;quot;X5 E53&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x5-e70&amp;quot;, t: &amp;quot;X5 E70&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x5-f15&amp;quot;, t: &amp;quot;X5 F15&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x6-e71&amp;quot;, t: &amp;quot;X6 E71&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;z4-e85e86&amp;quot;, t: &amp;quot;Z4 E85/E86&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;roadster,coupe&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;z4-e89&amp;quot;, t: &amp;quot;Z4 E89&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;roadster&amp;quot;, noCat: true }&lt;br /&gt;
];&lt;br /&gt;
/* Fahrzeuge mit K-CAN App (Beta) */&lt;br /&gt;
var KCAN = [&amp;quot;1er-e8x&amp;quot;, &amp;quot;3er-e9x&amp;quot;, &amp;quot;5er-e6x&amp;quot;, &amp;quot;6er-e6x&amp;quot;, &amp;quot;7er-e65&amp;quot;, &amp;quot;x1-e84&amp;quot;, &amp;quot;x5-e70&amp;quot;, &amp;quot;x6-e71&amp;quot;, &amp;quot;z4-e89&amp;quot;];&lt;br /&gt;
var bodyValues = Object.keys(BODY).map(function (k) {&lt;br /&gt;
  return { v: k, t: BODY[k], only: { vehicle: VEHICLES.filter(function (x) { return x.body.split(&amp;quot;,&amp;quot;).indexOf(k) !== -1; }).map(function (x) { return x.v; }) } };&lt;br /&gt;
});&lt;br /&gt;
/* ---- 2) Auswahlfelder ------------------------------------------------------&lt;br /&gt;
   only = Wert nur anbieten, wenn Bedingung passt   show = Feld nur dann zeigen&lt;br /&gt;
   optional = muss nicht gewählt werden             auto = bei nur einem Wert vorwählen */&lt;br /&gt;
var FIELDS = [&lt;br /&gt;
  { id: &amp;quot;vehicle&amp;quot;, label: &amp;quot;Fahrzeug&amp;quot;, values: VEHICLES.map(function (x) { return { v: x.v, t: &amp;quot;BMW &amp;quot; + x.t }; }) },&lt;br /&gt;
  { id: &amp;quot;factory&amp;quot;, label: &amp;quot;Verbaut ab Werk&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;iris&amp;quot;,  t: &amp;quot;Radio mit IRIS&amp;quot;, only: { vehicle: [&amp;quot;3er-e46&amp;quot;, &amp;quot;5er-e39&amp;quot;, &amp;quot;7er-e38&amp;quot;, &amp;quot;x5-e53&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;mid&amp;quot;,   t: &amp;quot;Radio mit MID&amp;quot;,  only: { gen: [&amp;quot;alt&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;n43&amp;quot;,   t: &amp;quot;4:3 Navi&amp;quot;,       only: { vehicle: [&amp;quot;5er-e39&amp;quot;, &amp;quot;7er-e38&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;n169&amp;quot;,  t: &amp;quot;16:9 Navi&amp;quot;,      only: { gen: [&amp;quot;alt&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;pfeil&amp;quot;, t: &amp;quot;Pfeilnavi&amp;quot;,      only: { vehicle: [&amp;quot;3er-e46&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;mask&amp;quot;,  t: &amp;quot;M-ASK&amp;quot;,          only: { gen: [&amp;quot;b&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;ccc&amp;quot;,   t: &amp;quot;CCC&amp;quot;,            only: { gen: [&amp;quot;b&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;cic&amp;quot;,   t: &amp;quot;CIC&amp;quot;,            only: { gen: [&amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;nbt&amp;quot;,   t: &amp;quot;NBT&amp;quot;,            only: { gen: [&amp;quot;c&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;nbtevo&amp;quot;, t: &amp;quot;NBT EVO&amp;quot;,       only: { gen: [&amp;quot;c&amp;quot;] } } ] },&lt;br /&gt;
  { id: &amp;quot;trunk&amp;quot;, label: &amp;quot;Wo sitzt das Radiomodul des Pfeilnavis?&amp;quot;, optional: true, show: { factory: [&amp;quot;pfeil&amp;quot;] },&lt;br /&gt;
    help: &amp;quot;Bitte prüfen: Sitzt das Modul im Kofferraum, oder im Pfeilnavi selbst (Quadlock hinten neben dem Antennenstecker)?[br][img=&amp;quot; + P.pfeil + &amp;quot;]&amp;quot;,&lt;br /&gt;
    values: [&lt;br /&gt;
    { v: &amp;quot;ja&amp;quot;, t: &amp;quot;Im Kofferraum (Verlängerungen nötig)&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;nein&amp;quot;, t: &amp;quot;Im Pfeilnavi, Quadlock hinten (keine Verlängerung)&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;unk&amp;quot;, t: &amp;quot;Weiß ich nicht&amp;quot; } ] },&lt;br /&gt;
  { id: &amp;quot;aux&amp;quot;, label: &amp;quot;AUX-IN verfügbar?&amp;quot;, show: { gen: [&amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;] }, values: [&lt;br /&gt;
    { v: &amp;quot;ja&amp;quot;, t: &amp;quot;Ja&amp;quot; }, { v: &amp;quot;nein&amp;quot;, t: &amp;quot;Nein&amp;quot; } ] },&lt;br /&gt;
  { id: &amp;quot;sound&amp;quot;, label: &amp;quot;Soundsystem&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;stereo&amp;quot;, t: &amp;quot;Stereo&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;hifi&amp;quot;,   t: &amp;quot;Hifi&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;dsp&amp;quot;,    t: &amp;quot;DSP&amp;quot;, only: { vehicle: [&amp;quot;7er-e38&amp;quot;, &amp;quot;5er-e39&amp;quot;, &amp;quot;x5-e53&amp;quot;, &amp;quot;x3-e83&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;hk&amp;quot;,     t: &amp;quot;Harman Kardon&amp;quot;, only: { vehicle: [&amp;quot;3er-e46&amp;quot;, &amp;quot;z4-e85e86&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;logic7&amp;quot;, t: &amp;quot;Logic7&amp;quot;, only: { vehicle: [&amp;quot;3er-e9x&amp;quot;, &amp;quot;5er-e6x&amp;quot;, &amp;quot;6er-e6x&amp;quot;, &amp;quot;7er-e65&amp;quot;, &amp;quot;1er-e8x&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;hksur&amp;quot;,  t: &amp;quot;Harman Kardon Surround&amp;quot;, only: { vehicle: [&amp;quot;1er-f2x&amp;quot;, &amp;quot;2er-f2x&amp;quot;, &amp;quot;3er-f3x&amp;quot;, &amp;quot;4er-f3x&amp;quot;, &amp;quot;5er-f1x&amp;quot;] } } ] },&lt;br /&gt;
  { id: &amp;quot;current&amp;quot;, label: &amp;quot;Aktuell verbaut&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;werk&amp;quot;, t: &amp;quot;Werksradio / Werksnavi&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;nach&amp;quot;, t: &amp;quot;Nachrüst-Radio / -Navi&amp;quot; } ] },&lt;br /&gt;
  { id: &amp;quot;body&amp;quot;, label: &amp;quot;Karosserie&amp;quot;, auto: true, values: bodyValues },&lt;br /&gt;
  { id: &amp;quot;ant&amp;quot;, label: &amp;quot;Antennenstecker am Radio (optional)&amp;quot;, optional: true, def: &amp;quot;unk&amp;quot;,&lt;br /&gt;
    show: { vehicle: [&amp;quot;7er-e38&amp;quot;, &amp;quot;5er-e39&amp;quot;, &amp;quot;3er-e46&amp;quot;, &amp;quot;x5-e53&amp;quot;] },&lt;br /&gt;
    values: [&lt;br /&gt;
    { v: &amp;quot;unk&amp;quot;,   t: &amp;quot;Weiß ich nicht&amp;quot;, info: &amp;quot;[b]BM24[/b] (Rundpin) = ISO-Antennenstecker:[br][img=&amp;quot; + P.bm24 + &amp;quot;][img=&amp;quot; + P.iso + &amp;quot;][br][b]BM54[/b] = FAKRA:[br][img=&amp;quot; + P.bm54 + &amp;quot;][img=&amp;quot; + P.fakra + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;iso&amp;quot;,   t: &amp;quot;ISO (BM24, Rundpin)&amp;quot;, info: &amp;quot;[img=&amp;quot; + P.bm24 + &amp;quot;][img=&amp;quot; + P.iso + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;fakra&amp;quot;, t: &amp;quot;FAKRA (BM54)&amp;quot;, info: &amp;quot;[img=&amp;quot; + P.bm54 + &amp;quot;][img=&amp;quot; + P.fakra + &amp;quot;]&amp;quot; } ] }&lt;br /&gt;
];&lt;br /&gt;
/* ---- 3) Zusatzoptionen (Mehrfachauswahl) ---------------------------------&lt;br /&gt;
   show = nur sichtbar wenn Bedingung passt   requires = nur sichtbar wenn diese Optionen gewählt sind&lt;br /&gt;
   excl = Optionen derselben Gruppe schließen sich aus   items = Artikel aus ITEMS */&lt;br /&gt;
var OPTS = [&lt;br /&gt;
  { id: &amp;quot;halter&amp;quot;,  t: &amp;quot;Radio-Halter&amp;quot;, sub: &amp;quot;nur BMW E39&amp;quot;, show: { vehicle: [&amp;quot;5er-e39&amp;quot;] }, items: [&amp;quot;halter&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;ibus&amp;quot;,    t: &amp;quot;I-BUS App&amp;quot;, show: { gen: [&amp;quot;alt&amp;quot;] }, items: [&amp;quot;ibus&amp;quot;, &amp;quot;resler&amp;quot;, &amp;quot;bclic&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;deepobd&amp;quot;, t: &amp;quot;DeepOBD (Diagnose)&amp;quot;, items: [&amp;quot;deepobd&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;can&amp;quot;,     t: &amp;quot;CAN Interface&amp;quot;, sub: &amp;quot;Addon - nur mit I-BUS App&amp;quot;, show: { gen: [&amp;quot;alt&amp;quot;] }, requires: [&amp;quot;ibus&amp;quot;], items: [&amp;quot;can&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;kcan&amp;quot;,    t: &amp;quot;K-CAN App (Beta)&amp;quot;, sub: &amp;quot;Pendant zur I-BUS App&amp;quot;, show: { vehicle: KCAN }, items: [&amp;quot;kcan&amp;quot;, &amp;quot;kcanlic&amp;quot;, &amp;quot;can&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;tpms&amp;quot;,    t: &amp;quot;TPMS (Reifendruck)&amp;quot;, items: [&amp;quot;tpms&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;dab1&amp;quot;,    t: &amp;quot;DAB+ (Single Receiver)&amp;quot;, excl: &amp;quot;dab&amp;quot;, items: [&amp;quot;dab1&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;dab2&amp;quot;,    t: &amp;quot;DAB+ (Dual Receiver)&amp;quot;,   excl: &amp;quot;dab&amp;quot;, items: [&amp;quot;dab2&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;rcam&amp;quot;,    t: &amp;quot;Rückfahrkamera&amp;quot;, items: [&amp;quot;rcam&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;fcam&amp;quot;,    t: &amp;quot;Front-Kamera&amp;quot;, items: [&amp;quot;fcam&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;tool&amp;quot;,    t: &amp;quot;Einbau-Werkzeug (Kunststoffheber)&amp;quot;, items: [&amp;quot;tool&amp;quot;] }&lt;br /&gt;
];&lt;br /&gt;
/* Erzwungene Optionen (werden automatisch gesetzt und gesperrt) */&lt;br /&gt;
var FORCED = [&lt;br /&gt;
  { when: { sound: [&amp;quot;dsp&amp;quot;] }, opts: [&amp;quot;ibus&amp;quot;], why: &amp;quot;wegen DSP erforderlich&amp;quot; }&lt;br /&gt;
];&lt;br /&gt;
/* ---- 4) Artikel ------------------------------------------------------------&lt;br /&gt;
   u = Shop-Link (ut = Linktext)   w = Wiki-Link (wt = Linktext)   leer = kein Link&lt;br /&gt;
   skipIf = Artikel entfällt, wenn der genannte Artikel schon in der Liste steht */&lt;br /&gt;
var ITEMS = {&lt;br /&gt;
  exl005:  { t: &amp;quot;Verlängerung EXL005&amp;quot;, d: &amp;quot;Ersetzt das Radiomodul im Kofferraum.&amp;quot;, u: SHOP + &amp;quot;detail/index/sArticle/212/&amp;quot;, img: [P.exl005, P.schema] },&lt;br /&gt;
  fakra6m: { t: &amp;quot;Verlängerung 6 m FAKRA(m) auf FAKRA(f), gewinkelt&amp;quot;, d: &amp;quot;Antennenverlängerung vom Kofferraum nach vorn.&amp;quot;, img: [P.fakra6m],&lt;br /&gt;
             u: SHOP + &amp;quot;shop/zubehoer/adapterkabel/192/verlaengerung-6m-fakra-m-auf-fakra-f-kurz-gewinkelt&amp;quot; },&lt;br /&gt;
  isoada:  { t: &amp;quot;Adapter ISO-Stecker auf FAKRA, gewinkelt (15 cm)&amp;quot;, d: &amp;quot;Nötig bei ISO-Antennenstecker (BM24, Rundpin).&amp;quot;, img: [P.isofakra],&lt;br /&gt;
             u: SHOP + &amp;quot;shop/zubehoer/adapterkabel/193/adapter-kabel-iso-f-auf-fakra-f-kurz-gewinkelt-15cm&amp;quot; },&lt;br /&gt;
  bcdsp:   { t: &amp;quot;I-BUS App - BC+DSP Lizenz&amp;quot;, d: &amp;quot;Ohne DSP-Lizenz arbeitet das Werks-DSP nicht.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/lizenzen/171/i-bus-app-bc-dsp-lizenz&amp;quot; },&lt;br /&gt;
  halter:  { t: &amp;quot;Alu-Halter zur Radio-Montage im BMW E39&amp;quot;, d: &amp;quot;Empfohlen bei Radios, die nicht von AVIN stammen.&amp;quot;, img: [P.halter],&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/radiohalter/185/alu-halter-zur-radio-montage-im-bmw-e39&amp;quot; },&lt;br /&gt;
  ibus:    { t: &amp;quot;I-BUS App&amp;quot;, d: &amp;quot;Erhält die Bordcomputer-Funktionen und steuert z. B. den Original-CD-Wechsler.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;cat/index/sCategory/42&amp;quot;,&lt;br /&gt;
             w: WIKI + &amp;quot;Was_brauche_ich_um_die_I-BUS_App_nutzen_zu_k%C3%B6nnen%3F&amp;quot;, wt: &amp;quot;Wiki: Was brauche ich für die I-BUS App?&amp;quot; },&lt;br /&gt;
  resler:  { t: &amp;quot;Resler USB I-BUS Modul inkl. Anschlusskabel&amp;quot;, d: &amp;quot;Verbindet I-BUS App und Fahrzeug.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/interfaces-module/191/resler-usb-i-bus-modul-inkl.-anschlusskabel&amp;quot;,&lt;br /&gt;
             w: &amp;quot;https://wiki.ibus-app.de/index.php?title=Hauptseite#Einbauanleitung_f.C3.BCr_Resler_Modul_und_Resler_Interface&amp;quot;, wt: &amp;quot;Einbauanleitung Resler Modul&amp;quot; },&lt;br /&gt;
  bclic:   { t: &amp;quot;I-BUS App - BC Lizenz&amp;quot;, d: &amp;quot;Schaltet u. a. die BC-Daten der App frei.&amp;quot;, skipIf: &amp;quot;bcdsp&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/lizenzen/167/i-bus-app-bc-lizenz&amp;quot; },&lt;br /&gt;
  deepobd: { t: &amp;quot;Deep OBD OBD-II Bluetooth-Adapter&amp;quot;, d: &amp;quot;Live-Werte auslesen, Fehler lesen und löschen.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/interfaces-module/258/deep-obd-obd-ii-bluetooth-adapter?c=54&amp;quot;,&lt;br /&gt;
             w: &amp;quot;https://xtrons.ibus-app.de/index.php?title=DeepOBD_-_Adapter_und_App_einrichten&amp;quot;, wt: &amp;quot;Wiki: DeepOBD einrichten&amp;quot; },&lt;br /&gt;
  can:     { t: &amp;quot;CAN-Bus Interface inkl. Anschlusskabel&amp;quot;, d: &amp;quot;Addon, funktioniert nur zusammen mit der I-BUS App bzw. der K-CAN App.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/interfaces-module/346/can-bus-interface-inkl.-anschlusskabel&amp;quot;,&lt;br /&gt;
             w: WIKI + &amp;quot;Einbauanleitung_CAN-Bus_Interface&amp;quot;, wt: &amp;quot;Einbauanleitung CAN-Bus Interface&amp;quot; },&lt;br /&gt;
  kcan:    { t: &amp;quot;K-CAN App (Beta)&amp;quot;, d: &amp;quot;Pendant zur I-BUS App für Fahrzeuge mit K-CAN, aktuell als Betaversion.&amp;quot;,&lt;br /&gt;
             w: &amp;quot;https://wiki.kcan-app.de/&amp;quot;, wt: &amp;quot;Wiki zur K-CAN App&amp;quot; },&lt;br /&gt;
  kcanlic: { t: &amp;quot;K-CAN App - Lizenz Betaversion&amp;quot;, d: &amp;quot;Beta-Lizenz für die K-CAN App.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/lizenzen/358/k-can-app-lizenz-betaversion&amp;quot; },&lt;br /&gt;
  tpms:    { t: &amp;quot;TPMS - Reifendruckkontrolle&amp;quot;, d: &amp;quot;&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/tpms/&amp;quot; },&lt;br /&gt;
  dab1:    { t: &amp;quot;DAB+ Empfänger inkl. Antenne (Single)&amp;quot;, d: &amp;quot;&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/dab/291/dab-empfaenger-inkl.-antenne-usbdab04&amp;quot; },&lt;br /&gt;
  dab2:    { t: &amp;quot;Dual DAB+ Empfänger-Stick inkl. 2 Antennen&amp;quot;, d: &amp;quot;&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/dab/391/dual-dab-empfaenger-stick-inkl.-2-antennen-acusbdab05t?c=75&amp;quot; },&lt;br /&gt;
  rcam:    { t: &amp;quot;Rückfahrkamera&amp;quot;, d: &amp;quot;&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/kameras/&amp;quot;, ut: &amp;quot;Kameras im Shop ansehen →&amp;quot; },&lt;br /&gt;
  fcam:    { t: &amp;quot;Front-Kamera&amp;quot;, d: &amp;quot;&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/kameras/&amp;quot;, ut: &amp;quot;Kameras im Shop ansehen →&amp;quot; },&lt;br /&gt;
  tool:    { t: &amp;quot;Einbau-Werkzeug (Kunststoffheber)&amp;quot;, d: &amp;quot;Zum schonenden Lösen der Verkleidungen.&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/einbauwerkzeug/&amp;quot; }&lt;br /&gt;
};&lt;br /&gt;
/* ---- 5) Regeln --------------------------------------------------------------&lt;br /&gt;
   type: need (Das brauchst Du) oder hint (Hinweise)   when = Bedingung auf die Felder&lt;br /&gt;
   opts = diese Zusatzoptionen müssen gewählt sein      items = Artikel   html = Text&lt;br /&gt;
   Abgeleitete Werte: gen (alt/b/c) und module (ja/nein/unk = Radiomodul im Kofferraum, nur gen alt) */&lt;br /&gt;
var RULES = [&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { current: [&amp;quot;werk&amp;quot;], module: [&amp;quot;ja&amp;quot;] }, items: [&amp;quot;exl005&amp;quot;, &amp;quot;fakra6m&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { current: [&amp;quot;nach&amp;quot;], module: [&amp;quot;ja&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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=&amp;quot; + P.noquad + &amp;quot;][img=&amp;quot; + P.noexl6 + &amp;quot;]&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;ja&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;nein&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;unk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { ant: [&amp;quot;iso&amp;quot;] }, items: [&amp;quot;isoada&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { ant: [&amp;quot;unk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Antennenstecker:[/b] [b]BM24[/b] (Rundpin) = ISO-Antennenstecker, ggf. wird der [a=&amp;quot; + SHOP + &amp;quot;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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { sound: [&amp;quot;dsp&amp;quot;] }, items: [&amp;quot;bcdsp&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { sound: [&amp;quot;dsp&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]DSP:[/b] Damit das Werks-DSP überhaupt arbeitet, wird die I-BUS App mit BC+DSP Lizenz benötigt.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { sound: [&amp;quot;hk&amp;quot;], gen: [&amp;quot;alt&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Harman Kardon:[/b] Benötigt [b]keine[/b] DSP-Lizenz. Das Remote-Signal (+12 V, wenn Radio an) genügt zum Starten.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { aux: [&amp;quot;nein&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]AUX-IN:[/b] Der AUX-IN muss codiert werden. Optional kann ein FM-Transmitter genutzt werden - das ist nicht empfohlen.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;7er-e38&amp;quot;, &amp;quot;x5-e53&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Montage:[/b] Radios für BMW E38/E53 benötigen keine extra Halterungen.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;5er-e39&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;3er-e46&amp;quot;], factory: [&amp;quot;iris&amp;quot;, &amp;quot;mid&amp;quot;, &amp;quot;pfeil&amp;quot;], current: [&amp;quot;werk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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]&amp;quot; +&lt;br /&gt;
          &amp;quot;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]&amp;quot; +&lt;br /&gt;
          &amp;quot;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=&amp;quot; + P.funktr + &amp;quot;]&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { factory: [&amp;quot;cic&amp;quot;, &amp;quot;nbt&amp;quot;, &amp;quot;nbtevo&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Lichtleiter:[/b] Ggf. vorhandene Lichtleiter (MOST) müssen aus dem BMW-Stecker in den Xtrons-Adapter umgesteckt werden.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { factory: [&amp;quot;mask&amp;quot;, &amp;quot;ccc&amp;quot;, &amp;quot;cic&amp;quot;, &amp;quot;nbt&amp;quot;, &amp;quot;nbtevo&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, opts: [&amp;quot;kcan&amp;quot;], when: {},&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, opts: [&amp;quot;ibus&amp;quot;], when: {},&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: {},&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot; }&lt;br /&gt;
];&lt;br /&gt;
/* =====================================================================&lt;br /&gt;
   PROGRAMMLOGIK&lt;br /&gt;
   ===================================================================== */&lt;br /&gt;
var $ = function (id) { return document.getElementById(id); };&lt;br /&gt;
var sel = {}, picked = {}, summary = &amp;quot;&amp;quot;, capA = 0, capB = 0;&lt;br /&gt;
var fieldsEl = $(&amp;quot;nvk-fields&amp;quot;), optsEl = $(&amp;quot;nvk-opts&amp;quot;), outEl = $(&amp;quot;nvk-out&amp;quot;);&lt;br /&gt;
function full(u) { return u.indexOf(&amp;quot;/thumb/&amp;quot;) === -1 ? u : u.replace(&amp;quot;/thumb/&amp;quot;, &amp;quot;/&amp;quot;).replace(/\/[^\/]+$/, &amp;quot;&amp;quot;); }&lt;br /&gt;
function fmt(t) {&lt;br /&gt;
  return t.replace(/\[img=([^\x5D]+)\]/g, function (m, u) {&lt;br /&gt;
    return &amp;quot;\u003Ca href=\&amp;quot;&amp;quot; + full(u) + &amp;quot;\&amp;quot; target=\&amp;quot;_blank\&amp;quot; rel=\&amp;quot;noopener\&amp;quot;\u003E\u003Cimg class=\&amp;quot;nvk-img\&amp;quot; src=\&amp;quot;&amp;quot; + u + &amp;quot;\&amp;quot; alt=\&amp;quot;\&amp;quot;\u003E\u003C/a\u003E&amp;quot;;&lt;br /&gt;
  }).replace(/\[b\]/g, &amp;quot;\u003Cb\u003E&amp;quot;).replace(/\[\/b\]/g, &amp;quot;\u003C/b\u003E&amp;quot;).replace(/\[br\]/g, &amp;quot;\u003Cbr\u003E&amp;quot;)&lt;br /&gt;
    .replace(/\[a=([^\x5D]+)\]/g, &amp;quot;\u003Ca href=\&amp;quot;$1\&amp;quot; target=\&amp;quot;_blank\&amp;quot; rel=\&amp;quot;noopener\&amp;quot;\u003E&amp;quot;).replace(/\[\/a\]/g, &amp;quot;\u003C/a\u003E&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
function match(cond, s, lenient) {&lt;br /&gt;
  if (!cond) return true;&lt;br /&gt;
  for (var k in cond) {&lt;br /&gt;
    if (!s[k]) { if (lenient) continue; return false; }&lt;br /&gt;
    if (cond[k].indexOf(s[k]) === -1) return false;&lt;br /&gt;
  }&lt;br /&gt;
  return true;&lt;br /&gt;
}&lt;br /&gt;
function vehicleOf(id) { return VEHICLES.filter(function (x) { return x.v === id; })[0]; }&lt;br /&gt;
function derive() {&lt;br /&gt;
  var s = {}, k;&lt;br /&gt;
  for (k in sel) s[k] = sel[k];&lt;br /&gt;
  var veh = vehicleOf(sel.vehicle);&lt;br /&gt;
  if (veh) s.gen = veh.gen;&lt;br /&gt;
  if (s.gen === &amp;quot;alt&amp;quot;) {&lt;br /&gt;
    if (s.factory === &amp;quot;n43&amp;quot; || s.factory === &amp;quot;n169&amp;quot;) s.module = &amp;quot;ja&amp;quot;;&lt;br /&gt;
    else if (s.factory === &amp;quot;iris&amp;quot; || s.factory === &amp;quot;mid&amp;quot;) s.module = &amp;quot;nein&amp;quot;;&lt;br /&gt;
    else if (s.factory === &amp;quot;pfeil&amp;quot;) s.module = s.trunk || &amp;quot;unk&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  return s;&lt;br /&gt;
}&lt;br /&gt;
function forced(s) {&lt;br /&gt;
  var f = {};&lt;br /&gt;
  FORCED.forEach(function (r) { if (match(r.when, s)) r.opts.forEach(function (o) { f[o] = r.why; }); });&lt;br /&gt;
  return f;&lt;br /&gt;
}&lt;br /&gt;
function onSet(s) {&lt;br /&gt;
  var f = forced(s), on = {}, k;&lt;br /&gt;
  for (k in picked) if (picked[k]) on[k] = true;&lt;br /&gt;
  for (k in f) on[k] = true;&lt;br /&gt;
  return { on: on, forced: f };&lt;br /&gt;
}&lt;br /&gt;
function optVisible(o, s, on) {&lt;br /&gt;
  if (!match(o.show, s, true)) return false;&lt;br /&gt;
  return (o.requires || []).every(function (r) { return on[r]; });&lt;br /&gt;
}&lt;br /&gt;
FIELDS.forEach(function (f) {&lt;br /&gt;
  var wrap = document.createElement(&amp;quot;div&amp;quot;); wrap.className = &amp;quot;nvk-f&amp;quot;; wrap.id = &amp;quot;nvk-w-&amp;quot; + f.id;&lt;br /&gt;
  var lab = document.createElement(&amp;quot;label&amp;quot;); lab.htmlFor = &amp;quot;nvk-&amp;quot; + f.id; lab.textContent = f.label;&lt;br /&gt;
  var s = document.createElement(&amp;quot;select&amp;quot;); s.id = &amp;quot;nvk-&amp;quot; + f.id;&lt;br /&gt;
  s.addEventListener(&amp;quot;change&amp;quot;, function () { sel[f.id] = s.value; update(); });&lt;br /&gt;
  wrap.appendChild(lab); wrap.appendChild(s);&lt;br /&gt;
  if (f.help) { var h = document.createElement(&amp;quot;div&amp;quot;); h.className = &amp;quot;nvk-help&amp;quot;; h.innerHTML = fmt(f.help); wrap.appendChild(h); }&lt;br /&gt;
  var inf = document.createElement(&amp;quot;div&amp;quot;); inf.id = &amp;quot;nvk-i-&amp;quot; + f.id; wrap.appendChild(inf);&lt;br /&gt;
  fieldsEl.appendChild(wrap);&lt;br /&gt;
});&lt;br /&gt;
function renderFields() {&lt;br /&gt;
  FIELDS.forEach(function (f) {&lt;br /&gt;
    var s = derive();&lt;br /&gt;
    var wrap = $(&amp;quot;nvk-w-&amp;quot; + f.id), el = $(&amp;quot;nvk-&amp;quot; + f.id);&lt;br /&gt;
    var vis = f.show ? match(f.show, s, false) : true;&lt;br /&gt;
    wrap.style.display = vis ? &amp;quot;&amp;quot; : &amp;quot;none&amp;quot;;&lt;br /&gt;
    if (!vis) { sel[f.id] = &amp;quot;&amp;quot;; return; }&lt;br /&gt;
    var allowed = f.values.filter(function (v) { return match(v.only, s, true); });&lt;br /&gt;
    if (sel[f.id]) { if (!allowed.some(function (v) { return v.v === sel[f.id]; })) sel[f.id] = &amp;quot;&amp;quot;; }&lt;br /&gt;
    if (!sel[f.id]) { if (f.def) sel[f.id] = f.def; }&lt;br /&gt;
    if (!sel[f.id]) { if (f.auto) { if (sel.vehicle) { if (allowed.length === 1) sel[f.id] = allowed[0].v; } } }&lt;br /&gt;
    el.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
    if (!f.def) { var p = document.createElement(&amp;quot;option&amp;quot;); p.value = &amp;quot;&amp;quot;; p.textContent = &amp;quot;– bitte wählen –&amp;quot;; el.appendChild(p); }&lt;br /&gt;
    allowed.forEach(function (v) {&lt;br /&gt;
      var o = document.createElement(&amp;quot;option&amp;quot;); o.value = v.v; o.textContent = v.t; el.appendChild(o);&lt;br /&gt;
    });&lt;br /&gt;
    el.value = sel[f.id] || &amp;quot;&amp;quot;;&lt;br /&gt;
    var cur = allowed.filter(function (v) { return v.v === sel[f.id]; })[0];&lt;br /&gt;
    $(&amp;quot;nvk-i-&amp;quot; + f.id).innerHTML = cur ? (cur.info ? fmt(cur.info) : &amp;quot;&amp;quot;) : &amp;quot;&amp;quot;;&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
function renderOpts() {&lt;br /&gt;
  var s = derive(), st = onSet(s);&lt;br /&gt;
  OPTS.forEach(function (o) { if (!optVisible(o, s, st.on)) picked[o.id] = false; });&lt;br /&gt;
  st = onSet(s);&lt;br /&gt;
  optsEl.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
  OPTS.forEach(function (o) {&lt;br /&gt;
    if (!optVisible(o, s, st.on)) return;&lt;br /&gt;
    var lab = document.createElement(&amp;quot;label&amp;quot;); lab.className = &amp;quot;nvk-o&amp;quot;;&lt;br /&gt;
    var cb = document.createElement(&amp;quot;input&amp;quot;); cb.type = &amp;quot;checkbox&amp;quot;;&lt;br /&gt;
    cb.checked = !!st.on[o.id];&lt;br /&gt;
    var isForced = !!st.forced[o.id];&lt;br /&gt;
    if (isForced) { cb.disabled = true; lab.className += &amp;quot; dis&amp;quot;; }&lt;br /&gt;
    cb.addEventListener(&amp;quot;change&amp;quot;, function () {&lt;br /&gt;
      picked[o.id] = cb.checked;&lt;br /&gt;
      if (cb.checked) { if (o.excl) OPTS.forEach(function (x) { if (x.excl === o.excl) { if (x.id !== o.id) picked[x.id] = false; } }); }&lt;br /&gt;
      update();&lt;br /&gt;
    });&lt;br /&gt;
    lab.appendChild(cb);&lt;br /&gt;
    lab.appendChild(document.createTextNode(&amp;quot; &amp;quot; + o.t));&lt;br /&gt;
    var sub = [o.sub, isForced ? st.forced[o.id] : &amp;quot;&amp;quot;].filter(Boolean).join(&amp;quot; - &amp;quot;);&lt;br /&gt;
    if (sub) { var sm = document.createElement(&amp;quot;small&amp;quot;); sm.textContent = &amp;quot; (&amp;quot; + sub + &amp;quot;)&amp;quot;; lab.appendChild(sm); }&lt;br /&gt;
    optsEl.appendChild(lab);&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
function link(url, text) {&lt;br /&gt;
  var a = document.createElement(&amp;quot;a&amp;quot;); a.href = url; a.target = &amp;quot;_blank&amp;quot;; a.rel = &amp;quot;noopener&amp;quot;; a.textContent = text; return a;&lt;br /&gt;
}&lt;br /&gt;
function card(item, cls) {&lt;br /&gt;
  var d = document.createElement(&amp;quot;div&amp;quot;); d.className = &amp;quot;nvk-card &amp;quot; + (cls || &amp;quot;&amp;quot;);&lt;br /&gt;
  var b = document.createElement(&amp;quot;b&amp;quot;); b.textContent = item.t; d.appendChild(b);&lt;br /&gt;
  if (item.d) { var p = document.createElement(&amp;quot;span&amp;quot;); p.textContent = item.d; d.appendChild(p); }&lt;br /&gt;
  if (item.img) {&lt;br /&gt;
    var im = document.createElement(&amp;quot;div&amp;quot;);&lt;br /&gt;
    item.img.forEach(function (u) {&lt;br /&gt;
      var a = document.createElement(&amp;quot;a&amp;quot;); a.href = full(u); a.target = &amp;quot;_blank&amp;quot;; a.rel = &amp;quot;noopener&amp;quot;;&lt;br /&gt;
      var g = document.createElement(&amp;quot;img&amp;quot;); g.className = &amp;quot;nvk-img&amp;quot;; g.src = u; g.alt = item.t; a.appendChild(g); im.appendChild(a);&lt;br /&gt;
    });&lt;br /&gt;
    d.appendChild(im);&lt;br /&gt;
  }&lt;br /&gt;
  if (item.u || item.w) {&lt;br /&gt;
    var l = document.createElement(&amp;quot;div&amp;quot;); l.className = &amp;quot;nvk-links&amp;quot;;&lt;br /&gt;
    if (item.u) l.appendChild(link(item.u, item.ut || &amp;quot;Im Shop ansehen →&amp;quot;));&lt;br /&gt;
    if (item.w) l.appendChild(link(item.w, (item.wt || &amp;quot;Zum Wiki&amp;quot;) + &amp;quot; →&amp;quot;));&lt;br /&gt;
    d.appendChild(l);&lt;br /&gt;
  }&lt;br /&gt;
  return d;&lt;br /&gt;
}&lt;br /&gt;
function heading(txt) { var h = document.createElement(&amp;quot;h3&amp;quot;); h.textContent = txt; outEl.appendChild(h); }&lt;br /&gt;
function renderResult() {&lt;br /&gt;
  var s = derive(), st = onSet(s);&lt;br /&gt;
  var missing = FIELDS.filter(function (f) {&lt;br /&gt;
    var w = $(&amp;quot;nvk-w-&amp;quot; + f.id);&lt;br /&gt;
    return w.style.display !== &amp;quot;none&amp;quot; ? (!f.optional ? !sel[f.id] : false) : false;&lt;br /&gt;
  });&lt;br /&gt;
  outEl.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
  if (missing.length) {&lt;br /&gt;
    var m = document.createElement(&amp;quot;p&amp;quot;); m.className = &amp;quot;nvk-miss&amp;quot;;&lt;br /&gt;
    m.textContent = &amp;quot;Bitte noch auswählen: &amp;quot; + missing.map(function (f) { return f.label; }).join(&amp;quot;, &amp;quot;);&lt;br /&gt;
    outEl.appendChild(m); $(&amp;quot;nvk-form&amp;quot;).style.display = &amp;quot;none&amp;quot;; return;&lt;br /&gt;
  }&lt;br /&gt;
  $(&amp;quot;nvk-form&amp;quot;).style.display = &amp;quot;&amp;quot;;&lt;br /&gt;
  var needs = [], hints = [], seen = {};&lt;br /&gt;
  RULES.forEach(function (r) {&lt;br /&gt;
    if (!match(r.when, s)) return;&lt;br /&gt;
    if (r.opts) { if (!r.opts.every(function (o) { return st.on[o]; })) return; }&lt;br /&gt;
    if (r.type === &amp;quot;need&amp;quot;) (r.items || []).forEach(function (id) { if (!seen[id]) { seen[id] = 1; needs.push(ITEMS[id]); } });&lt;br /&gt;
    else hints.push(r.html);&lt;br /&gt;
  });&lt;br /&gt;
  heading(&amp;quot;Das brauchst Du&amp;quot;);&lt;br /&gt;
  if (needs.length) needs.forEach(function (i) { outEl.appendChild(card(i)); });&lt;br /&gt;
  else { var n = document.createElement(&amp;quot;p&amp;quot;); n.textContent = &amp;quot;Für die Grundinstallation sind keine zusätzlichen Verlängerungen oder Adapter nötig.&amp;quot;; outEl.appendChild(n); }&lt;br /&gt;
  var opt = [];&lt;br /&gt;
  OPTS.forEach(function (o) {&lt;br /&gt;
    if (!st.on[o.id]) return;&lt;br /&gt;
    if (!optVisible(o, s, st.on)) return;&lt;br /&gt;
    o.items.forEach(function (id) {&lt;br /&gt;
      if (seen[id]) return;&lt;br /&gt;
      var sk = ITEMS[id].skipIf;&lt;br /&gt;
      if (sk) { if (seen[sk]) return; }&lt;br /&gt;
      seen[id] = 1; opt.push(ITEMS[id]);&lt;br /&gt;
    });&lt;br /&gt;
  });&lt;br /&gt;
  if (opt.length) { heading(&amp;quot;Deine Zusatzoptionen&amp;quot;); opt.forEach(function (i) { outEl.appendChild(card(i, &amp;quot;opt&amp;quot;)); }); }&lt;br /&gt;
  if (hints.length) {&lt;br /&gt;
    heading(&amp;quot;Hinweise&amp;quot;);&lt;br /&gt;
    hints.forEach(function (t) { var d = document.createElement(&amp;quot;div&amp;quot;); d.className = &amp;quot;nvk-note&amp;quot;; d.innerHTML = fmt(t); outEl.appendChild(d); });&lt;br /&gt;
  }&lt;br /&gt;
  var veh = vehicleOf(sel.vehicle);&lt;br /&gt;
  var ru = veh.noCat ? SHOP + &amp;quot;bmw-radios/&amp;quot; : SHOP + &amp;quot;bmw-radios/&amp;quot; + veh.v + &amp;quot;/&amp;quot;;&lt;br /&gt;
  heading(&amp;quot;Passende Radios&amp;quot;);&lt;br /&gt;
  outEl.appendChild(card({ t: &amp;quot;BMW Radios für &amp;quot; + veh.t, d: &amp;quot;Alle Radios, die für Deinen BMW &amp;quot; + veh.t + &amp;quot; im Shop erhältlich sind.&amp;quot;,&lt;br /&gt;
    u: ru, ut: &amp;quot;Zu den passenden Radios →&amp;quot;, w: SHOP + &amp;quot;bmw-radios/&amp;quot;, wt: &amp;quot;Alle BMW Radios&amp;quot; }, &amp;quot;rad&amp;quot;));&lt;br /&gt;
  var L = [&amp;quot;KONFIGURATION&amp;quot;];&lt;br /&gt;
  FIELDS.forEach(function (f) {&lt;br /&gt;
    if (!sel[f.id]) return;&lt;br /&gt;
    var v = f.values.filter(function (x) { return x.v === sel[f.id]; })[0];&lt;br /&gt;
    if (v) L.push(&amp;quot;- &amp;quot; + f.label + &amp;quot;: &amp;quot; + v.t);&lt;br /&gt;
  });&lt;br /&gt;
  L.push(&amp;quot;&amp;quot;, &amp;quot;BENÖTIGT&amp;quot;);&lt;br /&gt;
  needs.forEach(function (i) { L.push(&amp;quot;- &amp;quot; + i.t + (i.u ? &amp;quot;  &amp;quot; + i.u : &amp;quot;&amp;quot;)); });&lt;br /&gt;
  if (opt.length) { L.push(&amp;quot;&amp;quot;, &amp;quot;ZUSATZOPTIONEN&amp;quot;); opt.forEach(function (i) { L.push(&amp;quot;- &amp;quot; + i.t + (i.u ? &amp;quot;  &amp;quot; + i.u : &amp;quot;&amp;quot;)); }); }&lt;br /&gt;
  L.push(&amp;quot;&amp;quot;, &amp;quot;Radios: &amp;quot; + ru);&lt;br /&gt;
  summary = L.join(&amp;quot;\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
function update() { renderFields(); renderOpts(); renderResult(); }&lt;br /&gt;
function newCaptcha() {&lt;br /&gt;
  capA = 1 + Math.floor(Math.random() * 9); capB = 1 + Math.floor(Math.random() * 9);&lt;br /&gt;
  $(&amp;quot;nvk-capq&amp;quot;).textContent = &amp;quot;Sicherheitsfrage: Was ist &amp;quot; + capA + &amp;quot; + &amp;quot; + capB + &amp;quot;? *&amp;quot;; $(&amp;quot;nvk-cap&amp;quot;).value = &amp;quot;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
function status(msg, ok) { var e = $(&amp;quot;nvk-status&amp;quot;); e.style.display = &amp;quot;&amp;quot;; e.textContent = msg; e.style.borderLeftColor = ok ? &amp;quot;#14866d&amp;quot; : &amp;quot;#d33&amp;quot;; }&lt;br /&gt;
$(&amp;quot;nvk-send&amp;quot;).addEventListener(&amp;quot;click&amp;quot;, function () {&lt;br /&gt;
  var name = $(&amp;quot;nvk-name&amp;quot;).value.trim(), mail = $(&amp;quot;nvk-mail&amp;quot;).value.trim(), vin = $(&amp;quot;nvk-vin&amp;quot;).value.trim().toUpperCase(), msg = $(&amp;quot;nvk-msg&amp;quot;).value.trim();&lt;br /&gt;
  if (!name || !mail || !msg) return status(&amp;quot;Bitte Name, E-Mail und Kommentar ausfüllen.&amp;quot;, false);&lt;br /&gt;
  if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(mail)) return status(&amp;quot;Bitte eine gültige E-Mail-Adresse eingeben.&amp;quot;, false);&lt;br /&gt;
  if (vin) { if (!/^[A-Z]{2}[0-9]{5}$/.test(vin)) { if (!/^[A-HJ-NPR-Z0-9]{17}$/.test(vin)) return status(&amp;quot;Bitte die VIN im Format AB12345 oder die 17-stellige FGN eingeben - oder das Feld leer lassen.&amp;quot;, false); } }&lt;br /&gt;
  if (parseInt($(&amp;quot;nvk-cap&amp;quot;).value, 10) !== capA + capB) return status(&amp;quot;Die Sicherheitsfrage wurde nicht richtig beantwortet.&amp;quot;, false);&lt;br /&gt;
  if (!$(&amp;quot;nvk-dsgvo&amp;quot;).checked) return status(&amp;quot;Bitte der Verarbeitung Deiner Daten zustimmen.&amp;quot;, false);&lt;br /&gt;
  if ($(&amp;quot;nvk-hp&amp;quot;).value) return;&lt;br /&gt;
  var text = &amp;quot;Name: &amp;quot; + name + &amp;quot;\nE-Mail: &amp;quot; + mail + &amp;quot;\nVIN: &amp;quot; + (vin || &amp;quot;-&amp;quot;) + &amp;quot;\n\nKommentar:\n&amp;quot; + msg + &amp;quot;\n\n&amp;quot; + summary;&lt;br /&gt;
  if (SEND_URL) {&lt;br /&gt;
    var p = new URLSearchParams();&lt;br /&gt;
    p.append(&amp;quot;name&amp;quot;, name); p.append(&amp;quot;mail&amp;quot;, mail); p.append(&amp;quot;vin&amp;quot;, vin); p.append(&amp;quot;msg&amp;quot;, msg); p.append(&amp;quot;summary&amp;quot;, summary);&lt;br /&gt;
    p.append(&amp;quot;hp&amp;quot;, $(&amp;quot;nvk-hp&amp;quot;).value); p.append(&amp;quot;ca&amp;quot;, capA); p.append(&amp;quot;cb&amp;quot;, capB); p.append(&amp;quot;cv&amp;quot;, $(&amp;quot;nvk-cap&amp;quot;).value);&lt;br /&gt;
    fetch(SEND_URL, { method: &amp;quot;POST&amp;quot;, body: p }).then(function (r) {&lt;br /&gt;
      if (!r.ok) throw new Error(&amp;quot;send&amp;quot;);&lt;br /&gt;
      status(&amp;quot;Danke! Deine Anfrage wurde gesendet, eine Kopie geht an &amp;quot; + mail + &amp;quot;.&amp;quot;, true); newCaptcha();&lt;br /&gt;
    }).catch(function () { status(&amp;quot;Das Senden hat nicht geklappt. Bitte versuche es später noch einmal oder schreibe direkt an &amp;quot; + MAIL_TO + &amp;quot;.&amp;quot;, false); });&lt;br /&gt;
  } else {&lt;br /&gt;
    var AMP = &amp;quot;\u0026&amp;quot;;&lt;br /&gt;
    window.location.href = &amp;quot;mailto:&amp;quot; + MAIL_TO + &amp;quot;?cc=&amp;quot; + encodeURIComponent(mail) + AMP + &amp;quot;subject=&amp;quot; + encodeURIComponent(MAIL_SUBJECT) + AMP + &amp;quot;body=&amp;quot; + encodeURIComponent(text);&lt;br /&gt;
    status(&amp;quot;Dein E-Mail-Programm wurde mit der fertigen Anfrage geöffnet. Bitte dort noch auf Senden klicken.&amp;quot;, true);&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
$(&amp;quot;nvk-reset&amp;quot;).addEventListener(&amp;quot;click&amp;quot;, function () { sel = {}; picked = {}; update(); });&lt;br /&gt;
newCaptcha();&lt;br /&gt;
update();&lt;br /&gt;
})();&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andre</name></author>
	</entry>
	<entry>
		<id>https://xtrons.ibus-app.de/index.php?title=Android_Radio_Konfigurator&amp;diff=4077</id>
		<title>Android Radio Konfigurator</title>
		<link rel="alternate" type="text/html" href="https://xtrons.ibus-app.de/index.php?title=Android_Radio_Konfigurator&amp;diff=4077"/>
		<updated>2026-10-21T11:50:27Z</updated>

		<summary type="html">&lt;p&gt;Andre: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;html&amp;gt;&amp;lt;div id=&amp;quot;nvk&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
#nvk{max-width:900px;line-height:1.45}&lt;br /&gt;
#nvk *{box-sizing:border-box}&lt;br /&gt;
#nvk .nvk-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:14px;margin:12px 0}&lt;br /&gt;
#nvk .nvk-f label{display:block;font-weight:700;margin-bottom:4px}&lt;br /&gt;
#nvk select{width:100%;padding:9px 8px;font:inherit;color:#202122;background:#fff;border:1px solid #a2a9b1;border-radius:4px}&lt;br /&gt;
#nvk .nvk-help{font-size:.85em;opacity:.75;margin-top:3px}&lt;br /&gt;
#nvk fieldset{border:1px solid rgba(128,128,128,.45);border-radius:6px;padding:10px 14px;margin:14px 0}&lt;br /&gt;
#nvk legend{font-weight:700;padding:0 6px}&lt;br /&gt;
#nvk .nvk-o{display:block;padding:4px 0;cursor:pointer}&lt;br /&gt;
#nvk .nvk-o small{opacity:.7}&lt;br /&gt;
#nvk .nvk-o.dis{opacity:.75;cursor:default}&lt;br /&gt;
#nvk .nvk-btn{padding:7px 14px;font:inherit;border:1px solid #a2a9b1;border-radius:4px;background:#f8f9fa;color:#202122;cursor:pointer}&lt;br /&gt;
#nvk #nvk-out{margin-top:18px}&lt;br /&gt;
#nvk h3{margin:18px 0 8px}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-card.opt{border-left-color:#14866d}&lt;br /&gt;
#nvk .nvk-card.rad{border-left-color:#d9400b}&lt;br /&gt;
#nvk .nvk-card b{display:block}&lt;br /&gt;
#nvk .nvk-links{margin-top:4px;font-weight:600}&lt;br /&gt;
#nvk .nvk-links a{margin-right:14px}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-miss{opacity:.8;font-style:italic}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-card .nvk-img{max-width:230px;max-height:150px}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk #nvk-form{margin-top:22px}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-grid&amp;quot; id=&amp;quot;nvk-fields&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;fieldset id=&amp;quot;nvk-optset&amp;quot;&amp;gt;&amp;lt;legend&amp;gt;Zusatzoptionen&amp;lt;/legend&amp;gt;&amp;lt;div id=&amp;quot;nvk-opts&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/fieldset&amp;gt;&lt;br /&gt;
&amp;lt;button type=&amp;quot;button&amp;quot; class=&amp;quot;nvk-btn&amp;quot; id=&amp;quot;nvk-reset&amp;quot;&amp;gt;Auswahl zurücksetzen&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk-out&amp;quot; aria-live=&amp;quot;polite&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;fieldset id=&amp;quot;nvk-form&amp;quot; style=&amp;quot;display:none&amp;quot;&amp;gt;&amp;lt;legend&amp;gt;Anfrage senden&amp;lt;/legend&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;nvk-help&amp;quot;&amp;gt;Deine Auswahl und die Liste oben werden automatisch mitgesendet. Alle Felder mit * sind Pflicht.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-grid&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-name&amp;quot;&amp;gt;Name *&amp;lt;/label&amp;gt;&amp;lt;input id=&amp;quot;nvk-name&amp;quot; type=&amp;quot;text&amp;quot; autocomplete=&amp;quot;name&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-mail&amp;quot;&amp;gt;E-Mail *&amp;lt;/label&amp;gt;&amp;lt;input id=&amp;quot;nvk-mail&amp;quot; type=&amp;quot;email&amp;quot; autocomplete=&amp;quot;email&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-vin&amp;quot;&amp;gt;VIN (optional)&amp;lt;/label&amp;gt;&amp;lt;input id=&amp;quot;nvk-vin&amp;quot; type=&amp;quot;text&amp;quot; maxlength=&amp;quot;17&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-msg&amp;quot;&amp;gt;Kommentar *&amp;lt;/label&amp;gt;&amp;lt;textarea id=&amp;quot;nvk-msg&amp;quot; rows=&amp;quot;4&amp;quot;&amp;gt;&amp;lt;/textarea&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-f&amp;quot; style=&amp;quot;max-width:300px&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;nvk-cap&amp;quot; id=&amp;quot;nvk-capq&amp;quot;&amp;gt;Sicherheitsfrage *&amp;lt;/label&amp;gt;&amp;lt;input id=&amp;quot;nvk-cap&amp;quot; type=&amp;quot;text&amp;quot; inputmode=&amp;quot;numeric&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;input id=&amp;quot;nvk-hp&amp;quot; type=&amp;quot;text&amp;quot; tabindex=&amp;quot;-1&amp;quot; autocomplete=&amp;quot;off&amp;quot; aria-hidden=&amp;quot;true&amp;quot; style=&amp;quot;position:absolute;left:-9999px;width:1px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;label class=&amp;quot;nvk-o&amp;quot;&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; id=&amp;quot;nvk-dsgvo&amp;quot;&amp;gt; Ich stimme zu, dass meine Angaben zur Bearbeitung der Anfrage per E-Mail verarbeitet werden. *&amp;lt;/label&amp;gt;&lt;br /&gt;
&amp;lt;button type=&amp;quot;button&amp;quot; class=&amp;quot;nvk-btn&amp;quot; id=&amp;quot;nvk-send&amp;quot;&amp;gt;Anfrage senden&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk-status&amp;quot; class=&amp;quot;nvk-note&amp;quot; style=&amp;quot;display:none&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/fieldset&amp;gt;&lt;br /&gt;
&amp;lt;noscript&amp;gt;Für den Konfigurator wird JavaScript benötigt.&amp;lt;/noscript&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
var SEND_URL = &amp;quot;https://xtrons.ibus-app.de/send-anfrage.php&amp;quot;;&lt;br /&gt;
(function () {&lt;br /&gt;
&amp;quot;use strict&amp;quot;;&lt;br /&gt;
/* =====================================================================&lt;br /&gt;
   KONFIGURATION - hier wird gepflegt.&lt;br /&gt;
   Textformat in Hinweisen: [b]fett[/b]  [br] Zeilenumbruch  [a=URL]Linktext[/a]&lt;br /&gt;
   Bitte im Skript KEIN kaufmännisches Und, kein Kleiner-/Größer-Zeichen&lt;br /&gt;
   und keine Leerzeilen verwenden (das Wiki wandelt sie um).&lt;br /&gt;
   ===================================================================== */&lt;br /&gt;
var SHOP = &amp;quot;https://shop.ibus-app.de/&amp;quot;;&lt;br /&gt;
var WIKI = &amp;quot;https://wiki.ibus-app.de/index.php?title=&amp;quot;;&lt;br /&gt;
/* Bilder aus dem Wiki (Thumbnail-Adressen; Klick öffnet automatisch das Originalbild) */&lt;br /&gt;
var IM = &amp;quot;https://xtrons.ibus-app.de/images/thumb/&amp;quot;;&lt;br /&gt;
var P = {&lt;br /&gt;
  schema:  IM + &amp;quot;e/ea/BMW_E39_Verl%C3%A4ngerungen_EXL005%2BFAKRA_.png/135px-BMW_E39_Verl%C3%A4ngerungen_EXL005%2BFAKRA_.png&amp;quot;,&lt;br /&gt;
  exl005:  IM + &amp;quot;7/70/Exl005-1.webp/257px-Exl005-1.webp.png&amp;quot;,&lt;br /&gt;
  fakra6m: IM + &amp;quot;d/d8/FM-extension_01_1.png/270px-FM-extension_01_1.png&amp;quot;,&lt;br /&gt;
  isofakra: IM + &amp;quot;4/4e/ISO-FAKRA_1.png/270px-ISO-FAKRA_1.png&amp;quot;,&lt;br /&gt;
  bm24:    IM + &amp;quot;8/82/BM24.png/130px-BM24.png&amp;quot;,&lt;br /&gt;
  iso:     IM + &amp;quot;d/dd/Iso.jpg/69px-Iso.jpg&amp;quot;,&lt;br /&gt;
  bm54:    IM + &amp;quot;3/34/BM54.png/135px-BM54.png&amp;quot;,&lt;br /&gt;
  fakra:   IM + &amp;quot;b/b3/Fakra.jpg/100px-Fakra.jpg&amp;quot;,&lt;br /&gt;
  pfeil:   IM + &amp;quot;e/ee/Navi_E46.jpg/239px-Navi_E46.jpg&amp;quot;,&lt;br /&gt;
  noquad:  IM + &amp;quot;6/68/No_elongation.jpg/180px-No_elongation.jpg&amp;quot;,&lt;br /&gt;
  noexl6:  IM + &amp;quot;7/7b/No_EXL006.jpg/180px-No_EXL006.jpg&amp;quot;,&lt;br /&gt;
  halter:  IM + &amp;quot;3/3b/Halter_Alu.webp/92px-Halter_Alu.webp.png&amp;quot;,&lt;br /&gt;
  funktr:  IM + &amp;quot;7/7e/E46_Funktionstraeger.png/240px-E46_Funktionstraeger.png&amp;quot;&lt;br /&gt;
};&lt;br /&gt;
/* Anfrage-Formular: MAIL_TO = Empfänger. SEND_URL leer = E-Mail-Programm des Kunden öffnen (mailto).&lt;br /&gt;
   SEND_URL = Adresse des Server-Skripts send-anfrage.php = Versand direkt vom Server (mit CC an den Kunden). */&lt;br /&gt;
var MAIL_TO = &amp;quot;info@ibus-app.de&amp;quot;;&lt;br /&gt;
var MAIL_SUBJECT = &amp;quot;Anfrage aus Android Radio Konfigurator&amp;quot;;&lt;br /&gt;
var SEND_URL = &amp;quot;&amp;quot;;&lt;br /&gt;
/* ---- 1) Baureihen --------------------------------------------------------&lt;br /&gt;
   v = Shop-Kategorie (Link: SHOP + bmw-radios/ + v + /)&lt;br /&gt;
   gen: alt = I-BUS-Fahrzeuge (E38/E39/E46/E53/E83)&lt;br /&gt;
        b   = M-ASK / CCC / CIC     c = CIC / NBT / NBT EVO&lt;br /&gt;
   body = Karosserieformen (siehe BODY)                                      */&lt;br /&gt;
var BODY = { limo: &amp;quot;Limousine&amp;quot;, touring: &amp;quot;Touring&amp;quot;, coupe: &amp;quot;Coupé&amp;quot;, cabrio: &amp;quot;Cabrio&amp;quot;, schraeg: &amp;quot;Schrägheck&amp;quot;,&lt;br /&gt;
  compact: &amp;quot;Compact&amp;quot;, gt: &amp;quot;Gran Turismo&amp;quot;, gc: &amp;quot;Gran Coupé&amp;quot;, suv: &amp;quot;SUV / SAV&amp;quot;, roadster: &amp;quot;Roadster&amp;quot; };&lt;br /&gt;
var VEHICLES = [&lt;br /&gt;
  { v: &amp;quot;1er-e8x&amp;quot;, t: &amp;quot;1er E8x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;schraeg,coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;1er-f2x&amp;quot;, t: &amp;quot;1er F2x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;schraeg&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;2er-f2x&amp;quot;, t: &amp;quot;2er F2x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;3er-e46&amp;quot;, t: &amp;quot;3er E46&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;limo,touring,coupe,cabrio,compact&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;3er-e9x&amp;quot;, t: &amp;quot;3er E9x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;limo,touring,coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;3er-f3x&amp;quot;, t: &amp;quot;3er F3x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;limo,touring,gt&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;4er-f3x&amp;quot;, t: &amp;quot;4er F3x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;coupe,cabrio,gc&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;5er-e39&amp;quot;, t: &amp;quot;5er E39&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;limo,touring&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;5er-e6x&amp;quot;, t: &amp;quot;5er E6x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;limo,touring&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;5er-f1x&amp;quot;, t: &amp;quot;5er F1x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;limo,touring,gt&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;6er-e6x&amp;quot;, t: &amp;quot;6er E6x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;7er-e38&amp;quot;, t: &amp;quot;7er E38&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;limo&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;7er-e65&amp;quot;, t: &amp;quot;7er E65&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;limo&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;7er-f01&amp;quot;, t: &amp;quot;7er F01&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;limo&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x1-e84&amp;quot;, t: &amp;quot;X1 E84&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x1-f48&amp;quot;, t: &amp;quot;X1 F48&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x3-e83&amp;quot;, t: &amp;quot;X3 E83&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x3-f25&amp;quot;, t: &amp;quot;X3 F25&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x5-e53&amp;quot;, t: &amp;quot;X5 E53&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x5-e70&amp;quot;, t: &amp;quot;X5 E70&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x5-f15&amp;quot;, t: &amp;quot;X5 F15&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x6-e71&amp;quot;, t: &amp;quot;X6 E71&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;z4-e85e86&amp;quot;, t: &amp;quot;Z4 E85/E86&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;roadster,coupe&amp;quot; }&lt;br /&gt;
];&lt;br /&gt;
var bodyValues = Object.keys(BODY).map(function (k) {&lt;br /&gt;
  return { v: k, t: BODY[k], only: { vehicle: VEHICLES.filter(function (x) { return x.body.split(&amp;quot;,&amp;quot;).indexOf(k) !== -1; }).map(function (x) { return x.v; }) } };&lt;br /&gt;
});&lt;br /&gt;
/* ---- 2) Auswahlfelder ------------------------------------------------------&lt;br /&gt;
   only = Wert nur anbieten, wenn Bedingung passt   show = Feld nur dann zeigen&lt;br /&gt;
   optional = muss nicht gewählt werden             auto = bei nur einem Wert vorwählen */&lt;br /&gt;
var FIELDS = [&lt;br /&gt;
  { id: &amp;quot;vehicle&amp;quot;, label: &amp;quot;Fahrzeug&amp;quot;, values: VEHICLES.map(function (x) { return { v: x.v, t: &amp;quot;BMW &amp;quot; + x.t }; }) },&lt;br /&gt;
  { id: &amp;quot;factory&amp;quot;, label: &amp;quot;Verbaut ab Werk&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;iris&amp;quot;,  t: &amp;quot;Radio mit IRIS&amp;quot;, only: { vehicle: [&amp;quot;3er-e46&amp;quot;, &amp;quot;5er-e39&amp;quot;, &amp;quot;7er-e38&amp;quot;, &amp;quot;x5-e53&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;mid&amp;quot;,   t: &amp;quot;Radio mit MID&amp;quot;,  only: { gen: [&amp;quot;alt&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;n43&amp;quot;,   t: &amp;quot;4:3 Navi&amp;quot;,       only: { vehicle: [&amp;quot;5er-e39&amp;quot;, &amp;quot;7er-e38&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;n169&amp;quot;,  t: &amp;quot;16:9 Navi&amp;quot;,      only: { gen: [&amp;quot;alt&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;pfeil&amp;quot;, t: &amp;quot;Pfeilnavi&amp;quot;,      only: { vehicle: [&amp;quot;3er-e46&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;mask&amp;quot;,  t: &amp;quot;M-ASK&amp;quot;,          only: { gen: [&amp;quot;b&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;ccc&amp;quot;,   t: &amp;quot;CCC&amp;quot;,            only: { gen: [&amp;quot;b&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;cic&amp;quot;,   t: &amp;quot;CIC&amp;quot;,            only: { gen: [&amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;nbt&amp;quot;,   t: &amp;quot;NBT&amp;quot;,            only: { gen: [&amp;quot;c&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;nbtevo&amp;quot;, t: &amp;quot;NBT EVO&amp;quot;,       only: { gen: [&amp;quot;c&amp;quot;] } } ] },&lt;br /&gt;
  { id: &amp;quot;trunk&amp;quot;, label: &amp;quot;Wo sitzt das Radiomodul des Pfeilnavis?&amp;quot;, optional: true, show: { factory: [&amp;quot;pfeil&amp;quot;] },&lt;br /&gt;
    help: &amp;quot;Bitte prüfen: Sitzt das Modul im Kofferraum, oder im Pfeilnavi selbst (Quadlock hinten neben dem Antennenstecker)?[br][img=&amp;quot; + P.pfeil + &amp;quot;]&amp;quot;,&lt;br /&gt;
    values: [&lt;br /&gt;
    { v: &amp;quot;ja&amp;quot;, t: &amp;quot;Im Kofferraum (Verlängerungen nötig)&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;nein&amp;quot;, t: &amp;quot;Im Pfeilnavi, Quadlock hinten (keine Verlängerung)&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;unk&amp;quot;, t: &amp;quot;Weiß ich nicht&amp;quot; } ] },&lt;br /&gt;
  { id: &amp;quot;aux&amp;quot;, label: &amp;quot;AUX-IN verfügbar?&amp;quot;, show: { gen: [&amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;] }, values: [&lt;br /&gt;
    { v: &amp;quot;ja&amp;quot;, t: &amp;quot;Ja&amp;quot; }, { v: &amp;quot;nein&amp;quot;, t: &amp;quot;Nein&amp;quot; } ] },&lt;br /&gt;
  { id: &amp;quot;sound&amp;quot;, label: &amp;quot;Soundsystem&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;stereo&amp;quot;, t: &amp;quot;Stereo&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;hifi&amp;quot;,   t: &amp;quot;Hifi&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;dsp&amp;quot;,    t: &amp;quot;DSP&amp;quot;, only: { vehicle: [&amp;quot;7er-e38&amp;quot;, &amp;quot;5er-e39&amp;quot;, &amp;quot;x5-e53&amp;quot;, &amp;quot;x3-e83&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;hk&amp;quot;,     t: &amp;quot;Harman Kardon&amp;quot;, only: { vehicle: [&amp;quot;3er-e46&amp;quot;, &amp;quot;z4-e85e86&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;logic7&amp;quot;, t: &amp;quot;Logic7&amp;quot;, only: { vehicle: [&amp;quot;3er-e9x&amp;quot;, &amp;quot;5er-e6x&amp;quot;, &amp;quot;6er-e6x&amp;quot;, &amp;quot;7er-e65&amp;quot;, &amp;quot;1er-e8x&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;hksur&amp;quot;,  t: &amp;quot;Harman Kardon Surround&amp;quot;, only: { vehicle: [&amp;quot;1er-f2x&amp;quot;, &amp;quot;2er-f2x&amp;quot;, &amp;quot;3er-f3x&amp;quot;, &amp;quot;4er-f3x&amp;quot;, &amp;quot;5er-f1x&amp;quot;] } } ] },&lt;br /&gt;
  { id: &amp;quot;current&amp;quot;, label: &amp;quot;Aktuell verbaut&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;werk&amp;quot;, t: &amp;quot;Werksradio / Werksnavi&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;nach&amp;quot;, t: &amp;quot;Nachrüst-Radio / -Navi&amp;quot; } ] },&lt;br /&gt;
  { id: &amp;quot;body&amp;quot;, label: &amp;quot;Karosserie&amp;quot;, auto: true, values: bodyValues },&lt;br /&gt;
  { id: &amp;quot;ant&amp;quot;, label: &amp;quot;Antennenstecker am Radio (optional)&amp;quot;, optional: true, def: &amp;quot;unk&amp;quot;,&lt;br /&gt;
    show: { vehicle: [&amp;quot;7er-e38&amp;quot;, &amp;quot;5er-e39&amp;quot;, &amp;quot;3er-e46&amp;quot;, &amp;quot;x5-e53&amp;quot;] },&lt;br /&gt;
    values: [&lt;br /&gt;
    { v: &amp;quot;unk&amp;quot;,   t: &amp;quot;Weiß ich nicht&amp;quot;, info: &amp;quot;[b]BM24[/b] (Rundpin) = ISO-Antennenstecker:[br][img=&amp;quot; + P.bm24 + &amp;quot;][img=&amp;quot; + P.iso + &amp;quot;][br][b]BM54[/b] = FAKRA:[br][img=&amp;quot; + P.bm54 + &amp;quot;][img=&amp;quot; + P.fakra + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;iso&amp;quot;,   t: &amp;quot;ISO (BM24, Rundpin)&amp;quot;, info: &amp;quot;[img=&amp;quot; + P.bm24 + &amp;quot;][img=&amp;quot; + P.iso + &amp;quot;]&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;fakra&amp;quot;, t: &amp;quot;FAKRA (BM54)&amp;quot;, info: &amp;quot;[img=&amp;quot; + P.bm54 + &amp;quot;][img=&amp;quot; + P.fakra + &amp;quot;]&amp;quot; } ] }&lt;br /&gt;
];&lt;br /&gt;
/* ---- 3) Zusatzoptionen (Mehrfachauswahl) ---------------------------------&lt;br /&gt;
   show = nur sichtbar wenn Bedingung passt   requires = nur sichtbar wenn diese Optionen gewählt sind&lt;br /&gt;
   excl = Optionen derselben Gruppe schließen sich aus   items = Artikel aus ITEMS */&lt;br /&gt;
var OPTS = [&lt;br /&gt;
  { id: &amp;quot;halter&amp;quot;,  t: &amp;quot;Radio-Halter&amp;quot;, sub: &amp;quot;nur BMW E39&amp;quot;, show: { vehicle: [&amp;quot;5er-e39&amp;quot;] }, items: [&amp;quot;halter&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;ibus&amp;quot;,    t: &amp;quot;I-BUS App&amp;quot;, show: { gen: [&amp;quot;alt&amp;quot;] }, items: [&amp;quot;ibus&amp;quot;, &amp;quot;resler&amp;quot;, &amp;quot;bclic&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;deepobd&amp;quot;, t: &amp;quot;DeepOBD (Diagnose)&amp;quot;, items: [&amp;quot;deepobd&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;can&amp;quot;,     t: &amp;quot;CAN Interface&amp;quot;, sub: &amp;quot;Addon - nur mit I-BUS App&amp;quot;, requires: [&amp;quot;ibus&amp;quot;], items: [&amp;quot;can&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;tpms&amp;quot;,    t: &amp;quot;TPMS (Reifendruck)&amp;quot;, items: [&amp;quot;tpms&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;dab1&amp;quot;,    t: &amp;quot;DAB+ (Single Receiver)&amp;quot;, excl: &amp;quot;dab&amp;quot;, items: [&amp;quot;dab1&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;dab2&amp;quot;,    t: &amp;quot;DAB+ (Dual Receiver)&amp;quot;,   excl: &amp;quot;dab&amp;quot;, items: [&amp;quot;dab2&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;rcam&amp;quot;,    t: &amp;quot;Rückfahrkamera&amp;quot;, items: [&amp;quot;rcam&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;fcam&amp;quot;,    t: &amp;quot;Front-Kamera&amp;quot;, items: [&amp;quot;fcam&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;tool&amp;quot;,    t: &amp;quot;Einbau-Werkzeug (Kunststoffheber)&amp;quot;, items: [&amp;quot;tool&amp;quot;] }&lt;br /&gt;
];&lt;br /&gt;
/* Erzwungene Optionen (werden automatisch gesetzt und gesperrt) */&lt;br /&gt;
var FORCED = [&lt;br /&gt;
  { when: { sound: [&amp;quot;dsp&amp;quot;] }, opts: [&amp;quot;ibus&amp;quot;], why: &amp;quot;wegen DSP erforderlich&amp;quot; }&lt;br /&gt;
];&lt;br /&gt;
/* ---- 4) Artikel ------------------------------------------------------------&lt;br /&gt;
   u = Shop-Link (ut = Linktext)   w = Wiki-Link (wt = Linktext)   leer = kein Link&lt;br /&gt;
   skipIf = Artikel entfällt, wenn der genannte Artikel schon in der Liste steht */&lt;br /&gt;
var ITEMS = {&lt;br /&gt;
  exl005:  { t: &amp;quot;Verlängerung EXL005&amp;quot;, d: &amp;quot;Ersetzt das Radiomodul im Kofferraum.&amp;quot;, u: SHOP + &amp;quot;detail/index/sArticle/212/&amp;quot;, img: [P.exl005, P.schema] },&lt;br /&gt;
  fakra6m: { t: &amp;quot;Verlängerung 6 m FAKRA(m) auf FAKRA(f), gewinkelt&amp;quot;, d: &amp;quot;Antennenverlängerung vom Kofferraum nach vorn.&amp;quot;, img: [P.fakra6m],&lt;br /&gt;
             u: SHOP + &amp;quot;shop/zubehoer/adapterkabel/192/verlaengerung-6m-fakra-m-auf-fakra-f-kurz-gewinkelt&amp;quot; },&lt;br /&gt;
  isoada:  { t: &amp;quot;Adapter ISO-Stecker auf FAKRA, gewinkelt (15 cm)&amp;quot;, d: &amp;quot;Nötig bei ISO-Antennenstecker (BM24, Rundpin).&amp;quot;, img: [P.isofakra],&lt;br /&gt;
             u: SHOP + &amp;quot;shop/zubehoer/adapterkabel/193/adapter-kabel-iso-f-auf-fakra-f-kurz-gewinkelt-15cm&amp;quot; },&lt;br /&gt;
  bcdsp:   { t: &amp;quot;I-BUS App - BC+DSP Lizenz&amp;quot;, d: &amp;quot;Ohne DSP-Lizenz arbeitet das Werks-DSP nicht.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/lizenzen/171/i-bus-app-bc-dsp-lizenz&amp;quot; },&lt;br /&gt;
  halter:  { t: &amp;quot;Alu-Halter zur Radio-Montage im BMW E39&amp;quot;, d: &amp;quot;Empfohlen bei Radios, die nicht von AVIN stammen.&amp;quot;, img: [P.halter],&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/radiohalter/185/alu-halter-zur-radio-montage-im-bmw-e39&amp;quot; },&lt;br /&gt;
  ibus:    { t: &amp;quot;I-BUS App&amp;quot;, d: &amp;quot;Erhält die Bordcomputer-Funktionen und steuert z. B. den Original-CD-Wechsler.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;cat/index/sCategory/42&amp;quot;,&lt;br /&gt;
             w: WIKI + &amp;quot;Was_brauche_ich_um_die_I-BUS_App_nutzen_zu_k%C3%B6nnen%3F&amp;quot;, wt: &amp;quot;Wiki: Was brauche ich für die I-BUS App?&amp;quot; },&lt;br /&gt;
  resler:  { t: &amp;quot;Resler USB I-BUS Modul inkl. Anschlusskabel&amp;quot;, d: &amp;quot;Verbindet I-BUS App und Fahrzeug.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/interfaces-module/191/resler-usb-i-bus-modul-inkl.-anschlusskabel&amp;quot;,&lt;br /&gt;
             w: &amp;quot;https://wiki.ibus-app.de/index.php?title=Hauptseite#Einbauanleitung_f.C3.BCr_Resler_Modul_und_Resler_Interface&amp;quot;, wt: &amp;quot;Einbauanleitung Resler Modul&amp;quot; },&lt;br /&gt;
  bclic:   { t: &amp;quot;I-BUS App - BC Lizenz&amp;quot;, d: &amp;quot;Schaltet u. a. die BC-Daten der App frei.&amp;quot;, skipIf: &amp;quot;bcdsp&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/lizenzen/167/i-bus-app-bc-lizenz&amp;quot; },&lt;br /&gt;
  deepobd: { t: &amp;quot;Deep OBD OBD-II Bluetooth-Adapter&amp;quot;, d: &amp;quot;Live-Werte auslesen, Fehler lesen und löschen.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/interfaces-module/258/deep-obd-obd-ii-bluetooth-adapter?c=54&amp;quot;,&lt;br /&gt;
             w: &amp;quot;https://xtrons.ibus-app.de/index.php?title=DeepOBD_-_Adapter_und_App_einrichten&amp;quot;, wt: &amp;quot;Wiki: DeepOBD einrichten&amp;quot; },&lt;br /&gt;
  can:     { t: &amp;quot;CAN-Bus Interface inkl. Anschlusskabel&amp;quot;, d: &amp;quot;Addon, funktioniert nur zusammen mit der I-BUS App.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/interfaces-module/346/can-bus-interface-inkl.-anschlusskabel&amp;quot;,&lt;br /&gt;
             w: WIKI + &amp;quot;Einbauanleitung_CAN-Bus_Interface&amp;quot;, wt: &amp;quot;Einbauanleitung CAN-Bus Interface&amp;quot; },&lt;br /&gt;
  tpms:    { t: &amp;quot;TPMS - Reifendruckkontrolle&amp;quot;, d: &amp;quot;&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/tpms/&amp;quot; },&lt;br /&gt;
  dab1:    { t: &amp;quot;DAB+ Empfänger inkl. Antenne (Single)&amp;quot;, d: &amp;quot;&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/dab/291/dab-empfaenger-inkl.-antenne-usbdab04&amp;quot; },&lt;br /&gt;
  dab2:    { t: &amp;quot;Dual DAB+ Empfänger-Stick inkl. 2 Antennen&amp;quot;, d: &amp;quot;&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/dab/391/dual-dab-empfaenger-stick-inkl.-2-antennen-acusbdab05t?c=75&amp;quot; },&lt;br /&gt;
  rcam:    { t: &amp;quot;Rückfahrkamera&amp;quot;, d: &amp;quot;&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/kameras/&amp;quot;, ut: &amp;quot;Kameras im Shop ansehen →&amp;quot; },&lt;br /&gt;
  fcam:    { t: &amp;quot;Front-Kamera&amp;quot;, d: &amp;quot;&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/kameras/&amp;quot;, ut: &amp;quot;Kameras im Shop ansehen →&amp;quot; },&lt;br /&gt;
  tool:    { t: &amp;quot;Einbau-Werkzeug (Kunststoffheber)&amp;quot;, d: &amp;quot;Zum schonenden Lösen der Verkleidungen.&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/einbauwerkzeug/&amp;quot; }&lt;br /&gt;
};&lt;br /&gt;
/* ---- 5) Regeln --------------------------------------------------------------&lt;br /&gt;
   type: need (Das brauchst Du) oder hint (Hinweise)   when = Bedingung auf die Felder&lt;br /&gt;
   opts = diese Zusatzoptionen müssen gewählt sein      items = Artikel   html = Text&lt;br /&gt;
   Abgeleitete Werte: gen (alt/b/c) und module (ja/nein/unk = Radiomodul im Kofferraum, nur gen alt) */&lt;br /&gt;
var RULES = [&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { current: [&amp;quot;werk&amp;quot;], module: [&amp;quot;ja&amp;quot;] }, items: [&amp;quot;exl005&amp;quot;, &amp;quot;fakra6m&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { current: [&amp;quot;nach&amp;quot;], module: [&amp;quot;ja&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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=&amp;quot; + P.noquad + &amp;quot;][img=&amp;quot; + P.noexl6 + &amp;quot;]&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;ja&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;nein&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;unk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { ant: [&amp;quot;iso&amp;quot;] }, items: [&amp;quot;isoada&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { ant: [&amp;quot;unk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Antennenstecker:[/b] [b]BM24[/b] (Rundpin) = ISO-Antennenstecker, ggf. wird der [a=&amp;quot; + SHOP + &amp;quot;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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { sound: [&amp;quot;dsp&amp;quot;] }, items: [&amp;quot;bcdsp&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { sound: [&amp;quot;dsp&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]DSP:[/b] Damit das Werks-DSP überhaupt arbeitet, wird die I-BUS App mit BC+DSP Lizenz benötigt.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { sound: [&amp;quot;hk&amp;quot;], gen: [&amp;quot;alt&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Harman Kardon:[/b] Benötigt [b]keine[/b] DSP-Lizenz. Das Remote-Signal (+12 V, wenn Radio an) genügt zum Starten.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { aux: [&amp;quot;nein&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]AUX-IN:[/b] Der AUX-IN muss codiert werden. Optional kann ein FM-Transmitter genutzt werden - das ist nicht empfohlen.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;7er-e38&amp;quot;, &amp;quot;x5-e53&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Montage:[/b] Radios für BMW E38/E53 benötigen keine extra Halterungen.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;5er-e39&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;3er-e46&amp;quot;], factory: [&amp;quot;iris&amp;quot;, &amp;quot;mid&amp;quot;, &amp;quot;pfeil&amp;quot;], current: [&amp;quot;werk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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]&amp;quot; +&lt;br /&gt;
          &amp;quot;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]&amp;quot; +&lt;br /&gt;
          &amp;quot;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=&amp;quot; + P.funktr + &amp;quot;]&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { factory: [&amp;quot;cic&amp;quot;, &amp;quot;nbt&amp;quot;, &amp;quot;nbtevo&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Lichtleiter:[/b] Ggf. vorhandene Lichtleiter (MOST) müssen aus dem BMW-Stecker in den Xtrons-Adapter umgesteckt werden.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { factory: [&amp;quot;mask&amp;quot;, &amp;quot;ccc&amp;quot;, &amp;quot;cic&amp;quot;, &amp;quot;nbt&amp;quot;, &amp;quot;nbtevo&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, opts: [&amp;quot;ibus&amp;quot;], when: {},&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: {},&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot; }&lt;br /&gt;
];&lt;br /&gt;
/* =====================================================================&lt;br /&gt;
   PROGRAMMLOGIK&lt;br /&gt;
   ===================================================================== */&lt;br /&gt;
var $ = function (id) { return document.getElementById(id); };&lt;br /&gt;
var sel = {}, picked = {}, summary = &amp;quot;&amp;quot;, capA = 0, capB = 0;&lt;br /&gt;
var fieldsEl = $(&amp;quot;nvk-fields&amp;quot;), optsEl = $(&amp;quot;nvk-opts&amp;quot;), outEl = $(&amp;quot;nvk-out&amp;quot;);&lt;br /&gt;
function full(u) { return u.indexOf(&amp;quot;/thumb/&amp;quot;) === -1 ? u : u.replace(&amp;quot;/thumb/&amp;quot;, &amp;quot;/&amp;quot;).replace(/\/[^\/]+$/, &amp;quot;&amp;quot;); }&lt;br /&gt;
function fmt(t) {&lt;br /&gt;
  return t.replace(/\[img=([^\x5D]+)\]/g, function (m, u) {&lt;br /&gt;
    return &amp;quot;\u003Ca href=\&amp;quot;&amp;quot; + full(u) + &amp;quot;\&amp;quot; target=\&amp;quot;_blank\&amp;quot; rel=\&amp;quot;noopener\&amp;quot;\u003E\u003Cimg class=\&amp;quot;nvk-img\&amp;quot; src=\&amp;quot;&amp;quot; + u + &amp;quot;\&amp;quot; alt=\&amp;quot;\&amp;quot;\u003E\u003C/a\u003E&amp;quot;;&lt;br /&gt;
  }).replace(/\[b\]/g, &amp;quot;\u003Cb\u003E&amp;quot;).replace(/\[\/b\]/g, &amp;quot;\u003C/b\u003E&amp;quot;).replace(/\[br\]/g, &amp;quot;\u003Cbr\u003E&amp;quot;)&lt;br /&gt;
    .replace(/\[a=([^\x5D]+)\]/g, &amp;quot;\u003Ca href=\&amp;quot;$1\&amp;quot; target=\&amp;quot;_blank\&amp;quot; rel=\&amp;quot;noopener\&amp;quot;\u003E&amp;quot;).replace(/\[\/a\]/g, &amp;quot;\u003C/a\u003E&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
function match(cond, s, lenient) {&lt;br /&gt;
  if (!cond) return true;&lt;br /&gt;
  for (var k in cond) {&lt;br /&gt;
    if (!s[k]) { if (lenient) continue; return false; }&lt;br /&gt;
    if (cond[k].indexOf(s[k]) === -1) return false;&lt;br /&gt;
  }&lt;br /&gt;
  return true;&lt;br /&gt;
}&lt;br /&gt;
function vehicleOf(id) { return VEHICLES.filter(function (x) { return x.v === id; })[0]; }&lt;br /&gt;
function derive() {&lt;br /&gt;
  var s = {}, k;&lt;br /&gt;
  for (k in sel) s[k] = sel[k];&lt;br /&gt;
  var veh = vehicleOf(sel.vehicle);&lt;br /&gt;
  if (veh) s.gen = veh.gen;&lt;br /&gt;
  if (s.gen === &amp;quot;alt&amp;quot;) {&lt;br /&gt;
    if (s.factory === &amp;quot;n43&amp;quot; || s.factory === &amp;quot;n169&amp;quot;) s.module = &amp;quot;ja&amp;quot;;&lt;br /&gt;
    else if (s.factory === &amp;quot;iris&amp;quot; || s.factory === &amp;quot;mid&amp;quot;) s.module = &amp;quot;nein&amp;quot;;&lt;br /&gt;
    else if (s.factory === &amp;quot;pfeil&amp;quot;) s.module = s.trunk || &amp;quot;unk&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  return s;&lt;br /&gt;
}&lt;br /&gt;
function forced(s) {&lt;br /&gt;
  var f = {};&lt;br /&gt;
  FORCED.forEach(function (r) { if (match(r.when, s)) r.opts.forEach(function (o) { f[o] = r.why; }); });&lt;br /&gt;
  return f;&lt;br /&gt;
}&lt;br /&gt;
function onSet(s) {&lt;br /&gt;
  var f = forced(s), on = {}, k;&lt;br /&gt;
  for (k in picked) if (picked[k]) on[k] = true;&lt;br /&gt;
  for (k in f) on[k] = true;&lt;br /&gt;
  return { on: on, forced: f };&lt;br /&gt;
}&lt;br /&gt;
function optVisible(o, s, on) {&lt;br /&gt;
  if (!match(o.show, s, true)) return false;&lt;br /&gt;
  return (o.requires || []).every(function (r) { return on[r]; });&lt;br /&gt;
}&lt;br /&gt;
FIELDS.forEach(function (f) {&lt;br /&gt;
  var wrap = document.createElement(&amp;quot;div&amp;quot;); wrap.className = &amp;quot;nvk-f&amp;quot;; wrap.id = &amp;quot;nvk-w-&amp;quot; + f.id;&lt;br /&gt;
  var lab = document.createElement(&amp;quot;label&amp;quot;); lab.htmlFor = &amp;quot;nvk-&amp;quot; + f.id; lab.textContent = f.label;&lt;br /&gt;
  var s = document.createElement(&amp;quot;select&amp;quot;); s.id = &amp;quot;nvk-&amp;quot; + f.id;&lt;br /&gt;
  s.addEventListener(&amp;quot;change&amp;quot;, function () { sel[f.id] = s.value; update(); });&lt;br /&gt;
  wrap.appendChild(lab); wrap.appendChild(s);&lt;br /&gt;
  if (f.help) { var h = document.createElement(&amp;quot;div&amp;quot;); h.className = &amp;quot;nvk-help&amp;quot;; h.innerHTML = fmt(f.help); wrap.appendChild(h); }&lt;br /&gt;
  var inf = document.createElement(&amp;quot;div&amp;quot;); inf.id = &amp;quot;nvk-i-&amp;quot; + f.id; wrap.appendChild(inf);&lt;br /&gt;
  fieldsEl.appendChild(wrap);&lt;br /&gt;
});&lt;br /&gt;
function renderFields() {&lt;br /&gt;
  FIELDS.forEach(function (f) {&lt;br /&gt;
    var s = derive();&lt;br /&gt;
    var wrap = $(&amp;quot;nvk-w-&amp;quot; + f.id), el = $(&amp;quot;nvk-&amp;quot; + f.id);&lt;br /&gt;
    var vis = f.show ? match(f.show, s, false) : true;&lt;br /&gt;
    wrap.style.display = vis ? &amp;quot;&amp;quot; : &amp;quot;none&amp;quot;;&lt;br /&gt;
    if (!vis) { sel[f.id] = &amp;quot;&amp;quot;; return; }&lt;br /&gt;
    var allowed = f.values.filter(function (v) { return match(v.only, s, true); });&lt;br /&gt;
    if (sel[f.id]) { if (!allowed.some(function (v) { return v.v === sel[f.id]; })) sel[f.id] = &amp;quot;&amp;quot;; }&lt;br /&gt;
    if (!sel[f.id]) { if (f.def) sel[f.id] = f.def; }&lt;br /&gt;
    if (!sel[f.id]) { if (f.auto) { if (sel.vehicle) { if (allowed.length === 1) sel[f.id] = allowed[0].v; } } }&lt;br /&gt;
    el.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
    if (!f.def) { var p = document.createElement(&amp;quot;option&amp;quot;); p.value = &amp;quot;&amp;quot;; p.textContent = &amp;quot;– bitte wählen –&amp;quot;; el.appendChild(p); }&lt;br /&gt;
    allowed.forEach(function (v) {&lt;br /&gt;
      var o = document.createElement(&amp;quot;option&amp;quot;); o.value = v.v; o.textContent = v.t; el.appendChild(o);&lt;br /&gt;
    });&lt;br /&gt;
    el.value = sel[f.id] || &amp;quot;&amp;quot;;&lt;br /&gt;
    var cur = allowed.filter(function (v) { return v.v === sel[f.id]; })[0];&lt;br /&gt;
    $(&amp;quot;nvk-i-&amp;quot; + f.id).innerHTML = cur ? (cur.info ? fmt(cur.info) : &amp;quot;&amp;quot;) : &amp;quot;&amp;quot;;&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
function renderOpts() {&lt;br /&gt;
  var s = derive(), st = onSet(s);&lt;br /&gt;
  OPTS.forEach(function (o) { if (!optVisible(o, s, st.on)) picked[o.id] = false; });&lt;br /&gt;
  st = onSet(s);&lt;br /&gt;
  optsEl.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
  OPTS.forEach(function (o) {&lt;br /&gt;
    if (!optVisible(o, s, st.on)) return;&lt;br /&gt;
    var lab = document.createElement(&amp;quot;label&amp;quot;); lab.className = &amp;quot;nvk-o&amp;quot;;&lt;br /&gt;
    var cb = document.createElement(&amp;quot;input&amp;quot;); cb.type = &amp;quot;checkbox&amp;quot;;&lt;br /&gt;
    cb.checked = !!st.on[o.id];&lt;br /&gt;
    var isForced = !!st.forced[o.id];&lt;br /&gt;
    if (isForced) { cb.disabled = true; lab.className += &amp;quot; dis&amp;quot;; }&lt;br /&gt;
    cb.addEventListener(&amp;quot;change&amp;quot;, function () {&lt;br /&gt;
      picked[o.id] = cb.checked;&lt;br /&gt;
      if (cb.checked) { if (o.excl) OPTS.forEach(function (x) { if (x.excl === o.excl) { if (x.id !== o.id) picked[x.id] = false; } }); }&lt;br /&gt;
      update();&lt;br /&gt;
    });&lt;br /&gt;
    lab.appendChild(cb);&lt;br /&gt;
    lab.appendChild(document.createTextNode(&amp;quot; &amp;quot; + o.t));&lt;br /&gt;
    var sub = [o.sub, isForced ? st.forced[o.id] : &amp;quot;&amp;quot;].filter(Boolean).join(&amp;quot; - &amp;quot;);&lt;br /&gt;
    if (sub) { var sm = document.createElement(&amp;quot;small&amp;quot;); sm.textContent = &amp;quot; (&amp;quot; + sub + &amp;quot;)&amp;quot;; lab.appendChild(sm); }&lt;br /&gt;
    optsEl.appendChild(lab);&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
function link(url, text) {&lt;br /&gt;
  var a = document.createElement(&amp;quot;a&amp;quot;); a.href = url; a.target = &amp;quot;_blank&amp;quot;; a.rel = &amp;quot;noopener&amp;quot;; a.textContent = text; return a;&lt;br /&gt;
}&lt;br /&gt;
function card(item, cls) {&lt;br /&gt;
  var d = document.createElement(&amp;quot;div&amp;quot;); d.className = &amp;quot;nvk-card &amp;quot; + (cls || &amp;quot;&amp;quot;);&lt;br /&gt;
  var b = document.createElement(&amp;quot;b&amp;quot;); b.textContent = item.t; d.appendChild(b);&lt;br /&gt;
  if (item.d) { var p = document.createElement(&amp;quot;span&amp;quot;); p.textContent = item.d; d.appendChild(p); }&lt;br /&gt;
  if (item.img) {&lt;br /&gt;
    var im = document.createElement(&amp;quot;div&amp;quot;);&lt;br /&gt;
    item.img.forEach(function (u) {&lt;br /&gt;
      var a = document.createElement(&amp;quot;a&amp;quot;); a.href = full(u); a.target = &amp;quot;_blank&amp;quot;; a.rel = &amp;quot;noopener&amp;quot;;&lt;br /&gt;
      var g = document.createElement(&amp;quot;img&amp;quot;); g.className = &amp;quot;nvk-img&amp;quot;; g.src = u; g.alt = item.t; a.appendChild(g); im.appendChild(a);&lt;br /&gt;
    });&lt;br /&gt;
    d.appendChild(im);&lt;br /&gt;
  }&lt;br /&gt;
  if (item.u || item.w) {&lt;br /&gt;
    var l = document.createElement(&amp;quot;div&amp;quot;); l.className = &amp;quot;nvk-links&amp;quot;;&lt;br /&gt;
    if (item.u) l.appendChild(link(item.u, item.ut || &amp;quot;Im Shop ansehen →&amp;quot;));&lt;br /&gt;
    if (item.w) l.appendChild(link(item.w, (item.wt || &amp;quot;Zum Wiki&amp;quot;) + &amp;quot; →&amp;quot;));&lt;br /&gt;
    d.appendChild(l);&lt;br /&gt;
  }&lt;br /&gt;
  return d;&lt;br /&gt;
}&lt;br /&gt;
function heading(txt) { var h = document.createElement(&amp;quot;h3&amp;quot;); h.textContent = txt; outEl.appendChild(h); }&lt;br /&gt;
function renderResult() {&lt;br /&gt;
  var s = derive(), st = onSet(s);&lt;br /&gt;
  var missing = FIELDS.filter(function (f) {&lt;br /&gt;
    var w = $(&amp;quot;nvk-w-&amp;quot; + f.id);&lt;br /&gt;
    return w.style.display !== &amp;quot;none&amp;quot; ? (!f.optional ? !sel[f.id] : false) : false;&lt;br /&gt;
  });&lt;br /&gt;
  outEl.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
  if (missing.length) {&lt;br /&gt;
    var m = document.createElement(&amp;quot;p&amp;quot;); m.className = &amp;quot;nvk-miss&amp;quot;;&lt;br /&gt;
    m.textContent = &amp;quot;Bitte noch auswählen: &amp;quot; + missing.map(function (f) { return f.label; }).join(&amp;quot;, &amp;quot;);&lt;br /&gt;
    outEl.appendChild(m); $(&amp;quot;nvk-form&amp;quot;).style.display = &amp;quot;none&amp;quot;; return;&lt;br /&gt;
  }&lt;br /&gt;
  $(&amp;quot;nvk-form&amp;quot;).style.display = &amp;quot;&amp;quot;;&lt;br /&gt;
  var needs = [], hints = [], seen = {};&lt;br /&gt;
  RULES.forEach(function (r) {&lt;br /&gt;
    if (!match(r.when, s)) return;&lt;br /&gt;
    if (r.opts) { if (!r.opts.every(function (o) { return st.on[o]; })) return; }&lt;br /&gt;
    if (r.type === &amp;quot;need&amp;quot;) (r.items || []).forEach(function (id) { if (!seen[id]) { seen[id] = 1; needs.push(ITEMS[id]); } });&lt;br /&gt;
    else hints.push(r.html);&lt;br /&gt;
  });&lt;br /&gt;
  heading(&amp;quot;Das brauchst Du&amp;quot;);&lt;br /&gt;
  if (needs.length) needs.forEach(function (i) { outEl.appendChild(card(i)); });&lt;br /&gt;
  else { var n = document.createElement(&amp;quot;p&amp;quot;); n.textContent = &amp;quot;Für die Grundinstallation sind keine zusätzlichen Verlängerungen oder Adapter nötig.&amp;quot;; outEl.appendChild(n); }&lt;br /&gt;
  var opt = [];&lt;br /&gt;
  OPTS.forEach(function (o) {&lt;br /&gt;
    if (!st.on[o.id]) return;&lt;br /&gt;
    if (!optVisible(o, s, st.on)) return;&lt;br /&gt;
    o.items.forEach(function (id) {&lt;br /&gt;
      if (seen[id]) return;&lt;br /&gt;
      var sk = ITEMS[id].skipIf;&lt;br /&gt;
      if (sk) { if (seen[sk]) return; }&lt;br /&gt;
      seen[id] = 1; opt.push(ITEMS[id]);&lt;br /&gt;
    });&lt;br /&gt;
  });&lt;br /&gt;
  if (opt.length) { heading(&amp;quot;Deine Zusatzoptionen&amp;quot;); opt.forEach(function (i) { outEl.appendChild(card(i, &amp;quot;opt&amp;quot;)); }); }&lt;br /&gt;
  if (hints.length) {&lt;br /&gt;
    heading(&amp;quot;Hinweise&amp;quot;);&lt;br /&gt;
    hints.forEach(function (t) { var d = document.createElement(&amp;quot;div&amp;quot;); d.className = &amp;quot;nvk-note&amp;quot;; d.innerHTML = fmt(t); outEl.appendChild(d); });&lt;br /&gt;
  }&lt;br /&gt;
  var veh = vehicleOf(sel.vehicle);&lt;br /&gt;
  heading(&amp;quot;Passende Radios&amp;quot;);&lt;br /&gt;
  outEl.appendChild(card({ t: &amp;quot;BMW Radios für &amp;quot; + veh.t, d: &amp;quot;Alle Radios, die für Deinen BMW &amp;quot; + veh.t + &amp;quot; im Shop erhältlich sind.&amp;quot;,&lt;br /&gt;
    u: SHOP + &amp;quot;bmw-radios/&amp;quot; + veh.v + &amp;quot;/&amp;quot;, ut: &amp;quot;Zu den passenden Radios →&amp;quot;, w: SHOP + &amp;quot;bmw-radios/&amp;quot;, wt: &amp;quot;Alle BMW Radios&amp;quot; }, &amp;quot;rad&amp;quot;));&lt;br /&gt;
  var L = [&amp;quot;KONFIGURATION&amp;quot;];&lt;br /&gt;
  FIELDS.forEach(function (f) {&lt;br /&gt;
    if (!sel[f.id]) return;&lt;br /&gt;
    var v = f.values.filter(function (x) { return x.v === sel[f.id]; })[0];&lt;br /&gt;
    if (v) L.push(&amp;quot;- &amp;quot; + f.label + &amp;quot;: &amp;quot; + v.t);&lt;br /&gt;
  });&lt;br /&gt;
  L.push(&amp;quot;&amp;quot;, &amp;quot;BENÖTIGT&amp;quot;);&lt;br /&gt;
  needs.forEach(function (i) { L.push(&amp;quot;- &amp;quot; + i.t + (i.u ? &amp;quot;  &amp;quot; + i.u : &amp;quot;&amp;quot;)); });&lt;br /&gt;
  if (opt.length) { L.push(&amp;quot;&amp;quot;, &amp;quot;ZUSATZOPTIONEN&amp;quot;); opt.forEach(function (i) { L.push(&amp;quot;- &amp;quot; + i.t + (i.u ? &amp;quot;  &amp;quot; + i.u : &amp;quot;&amp;quot;)); }); }&lt;br /&gt;
  L.push(&amp;quot;&amp;quot;, &amp;quot;Radios: &amp;quot; + SHOP + &amp;quot;bmw-radios/&amp;quot; + veh.v + &amp;quot;/&amp;quot;);&lt;br /&gt;
  summary = L.join(&amp;quot;\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
function update() { renderFields(); renderOpts(); renderResult(); }&lt;br /&gt;
function newCaptcha() {&lt;br /&gt;
  capA = 1 + Math.floor(Math.random() * 9); capB = 1 + Math.floor(Math.random() * 9);&lt;br /&gt;
  $(&amp;quot;nvk-capq&amp;quot;).textContent = &amp;quot;Sicherheitsfrage: Was ist &amp;quot; + capA + &amp;quot; + &amp;quot; + capB + &amp;quot;? *&amp;quot;; $(&amp;quot;nvk-cap&amp;quot;).value = &amp;quot;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
function status(msg, ok) { var e = $(&amp;quot;nvk-status&amp;quot;); e.style.display = &amp;quot;&amp;quot;; e.textContent = msg; e.style.borderLeftColor = ok ? &amp;quot;#14866d&amp;quot; : &amp;quot;#d33&amp;quot;; }&lt;br /&gt;
$(&amp;quot;nvk-send&amp;quot;).addEventListener(&amp;quot;click&amp;quot;, function () {&lt;br /&gt;
  var name = $(&amp;quot;nvk-name&amp;quot;).value.trim(), mail = $(&amp;quot;nvk-mail&amp;quot;).value.trim(), vin = $(&amp;quot;nvk-vin&amp;quot;).value.trim(), msg = $(&amp;quot;nvk-msg&amp;quot;).value.trim();&lt;br /&gt;
  if (!name || !mail || !msg) return status(&amp;quot;Bitte Name, E-Mail und Kommentar ausfüllen.&amp;quot;, false);&lt;br /&gt;
  if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(mail)) return status(&amp;quot;Bitte eine gültige E-Mail-Adresse eingeben.&amp;quot;, false);&lt;br /&gt;
  if (vin) { if (!/^[A-HJ-NPR-Za-hj-npr-z0-9]{17}$/.test(vin)) return status(&amp;quot;Die VIN muss 17 Zeichen haben (ohne I, O, Q) - oder das Feld leer lassen.&amp;quot;, false); }&lt;br /&gt;
  if (parseInt($(&amp;quot;nvk-cap&amp;quot;).value, 10) !== capA + capB) return status(&amp;quot;Die Sicherheitsfrage wurde nicht richtig beantwortet.&amp;quot;, false);&lt;br /&gt;
  if (!$(&amp;quot;nvk-dsgvo&amp;quot;).checked) return status(&amp;quot;Bitte der Verarbeitung Deiner Daten zustimmen.&amp;quot;, false);&lt;br /&gt;
  if ($(&amp;quot;nvk-hp&amp;quot;).value) return;&lt;br /&gt;
  var text = &amp;quot;Name: &amp;quot; + name + &amp;quot;\nE-Mail: &amp;quot; + mail + &amp;quot;\nVIN: &amp;quot; + (vin || &amp;quot;-&amp;quot;) + &amp;quot;\n\nKommentar:\n&amp;quot; + msg + &amp;quot;\n\n&amp;quot; + summary;&lt;br /&gt;
  if (SEND_URL) {&lt;br /&gt;
    var p = new URLSearchParams();&lt;br /&gt;
    p.append(&amp;quot;name&amp;quot;, name); p.append(&amp;quot;mail&amp;quot;, mail); p.append(&amp;quot;vin&amp;quot;, vin); p.append(&amp;quot;msg&amp;quot;, msg); p.append(&amp;quot;summary&amp;quot;, summary);&lt;br /&gt;
    p.append(&amp;quot;hp&amp;quot;, $(&amp;quot;nvk-hp&amp;quot;).value); p.append(&amp;quot;ca&amp;quot;, capA); p.append(&amp;quot;cb&amp;quot;, capB); p.append(&amp;quot;cv&amp;quot;, $(&amp;quot;nvk-cap&amp;quot;).value);&lt;br /&gt;
    fetch(SEND_URL, { method: &amp;quot;POST&amp;quot;, body: p }).then(function (r) {&lt;br /&gt;
      if (!r.ok) throw new Error(&amp;quot;send&amp;quot;);&lt;br /&gt;
      status(&amp;quot;Danke! Deine Anfrage wurde gesendet, eine Kopie geht an &amp;quot; + mail + &amp;quot;.&amp;quot;, true); newCaptcha();&lt;br /&gt;
    }).catch(function () { status(&amp;quot;Das Senden hat nicht geklappt. Bitte versuche es später noch einmal oder schreibe direkt an &amp;quot; + MAIL_TO + &amp;quot;.&amp;quot;, false); });&lt;br /&gt;
  } else {&lt;br /&gt;
    var AMP = &amp;quot;\u0026&amp;quot;;&lt;br /&gt;
    window.location.href = &amp;quot;mailto:&amp;quot; + MAIL_TO + &amp;quot;?cc=&amp;quot; + encodeURIComponent(mail) + AMP + &amp;quot;subject=&amp;quot; + encodeURIComponent(MAIL_SUBJECT) + AMP + &amp;quot;body=&amp;quot; + encodeURIComponent(text);&lt;br /&gt;
    status(&amp;quot;Dein E-Mail-Programm wurde mit der fertigen Anfrage geöffnet. Bitte dort noch auf Senden klicken.&amp;quot;, true);&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
$(&amp;quot;nvk-reset&amp;quot;).addEventListener(&amp;quot;click&amp;quot;, function () { sel = {}; picked = {}; update(); });&lt;br /&gt;
newCaptcha();&lt;br /&gt;
update();&lt;br /&gt;
})();&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andre</name></author>
	</entry>
	<entry>
		<id>https://xtrons.ibus-app.de/index.php?title=Grobe_Kosten%C3%BCbersicht&amp;diff=4076</id>
		<title>Grobe Kostenübersicht</title>
		<link rel="alternate" type="text/html" href="https://xtrons.ibus-app.de/index.php?title=Grobe_Kosten%C3%BCbersicht&amp;diff=4076"/>
		<updated>2026-10-21T09:26:56Z</updated>

		<summary type="html">&lt;p&gt;Andre: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Pos. !! Bezeichnung !! Preis&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Radio ([https://xtrons.ibus-app.de/index.php?title=Aktuelle_Xtrons-Radiomodelle Xtrons] oder [https://xtrons.ibus-app.de/index.php?title=Aktuelle_AVIN-Radiomodelle AVIN]) || 360..530€&lt;br /&gt;
|-&lt;br /&gt;
| 2 || [https://xtrons.ibus-app.de/index.php?title=Adapter_und_Verl%C3%A4ngerungen QuadLock Verlängerung] (nur bei OEM Navi)|| 55€&lt;br /&gt;
|-&lt;br /&gt;
| 3 || [https://xtrons.ibus-app.de/index.php?title=Adapter_und_Verl%C3%A4ngerungen Antennenverlängerung] (nur bei OEM Navi)|| 17€&lt;br /&gt;
|-&lt;br /&gt;
| 4 || [https://xtrons.ibus-app.de/index.php?title=Adapter_und_Verl%C3%A4ngerungen GPS-Antennenverlängerung + Adapter] (nur bei OEM Navi - OPTION)&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;|| 27€&lt;br /&gt;
|-&lt;br /&gt;
| 5 || [https://shop.ibus-app.de/shop/zubehoer/191/resler-usb-i-bus-modul-inkl.-anschlusskabel Resler Modul] (für App) || 73,95€&lt;br /&gt;
|-&lt;br /&gt;
| 6 || [https://shop.ibus-app.de/shop/lizenzen/167/i-bus-app-bc-lizenz I-BUS App BC-Lizenz], ODER|| 22,99€&lt;br /&gt;
|-&lt;br /&gt;
| 7|| [https://shop.ibus-app.de/shop/lizenzen/171/i-bus-app-bc-dsp-lizenz Kombi-Lizenz (BC + DSP)]|| 40,99€&lt;br /&gt;
|-&lt;br /&gt;
| 8|| [http://xtrons.co.uk/usbdab01-usb-2-0-digital-dab.html DAB+ Stick] || 50€&lt;br /&gt;
|-&lt;br /&gt;
| 9|| 2x 64GB microSD Speicherkarte || 32€&lt;br /&gt;
|-&lt;br /&gt;
| 10|| [https://shop.ibus-app.de/shop/zubehoer/185/alu-halter-zur-radio-montage-im-bmw-e39 Alu-Halter zur Radio-Montage im BMW E39] ('''nur BMW E39''') || 24,99€&lt;br /&gt;
|-&lt;br /&gt;
| 11|| [https://shop.ibus-app.de/detail/index/sArticle/258 Deep OBD Bluetooth Interface] || 31,99€&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Minimalversion: ~ 457,00€'''&lt;br /&gt;
(CD-/Kasetten-Radio vorn, kein DSP, kein DAB+) [Pos.: 1/5/6]&lt;br /&gt;
&lt;br /&gt;
'''Maximalversion: ~ 872,00€'''&lt;br /&gt;
(OEM-Navi, DSP, DAB+) [Pos.: 1-10]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;nur wenn die OEM-GPS genutzt werden soll&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;(Preise Stand 21.10.2026)&amp;lt;/small&amp;gt;&amp;lt;br /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andre</name></author>
	</entry>
	<entry>
		<id>https://xtrons.ibus-app.de/index.php?title=Grobe_Kosten%C3%BCbersicht&amp;diff=4075</id>
		<title>Grobe Kostenübersicht</title>
		<link rel="alternate" type="text/html" href="https://xtrons.ibus-app.de/index.php?title=Grobe_Kosten%C3%BCbersicht&amp;diff=4075"/>
		<updated>2026-10-21T09:26:39Z</updated>

		<summary type="html">&lt;p&gt;Andre: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Pos. !! Bezeichnung !! Preis&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Radio ([https://xtrons.ibus-app.de/index.php?title=Aktuelle_Xtrons-Radiomodelle Xtrons] oder [https://xtrons.ibus-app.de/index.php?title=Aktuelle_AVIN-Radiomodelle AVIN]) || 360..530€&lt;br /&gt;
|-&lt;br /&gt;
| 2 || [https://xtrons.ibus-app.de/index.php?title=Adapter_und_Verl%C3%A4ngerungen QuadLock Verlängerung] (nur bei OEM Navi)|| 55€&lt;br /&gt;
|-&lt;br /&gt;
| 3 || [https://xtrons.ibus-app.de/index.php?title=Adapter_und_Verl%C3%A4ngerungen Antennenverlängerung] (nur bei OEM Navi)|| 17€&lt;br /&gt;
|-&lt;br /&gt;
| 4 || [https://xtrons.ibus-app.de/index.php?title=Adapter_und_Verl%C3%A4ngerungen GPS-Antennenverlängerung + Adapter] (nur bei OEM Navi - OPTION)&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;|| 27€&lt;br /&gt;
|-&lt;br /&gt;
| 5 || [https://shop.ibus-app.de/shop/zubehoer/191/resler-usb-i-bus-modul-inkl.-anschlusskabel Resler Modul] (für App) || 73,95€&lt;br /&gt;
|-&lt;br /&gt;
| 6 || [https://shop.ibus-app.de/shop/lizenzen/167/i-bus-app-bc-lizenz I-BUS App BC-Lizenz], ODER|| 22,99€&lt;br /&gt;
|-&lt;br /&gt;
| 7|| [https://shop.ibus-app.de/shop/lizenzen/171/i-bus-app-bc-dsp-lizenz Kombi-Lizenz (BC + DSP)]|| 40,99€&lt;br /&gt;
|-&lt;br /&gt;
| 8|| [http://xtrons.co.uk/usbdab01-usb-2-0-digital-dab.html DAB+ Stick] || 50€&lt;br /&gt;
|-&lt;br /&gt;
| 9|| 2x 64GB microSD Speicherkarte || 32€&lt;br /&gt;
|-&lt;br /&gt;
| 10|| [https://shop.ibus-app.de/shop/zubehoer/185/alu-halter-zur-radio-montage-im-bmw-e39 Alu-Halter zur Radio-Montage im BMW E39] ('''nur BMW E39''') || 24,99€&lt;br /&gt;
|-&lt;br /&gt;
| 11|| [https://shop.ibus-app.de/detail/index/sArticle/258 Deep OBD Bluetooth Interface] || 31,99€&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Minimalversion: ~ 457,00€'''&lt;br /&gt;
(CD-/Kasetten-Radio vorn, kein DSP, kein DAB+) [Pos.: 1/5/6]&lt;br /&gt;
&lt;br /&gt;
'''Maximalversion: ~ 872,00€'''&lt;br /&gt;
(OEM-Navi, DSP, DAB+) [Pos.: 1-10]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;nur wenn die OEM-GPS genutzt werden soll&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;(Preise Stand 10.08.2022)&amp;lt;/small&amp;gt;&amp;lt;br /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andre</name></author>
	</entry>
	<entry>
		<id>https://xtrons.ibus-app.de/index.php?title=Android_Radio_Konfigurator&amp;diff=4074</id>
		<title>Android Radio Konfigurator</title>
		<link rel="alternate" type="text/html" href="https://xtrons.ibus-app.de/index.php?title=Android_Radio_Konfigurator&amp;diff=4074"/>
		<updated>2026-10-21T09:10:29Z</updated>

		<summary type="html">&lt;p&gt;Andre: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;html&amp;gt;&amp;lt;div id=&amp;quot;nvk&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
#nvk{max-width:900px;line-height:1.45}&lt;br /&gt;
#nvk *{box-sizing:border-box}&lt;br /&gt;
#nvk .nvk-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:14px;margin:12px 0}&lt;br /&gt;
#nvk .nvk-f label{display:block;font-weight:700;margin-bottom:4px}&lt;br /&gt;
#nvk select{width:100%;padding:9px 8px;font:inherit;color:#202122;background:#fff;border:1px solid #a2a9b1;border-radius:4px}&lt;br /&gt;
#nvk .nvk-help{font-size:.85em;opacity:.75;margin-top:3px}&lt;br /&gt;
#nvk fieldset{border:1px solid rgba(128,128,128,.45);border-radius:6px;padding:10px 14px;margin:14px 0}&lt;br /&gt;
#nvk legend{font-weight:700;padding:0 6px}&lt;br /&gt;
#nvk .nvk-o{display:block;padding:4px 0;cursor:pointer}&lt;br /&gt;
#nvk .nvk-o small{opacity:.7}&lt;br /&gt;
#nvk .nvk-o.dis{opacity:.75;cursor:default}&lt;br /&gt;
#nvk .nvk-btn{padding:7px 14px;font:inherit;border:1px solid #a2a9b1;border-radius:4px;background:#f8f9fa;color:#202122;cursor:pointer}&lt;br /&gt;
#nvk #nvk-out{margin-top:18px}&lt;br /&gt;
#nvk h3{margin:18px 0 8px}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-card.opt{border-left-color:#14866d}&lt;br /&gt;
#nvk .nvk-card.rad{border-left-color:#d9400b}&lt;br /&gt;
#nvk .nvk-card b{display:block}&lt;br /&gt;
#nvk .nvk-links{margin-top:4px;font-weight:600}&lt;br /&gt;
#nvk .nvk-links a{margin-right:14px}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-miss{opacity:.8;font-style:italic}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-grid&amp;quot; id=&amp;quot;nvk-fields&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;fieldset id=&amp;quot;nvk-optset&amp;quot;&amp;gt;&amp;lt;legend&amp;gt;Zusatzoptionen&amp;lt;/legend&amp;gt;&amp;lt;div id=&amp;quot;nvk-opts&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/fieldset&amp;gt;&lt;br /&gt;
&amp;lt;button type=&amp;quot;button&amp;quot; class=&amp;quot;nvk-btn&amp;quot; id=&amp;quot;nvk-reset&amp;quot;&amp;gt;Auswahl zurücksetzen&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk-out&amp;quot; aria-live=&amp;quot;polite&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;noscript&amp;gt;Für den Konfigurator wird JavaScript benötigt.&amp;lt;/noscript&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
(function () {&lt;br /&gt;
&amp;quot;use strict&amp;quot;;&lt;br /&gt;
/* =====================================================================&lt;br /&gt;
   KONFIGURATION - hier wird gepflegt.&lt;br /&gt;
   Textformat in Hinweisen: [b]fett[/b]  [br] Zeilenumbruch  [a=URL]Linktext[/a]&lt;br /&gt;
   Bitte im Skript KEIN kaufmännisches Und, kein Kleiner-/Größer-Zeichen&lt;br /&gt;
   und keine Leerzeilen verwenden (das Wiki wandelt sie um).&lt;br /&gt;
   ===================================================================== */&lt;br /&gt;
var SHOP = &amp;quot;https://shop.ibus-app.de/&amp;quot;;&lt;br /&gt;
var WIKI = &amp;quot;https://wiki.ibus-app.de/index.php?title=&amp;quot;;&lt;br /&gt;
/* ---- 1) Baureihen --------------------------------------------------------&lt;br /&gt;
   v = Shop-Kategorie (Link: SHOP + bmw-radios/ + v + /)&lt;br /&gt;
   gen: alt = I-BUS-Fahrzeuge (E38/E39/E46/E53/E83)&lt;br /&gt;
        b   = M-ASK / CCC / CIC     c = CIC / NBT / NBT EVO&lt;br /&gt;
   body = Karosserieformen (siehe BODY)                                      */&lt;br /&gt;
var BODY = { limo: &amp;quot;Limousine&amp;quot;, touring: &amp;quot;Touring&amp;quot;, coupe: &amp;quot;Coupé&amp;quot;, cabrio: &amp;quot;Cabrio&amp;quot;, schraeg: &amp;quot;Schrägheck&amp;quot;,&lt;br /&gt;
  compact: &amp;quot;Compact&amp;quot;, gt: &amp;quot;Gran Turismo&amp;quot;, gc: &amp;quot;Gran Coupé&amp;quot;, suv: &amp;quot;SUV / SAV&amp;quot;, roadster: &amp;quot;Roadster&amp;quot; };&lt;br /&gt;
var VEHICLES = [&lt;br /&gt;
  { v: &amp;quot;1er-e8x&amp;quot;, t: &amp;quot;1er E8x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;schraeg,coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;1er-f2x&amp;quot;, t: &amp;quot;1er F2x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;schraeg&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;2er-f2x&amp;quot;, t: &amp;quot;2er F2x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;3er-e46&amp;quot;, t: &amp;quot;3er E46&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;limo,touring,coupe,cabrio,compact&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;3er-e9x&amp;quot;, t: &amp;quot;3er E9x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;limo,touring,coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;3er-f3x&amp;quot;, t: &amp;quot;3er F3x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;limo,touring,gt&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;4er-f3x&amp;quot;, t: &amp;quot;4er F3x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;coupe,cabrio,gc&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;5er-e39&amp;quot;, t: &amp;quot;5er E39&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;limo,touring&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;5er-e6x&amp;quot;, t: &amp;quot;5er E6x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;limo,touring&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;5er-f1x&amp;quot;, t: &amp;quot;5er F1x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;limo,touring,gt&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;6er-e6x&amp;quot;, t: &amp;quot;6er E6x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;7er-e38&amp;quot;, t: &amp;quot;7er E38&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;limo&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;7er-e65&amp;quot;, t: &amp;quot;7er E65&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;limo&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;7er-f01&amp;quot;, t: &amp;quot;7er F01&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;limo&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x1-e84&amp;quot;, t: &amp;quot;X1 E84&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x1-f48&amp;quot;, t: &amp;quot;X1 F48&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x3-e83&amp;quot;, t: &amp;quot;X3 E83&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x3-f25&amp;quot;, t: &amp;quot;X3 F25&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x5-e53&amp;quot;, t: &amp;quot;X5 E53&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x5-e70&amp;quot;, t: &amp;quot;X5 E70&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x5-f15&amp;quot;, t: &amp;quot;X5 F15&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x6-e71&amp;quot;, t: &amp;quot;X6 E71&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;z4-e85e86&amp;quot;, t: &amp;quot;Z4 E85/E86&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;roadster,coupe&amp;quot; }&lt;br /&gt;
];&lt;br /&gt;
var DSPV = [&amp;quot;5er-e39&amp;quot;, &amp;quot;7er-e38&amp;quot;, &amp;quot;x5-e53&amp;quot;,&amp;quot;x3-e83&amp;quot;];&lt;br /&gt;
function allIds() { return VEHICLES.map(function (x) { return x.v; }); }&lt;br /&gt;
var HKV = allIds().filter(function (v) { return DSPV.indexOf(v) === -1; });&lt;br /&gt;
var bodyValues = Object.keys(BODY).map(function (k) {&lt;br /&gt;
  return { v: k, t: BODY[k], only: { vehicle: VEHICLES.filter(function (x) { return x.body.split(&amp;quot;,&amp;quot;).indexOf(k) !== -1; }).map(function (x) { return x.v; }) } };&lt;br /&gt;
});&lt;br /&gt;
/* ---- 2) Auswahlfelder ------------------------------------------------------&lt;br /&gt;
   only = Wert nur anbieten, wenn Bedingung passt   show = Feld nur dann zeigen&lt;br /&gt;
   optional = muss nicht gewählt werden             auto = bei nur einem Wert vorwählen */&lt;br /&gt;
var FIELDS = [&lt;br /&gt;
  { id: &amp;quot;vehicle&amp;quot;, label: &amp;quot;Fahrzeug&amp;quot;, values: VEHICLES.map(function (x) { return { v: x.v, t: &amp;quot;BMW &amp;quot; + x.t }; }) },&lt;br /&gt;
  { id: &amp;quot;factory&amp;quot;, label: &amp;quot;Verbaut ab Werk&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;iris&amp;quot;,  t: &amp;quot;Radio mit IRIS&amp;quot;, only: { gen: [&amp;quot;alt&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;mid&amp;quot;,   t: &amp;quot;Radio mit MID&amp;quot;,  only: { gen: [&amp;quot;alt&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;n43&amp;quot;,   t: &amp;quot;4:3 Navi&amp;quot;,       only: { vehicle: [&amp;quot;5er-e39&amp;quot;, &amp;quot;7er-e38&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;n169&amp;quot;,  t: &amp;quot;16:9 Navi&amp;quot;,      only: { gen: [&amp;quot;alt&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;pfeil&amp;quot;, t: &amp;quot;Pfeilnavi&amp;quot;,      only: { vehicle: [&amp;quot;3er-e46&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;mask&amp;quot;,  t: &amp;quot;M-ASK&amp;quot;,          only: { gen: [&amp;quot;b&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;ccc&amp;quot;,   t: &amp;quot;CCC&amp;quot;,            only: { gen: [&amp;quot;b&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;cic&amp;quot;,   t: &amp;quot;CIC&amp;quot;,            only: { gen: [&amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;nbt&amp;quot;,   t: &amp;quot;NBT&amp;quot;,            only: { gen: [&amp;quot;c&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;nbtevo&amp;quot;, t: &amp;quot;NBT EVO&amp;quot;,       only: { gen: [&amp;quot;c&amp;quot;] } } ] },&lt;br /&gt;
  { id: &amp;quot;trunk&amp;quot;, label: &amp;quot;Befindet sich im Kofferraum ein Radiomodul?&amp;quot;, optional: true, show: { factory: [&amp;quot;pfeil&amp;quot;] }, values: [&lt;br /&gt;
    { v: &amp;quot;ja&amp;quot;, t: &amp;quot;Ja, Radio-/Navimodul im Kofferraum&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;nein&amp;quot;, t: &amp;quot;Nein, Anschlüsse nur hinter dem Radio&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;unk&amp;quot;, t: &amp;quot;Weiß ich nicht&amp;quot; } ] },&lt;br /&gt;
  { id: &amp;quot;aux&amp;quot;, label: &amp;quot;AUX-IN verfügbar?&amp;quot;, show: { gen: [&amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;] }, values: [&lt;br /&gt;
    { v: &amp;quot;ja&amp;quot;, t: &amp;quot;Ja&amp;quot; }, { v: &amp;quot;nein&amp;quot;, t: &amp;quot;Nein&amp;quot; } ] },&lt;br /&gt;
  { id: &amp;quot;sound&amp;quot;, label: &amp;quot;Soundsystem&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;stereo&amp;quot;, t: &amp;quot;Stereo&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;hifi&amp;quot;,   t: &amp;quot;Hifi&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;dsp&amp;quot;,    t: &amp;quot;DSP&amp;quot;, only: { vehicle: DSPV } },&lt;br /&gt;
    { v: &amp;quot;hk&amp;quot;,     t: &amp;quot;Harman Kardon&amp;quot;, only: { vehicle: HKV } } ] },&lt;br /&gt;
  { id: &amp;quot;current&amp;quot;, label: &amp;quot;Aktuell verbaut&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;werk&amp;quot;, t: &amp;quot;Werksradio / Werksnavi&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;nach&amp;quot;, t: &amp;quot;Nachrüst-Radio / -Navi&amp;quot; } ] },&lt;br /&gt;
  { id: &amp;quot;body&amp;quot;, label: &amp;quot;Karosserie&amp;quot;, auto: true, values: bodyValues },&lt;br /&gt;
  { id: &amp;quot;ant&amp;quot;, label: &amp;quot;Antennenstecker am Radio (optional)&amp;quot;, optional: true, def: &amp;quot;unk&amp;quot;,&lt;br /&gt;
    help: &amp;quot;BM24 (Rundpin) = ISO-Antennenstecker, ggf. Adapter nötig. BM54 = FAKRA, kein Adapter nötig.&amp;quot;,&lt;br /&gt;
    values: [&lt;br /&gt;
    { v: &amp;quot;unk&amp;quot;,   t: &amp;quot;Weiß ich nicht&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;iso&amp;quot;,   t: &amp;quot;ISO (BM24, Rundpin (OG))&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;fakra&amp;quot;, t: &amp;quot;FAKRA (BM54, Flachpin (Quadlock))&amp;quot; } ] }&lt;br /&gt;
];&lt;br /&gt;
/* ---- 3) Zusatzoptionen (Mehrfachauswahl) ---------------------------------&lt;br /&gt;
   show = nur sichtbar wenn Bedingung passt   requires = nur sichtbar wenn diese Optionen gewählt sind&lt;br /&gt;
   excl = Optionen derselben Gruppe schließen sich aus   items = Artikel aus ITEMS */&lt;br /&gt;
var OPTS = [&lt;br /&gt;
  { id: &amp;quot;halter&amp;quot;,  t: &amp;quot;Radio-Halter&amp;quot;, sub: &amp;quot;nur BMW E39&amp;quot;, show: { vehicle: [&amp;quot;5er-e39&amp;quot;] }, items: [&amp;quot;halter&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;ibus&amp;quot;,    t: &amp;quot;I-BUS App&amp;quot;, show: { gen: [&amp;quot;alt&amp;quot;] }, items: [&amp;quot;ibus&amp;quot;, &amp;quot;resler&amp;quot;, &amp;quot;bclic&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;deepobd&amp;quot;, t: &amp;quot;DeepOBD (Diagnose)&amp;quot;, items: [&amp;quot;deepobd&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;can&amp;quot;,     t: &amp;quot;CAN Interface&amp;quot;, sub: &amp;quot;Addon - nur mit I-BUS App&amp;quot;, requires: [&amp;quot;ibus&amp;quot;], items: [&amp;quot;can&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;tpms&amp;quot;,    t: &amp;quot;TPMS (Reifendruck)&amp;quot;, items: [&amp;quot;tpms&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;dab1&amp;quot;,    t: &amp;quot;DAB+ (Single Receiver)&amp;quot;, excl: &amp;quot;dab&amp;quot;, items: [&amp;quot;dab1&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;dab2&amp;quot;,    t: &amp;quot;DAB+ (Dual Receiver)&amp;quot;,   excl: &amp;quot;dab&amp;quot;, items: [&amp;quot;dab2&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;rcam&amp;quot;,    t: &amp;quot;Rückfahrkamera&amp;quot;, items: [&amp;quot;rcam&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;fcam&amp;quot;,    t: &amp;quot;Front-Kamera&amp;quot;, items: [&amp;quot;fcam&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;tool&amp;quot;,    t: &amp;quot;Einbau-Werkzeug (Kunststoffheber)&amp;quot;, items: [&amp;quot;tool&amp;quot;] }&lt;br /&gt;
];&lt;br /&gt;
/* Erzwungene Optionen (werden automatisch gesetzt und gesperrt) */&lt;br /&gt;
var FORCED = [&lt;br /&gt;
  { when: { sound: [&amp;quot;dsp&amp;quot;] }, opts: [&amp;quot;ibus&amp;quot;], why: &amp;quot;wegen DSP erforderlich&amp;quot; }&lt;br /&gt;
];&lt;br /&gt;
/* ---- 4) Artikel ------------------------------------------------------------&lt;br /&gt;
   u = Shop-Link (ut = Linktext)   w = Wiki-Link (wt = Linktext)   leer = kein Link&lt;br /&gt;
   skipIf = Artikel entfällt, wenn der genannte Artikel schon in der Liste steht */&lt;br /&gt;
var ITEMS = {&lt;br /&gt;
  exl005:  { t: &amp;quot;Verlängerung EXL005&amp;quot;, d: &amp;quot;Ersetzt das Radiomodul im Kofferraum.&amp;quot;, u: SHOP + &amp;quot;detail/index/sArticle/212/&amp;quot; },&lt;br /&gt;
  fakra6m: { t: &amp;quot;Verlängerung 6 m FAKRA(m) auf FAKRA(f), gewinkelt&amp;quot;, d: &amp;quot;Antennenverlängerung vom Kofferraum nach vorn.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;shop/zubehoer/adapterkabel/192/verlaengerung-6m-fakra-m-auf-fakra-f-kurz-gewinkelt&amp;quot; },&lt;br /&gt;
  isoada:  { t: &amp;quot;Adapter ISO-Stecker auf FAKRA, gewinkelt (15 cm)&amp;quot;, d: &amp;quot;Nötig bei ISO-Antennenstecker (BM24, Rundpin).&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;shop/zubehoer/adapterkabel/193/adapter-kabel-iso-f-auf-fakra-f-kurz-gewinkelt-15cm&amp;quot; },&lt;br /&gt;
  bcdsp:   { t: &amp;quot;I-BUS App - BC+DSP Lizenz&amp;quot;, d: &amp;quot;Ohne DSP-Lizenz arbeitet das Werks-DSP nicht.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/lizenzen/171/i-bus-app-bc-dsp-lizenz&amp;quot; },&lt;br /&gt;
  halter:  { t: &amp;quot;Alu-Halter zur Radio-Montage im BMW E39&amp;quot;, d: &amp;quot;Empfohlen bei Radios, die nicht von AVIN stammen.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/radiohalter/185/alu-halter-zur-radio-montage-im-bmw-e39&amp;quot; },&lt;br /&gt;
  ibus:    { t: &amp;quot;I-BUS App&amp;quot;, d: &amp;quot;Erhält die Bordcomputer-Funktionen und steuert z. B. den Original-CD-Wechsler.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;cat/index/sCategory/42&amp;quot;,&lt;br /&gt;
             w: WIKI + &amp;quot;Was_brauche_ich_um_die_I-BUS_App_nutzen_zu_k%C3%B6nnen%3F&amp;quot;, wt: &amp;quot;Wiki: Was brauche ich für die I-BUS App?&amp;quot; },&lt;br /&gt;
  resler:  { t: &amp;quot;Resler USB I-BUS Modul inkl. Anschlusskabel&amp;quot;, d: &amp;quot;Verbindet I-BUS App und Fahrzeug.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/interfaces-module/191/resler-usb-i-bus-modul-inkl.-anschlusskabel&amp;quot;,&lt;br /&gt;
             w: &amp;quot;https://wiki.ibus-app.de/index.php?title=Hauptseite#Einbauanleitung_f.C3.BCr_Resler_Modul_und_Resler_Interface&amp;quot;, wt: &amp;quot;Einbauanleitung Resler Modul&amp;quot; },&lt;br /&gt;
  bclic:   { t: &amp;quot;I-BUS App - BC Lizenz&amp;quot;, d: &amp;quot;Schaltet u. a. die BC-Daten der App frei.&amp;quot;, skipIf: &amp;quot;bcdsp&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/lizenzen/167/i-bus-app-bc-lizenz&amp;quot; },&lt;br /&gt;
  deepobd: { t: &amp;quot;Deep OBD OBD-II Bluetooth-Adapter&amp;quot;, d: &amp;quot;Live-Werte auslesen, Fehler lesen und löschen.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/interfaces-module/258/deep-obd-obd-ii-bluetooth-adapter?c=54&amp;quot;,&lt;br /&gt;
             w: &amp;quot;https://xtrons.ibus-app.de/index.php?title=DeepOBD_-_Adapter_und_App_einrichten&amp;quot;, wt: &amp;quot;Wiki: DeepOBD einrichten&amp;quot; },&lt;br /&gt;
  can:     { t: &amp;quot;CAN-Bus Interface inkl. Anschlusskabel&amp;quot;, d: &amp;quot;Addon, funktioniert nur zusammen mit der I-BUS App.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/interfaces-module/346/can-bus-interface-inkl.-anschlusskabel&amp;quot;,&lt;br /&gt;
             w: WIKI + &amp;quot;Einbauanleitung_CAN-Bus_Interface&amp;quot;, wt: &amp;quot;Einbauanleitung CAN-Bus Interface&amp;quot; },&lt;br /&gt;
  tpms:    { t: &amp;quot;TPMS - Reifendruckkontrolle&amp;quot;, d: &amp;quot;&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/tpms/&amp;quot; },&lt;br /&gt;
  dab1:    { t: &amp;quot;DAB+ Empfänger inkl. Antenne (Single)&amp;quot;, d: &amp;quot;&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/dab/291/dab-empfaenger-inkl.-antenne-usbdab04&amp;quot; },&lt;br /&gt;
  dab2:    { t: &amp;quot;Dual DAB+ Empfänger-Stick inkl. 2 Antennen&amp;quot;, d: &amp;quot;&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/dab/391/dual-dab-empfaenger-stick-inkl.-2-antennen-acusbdab05t?c=75&amp;quot; },&lt;br /&gt;
  rcam:    { t: &amp;quot;Rückfahrkamera&amp;quot;, d: &amp;quot;&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/kameras/&amp;quot;, ut: &amp;quot;Kameras im Shop ansehen →&amp;quot; },&lt;br /&gt;
  fcam:    { t: &amp;quot;Front-Kamera&amp;quot;, d: &amp;quot;&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/kameras/&amp;quot;, ut: &amp;quot;Kameras im Shop ansehen →&amp;quot; },&lt;br /&gt;
  tool:    { t: &amp;quot;Einbau-Werkzeug (Kunststoffheber)&amp;quot;, d: &amp;quot;Zum schonenden Lösen der Verkleidungen.&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/einbauwerkzeug/&amp;quot; }&lt;br /&gt;
};&lt;br /&gt;
/* ---- 5) Regeln --------------------------------------------------------------&lt;br /&gt;
   type: need (Das brauchst Du) oder hint (Hinweise)   when = Bedingung auf die Felder&lt;br /&gt;
   opts = diese Zusatzoptionen müssen gewählt sein      items = Artikel   html = Text&lt;br /&gt;
   Abgeleitete Werte: gen (alt/b/c) und module (ja/nein/unk = Radiomodul im Kofferraum, nur gen alt) */&lt;br /&gt;
var RULES = [&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { current: [&amp;quot;werk&amp;quot;], module: [&amp;quot;ja&amp;quot;] }, items: [&amp;quot;exl005&amp;quot;, &amp;quot;fakra6m&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { current: [&amp;quot;nach&amp;quot;], module: [&amp;quot;ja&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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).&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;ja&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;nein&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;unk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Bitte prüfen:[/b] Schau nach, ob im Kofferraum ein Radiomodul sitzt. Manche E46 mit Pfeilnavi (vermutlich Vorfacelift) haben das Radio hinten und benötigen dann EXL005 und FAKRA-Verlängerung.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { ant: [&amp;quot;iso&amp;quot;] }, items: [&amp;quot;isoada&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { ant: [&amp;quot;unk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Antennenstecker:[/b] [b]BM24[/b] (Rundpin) = ISO-Antennenstecker, ggf. wird der [a=&amp;quot; + SHOP + &amp;quot;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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { sound: [&amp;quot;dsp&amp;quot;] }, items: [&amp;quot;bcdsp&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { sound: [&amp;quot;dsp&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]DSP:[/b] Damit das Werks-DSP überhaupt arbeitet, wird die I-BUS App mit BC+DSP Lizenz benötigt.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { sound: [&amp;quot;hk&amp;quot;], gen: [&amp;quot;alt&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Harman Kardon:[/b] Benötigt [b]keine[/b] DSP-Lizenz. Das Remote-Signal (+12 V, wenn Radio an) genügt zum Starten.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { aux: [&amp;quot;nein&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]AUX-IN:[/b] Der AUX-IN muss codiert werden. Optional kann ein FM-Transmitter genutzt werden - das ist nicht empfohlen.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;7er-e38&amp;quot;, &amp;quot;x5-e53&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Montage:[/b] Radios für BMW E38/E53 benötigen keine extra Halterungen.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;5er-e39&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;3er-e46&amp;quot;], factory: [&amp;quot;iris&amp;quot;, &amp;quot;mid&amp;quot;, &amp;quot;pfeil&amp;quot;], current: [&amp;quot;werk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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]&amp;quot; +&lt;br /&gt;
          &amp;quot;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]&amp;quot; +&lt;br /&gt;
          &amp;quot;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]&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, opts: [&amp;quot;ibus&amp;quot;], when: {},&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: {},&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot; }&lt;br /&gt;
];&lt;br /&gt;
/* =====================================================================&lt;br /&gt;
   PROGRAMMLOGIK&lt;br /&gt;
   ===================================================================== */&lt;br /&gt;
var $ = function (id) { return document.getElementById(id); };&lt;br /&gt;
var sel = {}, picked = {};&lt;br /&gt;
var fieldsEl = $(&amp;quot;nvk-fields&amp;quot;), optsEl = $(&amp;quot;nvk-opts&amp;quot;), outEl = $(&amp;quot;nvk-out&amp;quot;);&lt;br /&gt;
function fmt(t) {&lt;br /&gt;
  return t.replace(/\[b\]/g, &amp;quot;\u003Cb\u003E&amp;quot;).replace(/\[\/b\]/g, &amp;quot;\u003C/b\u003E&amp;quot;).replace(/\[br\]/g, &amp;quot;\u003Cbr\u003E&amp;quot;)&lt;br /&gt;
    .replace(/\[a=([^\x5D]+)\]/g, &amp;quot;\u003Ca href=\&amp;quot;$1\&amp;quot; target=\&amp;quot;_blank\&amp;quot; rel=\&amp;quot;noopener\&amp;quot;\u003E&amp;quot;).replace(/\[\/a\]/g, &amp;quot;\u003C/a\u003E&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
function match(cond, s, lenient) {&lt;br /&gt;
  if (!cond) return true;&lt;br /&gt;
  for (var k in cond) {&lt;br /&gt;
    if (!s[k]) { if (lenient) continue; return false; }&lt;br /&gt;
    if (cond[k].indexOf(s[k]) === -1) return false;&lt;br /&gt;
  }&lt;br /&gt;
  return true;&lt;br /&gt;
}&lt;br /&gt;
function vehicleOf(id) { return VEHICLES.filter(function (x) { return x.v === id; })[0]; }&lt;br /&gt;
function derive() {&lt;br /&gt;
  var s = {}, k;&lt;br /&gt;
  for (k in sel) s[k] = sel[k];&lt;br /&gt;
  var veh = vehicleOf(sel.vehicle);&lt;br /&gt;
  if (veh) s.gen = veh.gen;&lt;br /&gt;
  if (s.gen === &amp;quot;alt&amp;quot;) {&lt;br /&gt;
    if (s.factory === &amp;quot;n43&amp;quot; || s.factory === &amp;quot;n169&amp;quot;) s.module = &amp;quot;ja&amp;quot;;&lt;br /&gt;
    else if (s.factory === &amp;quot;iris&amp;quot; || s.factory === &amp;quot;mid&amp;quot;) s.module = &amp;quot;nein&amp;quot;;&lt;br /&gt;
    else if (s.factory === &amp;quot;pfeil&amp;quot;) s.module = s.trunk || &amp;quot;unk&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  return s;&lt;br /&gt;
}&lt;br /&gt;
function forced(s) {&lt;br /&gt;
  var f = {};&lt;br /&gt;
  FORCED.forEach(function (r) { if (match(r.when, s)) r.opts.forEach(function (o) { f[o] = r.why; }); });&lt;br /&gt;
  return f;&lt;br /&gt;
}&lt;br /&gt;
function onSet(s) {&lt;br /&gt;
  var f = forced(s), on = {}, k;&lt;br /&gt;
  for (k in picked) if (picked[k]) on[k] = true;&lt;br /&gt;
  for (k in f) on[k] = true;&lt;br /&gt;
  return { on: on, forced: f };&lt;br /&gt;
}&lt;br /&gt;
function optVisible(o, s, on) {&lt;br /&gt;
  if (!match(o.show, s, true)) return false;&lt;br /&gt;
  return (o.requires || []).every(function (r) { return on[r]; });&lt;br /&gt;
}&lt;br /&gt;
FIELDS.forEach(function (f) {&lt;br /&gt;
  var wrap = document.createElement(&amp;quot;div&amp;quot;); wrap.className = &amp;quot;nvk-f&amp;quot;; wrap.id = &amp;quot;nvk-w-&amp;quot; + f.id;&lt;br /&gt;
  var lab = document.createElement(&amp;quot;label&amp;quot;); lab.htmlFor = &amp;quot;nvk-&amp;quot; + f.id; lab.textContent = f.label;&lt;br /&gt;
  var s = document.createElement(&amp;quot;select&amp;quot;); s.id = &amp;quot;nvk-&amp;quot; + f.id;&lt;br /&gt;
  s.addEventListener(&amp;quot;change&amp;quot;, function () { sel[f.id] = s.value; update(); });&lt;br /&gt;
  wrap.appendChild(lab); wrap.appendChild(s);&lt;br /&gt;
  if (f.help) { var h = document.createElement(&amp;quot;div&amp;quot;); h.className = &amp;quot;nvk-help&amp;quot;; h.textContent = f.help; wrap.appendChild(h); }&lt;br /&gt;
  fieldsEl.appendChild(wrap);&lt;br /&gt;
});&lt;br /&gt;
function renderFields() {&lt;br /&gt;
  FIELDS.forEach(function (f) {&lt;br /&gt;
    var s = derive();&lt;br /&gt;
    var wrap = $(&amp;quot;nvk-w-&amp;quot; + f.id), el = $(&amp;quot;nvk-&amp;quot; + f.id);&lt;br /&gt;
    var vis = f.show ? match(f.show, s, false) : true;&lt;br /&gt;
    wrap.style.display = vis ? &amp;quot;&amp;quot; : &amp;quot;none&amp;quot;;&lt;br /&gt;
    if (!vis) { sel[f.id] = &amp;quot;&amp;quot;; return; }&lt;br /&gt;
    var allowed = f.values.filter(function (v) { return match(v.only, s, true); });&lt;br /&gt;
    if (sel[f.id]) { if (!allowed.some(function (v) { return v.v === sel[f.id]; })) sel[f.id] = &amp;quot;&amp;quot;; }&lt;br /&gt;
    if (!sel[f.id]) { if (f.def) sel[f.id] = f.def; }&lt;br /&gt;
    if (!sel[f.id]) { if (f.auto) { if (sel.vehicle) { if (allowed.length === 1) sel[f.id] = allowed[0].v; } } }&lt;br /&gt;
    el.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
    if (!f.def) { var p = document.createElement(&amp;quot;option&amp;quot;); p.value = &amp;quot;&amp;quot;; p.textContent = &amp;quot;– bitte wählen –&amp;quot;; el.appendChild(p); }&lt;br /&gt;
    allowed.forEach(function (v) {&lt;br /&gt;
      var o = document.createElement(&amp;quot;option&amp;quot;); o.value = v.v; o.textContent = v.t; el.appendChild(o);&lt;br /&gt;
    });&lt;br /&gt;
    el.value = sel[f.id] || &amp;quot;&amp;quot;;&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
function renderOpts() {&lt;br /&gt;
  var s = derive(), st = onSet(s);&lt;br /&gt;
  OPTS.forEach(function (o) { if (!optVisible(o, s, st.on)) picked[o.id] = false; });&lt;br /&gt;
  st = onSet(s);&lt;br /&gt;
  optsEl.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
  OPTS.forEach(function (o) {&lt;br /&gt;
    if (!optVisible(o, s, st.on)) return;&lt;br /&gt;
    var lab = document.createElement(&amp;quot;label&amp;quot;); lab.className = &amp;quot;nvk-o&amp;quot;;&lt;br /&gt;
    var cb = document.createElement(&amp;quot;input&amp;quot;); cb.type = &amp;quot;checkbox&amp;quot;;&lt;br /&gt;
    cb.checked = !!st.on[o.id];&lt;br /&gt;
    var isForced = !!st.forced[o.id];&lt;br /&gt;
    if (isForced) { cb.disabled = true; lab.className += &amp;quot; dis&amp;quot;; }&lt;br /&gt;
    cb.addEventListener(&amp;quot;change&amp;quot;, function () {&lt;br /&gt;
      picked[o.id] = cb.checked;&lt;br /&gt;
      if (cb.checked) { if (o.excl) OPTS.forEach(function (x) { if (x.excl === o.excl) { if (x.id !== o.id) picked[x.id] = false; } }); }&lt;br /&gt;
      update();&lt;br /&gt;
    });&lt;br /&gt;
    lab.appendChild(cb);&lt;br /&gt;
    lab.appendChild(document.createTextNode(&amp;quot; &amp;quot; + o.t));&lt;br /&gt;
    var sub = [o.sub, isForced ? st.forced[o.id] : &amp;quot;&amp;quot;].filter(Boolean).join(&amp;quot; - &amp;quot;);&lt;br /&gt;
    if (sub) { var sm = document.createElement(&amp;quot;small&amp;quot;); sm.textContent = &amp;quot; (&amp;quot; + sub + &amp;quot;)&amp;quot;; lab.appendChild(sm); }&lt;br /&gt;
    optsEl.appendChild(lab);&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
function link(url, text) {&lt;br /&gt;
  var a = document.createElement(&amp;quot;a&amp;quot;); a.href = url; a.target = &amp;quot;_blank&amp;quot;; a.rel = &amp;quot;noopener&amp;quot;; a.textContent = text; return a;&lt;br /&gt;
}&lt;br /&gt;
function card(item, cls) {&lt;br /&gt;
  var d = document.createElement(&amp;quot;div&amp;quot;); d.className = &amp;quot;nvk-card &amp;quot; + (cls || &amp;quot;&amp;quot;);&lt;br /&gt;
  var b = document.createElement(&amp;quot;b&amp;quot;); b.textContent = item.t; d.appendChild(b);&lt;br /&gt;
  if (item.d) { var p = document.createElement(&amp;quot;span&amp;quot;); p.textContent = item.d; d.appendChild(p); }&lt;br /&gt;
  if (item.u || item.w) {&lt;br /&gt;
    var l = document.createElement(&amp;quot;div&amp;quot;); l.className = &amp;quot;nvk-links&amp;quot;;&lt;br /&gt;
    if (item.u) l.appendChild(link(item.u, item.ut || &amp;quot;Im Shop ansehen →&amp;quot;));&lt;br /&gt;
    if (item.w) l.appendChild(link(item.w, (item.wt || &amp;quot;Zum Wiki&amp;quot;) + &amp;quot; →&amp;quot;));&lt;br /&gt;
    d.appendChild(l);&lt;br /&gt;
  }&lt;br /&gt;
  return d;&lt;br /&gt;
}&lt;br /&gt;
function heading(txt) { var h = document.createElement(&amp;quot;h3&amp;quot;); h.textContent = txt; outEl.appendChild(h); }&lt;br /&gt;
function renderResult() {&lt;br /&gt;
  var s = derive(), st = onSet(s);&lt;br /&gt;
  var missing = FIELDS.filter(function (f) {&lt;br /&gt;
    var w = $(&amp;quot;nvk-w-&amp;quot; + f.id);&lt;br /&gt;
    return w.style.display !== &amp;quot;none&amp;quot; ? (!f.optional ? !sel[f.id] : false) : false;&lt;br /&gt;
  });&lt;br /&gt;
  outEl.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
  if (missing.length) {&lt;br /&gt;
    var m = document.createElement(&amp;quot;p&amp;quot;); m.className = &amp;quot;nvk-miss&amp;quot;;&lt;br /&gt;
    m.textContent = &amp;quot;Bitte noch auswählen: &amp;quot; + missing.map(function (f) { return f.label; }).join(&amp;quot;, &amp;quot;);&lt;br /&gt;
    outEl.appendChild(m); return;&lt;br /&gt;
  }&lt;br /&gt;
  var needs = [], hints = [], seen = {};&lt;br /&gt;
  RULES.forEach(function (r) {&lt;br /&gt;
    if (!match(r.when, s)) return;&lt;br /&gt;
    if (r.opts) { if (!r.opts.every(function (o) { return st.on[o]; })) return; }&lt;br /&gt;
    if (r.type === &amp;quot;need&amp;quot;) (r.items || []).forEach(function (id) { if (!seen[id]) { seen[id] = 1; needs.push(ITEMS[id]); } });&lt;br /&gt;
    else hints.push(r.html);&lt;br /&gt;
  });&lt;br /&gt;
  heading(&amp;quot;Das brauchst Du&amp;quot;);&lt;br /&gt;
  if (needs.length) needs.forEach(function (i) { outEl.appendChild(card(i)); });&lt;br /&gt;
  else { var n = document.createElement(&amp;quot;p&amp;quot;); n.textContent = &amp;quot;Für die Grundinstallation sind keine zusätzlichen Verlängerungen oder Adapter nötig.&amp;quot;; outEl.appendChild(n); }&lt;br /&gt;
  var opt = [];&lt;br /&gt;
  OPTS.forEach(function (o) {&lt;br /&gt;
    if (!st.on[o.id]) return;&lt;br /&gt;
    if (!optVisible(o, s, st.on)) return;&lt;br /&gt;
    o.items.forEach(function (id) {&lt;br /&gt;
      if (seen[id]) return;&lt;br /&gt;
      var sk = ITEMS[id].skipIf;&lt;br /&gt;
      if (sk) { if (seen[sk]) return; }&lt;br /&gt;
      seen[id] = 1; opt.push(ITEMS[id]);&lt;br /&gt;
    });&lt;br /&gt;
  });&lt;br /&gt;
  if (opt.length) { heading(&amp;quot;Deine Zusatzoptionen&amp;quot;); opt.forEach(function (i) { outEl.appendChild(card(i, &amp;quot;opt&amp;quot;)); }); }&lt;br /&gt;
  if (hints.length) {&lt;br /&gt;
    heading(&amp;quot;Hinweise&amp;quot;);&lt;br /&gt;
    hints.forEach(function (t) { var d = document.createElement(&amp;quot;div&amp;quot;); d.className = &amp;quot;nvk-note&amp;quot;; d.innerHTML = fmt(t); outEl.appendChild(d); });&lt;br /&gt;
  }&lt;br /&gt;
  var veh = vehicleOf(sel.vehicle);&lt;br /&gt;
  heading(&amp;quot;Passende Radios&amp;quot;);&lt;br /&gt;
  outEl.appendChild(card({ t: &amp;quot;BMW Radios für &amp;quot; + veh.t, d: &amp;quot;Alle Radios, die für Deinen BMW &amp;quot; + veh.t + &amp;quot; im Shop erhältlich sind.&amp;quot;,&lt;br /&gt;
    u: SHOP + &amp;quot;bmw-radios/&amp;quot; + veh.v + &amp;quot;/&amp;quot;, ut: &amp;quot;Zu den passenden Radios →&amp;quot;, w: SHOP + &amp;quot;bmw-radios/&amp;quot;, wt: &amp;quot;Alle BMW Radios&amp;quot; }, &amp;quot;rad&amp;quot;));&lt;br /&gt;
}&lt;br /&gt;
function update() { renderFields(); renderOpts(); renderResult(); }&lt;br /&gt;
$(&amp;quot;nvk-reset&amp;quot;).addEventListener(&amp;quot;click&amp;quot;, function () { sel = {}; picked = {}; update(); });&lt;br /&gt;
update();&lt;br /&gt;
})();&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andre</name></author>
	</entry>
	<entry>
		<id>https://xtrons.ibus-app.de/index.php?title=Android_Radio_Konfigurator&amp;diff=4073</id>
		<title>Android Radio Konfigurator</title>
		<link rel="alternate" type="text/html" href="https://xtrons.ibus-app.de/index.php?title=Android_Radio_Konfigurator&amp;diff=4073"/>
		<updated>2026-10-21T08:11:43Z</updated>

		<summary type="html">&lt;p&gt;Andre: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;html&amp;gt;&amp;lt;div id=&amp;quot;nvk&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
#nvk{max-width:900px;line-height:1.45}&lt;br /&gt;
#nvk *{box-sizing:border-box}&lt;br /&gt;
#nvk .nvk-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:14px;margin:12px 0}&lt;br /&gt;
#nvk .nvk-f label{display:block;font-weight:700;margin-bottom:4px}&lt;br /&gt;
#nvk select{width:100%;padding:9px 8px;font:inherit;color:#202122;background:#fff;border:1px solid #a2a9b1;border-radius:4px}&lt;br /&gt;
#nvk .nvk-help{font-size:.85em;opacity:.75;margin-top:3px}&lt;br /&gt;
#nvk fieldset{border:1px solid rgba(128,128,128,.45);border-radius:6px;padding:10px 14px;margin:14px 0}&lt;br /&gt;
#nvk legend{font-weight:700;padding:0 6px}&lt;br /&gt;
#nvk .nvk-o{display:block;padding:4px 0;cursor:pointer}&lt;br /&gt;
#nvk .nvk-o small{opacity:.7}&lt;br /&gt;
#nvk .nvk-o.dis{opacity:.75;cursor:default}&lt;br /&gt;
#nvk .nvk-btn{padding:7px 14px;font:inherit;border:1px solid #a2a9b1;border-radius:4px;background:#f8f9fa;color:#202122;cursor:pointer}&lt;br /&gt;
#nvk #nvk-out{margin-top:18px}&lt;br /&gt;
#nvk h3{margin:18px 0 8px}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-card.opt{border-left-color:#14866d}&lt;br /&gt;
#nvk .nvk-card.rad{border-left-color:#d9400b}&lt;br /&gt;
#nvk .nvk-card b{display:block}&lt;br /&gt;
#nvk .nvk-links{margin-top:4px;font-weight:600}&lt;br /&gt;
#nvk .nvk-links a{margin-right:14px}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-miss{opacity:.8;font-style:italic}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-grid&amp;quot; id=&amp;quot;nvk-fields&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;fieldset id=&amp;quot;nvk-optset&amp;quot;&amp;gt;&amp;lt;legend&amp;gt;Zusatzoptionen&amp;lt;/legend&amp;gt;&amp;lt;div id=&amp;quot;nvk-opts&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/fieldset&amp;gt;&lt;br /&gt;
&amp;lt;button type=&amp;quot;button&amp;quot; class=&amp;quot;nvk-btn&amp;quot; id=&amp;quot;nvk-reset&amp;quot;&amp;gt;Auswahl zurücksetzen&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk-out&amp;quot; aria-live=&amp;quot;polite&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;noscript&amp;gt;Für den Konfigurator wird JavaScript benötigt.&amp;lt;/noscript&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
(function () {&lt;br /&gt;
&amp;quot;use strict&amp;quot;;&lt;br /&gt;
/* =====================================================================&lt;br /&gt;
   KONFIGURATION - hier wird gepflegt.&lt;br /&gt;
   Textformat in Hinweisen: [b]fett[/b]  [br] Zeilenumbruch  [a=URL]Linktext[/a]&lt;br /&gt;
   Bitte im Skript KEIN kaufmännisches Und, kein Kleiner-/Größer-Zeichen&lt;br /&gt;
   und keine Leerzeilen verwenden (das Wiki wandelt sie um).&lt;br /&gt;
   ===================================================================== */&lt;br /&gt;
var SHOP = &amp;quot;https://shop.ibus-app.de/&amp;quot;;&lt;br /&gt;
var WIKI = &amp;quot;https://wiki.ibus-app.de/index.php?title=&amp;quot;;&lt;br /&gt;
/* ---- 1) Baureihen --------------------------------------------------------&lt;br /&gt;
   v = Shop-Kategorie (Link: SHOP + bmw-radios/ + v + /)&lt;br /&gt;
   gen: alt = I-BUS-Fahrzeuge (E38/E39/E46/E53/E83)&lt;br /&gt;
        b   = M-ASK / CCC / CIC     c = CIC / NBT / NBT EVO&lt;br /&gt;
   body = Karosserieformen (siehe BODY)                                      */&lt;br /&gt;
var BODY = { limo: &amp;quot;Limousine&amp;quot;, touring: &amp;quot;Touring&amp;quot;, coupe: &amp;quot;Coupé&amp;quot;, cabrio: &amp;quot;Cabrio&amp;quot;, schraeg: &amp;quot;Schrägheck&amp;quot;,&lt;br /&gt;
  compact: &amp;quot;Compact&amp;quot;, gt: &amp;quot;Gran Turismo&amp;quot;, gc: &amp;quot;Gran Coupé&amp;quot;, suv: &amp;quot;SUV / SAV&amp;quot;, roadster: &amp;quot;Roadster&amp;quot; };&lt;br /&gt;
var VEHICLES = [&lt;br /&gt;
  { v: &amp;quot;1er-e8x&amp;quot;, t: &amp;quot;1er E8x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;schraeg,coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;1er-f2x&amp;quot;, t: &amp;quot;1er F2x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;schraeg&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;2er-f2x&amp;quot;, t: &amp;quot;2er F2x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;3er-e46&amp;quot;, t: &amp;quot;3er E46&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;limo,touring,coupe,cabrio,compact&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;3er-e9x&amp;quot;, t: &amp;quot;3er E9x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;limo,touring,coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;3er-f3x&amp;quot;, t: &amp;quot;3er F3x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;limo,touring,gt&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;4er-f3x&amp;quot;, t: &amp;quot;4er F3x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;coupe,cabrio,gc&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;5er-e39&amp;quot;, t: &amp;quot;5er E39&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;limo,touring&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;5er-e6x&amp;quot;, t: &amp;quot;5er E6x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;limo,touring&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;5er-f1x&amp;quot;, t: &amp;quot;5er F1x&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;limo,touring,gt&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;6er-e6x&amp;quot;, t: &amp;quot;6er E6x&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;coupe,cabrio&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;7er-e38&amp;quot;, t: &amp;quot;7er E38&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;limo&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;7er-e65&amp;quot;, t: &amp;quot;7er E65&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;limo&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;7er-f01&amp;quot;, t: &amp;quot;7er F01&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;limo&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x1-e84&amp;quot;, t: &amp;quot;X1 E84&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x1-f48&amp;quot;, t: &amp;quot;X1 F48&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x3-e83&amp;quot;, t: &amp;quot;X3 E83&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x3-f25&amp;quot;, t: &amp;quot;X3 F25&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x5-e53&amp;quot;, t: &amp;quot;X5 E53&amp;quot;, gen: &amp;quot;alt&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x5-e70&amp;quot;, t: &amp;quot;X5 E70&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x5-f15&amp;quot;, t: &amp;quot;X5 F15&amp;quot;, gen: &amp;quot;c&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;x6-e71&amp;quot;, t: &amp;quot;X6 E71&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;suv&amp;quot; },&lt;br /&gt;
  { v: &amp;quot;z4-e85e86&amp;quot;, t: &amp;quot;Z4 E85/E86&amp;quot;, gen: &amp;quot;b&amp;quot;, body: &amp;quot;roadster,coupe&amp;quot; }&lt;br /&gt;
];&lt;br /&gt;
var DSPV = [&amp;quot;5er-e39&amp;quot;, &amp;quot;7er-e38&amp;quot;, &amp;quot;x5-e53&amp;quot;];&lt;br /&gt;
function allIds() { return VEHICLES.map(function (x) { return x.v; }); }&lt;br /&gt;
var HKV = allIds().filter(function (v) { return DSPV.indexOf(v) === -1; });&lt;br /&gt;
var bodyValues = Object.keys(BODY).map(function (k) {&lt;br /&gt;
  return { v: k, t: BODY[k], only: { vehicle: VEHICLES.filter(function (x) { return x.body.split(&amp;quot;,&amp;quot;).indexOf(k) !== -1; }).map(function (x) { return x.v; }) } };&lt;br /&gt;
});&lt;br /&gt;
/* ---- 2) Auswahlfelder ------------------------------------------------------&lt;br /&gt;
   only = Wert nur anbieten, wenn Bedingung passt   show = Feld nur dann zeigen&lt;br /&gt;
   optional = muss nicht gewählt werden             auto = bei nur einem Wert vorwählen */&lt;br /&gt;
var FIELDS = [&lt;br /&gt;
  { id: &amp;quot;vehicle&amp;quot;, label: &amp;quot;Fahrzeug&amp;quot;, values: VEHICLES.map(function (x) { return { v: x.v, t: &amp;quot;BMW &amp;quot; + x.t }; }) },&lt;br /&gt;
  { id: &amp;quot;factory&amp;quot;, label: &amp;quot;Verbaut ab Werk&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;iris&amp;quot;,  t: &amp;quot;Radio mit IRIS&amp;quot;, only: { gen: [&amp;quot;alt&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;mid&amp;quot;,   t: &amp;quot;Radio mit MID&amp;quot;,  only: { gen: [&amp;quot;alt&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;n43&amp;quot;,   t: &amp;quot;4:3 Navi&amp;quot;,       only: { vehicle: [&amp;quot;5er-e39&amp;quot;, &amp;quot;7er-e38&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;n169&amp;quot;,  t: &amp;quot;16:9 Navi&amp;quot;,      only: { gen: [&amp;quot;alt&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;pfeil&amp;quot;, t: &amp;quot;Pfeilnavi&amp;quot;,      only: { vehicle: [&amp;quot;3er-e46&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;mask&amp;quot;,  t: &amp;quot;M-ASK&amp;quot;,          only: { gen: [&amp;quot;b&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;ccc&amp;quot;,   t: &amp;quot;CCC&amp;quot;,            only: { gen: [&amp;quot;b&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;cic&amp;quot;,   t: &amp;quot;CIC&amp;quot;,            only: { gen: [&amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;nbt&amp;quot;,   t: &amp;quot;NBT&amp;quot;,            only: { gen: [&amp;quot;c&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;nbtevo&amp;quot;, t: &amp;quot;NBT EVO&amp;quot;,       only: { gen: [&amp;quot;c&amp;quot;] } } ] },&lt;br /&gt;
  { id: &amp;quot;trunk&amp;quot;, label: &amp;quot;Befindet sich im Kofferraum ein Radiomodul?&amp;quot;, optional: true, show: { factory: [&amp;quot;pfeil&amp;quot;] }, values: [&lt;br /&gt;
    { v: &amp;quot;ja&amp;quot;, t: &amp;quot;Ja, Radio-/Navimodul im Kofferraum&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;nein&amp;quot;, t: &amp;quot;Nein, Anschlüsse nur hinter dem Radio&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;unk&amp;quot;, t: &amp;quot;Weiß ich nicht&amp;quot; } ] },&lt;br /&gt;
  { id: &amp;quot;aux&amp;quot;, label: &amp;quot;AUX-IN verfügbar?&amp;quot;, show: { gen: [&amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;] }, values: [&lt;br /&gt;
    { v: &amp;quot;ja&amp;quot;, t: &amp;quot;Ja&amp;quot; }, { v: &amp;quot;nein&amp;quot;, t: &amp;quot;Nein&amp;quot; } ] },&lt;br /&gt;
  { id: &amp;quot;sound&amp;quot;, label: &amp;quot;Soundsystem&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;stereo&amp;quot;, t: &amp;quot;Stereo&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;hifi&amp;quot;,   t: &amp;quot;Hifi&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;dsp&amp;quot;,    t: &amp;quot;DSP&amp;quot;, only: { vehicle: DSPV } },&lt;br /&gt;
    { v: &amp;quot;hk&amp;quot;,     t: &amp;quot;Harman Kardon&amp;quot;, only: { vehicle: HKV } } ] },&lt;br /&gt;
  { id: &amp;quot;current&amp;quot;, label: &amp;quot;Aktuell verbaut&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;werk&amp;quot;, t: &amp;quot;Werksradio / Werksnavi&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;nach&amp;quot;, t: &amp;quot;Nachrüst-Radio / -Navi&amp;quot; } ] },&lt;br /&gt;
  { id: &amp;quot;body&amp;quot;, label: &amp;quot;Karosserie&amp;quot;, auto: true, values: bodyValues },&lt;br /&gt;
  { id: &amp;quot;ant&amp;quot;, label: &amp;quot;Antennenstecker am Radio (optional)&amp;quot;, optional: true, def: &amp;quot;unk&amp;quot;,&lt;br /&gt;
    help: &amp;quot;BM24 (Rundpin) = ISO-Antennenstecker, ggf. Adapter nötig. BM54 = FAKRA, kein Adapter nötig.&amp;quot;,&lt;br /&gt;
    values: [&lt;br /&gt;
    { v: &amp;quot;unk&amp;quot;,   t: &amp;quot;Weiß ich nicht&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;iso&amp;quot;,   t: &amp;quot;ISO (BM24, Rundpin)&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;fakra&amp;quot;, t: &amp;quot;FAKRA (BM54)&amp;quot; } ] }&lt;br /&gt;
];&lt;br /&gt;
/* ---- 3) Zusatzoptionen (Mehrfachauswahl) ---------------------------------&lt;br /&gt;
   show = nur sichtbar wenn Bedingung passt   requires = nur sichtbar wenn diese Optionen gewählt sind&lt;br /&gt;
   excl = Optionen derselben Gruppe schließen sich aus   items = Artikel aus ITEMS */&lt;br /&gt;
var OPTS = [&lt;br /&gt;
  { id: &amp;quot;halter&amp;quot;,  t: &amp;quot;Radio-Halter&amp;quot;, sub: &amp;quot;nur BMW E39&amp;quot;, show: { vehicle: [&amp;quot;5er-e39&amp;quot;] }, items: [&amp;quot;halter&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;ibus&amp;quot;,    t: &amp;quot;I-BUS App&amp;quot;, show: { gen: [&amp;quot;alt&amp;quot;] }, items: [&amp;quot;ibus&amp;quot;, &amp;quot;resler&amp;quot;, &amp;quot;bclic&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;deepobd&amp;quot;, t: &amp;quot;DeepOBD (Diagnose)&amp;quot;, items: [&amp;quot;deepobd&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;can&amp;quot;,     t: &amp;quot;CAN Interface&amp;quot;, sub: &amp;quot;Addon - nur mit I-BUS App&amp;quot;, requires: [&amp;quot;ibus&amp;quot;], items: [&amp;quot;can&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;tpms&amp;quot;,    t: &amp;quot;TPMS (Reifendruck)&amp;quot;, items: [&amp;quot;tpms&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;dab1&amp;quot;,    t: &amp;quot;DAB+ (Single Receiver)&amp;quot;, excl: &amp;quot;dab&amp;quot;, items: [&amp;quot;dab1&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;dab2&amp;quot;,    t: &amp;quot;DAB+ (Dual Receiver)&amp;quot;,   excl: &amp;quot;dab&amp;quot;, items: [&amp;quot;dab2&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;rcam&amp;quot;,    t: &amp;quot;Rückfahrkamera&amp;quot;, items: [&amp;quot;rcam&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;fcam&amp;quot;,    t: &amp;quot;Front-Kamera&amp;quot;, items: [&amp;quot;fcam&amp;quot;] },&lt;br /&gt;
  { id: &amp;quot;tool&amp;quot;,    t: &amp;quot;Einbau-Werkzeug (Kunststoffheber)&amp;quot;, items: [&amp;quot;tool&amp;quot;] }&lt;br /&gt;
];&lt;br /&gt;
/* Erzwungene Optionen (werden automatisch gesetzt und gesperrt) */&lt;br /&gt;
var FORCED = [&lt;br /&gt;
  { when: { sound: [&amp;quot;dsp&amp;quot;] }, opts: [&amp;quot;ibus&amp;quot;], why: &amp;quot;wegen DSP erforderlich&amp;quot; }&lt;br /&gt;
];&lt;br /&gt;
/* ---- 4) Artikel ------------------------------------------------------------&lt;br /&gt;
   u = Shop-Link (ut = Linktext)   w = Wiki-Link (wt = Linktext)   leer = kein Link&lt;br /&gt;
   skipIf = Artikel entfällt, wenn der genannte Artikel schon in der Liste steht */&lt;br /&gt;
var ITEMS = {&lt;br /&gt;
  exl005:  { t: &amp;quot;Verlängerung EXL005&amp;quot;, d: &amp;quot;Ersetzt das Radiomodul im Kofferraum.&amp;quot;, u: SHOP + &amp;quot;detail/index/sArticle/212/&amp;quot; },&lt;br /&gt;
  fakra6m: { t: &amp;quot;Verlängerung 6 m FAKRA(m) auf FAKRA(f), gewinkelt&amp;quot;, d: &amp;quot;Antennenverlängerung vom Kofferraum nach vorn.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;shop/zubehoer/adapterkabel/192/verlaengerung-6m-fakra-m-auf-fakra-f-kurz-gewinkelt&amp;quot; },&lt;br /&gt;
  isoada:  { t: &amp;quot;Adapter ISO-Stecker auf FAKRA, gewinkelt (15 cm)&amp;quot;, d: &amp;quot;Nötig bei ISO-Antennenstecker (BM24, Rundpin).&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;shop/zubehoer/adapterkabel/193/adapter-kabel-iso-f-auf-fakra-f-kurz-gewinkelt-15cm&amp;quot; },&lt;br /&gt;
  bcdsp:   { t: &amp;quot;I-BUS App - BC+DSP Lizenz&amp;quot;, d: &amp;quot;Ohne DSP-Lizenz arbeitet das Werks-DSP nicht.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/lizenzen/171/i-bus-app-bc-dsp-lizenz&amp;quot; },&lt;br /&gt;
  halter:  { t: &amp;quot;Alu-Halter zur Radio-Montage im BMW E39&amp;quot;, d: &amp;quot;Empfohlen bei Radios, die nicht von AVIN stammen.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/radiohalter/185/alu-halter-zur-radio-montage-im-bmw-e39&amp;quot; },&lt;br /&gt;
  ibus:    { t: &amp;quot;I-BUS App&amp;quot;, d: &amp;quot;Erhält die Bordcomputer-Funktionen und steuert z. B. den Original-CD-Wechsler.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;cat/index/sCategory/42&amp;quot;,&lt;br /&gt;
             w: WIKI + &amp;quot;Was_brauche_ich_um_die_I-BUS_App_nutzen_zu_k%C3%B6nnen%3F&amp;quot;, wt: &amp;quot;Wiki: Was brauche ich für die I-BUS App?&amp;quot; },&lt;br /&gt;
  resler:  { t: &amp;quot;Resler USB I-BUS Modul inkl. Anschlusskabel&amp;quot;, d: &amp;quot;Verbindet I-BUS App und Fahrzeug.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/interfaces-module/191/resler-usb-i-bus-modul-inkl.-anschlusskabel&amp;quot;,&lt;br /&gt;
             w: &amp;quot;https://wiki.ibus-app.de/index.php?title=Hauptseite#Einbauanleitung_f.C3.BCr_Resler_Modul_und_Resler_Interface&amp;quot;, wt: &amp;quot;Einbauanleitung Resler Modul&amp;quot; },&lt;br /&gt;
  bclic:   { t: &amp;quot;I-BUS App - BC Lizenz&amp;quot;, d: &amp;quot;Schaltet u. a. die BC-Daten der App frei.&amp;quot;, skipIf: &amp;quot;bcdsp&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/lizenzen/167/i-bus-app-bc-lizenz&amp;quot; },&lt;br /&gt;
  deepobd: { t: &amp;quot;Deep OBD OBD-II Bluetooth-Adapter&amp;quot;, d: &amp;quot;Live-Werte auslesen, Fehler lesen und löschen.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/interfaces-module/258/deep-obd-obd-ii-bluetooth-adapter?c=54&amp;quot;,&lt;br /&gt;
             w: &amp;quot;https://xtrons.ibus-app.de/index.php?title=DeepOBD_-_Adapter_und_App_einrichten&amp;quot;, wt: &amp;quot;Wiki: DeepOBD einrichten&amp;quot; },&lt;br /&gt;
  can:     { t: &amp;quot;CAN-Bus Interface inkl. Anschlusskabel&amp;quot;, d: &amp;quot;Addon, funktioniert nur zusammen mit der I-BUS App.&amp;quot;,&lt;br /&gt;
             u: SHOP + &amp;quot;i-bus-app/zubehoer/interfaces-module/346/can-bus-interface-inkl.-anschlusskabel&amp;quot;,&lt;br /&gt;
             w: WIKI + &amp;quot;Einbauanleitung_CAN-Bus_Interface&amp;quot;, wt: &amp;quot;Einbauanleitung CAN-Bus Interface&amp;quot; },&lt;br /&gt;
  tpms:    { t: &amp;quot;TPMS - Reifendruckkontrolle&amp;quot;, d: &amp;quot;&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/tpms/&amp;quot; },&lt;br /&gt;
  dab1:    { t: &amp;quot;DAB+ Empfänger inkl. Antenne (Single)&amp;quot;, d: &amp;quot;&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/dab/291/dab-empfaenger-inkl.-antenne-usbdab04&amp;quot; },&lt;br /&gt;
  dab2:    { t: &amp;quot;Dual DAB+ Empfänger-Stick inkl. 2 Antennen&amp;quot;, d: &amp;quot;&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/dab/391/dual-dab-empfaenger-stick-inkl.-2-antennen-acusbdab05t?c=75&amp;quot; },&lt;br /&gt;
  rcam:    { t: &amp;quot;Rückfahrkamera&amp;quot;, d: &amp;quot;&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/kameras/&amp;quot;, ut: &amp;quot;Kameras im Shop ansehen →&amp;quot; },&lt;br /&gt;
  fcam:    { t: &amp;quot;Front-Kamera&amp;quot;, d: &amp;quot;&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/kameras/&amp;quot;, ut: &amp;quot;Kameras im Shop ansehen →&amp;quot; },&lt;br /&gt;
  tool:    { t: &amp;quot;Einbau-Werkzeug (Kunststoffheber)&amp;quot;, d: &amp;quot;Zum schonenden Lösen der Verkleidungen.&amp;quot;, u: SHOP + &amp;quot;radiozubehoer/einbauwerkzeug/&amp;quot; }&lt;br /&gt;
};&lt;br /&gt;
/* ---- 5) Regeln --------------------------------------------------------------&lt;br /&gt;
   type: need (Das brauchst Du) oder hint (Hinweise)   when = Bedingung auf die Felder&lt;br /&gt;
   opts = diese Zusatzoptionen müssen gewählt sein      items = Artikel   html = Text&lt;br /&gt;
   Abgeleitete Werte: gen (alt/b/c) und module (ja/nein/unk = Radiomodul im Kofferraum, nur gen alt) */&lt;br /&gt;
var RULES = [&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { current: [&amp;quot;werk&amp;quot;], module: [&amp;quot;ja&amp;quot;] }, items: [&amp;quot;exl005&amp;quot;, &amp;quot;fakra6m&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { current: [&amp;quot;nach&amp;quot;], module: [&amp;quot;ja&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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).&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;ja&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;nein&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;unk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Bitte prüfen:[/b] Schau nach, ob im Kofferraum ein Radiomodul sitzt. Manche E46 mit Pfeilnavi (vermutlich Vorfacelift) haben das Radio hinten und benötigen dann EXL005 und FAKRA-Verlängerung.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { ant: [&amp;quot;iso&amp;quot;] }, items: [&amp;quot;isoada&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { ant: [&amp;quot;unk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Antennenstecker:[/b] [b]BM24[/b] (Rundpin) = ISO-Antennenstecker, ggf. wird der [a=&amp;quot; + SHOP + &amp;quot;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.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { sound: [&amp;quot;dsp&amp;quot;] }, items: [&amp;quot;bcdsp&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { sound: [&amp;quot;dsp&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]DSP:[/b] Damit das Werks-DSP überhaupt arbeitet, wird die I-BUS App mit BC+DSP Lizenz benötigt.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { sound: [&amp;quot;hk&amp;quot;], gen: [&amp;quot;alt&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Harman Kardon:[/b] Benötigt [b]keine[/b] DSP-Lizenz. Das Remote-Signal (+12 V, wenn Radio an) genügt zum Starten.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { aux: [&amp;quot;nein&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]AUX-IN:[/b] Der AUX-IN muss codiert werden. Optional kann ein FM-Transmitter genutzt werden - das ist nicht empfohlen.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;7er-e38&amp;quot;, &amp;quot;x5-e53&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[b]Montage:[/b] Radios für BMW E38/E53 benötigen keine extra Halterungen.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;5er-e39&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;3er-e46&amp;quot;], factory: [&amp;quot;iris&amp;quot;, &amp;quot;mid&amp;quot;, &amp;quot;pfeil&amp;quot;], current: [&amp;quot;werk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;[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]&amp;quot; +&lt;br /&gt;
          &amp;quot;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]&amp;quot; +&lt;br /&gt;
          &amp;quot;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]&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, opts: [&amp;quot;ibus&amp;quot;], when: {},&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: {},&lt;br /&gt;
    html: &amp;quot;[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].&amp;quot; }&lt;br /&gt;
];&lt;br /&gt;
/* =====================================================================&lt;br /&gt;
   PROGRAMMLOGIK&lt;br /&gt;
   ===================================================================== */&lt;br /&gt;
var $ = function (id) { return document.getElementById(id); };&lt;br /&gt;
var sel = {}, picked = {};&lt;br /&gt;
var fieldsEl = $(&amp;quot;nvk-fields&amp;quot;), optsEl = $(&amp;quot;nvk-opts&amp;quot;), outEl = $(&amp;quot;nvk-out&amp;quot;);&lt;br /&gt;
function fmt(t) {&lt;br /&gt;
  return t.replace(/\[b\]/g, &amp;quot;\u003Cb\u003E&amp;quot;).replace(/\[\/b\]/g, &amp;quot;\u003C/b\u003E&amp;quot;).replace(/\[br\]/g, &amp;quot;\u003Cbr\u003E&amp;quot;)&lt;br /&gt;
    .replace(/\[a=([^\x5D]+)\]/g, &amp;quot;\u003Ca href=\&amp;quot;$1\&amp;quot; target=\&amp;quot;_blank\&amp;quot; rel=\&amp;quot;noopener\&amp;quot;\u003E&amp;quot;).replace(/\[\/a\]/g, &amp;quot;\u003C/a\u003E&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
function match(cond, s, lenient) {&lt;br /&gt;
  if (!cond) return true;&lt;br /&gt;
  for (var k in cond) {&lt;br /&gt;
    if (!s[k]) { if (lenient) continue; return false; }&lt;br /&gt;
    if (cond[k].indexOf(s[k]) === -1) return false;&lt;br /&gt;
  }&lt;br /&gt;
  return true;&lt;br /&gt;
}&lt;br /&gt;
function vehicleOf(id) { return VEHICLES.filter(function (x) { return x.v === id; })[0]; }&lt;br /&gt;
function derive() {&lt;br /&gt;
  var s = {}, k;&lt;br /&gt;
  for (k in sel) s[k] = sel[k];&lt;br /&gt;
  var veh = vehicleOf(sel.vehicle);&lt;br /&gt;
  if (veh) s.gen = veh.gen;&lt;br /&gt;
  if (s.gen === &amp;quot;alt&amp;quot;) {&lt;br /&gt;
    if (s.factory === &amp;quot;n43&amp;quot; || s.factory === &amp;quot;n169&amp;quot;) s.module = &amp;quot;ja&amp;quot;;&lt;br /&gt;
    else if (s.factory === &amp;quot;iris&amp;quot; || s.factory === &amp;quot;mid&amp;quot;) s.module = &amp;quot;nein&amp;quot;;&lt;br /&gt;
    else if (s.factory === &amp;quot;pfeil&amp;quot;) s.module = s.trunk || &amp;quot;unk&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  return s;&lt;br /&gt;
}&lt;br /&gt;
function forced(s) {&lt;br /&gt;
  var f = {};&lt;br /&gt;
  FORCED.forEach(function (r) { if (match(r.when, s)) r.opts.forEach(function (o) { f[o] = r.why; }); });&lt;br /&gt;
  return f;&lt;br /&gt;
}&lt;br /&gt;
function onSet(s) {&lt;br /&gt;
  var f = forced(s), on = {}, k;&lt;br /&gt;
  for (k in picked) if (picked[k]) on[k] = true;&lt;br /&gt;
  for (k in f) on[k] = true;&lt;br /&gt;
  return { on: on, forced: f };&lt;br /&gt;
}&lt;br /&gt;
function optVisible(o, s, on) {&lt;br /&gt;
  if (!match(o.show, s, true)) return false;&lt;br /&gt;
  return (o.requires || []).every(function (r) { return on[r]; });&lt;br /&gt;
}&lt;br /&gt;
FIELDS.forEach(function (f) {&lt;br /&gt;
  var wrap = document.createElement(&amp;quot;div&amp;quot;); wrap.className = &amp;quot;nvk-f&amp;quot;; wrap.id = &amp;quot;nvk-w-&amp;quot; + f.id;&lt;br /&gt;
  var lab = document.createElement(&amp;quot;label&amp;quot;); lab.htmlFor = &amp;quot;nvk-&amp;quot; + f.id; lab.textContent = f.label;&lt;br /&gt;
  var s = document.createElement(&amp;quot;select&amp;quot;); s.id = &amp;quot;nvk-&amp;quot; + f.id;&lt;br /&gt;
  s.addEventListener(&amp;quot;change&amp;quot;, function () { sel[f.id] = s.value; update(); });&lt;br /&gt;
  wrap.appendChild(lab); wrap.appendChild(s);&lt;br /&gt;
  if (f.help) { var h = document.createElement(&amp;quot;div&amp;quot;); h.className = &amp;quot;nvk-help&amp;quot;; h.textContent = f.help; wrap.appendChild(h); }&lt;br /&gt;
  fieldsEl.appendChild(wrap);&lt;br /&gt;
});&lt;br /&gt;
function renderFields() {&lt;br /&gt;
  FIELDS.forEach(function (f) {&lt;br /&gt;
    var s = derive();&lt;br /&gt;
    var wrap = $(&amp;quot;nvk-w-&amp;quot; + f.id), el = $(&amp;quot;nvk-&amp;quot; + f.id);&lt;br /&gt;
    var vis = f.show ? match(f.show, s, false) : true;&lt;br /&gt;
    wrap.style.display = vis ? &amp;quot;&amp;quot; : &amp;quot;none&amp;quot;;&lt;br /&gt;
    if (!vis) { sel[f.id] = &amp;quot;&amp;quot;; return; }&lt;br /&gt;
    var allowed = f.values.filter(function (v) { return match(v.only, s, true); });&lt;br /&gt;
    if (sel[f.id]) { if (!allowed.some(function (v) { return v.v === sel[f.id]; })) sel[f.id] = &amp;quot;&amp;quot;; }&lt;br /&gt;
    if (!sel[f.id]) { if (f.def) sel[f.id] = f.def; }&lt;br /&gt;
    if (!sel[f.id]) { if (f.auto) { if (sel.vehicle) { if (allowed.length === 1) sel[f.id] = allowed[0].v; } } }&lt;br /&gt;
    el.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
    if (!f.def) { var p = document.createElement(&amp;quot;option&amp;quot;); p.value = &amp;quot;&amp;quot;; p.textContent = &amp;quot;– bitte wählen –&amp;quot;; el.appendChild(p); }&lt;br /&gt;
    allowed.forEach(function (v) {&lt;br /&gt;
      var o = document.createElement(&amp;quot;option&amp;quot;); o.value = v.v; o.textContent = v.t; el.appendChild(o);&lt;br /&gt;
    });&lt;br /&gt;
    el.value = sel[f.id] || &amp;quot;&amp;quot;;&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
function renderOpts() {&lt;br /&gt;
  var s = derive(), st = onSet(s);&lt;br /&gt;
  OPTS.forEach(function (o) { if (!optVisible(o, s, st.on)) picked[o.id] = false; });&lt;br /&gt;
  st = onSet(s);&lt;br /&gt;
  optsEl.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
  OPTS.forEach(function (o) {&lt;br /&gt;
    if (!optVisible(o, s, st.on)) return;&lt;br /&gt;
    var lab = document.createElement(&amp;quot;label&amp;quot;); lab.className = &amp;quot;nvk-o&amp;quot;;&lt;br /&gt;
    var cb = document.createElement(&amp;quot;input&amp;quot;); cb.type = &amp;quot;checkbox&amp;quot;;&lt;br /&gt;
    cb.checked = !!st.on[o.id];&lt;br /&gt;
    var isForced = !!st.forced[o.id];&lt;br /&gt;
    if (isForced) { cb.disabled = true; lab.className += &amp;quot; dis&amp;quot;; }&lt;br /&gt;
    cb.addEventListener(&amp;quot;change&amp;quot;, function () {&lt;br /&gt;
      picked[o.id] = cb.checked;&lt;br /&gt;
      if (cb.checked) { if (o.excl) OPTS.forEach(function (x) { if (x.excl === o.excl) { if (x.id !== o.id) picked[x.id] = false; } }); }&lt;br /&gt;
      update();&lt;br /&gt;
    });&lt;br /&gt;
    lab.appendChild(cb);&lt;br /&gt;
    lab.appendChild(document.createTextNode(&amp;quot; &amp;quot; + o.t));&lt;br /&gt;
    var sub = [o.sub, isForced ? st.forced[o.id] : &amp;quot;&amp;quot;].filter(Boolean).join(&amp;quot; - &amp;quot;);&lt;br /&gt;
    if (sub) { var sm = document.createElement(&amp;quot;small&amp;quot;); sm.textContent = &amp;quot; (&amp;quot; + sub + &amp;quot;)&amp;quot;; lab.appendChild(sm); }&lt;br /&gt;
    optsEl.appendChild(lab);&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
function link(url, text) {&lt;br /&gt;
  var a = document.createElement(&amp;quot;a&amp;quot;); a.href = url; a.target = &amp;quot;_blank&amp;quot;; a.rel = &amp;quot;noopener&amp;quot;; a.textContent = text; return a;&lt;br /&gt;
}&lt;br /&gt;
function card(item, cls) {&lt;br /&gt;
  var d = document.createElement(&amp;quot;div&amp;quot;); d.className = &amp;quot;nvk-card &amp;quot; + (cls || &amp;quot;&amp;quot;);&lt;br /&gt;
  var b = document.createElement(&amp;quot;b&amp;quot;); b.textContent = item.t; d.appendChild(b);&lt;br /&gt;
  if (item.d) { var p = document.createElement(&amp;quot;span&amp;quot;); p.textContent = item.d; d.appendChild(p); }&lt;br /&gt;
  if (item.u || item.w) {&lt;br /&gt;
    var l = document.createElement(&amp;quot;div&amp;quot;); l.className = &amp;quot;nvk-links&amp;quot;;&lt;br /&gt;
    if (item.u) l.appendChild(link(item.u, item.ut || &amp;quot;Im Shop ansehen →&amp;quot;));&lt;br /&gt;
    if (item.w) l.appendChild(link(item.w, (item.wt || &amp;quot;Zum Wiki&amp;quot;) + &amp;quot; →&amp;quot;));&lt;br /&gt;
    d.appendChild(l);&lt;br /&gt;
  }&lt;br /&gt;
  return d;&lt;br /&gt;
}&lt;br /&gt;
function heading(txt) { var h = document.createElement(&amp;quot;h3&amp;quot;); h.textContent = txt; outEl.appendChild(h); }&lt;br /&gt;
function renderResult() {&lt;br /&gt;
  var s = derive(), st = onSet(s);&lt;br /&gt;
  var missing = FIELDS.filter(function (f) {&lt;br /&gt;
    var w = $(&amp;quot;nvk-w-&amp;quot; + f.id);&lt;br /&gt;
    return w.style.display !== &amp;quot;none&amp;quot; ? (!f.optional ? !sel[f.id] : false) : false;&lt;br /&gt;
  });&lt;br /&gt;
  outEl.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
  if (missing.length) {&lt;br /&gt;
    var m = document.createElement(&amp;quot;p&amp;quot;); m.className = &amp;quot;nvk-miss&amp;quot;;&lt;br /&gt;
    m.textContent = &amp;quot;Bitte noch auswählen: &amp;quot; + missing.map(function (f) { return f.label; }).join(&amp;quot;, &amp;quot;);&lt;br /&gt;
    outEl.appendChild(m); return;&lt;br /&gt;
  }&lt;br /&gt;
  var needs = [], hints = [], seen = {};&lt;br /&gt;
  RULES.forEach(function (r) {&lt;br /&gt;
    if (!match(r.when, s)) return;&lt;br /&gt;
    if (r.opts) { if (!r.opts.every(function (o) { return st.on[o]; })) return; }&lt;br /&gt;
    if (r.type === &amp;quot;need&amp;quot;) (r.items || []).forEach(function (id) { if (!seen[id]) { seen[id] = 1; needs.push(ITEMS[id]); } });&lt;br /&gt;
    else hints.push(r.html);&lt;br /&gt;
  });&lt;br /&gt;
  heading(&amp;quot;Das brauchst Du&amp;quot;);&lt;br /&gt;
  if (needs.length) needs.forEach(function (i) { outEl.appendChild(card(i)); });&lt;br /&gt;
  else { var n = document.createElement(&amp;quot;p&amp;quot;); n.textContent = &amp;quot;Für die Grundinstallation sind keine zusätzlichen Verlängerungen oder Adapter nötig.&amp;quot;; outEl.appendChild(n); }&lt;br /&gt;
  var opt = [];&lt;br /&gt;
  OPTS.forEach(function (o) {&lt;br /&gt;
    if (!st.on[o.id]) return;&lt;br /&gt;
    if (!optVisible(o, s, st.on)) return;&lt;br /&gt;
    o.items.forEach(function (id) {&lt;br /&gt;
      if (seen[id]) return;&lt;br /&gt;
      var sk = ITEMS[id].skipIf;&lt;br /&gt;
      if (sk) { if (seen[sk]) return; }&lt;br /&gt;
      seen[id] = 1; opt.push(ITEMS[id]);&lt;br /&gt;
    });&lt;br /&gt;
  });&lt;br /&gt;
  if (opt.length) { heading(&amp;quot;Deine Zusatzoptionen&amp;quot;); opt.forEach(function (i) { outEl.appendChild(card(i, &amp;quot;opt&amp;quot;)); }); }&lt;br /&gt;
  if (hints.length) {&lt;br /&gt;
    heading(&amp;quot;Hinweise&amp;quot;);&lt;br /&gt;
    hints.forEach(function (t) { var d = document.createElement(&amp;quot;div&amp;quot;); d.className = &amp;quot;nvk-note&amp;quot;; d.innerHTML = fmt(t); outEl.appendChild(d); });&lt;br /&gt;
  }&lt;br /&gt;
  var veh = vehicleOf(sel.vehicle);&lt;br /&gt;
  heading(&amp;quot;Passende Radios&amp;quot;);&lt;br /&gt;
  outEl.appendChild(card({ t: &amp;quot;BMW Radios für &amp;quot; + veh.t, d: &amp;quot;Alle Radios, die für Deinen BMW &amp;quot; + veh.t + &amp;quot; im Shop erhältlich sind.&amp;quot;,&lt;br /&gt;
    u: SHOP + &amp;quot;bmw-radios/&amp;quot; + veh.v + &amp;quot;/&amp;quot;, ut: &amp;quot;Zu den passenden Radios →&amp;quot;, w: SHOP + &amp;quot;bmw-radios/&amp;quot;, wt: &amp;quot;Alle BMW Radios&amp;quot; }, &amp;quot;rad&amp;quot;));&lt;br /&gt;
}&lt;br /&gt;
function update() { renderFields(); renderOpts(); renderResult(); }&lt;br /&gt;
$(&amp;quot;nvk-reset&amp;quot;).addEventListener(&amp;quot;click&amp;quot;, function () { sel = {}; picked = {}; update(); });&lt;br /&gt;
update();&lt;br /&gt;
})();&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andre</name></author>
	</entry>
	<entry>
		<id>https://xtrons.ibus-app.de/index.php?title=Android_Radio_Konfigurator&amp;diff=4072</id>
		<title>Android Radio Konfigurator</title>
		<link rel="alternate" type="text/html" href="https://xtrons.ibus-app.de/index.php?title=Android_Radio_Konfigurator&amp;diff=4072"/>
		<updated>2026-10-21T07:56:04Z</updated>

		<summary type="html">&lt;p&gt;Andre: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
#nvk{max-width:900px;line-height:1.45}&lt;br /&gt;
#nvk *{box-sizing:border-box}&lt;br /&gt;
#nvk .nvk-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:14px;margin:12px 0}&lt;br /&gt;
#nvk .nvk-f label,#nvk .nvk-h{display:block;font-weight:700;margin-bottom:4px}&lt;br /&gt;
#nvk select{width:100%;padding:9px 8px;font:inherit;color:#202122;background:#fff;border:1px solid #a2a9b1;border-radius:4px}&lt;br /&gt;
#nvk fieldset{border:1px solid rgba(128,128,128,.45);border-radius:6px;padding:10px 14px;margin:14px 0}&lt;br /&gt;
#nvk legend{font-weight:700;padding:0 6px}&lt;br /&gt;
#nvk .nvk-o{display:block;padding:4px 0;cursor:pointer}&lt;br /&gt;
#nvk .nvk-o small{opacity:.7}&lt;br /&gt;
#nvk .nvk-o.dis{opacity:.75;cursor:default}&lt;br /&gt;
#nvk .nvk-btn{padding:7px 14px;font:inherit;border:1px solid #a2a9b1;border-radius:4px;background:#f8f9fa;color:#202122;cursor:pointer}&lt;br /&gt;
#nvk #nvk-out{margin-top:18px}&lt;br /&gt;
#nvk h3{margin:18px 0 8px}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-card.opt{border-left-color:#14866d}&lt;br /&gt;
#nvk .nvk-card b{display:block}&lt;br /&gt;
#nvk .nvk-card a.nvk-shop{display:inline-block;margin-top:4px;font-weight:600}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-miss{opacity:.8;font-style:italic}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-grid&amp;quot; id=&amp;quot;nvk-fields&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;fieldset id=&amp;quot;nvk-optset&amp;quot;&amp;gt;&amp;lt;legend&amp;gt;Zusatzoptionen&amp;lt;/legend&amp;gt;&amp;lt;div id=&amp;quot;nvk-opts&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/fieldset&amp;gt;&lt;br /&gt;
&amp;lt;button type=&amp;quot;button&amp;quot; class=&amp;quot;nvk-btn&amp;quot; id=&amp;quot;nvk-reset&amp;quot;&amp;gt;Auswahl zurücksetzen&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk-out&amp;quot; aria-live=&amp;quot;polite&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;noscript&amp;gt;Für den Konfigurator wird JavaScript benötigt.&amp;lt;/noscript&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
(function () {&lt;br /&gt;
&amp;quot;use strict&amp;quot;;&lt;br /&gt;
/* =====================================================================&lt;br /&gt;
   KONFIGURATION – hier wird gepflegt. Kein weiterer Code nötig.&lt;br /&gt;
   ===================================================================== */&lt;br /&gt;
/* ---- 1) Auswahlfelder -------------------------------------------------&lt;br /&gt;
   v = interner Wert, t = Anzeigetext,&lt;br /&gt;
   only = Wert nur anbieten, wenn Bedingung passt (z. B. nur bestimmte Fahrzeuge)&lt;br /&gt;
   show = ganzes Feld nur zeigen, wenn Bedingung passt                      */&lt;br /&gt;
var FIELDS = [&lt;br /&gt;
  { id: &amp;quot;vehicle&amp;quot;, label: &amp;quot;Fahrzeug&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;E38&amp;quot;, t: &amp;quot;BMW E38&amp;quot; }, { v: &amp;quot;E39&amp;quot;, t: &amp;quot;BMW E39&amp;quot; }, { v: &amp;quot;E46&amp;quot;, t: &amp;quot;BMW E46&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;E53&amp;quot;, t: &amp;quot;BMW E53&amp;quot; }, { v: &amp;quot;E83&amp;quot;, t: &amp;quot;BMW E83&amp;quot; } ] },&lt;br /&gt;
  { id: &amp;quot;factory&amp;quot;, label: &amp;quot;Verbaut ab Werk&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;iris&amp;quot;,  t: &amp;quot;Radio mit IRIS&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;mid&amp;quot;,   t: &amp;quot;Radio mit MID&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;n43&amp;quot;,   t: &amp;quot;4:3 Navi&amp;quot;,  only: { vehicle: [&amp;quot;E38&amp;quot;, &amp;quot;E39&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;n169&amp;quot;,  t: &amp;quot;16:9 Navi&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;pfeil&amp;quot;, t: &amp;quot;Pfeilnavi&amp;quot;, only: { vehicle: [&amp;quot;E46&amp;quot;] } } ] },&lt;br /&gt;
  { id: &amp;quot;trunk&amp;quot;, label: &amp;quot;Befindet sich im Kofferraum ein Radiomodul?&amp;quot;,&lt;br /&gt;
    show: { factory: [&amp;quot;pfeil&amp;quot;] }, values: [&lt;br /&gt;
    { v: &amp;quot;ja&amp;quot;, t: &amp;quot;Ja, Radio-/Navimodul im Kofferraum&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;nein&amp;quot;, t: &amp;quot;Nein, Anschlüsse nur hinter dem Radio&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;unk&amp;quot;, t: &amp;quot;Weiß ich nicht&amp;quot; } ] },&lt;br /&gt;
  { id: &amp;quot;sound&amp;quot;, label: &amp;quot;Soundsystem&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;stereo&amp;quot;, t: &amp;quot;Stereo&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;hifi&amp;quot;,   t: &amp;quot;Hifi&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;dsp&amp;quot;,    t: &amp;quot;DSP&amp;quot;,          only: { vehicle: [&amp;quot;E38&amp;quot;, &amp;quot;E39&amp;quot;, &amp;quot;E53&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;hk&amp;quot;,     t: &amp;quot;Harman Kardon&amp;quot;, only: { vehicle: [&amp;quot;E46&amp;quot;, &amp;quot;E83&amp;quot;] } } ] },&lt;br /&gt;
  { id: &amp;quot;current&amp;quot;, label: &amp;quot;Aktuell verbaut&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;werk&amp;quot;, t: &amp;quot;Werksradio / Werksnavi&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;nach&amp;quot;, t: &amp;quot;Nachrüst-Radio / -Navi&amp;quot; } ] },&lt;br /&gt;
  { id: &amp;quot;body&amp;quot;, label: &amp;quot;Karosserie&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;limo&amp;quot;,    t: &amp;quot;Limousine&amp;quot;, only: { vehicle: [&amp;quot;E38&amp;quot;, &amp;quot;E39&amp;quot;, &amp;quot;E46&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;touring&amp;quot;, t: &amp;quot;Touring&amp;quot;,   only: { vehicle: [&amp;quot;E39&amp;quot;, &amp;quot;E46&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;coupe&amp;quot;,   t: &amp;quot;Coupé&amp;quot;,     only: { vehicle: [&amp;quot;E46&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;cabrio&amp;quot;,  t: &amp;quot;Cabrio&amp;quot;,    only: { vehicle: [&amp;quot;E46&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;suv&amp;quot;,     t: &amp;quot;SUV&amp;quot;,       only: { vehicle: [&amp;quot;E53&amp;quot;, &amp;quot;E83&amp;quot;] } } ] },&lt;br /&gt;
  { id: &amp;quot;ant&amp;quot;, label: &amp;quot;Antennenstecker am Radio (optional)&amp;quot;, optional: true, def: &amp;quot;unk&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;unk&amp;quot;,   t: &amp;quot;Weiß ich nicht&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;iso&amp;quot;,   t: &amp;quot;ISO (rund, „BM24“)&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;fakra&amp;quot;, t: &amp;quot;FAKRA (eckig, „BM54“)&amp;quot; } ] }&lt;br /&gt;
];&lt;br /&gt;
/* ---- 2) Zusatzoptionen (Mehrfachauswahl) -----------------------------&lt;br /&gt;
   show     = Option nur sichtbar, wenn Bedingung passt&lt;br /&gt;
   requires = Option nur sichtbar, wenn diese anderen Optionen gewählt sind&lt;br /&gt;
   excl     = Optionen mit gleicher excl-Gruppe schließen sich gegenseitig aus&lt;br /&gt;
   item     = Eintrag in ITEMS, der in der Liste erscheint                  */&lt;br /&gt;
var OPTS = [&lt;br /&gt;
  { id: &amp;quot;halter&amp;quot;,  t: &amp;quot;Radio-Halter&amp;quot;, sub: &amp;quot;nur BMW E39&amp;quot;, show: { vehicle: [&amp;quot;E39&amp;quot;] }, item: &amp;quot;halter&amp;quot; },&lt;br /&gt;
  { id: &amp;quot;ibus&amp;quot;,    t: &amp;quot;I-BUS App&amp;quot;, item: &amp;quot;ibus&amp;quot; },&lt;br /&gt;
  { id: &amp;quot;deepobd&amp;quot;, t: &amp;quot;DeepOBD (Diagnose)&amp;quot;, item: &amp;quot;deepobd&amp;quot; },&lt;br /&gt;
  { id: &amp;quot;can&amp;quot;,     t: &amp;quot;CAN Interface&amp;quot;, sub: &amp;quot;Addon – nur mit I-BUS App&amp;quot;, requires: [&amp;quot;ibus&amp;quot;], item: &amp;quot;can&amp;quot; },&lt;br /&gt;
  { id: &amp;quot;tpms&amp;quot;,    t: &amp;quot;TPMS (Reifendruck)&amp;quot;, item: &amp;quot;tpms&amp;quot; },&lt;br /&gt;
  { id: &amp;quot;dab1&amp;quot;,    t: &amp;quot;DAB+ (Single Receiver)&amp;quot;, excl: &amp;quot;dab&amp;quot;, item: &amp;quot;dab1&amp;quot; },&lt;br /&gt;
  { id: &amp;quot;dab2&amp;quot;,    t: &amp;quot;DAB+ (Dual Receiver)&amp;quot;,   excl: &amp;quot;dab&amp;quot;, item: &amp;quot;dab2&amp;quot; },&lt;br /&gt;
  { id: &amp;quot;rcam&amp;quot;,    t: &amp;quot;Rückfahrkamera&amp;quot;, item: &amp;quot;rcam&amp;quot; },&lt;br /&gt;
  { id: &amp;quot;fcam&amp;quot;,    t: &amp;quot;Front-Kamera&amp;quot;, item: &amp;quot;fcam&amp;quot; },&lt;br /&gt;
  { id: &amp;quot;tool&amp;quot;,    t: &amp;quot;Einbau-Werkzeug (Kunststoffheber)&amp;quot;, item: &amp;quot;tool&amp;quot; }&lt;br /&gt;
];&lt;br /&gt;
/* Wird eine Option durch eine Auswahl erzwungen, wird sie automatisch gesetzt. */&lt;br /&gt;
var FORCED = [&lt;br /&gt;
  { when: { sound: [&amp;quot;dsp&amp;quot;] }, opts: [&amp;quot;ibus&amp;quot;], why: &amp;quot;wegen DSP erforderlich&amp;quot; }&lt;br /&gt;
];&lt;br /&gt;
/* ---- 3) Artikel/Produkte ---------------------------------------------&lt;br /&gt;
   u = Link in den Shop (leer lassen = Eintrag ohne Link)                  */&lt;br /&gt;
var ITEMS = {&lt;br /&gt;
  exl005:  { t: &amp;quot;Verlängerung EXL005&amp;quot;, d: &amp;quot;Ersetzt das Radiomodul im Kofferraum (Bus-/Stromanschluss nach vorn).&amp;quot;,&lt;br /&gt;
             u: &amp;quot;https://shop.ibus-app.de/detail/index/sArticle/212/&amp;quot; },&lt;br /&gt;
  fakra6m: { t: &amp;quot;Verlängerung 6 m FAKRA(m) auf FAKRA(f), gewinkelt&amp;quot;, d: &amp;quot;Antennenverlängerung vom Kofferraum nach vorn.&amp;quot;,&lt;br /&gt;
             u: &amp;quot;https://shop.ibus-app.de/shop/zubehoer/adapterkabel/192/verlaengerung-6m-fakra-m-auf-fakra-f-kurz-gewinkelt&amp;quot; },&lt;br /&gt;
  isoada:  { t: &amp;quot;Adapter ISO-Stecker auf FAKRA, gewinkelt (15 cm)&amp;quot;, d: &amp;quot;Nötig, wenn das Fahrzeug einen ISO-Antennenstecker hat.&amp;quot;,&lt;br /&gt;
             u: &amp;quot;https://shop.ibus-app.de/shop/zubehoer/adapterkabel/193/adapter-kabel-iso-f-auf-fakra-f-kurz-gewinkelt-15cm&amp;quot; },&lt;br /&gt;
  dsplic:  { t: &amp;quot;DSP-Lizenz für die I-BUS App&amp;quot;, d: &amp;quot;Ohne diese Lizenz arbeitet das Werks-DSP nicht.&amp;quot;, u: &amp;quot;&amp;quot; },&lt;br /&gt;
  halter:  { t: &amp;quot;Halter zur Radio-Montage im BMW E39&amp;quot;, d: &amp;quot;Empfohlen bei Radios, die nicht von AVIN stammen.&amp;quot;,&lt;br /&gt;
             u: &amp;quot;https://shop.ibus-app.de/shop/zubehoer/182/halter-zur-radio-montage-im-bmw-e39&amp;quot; },&lt;br /&gt;
  ibus:    { t: &amp;quot;I-BUS App&amp;quot;, d: &amp;quot;Erhält Bordcomputer-Funktionen und steuert z. B. den Original-CD-Wechsler.&amp;quot;,&lt;br /&gt;
             u: &amp;quot;http://www.ibus-app.de&amp;quot; },&lt;br /&gt;
  deepobd: { t: &amp;quot;DeepOBD (Diagnose)&amp;quot;, d: &amp;quot;Live-Werte auslesen, Fehler lesen und löschen.&amp;quot;, u: &amp;quot;&amp;quot; },&lt;br /&gt;
  can:     { t: &amp;quot;CAN Interface (Addon zur I-BUS App)&amp;quot;, d: &amp;quot;Funktioniert nur zusammen mit der I-BUS App.&amp;quot;, u: &amp;quot;&amp;quot; },&lt;br /&gt;
  tpms:    { t: &amp;quot;TPMS – Reifendruckanzeige&amp;quot;, d: &amp;quot;&amp;quot;, u: &amp;quot;https://xtrons.co.uk/tyre-pressure-monitoring-system-tpms01&amp;quot; },&lt;br /&gt;
  dab1:    { t: &amp;quot;DAB+ Single Receiver&amp;quot;, d: &amp;quot;&amp;quot;, u: &amp;quot;https://xtrons.co.uk/dab-tuner-usbdab01&amp;quot; },&lt;br /&gt;
  dab2:    { t: &amp;quot;DAB+ Dual Receiver&amp;quot;, d: &amp;quot;&amp;quot;, u: &amp;quot;&amp;quot; },&lt;br /&gt;
  rcam:    { t: &amp;quot;Rückfahrkamera&amp;quot;, d: &amp;quot;&amp;quot;, u: &amp;quot;&amp;quot; },&lt;br /&gt;
  fcam:    { t: &amp;quot;Front-Kamera&amp;quot;, d: &amp;quot;&amp;quot;, u: &amp;quot;&amp;quot; },&lt;br /&gt;
  tool:    { t: &amp;quot;Einbau-Werkzeug (Kunststoffheber)&amp;quot;, d: &amp;quot;Zum schonenden Lösen der Verkleidungen.&amp;quot;, u: &amp;quot;&amp;quot; }&lt;br /&gt;
};&lt;br /&gt;
/* ---- 4) Regeln --------------------------------------------------------&lt;br /&gt;
   type  = &amp;quot;need&amp;quot; (Das brauchst Du) | &amp;quot;hint&amp;quot; (Hinweise)&lt;br /&gt;
   when  = Bedingung auf die Auswahlfelder (alle Schlüssel müssen passen)&lt;br /&gt;
   opts  = (optional) diese Zusatzoptionen müssen gewählt sein&lt;br /&gt;
   items = Artikel aus ITEMS      html = Hinweistext (HTML erlaubt)&lt;br /&gt;
   Abgeleiteter Wert &amp;quot;module&amp;quot;: ja = Radiomodul im Kofferraum, nein = nicht, unk = unklar */&lt;br /&gt;
var RULES = [&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { current: [&amp;quot;werk&amp;quot;], module: [&amp;quot;ja&amp;quot;] }, items: [&amp;quot;exl005&amp;quot;, &amp;quot;fakra6m&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { current: [&amp;quot;nach&amp;quot;], module: [&amp;quot;ja&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;\u003Cb\u003EVerlängerungen prüfen:\u003C/b\u003E Bei einem bereits verbauten Nachrüst-Radio sollten EXL005 und FAKRA-Verlängerung schon vorhanden sein. \u003Cb\u003EUngeeignet\u003C/b\u003E sind die Standard-„Quad-Lock-Verlängerung kombiniert mit Antennenverlängerung“ und die „EXL006“ (kein BUS-Signal).&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;ja&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;\u003Cb\u003EKabelwege:\u003C/b\u003E Die Technik sitzt im Kofferraum. Es müssen mindestens Kabel für Radioanschluss und FM-Antenne nach vorn verlegt werden. Optional zusätzlich: GPS (OEM-Antenne), Verlängerung für DAB+, Anschluss OEM-CD-Wechsler, Cinch für Subwoofer.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;nein&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;\u003Cb\u003EKabelwege:\u003C/b\u003E Alle Anschlüsse befinden sich direkt hinter dem Radio, es müssen \u003Cb\u003Ekeine\u003C/b\u003E Kabel verlegt werden. Optional ggf. für: GPS (OEM-Antenne), DAB+, OEM-CD-Wechsler, Cinch für Subwoofer.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;unk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;\u003Cb\u003EBitte prüfen:\u003C/b\u003E Schau nach, ob im Kofferraum ein Radiomodul sitzt. Manche E46 mit Pfeilnavi (vermutlich Vorfacelift) haben das Radio hinten und benötigen dann EXL005 + FAKRA-Verlängerung.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { ant: [&amp;quot;iso&amp;quot;] }, items: [&amp;quot;isoada&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { ant: [&amp;quot;unk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;\u003Cb\u003EAntennenstecker:\u003C/b\u003E Hat Dein Fahrzeug einen ISO-Antennenstecker, brauchst Du zusätzlich den \u003Ca href='https://shop.ibus-app.de/shop/zubehoer/adapterkabel/193/adapter-kabel-iso-f-auf-fakra-f-kurz-gewinkelt-15cm'\u003EAdapter ISO auf FAKRA\u003C/a\u003E. Bei FAKRA ist kein Adapter nötig.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { sound: [&amp;quot;dsp&amp;quot;] }, items: [&amp;quot;dsplic&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { sound: [&amp;quot;dsp&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;\u003Cb\u003EDSP:\u003C/b\u003E Damit das Werks-DSP überhaupt arbeitet, wird die I-BUS App mit DSP-Lizenz benötigt.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { sound: [&amp;quot;hk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;\u003Cb\u003EHarman Kardon:\u003C/b\u003E Benötigt \u003Cb\u003Ekeine\u003C/b\u003E DSP-Lizenz. Das Remote-Signal (+12 V, wenn Radio an) genügt zum Starten.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;E38&amp;quot;, &amp;quot;E53&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;\u003Cb\u003EMontage:\u003C/b\u003E Radios für BMW E38/E53 benötigen keine extra Halterungen.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;E39&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;\u003Cb\u003EMontage:\u003C/b\u003E Bei Radios, die nicht von AVIN stammen, empfehlen wir einen Halter (siehe Zusatzoptionen) oder das Bearbeiten der beiliegenden Montagewinkel. Anleitungen: \u003Ca href='https://xtrons.ibus-app.de/index.php?title=Montageanleitungen'\u003EMontageanleitungen\u003C/a\u003E.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;E46&amp;quot;], factory: [&amp;quot;iris&amp;quot;, &amp;quot;mid&amp;quot;, &amp;quot;pfeil&amp;quot;], current: [&amp;quot;werk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;\u003Cb\u003EMontage E46 ohne großes Navi:\u003C/b\u003E Das Klimabedienteil muss nach unten versetzt werden. Dafür brauchst Du den passenden \u003Cb\u003EFunktionsträger\u003C/b\u003E (neu ca. 100 €, ggf. beim Teileverwerter günstiger):\u003Cbr\u003E&amp;quot; +&lt;br /&gt;
          &amp;quot;Einzelschalter (eher VFL): \u003Ca href='https://www.leebmann24.de/trager-3er-51168202186.html'\u003Eohne Raucher 51168202186\u003C/a\u003E / \u003Ca href='https://www.leebmann24.de/trager-3er-51168230902.html'\u003Emit Raucher 51168230902\u003C/a\u003E\u003Cbr\u003E&amp;quot; +&lt;br /&gt;
          &amp;quot;Schaltzentrum (eher FL): \u003Ca href='https://www.leebmann24.de/funktionstrager-schaltzentrum-3er-51167001408.html'\u003Eohne Raucher 51167001408\u003C/a\u003E / \u003Ca href='https://www.leebmann24.de/funktionstrager-schaltzentrum-3er-51167001410.html'\u003Emit Raucher 51167001410\u003C/a\u003E&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, opts: [&amp;quot;ibus&amp;quot;], when: {},&lt;br /&gt;
    html: &amp;quot;\u003Cb\u003EI-BUS App:\u003C/b\u003E Siehe \u003Ca href='https://wiki.ibus-app.de/index.php?title=Was_brauche_ich_um_die_I-BUS_App_nutzen_zu_k%C3%B6nnen%3F'\u003EWas brauche ich, um die I-BUS App nutzen zu können?\u003C/a\u003E und die \u003Ca href='https://wiki.ibus-app.de/index.php?title=Einbauanleitung_f%C3%BCr_Resler_Modul_und_Resler_Interface'\u003EEinbauanleitung für Resler Modul und Interface\u003C/a\u003E.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: {}, opts: [],&lt;br /&gt;
    html: &amp;quot;\u003Cb\u003EWichtig:\u003C/b\u003E Bitte immer die Anschlüsse am eigenen Radio abgleichen. Welches Radio passt? → \u003Ca href='https://xtrons.ibus-app.de/index.php?title=Entscheidungshilfe%3A_AVIN_oder_XTRONS%3F'\u003EEntscheidungshilfe AVIN oder XTRONS\u003C/a\u003E, Kosten → \u003Ca href='https://xtrons.ibus-app.de/index.php?title=Grobe_Kosten%C3%BCbersicht'\u003EGrobe Kostenübersicht\u003C/a\u003E.&amp;quot; }&lt;br /&gt;
];&lt;br /&gt;
/* =====================================================================&lt;br /&gt;
   PROGRAMMLOGIK&lt;br /&gt;
   ===================================================================== */&lt;br /&gt;
var $ = function (id) { return document.getElementById(id); };&lt;br /&gt;
var sel = {}, picked = {};&lt;br /&gt;
var fieldsEl = $(&amp;quot;nvk-fields&amp;quot;), optsEl = $(&amp;quot;nvk-opts&amp;quot;), outEl = $(&amp;quot;nvk-out&amp;quot;);&lt;br /&gt;
function match(cond, s, lenient) {&lt;br /&gt;
  if (!cond) return true;&lt;br /&gt;
  for (var k in cond) {&lt;br /&gt;
    if (!s[k]) { if (lenient) continue; return false; }&lt;br /&gt;
    if (cond[k].indexOf(s[k]) === -1) return false;&lt;br /&gt;
  }&lt;br /&gt;
  return true;&lt;br /&gt;
}&lt;br /&gt;
function derive() {&lt;br /&gt;
  var s = {}, k;&lt;br /&gt;
  for (k in sel) s[k] = sel[k];&lt;br /&gt;
  if (s.factory === &amp;quot;n43&amp;quot; || s.factory === &amp;quot;n169&amp;quot;) s.module = &amp;quot;ja&amp;quot;;&lt;br /&gt;
  else if (s.factory === &amp;quot;iris&amp;quot; || s.factory === &amp;quot;mid&amp;quot;) s.module = &amp;quot;nein&amp;quot;;&lt;br /&gt;
  else if (s.factory === &amp;quot;pfeil&amp;quot;) s.module = s.trunk || &amp;quot;unk&amp;quot;;&lt;br /&gt;
  return s;&lt;br /&gt;
}&lt;br /&gt;
function forced(s) {&lt;br /&gt;
  var f = {};&lt;br /&gt;
  FORCED.forEach(function (r) { if (match(r.when, s)) r.opts.forEach(function (o) { f[o] = r.why; }); });&lt;br /&gt;
  return f;&lt;br /&gt;
}&lt;br /&gt;
function onSet(s) {&lt;br /&gt;
  var f = forced(s), on = {}, k;&lt;br /&gt;
  for (k in picked) if (picked[k]) on[k] = true;&lt;br /&gt;
  for (k in f) on[k] = true;&lt;br /&gt;
  return { on: on, forced: f };&lt;br /&gt;
}&lt;br /&gt;
function optVisible(o, s, on) {&lt;br /&gt;
  if (!match(o.show, s, true)) return false;&lt;br /&gt;
  return (o.requires || []).every(function (r) { return on[r]; });&lt;br /&gt;
}&lt;br /&gt;
/* Felder aufbauen */&lt;br /&gt;
FIELDS.forEach(function (f) {&lt;br /&gt;
  var wrap = document.createElement(&amp;quot;div&amp;quot;); wrap.className = &amp;quot;nvk-f&amp;quot;; wrap.id = &amp;quot;nvk-w-&amp;quot; + f.id;&lt;br /&gt;
  var lab = document.createElement(&amp;quot;label&amp;quot;); lab.htmlFor = &amp;quot;nvk-&amp;quot; + f.id; lab.textContent = f.label;&lt;br /&gt;
  var s = document.createElement(&amp;quot;select&amp;quot;); s.id = &amp;quot;nvk-&amp;quot; + f.id;&lt;br /&gt;
  s.addEventListener(&amp;quot;change&amp;quot;, function () { sel[f.id] = s.value; update(); });&lt;br /&gt;
  wrap.appendChild(lab); wrap.appendChild(s); fieldsEl.appendChild(wrap);&lt;br /&gt;
});&lt;br /&gt;
function renderFields() {&lt;br /&gt;
  var s = derive();&lt;br /&gt;
  FIELDS.forEach(function (f) {&lt;br /&gt;
    var wrap = $(&amp;quot;nvk-w-&amp;quot; + f.id), el = $(&amp;quot;nvk-&amp;quot; + f.id);&lt;br /&gt;
    var vis = match(f.show, s, false) || !f.show;&lt;br /&gt;
    wrap.style.display = vis ? &amp;quot;&amp;quot; : &amp;quot;none&amp;quot;;&lt;br /&gt;
    if (!vis) { sel[f.id] = &amp;quot;&amp;quot;; return; }&lt;br /&gt;
    var allowed = f.values.filter(function (v) { return match(v.only, s, true); });&lt;br /&gt;
    if (sel[f.id] ? !allowed.some(function (v) { return v.v === sel[f.id]; }) : false) sel[f.id] = &amp;quot;&amp;quot;;&lt;br /&gt;
    if (!sel[f.id]) { if (f.def) sel[f.id] = f.def; }&lt;br /&gt;
    el.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
    if (!f.def) { var p = document.createElement(&amp;quot;option&amp;quot;); p.value = &amp;quot;&amp;quot;; p.textContent = &amp;quot;– bitte wählen –&amp;quot;; el.appendChild(p); }&lt;br /&gt;
    allowed.forEach(function (v) {&lt;br /&gt;
      var o = document.createElement(&amp;quot;option&amp;quot;); o.value = v.v; o.textContent = v.t; el.appendChild(o);&lt;br /&gt;
    });&lt;br /&gt;
    el.value = sel[f.id] || &amp;quot;&amp;quot;;&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
function renderOpts() {&lt;br /&gt;
  var s = derive(), st = onSet(s);&lt;br /&gt;
  /* Gruppen-Ausschluss und nicht mehr sichtbare Optionen bereinigen */&lt;br /&gt;
  OPTS.forEach(function (o) { if (!optVisible(o, s, st.on)) picked[o.id] = false; });&lt;br /&gt;
  st = onSet(s);&lt;br /&gt;
  optsEl.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
  OPTS.forEach(function (o) {&lt;br /&gt;
    if (!optVisible(o, s, st.on)) return;&lt;br /&gt;
    var lab = document.createElement(&amp;quot;label&amp;quot;); lab.className = &amp;quot;nvk-o&amp;quot;;&lt;br /&gt;
    var cb = document.createElement(&amp;quot;input&amp;quot;); cb.type = &amp;quot;checkbox&amp;quot;;&lt;br /&gt;
    cb.checked = !!st.on[o.id];&lt;br /&gt;
    var isForced = !!st.forced[o.id];&lt;br /&gt;
    if (isForced) { cb.disabled = true; lab.className += &amp;quot; dis&amp;quot;; }&lt;br /&gt;
    cb.addEventListener(&amp;quot;change&amp;quot;, function () {&lt;br /&gt;
      picked[o.id] = cb.checked;&lt;br /&gt;
      if (cb.checked) { if (o.excl) OPTS.forEach(function (x) { if (x.excl === o.excl) { if (x.id !== o.id) picked[x.id] = false; } }); }&lt;br /&gt;
      update();&lt;br /&gt;
    });&lt;br /&gt;
    lab.appendChild(cb);&lt;br /&gt;
    var txt = &amp;quot; &amp;quot; + o.t;&lt;br /&gt;
    lab.appendChild(document.createTextNode(txt));&lt;br /&gt;
    var sub = [o.sub, isForced ? st.forced[o.id] : &amp;quot;&amp;quot;].filter(Boolean).join(&amp;quot; – &amp;quot;);&lt;br /&gt;
    if (sub) { var sm = document.createElement(&amp;quot;small&amp;quot;); sm.textContent = &amp;quot; (&amp;quot; + sub + &amp;quot;)&amp;quot;; lab.appendChild(sm); }&lt;br /&gt;
    optsEl.appendChild(lab);&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
function card(item, cls) {&lt;br /&gt;
  var d = document.createElement(&amp;quot;div&amp;quot;); d.className = &amp;quot;nvk-card &amp;quot; + (cls || &amp;quot;&amp;quot;);&lt;br /&gt;
  var b = document.createElement(&amp;quot;b&amp;quot;); b.textContent = item.t; d.appendChild(b);&lt;br /&gt;
  if (item.d) { var p = document.createElement(&amp;quot;span&amp;quot;); p.textContent = item.d; d.appendChild(p); }&lt;br /&gt;
  if (item.u) {&lt;br /&gt;
    var a = document.createElement(&amp;quot;a&amp;quot;); a.className = &amp;quot;nvk-shop&amp;quot;; a.href = item.u; a.target = &amp;quot;_blank&amp;quot;; a.rel = &amp;quot;noopener&amp;quot;;&lt;br /&gt;
    a.textContent = &amp;quot;Im Shop ansehen →&amp;quot;; d.appendChild(a);&lt;br /&gt;
  }&lt;br /&gt;
  return d;&lt;br /&gt;
}&lt;br /&gt;
function renderResult() {&lt;br /&gt;
  var s = derive(), st = onSet(s);&lt;br /&gt;
  var required = [&amp;quot;vehicle&amp;quot;, &amp;quot;factory&amp;quot;, &amp;quot;sound&amp;quot;, &amp;quot;current&amp;quot;, &amp;quot;body&amp;quot;];&lt;br /&gt;
  var names = { vehicle: &amp;quot;Fahrzeug&amp;quot;, factory: &amp;quot;Verbaut ab Werk&amp;quot;, sound: &amp;quot;Soundsystem&amp;quot;, current: &amp;quot;Aktuell verbaut&amp;quot;, body: &amp;quot;Karosserie&amp;quot; };&lt;br /&gt;
  var missing = required.filter(function (k) { return !sel[k]; });&lt;br /&gt;
  outEl.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
  if (missing.length) {&lt;br /&gt;
    var m = document.createElement(&amp;quot;p&amp;quot;); m.className = &amp;quot;nvk-miss&amp;quot;;&lt;br /&gt;
    m.textContent = &amp;quot;Bitte noch auswählen: &amp;quot; + missing.map(function (k) { return names[k]; }).join(&amp;quot;, &amp;quot;);&lt;br /&gt;
    outEl.appendChild(m); return;&lt;br /&gt;
  }&lt;br /&gt;
  var needs = [], hints = [], seen = {};&lt;br /&gt;
  RULES.forEach(function (r) {&lt;br /&gt;
    if (!match(r.when, s)) return;&lt;br /&gt;
    if (r.opts) { if (!r.opts.every(function (o) { return st.on[o]; })) return; }&lt;br /&gt;
    if (r.type === &amp;quot;need&amp;quot;) (r.items || []).forEach(function (id) { if (!seen[id]) { seen[id] = 1; needs.push(ITEMS[id]); } });&lt;br /&gt;
    else hints.push(r.html);&lt;br /&gt;
  });&lt;br /&gt;
  var h = document.createElement(&amp;quot;h3&amp;quot;); h.textContent = &amp;quot;Das brauchst Du&amp;quot;; outEl.appendChild(h);&lt;br /&gt;
  if (needs.length) needs.forEach(function (i) { outEl.appendChild(card(i)); });&lt;br /&gt;
  else { var n = document.createElement(&amp;quot;p&amp;quot;); n.textContent = &amp;quot;Für die Grundinstallation sind keine zusätzlichen Verlängerungen oder Adapter nötig.&amp;quot;; outEl.appendChild(n); }&lt;br /&gt;
  var opt = [];&lt;br /&gt;
  OPTS.forEach(function (o) { if (st.on[o.id]) { if (optVisible(o, s, st.on)) { if (!seen[o.item]) opt.push(ITEMS[o.item]); } } });&lt;br /&gt;
  if (opt.length) {&lt;br /&gt;
    var h2 = document.createElement(&amp;quot;h3&amp;quot;); h2.textContent = &amp;quot;Deine Zusatzoptionen&amp;quot;; outEl.appendChild(h2);&lt;br /&gt;
    opt.forEach(function (i) { outEl.appendChild(card(i, &amp;quot;opt&amp;quot;)); });&lt;br /&gt;
  }&lt;br /&gt;
  if (hints.length) {&lt;br /&gt;
    var h3 = document.createElement(&amp;quot;h3&amp;quot;); h3.textContent = &amp;quot;Hinweise&amp;quot;; outEl.appendChild(h3);&lt;br /&gt;
    hints.forEach(function (t) { var d = document.createElement(&amp;quot;div&amp;quot;); d.className = &amp;quot;nvk-note&amp;quot;; d.innerHTML = t; outEl.appendChild(d); });&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
function update() { renderFields(); renderOpts(); renderResult(); }&lt;br /&gt;
$(&amp;quot;nvk-reset&amp;quot;).addEventListener(&amp;quot;click&amp;quot;, function () { sel = {}; picked = {}; update(); });&lt;br /&gt;
update();&lt;br /&gt;
})();&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andre</name></author>
	</entry>
	<entry>
		<id>https://xtrons.ibus-app.de/index.php?title=Android_Radio_Konfigurator&amp;diff=4071</id>
		<title>Android Radio Konfigurator</title>
		<link rel="alternate" type="text/html" href="https://xtrons.ibus-app.de/index.php?title=Android_Radio_Konfigurator&amp;diff=4071"/>
		<updated>2026-10-21T07:55:54Z</updated>

		<summary type="html">&lt;p&gt;Andre: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;html&amp;gt;&amp;lt;script&amp;gt;document.write(&amp;quot;JS läuft&amp;quot;);&amp;lt;/script&amp;gt;&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
#nvk{max-width:900px;line-height:1.45}&lt;br /&gt;
#nvk *{box-sizing:border-box}&lt;br /&gt;
#nvk .nvk-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:14px;margin:12px 0}&lt;br /&gt;
#nvk .nvk-f label,#nvk .nvk-h{display:block;font-weight:700;margin-bottom:4px}&lt;br /&gt;
#nvk select{width:100%;padding:9px 8px;font:inherit;color:#202122;background:#fff;border:1px solid #a2a9b1;border-radius:4px}&lt;br /&gt;
#nvk fieldset{border:1px solid rgba(128,128,128,.45);border-radius:6px;padding:10px 14px;margin:14px 0}&lt;br /&gt;
#nvk legend{font-weight:700;padding:0 6px}&lt;br /&gt;
#nvk .nvk-o{display:block;padding:4px 0;cursor:pointer}&lt;br /&gt;
#nvk .nvk-o small{opacity:.7}&lt;br /&gt;
#nvk .nvk-o.dis{opacity:.75;cursor:default}&lt;br /&gt;
#nvk .nvk-btn{padding:7px 14px;font:inherit;border:1px solid #a2a9b1;border-radius:4px;background:#f8f9fa;color:#202122;cursor:pointer}&lt;br /&gt;
#nvk #nvk-out{margin-top:18px}&lt;br /&gt;
#nvk h3{margin:18px 0 8px}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-card.opt{border-left-color:#14866d}&lt;br /&gt;
#nvk .nvk-card b{display:block}&lt;br /&gt;
#nvk .nvk-card a.nvk-shop{display:inline-block;margin-top:4px;font-weight:600}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-miss{opacity:.8;font-style:italic}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-grid&amp;quot; id=&amp;quot;nvk-fields&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;fieldset id=&amp;quot;nvk-optset&amp;quot;&amp;gt;&amp;lt;legend&amp;gt;Zusatzoptionen&amp;lt;/legend&amp;gt;&amp;lt;div id=&amp;quot;nvk-opts&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/fieldset&amp;gt;&lt;br /&gt;
&amp;lt;button type=&amp;quot;button&amp;quot; class=&amp;quot;nvk-btn&amp;quot; id=&amp;quot;nvk-reset&amp;quot;&amp;gt;Auswahl zurücksetzen&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk-out&amp;quot; aria-live=&amp;quot;polite&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;noscript&amp;gt;Für den Konfigurator wird JavaScript benötigt.&amp;lt;/noscript&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
(function () {&lt;br /&gt;
&amp;quot;use strict&amp;quot;;&lt;br /&gt;
/* =====================================================================&lt;br /&gt;
   KONFIGURATION – hier wird gepflegt. Kein weiterer Code nötig.&lt;br /&gt;
   ===================================================================== */&lt;br /&gt;
/* ---- 1) Auswahlfelder -------------------------------------------------&lt;br /&gt;
   v = interner Wert, t = Anzeigetext,&lt;br /&gt;
   only = Wert nur anbieten, wenn Bedingung passt (z. B. nur bestimmte Fahrzeuge)&lt;br /&gt;
   show = ganzes Feld nur zeigen, wenn Bedingung passt                      */&lt;br /&gt;
var FIELDS = [&lt;br /&gt;
  { id: &amp;quot;vehicle&amp;quot;, label: &amp;quot;Fahrzeug&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;E38&amp;quot;, t: &amp;quot;BMW E38&amp;quot; }, { v: &amp;quot;E39&amp;quot;, t: &amp;quot;BMW E39&amp;quot; }, { v: &amp;quot;E46&amp;quot;, t: &amp;quot;BMW E46&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;E53&amp;quot;, t: &amp;quot;BMW E53&amp;quot; }, { v: &amp;quot;E83&amp;quot;, t: &amp;quot;BMW E83&amp;quot; } ] },&lt;br /&gt;
  { id: &amp;quot;factory&amp;quot;, label: &amp;quot;Verbaut ab Werk&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;iris&amp;quot;,  t: &amp;quot;Radio mit IRIS&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;mid&amp;quot;,   t: &amp;quot;Radio mit MID&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;n43&amp;quot;,   t: &amp;quot;4:3 Navi&amp;quot;,  only: { vehicle: [&amp;quot;E38&amp;quot;, &amp;quot;E39&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;n169&amp;quot;,  t: &amp;quot;16:9 Navi&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;pfeil&amp;quot;, t: &amp;quot;Pfeilnavi&amp;quot;, only: { vehicle: [&amp;quot;E46&amp;quot;] } } ] },&lt;br /&gt;
  { id: &amp;quot;trunk&amp;quot;, label: &amp;quot;Befindet sich im Kofferraum ein Radiomodul?&amp;quot;,&lt;br /&gt;
    show: { factory: [&amp;quot;pfeil&amp;quot;] }, values: [&lt;br /&gt;
    { v: &amp;quot;ja&amp;quot;, t: &amp;quot;Ja, Radio-/Navimodul im Kofferraum&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;nein&amp;quot;, t: &amp;quot;Nein, Anschlüsse nur hinter dem Radio&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;unk&amp;quot;, t: &amp;quot;Weiß ich nicht&amp;quot; } ] },&lt;br /&gt;
  { id: &amp;quot;sound&amp;quot;, label: &amp;quot;Soundsystem&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;stereo&amp;quot;, t: &amp;quot;Stereo&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;hifi&amp;quot;,   t: &amp;quot;Hifi&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;dsp&amp;quot;,    t: &amp;quot;DSP&amp;quot;,          only: { vehicle: [&amp;quot;E38&amp;quot;, &amp;quot;E39&amp;quot;, &amp;quot;E53&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;hk&amp;quot;,     t: &amp;quot;Harman Kardon&amp;quot;, only: { vehicle: [&amp;quot;E46&amp;quot;, &amp;quot;E83&amp;quot;] } } ] },&lt;br /&gt;
  { id: &amp;quot;current&amp;quot;, label: &amp;quot;Aktuell verbaut&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;werk&amp;quot;, t: &amp;quot;Werksradio / Werksnavi&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;nach&amp;quot;, t: &amp;quot;Nachrüst-Radio / -Navi&amp;quot; } ] },&lt;br /&gt;
  { id: &amp;quot;body&amp;quot;, label: &amp;quot;Karosserie&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;limo&amp;quot;,    t: &amp;quot;Limousine&amp;quot;, only: { vehicle: [&amp;quot;E38&amp;quot;, &amp;quot;E39&amp;quot;, &amp;quot;E46&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;touring&amp;quot;, t: &amp;quot;Touring&amp;quot;,   only: { vehicle: [&amp;quot;E39&amp;quot;, &amp;quot;E46&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;coupe&amp;quot;,   t: &amp;quot;Coupé&amp;quot;,     only: { vehicle: [&amp;quot;E46&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;cabrio&amp;quot;,  t: &amp;quot;Cabrio&amp;quot;,    only: { vehicle: [&amp;quot;E46&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;suv&amp;quot;,     t: &amp;quot;SUV&amp;quot;,       only: { vehicle: [&amp;quot;E53&amp;quot;, &amp;quot;E83&amp;quot;] } } ] },&lt;br /&gt;
  { id: &amp;quot;ant&amp;quot;, label: &amp;quot;Antennenstecker am Radio (optional)&amp;quot;, optional: true, def: &amp;quot;unk&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;unk&amp;quot;,   t: &amp;quot;Weiß ich nicht&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;iso&amp;quot;,   t: &amp;quot;ISO (rund, „BM24“)&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;fakra&amp;quot;, t: &amp;quot;FAKRA (eckig, „BM54“)&amp;quot; } ] }&lt;br /&gt;
];&lt;br /&gt;
/* ---- 2) Zusatzoptionen (Mehrfachauswahl) -----------------------------&lt;br /&gt;
   show     = Option nur sichtbar, wenn Bedingung passt&lt;br /&gt;
   requires = Option nur sichtbar, wenn diese anderen Optionen gewählt sind&lt;br /&gt;
   excl     = Optionen mit gleicher excl-Gruppe schließen sich gegenseitig aus&lt;br /&gt;
   item     = Eintrag in ITEMS, der in der Liste erscheint                  */&lt;br /&gt;
var OPTS = [&lt;br /&gt;
  { id: &amp;quot;halter&amp;quot;,  t: &amp;quot;Radio-Halter&amp;quot;, sub: &amp;quot;nur BMW E39&amp;quot;, show: { vehicle: [&amp;quot;E39&amp;quot;] }, item: &amp;quot;halter&amp;quot; },&lt;br /&gt;
  { id: &amp;quot;ibus&amp;quot;,    t: &amp;quot;I-BUS App&amp;quot;, item: &amp;quot;ibus&amp;quot; },&lt;br /&gt;
  { id: &amp;quot;deepobd&amp;quot;, t: &amp;quot;DeepOBD (Diagnose)&amp;quot;, item: &amp;quot;deepobd&amp;quot; },&lt;br /&gt;
  { id: &amp;quot;can&amp;quot;,     t: &amp;quot;CAN Interface&amp;quot;, sub: &amp;quot;Addon – nur mit I-BUS App&amp;quot;, requires: [&amp;quot;ibus&amp;quot;], item: &amp;quot;can&amp;quot; },&lt;br /&gt;
  { id: &amp;quot;tpms&amp;quot;,    t: &amp;quot;TPMS (Reifendruck)&amp;quot;, item: &amp;quot;tpms&amp;quot; },&lt;br /&gt;
  { id: &amp;quot;dab1&amp;quot;,    t: &amp;quot;DAB+ (Single Receiver)&amp;quot;, excl: &amp;quot;dab&amp;quot;, item: &amp;quot;dab1&amp;quot; },&lt;br /&gt;
  { id: &amp;quot;dab2&amp;quot;,    t: &amp;quot;DAB+ (Dual Receiver)&amp;quot;,   excl: &amp;quot;dab&amp;quot;, item: &amp;quot;dab2&amp;quot; },&lt;br /&gt;
  { id: &amp;quot;rcam&amp;quot;,    t: &amp;quot;Rückfahrkamera&amp;quot;, item: &amp;quot;rcam&amp;quot; },&lt;br /&gt;
  { id: &amp;quot;fcam&amp;quot;,    t: &amp;quot;Front-Kamera&amp;quot;, item: &amp;quot;fcam&amp;quot; },&lt;br /&gt;
  { id: &amp;quot;tool&amp;quot;,    t: &amp;quot;Einbau-Werkzeug (Kunststoffheber)&amp;quot;, item: &amp;quot;tool&amp;quot; }&lt;br /&gt;
];&lt;br /&gt;
/* Wird eine Option durch eine Auswahl erzwungen, wird sie automatisch gesetzt. */&lt;br /&gt;
var FORCED = [&lt;br /&gt;
  { when: { sound: [&amp;quot;dsp&amp;quot;] }, opts: [&amp;quot;ibus&amp;quot;], why: &amp;quot;wegen DSP erforderlich&amp;quot; }&lt;br /&gt;
];&lt;br /&gt;
/* ---- 3) Artikel/Produkte ---------------------------------------------&lt;br /&gt;
   u = Link in den Shop (leer lassen = Eintrag ohne Link)                  */&lt;br /&gt;
var ITEMS = {&lt;br /&gt;
  exl005:  { t: &amp;quot;Verlängerung EXL005&amp;quot;, d: &amp;quot;Ersetzt das Radiomodul im Kofferraum (Bus-/Stromanschluss nach vorn).&amp;quot;,&lt;br /&gt;
             u: &amp;quot;https://shop.ibus-app.de/detail/index/sArticle/212/&amp;quot; },&lt;br /&gt;
  fakra6m: { t: &amp;quot;Verlängerung 6 m FAKRA(m) auf FAKRA(f), gewinkelt&amp;quot;, d: &amp;quot;Antennenverlängerung vom Kofferraum nach vorn.&amp;quot;,&lt;br /&gt;
             u: &amp;quot;https://shop.ibus-app.de/shop/zubehoer/adapterkabel/192/verlaengerung-6m-fakra-m-auf-fakra-f-kurz-gewinkelt&amp;quot; },&lt;br /&gt;
  isoada:  { t: &amp;quot;Adapter ISO-Stecker auf FAKRA, gewinkelt (15 cm)&amp;quot;, d: &amp;quot;Nötig, wenn das Fahrzeug einen ISO-Antennenstecker hat.&amp;quot;,&lt;br /&gt;
             u: &amp;quot;https://shop.ibus-app.de/shop/zubehoer/adapterkabel/193/adapter-kabel-iso-f-auf-fakra-f-kurz-gewinkelt-15cm&amp;quot; },&lt;br /&gt;
  dsplic:  { t: &amp;quot;DSP-Lizenz für die I-BUS App&amp;quot;, d: &amp;quot;Ohne diese Lizenz arbeitet das Werks-DSP nicht.&amp;quot;, u: &amp;quot;&amp;quot; },&lt;br /&gt;
  halter:  { t: &amp;quot;Halter zur Radio-Montage im BMW E39&amp;quot;, d: &amp;quot;Empfohlen bei Radios, die nicht von AVIN stammen.&amp;quot;,&lt;br /&gt;
             u: &amp;quot;https://shop.ibus-app.de/shop/zubehoer/182/halter-zur-radio-montage-im-bmw-e39&amp;quot; },&lt;br /&gt;
  ibus:    { t: &amp;quot;I-BUS App&amp;quot;, d: &amp;quot;Erhält Bordcomputer-Funktionen und steuert z. B. den Original-CD-Wechsler.&amp;quot;,&lt;br /&gt;
             u: &amp;quot;http://www.ibus-app.de&amp;quot; },&lt;br /&gt;
  deepobd: { t: &amp;quot;DeepOBD (Diagnose)&amp;quot;, d: &amp;quot;Live-Werte auslesen, Fehler lesen und löschen.&amp;quot;, u: &amp;quot;&amp;quot; },&lt;br /&gt;
  can:     { t: &amp;quot;CAN Interface (Addon zur I-BUS App)&amp;quot;, d: &amp;quot;Funktioniert nur zusammen mit der I-BUS App.&amp;quot;, u: &amp;quot;&amp;quot; },&lt;br /&gt;
  tpms:    { t: &amp;quot;TPMS – Reifendruckanzeige&amp;quot;, d: &amp;quot;&amp;quot;, u: &amp;quot;https://xtrons.co.uk/tyre-pressure-monitoring-system-tpms01&amp;quot; },&lt;br /&gt;
  dab1:    { t: &amp;quot;DAB+ Single Receiver&amp;quot;, d: &amp;quot;&amp;quot;, u: &amp;quot;https://xtrons.co.uk/dab-tuner-usbdab01&amp;quot; },&lt;br /&gt;
  dab2:    { t: &amp;quot;DAB+ Dual Receiver&amp;quot;, d: &amp;quot;&amp;quot;, u: &amp;quot;&amp;quot; },&lt;br /&gt;
  rcam:    { t: &amp;quot;Rückfahrkamera&amp;quot;, d: &amp;quot;&amp;quot;, u: &amp;quot;&amp;quot; },&lt;br /&gt;
  fcam:    { t: &amp;quot;Front-Kamera&amp;quot;, d: &amp;quot;&amp;quot;, u: &amp;quot;&amp;quot; },&lt;br /&gt;
  tool:    { t: &amp;quot;Einbau-Werkzeug (Kunststoffheber)&amp;quot;, d: &amp;quot;Zum schonenden Lösen der Verkleidungen.&amp;quot;, u: &amp;quot;&amp;quot; }&lt;br /&gt;
};&lt;br /&gt;
/* ---- 4) Regeln --------------------------------------------------------&lt;br /&gt;
   type  = &amp;quot;need&amp;quot; (Das brauchst Du) | &amp;quot;hint&amp;quot; (Hinweise)&lt;br /&gt;
   when  = Bedingung auf die Auswahlfelder (alle Schlüssel müssen passen)&lt;br /&gt;
   opts  = (optional) diese Zusatzoptionen müssen gewählt sein&lt;br /&gt;
   items = Artikel aus ITEMS      html = Hinweistext (HTML erlaubt)&lt;br /&gt;
   Abgeleiteter Wert &amp;quot;module&amp;quot;: ja = Radiomodul im Kofferraum, nein = nicht, unk = unklar */&lt;br /&gt;
var RULES = [&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { current: [&amp;quot;werk&amp;quot;], module: [&amp;quot;ja&amp;quot;] }, items: [&amp;quot;exl005&amp;quot;, &amp;quot;fakra6m&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { current: [&amp;quot;nach&amp;quot;], module: [&amp;quot;ja&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;\u003Cb\u003EVerlängerungen prüfen:\u003C/b\u003E Bei einem bereits verbauten Nachrüst-Radio sollten EXL005 und FAKRA-Verlängerung schon vorhanden sein. \u003Cb\u003EUngeeignet\u003C/b\u003E sind die Standard-„Quad-Lock-Verlängerung kombiniert mit Antennenverlängerung“ und die „EXL006“ (kein BUS-Signal).&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;ja&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;\u003Cb\u003EKabelwege:\u003C/b\u003E Die Technik sitzt im Kofferraum. Es müssen mindestens Kabel für Radioanschluss und FM-Antenne nach vorn verlegt werden. Optional zusätzlich: GPS (OEM-Antenne), Verlängerung für DAB+, Anschluss OEM-CD-Wechsler, Cinch für Subwoofer.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;nein&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;\u003Cb\u003EKabelwege:\u003C/b\u003E Alle Anschlüsse befinden sich direkt hinter dem Radio, es müssen \u003Cb\u003Ekeine\u003C/b\u003E Kabel verlegt werden. Optional ggf. für: GPS (OEM-Antenne), DAB+, OEM-CD-Wechsler, Cinch für Subwoofer.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;unk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;\u003Cb\u003EBitte prüfen:\u003C/b\u003E Schau nach, ob im Kofferraum ein Radiomodul sitzt. Manche E46 mit Pfeilnavi (vermutlich Vorfacelift) haben das Radio hinten und benötigen dann EXL005 + FAKRA-Verlängerung.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { ant: [&amp;quot;iso&amp;quot;] }, items: [&amp;quot;isoada&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { ant: [&amp;quot;unk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;\u003Cb\u003EAntennenstecker:\u003C/b\u003E Hat Dein Fahrzeug einen ISO-Antennenstecker, brauchst Du zusätzlich den \u003Ca href='https://shop.ibus-app.de/shop/zubehoer/adapterkabel/193/adapter-kabel-iso-f-auf-fakra-f-kurz-gewinkelt-15cm'\u003EAdapter ISO auf FAKRA\u003C/a\u003E. Bei FAKRA ist kein Adapter nötig.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { sound: [&amp;quot;dsp&amp;quot;] }, items: [&amp;quot;dsplic&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { sound: [&amp;quot;dsp&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;\u003Cb\u003EDSP:\u003C/b\u003E Damit das Werks-DSP überhaupt arbeitet, wird die I-BUS App mit DSP-Lizenz benötigt.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { sound: [&amp;quot;hk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;\u003Cb\u003EHarman Kardon:\u003C/b\u003E Benötigt \u003Cb\u003Ekeine\u003C/b\u003E DSP-Lizenz. Das Remote-Signal (+12 V, wenn Radio an) genügt zum Starten.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;E38&amp;quot;, &amp;quot;E53&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;\u003Cb\u003EMontage:\u003C/b\u003E Radios für BMW E38/E53 benötigen keine extra Halterungen.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;E39&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;\u003Cb\u003EMontage:\u003C/b\u003E Bei Radios, die nicht von AVIN stammen, empfehlen wir einen Halter (siehe Zusatzoptionen) oder das Bearbeiten der beiliegenden Montagewinkel. Anleitungen: \u003Ca href='https://xtrons.ibus-app.de/index.php?title=Montageanleitungen'\u003EMontageanleitungen\u003C/a\u003E.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;E46&amp;quot;], factory: [&amp;quot;iris&amp;quot;, &amp;quot;mid&amp;quot;, &amp;quot;pfeil&amp;quot;], current: [&amp;quot;werk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;\u003Cb\u003EMontage E46 ohne großes Navi:\u003C/b\u003E Das Klimabedienteil muss nach unten versetzt werden. Dafür brauchst Du den passenden \u003Cb\u003EFunktionsträger\u003C/b\u003E (neu ca. 100 €, ggf. beim Teileverwerter günstiger):\u003Cbr\u003E&amp;quot; +&lt;br /&gt;
          &amp;quot;Einzelschalter (eher VFL): \u003Ca href='https://www.leebmann24.de/trager-3er-51168202186.html'\u003Eohne Raucher 51168202186\u003C/a\u003E / \u003Ca href='https://www.leebmann24.de/trager-3er-51168230902.html'\u003Emit Raucher 51168230902\u003C/a\u003E\u003Cbr\u003E&amp;quot; +&lt;br /&gt;
          &amp;quot;Schaltzentrum (eher FL): \u003Ca href='https://www.leebmann24.de/funktionstrager-schaltzentrum-3er-51167001408.html'\u003Eohne Raucher 51167001408\u003C/a\u003E / \u003Ca href='https://www.leebmann24.de/funktionstrager-schaltzentrum-3er-51167001410.html'\u003Emit Raucher 51167001410\u003C/a\u003E&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, opts: [&amp;quot;ibus&amp;quot;], when: {},&lt;br /&gt;
    html: &amp;quot;\u003Cb\u003EI-BUS App:\u003C/b\u003E Siehe \u003Ca href='https://wiki.ibus-app.de/index.php?title=Was_brauche_ich_um_die_I-BUS_App_nutzen_zu_k%C3%B6nnen%3F'\u003EWas brauche ich, um die I-BUS App nutzen zu können?\u003C/a\u003E und die \u003Ca href='https://wiki.ibus-app.de/index.php?title=Einbauanleitung_f%C3%BCr_Resler_Modul_und_Resler_Interface'\u003EEinbauanleitung für Resler Modul und Interface\u003C/a\u003E.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: {}, opts: [],&lt;br /&gt;
    html: &amp;quot;\u003Cb\u003EWichtig:\u003C/b\u003E Bitte immer die Anschlüsse am eigenen Radio abgleichen. Welches Radio passt? → \u003Ca href='https://xtrons.ibus-app.de/index.php?title=Entscheidungshilfe%3A_AVIN_oder_XTRONS%3F'\u003EEntscheidungshilfe AVIN oder XTRONS\u003C/a\u003E, Kosten → \u003Ca href='https://xtrons.ibus-app.de/index.php?title=Grobe_Kosten%C3%BCbersicht'\u003EGrobe Kostenübersicht\u003C/a\u003E.&amp;quot; }&lt;br /&gt;
];&lt;br /&gt;
/* =====================================================================&lt;br /&gt;
   PROGRAMMLOGIK&lt;br /&gt;
   ===================================================================== */&lt;br /&gt;
var $ = function (id) { return document.getElementById(id); };&lt;br /&gt;
var sel = {}, picked = {};&lt;br /&gt;
var fieldsEl = $(&amp;quot;nvk-fields&amp;quot;), optsEl = $(&amp;quot;nvk-opts&amp;quot;), outEl = $(&amp;quot;nvk-out&amp;quot;);&lt;br /&gt;
function match(cond, s, lenient) {&lt;br /&gt;
  if (!cond) return true;&lt;br /&gt;
  for (var k in cond) {&lt;br /&gt;
    if (!s[k]) { if (lenient) continue; return false; }&lt;br /&gt;
    if (cond[k].indexOf(s[k]) === -1) return false;&lt;br /&gt;
  }&lt;br /&gt;
  return true;&lt;br /&gt;
}&lt;br /&gt;
function derive() {&lt;br /&gt;
  var s = {}, k;&lt;br /&gt;
  for (k in sel) s[k] = sel[k];&lt;br /&gt;
  if (s.factory === &amp;quot;n43&amp;quot; || s.factory === &amp;quot;n169&amp;quot;) s.module = &amp;quot;ja&amp;quot;;&lt;br /&gt;
  else if (s.factory === &amp;quot;iris&amp;quot; || s.factory === &amp;quot;mid&amp;quot;) s.module = &amp;quot;nein&amp;quot;;&lt;br /&gt;
  else if (s.factory === &amp;quot;pfeil&amp;quot;) s.module = s.trunk || &amp;quot;unk&amp;quot;;&lt;br /&gt;
  return s;&lt;br /&gt;
}&lt;br /&gt;
function forced(s) {&lt;br /&gt;
  var f = {};&lt;br /&gt;
  FORCED.forEach(function (r) { if (match(r.when, s)) r.opts.forEach(function (o) { f[o] = r.why; }); });&lt;br /&gt;
  return f;&lt;br /&gt;
}&lt;br /&gt;
function onSet(s) {&lt;br /&gt;
  var f = forced(s), on = {}, k;&lt;br /&gt;
  for (k in picked) if (picked[k]) on[k] = true;&lt;br /&gt;
  for (k in f) on[k] = true;&lt;br /&gt;
  return { on: on, forced: f };&lt;br /&gt;
}&lt;br /&gt;
function optVisible(o, s, on) {&lt;br /&gt;
  if (!match(o.show, s, true)) return false;&lt;br /&gt;
  return (o.requires || []).every(function (r) { return on[r]; });&lt;br /&gt;
}&lt;br /&gt;
/* Felder aufbauen */&lt;br /&gt;
FIELDS.forEach(function (f) {&lt;br /&gt;
  var wrap = document.createElement(&amp;quot;div&amp;quot;); wrap.className = &amp;quot;nvk-f&amp;quot;; wrap.id = &amp;quot;nvk-w-&amp;quot; + f.id;&lt;br /&gt;
  var lab = document.createElement(&amp;quot;label&amp;quot;); lab.htmlFor = &amp;quot;nvk-&amp;quot; + f.id; lab.textContent = f.label;&lt;br /&gt;
  var s = document.createElement(&amp;quot;select&amp;quot;); s.id = &amp;quot;nvk-&amp;quot; + f.id;&lt;br /&gt;
  s.addEventListener(&amp;quot;change&amp;quot;, function () { sel[f.id] = s.value; update(); });&lt;br /&gt;
  wrap.appendChild(lab); wrap.appendChild(s); fieldsEl.appendChild(wrap);&lt;br /&gt;
});&lt;br /&gt;
function renderFields() {&lt;br /&gt;
  var s = derive();&lt;br /&gt;
  FIELDS.forEach(function (f) {&lt;br /&gt;
    var wrap = $(&amp;quot;nvk-w-&amp;quot; + f.id), el = $(&amp;quot;nvk-&amp;quot; + f.id);&lt;br /&gt;
    var vis = match(f.show, s, false) || !f.show;&lt;br /&gt;
    wrap.style.display = vis ? &amp;quot;&amp;quot; : &amp;quot;none&amp;quot;;&lt;br /&gt;
    if (!vis) { sel[f.id] = &amp;quot;&amp;quot;; return; }&lt;br /&gt;
    var allowed = f.values.filter(function (v) { return match(v.only, s, true); });&lt;br /&gt;
    if (sel[f.id] ? !allowed.some(function (v) { return v.v === sel[f.id]; }) : false) sel[f.id] = &amp;quot;&amp;quot;;&lt;br /&gt;
    if (!sel[f.id]) { if (f.def) sel[f.id] = f.def; }&lt;br /&gt;
    el.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
    if (!f.def) { var p = document.createElement(&amp;quot;option&amp;quot;); p.value = &amp;quot;&amp;quot;; p.textContent = &amp;quot;– bitte wählen –&amp;quot;; el.appendChild(p); }&lt;br /&gt;
    allowed.forEach(function (v) {&lt;br /&gt;
      var o = document.createElement(&amp;quot;option&amp;quot;); o.value = v.v; o.textContent = v.t; el.appendChild(o);&lt;br /&gt;
    });&lt;br /&gt;
    el.value = sel[f.id] || &amp;quot;&amp;quot;;&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
function renderOpts() {&lt;br /&gt;
  var s = derive(), st = onSet(s);&lt;br /&gt;
  /* Gruppen-Ausschluss und nicht mehr sichtbare Optionen bereinigen */&lt;br /&gt;
  OPTS.forEach(function (o) { if (!optVisible(o, s, st.on)) picked[o.id] = false; });&lt;br /&gt;
  st = onSet(s);&lt;br /&gt;
  optsEl.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
  OPTS.forEach(function (o) {&lt;br /&gt;
    if (!optVisible(o, s, st.on)) return;&lt;br /&gt;
    var lab = document.createElement(&amp;quot;label&amp;quot;); lab.className = &amp;quot;nvk-o&amp;quot;;&lt;br /&gt;
    var cb = document.createElement(&amp;quot;input&amp;quot;); cb.type = &amp;quot;checkbox&amp;quot;;&lt;br /&gt;
    cb.checked = !!st.on[o.id];&lt;br /&gt;
    var isForced = !!st.forced[o.id];&lt;br /&gt;
    if (isForced) { cb.disabled = true; lab.className += &amp;quot; dis&amp;quot;; }&lt;br /&gt;
    cb.addEventListener(&amp;quot;change&amp;quot;, function () {&lt;br /&gt;
      picked[o.id] = cb.checked;&lt;br /&gt;
      if (cb.checked) { if (o.excl) OPTS.forEach(function (x) { if (x.excl === o.excl) { if (x.id !== o.id) picked[x.id] = false; } }); }&lt;br /&gt;
      update();&lt;br /&gt;
    });&lt;br /&gt;
    lab.appendChild(cb);&lt;br /&gt;
    var txt = &amp;quot; &amp;quot; + o.t;&lt;br /&gt;
    lab.appendChild(document.createTextNode(txt));&lt;br /&gt;
    var sub = [o.sub, isForced ? st.forced[o.id] : &amp;quot;&amp;quot;].filter(Boolean).join(&amp;quot; – &amp;quot;);&lt;br /&gt;
    if (sub) { var sm = document.createElement(&amp;quot;small&amp;quot;); sm.textContent = &amp;quot; (&amp;quot; + sub + &amp;quot;)&amp;quot;; lab.appendChild(sm); }&lt;br /&gt;
    optsEl.appendChild(lab);&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
function card(item, cls) {&lt;br /&gt;
  var d = document.createElement(&amp;quot;div&amp;quot;); d.className = &amp;quot;nvk-card &amp;quot; + (cls || &amp;quot;&amp;quot;);&lt;br /&gt;
  var b = document.createElement(&amp;quot;b&amp;quot;); b.textContent = item.t; d.appendChild(b);&lt;br /&gt;
  if (item.d) { var p = document.createElement(&amp;quot;span&amp;quot;); p.textContent = item.d; d.appendChild(p); }&lt;br /&gt;
  if (item.u) {&lt;br /&gt;
    var a = document.createElement(&amp;quot;a&amp;quot;); a.className = &amp;quot;nvk-shop&amp;quot;; a.href = item.u; a.target = &amp;quot;_blank&amp;quot;; a.rel = &amp;quot;noopener&amp;quot;;&lt;br /&gt;
    a.textContent = &amp;quot;Im Shop ansehen →&amp;quot;; d.appendChild(a);&lt;br /&gt;
  }&lt;br /&gt;
  return d;&lt;br /&gt;
}&lt;br /&gt;
function renderResult() {&lt;br /&gt;
  var s = derive(), st = onSet(s);&lt;br /&gt;
  var required = [&amp;quot;vehicle&amp;quot;, &amp;quot;factory&amp;quot;, &amp;quot;sound&amp;quot;, &amp;quot;current&amp;quot;, &amp;quot;body&amp;quot;];&lt;br /&gt;
  var names = { vehicle: &amp;quot;Fahrzeug&amp;quot;, factory: &amp;quot;Verbaut ab Werk&amp;quot;, sound: &amp;quot;Soundsystem&amp;quot;, current: &amp;quot;Aktuell verbaut&amp;quot;, body: &amp;quot;Karosserie&amp;quot; };&lt;br /&gt;
  var missing = required.filter(function (k) { return !sel[k]; });&lt;br /&gt;
  outEl.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
  if (missing.length) {&lt;br /&gt;
    var m = document.createElement(&amp;quot;p&amp;quot;); m.className = &amp;quot;nvk-miss&amp;quot;;&lt;br /&gt;
    m.textContent = &amp;quot;Bitte noch auswählen: &amp;quot; + missing.map(function (k) { return names[k]; }).join(&amp;quot;, &amp;quot;);&lt;br /&gt;
    outEl.appendChild(m); return;&lt;br /&gt;
  }&lt;br /&gt;
  var needs = [], hints = [], seen = {};&lt;br /&gt;
  RULES.forEach(function (r) {&lt;br /&gt;
    if (!match(r.when, s)) return;&lt;br /&gt;
    if (r.opts) { if (!r.opts.every(function (o) { return st.on[o]; })) return; }&lt;br /&gt;
    if (r.type === &amp;quot;need&amp;quot;) (r.items || []).forEach(function (id) { if (!seen[id]) { seen[id] = 1; needs.push(ITEMS[id]); } });&lt;br /&gt;
    else hints.push(r.html);&lt;br /&gt;
  });&lt;br /&gt;
  var h = document.createElement(&amp;quot;h3&amp;quot;); h.textContent = &amp;quot;Das brauchst Du&amp;quot;; outEl.appendChild(h);&lt;br /&gt;
  if (needs.length) needs.forEach(function (i) { outEl.appendChild(card(i)); });&lt;br /&gt;
  else { var n = document.createElement(&amp;quot;p&amp;quot;); n.textContent = &amp;quot;Für die Grundinstallation sind keine zusätzlichen Verlängerungen oder Adapter nötig.&amp;quot;; outEl.appendChild(n); }&lt;br /&gt;
  var opt = [];&lt;br /&gt;
  OPTS.forEach(function (o) { if (st.on[o.id]) { if (optVisible(o, s, st.on)) { if (!seen[o.item]) opt.push(ITEMS[o.item]); } } });&lt;br /&gt;
  if (opt.length) {&lt;br /&gt;
    var h2 = document.createElement(&amp;quot;h3&amp;quot;); h2.textContent = &amp;quot;Deine Zusatzoptionen&amp;quot;; outEl.appendChild(h2);&lt;br /&gt;
    opt.forEach(function (i) { outEl.appendChild(card(i, &amp;quot;opt&amp;quot;)); });&lt;br /&gt;
  }&lt;br /&gt;
  if (hints.length) {&lt;br /&gt;
    var h3 = document.createElement(&amp;quot;h3&amp;quot;); h3.textContent = &amp;quot;Hinweise&amp;quot;; outEl.appendChild(h3);&lt;br /&gt;
    hints.forEach(function (t) { var d = document.createElement(&amp;quot;div&amp;quot;); d.className = &amp;quot;nvk-note&amp;quot;; d.innerHTML = t; outEl.appendChild(d); });&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
function update() { renderFields(); renderOpts(); renderResult(); }&lt;br /&gt;
$(&amp;quot;nvk-reset&amp;quot;).addEventListener(&amp;quot;click&amp;quot;, function () { sel = {}; picked = {}; update(); });&lt;br /&gt;
update();&lt;br /&gt;
})();&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andre</name></author>
	</entry>
	<entry>
		<id>https://xtrons.ibus-app.de/index.php?title=Android_Radio_Konfigurator&amp;diff=4070</id>
		<title>Android Radio Konfigurator</title>
		<link rel="alternate" type="text/html" href="https://xtrons.ibus-app.de/index.php?title=Android_Radio_Konfigurator&amp;diff=4070"/>
		<updated>2026-10-21T07:55:28Z</updated>

		<summary type="html">&lt;p&gt;Andre: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;html&amp;gt;&amp;lt;script&amp;gt;document.write(&amp;quot;JS läuft&amp;quot;);&amp;lt;/script&amp;gt;&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html&amp;gt;&amp;lt;div id=&amp;quot;nvk&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
#nvk{max-width:900px;line-height:1.45}&lt;br /&gt;
#nvk *{box-sizing:border-box}&lt;br /&gt;
#nvk .nvk-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:14px;margin:12px 0}&lt;br /&gt;
#nvk .nvk-f label,#nvk .nvk-h{display:block;font-weight:700;margin-bottom:4px}&lt;br /&gt;
#nvk select{width:100%;padding:9px 8px;font:inherit;color:#202122;background:#fff;border:1px solid #a2a9b1;border-radius:4px}&lt;br /&gt;
#nvk fieldset{border:1px solid rgba(128,128,128,.45);border-radius:6px;padding:10px 14px;margin:14px 0}&lt;br /&gt;
#nvk legend{font-weight:700;padding:0 6px}&lt;br /&gt;
#nvk .nvk-o{display:block;padding:4px 0;cursor:pointer}&lt;br /&gt;
#nvk .nvk-o small{opacity:.7}&lt;br /&gt;
#nvk .nvk-o.dis{opacity:.75;cursor:default}&lt;br /&gt;
#nvk .nvk-btn{padding:7px 14px;font:inherit;border:1px solid #a2a9b1;border-radius:4px;background:#f8f9fa;color:#202122;cursor:pointer}&lt;br /&gt;
#nvk #nvk-out{margin-top:18px}&lt;br /&gt;
#nvk h3{margin:18px 0 8px}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-card.opt{border-left-color:#14866d}&lt;br /&gt;
#nvk .nvk-card b{display:block}&lt;br /&gt;
#nvk .nvk-card a.nvk-shop{display:inline-block;margin-top:4px;font-weight:600}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-miss{opacity:.8;font-style:italic}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-grid&amp;quot; id=&amp;quot;nvk-fields&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;fieldset id=&amp;quot;nvk-optset&amp;quot;&amp;gt;&amp;lt;legend&amp;gt;Zusatzoptionen&amp;lt;/legend&amp;gt;&amp;lt;div id=&amp;quot;nvk-opts&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/fieldset&amp;gt;&lt;br /&gt;
&amp;lt;button type=&amp;quot;button&amp;quot; class=&amp;quot;nvk-btn&amp;quot; id=&amp;quot;nvk-reset&amp;quot;&amp;gt;Auswahl zurücksetzen&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk-out&amp;quot; aria-live=&amp;quot;polite&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;noscript&amp;gt;Für den Konfigurator wird JavaScript benötigt.&amp;lt;/noscript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
(function () {&lt;br /&gt;
&amp;quot;use strict&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
/* =====================================================================&lt;br /&gt;
   KONFIGURATION – hier wird gepflegt. Kein weiterer Code nötig.&lt;br /&gt;
   ===================================================================== */&lt;br /&gt;
&lt;br /&gt;
/* ---- 1) Auswahlfelder -------------------------------------------------&lt;br /&gt;
   v = interner Wert, t = Anzeigetext,&lt;br /&gt;
   only = Wert nur anbieten, wenn Bedingung passt (z. B. nur bestimmte Fahrzeuge)&lt;br /&gt;
   show = ganzes Feld nur zeigen, wenn Bedingung passt                      */&lt;br /&gt;
var FIELDS = [&lt;br /&gt;
  { id: &amp;quot;vehicle&amp;quot;, label: &amp;quot;Fahrzeug&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;E38&amp;quot;, t: &amp;quot;BMW E38&amp;quot; }, { v: &amp;quot;E39&amp;quot;, t: &amp;quot;BMW E39&amp;quot; }, { v: &amp;quot;E46&amp;quot;, t: &amp;quot;BMW E46&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;E53&amp;quot;, t: &amp;quot;BMW E53&amp;quot; }, { v: &amp;quot;E83&amp;quot;, t: &amp;quot;BMW E83&amp;quot; } ] },&lt;br /&gt;
&lt;br /&gt;
  { id: &amp;quot;factory&amp;quot;, label: &amp;quot;Verbaut ab Werk&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;iris&amp;quot;,  t: &amp;quot;Radio mit IRIS&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;mid&amp;quot;,   t: &amp;quot;Radio mit MID&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;n43&amp;quot;,   t: &amp;quot;4:3 Navi&amp;quot;,  only: { vehicle: [&amp;quot;E38&amp;quot;, &amp;quot;E39&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;n169&amp;quot;,  t: &amp;quot;16:9 Navi&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;pfeil&amp;quot;, t: &amp;quot;Pfeilnavi&amp;quot;, only: { vehicle: [&amp;quot;E46&amp;quot;] } } ] },&lt;br /&gt;
&lt;br /&gt;
  { id: &amp;quot;trunk&amp;quot;, label: &amp;quot;Befindet sich im Kofferraum ein Radiomodul?&amp;quot;,&lt;br /&gt;
    show: { factory: [&amp;quot;pfeil&amp;quot;] }, values: [&lt;br /&gt;
    { v: &amp;quot;ja&amp;quot;, t: &amp;quot;Ja, Radio-/Navimodul im Kofferraum&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;nein&amp;quot;, t: &amp;quot;Nein, Anschlüsse nur hinter dem Radio&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;unk&amp;quot;, t: &amp;quot;Weiß ich nicht&amp;quot; } ] },&lt;br /&gt;
&lt;br /&gt;
  { id: &amp;quot;sound&amp;quot;, label: &amp;quot;Soundsystem&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;stereo&amp;quot;, t: &amp;quot;Stereo&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;hifi&amp;quot;,   t: &amp;quot;Hifi&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;dsp&amp;quot;,    t: &amp;quot;DSP&amp;quot;,          only: { vehicle: [&amp;quot;E38&amp;quot;, &amp;quot;E39&amp;quot;, &amp;quot;E53&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;hk&amp;quot;,     t: &amp;quot;Harman Kardon&amp;quot;, only: { vehicle: [&amp;quot;E46&amp;quot;, &amp;quot;E83&amp;quot;] } } ] },&lt;br /&gt;
&lt;br /&gt;
  { id: &amp;quot;current&amp;quot;, label: &amp;quot;Aktuell verbaut&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;werk&amp;quot;, t: &amp;quot;Werksradio / Werksnavi&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;nach&amp;quot;, t: &amp;quot;Nachrüst-Radio / -Navi&amp;quot; } ] },&lt;br /&gt;
&lt;br /&gt;
  { id: &amp;quot;body&amp;quot;, label: &amp;quot;Karosserie&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;limo&amp;quot;,    t: &amp;quot;Limousine&amp;quot;, only: { vehicle: [&amp;quot;E38&amp;quot;, &amp;quot;E39&amp;quot;, &amp;quot;E46&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;touring&amp;quot;, t: &amp;quot;Touring&amp;quot;,   only: { vehicle: [&amp;quot;E39&amp;quot;, &amp;quot;E46&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;coupe&amp;quot;,   t: &amp;quot;Coupé&amp;quot;,     only: { vehicle: [&amp;quot;E46&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;cabrio&amp;quot;,  t: &amp;quot;Cabrio&amp;quot;,    only: { vehicle: [&amp;quot;E46&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;suv&amp;quot;,     t: &amp;quot;SUV&amp;quot;,       only: { vehicle: [&amp;quot;E53&amp;quot;, &amp;quot;E83&amp;quot;] } } ] },&lt;br /&gt;
&lt;br /&gt;
  { id: &amp;quot;ant&amp;quot;, label: &amp;quot;Antennenstecker am Radio (optional)&amp;quot;, optional: true, def: &amp;quot;unk&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;unk&amp;quot;,   t: &amp;quot;Weiß ich nicht&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;iso&amp;quot;,   t: &amp;quot;ISO (rund, „BM24“)&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;fakra&amp;quot;, t: &amp;quot;FAKRA (eckig, „BM54“)&amp;quot; } ] }&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
/* ---- 2) Zusatzoptionen (Mehrfachauswahl) -----------------------------&lt;br /&gt;
   show     = Option nur sichtbar, wenn Bedingung passt&lt;br /&gt;
   requires = Option nur sichtbar, wenn diese anderen Optionen gewählt sind&lt;br /&gt;
   excl     = Optionen mit gleicher excl-Gruppe schließen sich gegenseitig aus&lt;br /&gt;
   item     = Eintrag in ITEMS, der in der Liste erscheint                  */&lt;br /&gt;
var OPTS = [&lt;br /&gt;
  { id: &amp;quot;halter&amp;quot;,  t: &amp;quot;Radio-Halter&amp;quot;, sub: &amp;quot;nur BMW E39&amp;quot;, show: { vehicle: [&amp;quot;E39&amp;quot;] }, item: &amp;quot;halter&amp;quot; },&lt;br /&gt;
  { id: &amp;quot;ibus&amp;quot;,    t: &amp;quot;I-BUS App&amp;quot;, item: &amp;quot;ibus&amp;quot; },&lt;br /&gt;
  { id: &amp;quot;deepobd&amp;quot;, t: &amp;quot;DeepOBD (Diagnose)&amp;quot;, item: &amp;quot;deepobd&amp;quot; },&lt;br /&gt;
  { id: &amp;quot;can&amp;quot;,     t: &amp;quot;CAN Interface&amp;quot;, sub: &amp;quot;Addon – nur mit I-BUS App&amp;quot;, requires: [&amp;quot;ibus&amp;quot;], item: &amp;quot;can&amp;quot; },&lt;br /&gt;
  { id: &amp;quot;tpms&amp;quot;,    t: &amp;quot;TPMS (Reifendruck)&amp;quot;, item: &amp;quot;tpms&amp;quot; },&lt;br /&gt;
  { id: &amp;quot;dab1&amp;quot;,    t: &amp;quot;DAB+ (Single Receiver)&amp;quot;, excl: &amp;quot;dab&amp;quot;, item: &amp;quot;dab1&amp;quot; },&lt;br /&gt;
  { id: &amp;quot;dab2&amp;quot;,    t: &amp;quot;DAB+ (Dual Receiver)&amp;quot;,   excl: &amp;quot;dab&amp;quot;, item: &amp;quot;dab2&amp;quot; },&lt;br /&gt;
  { id: &amp;quot;rcam&amp;quot;,    t: &amp;quot;Rückfahrkamera&amp;quot;, item: &amp;quot;rcam&amp;quot; },&lt;br /&gt;
  { id: &amp;quot;fcam&amp;quot;,    t: &amp;quot;Front-Kamera&amp;quot;, item: &amp;quot;fcam&amp;quot; },&lt;br /&gt;
  { id: &amp;quot;tool&amp;quot;,    t: &amp;quot;Einbau-Werkzeug (Kunststoffheber)&amp;quot;, item: &amp;quot;tool&amp;quot; }&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
/* Wird eine Option durch eine Auswahl erzwungen, wird sie automatisch gesetzt. */&lt;br /&gt;
var FORCED = [&lt;br /&gt;
  { when: { sound: [&amp;quot;dsp&amp;quot;] }, opts: [&amp;quot;ibus&amp;quot;], why: &amp;quot;wegen DSP erforderlich&amp;quot; }&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
/* ---- 3) Artikel/Produkte ---------------------------------------------&lt;br /&gt;
   u = Link in den Shop (leer lassen = Eintrag ohne Link)                  */&lt;br /&gt;
var ITEMS = {&lt;br /&gt;
  exl005:  { t: &amp;quot;Verlängerung EXL005&amp;quot;, d: &amp;quot;Ersetzt das Radiomodul im Kofferraum (Bus-/Stromanschluss nach vorn).&amp;quot;,&lt;br /&gt;
             u: &amp;quot;https://shop.ibus-app.de/detail/index/sArticle/212/&amp;quot; },&lt;br /&gt;
  fakra6m: { t: &amp;quot;Verlängerung 6 m FAKRA(m) auf FAKRA(f), gewinkelt&amp;quot;, d: &amp;quot;Antennenverlängerung vom Kofferraum nach vorn.&amp;quot;,&lt;br /&gt;
             u: &amp;quot;https://shop.ibus-app.de/shop/zubehoer/adapterkabel/192/verlaengerung-6m-fakra-m-auf-fakra-f-kurz-gewinkelt&amp;quot; },&lt;br /&gt;
  isoada:  { t: &amp;quot;Adapter ISO-Stecker auf FAKRA, gewinkelt (15 cm)&amp;quot;, d: &amp;quot;Nötig, wenn das Fahrzeug einen ISO-Antennenstecker hat.&amp;quot;,&lt;br /&gt;
             u: &amp;quot;https://shop.ibus-app.de/shop/zubehoer/adapterkabel/193/adapter-kabel-iso-f-auf-fakra-f-kurz-gewinkelt-15cm&amp;quot; },&lt;br /&gt;
  dsplic:  { t: &amp;quot;DSP-Lizenz für die I-BUS App&amp;quot;, d: &amp;quot;Ohne diese Lizenz arbeitet das Werks-DSP nicht.&amp;quot;, u: &amp;quot;&amp;quot; },&lt;br /&gt;
  halter:  { t: &amp;quot;Halter zur Radio-Montage im BMW E39&amp;quot;, d: &amp;quot;Empfohlen bei Radios, die nicht von AVIN stammen.&amp;quot;,&lt;br /&gt;
             u: &amp;quot;https://shop.ibus-app.de/shop/zubehoer/182/halter-zur-radio-montage-im-bmw-e39&amp;quot; },&lt;br /&gt;
  ibus:    { t: &amp;quot;I-BUS App&amp;quot;, d: &amp;quot;Erhält Bordcomputer-Funktionen und steuert z. B. den Original-CD-Wechsler.&amp;quot;,&lt;br /&gt;
             u: &amp;quot;http://www.ibus-app.de&amp;quot; },&lt;br /&gt;
  deepobd: { t: &amp;quot;DeepOBD (Diagnose)&amp;quot;, d: &amp;quot;Live-Werte auslesen, Fehler lesen und löschen.&amp;quot;, u: &amp;quot;&amp;quot; },&lt;br /&gt;
  can:     { t: &amp;quot;CAN Interface (Addon zur I-BUS App)&amp;quot;, d: &amp;quot;Funktioniert nur zusammen mit der I-BUS App.&amp;quot;, u: &amp;quot;&amp;quot; },&lt;br /&gt;
  tpms:    { t: &amp;quot;TPMS – Reifendruckanzeige&amp;quot;, d: &amp;quot;&amp;quot;, u: &amp;quot;https://xtrons.co.uk/tyre-pressure-monitoring-system-tpms01&amp;quot; },&lt;br /&gt;
  dab1:    { t: &amp;quot;DAB+ Single Receiver&amp;quot;, d: &amp;quot;&amp;quot;, u: &amp;quot;https://xtrons.co.uk/dab-tuner-usbdab01&amp;quot; },&lt;br /&gt;
  dab2:    { t: &amp;quot;DAB+ Dual Receiver&amp;quot;, d: &amp;quot;&amp;quot;, u: &amp;quot;&amp;quot; },&lt;br /&gt;
  rcam:    { t: &amp;quot;Rückfahrkamera&amp;quot;, d: &amp;quot;&amp;quot;, u: &amp;quot;&amp;quot; },&lt;br /&gt;
  fcam:    { t: &amp;quot;Front-Kamera&amp;quot;, d: &amp;quot;&amp;quot;, u: &amp;quot;&amp;quot; },&lt;br /&gt;
  tool:    { t: &amp;quot;Einbau-Werkzeug (Kunststoffheber)&amp;quot;, d: &amp;quot;Zum schonenden Lösen der Verkleidungen.&amp;quot;, u: &amp;quot;&amp;quot; }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* ---- 4) Regeln --------------------------------------------------------&lt;br /&gt;
   type  = &amp;quot;need&amp;quot; (Das brauchst Du) | &amp;quot;hint&amp;quot; (Hinweise)&lt;br /&gt;
   when  = Bedingung auf die Auswahlfelder (alle Schlüssel müssen passen)&lt;br /&gt;
   opts  = (optional) diese Zusatzoptionen müssen gewählt sein&lt;br /&gt;
   items = Artikel aus ITEMS      html = Hinweistext (HTML erlaubt)&lt;br /&gt;
   Abgeleiteter Wert &amp;quot;module&amp;quot;: ja = Radiomodul im Kofferraum, nein = nicht, unk = unklar */&lt;br /&gt;
var RULES = [&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { current: [&amp;quot;werk&amp;quot;], module: [&amp;quot;ja&amp;quot;] }, items: [&amp;quot;exl005&amp;quot;, &amp;quot;fakra6m&amp;quot;] },&lt;br /&gt;
&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { current: [&amp;quot;nach&amp;quot;], module: [&amp;quot;ja&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;&amp;lt;b&amp;gt;Verlängerungen prüfen:&amp;lt;/b&amp;gt; Bei einem bereits verbauten Nachrüst-Radio sollten EXL005 und FAKRA-Verlängerung schon vorhanden sein. &amp;lt;b&amp;gt;Ungeeignet&amp;lt;/b&amp;gt; sind die Standard-„Quad-Lock-Verlängerung kombiniert mit Antennenverlängerung“ und die „EXL006“ (kein BUS-Signal).&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;ja&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;&amp;lt;b&amp;gt;Kabelwege:&amp;lt;/b&amp;gt; Die Technik sitzt im Kofferraum. Es müssen mindestens Kabel für Radioanschluss und FM-Antenne nach vorn verlegt werden. Optional zusätzlich: GPS (OEM-Antenne), Verlängerung für DAB+, Anschluss OEM-CD-Wechsler, Cinch für Subwoofer.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;nein&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;&amp;lt;b&amp;gt;Kabelwege:&amp;lt;/b&amp;gt; Alle Anschlüsse befinden sich direkt hinter dem Radio, es müssen &amp;lt;b&amp;gt;keine&amp;lt;/b&amp;gt; Kabel verlegt werden. Optional ggf. für: GPS (OEM-Antenne), DAB+, OEM-CD-Wechsler, Cinch für Subwoofer.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;unk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;&amp;lt;b&amp;gt;Bitte prüfen:&amp;lt;/b&amp;gt; Schau nach, ob im Kofferraum ein Radiomodul sitzt. Manche E46 mit Pfeilnavi (vermutlich Vorfacelift) haben das Radio hinten und benötigen dann EXL005 + FAKRA-Verlängerung.&amp;quot; },&lt;br /&gt;
&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { ant: [&amp;quot;iso&amp;quot;] }, items: [&amp;quot;isoada&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { ant: [&amp;quot;unk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;&amp;lt;b&amp;gt;Antennenstecker:&amp;lt;/b&amp;gt; Hat Dein Fahrzeug einen ISO-Antennenstecker, brauchst Du zusätzlich den &amp;lt;a href='https://shop.ibus-app.de/shop/zubehoer/adapterkabel/193/adapter-kabel-iso-f-auf-fakra-f-kurz-gewinkelt-15cm'&amp;gt;Adapter ISO auf FAKRA&amp;lt;/a&amp;gt;. Bei FAKRA ist kein Adapter nötig.&amp;quot; },&lt;br /&gt;
&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { sound: [&amp;quot;dsp&amp;quot;] }, items: [&amp;quot;dsplic&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { sound: [&amp;quot;dsp&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;&amp;lt;b&amp;gt;DSP:&amp;lt;/b&amp;gt; Damit das Werks-DSP überhaupt arbeitet, wird die I-BUS App mit DSP-Lizenz benötigt.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { sound: [&amp;quot;hk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;&amp;lt;b&amp;gt;Harman Kardon:&amp;lt;/b&amp;gt; Benötigt &amp;lt;b&amp;gt;keine&amp;lt;/b&amp;gt; DSP-Lizenz. Das Remote-Signal (+12 V, wenn Radio an) genügt zum Starten.&amp;quot; },&lt;br /&gt;
&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;E38&amp;quot;, &amp;quot;E53&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;&amp;lt;b&amp;gt;Montage:&amp;lt;/b&amp;gt; Radios für BMW E38/E53 benötigen keine extra Halterungen.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;E39&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;&amp;lt;b&amp;gt;Montage:&amp;lt;/b&amp;gt; Bei Radios, die nicht von AVIN stammen, empfehlen wir einen Halter (siehe Zusatzoptionen) oder das Bearbeiten der beiliegenden Montagewinkel. Anleitungen: &amp;lt;a href='https://xtrons.ibus-app.de/index.php?title=Montageanleitungen'&amp;gt;Montageanleitungen&amp;lt;/a&amp;gt;.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;E46&amp;quot;], factory: [&amp;quot;iris&amp;quot;, &amp;quot;mid&amp;quot;, &amp;quot;pfeil&amp;quot;], current: [&amp;quot;werk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;&amp;lt;b&amp;gt;Montage E46 ohne großes Navi:&amp;lt;/b&amp;gt; Das Klimabedienteil muss nach unten versetzt werden. Dafür brauchst Du den passenden &amp;lt;b&amp;gt;Funktionsträger&amp;lt;/b&amp;gt; (neu ca. 100 €, ggf. beim Teileverwerter günstiger):&amp;lt;br&amp;gt;&amp;quot; +&lt;br /&gt;
          &amp;quot;Einzelschalter (eher VFL): &amp;lt;a href='https://www.leebmann24.de/trager-3er-51168202186.html'&amp;gt;ohne Raucher 51168202186&amp;lt;/a&amp;gt; / &amp;lt;a href='https://www.leebmann24.de/trager-3er-51168230902.html'&amp;gt;mit Raucher 51168230902&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&amp;quot; +&lt;br /&gt;
          &amp;quot;Schaltzentrum (eher FL): &amp;lt;a href='https://www.leebmann24.de/funktionstrager-schaltzentrum-3er-51167001408.html'&amp;gt;ohne Raucher 51167001408&amp;lt;/a&amp;gt; / &amp;lt;a href='https://www.leebmann24.de/funktionstrager-schaltzentrum-3er-51167001410.html'&amp;gt;mit Raucher 51167001410&amp;lt;/a&amp;gt;&amp;quot; },&lt;br /&gt;
&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, opts: [&amp;quot;ibus&amp;quot;], when: {},&lt;br /&gt;
    html: &amp;quot;&amp;lt;b&amp;gt;I-BUS App:&amp;lt;/b&amp;gt; Siehe &amp;lt;a href='https://wiki.ibus-app.de/index.php?title=Was_brauche_ich_um_die_I-BUS_App_nutzen_zu_k%C3%B6nnen%3F'&amp;gt;Was brauche ich, um die I-BUS App nutzen zu können?&amp;lt;/a&amp;gt; und die &amp;lt;a href='https://wiki.ibus-app.de/index.php?title=Einbauanleitung_f%C3%BCr_Resler_Modul_und_Resler_Interface'&amp;gt;Einbauanleitung für Resler Modul und Interface&amp;lt;/a&amp;gt;.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: {}, opts: [],&lt;br /&gt;
    html: &amp;quot;&amp;lt;b&amp;gt;Wichtig:&amp;lt;/b&amp;gt; Bitte immer die Anschlüsse am eigenen Radio abgleichen. Welches Radio passt? → &amp;lt;a href='https://xtrons.ibus-app.de/index.php?title=Entscheidungshilfe%3A_AVIN_oder_XTRONS%3F'&amp;gt;Entscheidungshilfe AVIN oder XTRONS&amp;lt;/a&amp;gt;, Kosten → &amp;lt;a href='https://xtrons.ibus-app.de/index.php?title=Grobe_Kosten%C3%BCbersicht'&amp;gt;Grobe Kostenübersicht&amp;lt;/a&amp;gt;.&amp;quot; }&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
/* =====================================================================&lt;br /&gt;
   PROGRAMMLOGIK&lt;br /&gt;
   ===================================================================== */&lt;br /&gt;
var $ = function (id) { return document.getElementById(id); };&lt;br /&gt;
var sel = {}, picked = {};&lt;br /&gt;
var fieldsEl = $(&amp;quot;nvk-fields&amp;quot;), optsEl = $(&amp;quot;nvk-opts&amp;quot;), outEl = $(&amp;quot;nvk-out&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
function match(cond, s, lenient) {&lt;br /&gt;
  if (!cond) return true;&lt;br /&gt;
  for (var k in cond) {&lt;br /&gt;
    if (!s[k]) { if (lenient) continue; return false; }&lt;br /&gt;
    if (cond[k].indexOf(s[k]) &amp;lt; 0) return false;&lt;br /&gt;
  }&lt;br /&gt;
  return true;&lt;br /&gt;
}&lt;br /&gt;
function derive() {&lt;br /&gt;
  var s = {}, k;&lt;br /&gt;
  for (k in sel) s[k] = sel[k];&lt;br /&gt;
  if (s.factory === &amp;quot;n43&amp;quot; || s.factory === &amp;quot;n169&amp;quot;) s.module = &amp;quot;ja&amp;quot;;&lt;br /&gt;
  else if (s.factory === &amp;quot;iris&amp;quot; || s.factory === &amp;quot;mid&amp;quot;) s.module = &amp;quot;nein&amp;quot;;&lt;br /&gt;
  else if (s.factory === &amp;quot;pfeil&amp;quot;) s.module = s.trunk || &amp;quot;unk&amp;quot;;&lt;br /&gt;
  return s;&lt;br /&gt;
}&lt;br /&gt;
function forced(s) {&lt;br /&gt;
  var f = {};&lt;br /&gt;
  FORCED.forEach(function (r) { if (match(r.when, s)) r.opts.forEach(function (o) { f[o] = r.why; }); });&lt;br /&gt;
  return f;&lt;br /&gt;
}&lt;br /&gt;
function onSet(s) {&lt;br /&gt;
  var f = forced(s), on = {}, k;&lt;br /&gt;
  for (k in picked) if (picked[k]) on[k] = true;&lt;br /&gt;
  for (k in f) on[k] = true;&lt;br /&gt;
  return { on: on, forced: f };&lt;br /&gt;
}&lt;br /&gt;
function optVisible(o, s, on) {&lt;br /&gt;
  if (!match(o.show, s, true)) return false;&lt;br /&gt;
  return (o.requires || []).every(function (r) { return on[r]; });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Felder aufbauen */&lt;br /&gt;
FIELDS.forEach(function (f) {&lt;br /&gt;
  var wrap = document.createElement(&amp;quot;div&amp;quot;); wrap.className = &amp;quot;nvk-f&amp;quot;; wrap.id = &amp;quot;nvk-w-&amp;quot; + f.id;&lt;br /&gt;
  var lab = document.createElement(&amp;quot;label&amp;quot;); lab.htmlFor = &amp;quot;nvk-&amp;quot; + f.id; lab.textContent = f.label;&lt;br /&gt;
  var s = document.createElement(&amp;quot;select&amp;quot;); s.id = &amp;quot;nvk-&amp;quot; + f.id;&lt;br /&gt;
  s.addEventListener(&amp;quot;change&amp;quot;, function () { sel[f.id] = s.value; update(); });&lt;br /&gt;
  wrap.appendChild(lab); wrap.appendChild(s); fieldsEl.appendChild(wrap);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
function renderFields() {&lt;br /&gt;
  var s = derive();&lt;br /&gt;
  FIELDS.forEach(function (f) {&lt;br /&gt;
    var wrap = $(&amp;quot;nvk-w-&amp;quot; + f.id), el = $(&amp;quot;nvk-&amp;quot; + f.id);&lt;br /&gt;
    var vis = match(f.show, s, false) || !f.show;&lt;br /&gt;
    wrap.style.display = vis ? &amp;quot;&amp;quot; : &amp;quot;none&amp;quot;;&lt;br /&gt;
    if (!vis) { sel[f.id] = &amp;quot;&amp;quot;; return; }&lt;br /&gt;
    var allowed = f.values.filter(function (v) { return match(v.only, s, true); });&lt;br /&gt;
    if (sel[f.id] &amp;amp;&amp;amp; !allowed.some(function (v) { return v.v === sel[f.id]; })) sel[f.id] = &amp;quot;&amp;quot;;&lt;br /&gt;
    if (!sel[f.id] &amp;amp;&amp;amp; f.def) sel[f.id] = f.def;&lt;br /&gt;
    el.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
    if (!f.def) { var p = document.createElement(&amp;quot;option&amp;quot;); p.value = &amp;quot;&amp;quot;; p.textContent = &amp;quot;– bitte wählen –&amp;quot;; el.appendChild(p); }&lt;br /&gt;
    allowed.forEach(function (v) {&lt;br /&gt;
      var o = document.createElement(&amp;quot;option&amp;quot;); o.value = v.v; o.textContent = v.t; el.appendChild(o);&lt;br /&gt;
    });&lt;br /&gt;
    el.value = sel[f.id] || &amp;quot;&amp;quot;;&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function renderOpts() {&lt;br /&gt;
  var s = derive(), st = onSet(s);&lt;br /&gt;
  /* Gruppen-Ausschluss &amp;amp; nicht mehr sichtbare Optionen bereinigen */&lt;br /&gt;
  OPTS.forEach(function (o) { if (!optVisible(o, s, st.on)) picked[o.id] = false; });&lt;br /&gt;
  st = onSet(s);&lt;br /&gt;
  optsEl.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
  OPTS.forEach(function (o) {&lt;br /&gt;
    if (!optVisible(o, s, st.on)) return;&lt;br /&gt;
    var lab = document.createElement(&amp;quot;label&amp;quot;); lab.className = &amp;quot;nvk-o&amp;quot;;&lt;br /&gt;
    var cb = document.createElement(&amp;quot;input&amp;quot;); cb.type = &amp;quot;checkbox&amp;quot;;&lt;br /&gt;
    cb.checked = !!st.on[o.id];&lt;br /&gt;
    var isForced = !!st.forced[o.id];&lt;br /&gt;
    if (isForced) { cb.disabled = true; lab.className += &amp;quot; dis&amp;quot;; }&lt;br /&gt;
    cb.addEventListener(&amp;quot;change&amp;quot;, function () {&lt;br /&gt;
      picked[o.id] = cb.checked;&lt;br /&gt;
      if (cb.checked &amp;amp;&amp;amp; o.excl) OPTS.forEach(function (x) { if (x.excl === o.excl &amp;amp;&amp;amp; x.id !== o.id) picked[x.id] = false; });&lt;br /&gt;
      update();&lt;br /&gt;
    });&lt;br /&gt;
    lab.appendChild(cb);&lt;br /&gt;
    var txt = &amp;quot; &amp;quot; + o.t;&lt;br /&gt;
    lab.appendChild(document.createTextNode(txt));&lt;br /&gt;
    var sub = [o.sub, isForced ? st.forced[o.id] : &amp;quot;&amp;quot;].filter(Boolean).join(&amp;quot; – &amp;quot;);&lt;br /&gt;
    if (sub) { var sm = document.createElement(&amp;quot;small&amp;quot;); sm.textContent = &amp;quot; (&amp;quot; + sub + &amp;quot;)&amp;quot;; lab.appendChild(sm); }&lt;br /&gt;
    optsEl.appendChild(lab);&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function card(item, cls) {&lt;br /&gt;
  var d = document.createElement(&amp;quot;div&amp;quot;); d.className = &amp;quot;nvk-card &amp;quot; + (cls || &amp;quot;&amp;quot;);&lt;br /&gt;
  var b = document.createElement(&amp;quot;b&amp;quot;); b.textContent = item.t; d.appendChild(b);&lt;br /&gt;
  if (item.d) { var p = document.createElement(&amp;quot;span&amp;quot;); p.textContent = item.d; d.appendChild(p); }&lt;br /&gt;
  if (item.u) {&lt;br /&gt;
    var a = document.createElement(&amp;quot;a&amp;quot;); a.className = &amp;quot;nvk-shop&amp;quot;; a.href = item.u; a.target = &amp;quot;_blank&amp;quot;; a.rel = &amp;quot;noopener&amp;quot;;&lt;br /&gt;
    a.textContent = &amp;quot;Im Shop ansehen →&amp;quot;; d.appendChild(a);&lt;br /&gt;
  }&lt;br /&gt;
  return d;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function renderResult() {&lt;br /&gt;
  var s = derive(), st = onSet(s);&lt;br /&gt;
  var required = [&amp;quot;vehicle&amp;quot;, &amp;quot;factory&amp;quot;, &amp;quot;sound&amp;quot;, &amp;quot;current&amp;quot;, &amp;quot;body&amp;quot;];&lt;br /&gt;
  var names = { vehicle: &amp;quot;Fahrzeug&amp;quot;, factory: &amp;quot;Verbaut ab Werk&amp;quot;, sound: &amp;quot;Soundsystem&amp;quot;, current: &amp;quot;Aktuell verbaut&amp;quot;, body: &amp;quot;Karosserie&amp;quot; };&lt;br /&gt;
  var missing = required.filter(function (k) { return !sel[k]; });&lt;br /&gt;
  outEl.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
  if (missing.length) {&lt;br /&gt;
    var m = document.createElement(&amp;quot;p&amp;quot;); m.className = &amp;quot;nvk-miss&amp;quot;;&lt;br /&gt;
    m.textContent = &amp;quot;Bitte noch auswählen: &amp;quot; + missing.map(function (k) { return names[k]; }).join(&amp;quot;, &amp;quot;);&lt;br /&gt;
    outEl.appendChild(m); return;&lt;br /&gt;
  }&lt;br /&gt;
  var needs = [], hints = [], seen = {};&lt;br /&gt;
  RULES.forEach(function (r) {&lt;br /&gt;
    if (!match(r.when, s)) return;&lt;br /&gt;
    if (r.opts &amp;amp;&amp;amp; !r.opts.every(function (o) { return st.on[o]; })) return;&lt;br /&gt;
    if (r.type === &amp;quot;need&amp;quot;) (r.items || []).forEach(function (id) { if (!seen[id]) { seen[id] = 1; needs.push(ITEMS[id]); } });&lt;br /&gt;
    else hints.push(r.html);&lt;br /&gt;
  });&lt;br /&gt;
  var h = document.createElement(&amp;quot;h3&amp;quot;); h.textContent = &amp;quot;Das brauchst Du&amp;quot;; outEl.appendChild(h);&lt;br /&gt;
  if (needs.length) needs.forEach(function (i) { outEl.appendChild(card(i)); });&lt;br /&gt;
  else { var n = document.createElement(&amp;quot;p&amp;quot;); n.textContent = &amp;quot;Für die Grundinstallation sind keine zusätzlichen Verlängerungen oder Adapter nötig.&amp;quot;; outEl.appendChild(n); }&lt;br /&gt;
&lt;br /&gt;
  var opt = [];&lt;br /&gt;
  OPTS.forEach(function (o) { if (st.on[o.id] &amp;amp;&amp;amp; optVisible(o, s, st.on) &amp;amp;&amp;amp; !seen[o.item]) opt.push(ITEMS[o.item]); });&lt;br /&gt;
  if (opt.length) {&lt;br /&gt;
    var h2 = document.createElement(&amp;quot;h3&amp;quot;); h2.textContent = &amp;quot;Deine Zusatzoptionen&amp;quot;; outEl.appendChild(h2);&lt;br /&gt;
    opt.forEach(function (i) { outEl.appendChild(card(i, &amp;quot;opt&amp;quot;)); });&lt;br /&gt;
  }&lt;br /&gt;
  if (hints.length) {&lt;br /&gt;
    var h3 = document.createElement(&amp;quot;h3&amp;quot;); h3.textContent = &amp;quot;Hinweise&amp;quot;; outEl.appendChild(h3);&lt;br /&gt;
    hints.forEach(function (t) { var d = document.createElement(&amp;quot;div&amp;quot;); d.className = &amp;quot;nvk-note&amp;quot;; d.innerHTML = t; outEl.appendChild(d); });&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function update() { renderFields(); renderOpts(); renderResult(); }&lt;br /&gt;
$(&amp;quot;nvk-reset&amp;quot;).addEventListener(&amp;quot;click&amp;quot;, function () { sel = {}; picked = {}; update(); });&lt;br /&gt;
update();&lt;br /&gt;
})();&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andre</name></author>
	</entry>
	<entry>
		<id>https://xtrons.ibus-app.de/index.php?title=Android_Radio_Konfigurator&amp;diff=4069</id>
		<title>Android Radio Konfigurator</title>
		<link rel="alternate" type="text/html" href="https://xtrons.ibus-app.de/index.php?title=Android_Radio_Konfigurator&amp;diff=4069"/>
		<updated>2026-10-21T07:54:29Z</updated>

		<summary type="html">&lt;p&gt;Andre: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;html&amp;gt;&amp;lt;script&amp;gt;document.write(&amp;quot;JS läuft&amp;quot;);&amp;lt;/script&amp;gt;&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html&amp;gt;&amp;lt;div id=&amp;quot;nvk&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
#nvk{max-width:900px;line-height:1.45}&lt;br /&gt;
#nvk *{box-sizing:border-box}&lt;br /&gt;
#nvk .nvk-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:14px;margin:12px 0}&lt;br /&gt;
#nvk .nvk-f label,#nvk .nvk-h{display:block;font-weight:700;margin-bottom:4px}&lt;br /&gt;
#nvk select{width:100%;padding:9px 8px;font:inherit;color:#202122;background:#fff;border:1px solid #a2a9b1;border-radius:4px}&lt;br /&gt;
#nvk fieldset{border:1px solid rgba(128,128,128,.45);border-radius:6px;padding:10px 14px;margin:14px 0}&lt;br /&gt;
#nvk legend{font-weight:700;padding:0 6px}&lt;br /&gt;
#nvk .nvk-o{display:block;padding:4px 0;cursor:pointer}&lt;br /&gt;
#nvk .nvk-o small{opacity:.7}&lt;br /&gt;
#nvk .nvk-o.dis{opacity:.75;cursor:default}&lt;br /&gt;
#nvk .nvk-btn{padding:7px 14px;font:inherit;border:1px solid #a2a9b1;border-radius:4px;background:#f8f9fa;color:#202122;cursor:pointer}&lt;br /&gt;
#nvk #nvk-out{margin-top:18px}&lt;br /&gt;
#nvk h3{margin:18px 0 8px}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-card.opt{border-left-color:#14866d}&lt;br /&gt;
#nvk .nvk-card b{display:block}&lt;br /&gt;
#nvk .nvk-card a.nvk-shop{display:inline-block;margin-top:4px;font-weight:600}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-miss{opacity:.8;font-style:italic}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-grid&amp;quot; id=&amp;quot;nvk-fields&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;fieldset id=&amp;quot;nvk-optset&amp;quot;&amp;gt;&amp;lt;legend&amp;gt;Zusatzoptionen&amp;lt;/legend&amp;gt;&amp;lt;div id=&amp;quot;nvk-opts&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/fieldset&amp;gt;&lt;br /&gt;
&amp;lt;button type=&amp;quot;button&amp;quot; class=&amp;quot;nvk-btn&amp;quot; id=&amp;quot;nvk-reset&amp;quot;&amp;gt;Auswahl zurücksetzen&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk-out&amp;quot; aria-live=&amp;quot;polite&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;noscript&amp;gt;Für den Konfigurator wird JavaScript benötigt.&amp;lt;/noscript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
(function () {&lt;br /&gt;
&amp;quot;use strict&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
/* =====================================================================&lt;br /&gt;
   KONFIGURATION – hier wird gepflegt. Kein weiterer Code nötig.&lt;br /&gt;
   ===================================================================== */&lt;br /&gt;
&lt;br /&gt;
/* ---- 1) Auswahlfelder -------------------------------------------------&lt;br /&gt;
   v = interner Wert, t = Anzeigetext,&lt;br /&gt;
   only = Wert nur anbieten, wenn Bedingung passt (z. B. nur bestimmte Fahrzeuge)&lt;br /&gt;
   show = ganzes Feld nur zeigen, wenn Bedingung passt                      */&lt;br /&gt;
var FIELDS = [&lt;br /&gt;
  { id: &amp;quot;vehicle&amp;quot;, label: &amp;quot;Fahrzeug&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;E38&amp;quot;, t: &amp;quot;BMW E38&amp;quot; }, { v: &amp;quot;E39&amp;quot;, t: &amp;quot;BMW E39&amp;quot; }, { v: &amp;quot;E46&amp;quot;, t: &amp;quot;BMW E46&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;E53&amp;quot;, t: &amp;quot;BMW E53&amp;quot; }, { v: &amp;quot;E83&amp;quot;, t: &amp;quot;BMW E83&amp;quot; } ] },&lt;br /&gt;
&lt;br /&gt;
  { id: &amp;quot;factory&amp;quot;, label: &amp;quot;Verbaut ab Werk&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;iris&amp;quot;,  t: &amp;quot;Radio mit IRIS&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;mid&amp;quot;,   t: &amp;quot;Radio mit MID&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;n43&amp;quot;,   t: &amp;quot;4:3 Navi&amp;quot;,  only: { vehicle: [&amp;quot;E38&amp;quot;, &amp;quot;E39&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;n169&amp;quot;,  t: &amp;quot;16:9 Navi&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;pfeil&amp;quot;, t: &amp;quot;Pfeilnavi&amp;quot;, only: { vehicle: [&amp;quot;E46&amp;quot;] } } ] },&lt;br /&gt;
&lt;br /&gt;
  { id: &amp;quot;trunk&amp;quot;, label: &amp;quot;Befindet sich im Kofferraum ein Radiomodul?&amp;quot;,&lt;br /&gt;
    show: { factory: [&amp;quot;pfeil&amp;quot;] }, values: [&lt;br /&gt;
    { v: &amp;quot;ja&amp;quot;, t: &amp;quot;Ja, Radio-/Navimodul im Kofferraum&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;nein&amp;quot;, t: &amp;quot;Nein, Anschlüsse nur hinter dem Radio&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;unk&amp;quot;, t: &amp;quot;Weiß ich nicht&amp;quot; } ] },&lt;br /&gt;
&lt;br /&gt;
  { id: &amp;quot;sound&amp;quot;, label: &amp;quot;Soundsystem&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;stereo&amp;quot;, t: &amp;quot;Stereo&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;hifi&amp;quot;,   t: &amp;quot;Hifi&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;dsp&amp;quot;,    t: &amp;quot;DSP&amp;quot;,          only: { vehicle: [&amp;quot;E38&amp;quot;, &amp;quot;E39&amp;quot;, &amp;quot;E53&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;hk&amp;quot;,     t: &amp;quot;Harman Kardon&amp;quot;, only: { vehicle: [&amp;quot;E46&amp;quot;, &amp;quot;E83&amp;quot;] } } ] },&lt;br /&gt;
&lt;br /&gt;
  { id: &amp;quot;current&amp;quot;, label: &amp;quot;Aktuell verbaut&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;werk&amp;quot;, t: &amp;quot;Werksradio / Werksnavi&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;nach&amp;quot;, t: &amp;quot;Nachrüst-Radio / -Navi&amp;quot; } ] },&lt;br /&gt;
&lt;br /&gt;
  { id: &amp;quot;body&amp;quot;, label: &amp;quot;Karosserie&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;limo&amp;quot;,    t: &amp;quot;Limousine&amp;quot;, only: { vehicle: [&amp;quot;E38&amp;quot;, &amp;quot;E39&amp;quot;, &amp;quot;E46&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;touring&amp;quot;, t: &amp;quot;Touring&amp;quot;,   only: { vehicle: [&amp;quot;E39&amp;quot;, &amp;quot;E46&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;coupe&amp;quot;,   t: &amp;quot;Coupé&amp;quot;,     only: { vehicle: [&amp;quot;E46&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;cabrio&amp;quot;,  t: &amp;quot;Cabrio&amp;quot;,    only: { vehicle: [&amp;quot;E46&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;suv&amp;quot;,     t: &amp;quot;SUV&amp;quot;,       only: { vehicle: [&amp;quot;E53&amp;quot;, &amp;quot;E83&amp;quot;] } } ] },&lt;br /&gt;
&lt;br /&gt;
  { id: &amp;quot;ant&amp;quot;, label: &amp;quot;Antennenstecker am Radio (optional)&amp;quot;, optional: true, def: &amp;quot;unk&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;unk&amp;quot;,   t: &amp;quot;Weiß ich nicht&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;iso&amp;quot;,   t: &amp;quot;ISO (rund, „BM24“)&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;fakra&amp;quot;, t: &amp;quot;FAKRA (eckig, „BM54“)&amp;quot; } ] }&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
/* ---- 2) Zusatzoptionen (Mehrfachauswahl) -----------------------------&lt;br /&gt;
   show     = Option nur sichtbar, wenn Bedingung passt&lt;br /&gt;
   requires = Option nur sichtbar, wenn diese anderen Optionen gewählt sind&lt;br /&gt;
   excl     = Optionen mit gleicher excl-Gruppe schließen sich gegenseitig aus&lt;br /&gt;
   item     = Eintrag in ITEMS, der in der Liste erscheint                  */&lt;br /&gt;
var OPTS = [&lt;br /&gt;
  { id: &amp;quot;halter&amp;quot;,  t: &amp;quot;Radio-Halter&amp;quot;, sub: &amp;quot;nur BMW E39&amp;quot;, show: { vehicle: [&amp;quot;E39&amp;quot;] }, item: &amp;quot;halter&amp;quot; },&lt;br /&gt;
  { id: &amp;quot;ibus&amp;quot;,    t: &amp;quot;I-BUS App&amp;quot;, item: &amp;quot;ibus&amp;quot; },&lt;br /&gt;
  { id: &amp;quot;deepobd&amp;quot;, t: &amp;quot;DeepOBD (Diagnose)&amp;quot;, item: &amp;quot;deepobd&amp;quot; },&lt;br /&gt;
  { id: &amp;quot;can&amp;quot;,     t: &amp;quot;CAN Interface&amp;quot;, sub: &amp;quot;Addon – nur mit I-BUS App&amp;quot;, requires: [&amp;quot;ibus&amp;quot;], item: &amp;quot;can&amp;quot; },&lt;br /&gt;
  { id: &amp;quot;tpms&amp;quot;,    t: &amp;quot;TPMS (Reifendruck)&amp;quot;, item: &amp;quot;tpms&amp;quot; },&lt;br /&gt;
  { id: &amp;quot;dab1&amp;quot;,    t: &amp;quot;DAB+ (Single Receiver)&amp;quot;, excl: &amp;quot;dab&amp;quot;, item: &amp;quot;dab1&amp;quot; },&lt;br /&gt;
  { id: &amp;quot;dab2&amp;quot;,    t: &amp;quot;DAB+ (Dual Receiver)&amp;quot;,   excl: &amp;quot;dab&amp;quot;, item: &amp;quot;dab2&amp;quot; },&lt;br /&gt;
  { id: &amp;quot;rcam&amp;quot;,    t: &amp;quot;Rückfahrkamera&amp;quot;, item: &amp;quot;rcam&amp;quot; },&lt;br /&gt;
  { id: &amp;quot;fcam&amp;quot;,    t: &amp;quot;Front-Kamera&amp;quot;, item: &amp;quot;fcam&amp;quot; },&lt;br /&gt;
  { id: &amp;quot;tool&amp;quot;,    t: &amp;quot;Einbau-Werkzeug (Kunststoffheber)&amp;quot;, item: &amp;quot;tool&amp;quot; }&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
/* Wird eine Option durch eine Auswahl erzwungen, wird sie automatisch gesetzt. */&lt;br /&gt;
var FORCED = [&lt;br /&gt;
  { when: { sound: [&amp;quot;dsp&amp;quot;] }, opts: [&amp;quot;ibus&amp;quot;], why: &amp;quot;wegen DSP erforderlich&amp;quot; }&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
/* ---- 3) Artikel/Produkte ---------------------------------------------&lt;br /&gt;
   u = Link in den Shop (leer lassen = Eintrag ohne Link)                  */&lt;br /&gt;
var ITEMS = {&lt;br /&gt;
  exl005:  { t: &amp;quot;Verlängerung EXL005&amp;quot;, d: &amp;quot;Ersetzt das Radiomodul im Kofferraum (Bus-/Stromanschluss nach vorn).&amp;quot;,&lt;br /&gt;
             u: &amp;quot;https://shop.ibus-app.de/detail/index/sArticle/212/&amp;quot; },&lt;br /&gt;
  fakra6m: { t: &amp;quot;Verlängerung 6 m FAKRA(m) auf FAKRA(f), gewinkelt&amp;quot;, d: &amp;quot;Antennenverlängerung vom Kofferraum nach vorn.&amp;quot;,&lt;br /&gt;
             u: &amp;quot;https://shop.ibus-app.de/shop/zubehoer/adapterkabel/192/verlaengerung-6m-fakra-m-auf-fakra-f-kurz-gewinkelt&amp;quot; },&lt;br /&gt;
  isoada:  { t: &amp;quot;Adapter ISO-Stecker auf FAKRA, gewinkelt (15 cm)&amp;quot;, d: &amp;quot;Nötig, wenn das Fahrzeug einen ISO-Antennenstecker hat.&amp;quot;,&lt;br /&gt;
             u: &amp;quot;https://shop.ibus-app.de/shop/zubehoer/adapterkabel/193/adapter-kabel-iso-f-auf-fakra-f-kurz-gewinkelt-15cm&amp;quot; },&lt;br /&gt;
  dsplic:  { t: &amp;quot;DSP-Lizenz für die I-BUS App&amp;quot;, d: &amp;quot;Ohne diese Lizenz arbeitet das Werks-DSP nicht.&amp;quot;, u: &amp;quot;&amp;quot; },&lt;br /&gt;
  halter:  { t: &amp;quot;Halter zur Radio-Montage im BMW E39&amp;quot;, d: &amp;quot;Empfohlen bei Radios, die nicht von AVIN stammen.&amp;quot;,&lt;br /&gt;
             u: &amp;quot;https://shop.ibus-app.de/shop/zubehoer/182/halter-zur-radio-montage-im-bmw-e39&amp;quot; },&lt;br /&gt;
  ibus:    { t: &amp;quot;I-BUS App&amp;quot;, d: &amp;quot;Erhält Bordcomputer-Funktionen und steuert z. B. den Original-CD-Wechsler.&amp;quot;,&lt;br /&gt;
             u: &amp;quot;http://www.ibus-app.de&amp;quot; },&lt;br /&gt;
  deepobd: { t: &amp;quot;DeepOBD (Diagnose)&amp;quot;, d: &amp;quot;Live-Werte auslesen, Fehler lesen und löschen.&amp;quot;, u: &amp;quot;&amp;quot; },&lt;br /&gt;
  can:     { t: &amp;quot;CAN Interface (Addon zur I-BUS App)&amp;quot;, d: &amp;quot;Funktioniert nur zusammen mit der I-BUS App.&amp;quot;, u: &amp;quot;&amp;quot; },&lt;br /&gt;
  tpms:    { t: &amp;quot;TPMS – Reifendruckanzeige&amp;quot;, d: &amp;quot;&amp;quot;, u: &amp;quot;https://xtrons.co.uk/tyre-pressure-monitoring-system-tpms01&amp;quot; },&lt;br /&gt;
  dab1:    { t: &amp;quot;DAB+ Single Receiver&amp;quot;, d: &amp;quot;&amp;quot;, u: &amp;quot;https://xtrons.co.uk/dab-tuner-usbdab01&amp;quot; },&lt;br /&gt;
  dab2:    { t: &amp;quot;DAB+ Dual Receiver&amp;quot;, d: &amp;quot;&amp;quot;, u: &amp;quot;&amp;quot; },&lt;br /&gt;
  rcam:    { t: &amp;quot;Rückfahrkamera&amp;quot;, d: &amp;quot;&amp;quot;, u: &amp;quot;&amp;quot; },&lt;br /&gt;
  fcam:    { t: &amp;quot;Front-Kamera&amp;quot;, d: &amp;quot;&amp;quot;, u: &amp;quot;&amp;quot; },&lt;br /&gt;
  tool:    { t: &amp;quot;Einbau-Werkzeug (Kunststoffheber)&amp;quot;, d: &amp;quot;Zum schonenden Lösen der Verkleidungen.&amp;quot;, u: &amp;quot;&amp;quot; }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* ---- 4) Regeln --------------------------------------------------------&lt;br /&gt;
   type  = &amp;quot;need&amp;quot; (Das brauchst Du) | &amp;quot;hint&amp;quot; (Hinweise)&lt;br /&gt;
   when  = Bedingung auf die Auswahlfelder (alle Schlüssel müssen passen)&lt;br /&gt;
   opts  = (optional) diese Zusatzoptionen müssen gewählt sein&lt;br /&gt;
   items = Artikel aus ITEMS      html = Hinweistext (HTML erlaubt)&lt;br /&gt;
   Abgeleiteter Wert &amp;quot;module&amp;quot;: ja = Radiomodul im Kofferraum, nein = nicht, unk = unklar */&lt;br /&gt;
var RULES = [&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { current: [&amp;quot;werk&amp;quot;], module: [&amp;quot;ja&amp;quot;] }, items: [&amp;quot;exl005&amp;quot;, &amp;quot;fakra6m&amp;quot;] },&lt;br /&gt;
&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { current: [&amp;quot;nach&amp;quot;], module: [&amp;quot;ja&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;&amp;lt;b&amp;gt;Verlängerungen prüfen:&amp;lt;/b&amp;gt; Bei einem bereits verbauten Nachrüst-Radio sollten EXL005 und FAKRA-Verlängerung schon vorhanden sein. &amp;lt;b&amp;gt;Ungeeignet&amp;lt;/b&amp;gt; sind die Standard-„Quad-Lock-Verlängerung kombiniert mit Antennenverlängerung“ und die „EXL006“ (kein BUS-Signal).&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;ja&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;&amp;lt;b&amp;gt;Kabelwege:&amp;lt;/b&amp;gt; Die Technik sitzt im Kofferraum. Es müssen mindestens Kabel für Radioanschluss und FM-Antenne nach vorn verlegt werden. Optional zusätzlich: GPS (OEM-Antenne), Verlängerung für DAB+, Anschluss OEM-CD-Wechsler, Cinch für Subwoofer.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;nein&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;&amp;lt;b&amp;gt;Kabelwege:&amp;lt;/b&amp;gt; Alle Anschlüsse befinden sich direkt hinter dem Radio, es müssen &amp;lt;b&amp;gt;keine&amp;lt;/b&amp;gt; Kabel verlegt werden. Optional ggf. für: GPS (OEM-Antenne), DAB+, OEM-CD-Wechsler, Cinch für Subwoofer.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;unk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;&amp;lt;b&amp;gt;Bitte prüfen:&amp;lt;/b&amp;gt; Schau nach, ob im Kofferraum ein Radiomodul sitzt. Manche E46 mit Pfeilnavi (vermutlich Vorfacelift) haben das Radio hinten und benötigen dann EXL005 + FAKRA-Verlängerung.&amp;quot; },&lt;br /&gt;
&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { ant: [&amp;quot;iso&amp;quot;] }, items: [&amp;quot;isoada&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { ant: [&amp;quot;unk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;&amp;lt;b&amp;gt;Antennenstecker:&amp;lt;/b&amp;gt; Hat Dein Fahrzeug einen ISO-Antennenstecker, brauchst Du zusätzlich den &amp;lt;a href='https://shop.ibus-app.de/shop/zubehoer/adapterkabel/193/adapter-kabel-iso-f-auf-fakra-f-kurz-gewinkelt-15cm'&amp;gt;Adapter ISO auf FAKRA&amp;lt;/a&amp;gt;. Bei FAKRA ist kein Adapter nötig.&amp;quot; },&lt;br /&gt;
&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { sound: [&amp;quot;dsp&amp;quot;] }, items: [&amp;quot;dsplic&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { sound: [&amp;quot;dsp&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;&amp;lt;b&amp;gt;DSP:&amp;lt;/b&amp;gt; Damit das Werks-DSP überhaupt arbeitet, wird die I-BUS App mit DSP-Lizenz benötigt.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { sound: [&amp;quot;hk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;&amp;lt;b&amp;gt;Harman Kardon:&amp;lt;/b&amp;gt; Benötigt &amp;lt;b&amp;gt;keine&amp;lt;/b&amp;gt; DSP-Lizenz. Das Remote-Signal (+12 V, wenn Radio an) genügt zum Starten.&amp;quot; },&lt;br /&gt;
&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;E38&amp;quot;, &amp;quot;E53&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;&amp;lt;b&amp;gt;Montage:&amp;lt;/b&amp;gt; Radios für BMW E38/E53 benötigen keine extra Halterungen.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;E39&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;&amp;lt;b&amp;gt;Montage:&amp;lt;/b&amp;gt; Bei Radios, die nicht von AVIN stammen, empfehlen wir einen Halter (siehe Zusatzoptionen) oder das Bearbeiten der beiliegenden Montagewinkel. Anleitungen: &amp;lt;a href='https://xtrons.ibus-app.de/index.php?title=Montageanleitungen'&amp;gt;Montageanleitungen&amp;lt;/a&amp;gt;.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;E46&amp;quot;], factory: [&amp;quot;iris&amp;quot;, &amp;quot;mid&amp;quot;, &amp;quot;pfeil&amp;quot;], current: [&amp;quot;werk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;&amp;lt;b&amp;gt;Montage E46 ohne großes Navi:&amp;lt;/b&amp;gt; Das Klimabedienteil muss nach unten versetzt werden. Dafür brauchst Du den passenden &amp;lt;b&amp;gt;Funktionsträger&amp;lt;/b&amp;gt; (neu ca. 100 €, ggf. beim Teileverwerter günstiger):&amp;lt;br&amp;gt;&amp;quot; +&lt;br /&gt;
          &amp;quot;Einzelschalter (eher VFL): &amp;lt;a href='https://www.leebmann24.de/trager-3er-51168202186.html'&amp;gt;ohne Raucher 51168202186&amp;lt;/a&amp;gt; / &amp;lt;a href='https://www.leebmann24.de/trager-3er-51168230902.html'&amp;gt;mit Raucher 51168230902&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&amp;quot; +&lt;br /&gt;
          &amp;quot;Schaltzentrum (eher FL): &amp;lt;a href='https://www.leebmann24.de/funktionstrager-schaltzentrum-3er-51167001408.html'&amp;gt;ohne Raucher 51167001408&amp;lt;/a&amp;gt; / &amp;lt;a href='https://www.leebmann24.de/funktionstrager-schaltzentrum-3er-51167001410.html'&amp;gt;mit Raucher 51167001410&amp;lt;/a&amp;gt;&amp;quot; },&lt;br /&gt;
&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, opts: [&amp;quot;ibus&amp;quot;], when: {},&lt;br /&gt;
    html: &amp;quot;&amp;lt;b&amp;gt;I-BUS App:&amp;lt;/b&amp;gt; Siehe &amp;lt;a href='https://wiki.ibus-app.de/index.php?title=Was_brauche_ich_um_die_I-BUS_App_nutzen_zu_k%C3%B6nnen%3F'&amp;gt;Was brauche ich, um die I-BUS App nutzen zu können?&amp;lt;/a&amp;gt; und die &amp;lt;a href='https://wiki.ibus-app.de/index.php?title=Einbauanleitung_f%C3%BCr_Resler_Modul_und_Resler_Interface'&amp;gt;Einbauanleitung für Resler Modul und Interface&amp;lt;/a&amp;gt;.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: {}, opts: [],&lt;br /&gt;
    html: &amp;quot;&amp;lt;b&amp;gt;Wichtig:&amp;lt;/b&amp;gt; Bitte immer die Anschlüsse am eigenen Radio abgleichen. Welches Radio passt? → &amp;lt;a href='https://xtrons.ibus-app.de/index.php?title=Entscheidungshilfe%3A_AVIN_oder_XTRONS%3F'&amp;gt;Entscheidungshilfe AVIN oder XTRONS&amp;lt;/a&amp;gt;, Kosten → &amp;lt;a href='https://xtrons.ibus-app.de/index.php?title=Grobe_Kosten%C3%BCbersicht'&amp;gt;Grobe Kostenübersicht&amp;lt;/a&amp;gt;.&amp;quot; }&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
/* =====================================================================&lt;br /&gt;
   PROGRAMMLOGIK&lt;br /&gt;
   ===================================================================== */&lt;br /&gt;
var $ = function (id) { return document.getElementById(id); };&lt;br /&gt;
var sel = {}, picked = {};&lt;br /&gt;
var fieldsEl = $(&amp;quot;nvk-fields&amp;quot;), optsEl = $(&amp;quot;nvk-opts&amp;quot;), outEl = $(&amp;quot;nvk-out&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
function match(cond, s, lenient) {&lt;br /&gt;
  if (!cond) return true;&lt;br /&gt;
  for (var k in cond) {&lt;br /&gt;
    if (!s[k]) { if (lenient) continue; return false; }&lt;br /&gt;
    if (cond[k].indexOf(s[k]) &amp;lt; 0) return false;&lt;br /&gt;
  }&lt;br /&gt;
  return true;&lt;br /&gt;
}&lt;br /&gt;
function derive() {&lt;br /&gt;
  var s = {}, k;&lt;br /&gt;
  for (k in sel) s[k] = sel[k];&lt;br /&gt;
  if (s.factory === &amp;quot;n43&amp;quot; || s.factory === &amp;quot;n169&amp;quot;) s.module = &amp;quot;ja&amp;quot;;&lt;br /&gt;
  else if (s.factory === &amp;quot;iris&amp;quot; || s.factory === &amp;quot;mid&amp;quot;) s.module = &amp;quot;nein&amp;quot;;&lt;br /&gt;
  else if (s.factory === &amp;quot;pfeil&amp;quot;) s.module = s.trunk || &amp;quot;unk&amp;quot;;&lt;br /&gt;
  return s;&lt;br /&gt;
}&lt;br /&gt;
function forced(s) {&lt;br /&gt;
  var f = {};&lt;br /&gt;
  FORCED.forEach(function (r) { if (match(r.when, s)) r.opts.forEach(function (o) { f[o] = r.why; }); });&lt;br /&gt;
  return f;&lt;br /&gt;
}&lt;br /&gt;
function onSet(s) {&lt;br /&gt;
  var f = forced(s), on = {}, k;&lt;br /&gt;
  for (k in picked) if (picked[k]) on[k] = true;&lt;br /&gt;
  for (k in f) on[k] = true;&lt;br /&gt;
  return { on: on, forced: f };&lt;br /&gt;
}&lt;br /&gt;
function optVisible(o, s, on) {&lt;br /&gt;
  if (!match(o.show, s, true)) return false;&lt;br /&gt;
  return (o.requires || []).every(function (r) { return on[r]; });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Felder aufbauen */&lt;br /&gt;
FIELDS.forEach(function (f) {&lt;br /&gt;
  var wrap = document.createElement(&amp;quot;div&amp;quot;); wrap.className = &amp;quot;nvk-f&amp;quot;; wrap.id = &amp;quot;nvk-w-&amp;quot; + f.id;&lt;br /&gt;
  var lab = document.createElement(&amp;quot;label&amp;quot;); lab.htmlFor = &amp;quot;nvk-&amp;quot; + f.id; lab.textContent = f.label;&lt;br /&gt;
  var s = document.createElement(&amp;quot;select&amp;quot;); s.id = &amp;quot;nvk-&amp;quot; + f.id;&lt;br /&gt;
  s.addEventListener(&amp;quot;change&amp;quot;, function () { sel[f.id] = s.value; update(); });&lt;br /&gt;
  wrap.appendChild(lab); wrap.appendChild(s); fieldsEl.appendChild(wrap);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
function renderFields() {&lt;br /&gt;
  var s = derive();&lt;br /&gt;
  FIELDS.forEach(function (f) {&lt;br /&gt;
    var wrap = $(&amp;quot;nvk-w-&amp;quot; + f.id), el = $(&amp;quot;nvk-&amp;quot; + f.id);&lt;br /&gt;
    var vis = match(f.show, s, false) || !f.show;&lt;br /&gt;
    wrap.style.display = vis ? &amp;quot;&amp;quot; : &amp;quot;none&amp;quot;;&lt;br /&gt;
    if (!vis) { sel[f.id] = &amp;quot;&amp;quot;; return; }&lt;br /&gt;
    var allowed = f.values.filter(function (v) { return match(v.only, s, true); });&lt;br /&gt;
    if (sel[f.id] &amp;amp;&amp;amp; !allowed.some(function (v) { return v.v === sel[f.id]; })) sel[f.id] = &amp;quot;&amp;quot;;&lt;br /&gt;
    if (!sel[f.id] &amp;amp;&amp;amp; f.def) sel[f.id] = f.def;&lt;br /&gt;
    el.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
    if (!f.def) { var p = document.createElement(&amp;quot;option&amp;quot;); p.value = &amp;quot;&amp;quot;; p.textContent = &amp;quot;– bitte wählen –&amp;quot;; el.appendChild(p); }&lt;br /&gt;
    allowed.forEach(function (v) {&lt;br /&gt;
      var o = document.createElement(&amp;quot;option&amp;quot;); o.value = v.v; o.textContent = v.t; el.appendChild(o);&lt;br /&gt;
    });&lt;br /&gt;
    el.value = sel[f.id] || &amp;quot;&amp;quot;;&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function renderOpts() {&lt;br /&gt;
  var s = derive(), st = onSet(s);&lt;br /&gt;
  /* Gruppen-Ausschluss &amp;amp; nicht mehr sichtbare Optionen bereinigen */&lt;br /&gt;
  OPTS.forEach(function (o) { if (!optVisible(o, s, st.on)) picked[o.id] = false; });&lt;br /&gt;
  st = onSet(s);&lt;br /&gt;
  optsEl.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
  OPTS.forEach(function (o) {&lt;br /&gt;
    if (!optVisible(o, s, st.on)) return;&lt;br /&gt;
    var lab = document.createElement(&amp;quot;label&amp;quot;); lab.className = &amp;quot;nvk-o&amp;quot;;&lt;br /&gt;
    var cb = document.createElement(&amp;quot;input&amp;quot;); cb.type = &amp;quot;checkbox&amp;quot;;&lt;br /&gt;
    cb.checked = !!st.on[o.id];&lt;br /&gt;
    var isForced = !!st.forced[o.id];&lt;br /&gt;
    if (isForced) { cb.disabled = true; lab.className += &amp;quot; dis&amp;quot;; }&lt;br /&gt;
    cb.addEventListener(&amp;quot;change&amp;quot;, function () {&lt;br /&gt;
      picked[o.id] = cb.checked;&lt;br /&gt;
      if (cb.checked &amp;amp;&amp;amp; o.excl) OPTS.forEach(function (x) { if (x.excl === o.excl &amp;amp;&amp;amp; x.id !== o.id) picked[x.id] = false; });&lt;br /&gt;
      update();&lt;br /&gt;
    });&lt;br /&gt;
    lab.appendChild(cb);&lt;br /&gt;
    var txt = &amp;quot; &amp;quot; + o.t;&lt;br /&gt;
    lab.appendChild(document.createTextNode(txt));&lt;br /&gt;
    var sub = [o.sub, isForced ? st.forced[o.id] : &amp;quot;&amp;quot;].filter(Boolean).join(&amp;quot; – &amp;quot;);&lt;br /&gt;
    if (sub) { var sm = document.createElement(&amp;quot;small&amp;quot;); sm.textContent = &amp;quot; (&amp;quot; + sub + &amp;quot;)&amp;quot;; lab.appendChild(sm); }&lt;br /&gt;
    optsEl.appendChild(lab);&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function card(item, cls) {&lt;br /&gt;
  var d = document.createElement(&amp;quot;div&amp;quot;); d.className = &amp;quot;nvk-card &amp;quot; + (cls || &amp;quot;&amp;quot;);&lt;br /&gt;
  var b = document.createElement(&amp;quot;b&amp;quot;); b.textContent = item.t; d.appendChild(b);&lt;br /&gt;
  if (item.d) { var p = document.createElement(&amp;quot;span&amp;quot;); p.textContent = item.d; d.appendChild(p); }&lt;br /&gt;
  if (item.u) {&lt;br /&gt;
    var a = document.createElement(&amp;quot;a&amp;quot;); a.className = &amp;quot;nvk-shop&amp;quot;; a.href = item.u; a.target = &amp;quot;_blank&amp;quot;; a.rel = &amp;quot;noopener&amp;quot;;&lt;br /&gt;
    a.textContent = &amp;quot;Im Shop ansehen →&amp;quot;; d.appendChild(a);&lt;br /&gt;
  }&lt;br /&gt;
  return d;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function renderResult() {&lt;br /&gt;
  var s = derive(), st = onSet(s);&lt;br /&gt;
  var required = [&amp;quot;vehicle&amp;quot;, &amp;quot;factory&amp;quot;, &amp;quot;sound&amp;quot;, &amp;quot;current&amp;quot;, &amp;quot;body&amp;quot;];&lt;br /&gt;
  var names = { vehicle: &amp;quot;Fahrzeug&amp;quot;, factory: &amp;quot;Verbaut ab Werk&amp;quot;, sound: &amp;quot;Soundsystem&amp;quot;, current: &amp;quot;Aktuell verbaut&amp;quot;, body: &amp;quot;Karosserie&amp;quot; };&lt;br /&gt;
  var missing = required.filter(function (k) { return !sel[k]; });&lt;br /&gt;
  outEl.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
  if (missing.length) {&lt;br /&gt;
    var m = document.createElement(&amp;quot;p&amp;quot;); m.className = &amp;quot;nvk-miss&amp;quot;;&lt;br /&gt;
    m.textContent = &amp;quot;Bitte noch auswählen: &amp;quot; + missing.map(function (k) { return names[k]; }).join(&amp;quot;, &amp;quot;);&lt;br /&gt;
    outEl.appendChild(m); return;&lt;br /&gt;
  }&lt;br /&gt;
  var needs = [], hints = [], seen = {};&lt;br /&gt;
  RULES.forEach(function (r) {&lt;br /&gt;
    if (!match(r.when, s)) return;&lt;br /&gt;
    if (r.opts &amp;amp;&amp;amp; !r.opts.every(function (o) { return st.on[o]; })) return;&lt;br /&gt;
    if (r.type === &amp;quot;need&amp;quot;) (r.items || []).forEach(function (id) { if (!seen[id]) { seen[id] = 1; needs.push(ITEMS[id]); } });&lt;br /&gt;
    else hints.push(r.html);&lt;br /&gt;
  });&lt;br /&gt;
  var h = document.createElement(&amp;quot;h3&amp;quot;); h.textContent = &amp;quot;Das brauchst Du&amp;quot;; outEl.appendChild(h);&lt;br /&gt;
  if (needs.length) needs.forEach(function (i) { outEl.appendChild(card(i)); });&lt;br /&gt;
  else { var n = document.createElement(&amp;quot;p&amp;quot;); n.textContent = &amp;quot;Für die Grundinstallation sind keine zusätzlichen Verlängerungen oder Adapter nötig.&amp;quot;; outEl.appendChild(n); }&lt;br /&gt;
&lt;br /&gt;
  var opt = [];&lt;br /&gt;
  OPTS.forEach(function (o) { if (st.on[o.id] &amp;amp;&amp;amp; optVisible(o, s, st.on) &amp;amp;&amp;amp; !seen[o.item]) opt.push(ITEMS[o.item]); });&lt;br /&gt;
  if (opt.length) {&lt;br /&gt;
    var h2 = document.createElement(&amp;quot;h3&amp;quot;); h2.textContent = &amp;quot;Deine Zusatzoptionen&amp;quot;; outEl.appendChild(h2);&lt;br /&gt;
    opt.forEach(function (i) { outEl.appendChild(card(i, &amp;quot;opt&amp;quot;)); });&lt;br /&gt;
  }&lt;br /&gt;
  if (hints.length) {&lt;br /&gt;
    var h3 = document.createElement(&amp;quot;h3&amp;quot;); h3.textContent = &amp;quot;Hinweise&amp;quot;; outEl.appendChild(h3);&lt;br /&gt;
    hints.forEach(function (t) { var d = document.createElement(&amp;quot;div&amp;quot;); d.className = &amp;quot;nvk-note&amp;quot;; d.innerHTML = t; outEl.appendChild(d); });&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function update() { renderFields(); renderOpts(); renderResult(); }&lt;br /&gt;
$(&amp;quot;nvk-reset&amp;quot;).addEventListener(&amp;quot;click&amp;quot;, function () { sel = {}; picked = {}; update(); });&lt;br /&gt;
update();&lt;br /&gt;
})();&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andre</name></author>
	</entry>
	<entry>
		<id>https://xtrons.ibus-app.de/index.php?title=Android_Radio_Konfigurator&amp;diff=4068</id>
		<title>Android Radio Konfigurator</title>
		<link rel="alternate" type="text/html" href="https://xtrons.ibus-app.de/index.php?title=Android_Radio_Konfigurator&amp;diff=4068"/>
		<updated>2026-10-21T07:51:59Z</updated>

		<summary type="html">&lt;p&gt;Andre: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;html&amp;gt;&amp;lt;div id=&amp;quot;nvk&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
#nvk{max-width:900px;line-height:1.45}&lt;br /&gt;
#nvk *{box-sizing:border-box}&lt;br /&gt;
#nvk .nvk-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:14px;margin:12px 0}&lt;br /&gt;
#nvk .nvk-f label,#nvk .nvk-h{display:block;font-weight:700;margin-bottom:4px}&lt;br /&gt;
#nvk select{width:100%;padding:9px 8px;font:inherit;color:#202122;background:#fff;border:1px solid #a2a9b1;border-radius:4px}&lt;br /&gt;
#nvk fieldset{border:1px solid rgba(128,128,128,.45);border-radius:6px;padding:10px 14px;margin:14px 0}&lt;br /&gt;
#nvk legend{font-weight:700;padding:0 6px}&lt;br /&gt;
#nvk .nvk-o{display:block;padding:4px 0;cursor:pointer}&lt;br /&gt;
#nvk .nvk-o small{opacity:.7}&lt;br /&gt;
#nvk .nvk-o.dis{opacity:.75;cursor:default}&lt;br /&gt;
#nvk .nvk-btn{padding:7px 14px;font:inherit;border:1px solid #a2a9b1;border-radius:4px;background:#f8f9fa;color:#202122;cursor:pointer}&lt;br /&gt;
#nvk #nvk-out{margin-top:18px}&lt;br /&gt;
#nvk h3{margin:18px 0 8px}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-card.opt{border-left-color:#14866d}&lt;br /&gt;
#nvk .nvk-card b{display:block}&lt;br /&gt;
#nvk .nvk-card a.nvk-shop{display:inline-block;margin-top:4px;font-weight:600}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-miss{opacity:.8;font-style:italic}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-grid&amp;quot; id=&amp;quot;nvk-fields&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;fieldset id=&amp;quot;nvk-optset&amp;quot;&amp;gt;&amp;lt;legend&amp;gt;Zusatzoptionen&amp;lt;/legend&amp;gt;&amp;lt;div id=&amp;quot;nvk-opts&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/fieldset&amp;gt;&lt;br /&gt;
&amp;lt;button type=&amp;quot;button&amp;quot; class=&amp;quot;nvk-btn&amp;quot; id=&amp;quot;nvk-reset&amp;quot;&amp;gt;Auswahl zurücksetzen&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk-out&amp;quot; aria-live=&amp;quot;polite&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;noscript&amp;gt;Für den Konfigurator wird JavaScript benötigt.&amp;lt;/noscript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
(function () {&lt;br /&gt;
&amp;quot;use strict&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
/* =====================================================================&lt;br /&gt;
   KONFIGURATION – hier wird gepflegt. Kein weiterer Code nötig.&lt;br /&gt;
   ===================================================================== */&lt;br /&gt;
&lt;br /&gt;
/* ---- 1) Auswahlfelder -------------------------------------------------&lt;br /&gt;
   v = interner Wert, t = Anzeigetext,&lt;br /&gt;
   only = Wert nur anbieten, wenn Bedingung passt (z. B. nur bestimmte Fahrzeuge)&lt;br /&gt;
   show = ganzes Feld nur zeigen, wenn Bedingung passt                      */&lt;br /&gt;
var FIELDS = [&lt;br /&gt;
  { id: &amp;quot;vehicle&amp;quot;, label: &amp;quot;Fahrzeug&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;E38&amp;quot;, t: &amp;quot;BMW E38&amp;quot; }, { v: &amp;quot;E39&amp;quot;, t: &amp;quot;BMW E39&amp;quot; }, { v: &amp;quot;E46&amp;quot;, t: &amp;quot;BMW E46&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;E53&amp;quot;, t: &amp;quot;BMW E53&amp;quot; }, { v: &amp;quot;E83&amp;quot;, t: &amp;quot;BMW E83&amp;quot; } ] },&lt;br /&gt;
&lt;br /&gt;
  { id: &amp;quot;factory&amp;quot;, label: &amp;quot;Verbaut ab Werk&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;iris&amp;quot;,  t: &amp;quot;Radio mit IRIS&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;mid&amp;quot;,   t: &amp;quot;Radio mit MID&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;n43&amp;quot;,   t: &amp;quot;4:3 Navi&amp;quot;,  only: { vehicle: [&amp;quot;E38&amp;quot;, &amp;quot;E39&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;n169&amp;quot;,  t: &amp;quot;16:9 Navi&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;pfeil&amp;quot;, t: &amp;quot;Pfeilnavi&amp;quot;, only: { vehicle: [&amp;quot;E46&amp;quot;] } } ] },&lt;br /&gt;
&lt;br /&gt;
  { id: &amp;quot;trunk&amp;quot;, label: &amp;quot;Befindet sich im Kofferraum ein Radiomodul?&amp;quot;,&lt;br /&gt;
    show: { factory: [&amp;quot;pfeil&amp;quot;] }, values: [&lt;br /&gt;
    { v: &amp;quot;ja&amp;quot;, t: &amp;quot;Ja, Radio-/Navimodul im Kofferraum&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;nein&amp;quot;, t: &amp;quot;Nein, Anschlüsse nur hinter dem Radio&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;unk&amp;quot;, t: &amp;quot;Weiß ich nicht&amp;quot; } ] },&lt;br /&gt;
&lt;br /&gt;
  { id: &amp;quot;sound&amp;quot;, label: &amp;quot;Soundsystem&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;stereo&amp;quot;, t: &amp;quot;Stereo&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;hifi&amp;quot;,   t: &amp;quot;Hifi&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;dsp&amp;quot;,    t: &amp;quot;DSP&amp;quot;,          only: { vehicle: [&amp;quot;E38&amp;quot;, &amp;quot;E39&amp;quot;, &amp;quot;E53&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;hk&amp;quot;,     t: &amp;quot;Harman Kardon&amp;quot;, only: { vehicle: [&amp;quot;E46&amp;quot;, &amp;quot;E83&amp;quot;] } } ] },&lt;br /&gt;
&lt;br /&gt;
  { id: &amp;quot;current&amp;quot;, label: &amp;quot;Aktuell verbaut&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;werk&amp;quot;, t: &amp;quot;Werksradio / Werksnavi&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;nach&amp;quot;, t: &amp;quot;Nachrüst-Radio / -Navi&amp;quot; } ] },&lt;br /&gt;
&lt;br /&gt;
  { id: &amp;quot;body&amp;quot;, label: &amp;quot;Karosserie&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;limo&amp;quot;,    t: &amp;quot;Limousine&amp;quot;, only: { vehicle: [&amp;quot;E38&amp;quot;, &amp;quot;E39&amp;quot;, &amp;quot;E46&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;touring&amp;quot;, t: &amp;quot;Touring&amp;quot;,   only: { vehicle: [&amp;quot;E39&amp;quot;, &amp;quot;E46&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;coupe&amp;quot;,   t: &amp;quot;Coupé&amp;quot;,     only: { vehicle: [&amp;quot;E46&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;cabrio&amp;quot;,  t: &amp;quot;Cabrio&amp;quot;,    only: { vehicle: [&amp;quot;E46&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;suv&amp;quot;,     t: &amp;quot;SUV&amp;quot;,       only: { vehicle: [&amp;quot;E53&amp;quot;, &amp;quot;E83&amp;quot;] } } ] },&lt;br /&gt;
&lt;br /&gt;
  { id: &amp;quot;ant&amp;quot;, label: &amp;quot;Antennenstecker am Radio (optional)&amp;quot;, optional: true, def: &amp;quot;unk&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;unk&amp;quot;,   t: &amp;quot;Weiß ich nicht&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;iso&amp;quot;,   t: &amp;quot;ISO (rund, „BM24“)&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;fakra&amp;quot;, t: &amp;quot;FAKRA (eckig, „BM54“)&amp;quot; } ] }&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
/* ---- 2) Zusatzoptionen (Mehrfachauswahl) -----------------------------&lt;br /&gt;
   show     = Option nur sichtbar, wenn Bedingung passt&lt;br /&gt;
   requires = Option nur sichtbar, wenn diese anderen Optionen gewählt sind&lt;br /&gt;
   excl     = Optionen mit gleicher excl-Gruppe schließen sich gegenseitig aus&lt;br /&gt;
   item     = Eintrag in ITEMS, der in der Liste erscheint                  */&lt;br /&gt;
var OPTS = [&lt;br /&gt;
  { id: &amp;quot;halter&amp;quot;,  t: &amp;quot;Radio-Halter&amp;quot;, sub: &amp;quot;nur BMW E39&amp;quot;, show: { vehicle: [&amp;quot;E39&amp;quot;] }, item: &amp;quot;halter&amp;quot; },&lt;br /&gt;
  { id: &amp;quot;ibus&amp;quot;,    t: &amp;quot;I-BUS App&amp;quot;, item: &amp;quot;ibus&amp;quot; },&lt;br /&gt;
  { id: &amp;quot;deepobd&amp;quot;, t: &amp;quot;DeepOBD (Diagnose)&amp;quot;, item: &amp;quot;deepobd&amp;quot; },&lt;br /&gt;
  { id: &amp;quot;can&amp;quot;,     t: &amp;quot;CAN Interface&amp;quot;, sub: &amp;quot;Addon – nur mit I-BUS App&amp;quot;, requires: [&amp;quot;ibus&amp;quot;], item: &amp;quot;can&amp;quot; },&lt;br /&gt;
  { id: &amp;quot;tpms&amp;quot;,    t: &amp;quot;TPMS (Reifendruck)&amp;quot;, item: &amp;quot;tpms&amp;quot; },&lt;br /&gt;
  { id: &amp;quot;dab1&amp;quot;,    t: &amp;quot;DAB+ (Single Receiver)&amp;quot;, excl: &amp;quot;dab&amp;quot;, item: &amp;quot;dab1&amp;quot; },&lt;br /&gt;
  { id: &amp;quot;dab2&amp;quot;,    t: &amp;quot;DAB+ (Dual Receiver)&amp;quot;,   excl: &amp;quot;dab&amp;quot;, item: &amp;quot;dab2&amp;quot; },&lt;br /&gt;
  { id: &amp;quot;rcam&amp;quot;,    t: &amp;quot;Rückfahrkamera&amp;quot;, item: &amp;quot;rcam&amp;quot; },&lt;br /&gt;
  { id: &amp;quot;fcam&amp;quot;,    t: &amp;quot;Front-Kamera&amp;quot;, item: &amp;quot;fcam&amp;quot; },&lt;br /&gt;
  { id: &amp;quot;tool&amp;quot;,    t: &amp;quot;Einbau-Werkzeug (Kunststoffheber)&amp;quot;, item: &amp;quot;tool&amp;quot; }&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
/* Wird eine Option durch eine Auswahl erzwungen, wird sie automatisch gesetzt. */&lt;br /&gt;
var FORCED = [&lt;br /&gt;
  { when: { sound: [&amp;quot;dsp&amp;quot;] }, opts: [&amp;quot;ibus&amp;quot;], why: &amp;quot;wegen DSP erforderlich&amp;quot; }&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
/* ---- 3) Artikel/Produkte ---------------------------------------------&lt;br /&gt;
   u = Link in den Shop (leer lassen = Eintrag ohne Link)                  */&lt;br /&gt;
var ITEMS = {&lt;br /&gt;
  exl005:  { t: &amp;quot;Verlängerung EXL005&amp;quot;, d: &amp;quot;Ersetzt das Radiomodul im Kofferraum (Bus-/Stromanschluss nach vorn).&amp;quot;,&lt;br /&gt;
             u: &amp;quot;https://shop.ibus-app.de/detail/index/sArticle/212/&amp;quot; },&lt;br /&gt;
  fakra6m: { t: &amp;quot;Verlängerung 6 m FAKRA(m) auf FAKRA(f), gewinkelt&amp;quot;, d: &amp;quot;Antennenverlängerung vom Kofferraum nach vorn.&amp;quot;,&lt;br /&gt;
             u: &amp;quot;https://shop.ibus-app.de/shop/zubehoer/adapterkabel/192/verlaengerung-6m-fakra-m-auf-fakra-f-kurz-gewinkelt&amp;quot; },&lt;br /&gt;
  isoada:  { t: &amp;quot;Adapter ISO-Stecker auf FAKRA, gewinkelt (15 cm)&amp;quot;, d: &amp;quot;Nötig, wenn das Fahrzeug einen ISO-Antennenstecker hat.&amp;quot;,&lt;br /&gt;
             u: &amp;quot;https://shop.ibus-app.de/shop/zubehoer/adapterkabel/193/adapter-kabel-iso-f-auf-fakra-f-kurz-gewinkelt-15cm&amp;quot; },&lt;br /&gt;
  dsplic:  { t: &amp;quot;DSP-Lizenz für die I-BUS App&amp;quot;, d: &amp;quot;Ohne diese Lizenz arbeitet das Werks-DSP nicht.&amp;quot;, u: &amp;quot;&amp;quot; },&lt;br /&gt;
  halter:  { t: &amp;quot;Halter zur Radio-Montage im BMW E39&amp;quot;, d: &amp;quot;Empfohlen bei Radios, die nicht von AVIN stammen.&amp;quot;,&lt;br /&gt;
             u: &amp;quot;https://shop.ibus-app.de/shop/zubehoer/182/halter-zur-radio-montage-im-bmw-e39&amp;quot; },&lt;br /&gt;
  ibus:    { t: &amp;quot;I-BUS App&amp;quot;, d: &amp;quot;Erhält Bordcomputer-Funktionen und steuert z. B. den Original-CD-Wechsler.&amp;quot;,&lt;br /&gt;
             u: &amp;quot;http://www.ibus-app.de&amp;quot; },&lt;br /&gt;
  deepobd: { t: &amp;quot;DeepOBD (Diagnose)&amp;quot;, d: &amp;quot;Live-Werte auslesen, Fehler lesen und löschen.&amp;quot;, u: &amp;quot;&amp;quot; },&lt;br /&gt;
  can:     { t: &amp;quot;CAN Interface (Addon zur I-BUS App)&amp;quot;, d: &amp;quot;Funktioniert nur zusammen mit der I-BUS App.&amp;quot;, u: &amp;quot;&amp;quot; },&lt;br /&gt;
  tpms:    { t: &amp;quot;TPMS – Reifendruckanzeige&amp;quot;, d: &amp;quot;&amp;quot;, u: &amp;quot;https://xtrons.co.uk/tyre-pressure-monitoring-system-tpms01&amp;quot; },&lt;br /&gt;
  dab1:    { t: &amp;quot;DAB+ Single Receiver&amp;quot;, d: &amp;quot;&amp;quot;, u: &amp;quot;https://xtrons.co.uk/dab-tuner-usbdab01&amp;quot; },&lt;br /&gt;
  dab2:    { t: &amp;quot;DAB+ Dual Receiver&amp;quot;, d: &amp;quot;&amp;quot;, u: &amp;quot;&amp;quot; },&lt;br /&gt;
  rcam:    { t: &amp;quot;Rückfahrkamera&amp;quot;, d: &amp;quot;&amp;quot;, u: &amp;quot;&amp;quot; },&lt;br /&gt;
  fcam:    { t: &amp;quot;Front-Kamera&amp;quot;, d: &amp;quot;&amp;quot;, u: &amp;quot;&amp;quot; },&lt;br /&gt;
  tool:    { t: &amp;quot;Einbau-Werkzeug (Kunststoffheber)&amp;quot;, d: &amp;quot;Zum schonenden Lösen der Verkleidungen.&amp;quot;, u: &amp;quot;&amp;quot; }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* ---- 4) Regeln --------------------------------------------------------&lt;br /&gt;
   type  = &amp;quot;need&amp;quot; (Das brauchst Du) | &amp;quot;hint&amp;quot; (Hinweise)&lt;br /&gt;
   when  = Bedingung auf die Auswahlfelder (alle Schlüssel müssen passen)&lt;br /&gt;
   opts  = (optional) diese Zusatzoptionen müssen gewählt sein&lt;br /&gt;
   items = Artikel aus ITEMS      html = Hinweistext (HTML erlaubt)&lt;br /&gt;
   Abgeleiteter Wert &amp;quot;module&amp;quot;: ja = Radiomodul im Kofferraum, nein = nicht, unk = unklar */&lt;br /&gt;
var RULES = [&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { current: [&amp;quot;werk&amp;quot;], module: [&amp;quot;ja&amp;quot;] }, items: [&amp;quot;exl005&amp;quot;, &amp;quot;fakra6m&amp;quot;] },&lt;br /&gt;
&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { current: [&amp;quot;nach&amp;quot;], module: [&amp;quot;ja&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;&amp;lt;b&amp;gt;Verlängerungen prüfen:&amp;lt;/b&amp;gt; Bei einem bereits verbauten Nachrüst-Radio sollten EXL005 und FAKRA-Verlängerung schon vorhanden sein. &amp;lt;b&amp;gt;Ungeeignet&amp;lt;/b&amp;gt; sind die Standard-„Quad-Lock-Verlängerung kombiniert mit Antennenverlängerung“ und die „EXL006“ (kein BUS-Signal).&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;ja&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;&amp;lt;b&amp;gt;Kabelwege:&amp;lt;/b&amp;gt; Die Technik sitzt im Kofferraum. Es müssen mindestens Kabel für Radioanschluss und FM-Antenne nach vorn verlegt werden. Optional zusätzlich: GPS (OEM-Antenne), Verlängerung für DAB+, Anschluss OEM-CD-Wechsler, Cinch für Subwoofer.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;nein&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;&amp;lt;b&amp;gt;Kabelwege:&amp;lt;/b&amp;gt; Alle Anschlüsse befinden sich direkt hinter dem Radio, es müssen &amp;lt;b&amp;gt;keine&amp;lt;/b&amp;gt; Kabel verlegt werden. Optional ggf. für: GPS (OEM-Antenne), DAB+, OEM-CD-Wechsler, Cinch für Subwoofer.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;unk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;&amp;lt;b&amp;gt;Bitte prüfen:&amp;lt;/b&amp;gt; Schau nach, ob im Kofferraum ein Radiomodul sitzt. Manche E46 mit Pfeilnavi (vermutlich Vorfacelift) haben das Radio hinten und benötigen dann EXL005 + FAKRA-Verlängerung.&amp;quot; },&lt;br /&gt;
&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { ant: [&amp;quot;iso&amp;quot;] }, items: [&amp;quot;isoada&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { ant: [&amp;quot;unk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;&amp;lt;b&amp;gt;Antennenstecker:&amp;lt;/b&amp;gt; Hat Dein Fahrzeug einen ISO-Antennenstecker, brauchst Du zusätzlich den &amp;lt;a href='https://shop.ibus-app.de/shop/zubehoer/adapterkabel/193/adapter-kabel-iso-f-auf-fakra-f-kurz-gewinkelt-15cm'&amp;gt;Adapter ISO auf FAKRA&amp;lt;/a&amp;gt;. Bei FAKRA ist kein Adapter nötig.&amp;quot; },&lt;br /&gt;
&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { sound: [&amp;quot;dsp&amp;quot;] }, items: [&amp;quot;dsplic&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { sound: [&amp;quot;dsp&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;&amp;lt;b&amp;gt;DSP:&amp;lt;/b&amp;gt; Damit das Werks-DSP überhaupt arbeitet, wird die I-BUS App mit DSP-Lizenz benötigt.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { sound: [&amp;quot;hk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;&amp;lt;b&amp;gt;Harman Kardon:&amp;lt;/b&amp;gt; Benötigt &amp;lt;b&amp;gt;keine&amp;lt;/b&amp;gt; DSP-Lizenz. Das Remote-Signal (+12 V, wenn Radio an) genügt zum Starten.&amp;quot; },&lt;br /&gt;
&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;E38&amp;quot;, &amp;quot;E53&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;&amp;lt;b&amp;gt;Montage:&amp;lt;/b&amp;gt; Radios für BMW E38/E53 benötigen keine extra Halterungen.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;E39&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;&amp;lt;b&amp;gt;Montage:&amp;lt;/b&amp;gt; Bei Radios, die nicht von AVIN stammen, empfehlen wir einen Halter (siehe Zusatzoptionen) oder das Bearbeiten der beiliegenden Montagewinkel. Anleitungen: &amp;lt;a href='https://xtrons.ibus-app.de/index.php?title=Montageanleitungen'&amp;gt;Montageanleitungen&amp;lt;/a&amp;gt;.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;E46&amp;quot;], factory: [&amp;quot;iris&amp;quot;, &amp;quot;mid&amp;quot;, &amp;quot;pfeil&amp;quot;], current: [&amp;quot;werk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;&amp;lt;b&amp;gt;Montage E46 ohne großes Navi:&amp;lt;/b&amp;gt; Das Klimabedienteil muss nach unten versetzt werden. Dafür brauchst Du den passenden &amp;lt;b&amp;gt;Funktionsträger&amp;lt;/b&amp;gt; (neu ca. 100 €, ggf. beim Teileverwerter günstiger):&amp;lt;br&amp;gt;&amp;quot; +&lt;br /&gt;
          &amp;quot;Einzelschalter (eher VFL): &amp;lt;a href='https://www.leebmann24.de/trager-3er-51168202186.html'&amp;gt;ohne Raucher 51168202186&amp;lt;/a&amp;gt; / &amp;lt;a href='https://www.leebmann24.de/trager-3er-51168230902.html'&amp;gt;mit Raucher 51168230902&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&amp;quot; +&lt;br /&gt;
          &amp;quot;Schaltzentrum (eher FL): &amp;lt;a href='https://www.leebmann24.de/funktionstrager-schaltzentrum-3er-51167001408.html'&amp;gt;ohne Raucher 51167001408&amp;lt;/a&amp;gt; / &amp;lt;a href='https://www.leebmann24.de/funktionstrager-schaltzentrum-3er-51167001410.html'&amp;gt;mit Raucher 51167001410&amp;lt;/a&amp;gt;&amp;quot; },&lt;br /&gt;
&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, opts: [&amp;quot;ibus&amp;quot;], when: {},&lt;br /&gt;
    html: &amp;quot;&amp;lt;b&amp;gt;I-BUS App:&amp;lt;/b&amp;gt; Siehe &amp;lt;a href='https://wiki.ibus-app.de/index.php?title=Was_brauche_ich_um_die_I-BUS_App_nutzen_zu_k%C3%B6nnen%3F'&amp;gt;Was brauche ich, um die I-BUS App nutzen zu können?&amp;lt;/a&amp;gt; und die &amp;lt;a href='https://wiki.ibus-app.de/index.php?title=Einbauanleitung_f%C3%BCr_Resler_Modul_und_Resler_Interface'&amp;gt;Einbauanleitung für Resler Modul und Interface&amp;lt;/a&amp;gt;.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: {}, opts: [],&lt;br /&gt;
    html: &amp;quot;&amp;lt;b&amp;gt;Wichtig:&amp;lt;/b&amp;gt; Bitte immer die Anschlüsse am eigenen Radio abgleichen. Welches Radio passt? → &amp;lt;a href='https://xtrons.ibus-app.de/index.php?title=Entscheidungshilfe%3A_AVIN_oder_XTRONS%3F'&amp;gt;Entscheidungshilfe AVIN oder XTRONS&amp;lt;/a&amp;gt;, Kosten → &amp;lt;a href='https://xtrons.ibus-app.de/index.php?title=Grobe_Kosten%C3%BCbersicht'&amp;gt;Grobe Kostenübersicht&amp;lt;/a&amp;gt;.&amp;quot; }&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
/* =====================================================================&lt;br /&gt;
   PROGRAMMLOGIK&lt;br /&gt;
   ===================================================================== */&lt;br /&gt;
var $ = function (id) { return document.getElementById(id); };&lt;br /&gt;
var sel = {}, picked = {};&lt;br /&gt;
var fieldsEl = $(&amp;quot;nvk-fields&amp;quot;), optsEl = $(&amp;quot;nvk-opts&amp;quot;), outEl = $(&amp;quot;nvk-out&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
function match(cond, s, lenient) {&lt;br /&gt;
  if (!cond) return true;&lt;br /&gt;
  for (var k in cond) {&lt;br /&gt;
    if (!s[k]) { if (lenient) continue; return false; }&lt;br /&gt;
    if (cond[k].indexOf(s[k]) &amp;lt; 0) return false;&lt;br /&gt;
  }&lt;br /&gt;
  return true;&lt;br /&gt;
}&lt;br /&gt;
function derive() {&lt;br /&gt;
  var s = {}, k;&lt;br /&gt;
  for (k in sel) s[k] = sel[k];&lt;br /&gt;
  if (s.factory === &amp;quot;n43&amp;quot; || s.factory === &amp;quot;n169&amp;quot;) s.module = &amp;quot;ja&amp;quot;;&lt;br /&gt;
  else if (s.factory === &amp;quot;iris&amp;quot; || s.factory === &amp;quot;mid&amp;quot;) s.module = &amp;quot;nein&amp;quot;;&lt;br /&gt;
  else if (s.factory === &amp;quot;pfeil&amp;quot;) s.module = s.trunk || &amp;quot;unk&amp;quot;;&lt;br /&gt;
  return s;&lt;br /&gt;
}&lt;br /&gt;
function forced(s) {&lt;br /&gt;
  var f = {};&lt;br /&gt;
  FORCED.forEach(function (r) { if (match(r.when, s)) r.opts.forEach(function (o) { f[o] = r.why; }); });&lt;br /&gt;
  return f;&lt;br /&gt;
}&lt;br /&gt;
function onSet(s) {&lt;br /&gt;
  var f = forced(s), on = {}, k;&lt;br /&gt;
  for (k in picked) if (picked[k]) on[k] = true;&lt;br /&gt;
  for (k in f) on[k] = true;&lt;br /&gt;
  return { on: on, forced: f };&lt;br /&gt;
}&lt;br /&gt;
function optVisible(o, s, on) {&lt;br /&gt;
  if (!match(o.show, s, true)) return false;&lt;br /&gt;
  return (o.requires || []).every(function (r) { return on[r]; });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Felder aufbauen */&lt;br /&gt;
FIELDS.forEach(function (f) {&lt;br /&gt;
  var wrap = document.createElement(&amp;quot;div&amp;quot;); wrap.className = &amp;quot;nvk-f&amp;quot;; wrap.id = &amp;quot;nvk-w-&amp;quot; + f.id;&lt;br /&gt;
  var lab = document.createElement(&amp;quot;label&amp;quot;); lab.htmlFor = &amp;quot;nvk-&amp;quot; + f.id; lab.textContent = f.label;&lt;br /&gt;
  var s = document.createElement(&amp;quot;select&amp;quot;); s.id = &amp;quot;nvk-&amp;quot; + f.id;&lt;br /&gt;
  s.addEventListener(&amp;quot;change&amp;quot;, function () { sel[f.id] = s.value; update(); });&lt;br /&gt;
  wrap.appendChild(lab); wrap.appendChild(s); fieldsEl.appendChild(wrap);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
function renderFields() {&lt;br /&gt;
  var s = derive();&lt;br /&gt;
  FIELDS.forEach(function (f) {&lt;br /&gt;
    var wrap = $(&amp;quot;nvk-w-&amp;quot; + f.id), el = $(&amp;quot;nvk-&amp;quot; + f.id);&lt;br /&gt;
    var vis = match(f.show, s, false) || !f.show;&lt;br /&gt;
    wrap.style.display = vis ? &amp;quot;&amp;quot; : &amp;quot;none&amp;quot;;&lt;br /&gt;
    if (!vis) { sel[f.id] = &amp;quot;&amp;quot;; return; }&lt;br /&gt;
    var allowed = f.values.filter(function (v) { return match(v.only, s, true); });&lt;br /&gt;
    if (sel[f.id] &amp;amp;&amp;amp; !allowed.some(function (v) { return v.v === sel[f.id]; })) sel[f.id] = &amp;quot;&amp;quot;;&lt;br /&gt;
    if (!sel[f.id] &amp;amp;&amp;amp; f.def) sel[f.id] = f.def;&lt;br /&gt;
    el.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
    if (!f.def) { var p = document.createElement(&amp;quot;option&amp;quot;); p.value = &amp;quot;&amp;quot;; p.textContent = &amp;quot;– bitte wählen –&amp;quot;; el.appendChild(p); }&lt;br /&gt;
    allowed.forEach(function (v) {&lt;br /&gt;
      var o = document.createElement(&amp;quot;option&amp;quot;); o.value = v.v; o.textContent = v.t; el.appendChild(o);&lt;br /&gt;
    });&lt;br /&gt;
    el.value = sel[f.id] || &amp;quot;&amp;quot;;&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function renderOpts() {&lt;br /&gt;
  var s = derive(), st = onSet(s);&lt;br /&gt;
  /* Gruppen-Ausschluss &amp;amp; nicht mehr sichtbare Optionen bereinigen */&lt;br /&gt;
  OPTS.forEach(function (o) { if (!optVisible(o, s, st.on)) picked[o.id] = false; });&lt;br /&gt;
  st = onSet(s);&lt;br /&gt;
  optsEl.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
  OPTS.forEach(function (o) {&lt;br /&gt;
    if (!optVisible(o, s, st.on)) return;&lt;br /&gt;
    var lab = document.createElement(&amp;quot;label&amp;quot;); lab.className = &amp;quot;nvk-o&amp;quot;;&lt;br /&gt;
    var cb = document.createElement(&amp;quot;input&amp;quot;); cb.type = &amp;quot;checkbox&amp;quot;;&lt;br /&gt;
    cb.checked = !!st.on[o.id];&lt;br /&gt;
    var isForced = !!st.forced[o.id];&lt;br /&gt;
    if (isForced) { cb.disabled = true; lab.className += &amp;quot; dis&amp;quot;; }&lt;br /&gt;
    cb.addEventListener(&amp;quot;change&amp;quot;, function () {&lt;br /&gt;
      picked[o.id] = cb.checked;&lt;br /&gt;
      if (cb.checked &amp;amp;&amp;amp; o.excl) OPTS.forEach(function (x) { if (x.excl === o.excl &amp;amp;&amp;amp; x.id !== o.id) picked[x.id] = false; });&lt;br /&gt;
      update();&lt;br /&gt;
    });&lt;br /&gt;
    lab.appendChild(cb);&lt;br /&gt;
    var txt = &amp;quot; &amp;quot; + o.t;&lt;br /&gt;
    lab.appendChild(document.createTextNode(txt));&lt;br /&gt;
    var sub = [o.sub, isForced ? st.forced[o.id] : &amp;quot;&amp;quot;].filter(Boolean).join(&amp;quot; – &amp;quot;);&lt;br /&gt;
    if (sub) { var sm = document.createElement(&amp;quot;small&amp;quot;); sm.textContent = &amp;quot; (&amp;quot; + sub + &amp;quot;)&amp;quot;; lab.appendChild(sm); }&lt;br /&gt;
    optsEl.appendChild(lab);&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function card(item, cls) {&lt;br /&gt;
  var d = document.createElement(&amp;quot;div&amp;quot;); d.className = &amp;quot;nvk-card &amp;quot; + (cls || &amp;quot;&amp;quot;);&lt;br /&gt;
  var b = document.createElement(&amp;quot;b&amp;quot;); b.textContent = item.t; d.appendChild(b);&lt;br /&gt;
  if (item.d) { var p = document.createElement(&amp;quot;span&amp;quot;); p.textContent = item.d; d.appendChild(p); }&lt;br /&gt;
  if (item.u) {&lt;br /&gt;
    var a = document.createElement(&amp;quot;a&amp;quot;); a.className = &amp;quot;nvk-shop&amp;quot;; a.href = item.u; a.target = &amp;quot;_blank&amp;quot;; a.rel = &amp;quot;noopener&amp;quot;;&lt;br /&gt;
    a.textContent = &amp;quot;Im Shop ansehen →&amp;quot;; d.appendChild(a);&lt;br /&gt;
  }&lt;br /&gt;
  return d;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function renderResult() {&lt;br /&gt;
  var s = derive(), st = onSet(s);&lt;br /&gt;
  var required = [&amp;quot;vehicle&amp;quot;, &amp;quot;factory&amp;quot;, &amp;quot;sound&amp;quot;, &amp;quot;current&amp;quot;, &amp;quot;body&amp;quot;];&lt;br /&gt;
  var names = { vehicle: &amp;quot;Fahrzeug&amp;quot;, factory: &amp;quot;Verbaut ab Werk&amp;quot;, sound: &amp;quot;Soundsystem&amp;quot;, current: &amp;quot;Aktuell verbaut&amp;quot;, body: &amp;quot;Karosserie&amp;quot; };&lt;br /&gt;
  var missing = required.filter(function (k) { return !sel[k]; });&lt;br /&gt;
  outEl.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
  if (missing.length) {&lt;br /&gt;
    var m = document.createElement(&amp;quot;p&amp;quot;); m.className = &amp;quot;nvk-miss&amp;quot;;&lt;br /&gt;
    m.textContent = &amp;quot;Bitte noch auswählen: &amp;quot; + missing.map(function (k) { return names[k]; }).join(&amp;quot;, &amp;quot;);&lt;br /&gt;
    outEl.appendChild(m); return;&lt;br /&gt;
  }&lt;br /&gt;
  var needs = [], hints = [], seen = {};&lt;br /&gt;
  RULES.forEach(function (r) {&lt;br /&gt;
    if (!match(r.when, s)) return;&lt;br /&gt;
    if (r.opts &amp;amp;&amp;amp; !r.opts.every(function (o) { return st.on[o]; })) return;&lt;br /&gt;
    if (r.type === &amp;quot;need&amp;quot;) (r.items || []).forEach(function (id) { if (!seen[id]) { seen[id] = 1; needs.push(ITEMS[id]); } });&lt;br /&gt;
    else hints.push(r.html);&lt;br /&gt;
  });&lt;br /&gt;
  var h = document.createElement(&amp;quot;h3&amp;quot;); h.textContent = &amp;quot;Das brauchst Du&amp;quot;; outEl.appendChild(h);&lt;br /&gt;
  if (needs.length) needs.forEach(function (i) { outEl.appendChild(card(i)); });&lt;br /&gt;
  else { var n = document.createElement(&amp;quot;p&amp;quot;); n.textContent = &amp;quot;Für die Grundinstallation sind keine zusätzlichen Verlängerungen oder Adapter nötig.&amp;quot;; outEl.appendChild(n); }&lt;br /&gt;
&lt;br /&gt;
  var opt = [];&lt;br /&gt;
  OPTS.forEach(function (o) { if (st.on[o.id] &amp;amp;&amp;amp; optVisible(o, s, st.on) &amp;amp;&amp;amp; !seen[o.item]) opt.push(ITEMS[o.item]); });&lt;br /&gt;
  if (opt.length) {&lt;br /&gt;
    var h2 = document.createElement(&amp;quot;h3&amp;quot;); h2.textContent = &amp;quot;Deine Zusatzoptionen&amp;quot;; outEl.appendChild(h2);&lt;br /&gt;
    opt.forEach(function (i) { outEl.appendChild(card(i, &amp;quot;opt&amp;quot;)); });&lt;br /&gt;
  }&lt;br /&gt;
  if (hints.length) {&lt;br /&gt;
    var h3 = document.createElement(&amp;quot;h3&amp;quot;); h3.textContent = &amp;quot;Hinweise&amp;quot;; outEl.appendChild(h3);&lt;br /&gt;
    hints.forEach(function (t) { var d = document.createElement(&amp;quot;div&amp;quot;); d.className = &amp;quot;nvk-note&amp;quot;; d.innerHTML = t; outEl.appendChild(d); });&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function update() { renderFields(); renderOpts(); renderResult(); }&lt;br /&gt;
$(&amp;quot;nvk-reset&amp;quot;).addEventListener(&amp;quot;click&amp;quot;, function () { sel = {}; picked = {}; update(); });&lt;br /&gt;
update();&lt;br /&gt;
})();&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andre</name></author>
	</entry>
	<entry>
		<id>https://xtrons.ibus-app.de/index.php?title=Android_Radio_Konfigurator&amp;diff=4067</id>
		<title>Android Radio Konfigurator</title>
		<link rel="alternate" type="text/html" href="https://xtrons.ibus-app.de/index.php?title=Android_Radio_Konfigurator&amp;diff=4067"/>
		<updated>2026-10-21T07:51:10Z</updated>

		<summary type="html">&lt;p&gt;Andre: Die Seite wurde neu angelegt: „&amp;lt;html&amp;gt; &amp;lt;div id=&amp;quot;nvk&amp;quot;&amp;gt; &amp;lt;style&amp;gt; #nvk{max-width:900px;line-height:1.45} #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-f label,#nvk .nvk-h{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 fieldset{border:1px solid rgba(128,128,12…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
#nvk{max-width:900px;line-height:1.45}&lt;br /&gt;
#nvk *{box-sizing:border-box}&lt;br /&gt;
#nvk .nvk-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:14px;margin:12px 0}&lt;br /&gt;
#nvk .nvk-f label,#nvk .nvk-h{display:block;font-weight:700;margin-bottom:4px}&lt;br /&gt;
#nvk select{width:100%;padding:9px 8px;font:inherit;color:#202122;background:#fff;border:1px solid #a2a9b1;border-radius:4px}&lt;br /&gt;
#nvk fieldset{border:1px solid rgba(128,128,128,.45);border-radius:6px;padding:10px 14px;margin:14px 0}&lt;br /&gt;
#nvk legend{font-weight:700;padding:0 6px}&lt;br /&gt;
#nvk .nvk-o{display:block;padding:4px 0;cursor:pointer}&lt;br /&gt;
#nvk .nvk-o small{opacity:.7}&lt;br /&gt;
#nvk .nvk-o.dis{opacity:.75;cursor:default}&lt;br /&gt;
#nvk .nvk-btn{padding:7px 14px;font:inherit;border:1px solid #a2a9b1;border-radius:4px;background:#f8f9fa;color:#202122;cursor:pointer}&lt;br /&gt;
#nvk #nvk-out{margin-top:18px}&lt;br /&gt;
#nvk h3{margin:18px 0 8px}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-card.opt{border-left-color:#14866d}&lt;br /&gt;
#nvk .nvk-card b{display:block}&lt;br /&gt;
#nvk .nvk-card a.nvk-shop{display:inline-block;margin-top:4px;font-weight:600}&lt;br /&gt;
#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}&lt;br /&gt;
#nvk .nvk-miss{opacity:.8;font-style:italic}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;nvk-grid&amp;quot; id=&amp;quot;nvk-fields&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;fieldset id=&amp;quot;nvk-optset&amp;quot;&amp;gt;&amp;lt;legend&amp;gt;Zusatzoptionen&amp;lt;/legend&amp;gt;&amp;lt;div id=&amp;quot;nvk-opts&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/fieldset&amp;gt;&lt;br /&gt;
&amp;lt;button type=&amp;quot;button&amp;quot; class=&amp;quot;nvk-btn&amp;quot; id=&amp;quot;nvk-reset&amp;quot;&amp;gt;Auswahl zurücksetzen&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;nvk-out&amp;quot; aria-live=&amp;quot;polite&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;noscript&amp;gt;Für den Konfigurator wird JavaScript benötigt.&amp;lt;/noscript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
(function () {&lt;br /&gt;
&amp;quot;use strict&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
/* =====================================================================&lt;br /&gt;
   KONFIGURATION – hier wird gepflegt. Kein weiterer Code nötig.&lt;br /&gt;
   ===================================================================== */&lt;br /&gt;
&lt;br /&gt;
/* ---- 1) Auswahlfelder -------------------------------------------------&lt;br /&gt;
   v = interner Wert, t = Anzeigetext,&lt;br /&gt;
   only = Wert nur anbieten, wenn Bedingung passt (z. B. nur bestimmte Fahrzeuge)&lt;br /&gt;
   show = ganzes Feld nur zeigen, wenn Bedingung passt                      */&lt;br /&gt;
var FIELDS = [&lt;br /&gt;
  { id: &amp;quot;vehicle&amp;quot;, label: &amp;quot;Fahrzeug&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;E38&amp;quot;, t: &amp;quot;BMW E38&amp;quot; }, { v: &amp;quot;E39&amp;quot;, t: &amp;quot;BMW E39&amp;quot; }, { v: &amp;quot;E46&amp;quot;, t: &amp;quot;BMW E46&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;E53&amp;quot;, t: &amp;quot;BMW E53&amp;quot; }, { v: &amp;quot;E83&amp;quot;, t: &amp;quot;BMW E83&amp;quot; } ] },&lt;br /&gt;
&lt;br /&gt;
  { id: &amp;quot;factory&amp;quot;, label: &amp;quot;Verbaut ab Werk&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;iris&amp;quot;,  t: &amp;quot;Radio mit IRIS&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;mid&amp;quot;,   t: &amp;quot;Radio mit MID&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;n43&amp;quot;,   t: &amp;quot;4:3 Navi&amp;quot;,  only: { vehicle: [&amp;quot;E38&amp;quot;, &amp;quot;E39&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;n169&amp;quot;,  t: &amp;quot;16:9 Navi&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;pfeil&amp;quot;, t: &amp;quot;Pfeilnavi&amp;quot;, only: { vehicle: [&amp;quot;E46&amp;quot;] } } ] },&lt;br /&gt;
&lt;br /&gt;
  { id: &amp;quot;trunk&amp;quot;, label: &amp;quot;Befindet sich im Kofferraum ein Radiomodul?&amp;quot;,&lt;br /&gt;
    show: { factory: [&amp;quot;pfeil&amp;quot;] }, values: [&lt;br /&gt;
    { v: &amp;quot;ja&amp;quot;, t: &amp;quot;Ja, Radio-/Navimodul im Kofferraum&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;nein&amp;quot;, t: &amp;quot;Nein, Anschlüsse nur hinter dem Radio&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;unk&amp;quot;, t: &amp;quot;Weiß ich nicht&amp;quot; } ] },&lt;br /&gt;
&lt;br /&gt;
  { id: &amp;quot;sound&amp;quot;, label: &amp;quot;Soundsystem&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;stereo&amp;quot;, t: &amp;quot;Stereo&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;hifi&amp;quot;,   t: &amp;quot;Hifi&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;dsp&amp;quot;,    t: &amp;quot;DSP&amp;quot;,          only: { vehicle: [&amp;quot;E38&amp;quot;, &amp;quot;E39&amp;quot;, &amp;quot;E53&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;hk&amp;quot;,     t: &amp;quot;Harman Kardon&amp;quot;, only: { vehicle: [&amp;quot;E46&amp;quot;, &amp;quot;E83&amp;quot;] } } ] },&lt;br /&gt;
&lt;br /&gt;
  { id: &amp;quot;current&amp;quot;, label: &amp;quot;Aktuell verbaut&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;werk&amp;quot;, t: &amp;quot;Werksradio / Werksnavi&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;nach&amp;quot;, t: &amp;quot;Nachrüst-Radio / -Navi&amp;quot; } ] },&lt;br /&gt;
&lt;br /&gt;
  { id: &amp;quot;body&amp;quot;, label: &amp;quot;Karosserie&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;limo&amp;quot;,    t: &amp;quot;Limousine&amp;quot;, only: { vehicle: [&amp;quot;E38&amp;quot;, &amp;quot;E39&amp;quot;, &amp;quot;E46&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;touring&amp;quot;, t: &amp;quot;Touring&amp;quot;,   only: { vehicle: [&amp;quot;E39&amp;quot;, &amp;quot;E46&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;coupe&amp;quot;,   t: &amp;quot;Coupé&amp;quot;,     only: { vehicle: [&amp;quot;E46&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;cabrio&amp;quot;,  t: &amp;quot;Cabrio&amp;quot;,    only: { vehicle: [&amp;quot;E46&amp;quot;] } },&lt;br /&gt;
    { v: &amp;quot;suv&amp;quot;,     t: &amp;quot;SUV&amp;quot;,       only: { vehicle: [&amp;quot;E53&amp;quot;, &amp;quot;E83&amp;quot;] } } ] },&lt;br /&gt;
&lt;br /&gt;
  { id: &amp;quot;ant&amp;quot;, label: &amp;quot;Antennenstecker am Radio (optional)&amp;quot;, optional: true, def: &amp;quot;unk&amp;quot;, values: [&lt;br /&gt;
    { v: &amp;quot;unk&amp;quot;,   t: &amp;quot;Weiß ich nicht&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;iso&amp;quot;,   t: &amp;quot;ISO (rund, „BM24“)&amp;quot; },&lt;br /&gt;
    { v: &amp;quot;fakra&amp;quot;, t: &amp;quot;FAKRA (eckig, „BM54“)&amp;quot; } ] }&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
/* ---- 2) Zusatzoptionen (Mehrfachauswahl) -----------------------------&lt;br /&gt;
   show     = Option nur sichtbar, wenn Bedingung passt&lt;br /&gt;
   requires = Option nur sichtbar, wenn diese anderen Optionen gewählt sind&lt;br /&gt;
   excl     = Optionen mit gleicher excl-Gruppe schließen sich gegenseitig aus&lt;br /&gt;
   item     = Eintrag in ITEMS, der in der Liste erscheint                  */&lt;br /&gt;
var OPTS = [&lt;br /&gt;
  { id: &amp;quot;halter&amp;quot;,  t: &amp;quot;Radio-Halter&amp;quot;, sub: &amp;quot;nur BMW E39&amp;quot;, show: { vehicle: [&amp;quot;E39&amp;quot;] }, item: &amp;quot;halter&amp;quot; },&lt;br /&gt;
  { id: &amp;quot;ibus&amp;quot;,    t: &amp;quot;I-BUS App&amp;quot;, item: &amp;quot;ibus&amp;quot; },&lt;br /&gt;
  { id: &amp;quot;deepobd&amp;quot;, t: &amp;quot;DeepOBD (Diagnose)&amp;quot;, item: &amp;quot;deepobd&amp;quot; },&lt;br /&gt;
  { id: &amp;quot;can&amp;quot;,     t: &amp;quot;CAN Interface&amp;quot;, sub: &amp;quot;Addon – nur mit I-BUS App&amp;quot;, requires: [&amp;quot;ibus&amp;quot;], item: &amp;quot;can&amp;quot; },&lt;br /&gt;
  { id: &amp;quot;tpms&amp;quot;,    t: &amp;quot;TPMS (Reifendruck)&amp;quot;, item: &amp;quot;tpms&amp;quot; },&lt;br /&gt;
  { id: &amp;quot;dab1&amp;quot;,    t: &amp;quot;DAB+ (Single Receiver)&amp;quot;, excl: &amp;quot;dab&amp;quot;, item: &amp;quot;dab1&amp;quot; },&lt;br /&gt;
  { id: &amp;quot;dab2&amp;quot;,    t: &amp;quot;DAB+ (Dual Receiver)&amp;quot;,   excl: &amp;quot;dab&amp;quot;, item: &amp;quot;dab2&amp;quot; },&lt;br /&gt;
  { id: &amp;quot;rcam&amp;quot;,    t: &amp;quot;Rückfahrkamera&amp;quot;, item: &amp;quot;rcam&amp;quot; },&lt;br /&gt;
  { id: &amp;quot;fcam&amp;quot;,    t: &amp;quot;Front-Kamera&amp;quot;, item: &amp;quot;fcam&amp;quot; },&lt;br /&gt;
  { id: &amp;quot;tool&amp;quot;,    t: &amp;quot;Einbau-Werkzeug (Kunststoffheber)&amp;quot;, item: &amp;quot;tool&amp;quot; }&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
/* Wird eine Option durch eine Auswahl erzwungen, wird sie automatisch gesetzt. */&lt;br /&gt;
var FORCED = [&lt;br /&gt;
  { when: { sound: [&amp;quot;dsp&amp;quot;] }, opts: [&amp;quot;ibus&amp;quot;], why: &amp;quot;wegen DSP erforderlich&amp;quot; }&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
/* ---- 3) Artikel/Produkte ---------------------------------------------&lt;br /&gt;
   u = Link in den Shop (leer lassen = Eintrag ohne Link)                  */&lt;br /&gt;
var ITEMS = {&lt;br /&gt;
  exl005:  { t: &amp;quot;Verlängerung EXL005&amp;quot;, d: &amp;quot;Ersetzt das Radiomodul im Kofferraum (Bus-/Stromanschluss nach vorn).&amp;quot;,&lt;br /&gt;
             u: &amp;quot;https://shop.ibus-app.de/detail/index/sArticle/212/&amp;quot; },&lt;br /&gt;
  fakra6m: { t: &amp;quot;Verlängerung 6 m FAKRA(m) auf FAKRA(f), gewinkelt&amp;quot;, d: &amp;quot;Antennenverlängerung vom Kofferraum nach vorn.&amp;quot;,&lt;br /&gt;
             u: &amp;quot;https://shop.ibus-app.de/shop/zubehoer/adapterkabel/192/verlaengerung-6m-fakra-m-auf-fakra-f-kurz-gewinkelt&amp;quot; },&lt;br /&gt;
  isoada:  { t: &amp;quot;Adapter ISO-Stecker auf FAKRA, gewinkelt (15 cm)&amp;quot;, d: &amp;quot;Nötig, wenn das Fahrzeug einen ISO-Antennenstecker hat.&amp;quot;,&lt;br /&gt;
             u: &amp;quot;https://shop.ibus-app.de/shop/zubehoer/adapterkabel/193/adapter-kabel-iso-f-auf-fakra-f-kurz-gewinkelt-15cm&amp;quot; },&lt;br /&gt;
  dsplic:  { t: &amp;quot;DSP-Lizenz für die I-BUS App&amp;quot;, d: &amp;quot;Ohne diese Lizenz arbeitet das Werks-DSP nicht.&amp;quot;, u: &amp;quot;&amp;quot; },&lt;br /&gt;
  halter:  { t: &amp;quot;Halter zur Radio-Montage im BMW E39&amp;quot;, d: &amp;quot;Empfohlen bei Radios, die nicht von AVIN stammen.&amp;quot;,&lt;br /&gt;
             u: &amp;quot;https://shop.ibus-app.de/shop/zubehoer/182/halter-zur-radio-montage-im-bmw-e39&amp;quot; },&lt;br /&gt;
  ibus:    { t: &amp;quot;I-BUS App&amp;quot;, d: &amp;quot;Erhält Bordcomputer-Funktionen und steuert z. B. den Original-CD-Wechsler.&amp;quot;,&lt;br /&gt;
             u: &amp;quot;http://www.ibus-app.de&amp;quot; },&lt;br /&gt;
  deepobd: { t: &amp;quot;DeepOBD (Diagnose)&amp;quot;, d: &amp;quot;Live-Werte auslesen, Fehler lesen und löschen.&amp;quot;, u: &amp;quot;&amp;quot; },&lt;br /&gt;
  can:     { t: &amp;quot;CAN Interface (Addon zur I-BUS App)&amp;quot;, d: &amp;quot;Funktioniert nur zusammen mit der I-BUS App.&amp;quot;, u: &amp;quot;&amp;quot; },&lt;br /&gt;
  tpms:    { t: &amp;quot;TPMS – Reifendruckanzeige&amp;quot;, d: &amp;quot;&amp;quot;, u: &amp;quot;https://xtrons.co.uk/tyre-pressure-monitoring-system-tpms01&amp;quot; },&lt;br /&gt;
  dab1:    { t: &amp;quot;DAB+ Single Receiver&amp;quot;, d: &amp;quot;&amp;quot;, u: &amp;quot;https://xtrons.co.uk/dab-tuner-usbdab01&amp;quot; },&lt;br /&gt;
  dab2:    { t: &amp;quot;DAB+ Dual Receiver&amp;quot;, d: &amp;quot;&amp;quot;, u: &amp;quot;&amp;quot; },&lt;br /&gt;
  rcam:    { t: &amp;quot;Rückfahrkamera&amp;quot;, d: &amp;quot;&amp;quot;, u: &amp;quot;&amp;quot; },&lt;br /&gt;
  fcam:    { t: &amp;quot;Front-Kamera&amp;quot;, d: &amp;quot;&amp;quot;, u: &amp;quot;&amp;quot; },&lt;br /&gt;
  tool:    { t: &amp;quot;Einbau-Werkzeug (Kunststoffheber)&amp;quot;, d: &amp;quot;Zum schonenden Lösen der Verkleidungen.&amp;quot;, u: &amp;quot;&amp;quot; }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* ---- 4) Regeln --------------------------------------------------------&lt;br /&gt;
   type  = &amp;quot;need&amp;quot; (Das brauchst Du) | &amp;quot;hint&amp;quot; (Hinweise)&lt;br /&gt;
   when  = Bedingung auf die Auswahlfelder (alle Schlüssel müssen passen)&lt;br /&gt;
   opts  = (optional) diese Zusatzoptionen müssen gewählt sein&lt;br /&gt;
   items = Artikel aus ITEMS      html = Hinweistext (HTML erlaubt)&lt;br /&gt;
   Abgeleiteter Wert &amp;quot;module&amp;quot;: ja = Radiomodul im Kofferraum, nein = nicht, unk = unklar */&lt;br /&gt;
var RULES = [&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { current: [&amp;quot;werk&amp;quot;], module: [&amp;quot;ja&amp;quot;] }, items: [&amp;quot;exl005&amp;quot;, &amp;quot;fakra6m&amp;quot;] },&lt;br /&gt;
&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { current: [&amp;quot;nach&amp;quot;], module: [&amp;quot;ja&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;&amp;lt;b&amp;gt;Verlängerungen prüfen:&amp;lt;/b&amp;gt; Bei einem bereits verbauten Nachrüst-Radio sollten EXL005 und FAKRA-Verlängerung schon vorhanden sein. &amp;lt;b&amp;gt;Ungeeignet&amp;lt;/b&amp;gt; sind die Standard-„Quad-Lock-Verlängerung kombiniert mit Antennenverlängerung“ und die „EXL006“ (kein BUS-Signal).&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;ja&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;&amp;lt;b&amp;gt;Kabelwege:&amp;lt;/b&amp;gt; Die Technik sitzt im Kofferraum. Es müssen mindestens Kabel für Radioanschluss und FM-Antenne nach vorn verlegt werden. Optional zusätzlich: GPS (OEM-Antenne), Verlängerung für DAB+, Anschluss OEM-CD-Wechsler, Cinch für Subwoofer.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;nein&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;&amp;lt;b&amp;gt;Kabelwege:&amp;lt;/b&amp;gt; Alle Anschlüsse befinden sich direkt hinter dem Radio, es müssen &amp;lt;b&amp;gt;keine&amp;lt;/b&amp;gt; Kabel verlegt werden. Optional ggf. für: GPS (OEM-Antenne), DAB+, OEM-CD-Wechsler, Cinch für Subwoofer.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { module: [&amp;quot;unk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;&amp;lt;b&amp;gt;Bitte prüfen:&amp;lt;/b&amp;gt; Schau nach, ob im Kofferraum ein Radiomodul sitzt. Manche E46 mit Pfeilnavi (vermutlich Vorfacelift) haben das Radio hinten und benötigen dann EXL005 + FAKRA-Verlängerung.&amp;quot; },&lt;br /&gt;
&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { ant: [&amp;quot;iso&amp;quot;] }, items: [&amp;quot;isoada&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { ant: [&amp;quot;unk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;&amp;lt;b&amp;gt;Antennenstecker:&amp;lt;/b&amp;gt; Hat Dein Fahrzeug einen ISO-Antennenstecker, brauchst Du zusätzlich den &amp;lt;a href='https://shop.ibus-app.de/shop/zubehoer/adapterkabel/193/adapter-kabel-iso-f-auf-fakra-f-kurz-gewinkelt-15cm'&amp;gt;Adapter ISO auf FAKRA&amp;lt;/a&amp;gt;. Bei FAKRA ist kein Adapter nötig.&amp;quot; },&lt;br /&gt;
&lt;br /&gt;
  { type: &amp;quot;need&amp;quot;, when: { sound: [&amp;quot;dsp&amp;quot;] }, items: [&amp;quot;dsplic&amp;quot;] },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { sound: [&amp;quot;dsp&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;&amp;lt;b&amp;gt;DSP:&amp;lt;/b&amp;gt; Damit das Werks-DSP überhaupt arbeitet, wird die I-BUS App mit DSP-Lizenz benötigt.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { sound: [&amp;quot;hk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;&amp;lt;b&amp;gt;Harman Kardon:&amp;lt;/b&amp;gt; Benötigt &amp;lt;b&amp;gt;keine&amp;lt;/b&amp;gt; DSP-Lizenz. Das Remote-Signal (+12 V, wenn Radio an) genügt zum Starten.&amp;quot; },&lt;br /&gt;
&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;E38&amp;quot;, &amp;quot;E53&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;&amp;lt;b&amp;gt;Montage:&amp;lt;/b&amp;gt; Radios für BMW E38/E53 benötigen keine extra Halterungen.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;E39&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;&amp;lt;b&amp;gt;Montage:&amp;lt;/b&amp;gt; Bei Radios, die nicht von AVIN stammen, empfehlen wir einen Halter (siehe Zusatzoptionen) oder das Bearbeiten der beiliegenden Montagewinkel. Anleitungen: &amp;lt;a href='https://xtrons.ibus-app.de/index.php?title=Montageanleitungen'&amp;gt;Montageanleitungen&amp;lt;/a&amp;gt;.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: { vehicle: [&amp;quot;E46&amp;quot;], factory: [&amp;quot;iris&amp;quot;, &amp;quot;mid&amp;quot;, &amp;quot;pfeil&amp;quot;], current: [&amp;quot;werk&amp;quot;] },&lt;br /&gt;
    html: &amp;quot;&amp;lt;b&amp;gt;Montage E46 ohne großes Navi:&amp;lt;/b&amp;gt; Das Klimabedienteil muss nach unten versetzt werden. Dafür brauchst Du den passenden &amp;lt;b&amp;gt;Funktionsträger&amp;lt;/b&amp;gt; (neu ca. 100 €, ggf. beim Teileverwerter günstiger):&amp;lt;br&amp;gt;&amp;quot; +&lt;br /&gt;
          &amp;quot;Einzelschalter (eher VFL): &amp;lt;a href='https://www.leebmann24.de/trager-3er-51168202186.html'&amp;gt;ohne Raucher 51168202186&amp;lt;/a&amp;gt; / &amp;lt;a href='https://www.leebmann24.de/trager-3er-51168230902.html'&amp;gt;mit Raucher 51168230902&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&amp;quot; +&lt;br /&gt;
          &amp;quot;Schaltzentrum (eher FL): &amp;lt;a href='https://www.leebmann24.de/funktionstrager-schaltzentrum-3er-51167001408.html'&amp;gt;ohne Raucher 51167001408&amp;lt;/a&amp;gt; / &amp;lt;a href='https://www.leebmann24.de/funktionstrager-schaltzentrum-3er-51167001410.html'&amp;gt;mit Raucher 51167001410&amp;lt;/a&amp;gt;&amp;quot; },&lt;br /&gt;
&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, opts: [&amp;quot;ibus&amp;quot;], when: {},&lt;br /&gt;
    html: &amp;quot;&amp;lt;b&amp;gt;I-BUS App:&amp;lt;/b&amp;gt; Siehe &amp;lt;a href='https://wiki.ibus-app.de/index.php?title=Was_brauche_ich_um_die_I-BUS_App_nutzen_zu_k%C3%B6nnen%3F'&amp;gt;Was brauche ich, um die I-BUS App nutzen zu können?&amp;lt;/a&amp;gt; und die &amp;lt;a href='https://wiki.ibus-app.de/index.php?title=Einbauanleitung_f%C3%BCr_Resler_Modul_und_Resler_Interface'&amp;gt;Einbauanleitung für Resler Modul und Interface&amp;lt;/a&amp;gt;.&amp;quot; },&lt;br /&gt;
  { type: &amp;quot;hint&amp;quot;, when: {}, opts: [],&lt;br /&gt;
    html: &amp;quot;&amp;lt;b&amp;gt;Wichtig:&amp;lt;/b&amp;gt; Bitte immer die Anschlüsse am eigenen Radio abgleichen. Welches Radio passt? → &amp;lt;a href='https://xtrons.ibus-app.de/index.php?title=Entscheidungshilfe%3A_AVIN_oder_XTRONS%3F'&amp;gt;Entscheidungshilfe AVIN oder XTRONS&amp;lt;/a&amp;gt;, Kosten → &amp;lt;a href='https://xtrons.ibus-app.de/index.php?title=Grobe_Kosten%C3%BCbersicht'&amp;gt;Grobe Kostenübersicht&amp;lt;/a&amp;gt;.&amp;quot; }&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
/* =====================================================================&lt;br /&gt;
   PROGRAMMLOGIK&lt;br /&gt;
   ===================================================================== */&lt;br /&gt;
var $ = function (id) { return document.getElementById(id); };&lt;br /&gt;
var sel = {}, picked = {};&lt;br /&gt;
var fieldsEl = $(&amp;quot;nvk-fields&amp;quot;), optsEl = $(&amp;quot;nvk-opts&amp;quot;), outEl = $(&amp;quot;nvk-out&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
function match(cond, s, lenient) {&lt;br /&gt;
  if (!cond) return true;&lt;br /&gt;
  for (var k in cond) {&lt;br /&gt;
    if (!s[k]) { if (lenient) continue; return false; }&lt;br /&gt;
    if (cond[k].indexOf(s[k]) &amp;lt; 0) return false;&lt;br /&gt;
  }&lt;br /&gt;
  return true;&lt;br /&gt;
}&lt;br /&gt;
function derive() {&lt;br /&gt;
  var s = {}, k;&lt;br /&gt;
  for (k in sel) s[k] = sel[k];&lt;br /&gt;
  if (s.factory === &amp;quot;n43&amp;quot; || s.factory === &amp;quot;n169&amp;quot;) s.module = &amp;quot;ja&amp;quot;;&lt;br /&gt;
  else if (s.factory === &amp;quot;iris&amp;quot; || s.factory === &amp;quot;mid&amp;quot;) s.module = &amp;quot;nein&amp;quot;;&lt;br /&gt;
  else if (s.factory === &amp;quot;pfeil&amp;quot;) s.module = s.trunk || &amp;quot;unk&amp;quot;;&lt;br /&gt;
  return s;&lt;br /&gt;
}&lt;br /&gt;
function forced(s) {&lt;br /&gt;
  var f = {};&lt;br /&gt;
  FORCED.forEach(function (r) { if (match(r.when, s)) r.opts.forEach(function (o) { f[o] = r.why; }); });&lt;br /&gt;
  return f;&lt;br /&gt;
}&lt;br /&gt;
function onSet(s) {&lt;br /&gt;
  var f = forced(s), on = {}, k;&lt;br /&gt;
  for (k in picked) if (picked[k]) on[k] = true;&lt;br /&gt;
  for (k in f) on[k] = true;&lt;br /&gt;
  return { on: on, forced: f };&lt;br /&gt;
}&lt;br /&gt;
function optVisible(o, s, on) {&lt;br /&gt;
  if (!match(o.show, s, true)) return false;&lt;br /&gt;
  return (o.requires || []).every(function (r) { return on[r]; });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Felder aufbauen */&lt;br /&gt;
FIELDS.forEach(function (f) {&lt;br /&gt;
  var wrap = document.createElement(&amp;quot;div&amp;quot;); wrap.className = &amp;quot;nvk-f&amp;quot;; wrap.id = &amp;quot;nvk-w-&amp;quot; + f.id;&lt;br /&gt;
  var lab = document.createElement(&amp;quot;label&amp;quot;); lab.htmlFor = &amp;quot;nvk-&amp;quot; + f.id; lab.textContent = f.label;&lt;br /&gt;
  var s = document.createElement(&amp;quot;select&amp;quot;); s.id = &amp;quot;nvk-&amp;quot; + f.id;&lt;br /&gt;
  s.addEventListener(&amp;quot;change&amp;quot;, function () { sel[f.id] = s.value; update(); });&lt;br /&gt;
  wrap.appendChild(lab); wrap.appendChild(s); fieldsEl.appendChild(wrap);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
function renderFields() {&lt;br /&gt;
  var s = derive();&lt;br /&gt;
  FIELDS.forEach(function (f) {&lt;br /&gt;
    var wrap = $(&amp;quot;nvk-w-&amp;quot; + f.id), el = $(&amp;quot;nvk-&amp;quot; + f.id);&lt;br /&gt;
    var vis = match(f.show, s, false) || !f.show;&lt;br /&gt;
    wrap.style.display = vis ? &amp;quot;&amp;quot; : &amp;quot;none&amp;quot;;&lt;br /&gt;
    if (!vis) { sel[f.id] = &amp;quot;&amp;quot;; return; }&lt;br /&gt;
    var allowed = f.values.filter(function (v) { return match(v.only, s, true); });&lt;br /&gt;
    if (sel[f.id] &amp;amp;&amp;amp; !allowed.some(function (v) { return v.v === sel[f.id]; })) sel[f.id] = &amp;quot;&amp;quot;;&lt;br /&gt;
    if (!sel[f.id] &amp;amp;&amp;amp; f.def) sel[f.id] = f.def;&lt;br /&gt;
    el.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
    if (!f.def) { var p = document.createElement(&amp;quot;option&amp;quot;); p.value = &amp;quot;&amp;quot;; p.textContent = &amp;quot;– bitte wählen –&amp;quot;; el.appendChild(p); }&lt;br /&gt;
    allowed.forEach(function (v) {&lt;br /&gt;
      var o = document.createElement(&amp;quot;option&amp;quot;); o.value = v.v; o.textContent = v.t; el.appendChild(o);&lt;br /&gt;
    });&lt;br /&gt;
    el.value = sel[f.id] || &amp;quot;&amp;quot;;&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function renderOpts() {&lt;br /&gt;
  var s = derive(), st = onSet(s);&lt;br /&gt;
  /* Gruppen-Ausschluss &amp;amp; nicht mehr sichtbare Optionen bereinigen */&lt;br /&gt;
  OPTS.forEach(function (o) { if (!optVisible(o, s, st.on)) picked[o.id] = false; });&lt;br /&gt;
  st = onSet(s);&lt;br /&gt;
  optsEl.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
  OPTS.forEach(function (o) {&lt;br /&gt;
    if (!optVisible(o, s, st.on)) return;&lt;br /&gt;
    var lab = document.createElement(&amp;quot;label&amp;quot;); lab.className = &amp;quot;nvk-o&amp;quot;;&lt;br /&gt;
    var cb = document.createElement(&amp;quot;input&amp;quot;); cb.type = &amp;quot;checkbox&amp;quot;;&lt;br /&gt;
    cb.checked = !!st.on[o.id];&lt;br /&gt;
    var isForced = !!st.forced[o.id];&lt;br /&gt;
    if (isForced) { cb.disabled = true; lab.className += &amp;quot; dis&amp;quot;; }&lt;br /&gt;
    cb.addEventListener(&amp;quot;change&amp;quot;, function () {&lt;br /&gt;
      picked[o.id] = cb.checked;&lt;br /&gt;
      if (cb.checked &amp;amp;&amp;amp; o.excl) OPTS.forEach(function (x) { if (x.excl === o.excl &amp;amp;&amp;amp; x.id !== o.id) picked[x.id] = false; });&lt;br /&gt;
      update();&lt;br /&gt;
    });&lt;br /&gt;
    lab.appendChild(cb);&lt;br /&gt;
    var txt = &amp;quot; &amp;quot; + o.t;&lt;br /&gt;
    lab.appendChild(document.createTextNode(txt));&lt;br /&gt;
    var sub = [o.sub, isForced ? st.forced[o.id] : &amp;quot;&amp;quot;].filter(Boolean).join(&amp;quot; – &amp;quot;);&lt;br /&gt;
    if (sub) { var sm = document.createElement(&amp;quot;small&amp;quot;); sm.textContent = &amp;quot; (&amp;quot; + sub + &amp;quot;)&amp;quot;; lab.appendChild(sm); }&lt;br /&gt;
    optsEl.appendChild(lab);&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function card(item, cls) {&lt;br /&gt;
  var d = document.createElement(&amp;quot;div&amp;quot;); d.className = &amp;quot;nvk-card &amp;quot; + (cls || &amp;quot;&amp;quot;);&lt;br /&gt;
  var b = document.createElement(&amp;quot;b&amp;quot;); b.textContent = item.t; d.appendChild(b);&lt;br /&gt;
  if (item.d) { var p = document.createElement(&amp;quot;span&amp;quot;); p.textContent = item.d; d.appendChild(p); }&lt;br /&gt;
  if (item.u) {&lt;br /&gt;
    var a = document.createElement(&amp;quot;a&amp;quot;); a.className = &amp;quot;nvk-shop&amp;quot;; a.href = item.u; a.target = &amp;quot;_blank&amp;quot;; a.rel = &amp;quot;noopener&amp;quot;;&lt;br /&gt;
    a.textContent = &amp;quot;Im Shop ansehen →&amp;quot;; d.appendChild(a);&lt;br /&gt;
  }&lt;br /&gt;
  return d;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function renderResult() {&lt;br /&gt;
  var s = derive(), st = onSet(s);&lt;br /&gt;
  var required = [&amp;quot;vehicle&amp;quot;, &amp;quot;factory&amp;quot;, &amp;quot;sound&amp;quot;, &amp;quot;current&amp;quot;, &amp;quot;body&amp;quot;];&lt;br /&gt;
  var names = { vehicle: &amp;quot;Fahrzeug&amp;quot;, factory: &amp;quot;Verbaut ab Werk&amp;quot;, sound: &amp;quot;Soundsystem&amp;quot;, current: &amp;quot;Aktuell verbaut&amp;quot;, body: &amp;quot;Karosserie&amp;quot; };&lt;br /&gt;
  var missing = required.filter(function (k) { return !sel[k]; });&lt;br /&gt;
  outEl.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
  if (missing.length) {&lt;br /&gt;
    var m = document.createElement(&amp;quot;p&amp;quot;); m.className = &amp;quot;nvk-miss&amp;quot;;&lt;br /&gt;
    m.textContent = &amp;quot;Bitte noch auswählen: &amp;quot; + missing.map(function (k) { return names[k]; }).join(&amp;quot;, &amp;quot;);&lt;br /&gt;
    outEl.appendChild(m); return;&lt;br /&gt;
  }&lt;br /&gt;
  var needs = [], hints = [], seen = {};&lt;br /&gt;
  RULES.forEach(function (r) {&lt;br /&gt;
    if (!match(r.when, s)) return;&lt;br /&gt;
    if (r.opts &amp;amp;&amp;amp; !r.opts.every(function (o) { return st.on[o]; })) return;&lt;br /&gt;
    if (r.type === &amp;quot;need&amp;quot;) (r.items || []).forEach(function (id) { if (!seen[id]) { seen[id] = 1; needs.push(ITEMS[id]); } });&lt;br /&gt;
    else hints.push(r.html);&lt;br /&gt;
  });&lt;br /&gt;
  var h = document.createElement(&amp;quot;h3&amp;quot;); h.textContent = &amp;quot;Das brauchst Du&amp;quot;; outEl.appendChild(h);&lt;br /&gt;
  if (needs.length) needs.forEach(function (i) { outEl.appendChild(card(i)); });&lt;br /&gt;
  else { var n = document.createElement(&amp;quot;p&amp;quot;); n.textContent = &amp;quot;Für die Grundinstallation sind keine zusätzlichen Verlängerungen oder Adapter nötig.&amp;quot;; outEl.appendChild(n); }&lt;br /&gt;
&lt;br /&gt;
  var opt = [];&lt;br /&gt;
  OPTS.forEach(function (o) { if (st.on[o.id] &amp;amp;&amp;amp; optVisible(o, s, st.on) &amp;amp;&amp;amp; !seen[o.item]) opt.push(ITEMS[o.item]); });&lt;br /&gt;
  if (opt.length) {&lt;br /&gt;
    var h2 = document.createElement(&amp;quot;h3&amp;quot;); h2.textContent = &amp;quot;Deine Zusatzoptionen&amp;quot;; outEl.appendChild(h2);&lt;br /&gt;
    opt.forEach(function (i) { outEl.appendChild(card(i, &amp;quot;opt&amp;quot;)); });&lt;br /&gt;
  }&lt;br /&gt;
  if (hints.length) {&lt;br /&gt;
    var h3 = document.createElement(&amp;quot;h3&amp;quot;); h3.textContent = &amp;quot;Hinweise&amp;quot;; outEl.appendChild(h3);&lt;br /&gt;
    hints.forEach(function (t) { var d = document.createElement(&amp;quot;div&amp;quot;); d.className = &amp;quot;nvk-note&amp;quot;; d.innerHTML = t; outEl.appendChild(d); });&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function update() { renderFields(); renderOpts(); renderResult(); }&lt;br /&gt;
$(&amp;quot;nvk-reset&amp;quot;).addEventListener(&amp;quot;click&amp;quot;, function () { sel = {}; picked = {}; update(); });&lt;br /&gt;
update();&lt;br /&gt;
})();&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andre</name></author>
	</entry>
	<entry>
		<id>https://xtrons.ibus-app.de/index.php?title=Hauptseite&amp;diff=4066</id>
		<title>Hauptseite</title>
		<link rel="alternate" type="text/html" href="https://xtrons.ibus-app.de/index.php?title=Hauptseite&amp;diff=4066"/>
		<updated>2026-10-21T07:45:03Z</updated>

		<summary type="html">&lt;p&gt;Andre: /* Neu hier? Das musst Du wissen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''Willkommen im Wiki rund um Android-Navis, insbesondere für BMW E38/E39/E46/E53'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;Hier findet ihr eine Übersicht an empfohlenen Radios, Einbauanleitungen, Adapter, Firmware (Updates), Apps, Modifikationen sowie Tipps und Tricks &amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
=== &amp;lt;big&amp;gt;Alle Informationen zur I-Bus App&amp;lt;/big&amp;gt; ===&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
* '''&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;[http://www.ibus-app.de/ BMW I-BUS App Homepage]&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;'''&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* '''&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;[http://wiki.ibus-app.de/ Wiki zur BMW I-BUS App]&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;'''&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* '''&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;[https://www.facebook.com/groups/1954844871468973/ BMW Xtrons, AVIN und I-BUS Android App - Facebook Gruppe]&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;'''&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* '''&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;[https://forum.ibus-app.de/ I-BUS App Forum]&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;'''&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;big&amp;gt;Neu hier? Das musst Du wissen&amp;lt;/big&amp;gt; ===&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''[[Was brauche ich um meinen BMW E38/E39/E46/E53 auf ein Android-Navi umzurüsten?]]'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''[[Android Radio Konfigurator]]'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;big&amp;gt;Empfohlene Radiomodelle&amp;lt;/big&amp;gt; ===&lt;br /&gt;
* &amp;lt;big&amp;gt;&amp;lt;big&amp;gt;[[aktuelle Xtrons-Radiomodelle|'''aktuelle Xtrons-Radiomodelle + Zubehör''']]&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
*&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;[[aktuelle AVIN-Radiomodelle|aktuelle '''AVIN'''-Radiomodelle + Zubehör]]&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
** [https://help.avinusa.com/en/article/ibus-bmw-app-install-update-guide-dl24h0/ Anschlüsse, Hilfe und FAQ von AVIN (Englisch)]&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;'''!ACHTUNG! [[Anschlussfehler CAN-BUS Box und Zündungssignal]]''' (AVIN Avant 4, Xtrons MA-, IA-, PQS-, IQ-, IX- und PX-Serie - '''außer IQ..IBUS''')&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;'''[[Xtrons IX-Serie|Einstellungen und Tipps für Xtrons IX- und PX-Serie]]'''&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;'''[[Xtrons IQ-IBUS-Serie|Einstellungen und Tipps für Xtrons IQ-Serie für IBUS]]'''&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''[[Entscheidungshilfe: AVIN oder XTRONS?|Entscheidungshilfe: XTRONS oder AVIN?]]'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* [[Warum ein Xtrons-Radio? Geht nicht auch Eonon, Erisin, Pumpkin,.. ?|Warum ein AVIN oder Xtrons Radio? Geht nicht auch Eonon, Erisin, Pumpkin, MyRadical, HIZPO, XOMAX, .. ?]]&lt;br /&gt;
* [[Warum nur empfohlene Android-Radios kaufen?]]&lt;br /&gt;
* &amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''[[grobe Kostenübersicht|grobe Kostenübersicht / Einkaufsliste]]'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;big&amp;gt;Zubehör&amp;lt;/big&amp;gt; ===&lt;br /&gt;
* [https://wiki.ibus-app.de/index.php?title=Was_brauche_ich_um_die_I-BUS_App_nutzen_zu_k%C3%B6nnen%3F &amp;lt;big&amp;gt;'''Was brauche ich um die I-BUS App nutzen zu können? =&amp;gt; BC erhalten, Uhr stellen, Standheizung weiter nutzen,..'''&amp;lt;/big&amp;gt;]&lt;br /&gt;
* [[Warum empfehlen wir nur das &amp;quot;Resler-USB-Interface&amp;quot;/&amp;quot;Resler Modul&amp;quot; und kein anderes Interface?]]&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;'''[[Apple Carplay &amp;amp; Android Auto]]'''&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;'''[[OBD2 Diagnose]]'''&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;'''[[DAB+]]'''&amp;lt;/big&amp;gt;&lt;br /&gt;
* [[Installation der DAB+ Antenne]]&lt;br /&gt;
* [[Splitter für DAB+ zur Nutzung der OEM-Scheibenantennen]]&lt;br /&gt;
* [[DAB Antenne Empfang verbessern|DAB Antenne Empfang verbessern/Kalte Lötstelle im DAB+ Stick reparieren]]&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;'''[[TPMS - Reifendruckkontrolle]]'''&amp;lt;/big&amp;gt;&lt;br /&gt;
* [[Installations TPMS App (Reifenluftdruck)]]&lt;br /&gt;
* [[TPMS Sensoren anlernen]]&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;'''[https://shop.ibus-app.de/detail/index/sArticle/249 Quadlock-Adapter mit Rauschunterdrückung]'''&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* [[Übersicht 3G/4G Internetsticks]]&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* [[Aktiver USB-HUB, USB-Ladedose im Handschuhfach nachrüsten (z.B. für 3G/4G-Stick)]]&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;'''[[Anschluss Rückfahrkamera]]'''&amp;lt;/big&amp;gt;&lt;br /&gt;
* [[Rückfahrkamera mit Taster für E39/E46 touring|Rückfahrkamera mit Taster für E39/E46 touring und E38]] (Fa. Höfig)&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* [[NBT iDrive mit Xtrons]] (Yam Droid)&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;big&amp;gt;Firmware und Bedienanleitung&amp;lt;/big&amp;gt; ===&lt;br /&gt;
* '''&amp;lt;big&amp;gt;[[aktuelle Firmware]]&amp;lt;/big&amp;gt;''' (AAS, AVIN, Xtrons: PX3/PX30/PX5/PX6/Qualcomm - Hal9k und Malaysk ROM, MCU Updates,..)&lt;br /&gt;
* '''&amp;lt;big&amp;gt;[[Firmware]]&amp;lt;/big&amp;gt;''' (für E6x/E7x/E9x/..)&lt;br /&gt;
* Wie funktioniert ein [[Firmwareupdate]]&lt;br /&gt;
* [https://xtrons.ibus-app.de/index.php?title=Aktuelle_Firmware#Welche_MCU_und_Firmware-Version_habe_ich_installiert.3F Welche MCU und Firmware-Version habe ich installiert?]&lt;br /&gt;
* '''[[Bedienanleitung]]'''&lt;br /&gt;
* [[Wie kommt man ins Recovery Menü?]]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;big&amp;gt;Montageanleitungen / Adapter&amp;amp;Verlängerungen / PIN Belegungen ..&amp;lt;/big&amp;gt; ===&lt;br /&gt;
* '''[[Montageanleitungen]]'''&lt;br /&gt;
* &amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''[[Adapter und Verlängerungen]]'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
* [[Anpassung der Montagewinkel]]&lt;br /&gt;
* [[Alternative zu den beigelegten Montagewinkeln|Alternative zu den beigelegten Montagewinkeln/Haltern]] (Nur BMW E39)&lt;br /&gt;
* [https://www.google.com/maps/d/viewer?mid=1TMCVoZn225Aqsg4H_aoXpDr7aJ0&amp;amp;ll=42.757111958542374%2C-35.38434504999998&amp;amp;z=4 Übersichtskarte: Einbauhelfer]&lt;br /&gt;
* [[Was bleibt beim Umbau im Wagen und was fliegt raus?]]&lt;br /&gt;
* [[Installation der DAB+ Antenne]] &lt;br /&gt;
* [[PIN-Belegung Xtrons - Radiostecker - CAN-BUS-Box|PIN-Belegung Xtrons - Radiostecker - CAN-BUS-Box // Anschlussplan Radio / Steckerübersicht]]&lt;br /&gt;
* [https://wiki.ibus-app.de/index.php?title=Einbauanleitung_f%C3%BCr_Resler_Modul_und_Resler_Interface Einbauanleitung für Resler Modul und Resler Interface]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;big&amp;gt;Modifikationen / Anpassungen / Einstellungen&amp;lt;/big&amp;gt; ===&lt;br /&gt;
* [[Radiosender dauerhaft speichern/Verlust der Radiostationen bei Neustart oder spannungsfreiem Radio vermeiden]]&lt;br /&gt;
&lt;br /&gt;
* [[Änderung der Tasten-Beleuchtungsfarbe]]&lt;br /&gt;
&lt;br /&gt;
* [[Tastenbeleuchtung abdimmbar machen]] (nur für ältere Xtrons)&lt;br /&gt;
&lt;br /&gt;
* [http://download.speedy-pics.de/uploads/safe/dritte_usb-buchse_xtrons-pb7639bap.pdf Dritte USB-Buchse nachrüsten]&lt;br /&gt;
&lt;br /&gt;
* [[Bootlogo ändern]]&lt;br /&gt;
&lt;br /&gt;
* [[Einstellungen: Uhrzeit / Video während der Fahrt / Reverse Reduktion / ..]]&lt;br /&gt;
&lt;br /&gt;
* [http://download.speedy-pics.de/uploads/weblink/Tastenbelegung_aendern_mtctools.pdf Tastenbelegung mit MTCD-Tools ändern] '''(Bedarf eines Roots, oder Malaysk-ROM!!!)'''&lt;br /&gt;
&lt;br /&gt;
* [[Tastenbelegung OHNE Root ändern - MTC-Tools]]&lt;br /&gt;
&lt;br /&gt;
* [[Tastenbelegung OHNE Root ändern|Tastenbelegung OHNE Root ändern - Xtrons PB-, PQ-, PQS-, IQ-Serie u.ä.]]&lt;br /&gt;
&lt;br /&gt;
* [http://download.speedy-pics.de/uploads/weblink/XTRONS_Tastenbelegung-aendern.pdf Radio-Tastenbelegung ändern] '''Root/[[Aktuelle Firmware|Malaysk]] erforderlich!'''&lt;br /&gt;
&lt;br /&gt;
* [[Root für Android 8 (MTCD oder MTCE Geräte mit PX5 2gb oder 4gb Ram)]]&lt;br /&gt;
&lt;br /&gt;
* [[Equalizer-Modifikation für PX3/PX5 Radios - Sound-Mod]]&lt;br /&gt;
&lt;br /&gt;
* [[DSP-Equalizer-Modifikation für Radios mit internem DSP]] (z.b. AAS, AVIN,..)&lt;br /&gt;
&lt;br /&gt;
* [[DSP-Chip im Radio nachrüsten]]&lt;br /&gt;
&lt;br /&gt;
* [[Was ist DSP? Digitaler Soundprozessor|Was ist DSP? Digitaler Soundprozessor // DSP Nachrüstlösungen]]&lt;br /&gt;
&lt;br /&gt;
* [[Kein WLAN/USB/Bluetooth wenn es kalt ist|Kein WLAN / USB / Bluetooth wenn es kalt ist]]''' (Diese Lösung benötigt ein gerootetes Android!''')&lt;br /&gt;
&lt;br /&gt;
* [[DAB Antenne Empfang verbessern|DAB Antenne Empfang verbessern/Kalte Lötstelle im DAB+ Stick reparieren]]&lt;br /&gt;
&lt;br /&gt;
* [[Lüfter/Kühlkörper nachrüsten|CPU/Prozessor wird zu heiß: Lüfter/Kühlkörper nachrüsten]]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;big&amp;gt;Tipps/Reparaturen&amp;lt;/big&amp;gt; ===&lt;br /&gt;
* [[Abschalten des schwarzen Bildschirms (Rückfahrkamera) beim Einlegen des Rückwärtsganges]][[Datei:Back.jpg|100px|miniatur|ohne]]&lt;br /&gt;
* '''[[Kein Ton nach Radio-Einbau]] (DSP und Remote für Hifi-Endstufe/schlechter Radioempfang )'''&lt;br /&gt;
* '''[[Das Radio/Navi geht nicht (mehr) an. Kein Bild. Kein Ton|Das Radio / Navi geht nicht (mehr) an. Kein Bild. Kein Ton]]'''&lt;br /&gt;
* [https://youtu.be/EUKq-B06gg0?t=467 Xtrons PQS-/IQ-Serie und AVIN: Zündungssignal von CAN BUS Box auf Radiostecker umstecken]&lt;br /&gt;
* [http://download.speedy-pics.de/uploads/weblink/OBD02-Connection-Guide.pdf OBD-Interface einrichten für Torque] [english]&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''[[DeepOBD - Adapter und App einrichten|DeepOBD - Adapter und App einrichten und mit der I-BUS App verbinden]]'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
* [http://download.speedy-pics.de/uploads/weblink/obd1-obd2.pdf Nachrüstung oder Vervollständigung der OBD2 Diagnose Buchse &amp;lt;small&amp;gt;(V1.3   2021-02-27)&amp;lt;/small&amp;gt;] [BMW E38/E39/E46]&lt;br /&gt;
* [https://www.youtube.com/watch?v=kWKcWBMESDQ Install wire bridge on OBD1 cap board to fully access OBD2 diagnostics in the cabin] [BMW E38/E39/E46 - with both: OBD1 + OBD2]&lt;br /&gt;
* [[Reparatur bei Ausfall Tastenbeleuchtung am Radio oder Funktionsstörung der Knöpfe/Drehregler]]&lt;br /&gt;
* [[Entstörkondensator einbauen - E39 525d und 530d]] (LiMa Pfeiffen beheben)&lt;br /&gt;
* [http://download.speedy-pics.de/uploads/safe/eba_oem-mikro%20mit%20xtrons.pdf?fbclid=IwAR3GnAlWntSKKQ0132B2H0u7R8MoPnJVYNcXgRhZ9JLUeR8H8MLGakVoIHU EBA OEM Mikro BMW E39 als externes Mikro]  Danke Mirko&lt;br /&gt;
* Ersatzmikrofon in originale Halterung im Himmel: [https://kufatec.com/de/kufatec-fiscon-mikrofon-fuer-die-bmw-mini-deckenleuchte/36338-5 Kufatec 36338-5]&lt;br /&gt;
* [[iPhone / iOS ab Version 13: Kontakte frei geben / Hotspot sichtbar schalten|iPhone / iOS ab Version 13: Kontakte frei geben / Hotspot sichtbar schalten / Umschalten zw. 5GHz und 2,4GHz]]&lt;br /&gt;
* [[Persönlicher Hotspot funktioniert nicht auf dem iPhone]]&lt;br /&gt;
* [[Kontakte synchronisieren mit iPhone (via Bluetooth)]]&lt;br /&gt;
* [[Wie kommt man ins Recovery Menü?]]&lt;br /&gt;
* [[Passwort für Werkseinstellungen|Passwort / Code für Werkseinstellungen]]&lt;br /&gt;
* [https://bbs.xtrons.com/viewtopic.php?f=41&amp;amp;t=582983 BMW E6x/E9x/E70 etc - kein Ton nach Installation eines Android Radios (AUX-in)]&lt;br /&gt;
* [[Verbesserung Radioempfang für Audi/VW/Seat/Skoda mit Phantomspeisung]]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;big&amp;gt;Apps&amp;lt;/big&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;[[App-Link Sammlung]]&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;'''[https://idrive.ibus-app.de/ iDrive Launcher]'''&amp;lt;/big&amp;gt;&lt;br /&gt;
* [https://www.media-broadcast.com/hoerfunk/dabplus-logo-service/ Download DAB+ Logos], alternativ: [https://www.seat.de/content/dam/countries/de/seat-website/download/senderlogos/senderlogos.zip Download DAB+ Logos]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;big&amp;gt; Bugs &amp;amp; Fehler &amp;lt;/big&amp;gt;===&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* [[Liste über Bugs &amp;amp; Fehler]]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;big&amp;gt;ToDo-Liste&amp;lt;/big&amp;gt; ===&lt;br /&gt;
* [[ToDo-Liste]]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Spenden ===&lt;br /&gt;
&lt;br /&gt;
Wenn Ihnen unser Wiki/unsere App gefallen und Sie uns unterstützen möchten, würden wir uns über eine [https://ibus-app.de/spenden Spende] freuen.&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Datei:Paypal-logo.png|rahmenlos|link=https://ibus-app.de/spenden]]&lt;/div&gt;</summary>
		<author><name>Andre</name></author>
	</entry>
	<entry>
		<id>https://xtrons.ibus-app.de/index.php?title=DeepOBD_-_Adapter_und_App_einrichten&amp;diff=4065</id>
		<title>DeepOBD - Adapter und App einrichten</title>
		<link rel="alternate" type="text/html" href="https://xtrons.ibus-app.de/index.php?title=DeepOBD_-_Adapter_und_App_einrichten&amp;diff=4065"/>
		<updated>2026-10-20T13:08:57Z</updated>

		<summary type="html">&lt;p&gt;Andre: /* DeepOBD Config Generator */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== DeepOBD - Diagnose und Live-Werte ==&lt;br /&gt;
&amp;lt;small&amp;gt;Stand: 04.02.2026&amp;lt;/small&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Was kann die App? ===&lt;br /&gt;
* Fehlerspeicher auslesen - für '''BMW AG''' und auch '''VAG''' [VW, Audi, Skoda, Seat,..]  (ca.2004-2017)&lt;br /&gt;
* Auslesen und Anzeigen von Live-Werten aus alles Steuergeräten (z.b. Motor: Öltemperatur beim M52TU/M54/S54, Ladedruck beim M57,..)&lt;br /&gt;
* ähnliche Funktionen wie BMW Diagnose Software&lt;br /&gt;
* alle Funktion müssen selbst(!) konfiguriert werden, oder aber es werden von uns vorbereitete Konfigurationen genutzt. (Siehe [[DeepOBD_-_Adapter_und_App_einrichten#Zusammenfassung_und_Download|Download]])&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{|&lt;br /&gt;
|&amp;lt;youtube&amp;gt;https://youtu.be/-uNTGxTXcPw&amp;lt;/youtube&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''Beispiel:''' ''BMW E39 M57 530d''&lt;br /&gt;
|&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=XYUfAFopVtg&amp;lt;/youtube&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''Beispiel:''' ''BMW E39 M54 525i''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Was brauche ich? ===&lt;br /&gt;
* Ein Android-Gerät mit voll nutzbarer USB-Schnittstelle („OTG“) oder Bluetooth.&lt;br /&gt;
* Die App „[https://play.google.com/store/apps/details?id=de.holeschak.bmw_deep_obd DeepOBD]“&lt;br /&gt;
* Die zugehörigen ECU Daten (~120MB, können nur in der App herunter geladen werden)&lt;br /&gt;
* Ein OBD2-USB Diagnose-Interface (wie für BMW Diagnose Software) oder das [https://shop.ibus-app.de/detail/index/sArticle/258 '''speziell für „DeepOBD“ erstellte Bluetooth Interface'''] '''[alle anderen, ggf. ähnlich aussehenden BT-Interface funktionieren NICHT!]'''&lt;br /&gt;
* Eine voll-belegte OBD2 Diagnose-Schnittstelle (optional temporär eine OBD1 Diagnose-Schnittstelle PLUS einen Adapter auf OBD2). Sofern OBD1 und OBD2 verbaut sind (einige E38/E39/E46), so muss OBD2 vervollständigt werden (Stichwort &amp;quot;PIN 7+8&amp;quot;) ==&amp;gt; [http://download.speedy-pics.de/uploads/weblink/obd1-obd2.pdf Nachrüstung oder Vervollständigung der OBD2 Diagnose Buchse (V1.3 2021-02-27) [BMW E38/E39/E46&amp;lt;nowiki&amp;gt;]&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* Geduld und etwas Muse :o)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alle weiteren Infos findet ihr (in English!) auf der [https://ediabaslib.codeplex.com/wikipage?title=Deep%20OBD%20for%20BMW Homepage des Entwicklers].&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Bluetooth Interface ===&lt;br /&gt;
Es existiert auf dem Markt nur zwei für die App nutzbare OBDII-Bluetooth Interfaces.&lt;br /&gt;
# &amp;lt;big&amp;gt;'''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;NEU&amp;lt;/font&amp;gt; Das von Herr Holeschak angepasste und geprüfte [https://shop.ibus-app.de/detail/index/sArticle/258 Deep OBD Interface gibt es endlich auch im I-BUS App-Shop]'''&amp;lt;/big&amp;gt;.&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;&lt;br /&gt;
# Das eine kommt direkt vom Entwickler, der es bei ebay als [https://www.ebay.de/usr/uh-xy Verkäufer uh-xy] anbietet.&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Andere, optisch identische Interface funktionieren nicht, das sowohl Hard- als auch Software modifiziert werden.'''&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
DeepOBD Interface 1.png|DeepOBD Interface im I-BUS App Shop&lt;br /&gt;
DeepOBD Interface 2.png|DeepOBD Interface im I-BUS App Shop&lt;br /&gt;
DeepOBD Interface 3.png|DeepOBD Interface im I-BUS App Shop&lt;br /&gt;
DeepOBD Interface.jpg|DeepOBD Interface bei ebay&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;Das Interface basiert auf einem Xtrons OBD02 - wurde aber von Herrn Holeschak selbst modifiziert (Hardware und Firmware) und getestet. Damit es als solches erkannt werden kann haben wir ihm einem entsprechenden Sticker spendiert.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;Nutzbar sind '''nur''' die Interface mit dem '''Chip BC417''' und einer '''Brücke zw. Pin 7+8''' ( für BMW E38/E39/E46/E53). Entsprechend ist das Interface zu bestellen.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Koppelung des Bluetooth Interfaces ===&lt;br /&gt;
Wir empfehlen das Interface zuerst im Telefon-Menü des Android-Radios (bei Handy und Tablet egal!) und '''nicht''' im Bluetooth-Menü zu koppeln.&amp;lt;br /&amp;gt;&lt;br /&gt;
Das Interface rückt damit nur in die Liste der verbundenen Geräte, wird aber keine Farbänderung (wie bei Xtrons, hier wird z.b. der Smartphone-Name grün bei aktiver Verbindung) vollziehen.&amp;lt;br /&amp;gt;&lt;br /&gt;
Allerdings wird in der Statusleiste das blaue OBD-Icon erscheinen. '''Nur''' wenn dieses erscheint, wird eine Verbindung zur App DeepOBD erfolgreich sein.&amp;lt;br /&amp;gt;&lt;br /&gt;
Erscheint das Icon, können wir zur App über gehen.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
'''&amp;lt;big&amp;gt;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;WICHTIG für alle neuen Xtrons (MA-, PQS- und IQ-Serie) sowie AVIN (PX6 und Qualcomm): Bluetooth-PIN vom Radio(!!!!) auf &amp;quot;1234&amp;quot; (entsprechend dem vom DeepOBD Interface) ändern, damit das Pairen funktioniert!&amp;lt;/font&amp;gt;&amp;lt;/big&amp;gt;'''&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
MCU2.png|Beispielbild OBDII Icon&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
==== Fehlerbehandlung Interface Kopplung ====&lt;br /&gt;
Erscheint das blaue OBD Icon nach Kopplung nicht oder das Interface wird nicht gefunden, kann es helfen:&lt;br /&gt;
* das Interface aus- und an zu schalten und erneut zu suchen und pairen&lt;br /&gt;
* das Interface aus der Liste zu löschen und erneut zu suchen und pairen&lt;br /&gt;
* das Interface aus der Liste zu löschen, alle Verbindungen (DeepOBD) zu beenden, Namen und PIN vom Radio zu änder und anschließend Interface neu suchen und pairen&lt;br /&gt;
* '''&amp;lt;big&amp;gt;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;WICHTIG für alle neuen Xtrons (MA-, PQS- und IQ-Serie) sowie AVIN (PX6 und Qualcomm): Bluetooth-PIN vom Radio(!!!!) auf &amp;quot;1234&amp;quot; (entsprechend dem vom DeepOBD Interface) ändern, damit das Pairen funktioniert!&amp;lt;/font&amp;gt;&amp;lt;/big&amp;gt;'''&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== USB Interface ===&lt;br /&gt;
Neben dem speziellen Bluetooth Interface funktioniert jedes USB-Interface, mit dem man auch die bekannten BMW Programme nutzen kann.&amp;lt;br /&amp;gt;&lt;br /&gt;
Wichtig ist aber auch hier, dass die Brücke zw. PIN 7+8 gesetzt wird.&amp;lt;br /&amp;gt;&lt;br /&gt;
Es genügt daher jedes beliebige &amp;quot;KKL USB OBD2&amp;quot; Interface (auch wenn es als &amp;quot;nur für VAG geeignet&amp;quot; deklariert ist). man bekommt diese ab ~10..15€ bei amazon oder ebay etc.&amp;lt;br /&amp;gt;&lt;br /&gt;
Natürlich geht auch jedes BMW spezifisches Interface mit der Beschreibung &amp;quot;K+D CAN&amp;quot;, aber auch hier muss sichergestellt werden, dass die Brücke gesetzt ist!&amp;lt;br /&amp;gt;&lt;br /&gt;
Eingerichtet wird es stets als &amp;quot;FTDI USB Interface&amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
K+D CAN.jpg|K+D CAN OBD2 USB Interface&lt;br /&gt;
Interface Brücke7+8.jpg|Brücke PIN 7+8 im OBD2 USB Interface&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Einrichtung von DeepOBD ===&lt;br /&gt;
Bitte aktuell die pdf im [https://xtrons.ibus-app.de/index.php?title=DeepOBD_-_Adapter_und_App_einrichten#Zusammenfassung_und_Download Download (pdf-File im Archiv)] lesen oder das [https://www.youtube.com/watch?v=sHoUxJQ8Gb8 Video zur Einrichtung] ansehen.&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
====Basis ist die App &amp;quot;Deep OBD&amp;quot; sowie ein passendes Interface====&lt;br /&gt;
# DeepOBD-App installieren&lt;br /&gt;
# Einrichtungs-Anfrage der App abbrechen, oben rechts auf den &amp;quot;Pfeil nach unten&amp;quot; tippen und in die &amp;quot;Globalen Einstellungen&amp;quot; der App gehen. '''Speichermedium &amp;quot;Standard&amp;quot; auf &amp;quot;..emulated/0&amp;quot; ändern'''. Menü schließen.&lt;br /&gt;
# Erneut auf den &amp;quot;Pfeil nach unten&amp;quot; tippen und &amp;quot;ECU Daten entpacken&amp;quot; erst jetzt auswählen. (auf dem internen Speicher dauert das ca. 2..15 Minuten, auf externen Laufwerken wesentlich länger!)&lt;br /&gt;
# Kopiere aus dem Dowload-Archiv den Ordner &amp;quot;Configurations&amp;quot; auf einen USB-Stick/SD Karte und geht damit an das Android-Radio/-Tablett/-Handy auf dem die App eingerichtet ist.&lt;br /&gt;
#'''bis Android 10:''' Sucht mit dem Dateimanager (o.ä.)  den Ordner: ''...Android/data/de.holeschak.bmw_deep_obd/files/'' [entweder interner Ordner oder SD-Karte, im Zweifel beide!]&lt;br /&gt;
## Den kompletten Ordner &amp;quot;Configurations&amp;quot; in das Verzeichnis hinein kopieren&lt;br /&gt;
## Dateimanager schließen&lt;br /&gt;
#'''ab Android 11''': das Verzeichnis &amp;quot;Configurations&amp;quot; mit dem Dateimanager in den Ordner &amp;quot;Downloads&amp;quot; im internen Speicher kopieren&lt;br /&gt;
## DeepOBD &lt;br /&gt;
##Öffnen Einstellungen &lt;br /&gt;
##globale Einstellungen &lt;br /&gt;
##&amp;quot;Verzeichnis zur App kopieren&amp;quot; &lt;br /&gt;
##Ordner &amp;quot;Download&amp;quot; öffnen und den Ordner &amp;quot;Configurations&amp;quot; antippen &lt;br /&gt;
##Ansicht wechsel in den DeepOBD Ordner &lt;br /&gt;
##wechseln auf die Ebene so dass &amp;quot;de.holeschak.bmw_deep_obd&amp;quot; zu sehen ist, lange auf diese Zeile tippen &lt;br /&gt;
##Meldung, ob die Daten dahin kopiert werden sollen bestätigen &lt;br /&gt;
##geduldig warten, '''das kann einige Minuten dauern - allein schon bis zum Beginn des Kopiervorganges!'''&lt;br /&gt;
# Deep OBD öffnen und Zündung anschalten&lt;br /&gt;
# In DeepOBD auf den &amp;quot;Pfeil nach unten&amp;quot; klicken und die Funktion &amp;quot;Konfiguration&amp;quot; klicken. Es öffnet sich der Dialog zur Auswahl einer Konfiguration. Nun den Ordner oben suchen und öffnen und den passenden Unterordner zur Modellreihe (E38/E39/E46/E53/E83) öffnen, dort dann die passende Konfig für Motor/Getriebe &amp;quot;M57&amp;quot;, &amp;quot;M54&amp;quot;,.. öffnen und die Datei &amp;quot;I-BUS_App_Bt.cccfg&amp;quot; (für BT Adapter) oder &amp;quot;I-BUS_App_USB.cccfg&amp;quot; (für USB Adapter)  auswählen.&lt;br /&gt;
# Sofern das passt, kehrt die App zurück zur Startseite und es werden einige Reiter angezeigt. (IBUS-App, DDE/DME, ..)&lt;br /&gt;
# klicken auf den Button &amp;quot;Getrennt&amp;quot; um die Verbindung zum OBD Interface zu aktivieren&lt;br /&gt;
# Wenn noch nicht eingerichtet fragt die App nun ob ein Interface/Adapter eingerichtet werden soll. Dies Bestätigen.&lt;br /&gt;
# OBD Interface aus der Liste wählen und als &amp;quot;OBD Interface&amp;quot; setzen.&lt;br /&gt;
# Es folgt der Hinweis, dass das Interface ggf. konfiguriert werden muss, dies bestätigen.&lt;br /&gt;
# Es öffnet sich die Konfiguration. Diese lassen wie sie ist, speichern und mit dem Pfeil oben links verlassen.&lt;br /&gt;
# Verbindung wird hergestellt.&lt;br /&gt;
# Nach erfolgreicher Verbindung werden die entsprechenden Live-Daten angezeigt.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===='''Vorbereitend für die Datenübertragung an die I-BUS App sollten folgende Einstellungen in den &amp;quot;Globalen Einstellungen&amp;quot; gesetzt werden'''==== &lt;br /&gt;
# Bluetooth einschalten: keine automatische BT-Behandlung&lt;br /&gt;
# BT ausschalten: aus&lt;br /&gt;
# Sperre während Kommunikation: CPU bleibt aktiv&lt;br /&gt;
# Sperre während Datenaufzeichnung: CPU bleibt aktiv&lt;br /&gt;
# Datenaufzeichnung: optional (Logfile..)&lt;br /&gt;
# App starten: Autom. Verbindungsaufbau&lt;br /&gt;
# Broascast: aktiv&lt;br /&gt;
# Ecu Daten überprüfen: nicht aktiv&lt;br /&gt;
# BMW Datenbank: nicht aktiv [Laden dauert sehr lang - nur zum Fehler lesen nötig für mehr Informationen]&lt;br /&gt;
# Debug: optional&lt;br /&gt;
Siehe auch folgendes Bild: &amp;quot;Sollwerte Globale Einstellungen&amp;quot;.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Globale Einstellungen====&lt;br /&gt;
'''Globale Einstellungen sind nur verfügbar, wenn die App NICHT mit dem Fahrzeug verbunden ist!'''&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
DeepOBD_GlobalSettings.jpg|Soll-Werte &amp;quot;Globale Einstellungen&amp;quot;&lt;br /&gt;
DeepOBD_Konfig.jpg|Dialog Konfig auswählen/Konfigurationsgenerator&lt;br /&gt;
DeepOBD_Settings.jpg|Settings&lt;br /&gt;
DeepOBD_Start.jpg|Startseite DeepOBD&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===='''Hinweis zur spezifischen Fehler-Auslese-Konfiguration''' (Erstellung der eigenen errors.ccpage) ====&lt;br /&gt;
Da die Auswahl an auszulesenden Steuergeräten an Baujahr und Ausstattung geknüpft ist, empfehle ich zusätzlich eine Konfiguration passend zum Wagen anzulegen. Dazu:&lt;br /&gt;
# DeepOBD öffnen, ggf. bestehende Verbindung zum Interface trennen.&lt;br /&gt;
# In DeepOBD auf den &amp;quot;Werkzeugschlüssel&amp;quot; klicken und die Funktion &amp;quot;Konfigurationsgenerator&amp;quot; klicken.&lt;br /&gt;
# Im Folgefenster auf &amp;quot;Lesen&amp;quot; klicken, das Auslesen der Ecus beginnt. ggf. Frage zum vollständigen auslesen bestätigen.&lt;br /&gt;
# nach erfolgreichem Auslesen auf den &amp;quot;zurück-Pfeil&amp;quot; klicken und die Frage zum Speichern Konfiguration bestätigen.&lt;br /&gt;
# DeepOBD beenden und einen Dateimanager öffnen. Den Ordner wie oben öffnen. Hier sollte nun ein weiterer Ordner mit eurer Fahrgestellnummer präsent sein.&lt;br /&gt;
# in diesen Ordner gehen und die Datei &amp;quot;Errors.ccpage&amp;quot; suchen, markieren und kopieren&lt;br /&gt;
# zurück in den Ordner &amp;quot;M54&amp;quot; oder &amp;quot;M57&amp;quot; (o.ä.) wechseln und die dort vorhandene Datei &amp;quot;Errors.ccpage&amp;quot; durch die zuvor kopierte ersetzen(!)&amp;lt;br /&amp;gt;&lt;br /&gt;
Weitere Hinweise, wie man eine eigene Konfig manuell erstellt entnehmt ihr bitte der DeepOBD.pdf im Archiv.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Einrichtung der I-BUS App für DeepOBD Live-Werte im OBD-Screen ===&lt;br /&gt;
* Öffnen des I-BUS App Setups, Unterpunkt &amp;quot;Weiteres&amp;quot; und Anzeige des &amp;quot;OBD Bildschirms&amp;quot; aktivieren.&lt;br /&gt;
* Nach App Neustart erscheint oben neben PDC nun der Reiter &amp;quot;OBD&amp;quot;&lt;br /&gt;
* '''bis Android 10''' &lt;br /&gt;
** Rechts auf den Balken &amp;quot;Load&amp;quot; tippen und nun die gleiche Konfigurationsdatei wie auch in DeepOBD wählen, die angezeigt werden soll. z.b. &amp;quot;IBUS_App_BT.cccfg&amp;quot;.&lt;br /&gt;
** Die Datei befindet sich in folgendem Ordner: Speichermedium/'''Android/data/de.holeschak.bmw_de/files/'''configurations/ oder im Unterordner vom Fahrzeugtyp/Motor-Getriebe .. siehe oben.&lt;br /&gt;
* '''ab Android 11''' &lt;br /&gt;
** Rechts auf den Balken &amp;quot;Load&amp;quot; tippen und nun die gleiche Konfigurationsdatei wie auch in DeepOBD wählen, die angezeigt werden soll. z.b. &amp;quot;IBUS_App_BT.cccfg&amp;quot;. &lt;br /&gt;
** Die Datei befindet sich in folgendem Ordner: Speichermedium/'''Download/[..]/'''configurations/ oder im Unterordner vom Fahrzeugtyp/Motor-Getriebe .. siehe oben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
I-BUS App DeepOBD 00.jpg|OBD Menü aktivieren&lt;br /&gt;
I-BUS App DeepOBD 01.jpg|OBD Menü anzeigen&lt;br /&gt;
I-BUS App DeepOBD 02.jpg|DeepOBD Konfig-Ordner öffnen&lt;br /&gt;
I-BUS App DeepOBD 03.jpg|DeepOBD Konfiguration laden&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Einrichtung der I-BUS App für DeepOBD Live-Werte auf dem BC-Screen ===&lt;br /&gt;
Sofern DeepOBD im Hintergrund aktiv läuft und via Broadcast Werte sendet, können diese auf dem BC-Screen der I-BUS App dargestellt werden.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
PB7839BP_DeepOBD_I-BUS.jpg|DeepOBD Live-Werte M57 auf BC-Screen&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Möglich sind hier momentan folgende Werte:&amp;lt;br /&amp;gt;&lt;br /&gt;
* Drehzahl&lt;br /&gt;
* Geschwindigkeit&lt;br /&gt;
* Spannung&lt;br /&gt;
* Ladedruck&amp;lt;sup&amp;gt;2/3&amp;lt;/sup&amp;gt;&lt;br /&gt;
* Leistung&amp;lt;sup&amp;gt;2/4&amp;lt;/sup&amp;gt;&lt;br /&gt;
* Lambda&amp;lt;sup&amp;gt;2/5&amp;lt;/sup&amp;gt;&lt;br /&gt;
* Innenraumtemperatur&amp;lt;sup&amp;gt;6&amp;lt;/sup&amp;gt;&lt;br /&gt;
* Tankinhalt&amp;lt;sup&amp;gt;7&amp;lt;/sup&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; Nur bei M57 (330d / 525d / 530d / 730d / X5 30d).&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt; Anzeige Soll-Ladedruck (blau) und IST-Ladedruck (Orange mit Zahlenwert). Anzeige anstatt der Motortemperatur. Umschaltung mittels langem Drücken auf Schriftzug &amp;quot;Motortemperatur&amp;quot;/&amp;quot;Ladedruck&amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;sup&amp;gt;4&amp;lt;/sup&amp;gt; Anzeige der Leistung aus dem Soll-Moment (Einspritzmenge) der DDE&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;sup&amp;gt;5&amp;lt;/sup&amp;gt; Anzeige des rechn. Lamdba-Wertes aus Luftmasse und Einspritzmenge (Diesel rußen i.d.R. bei Lamdba &amp;lt;1,3 ). Umschaltung mittels langem Drücken auf Schriftzug &amp;quot;Leistung&amp;quot;/&amp;quot;Lambda&amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;sup&amp;gt;6&amp;lt;/sup&amp;gt; Nur nötig für die Anzeige der Innenraumtemperatur bei E38/E39/E53/.. bei E46 und E83 kommt der Wert auch ohne DeepOBD&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;sup&amp;gt;7&amp;lt;/sup&amp;gt; Nur nötige für E38/E39 mit altem Tacho, dass den Wert vom Tankinhalt nicht auf dem I-BUS bereit stellen kann. Entsprechende Config mit diesem Wert ist vorausgesetzt.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Für M47N, M52, M54, M57, M62, M73, S54 und S62 sind entsprechende Konfigurationen in den Beispieldaten (siehe [[DeepOBD_-_Adapter_und_App_einrichten#Zusammenfassung_und_Download|Download]]) enthalten [IBUS_App.ccpage]. Weitere Konfigurationen sind möglich, hierzu bitte [https://ibus-app.de/contact.html#kontakt Kontakt mit dem Team der I-BUS App] aufnehmen.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Anleitung als Video ===&lt;br /&gt;
&amp;lt;big&amp;gt;'''DeepOBD Einrichten ab Android 11:'''&amp;lt;/big&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=IL-z3PYvxFc&amp;lt;/youtube&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''DeepOBD Einrichten:'''&amp;lt;/big&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=sHoUxJQ8Gb8&amp;lt;/youtube&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Vielen Dank an [https://www.facebook.com/ricky.tricky.37 Ricky] für das Video.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''DeepOBD  - eigene Konfig beginnen / Errors.ccpage erstellen:'''&amp;lt;/big&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://youtu.be/ktLMdEab5UQ&amp;lt;/youtube&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''DeepOBD - eigene Konfig erstellen / Errors.ccpage erstellen:'''&amp;lt;/big&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://youtu.be/mHbuQGDIWLg&amp;lt;/youtube&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''DeepOBD  - USB Interface einrichten:'''&amp;lt;/big&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;youtube&amp;gt;&lt;br /&gt;
https://youtu.be/5fjCcAZq6Lw&amp;lt;/youtube&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Hintergrundbild ändern ===&lt;br /&gt;
Es ist möglich das Hintergrundbild der App zu ändern.&amp;lt;br /&amp;gt;&lt;br /&gt;
Dazu einfach ein eigenen Bild als '''Background.jpg''' Datei (ideal in Auflösung vom Bildschirm in den Ordner: '''de.holeschak.bmw_deep_obd\files\Images''' kopieren.&amp;lt;br /&amp;gt;&lt;br /&gt;
(Der &amp;quot;Images&amp;quot; Order muss dafür erstellt werden!)&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
Background.jpg|Beispiel-Hintergrundbild&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== DeepOBD Config Generator ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Ich habe einen web-basierten Config-Generator erstellt.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''[https://download.speedy-pics.de/uploads/android/DeepOBD/DeepOBD_Konfigurator.html DeepOBD Config Generator]'''&amp;lt;/big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Und so funktioniert der Generator:&lt;br /&gt;
* eine zum Fahrzeug passende errors.ccpage erstellen, siehe Video&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://youtu.be/mHbuQGDIWLg&amp;lt;/youtube&amp;gt;&lt;br /&gt;
* ggf. errors.ccpage aus dem DeepOBD Order z.B. unter &amp;quot;downloads&amp;quot; kopieren&lt;br /&gt;
* '''[https://download.speedy-pics.de/uploads/android/DeepOBD/DeepOBD_Konfigurator.html DeepOBD Config Generator]''' öffnen&lt;br /&gt;
* errors.ccpage mit dem '''[https://download.speedy-pics.de/uploads/android/DeepOBD/DeepOBD_Konfigurator.html DeepOBD Config Generator]''' auslesen&lt;br /&gt;
* es werden passende Configs vorgeschlagen, optional kann man eine eigene Liste erstellen&lt;br /&gt;
** dazu können via Checkbox Seiten die auf der errors.ccpage basieren ausgewählt und weitere aus einer Suche ergänzt werden&lt;br /&gt;
* final der Config einen Namen geben und als zip herunterladen.&lt;br /&gt;
* ZIP z.B. mit &amp;quot;RAR&amp;quot; oder &amp;quot;7-zip&amp;quot; entpacken und den Inhalt aufs Android Gerät - auf dem die DeepOBD App läuft - kopieren.&lt;br /&gt;
* den Ordner in das Zielverzeichnis von DeepOBD '''''[...Android/data/de.holeschak.bmw_deep_obd/files/]''''' kopieren&lt;br /&gt;
Ab Android 11:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=IL-z3PYvxFc&amp;lt;/youtube&amp;gt;&lt;br /&gt;
* Config in DeepOBD laden&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Zusammenfassung und Download ==&lt;br /&gt;
&amp;lt;small&amp;gt;Stand: 12.05.2023&amp;lt;/small&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
'''&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;[http://download.speedy-pics.de/uploads/android/DeepOBD.rar Hier findet ihr zum Download Beispielkonfigurationen für M47, M47N, M51, M52, M54, M57, M57N, M62, M73, S54 und S62 Motoren + EA189]&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;''' &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;white&amp;quot;&amp;gt;'''&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;** NEU ** eine Konfiguration für VW/Audi/Seat/Skoda (2.0 TDI EA189 177PS + DSG)&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/font&amp;gt;''' &amp;lt;br /&amp;gt;&lt;br /&gt;
(weitere in Planung), inkl. der Konfig für die Verbindung mit der I-BUS App. Aktuell inkl. &amp;quot;Log-Seite&amp;quot; für M57 Diesel.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;lt;big&amp;gt;'''Die meisten aktuelle Browser verhindern den direkten Download von Archiv-Dateien (*.rar, etc.). Rechtsklick auf den Link und &amp;quot;Link speichern unter&amp;quot; wird funktionieren.'''&amp;lt;/big&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
'''&amp;lt;big&amp;gt;*NEU*&amp;lt;/big&amp;gt;''' Bei fast allen Konfigs ist nun eine Seite &amp;quot;SIA&amp;quot; Zum zurücksetzen des Service-Intervalls enthalten. Bei ausgewählten Dieseln ebenso das anpassen der Frischluftrate und der Leerlauf-Drehzahl. Dazu sind in einigen Konfigs die Anzeigen farbig in Anhängigkeit vom angzeigten Wert. Danke [https://www.facebook.com/flokra85 Florian]! &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;lt;big&amp;gt;'''Nutzung erfolgt auf eigene Gefahr! Wir lehnen jede Haftung für (Folge-)Schäden ab!!!!'''&amp;lt;/big&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Eine pdf-Anleitung ist enthalten.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
'''Download am PC wird empfohlen, da der Download gepackt ist.'''&amp;lt;br /&amp;gt;&lt;br /&gt;
Entpacken des Download Archives am PC z.B. mit [https://www.winrar.de/downld.php '''WinRAR'''] oder auf dem Android Radio mit dem [https://es-file-explorer.de.uptodown.com/android '''ES File Explorer'''].&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== DeepOBD-Mods ==&lt;br /&gt;
'''[https://git.flokra.at/Flo/DeepOBDConf/src/master Hier findet Ihr einige Mods von Florian für DeepOBD Configs.]'''&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
== Weitere Links zu anderen Motoren etc. ==&lt;br /&gt;
'''[https://www.e90-forum.de/forum/thread/58407-app-deep-obd-f%C3%BCr-bmw-logging-jobs-fehler-lesen-und-l%C3%B6schen-sg-reset-registrierun/ App Deep OBD für BMW - Logging | Jobs | Fehler lesen und löschen | SG Reset | Registrierung Batterietausch | Start DPF Regeneration - im E90-forum.de]'''&amp;lt;br /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andre</name></author>
	</entry>
	<entry>
		<id>https://xtrons.ibus-app.de/index.php?title=DeepOBD_-_Adapter_und_App_einrichten&amp;diff=4064</id>
		<title>DeepOBD - Adapter und App einrichten</title>
		<link rel="alternate" type="text/html" href="https://xtrons.ibus-app.de/index.php?title=DeepOBD_-_Adapter_und_App_einrichten&amp;diff=4064"/>
		<updated>2026-10-20T13:08:18Z</updated>

		<summary type="html">&lt;p&gt;Andre: /* DeepOBD Config Generator */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== DeepOBD - Diagnose und Live-Werte ==&lt;br /&gt;
&amp;lt;small&amp;gt;Stand: 04.02.2026&amp;lt;/small&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Was kann die App? ===&lt;br /&gt;
* Fehlerspeicher auslesen - für '''BMW AG''' und auch '''VAG''' [VW, Audi, Skoda, Seat,..]  (ca.2004-2017)&lt;br /&gt;
* Auslesen und Anzeigen von Live-Werten aus alles Steuergeräten (z.b. Motor: Öltemperatur beim M52TU/M54/S54, Ladedruck beim M57,..)&lt;br /&gt;
* ähnliche Funktionen wie BMW Diagnose Software&lt;br /&gt;
* alle Funktion müssen selbst(!) konfiguriert werden, oder aber es werden von uns vorbereitete Konfigurationen genutzt. (Siehe [[DeepOBD_-_Adapter_und_App_einrichten#Zusammenfassung_und_Download|Download]])&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{|&lt;br /&gt;
|&amp;lt;youtube&amp;gt;https://youtu.be/-uNTGxTXcPw&amp;lt;/youtube&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''Beispiel:''' ''BMW E39 M57 530d''&lt;br /&gt;
|&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=XYUfAFopVtg&amp;lt;/youtube&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''Beispiel:''' ''BMW E39 M54 525i''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Was brauche ich? ===&lt;br /&gt;
* Ein Android-Gerät mit voll nutzbarer USB-Schnittstelle („OTG“) oder Bluetooth.&lt;br /&gt;
* Die App „[https://play.google.com/store/apps/details?id=de.holeschak.bmw_deep_obd DeepOBD]“&lt;br /&gt;
* Die zugehörigen ECU Daten (~120MB, können nur in der App herunter geladen werden)&lt;br /&gt;
* Ein OBD2-USB Diagnose-Interface (wie für BMW Diagnose Software) oder das [https://shop.ibus-app.de/detail/index/sArticle/258 '''speziell für „DeepOBD“ erstellte Bluetooth Interface'''] '''[alle anderen, ggf. ähnlich aussehenden BT-Interface funktionieren NICHT!]'''&lt;br /&gt;
* Eine voll-belegte OBD2 Diagnose-Schnittstelle (optional temporär eine OBD1 Diagnose-Schnittstelle PLUS einen Adapter auf OBD2). Sofern OBD1 und OBD2 verbaut sind (einige E38/E39/E46), so muss OBD2 vervollständigt werden (Stichwort &amp;quot;PIN 7+8&amp;quot;) ==&amp;gt; [http://download.speedy-pics.de/uploads/weblink/obd1-obd2.pdf Nachrüstung oder Vervollständigung der OBD2 Diagnose Buchse (V1.3 2021-02-27) [BMW E38/E39/E46&amp;lt;nowiki&amp;gt;]&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* Geduld und etwas Muse :o)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alle weiteren Infos findet ihr (in English!) auf der [https://ediabaslib.codeplex.com/wikipage?title=Deep%20OBD%20for%20BMW Homepage des Entwicklers].&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Bluetooth Interface ===&lt;br /&gt;
Es existiert auf dem Markt nur zwei für die App nutzbare OBDII-Bluetooth Interfaces.&lt;br /&gt;
# &amp;lt;big&amp;gt;'''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;NEU&amp;lt;/font&amp;gt; Das von Herr Holeschak angepasste und geprüfte [https://shop.ibus-app.de/detail/index/sArticle/258 Deep OBD Interface gibt es endlich auch im I-BUS App-Shop]'''&amp;lt;/big&amp;gt;.&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;&lt;br /&gt;
# Das eine kommt direkt vom Entwickler, der es bei ebay als [https://www.ebay.de/usr/uh-xy Verkäufer uh-xy] anbietet.&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Andere, optisch identische Interface funktionieren nicht, das sowohl Hard- als auch Software modifiziert werden.'''&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
DeepOBD Interface 1.png|DeepOBD Interface im I-BUS App Shop&lt;br /&gt;
DeepOBD Interface 2.png|DeepOBD Interface im I-BUS App Shop&lt;br /&gt;
DeepOBD Interface 3.png|DeepOBD Interface im I-BUS App Shop&lt;br /&gt;
DeepOBD Interface.jpg|DeepOBD Interface bei ebay&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;Das Interface basiert auf einem Xtrons OBD02 - wurde aber von Herrn Holeschak selbst modifiziert (Hardware und Firmware) und getestet. Damit es als solches erkannt werden kann haben wir ihm einem entsprechenden Sticker spendiert.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;Nutzbar sind '''nur''' die Interface mit dem '''Chip BC417''' und einer '''Brücke zw. Pin 7+8''' ( für BMW E38/E39/E46/E53). Entsprechend ist das Interface zu bestellen.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Koppelung des Bluetooth Interfaces ===&lt;br /&gt;
Wir empfehlen das Interface zuerst im Telefon-Menü des Android-Radios (bei Handy und Tablet egal!) und '''nicht''' im Bluetooth-Menü zu koppeln.&amp;lt;br /&amp;gt;&lt;br /&gt;
Das Interface rückt damit nur in die Liste der verbundenen Geräte, wird aber keine Farbänderung (wie bei Xtrons, hier wird z.b. der Smartphone-Name grün bei aktiver Verbindung) vollziehen.&amp;lt;br /&amp;gt;&lt;br /&gt;
Allerdings wird in der Statusleiste das blaue OBD-Icon erscheinen. '''Nur''' wenn dieses erscheint, wird eine Verbindung zur App DeepOBD erfolgreich sein.&amp;lt;br /&amp;gt;&lt;br /&gt;
Erscheint das Icon, können wir zur App über gehen.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
'''&amp;lt;big&amp;gt;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;WICHTIG für alle neuen Xtrons (MA-, PQS- und IQ-Serie) sowie AVIN (PX6 und Qualcomm): Bluetooth-PIN vom Radio(!!!!) auf &amp;quot;1234&amp;quot; (entsprechend dem vom DeepOBD Interface) ändern, damit das Pairen funktioniert!&amp;lt;/font&amp;gt;&amp;lt;/big&amp;gt;'''&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
MCU2.png|Beispielbild OBDII Icon&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
==== Fehlerbehandlung Interface Kopplung ====&lt;br /&gt;
Erscheint das blaue OBD Icon nach Kopplung nicht oder das Interface wird nicht gefunden, kann es helfen:&lt;br /&gt;
* das Interface aus- und an zu schalten und erneut zu suchen und pairen&lt;br /&gt;
* das Interface aus der Liste zu löschen und erneut zu suchen und pairen&lt;br /&gt;
* das Interface aus der Liste zu löschen, alle Verbindungen (DeepOBD) zu beenden, Namen und PIN vom Radio zu änder und anschließend Interface neu suchen und pairen&lt;br /&gt;
* '''&amp;lt;big&amp;gt;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;WICHTIG für alle neuen Xtrons (MA-, PQS- und IQ-Serie) sowie AVIN (PX6 und Qualcomm): Bluetooth-PIN vom Radio(!!!!) auf &amp;quot;1234&amp;quot; (entsprechend dem vom DeepOBD Interface) ändern, damit das Pairen funktioniert!&amp;lt;/font&amp;gt;&amp;lt;/big&amp;gt;'''&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== USB Interface ===&lt;br /&gt;
Neben dem speziellen Bluetooth Interface funktioniert jedes USB-Interface, mit dem man auch die bekannten BMW Programme nutzen kann.&amp;lt;br /&amp;gt;&lt;br /&gt;
Wichtig ist aber auch hier, dass die Brücke zw. PIN 7+8 gesetzt wird.&amp;lt;br /&amp;gt;&lt;br /&gt;
Es genügt daher jedes beliebige &amp;quot;KKL USB OBD2&amp;quot; Interface (auch wenn es als &amp;quot;nur für VAG geeignet&amp;quot; deklariert ist). man bekommt diese ab ~10..15€ bei amazon oder ebay etc.&amp;lt;br /&amp;gt;&lt;br /&gt;
Natürlich geht auch jedes BMW spezifisches Interface mit der Beschreibung &amp;quot;K+D CAN&amp;quot;, aber auch hier muss sichergestellt werden, dass die Brücke gesetzt ist!&amp;lt;br /&amp;gt;&lt;br /&gt;
Eingerichtet wird es stets als &amp;quot;FTDI USB Interface&amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
K+D CAN.jpg|K+D CAN OBD2 USB Interface&lt;br /&gt;
Interface Brücke7+8.jpg|Brücke PIN 7+8 im OBD2 USB Interface&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Einrichtung von DeepOBD ===&lt;br /&gt;
Bitte aktuell die pdf im [https://xtrons.ibus-app.de/index.php?title=DeepOBD_-_Adapter_und_App_einrichten#Zusammenfassung_und_Download Download (pdf-File im Archiv)] lesen oder das [https://www.youtube.com/watch?v=sHoUxJQ8Gb8 Video zur Einrichtung] ansehen.&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
====Basis ist die App &amp;quot;Deep OBD&amp;quot; sowie ein passendes Interface====&lt;br /&gt;
# DeepOBD-App installieren&lt;br /&gt;
# Einrichtungs-Anfrage der App abbrechen, oben rechts auf den &amp;quot;Pfeil nach unten&amp;quot; tippen und in die &amp;quot;Globalen Einstellungen&amp;quot; der App gehen. '''Speichermedium &amp;quot;Standard&amp;quot; auf &amp;quot;..emulated/0&amp;quot; ändern'''. Menü schließen.&lt;br /&gt;
# Erneut auf den &amp;quot;Pfeil nach unten&amp;quot; tippen und &amp;quot;ECU Daten entpacken&amp;quot; erst jetzt auswählen. (auf dem internen Speicher dauert das ca. 2..15 Minuten, auf externen Laufwerken wesentlich länger!)&lt;br /&gt;
# Kopiere aus dem Dowload-Archiv den Ordner &amp;quot;Configurations&amp;quot; auf einen USB-Stick/SD Karte und geht damit an das Android-Radio/-Tablett/-Handy auf dem die App eingerichtet ist.&lt;br /&gt;
#'''bis Android 10:''' Sucht mit dem Dateimanager (o.ä.)  den Ordner: ''...Android/data/de.holeschak.bmw_deep_obd/files/'' [entweder interner Ordner oder SD-Karte, im Zweifel beide!]&lt;br /&gt;
## Den kompletten Ordner &amp;quot;Configurations&amp;quot; in das Verzeichnis hinein kopieren&lt;br /&gt;
## Dateimanager schließen&lt;br /&gt;
#'''ab Android 11''': das Verzeichnis &amp;quot;Configurations&amp;quot; mit dem Dateimanager in den Ordner &amp;quot;Downloads&amp;quot; im internen Speicher kopieren&lt;br /&gt;
## DeepOBD &lt;br /&gt;
##Öffnen Einstellungen &lt;br /&gt;
##globale Einstellungen &lt;br /&gt;
##&amp;quot;Verzeichnis zur App kopieren&amp;quot; &lt;br /&gt;
##Ordner &amp;quot;Download&amp;quot; öffnen und den Ordner &amp;quot;Configurations&amp;quot; antippen &lt;br /&gt;
##Ansicht wechsel in den DeepOBD Ordner &lt;br /&gt;
##wechseln auf die Ebene so dass &amp;quot;de.holeschak.bmw_deep_obd&amp;quot; zu sehen ist, lange auf diese Zeile tippen &lt;br /&gt;
##Meldung, ob die Daten dahin kopiert werden sollen bestätigen &lt;br /&gt;
##geduldig warten, '''das kann einige Minuten dauern - allein schon bis zum Beginn des Kopiervorganges!'''&lt;br /&gt;
# Deep OBD öffnen und Zündung anschalten&lt;br /&gt;
# In DeepOBD auf den &amp;quot;Pfeil nach unten&amp;quot; klicken und die Funktion &amp;quot;Konfiguration&amp;quot; klicken. Es öffnet sich der Dialog zur Auswahl einer Konfiguration. Nun den Ordner oben suchen und öffnen und den passenden Unterordner zur Modellreihe (E38/E39/E46/E53/E83) öffnen, dort dann die passende Konfig für Motor/Getriebe &amp;quot;M57&amp;quot;, &amp;quot;M54&amp;quot;,.. öffnen und die Datei &amp;quot;I-BUS_App_Bt.cccfg&amp;quot; (für BT Adapter) oder &amp;quot;I-BUS_App_USB.cccfg&amp;quot; (für USB Adapter)  auswählen.&lt;br /&gt;
# Sofern das passt, kehrt die App zurück zur Startseite und es werden einige Reiter angezeigt. (IBUS-App, DDE/DME, ..)&lt;br /&gt;
# klicken auf den Button &amp;quot;Getrennt&amp;quot; um die Verbindung zum OBD Interface zu aktivieren&lt;br /&gt;
# Wenn noch nicht eingerichtet fragt die App nun ob ein Interface/Adapter eingerichtet werden soll. Dies Bestätigen.&lt;br /&gt;
# OBD Interface aus der Liste wählen und als &amp;quot;OBD Interface&amp;quot; setzen.&lt;br /&gt;
# Es folgt der Hinweis, dass das Interface ggf. konfiguriert werden muss, dies bestätigen.&lt;br /&gt;
# Es öffnet sich die Konfiguration. Diese lassen wie sie ist, speichern und mit dem Pfeil oben links verlassen.&lt;br /&gt;
# Verbindung wird hergestellt.&lt;br /&gt;
# Nach erfolgreicher Verbindung werden die entsprechenden Live-Daten angezeigt.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===='''Vorbereitend für die Datenübertragung an die I-BUS App sollten folgende Einstellungen in den &amp;quot;Globalen Einstellungen&amp;quot; gesetzt werden'''==== &lt;br /&gt;
# Bluetooth einschalten: keine automatische BT-Behandlung&lt;br /&gt;
# BT ausschalten: aus&lt;br /&gt;
# Sperre während Kommunikation: CPU bleibt aktiv&lt;br /&gt;
# Sperre während Datenaufzeichnung: CPU bleibt aktiv&lt;br /&gt;
# Datenaufzeichnung: optional (Logfile..)&lt;br /&gt;
# App starten: Autom. Verbindungsaufbau&lt;br /&gt;
# Broascast: aktiv&lt;br /&gt;
# Ecu Daten überprüfen: nicht aktiv&lt;br /&gt;
# BMW Datenbank: nicht aktiv [Laden dauert sehr lang - nur zum Fehler lesen nötig für mehr Informationen]&lt;br /&gt;
# Debug: optional&lt;br /&gt;
Siehe auch folgendes Bild: &amp;quot;Sollwerte Globale Einstellungen&amp;quot;.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Globale Einstellungen====&lt;br /&gt;
'''Globale Einstellungen sind nur verfügbar, wenn die App NICHT mit dem Fahrzeug verbunden ist!'''&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
DeepOBD_GlobalSettings.jpg|Soll-Werte &amp;quot;Globale Einstellungen&amp;quot;&lt;br /&gt;
DeepOBD_Konfig.jpg|Dialog Konfig auswählen/Konfigurationsgenerator&lt;br /&gt;
DeepOBD_Settings.jpg|Settings&lt;br /&gt;
DeepOBD_Start.jpg|Startseite DeepOBD&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===='''Hinweis zur spezifischen Fehler-Auslese-Konfiguration''' (Erstellung der eigenen errors.ccpage) ====&lt;br /&gt;
Da die Auswahl an auszulesenden Steuergeräten an Baujahr und Ausstattung geknüpft ist, empfehle ich zusätzlich eine Konfiguration passend zum Wagen anzulegen. Dazu:&lt;br /&gt;
# DeepOBD öffnen, ggf. bestehende Verbindung zum Interface trennen.&lt;br /&gt;
# In DeepOBD auf den &amp;quot;Werkzeugschlüssel&amp;quot; klicken und die Funktion &amp;quot;Konfigurationsgenerator&amp;quot; klicken.&lt;br /&gt;
# Im Folgefenster auf &amp;quot;Lesen&amp;quot; klicken, das Auslesen der Ecus beginnt. ggf. Frage zum vollständigen auslesen bestätigen.&lt;br /&gt;
# nach erfolgreichem Auslesen auf den &amp;quot;zurück-Pfeil&amp;quot; klicken und die Frage zum Speichern Konfiguration bestätigen.&lt;br /&gt;
# DeepOBD beenden und einen Dateimanager öffnen. Den Ordner wie oben öffnen. Hier sollte nun ein weiterer Ordner mit eurer Fahrgestellnummer präsent sein.&lt;br /&gt;
# in diesen Ordner gehen und die Datei &amp;quot;Errors.ccpage&amp;quot; suchen, markieren und kopieren&lt;br /&gt;
# zurück in den Ordner &amp;quot;M54&amp;quot; oder &amp;quot;M57&amp;quot; (o.ä.) wechseln und die dort vorhandene Datei &amp;quot;Errors.ccpage&amp;quot; durch die zuvor kopierte ersetzen(!)&amp;lt;br /&amp;gt;&lt;br /&gt;
Weitere Hinweise, wie man eine eigene Konfig manuell erstellt entnehmt ihr bitte der DeepOBD.pdf im Archiv.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Einrichtung der I-BUS App für DeepOBD Live-Werte im OBD-Screen ===&lt;br /&gt;
* Öffnen des I-BUS App Setups, Unterpunkt &amp;quot;Weiteres&amp;quot; und Anzeige des &amp;quot;OBD Bildschirms&amp;quot; aktivieren.&lt;br /&gt;
* Nach App Neustart erscheint oben neben PDC nun der Reiter &amp;quot;OBD&amp;quot;&lt;br /&gt;
* '''bis Android 10''' &lt;br /&gt;
** Rechts auf den Balken &amp;quot;Load&amp;quot; tippen und nun die gleiche Konfigurationsdatei wie auch in DeepOBD wählen, die angezeigt werden soll. z.b. &amp;quot;IBUS_App_BT.cccfg&amp;quot;.&lt;br /&gt;
** Die Datei befindet sich in folgendem Ordner: Speichermedium/'''Android/data/de.holeschak.bmw_de/files/'''configurations/ oder im Unterordner vom Fahrzeugtyp/Motor-Getriebe .. siehe oben.&lt;br /&gt;
* '''ab Android 11''' &lt;br /&gt;
** Rechts auf den Balken &amp;quot;Load&amp;quot; tippen und nun die gleiche Konfigurationsdatei wie auch in DeepOBD wählen, die angezeigt werden soll. z.b. &amp;quot;IBUS_App_BT.cccfg&amp;quot;. &lt;br /&gt;
** Die Datei befindet sich in folgendem Ordner: Speichermedium/'''Download/[..]/'''configurations/ oder im Unterordner vom Fahrzeugtyp/Motor-Getriebe .. siehe oben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
I-BUS App DeepOBD 00.jpg|OBD Menü aktivieren&lt;br /&gt;
I-BUS App DeepOBD 01.jpg|OBD Menü anzeigen&lt;br /&gt;
I-BUS App DeepOBD 02.jpg|DeepOBD Konfig-Ordner öffnen&lt;br /&gt;
I-BUS App DeepOBD 03.jpg|DeepOBD Konfiguration laden&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Einrichtung der I-BUS App für DeepOBD Live-Werte auf dem BC-Screen ===&lt;br /&gt;
Sofern DeepOBD im Hintergrund aktiv läuft und via Broadcast Werte sendet, können diese auf dem BC-Screen der I-BUS App dargestellt werden.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
PB7839BP_DeepOBD_I-BUS.jpg|DeepOBD Live-Werte M57 auf BC-Screen&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Möglich sind hier momentan folgende Werte:&amp;lt;br /&amp;gt;&lt;br /&gt;
* Drehzahl&lt;br /&gt;
* Geschwindigkeit&lt;br /&gt;
* Spannung&lt;br /&gt;
* Ladedruck&amp;lt;sup&amp;gt;2/3&amp;lt;/sup&amp;gt;&lt;br /&gt;
* Leistung&amp;lt;sup&amp;gt;2/4&amp;lt;/sup&amp;gt;&lt;br /&gt;
* Lambda&amp;lt;sup&amp;gt;2/5&amp;lt;/sup&amp;gt;&lt;br /&gt;
* Innenraumtemperatur&amp;lt;sup&amp;gt;6&amp;lt;/sup&amp;gt;&lt;br /&gt;
* Tankinhalt&amp;lt;sup&amp;gt;7&amp;lt;/sup&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; Nur bei M57 (330d / 525d / 530d / 730d / X5 30d).&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt; Anzeige Soll-Ladedruck (blau) und IST-Ladedruck (Orange mit Zahlenwert). Anzeige anstatt der Motortemperatur. Umschaltung mittels langem Drücken auf Schriftzug &amp;quot;Motortemperatur&amp;quot;/&amp;quot;Ladedruck&amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;sup&amp;gt;4&amp;lt;/sup&amp;gt; Anzeige der Leistung aus dem Soll-Moment (Einspritzmenge) der DDE&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;sup&amp;gt;5&amp;lt;/sup&amp;gt; Anzeige des rechn. Lamdba-Wertes aus Luftmasse und Einspritzmenge (Diesel rußen i.d.R. bei Lamdba &amp;lt;1,3 ). Umschaltung mittels langem Drücken auf Schriftzug &amp;quot;Leistung&amp;quot;/&amp;quot;Lambda&amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;sup&amp;gt;6&amp;lt;/sup&amp;gt; Nur nötig für die Anzeige der Innenraumtemperatur bei E38/E39/E53/.. bei E46 und E83 kommt der Wert auch ohne DeepOBD&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;sup&amp;gt;7&amp;lt;/sup&amp;gt; Nur nötige für E38/E39 mit altem Tacho, dass den Wert vom Tankinhalt nicht auf dem I-BUS bereit stellen kann. Entsprechende Config mit diesem Wert ist vorausgesetzt.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Für M47N, M52, M54, M57, M62, M73, S54 und S62 sind entsprechende Konfigurationen in den Beispieldaten (siehe [[DeepOBD_-_Adapter_und_App_einrichten#Zusammenfassung_und_Download|Download]]) enthalten [IBUS_App.ccpage]. Weitere Konfigurationen sind möglich, hierzu bitte [https://ibus-app.de/contact.html#kontakt Kontakt mit dem Team der I-BUS App] aufnehmen.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Anleitung als Video ===&lt;br /&gt;
&amp;lt;big&amp;gt;'''DeepOBD Einrichten ab Android 11:'''&amp;lt;/big&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=IL-z3PYvxFc&amp;lt;/youtube&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''DeepOBD Einrichten:'''&amp;lt;/big&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=sHoUxJQ8Gb8&amp;lt;/youtube&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Vielen Dank an [https://www.facebook.com/ricky.tricky.37 Ricky] für das Video.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''DeepOBD  - eigene Konfig beginnen / Errors.ccpage erstellen:'''&amp;lt;/big&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://youtu.be/ktLMdEab5UQ&amp;lt;/youtube&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''DeepOBD - eigene Konfig erstellen / Errors.ccpage erstellen:'''&amp;lt;/big&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://youtu.be/mHbuQGDIWLg&amp;lt;/youtube&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''DeepOBD  - USB Interface einrichten:'''&amp;lt;/big&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;youtube&amp;gt;&lt;br /&gt;
https://youtu.be/5fjCcAZq6Lw&amp;lt;/youtube&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Hintergrundbild ändern ===&lt;br /&gt;
Es ist möglich das Hintergrundbild der App zu ändern.&amp;lt;br /&amp;gt;&lt;br /&gt;
Dazu einfach ein eigenen Bild als '''Background.jpg''' Datei (ideal in Auflösung vom Bildschirm in den Ordner: '''de.holeschak.bmw_deep_obd\files\Images''' kopieren.&amp;lt;br /&amp;gt;&lt;br /&gt;
(Der &amp;quot;Images&amp;quot; Order muss dafür erstellt werden!)&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
Background.jpg|Beispiel-Hintergrundbild&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== DeepOBD Config Generator ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Ich habe einen web-basierten Config-Generator erstellt.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''[https://download.speedy-pics.de/uploads/android/DeepOBD/DeepOBD_Konfigurator.html DeepOBD Config Generator]'''&amp;lt;/big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Und so funktioniert der Generator:&lt;br /&gt;
# eine zum Fahrzeug passende errors.ccpage erstellen, siehe Video&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://youtu.be/mHbuQGDIWLg&amp;lt;/youtube&amp;gt;&lt;br /&gt;
# ggf. errors.ccpage aus dem DeepOBD Order z.B. unter &amp;quot;downloads&amp;quot; kopieren&lt;br /&gt;
# '''[https://download.speedy-pics.de/uploads/android/DeepOBD/DeepOBD_Konfigurator.html DeepOBD Config Generator]''' öffnen&lt;br /&gt;
# errors.ccpage mit dem '''[https://download.speedy-pics.de/uploads/android/DeepOBD/DeepOBD_Konfigurator.html DeepOBD Config Generator]''' auslesen&lt;br /&gt;
# es werden passende Configs vorgeschlagen, optional kann man eine eigene Liste erstellen&lt;br /&gt;
## dazu können via Checkbox Seiten die auf der errors.ccpage basieren ausgewählt und weitere aus einer Suche ergänzt werden&lt;br /&gt;
# final der Config einen Namen geben und als zip herunterladen.&lt;br /&gt;
# ZIP z.B. mit &amp;quot;RAR&amp;quot; oder &amp;quot;7-zip&amp;quot; entpacken und den Inhalt aufs Android Gerät - auf dem die DeepOBD App läuft - kopieren.&lt;br /&gt;
# den Ordner in das Zielverzeichnis von DeepOBD '''''[...Android/data/de.holeschak.bmw_deep_obd/files/]''''' kopieren&lt;br /&gt;
Ab Android 11:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=IL-z3PYvxFc&amp;lt;/youtube&amp;gt;&lt;br /&gt;
# Config in DeepOBD laden&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Zusammenfassung und Download ==&lt;br /&gt;
&amp;lt;small&amp;gt;Stand: 12.05.2023&amp;lt;/small&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
'''&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;[http://download.speedy-pics.de/uploads/android/DeepOBD.rar Hier findet ihr zum Download Beispielkonfigurationen für M47, M47N, M51, M52, M54, M57, M57N, M62, M73, S54 und S62 Motoren + EA189]&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;''' &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;white&amp;quot;&amp;gt;'''&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;** NEU ** eine Konfiguration für VW/Audi/Seat/Skoda (2.0 TDI EA189 177PS + DSG)&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/font&amp;gt;''' &amp;lt;br /&amp;gt;&lt;br /&gt;
(weitere in Planung), inkl. der Konfig für die Verbindung mit der I-BUS App. Aktuell inkl. &amp;quot;Log-Seite&amp;quot; für M57 Diesel.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;lt;big&amp;gt;'''Die meisten aktuelle Browser verhindern den direkten Download von Archiv-Dateien (*.rar, etc.). Rechtsklick auf den Link und &amp;quot;Link speichern unter&amp;quot; wird funktionieren.'''&amp;lt;/big&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
'''&amp;lt;big&amp;gt;*NEU*&amp;lt;/big&amp;gt;''' Bei fast allen Konfigs ist nun eine Seite &amp;quot;SIA&amp;quot; Zum zurücksetzen des Service-Intervalls enthalten. Bei ausgewählten Dieseln ebenso das anpassen der Frischluftrate und der Leerlauf-Drehzahl. Dazu sind in einigen Konfigs die Anzeigen farbig in Anhängigkeit vom angzeigten Wert. Danke [https://www.facebook.com/flokra85 Florian]! &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;lt;big&amp;gt;'''Nutzung erfolgt auf eigene Gefahr! Wir lehnen jede Haftung für (Folge-)Schäden ab!!!!'''&amp;lt;/big&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Eine pdf-Anleitung ist enthalten.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
'''Download am PC wird empfohlen, da der Download gepackt ist.'''&amp;lt;br /&amp;gt;&lt;br /&gt;
Entpacken des Download Archives am PC z.B. mit [https://www.winrar.de/downld.php '''WinRAR'''] oder auf dem Android Radio mit dem [https://es-file-explorer.de.uptodown.com/android '''ES File Explorer'''].&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== DeepOBD-Mods ==&lt;br /&gt;
'''[https://git.flokra.at/Flo/DeepOBDConf/src/master Hier findet Ihr einige Mods von Florian für DeepOBD Configs.]'''&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
== Weitere Links zu anderen Motoren etc. ==&lt;br /&gt;
'''[https://www.e90-forum.de/forum/thread/58407-app-deep-obd-f%C3%BCr-bmw-logging-jobs-fehler-lesen-und-l%C3%B6schen-sg-reset-registrierun/ App Deep OBD für BMW - Logging | Jobs | Fehler lesen und löschen | SG Reset | Registrierung Batterietausch | Start DPF Regeneration - im E90-forum.de]'''&amp;lt;br /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andre</name></author>
	</entry>
	<entry>
		<id>https://xtrons.ibus-app.de/index.php?title=DeepOBD_-_Adapter_und_App_einrichten&amp;diff=4063</id>
		<title>DeepOBD - Adapter und App einrichten</title>
		<link rel="alternate" type="text/html" href="https://xtrons.ibus-app.de/index.php?title=DeepOBD_-_Adapter_und_App_einrichten&amp;diff=4063"/>
		<updated>2026-10-20T13:04:07Z</updated>

		<summary type="html">&lt;p&gt;Andre: /* Zusammenfassung und Download */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== DeepOBD - Diagnose und Live-Werte ==&lt;br /&gt;
&amp;lt;small&amp;gt;Stand: 04.02.2026&amp;lt;/small&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Was kann die App? ===&lt;br /&gt;
* Fehlerspeicher auslesen - für '''BMW AG''' und auch '''VAG''' [VW, Audi, Skoda, Seat,..]  (ca.2004-2017)&lt;br /&gt;
* Auslesen und Anzeigen von Live-Werten aus alles Steuergeräten (z.b. Motor: Öltemperatur beim M52TU/M54/S54, Ladedruck beim M57,..)&lt;br /&gt;
* ähnliche Funktionen wie BMW Diagnose Software&lt;br /&gt;
* alle Funktion müssen selbst(!) konfiguriert werden, oder aber es werden von uns vorbereitete Konfigurationen genutzt. (Siehe [[DeepOBD_-_Adapter_und_App_einrichten#Zusammenfassung_und_Download|Download]])&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{|&lt;br /&gt;
|&amp;lt;youtube&amp;gt;https://youtu.be/-uNTGxTXcPw&amp;lt;/youtube&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''Beispiel:''' ''BMW E39 M57 530d''&lt;br /&gt;
|&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=XYUfAFopVtg&amp;lt;/youtube&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''Beispiel:''' ''BMW E39 M54 525i''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Was brauche ich? ===&lt;br /&gt;
* Ein Android-Gerät mit voll nutzbarer USB-Schnittstelle („OTG“) oder Bluetooth.&lt;br /&gt;
* Die App „[https://play.google.com/store/apps/details?id=de.holeschak.bmw_deep_obd DeepOBD]“&lt;br /&gt;
* Die zugehörigen ECU Daten (~120MB, können nur in der App herunter geladen werden)&lt;br /&gt;
* Ein OBD2-USB Diagnose-Interface (wie für BMW Diagnose Software) oder das [https://shop.ibus-app.de/detail/index/sArticle/258 '''speziell für „DeepOBD“ erstellte Bluetooth Interface'''] '''[alle anderen, ggf. ähnlich aussehenden BT-Interface funktionieren NICHT!]'''&lt;br /&gt;
* Eine voll-belegte OBD2 Diagnose-Schnittstelle (optional temporär eine OBD1 Diagnose-Schnittstelle PLUS einen Adapter auf OBD2). Sofern OBD1 und OBD2 verbaut sind (einige E38/E39/E46), so muss OBD2 vervollständigt werden (Stichwort &amp;quot;PIN 7+8&amp;quot;) ==&amp;gt; [http://download.speedy-pics.de/uploads/weblink/obd1-obd2.pdf Nachrüstung oder Vervollständigung der OBD2 Diagnose Buchse (V1.3 2021-02-27) [BMW E38/E39/E46&amp;lt;nowiki&amp;gt;]&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* Geduld und etwas Muse :o)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alle weiteren Infos findet ihr (in English!) auf der [https://ediabaslib.codeplex.com/wikipage?title=Deep%20OBD%20for%20BMW Homepage des Entwicklers].&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Bluetooth Interface ===&lt;br /&gt;
Es existiert auf dem Markt nur zwei für die App nutzbare OBDII-Bluetooth Interfaces.&lt;br /&gt;
# &amp;lt;big&amp;gt;'''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;NEU&amp;lt;/font&amp;gt; Das von Herr Holeschak angepasste und geprüfte [https://shop.ibus-app.de/detail/index/sArticle/258 Deep OBD Interface gibt es endlich auch im I-BUS App-Shop]'''&amp;lt;/big&amp;gt;.&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;&lt;br /&gt;
# Das eine kommt direkt vom Entwickler, der es bei ebay als [https://www.ebay.de/usr/uh-xy Verkäufer uh-xy] anbietet.&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Andere, optisch identische Interface funktionieren nicht, das sowohl Hard- als auch Software modifiziert werden.'''&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
DeepOBD Interface 1.png|DeepOBD Interface im I-BUS App Shop&lt;br /&gt;
DeepOBD Interface 2.png|DeepOBD Interface im I-BUS App Shop&lt;br /&gt;
DeepOBD Interface 3.png|DeepOBD Interface im I-BUS App Shop&lt;br /&gt;
DeepOBD Interface.jpg|DeepOBD Interface bei ebay&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;Das Interface basiert auf einem Xtrons OBD02 - wurde aber von Herrn Holeschak selbst modifiziert (Hardware und Firmware) und getestet. Damit es als solches erkannt werden kann haben wir ihm einem entsprechenden Sticker spendiert.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;Nutzbar sind '''nur''' die Interface mit dem '''Chip BC417''' und einer '''Brücke zw. Pin 7+8''' ( für BMW E38/E39/E46/E53). Entsprechend ist das Interface zu bestellen.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Koppelung des Bluetooth Interfaces ===&lt;br /&gt;
Wir empfehlen das Interface zuerst im Telefon-Menü des Android-Radios (bei Handy und Tablet egal!) und '''nicht''' im Bluetooth-Menü zu koppeln.&amp;lt;br /&amp;gt;&lt;br /&gt;
Das Interface rückt damit nur in die Liste der verbundenen Geräte, wird aber keine Farbänderung (wie bei Xtrons, hier wird z.b. der Smartphone-Name grün bei aktiver Verbindung) vollziehen.&amp;lt;br /&amp;gt;&lt;br /&gt;
Allerdings wird in der Statusleiste das blaue OBD-Icon erscheinen. '''Nur''' wenn dieses erscheint, wird eine Verbindung zur App DeepOBD erfolgreich sein.&amp;lt;br /&amp;gt;&lt;br /&gt;
Erscheint das Icon, können wir zur App über gehen.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
'''&amp;lt;big&amp;gt;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;WICHTIG für alle neuen Xtrons (MA-, PQS- und IQ-Serie) sowie AVIN (PX6 und Qualcomm): Bluetooth-PIN vom Radio(!!!!) auf &amp;quot;1234&amp;quot; (entsprechend dem vom DeepOBD Interface) ändern, damit das Pairen funktioniert!&amp;lt;/font&amp;gt;&amp;lt;/big&amp;gt;'''&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
MCU2.png|Beispielbild OBDII Icon&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
==== Fehlerbehandlung Interface Kopplung ====&lt;br /&gt;
Erscheint das blaue OBD Icon nach Kopplung nicht oder das Interface wird nicht gefunden, kann es helfen:&lt;br /&gt;
* das Interface aus- und an zu schalten und erneut zu suchen und pairen&lt;br /&gt;
* das Interface aus der Liste zu löschen und erneut zu suchen und pairen&lt;br /&gt;
* das Interface aus der Liste zu löschen, alle Verbindungen (DeepOBD) zu beenden, Namen und PIN vom Radio zu änder und anschließend Interface neu suchen und pairen&lt;br /&gt;
* '''&amp;lt;big&amp;gt;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;WICHTIG für alle neuen Xtrons (MA-, PQS- und IQ-Serie) sowie AVIN (PX6 und Qualcomm): Bluetooth-PIN vom Radio(!!!!) auf &amp;quot;1234&amp;quot; (entsprechend dem vom DeepOBD Interface) ändern, damit das Pairen funktioniert!&amp;lt;/font&amp;gt;&amp;lt;/big&amp;gt;'''&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== USB Interface ===&lt;br /&gt;
Neben dem speziellen Bluetooth Interface funktioniert jedes USB-Interface, mit dem man auch die bekannten BMW Programme nutzen kann.&amp;lt;br /&amp;gt;&lt;br /&gt;
Wichtig ist aber auch hier, dass die Brücke zw. PIN 7+8 gesetzt wird.&amp;lt;br /&amp;gt;&lt;br /&gt;
Es genügt daher jedes beliebige &amp;quot;KKL USB OBD2&amp;quot; Interface (auch wenn es als &amp;quot;nur für VAG geeignet&amp;quot; deklariert ist). man bekommt diese ab ~10..15€ bei amazon oder ebay etc.&amp;lt;br /&amp;gt;&lt;br /&gt;
Natürlich geht auch jedes BMW spezifisches Interface mit der Beschreibung &amp;quot;K+D CAN&amp;quot;, aber auch hier muss sichergestellt werden, dass die Brücke gesetzt ist!&amp;lt;br /&amp;gt;&lt;br /&gt;
Eingerichtet wird es stets als &amp;quot;FTDI USB Interface&amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
K+D CAN.jpg|K+D CAN OBD2 USB Interface&lt;br /&gt;
Interface Brücke7+8.jpg|Brücke PIN 7+8 im OBD2 USB Interface&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Einrichtung von DeepOBD ===&lt;br /&gt;
Bitte aktuell die pdf im [https://xtrons.ibus-app.de/index.php?title=DeepOBD_-_Adapter_und_App_einrichten#Zusammenfassung_und_Download Download (pdf-File im Archiv)] lesen oder das [https://www.youtube.com/watch?v=sHoUxJQ8Gb8 Video zur Einrichtung] ansehen.&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
====Basis ist die App &amp;quot;Deep OBD&amp;quot; sowie ein passendes Interface====&lt;br /&gt;
# DeepOBD-App installieren&lt;br /&gt;
# Einrichtungs-Anfrage der App abbrechen, oben rechts auf den &amp;quot;Pfeil nach unten&amp;quot; tippen und in die &amp;quot;Globalen Einstellungen&amp;quot; der App gehen. '''Speichermedium &amp;quot;Standard&amp;quot; auf &amp;quot;..emulated/0&amp;quot; ändern'''. Menü schließen.&lt;br /&gt;
# Erneut auf den &amp;quot;Pfeil nach unten&amp;quot; tippen und &amp;quot;ECU Daten entpacken&amp;quot; erst jetzt auswählen. (auf dem internen Speicher dauert das ca. 2..15 Minuten, auf externen Laufwerken wesentlich länger!)&lt;br /&gt;
# Kopiere aus dem Dowload-Archiv den Ordner &amp;quot;Configurations&amp;quot; auf einen USB-Stick/SD Karte und geht damit an das Android-Radio/-Tablett/-Handy auf dem die App eingerichtet ist.&lt;br /&gt;
#'''bis Android 10:''' Sucht mit dem Dateimanager (o.ä.)  den Ordner: ''...Android/data/de.holeschak.bmw_deep_obd/files/'' [entweder interner Ordner oder SD-Karte, im Zweifel beide!]&lt;br /&gt;
## Den kompletten Ordner &amp;quot;Configurations&amp;quot; in das Verzeichnis hinein kopieren&lt;br /&gt;
## Dateimanager schließen&lt;br /&gt;
#'''ab Android 11''': das Verzeichnis &amp;quot;Configurations&amp;quot; mit dem Dateimanager in den Ordner &amp;quot;Downloads&amp;quot; im internen Speicher kopieren&lt;br /&gt;
## DeepOBD &lt;br /&gt;
##Öffnen Einstellungen &lt;br /&gt;
##globale Einstellungen &lt;br /&gt;
##&amp;quot;Verzeichnis zur App kopieren&amp;quot; &lt;br /&gt;
##Ordner &amp;quot;Download&amp;quot; öffnen und den Ordner &amp;quot;Configurations&amp;quot; antippen &lt;br /&gt;
##Ansicht wechsel in den DeepOBD Ordner &lt;br /&gt;
##wechseln auf die Ebene so dass &amp;quot;de.holeschak.bmw_deep_obd&amp;quot; zu sehen ist, lange auf diese Zeile tippen &lt;br /&gt;
##Meldung, ob die Daten dahin kopiert werden sollen bestätigen &lt;br /&gt;
##geduldig warten, '''das kann einige Minuten dauern - allein schon bis zum Beginn des Kopiervorganges!'''&lt;br /&gt;
# Deep OBD öffnen und Zündung anschalten&lt;br /&gt;
# In DeepOBD auf den &amp;quot;Pfeil nach unten&amp;quot; klicken und die Funktion &amp;quot;Konfiguration&amp;quot; klicken. Es öffnet sich der Dialog zur Auswahl einer Konfiguration. Nun den Ordner oben suchen und öffnen und den passenden Unterordner zur Modellreihe (E38/E39/E46/E53/E83) öffnen, dort dann die passende Konfig für Motor/Getriebe &amp;quot;M57&amp;quot;, &amp;quot;M54&amp;quot;,.. öffnen und die Datei &amp;quot;I-BUS_App_Bt.cccfg&amp;quot; (für BT Adapter) oder &amp;quot;I-BUS_App_USB.cccfg&amp;quot; (für USB Adapter)  auswählen.&lt;br /&gt;
# Sofern das passt, kehrt die App zurück zur Startseite und es werden einige Reiter angezeigt. (IBUS-App, DDE/DME, ..)&lt;br /&gt;
# klicken auf den Button &amp;quot;Getrennt&amp;quot; um die Verbindung zum OBD Interface zu aktivieren&lt;br /&gt;
# Wenn noch nicht eingerichtet fragt die App nun ob ein Interface/Adapter eingerichtet werden soll. Dies Bestätigen.&lt;br /&gt;
# OBD Interface aus der Liste wählen und als &amp;quot;OBD Interface&amp;quot; setzen.&lt;br /&gt;
# Es folgt der Hinweis, dass das Interface ggf. konfiguriert werden muss, dies bestätigen.&lt;br /&gt;
# Es öffnet sich die Konfiguration. Diese lassen wie sie ist, speichern und mit dem Pfeil oben links verlassen.&lt;br /&gt;
# Verbindung wird hergestellt.&lt;br /&gt;
# Nach erfolgreicher Verbindung werden die entsprechenden Live-Daten angezeigt.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===='''Vorbereitend für die Datenübertragung an die I-BUS App sollten folgende Einstellungen in den &amp;quot;Globalen Einstellungen&amp;quot; gesetzt werden'''==== &lt;br /&gt;
# Bluetooth einschalten: keine automatische BT-Behandlung&lt;br /&gt;
# BT ausschalten: aus&lt;br /&gt;
# Sperre während Kommunikation: CPU bleibt aktiv&lt;br /&gt;
# Sperre während Datenaufzeichnung: CPU bleibt aktiv&lt;br /&gt;
# Datenaufzeichnung: optional (Logfile..)&lt;br /&gt;
# App starten: Autom. Verbindungsaufbau&lt;br /&gt;
# Broascast: aktiv&lt;br /&gt;
# Ecu Daten überprüfen: nicht aktiv&lt;br /&gt;
# BMW Datenbank: nicht aktiv [Laden dauert sehr lang - nur zum Fehler lesen nötig für mehr Informationen]&lt;br /&gt;
# Debug: optional&lt;br /&gt;
Siehe auch folgendes Bild: &amp;quot;Sollwerte Globale Einstellungen&amp;quot;.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Globale Einstellungen====&lt;br /&gt;
'''Globale Einstellungen sind nur verfügbar, wenn die App NICHT mit dem Fahrzeug verbunden ist!'''&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
DeepOBD_GlobalSettings.jpg|Soll-Werte &amp;quot;Globale Einstellungen&amp;quot;&lt;br /&gt;
DeepOBD_Konfig.jpg|Dialog Konfig auswählen/Konfigurationsgenerator&lt;br /&gt;
DeepOBD_Settings.jpg|Settings&lt;br /&gt;
DeepOBD_Start.jpg|Startseite DeepOBD&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===='''Hinweis zur spezifischen Fehler-Auslese-Konfiguration''' (Erstellung der eigenen errors.ccpage) ====&lt;br /&gt;
Da die Auswahl an auszulesenden Steuergeräten an Baujahr und Ausstattung geknüpft ist, empfehle ich zusätzlich eine Konfiguration passend zum Wagen anzulegen. Dazu:&lt;br /&gt;
# DeepOBD öffnen, ggf. bestehende Verbindung zum Interface trennen.&lt;br /&gt;
# In DeepOBD auf den &amp;quot;Werkzeugschlüssel&amp;quot; klicken und die Funktion &amp;quot;Konfigurationsgenerator&amp;quot; klicken.&lt;br /&gt;
# Im Folgefenster auf &amp;quot;Lesen&amp;quot; klicken, das Auslesen der Ecus beginnt. ggf. Frage zum vollständigen auslesen bestätigen.&lt;br /&gt;
# nach erfolgreichem Auslesen auf den &amp;quot;zurück-Pfeil&amp;quot; klicken und die Frage zum Speichern Konfiguration bestätigen.&lt;br /&gt;
# DeepOBD beenden und einen Dateimanager öffnen. Den Ordner wie oben öffnen. Hier sollte nun ein weiterer Ordner mit eurer Fahrgestellnummer präsent sein.&lt;br /&gt;
# in diesen Ordner gehen und die Datei &amp;quot;Errors.ccpage&amp;quot; suchen, markieren und kopieren&lt;br /&gt;
# zurück in den Ordner &amp;quot;M54&amp;quot; oder &amp;quot;M57&amp;quot; (o.ä.) wechseln und die dort vorhandene Datei &amp;quot;Errors.ccpage&amp;quot; durch die zuvor kopierte ersetzen(!)&amp;lt;br /&amp;gt;&lt;br /&gt;
Weitere Hinweise, wie man eine eigene Konfig manuell erstellt entnehmt ihr bitte der DeepOBD.pdf im Archiv.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Einrichtung der I-BUS App für DeepOBD Live-Werte im OBD-Screen ===&lt;br /&gt;
* Öffnen des I-BUS App Setups, Unterpunkt &amp;quot;Weiteres&amp;quot; und Anzeige des &amp;quot;OBD Bildschirms&amp;quot; aktivieren.&lt;br /&gt;
* Nach App Neustart erscheint oben neben PDC nun der Reiter &amp;quot;OBD&amp;quot;&lt;br /&gt;
* '''bis Android 10''' &lt;br /&gt;
** Rechts auf den Balken &amp;quot;Load&amp;quot; tippen und nun die gleiche Konfigurationsdatei wie auch in DeepOBD wählen, die angezeigt werden soll. z.b. &amp;quot;IBUS_App_BT.cccfg&amp;quot;.&lt;br /&gt;
** Die Datei befindet sich in folgendem Ordner: Speichermedium/'''Android/data/de.holeschak.bmw_de/files/'''configurations/ oder im Unterordner vom Fahrzeugtyp/Motor-Getriebe .. siehe oben.&lt;br /&gt;
* '''ab Android 11''' &lt;br /&gt;
** Rechts auf den Balken &amp;quot;Load&amp;quot; tippen und nun die gleiche Konfigurationsdatei wie auch in DeepOBD wählen, die angezeigt werden soll. z.b. &amp;quot;IBUS_App_BT.cccfg&amp;quot;. &lt;br /&gt;
** Die Datei befindet sich in folgendem Ordner: Speichermedium/'''Download/[..]/'''configurations/ oder im Unterordner vom Fahrzeugtyp/Motor-Getriebe .. siehe oben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
I-BUS App DeepOBD 00.jpg|OBD Menü aktivieren&lt;br /&gt;
I-BUS App DeepOBD 01.jpg|OBD Menü anzeigen&lt;br /&gt;
I-BUS App DeepOBD 02.jpg|DeepOBD Konfig-Ordner öffnen&lt;br /&gt;
I-BUS App DeepOBD 03.jpg|DeepOBD Konfiguration laden&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Einrichtung der I-BUS App für DeepOBD Live-Werte auf dem BC-Screen ===&lt;br /&gt;
Sofern DeepOBD im Hintergrund aktiv läuft und via Broadcast Werte sendet, können diese auf dem BC-Screen der I-BUS App dargestellt werden.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
PB7839BP_DeepOBD_I-BUS.jpg|DeepOBD Live-Werte M57 auf BC-Screen&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Möglich sind hier momentan folgende Werte:&amp;lt;br /&amp;gt;&lt;br /&gt;
* Drehzahl&lt;br /&gt;
* Geschwindigkeit&lt;br /&gt;
* Spannung&lt;br /&gt;
* Ladedruck&amp;lt;sup&amp;gt;2/3&amp;lt;/sup&amp;gt;&lt;br /&gt;
* Leistung&amp;lt;sup&amp;gt;2/4&amp;lt;/sup&amp;gt;&lt;br /&gt;
* Lambda&amp;lt;sup&amp;gt;2/5&amp;lt;/sup&amp;gt;&lt;br /&gt;
* Innenraumtemperatur&amp;lt;sup&amp;gt;6&amp;lt;/sup&amp;gt;&lt;br /&gt;
* Tankinhalt&amp;lt;sup&amp;gt;7&amp;lt;/sup&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; Nur bei M57 (330d / 525d / 530d / 730d / X5 30d).&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt; Anzeige Soll-Ladedruck (blau) und IST-Ladedruck (Orange mit Zahlenwert). Anzeige anstatt der Motortemperatur. Umschaltung mittels langem Drücken auf Schriftzug &amp;quot;Motortemperatur&amp;quot;/&amp;quot;Ladedruck&amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;sup&amp;gt;4&amp;lt;/sup&amp;gt; Anzeige der Leistung aus dem Soll-Moment (Einspritzmenge) der DDE&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;sup&amp;gt;5&amp;lt;/sup&amp;gt; Anzeige des rechn. Lamdba-Wertes aus Luftmasse und Einspritzmenge (Diesel rußen i.d.R. bei Lamdba &amp;lt;1,3 ). Umschaltung mittels langem Drücken auf Schriftzug &amp;quot;Leistung&amp;quot;/&amp;quot;Lambda&amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;sup&amp;gt;6&amp;lt;/sup&amp;gt; Nur nötig für die Anzeige der Innenraumtemperatur bei E38/E39/E53/.. bei E46 und E83 kommt der Wert auch ohne DeepOBD&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;sup&amp;gt;7&amp;lt;/sup&amp;gt; Nur nötige für E38/E39 mit altem Tacho, dass den Wert vom Tankinhalt nicht auf dem I-BUS bereit stellen kann. Entsprechende Config mit diesem Wert ist vorausgesetzt.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Für M47N, M52, M54, M57, M62, M73, S54 und S62 sind entsprechende Konfigurationen in den Beispieldaten (siehe [[DeepOBD_-_Adapter_und_App_einrichten#Zusammenfassung_und_Download|Download]]) enthalten [IBUS_App.ccpage]. Weitere Konfigurationen sind möglich, hierzu bitte [https://ibus-app.de/contact.html#kontakt Kontakt mit dem Team der I-BUS App] aufnehmen.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Anleitung als Video ===&lt;br /&gt;
&amp;lt;big&amp;gt;'''DeepOBD Einrichten ab Android 11:'''&amp;lt;/big&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=IL-z3PYvxFc&amp;lt;/youtube&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''DeepOBD Einrichten:'''&amp;lt;/big&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=sHoUxJQ8Gb8&amp;lt;/youtube&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Vielen Dank an [https://www.facebook.com/ricky.tricky.37 Ricky] für das Video.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''DeepOBD  - eigene Konfig beginnen / Errors.ccpage erstellen:'''&amp;lt;/big&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://youtu.be/ktLMdEab5UQ&amp;lt;/youtube&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''DeepOBD - eigene Konfig erstellen / Errors.ccpage erstellen:'''&amp;lt;/big&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://youtu.be/mHbuQGDIWLg&amp;lt;/youtube&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''DeepOBD  - USB Interface einrichten:'''&amp;lt;/big&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;youtube&amp;gt;&lt;br /&gt;
https://youtu.be/5fjCcAZq6Lw&amp;lt;/youtube&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Hintergrundbild ändern ===&lt;br /&gt;
Es ist möglich das Hintergrundbild der App zu ändern.&amp;lt;br /&amp;gt;&lt;br /&gt;
Dazu einfach ein eigenen Bild als '''Background.jpg''' Datei (ideal in Auflösung vom Bildschirm in den Ordner: '''de.holeschak.bmw_deep_obd\files\Images''' kopieren.&amp;lt;br /&amp;gt;&lt;br /&gt;
(Der &amp;quot;Images&amp;quot; Order muss dafür erstellt werden!)&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
Background.jpg|Beispiel-Hintergrundbild&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== DeepOBD Config Generator ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Ich habe einen web-basierten Config-Generator erstellt.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''[https://download.speedy-pics.de/uploads/android/DeepOBD/DeepOBD_Konfigurator.html DeepOBD Config Generator]'''&amp;lt;/big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Und so funktioniert der Generator:&lt;br /&gt;
# eine zum Fahrzeug passende errors.ccpage erstellen, siehe Video oben&lt;br /&gt;
# ggf. errors.ccpage aus dem DeepOBD Order z.B. unter &amp;quot;downloads&amp;quot; kopieren&lt;br /&gt;
# '''[https://download.speedy-pics.de/uploads/android/DeepOBD/DeepOBD_Konfigurator.html DeepOBD Config Generator]''' öffnen&lt;br /&gt;
# errors.ccpage mit dem '''[https://download.speedy-pics.de/uploads/android/DeepOBD/DeepOBD_Konfigurator.html DeepOBD Config Generator]''' auslesen&lt;br /&gt;
# es werden passende Configs vorgeschlagen, optional kann man eine eigene Liste erstellen&lt;br /&gt;
## dazu können via Checkbox Seiten die auf der errors.ccpage basieren ausgewählt und weitere aus einer Suche ergänzt werden&lt;br /&gt;
# final der Config einen Namen geben und als zip herunterladen.&lt;br /&gt;
# ZIP z.B. mit &amp;quot;RAR&amp;quot; oder &amp;quot;7-zip&amp;quot; entpacken und den Inhalt aufs Android Gerät - auf dem die DeepOBD App läuft - kopieren.&lt;br /&gt;
# den Ordner in das Zielverzeichnis von DeepOBD kopieren &lt;br /&gt;
# Config in DeepOBD laden&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Zusammenfassung und Download ==&lt;br /&gt;
&amp;lt;small&amp;gt;Stand: 12.05.2023&amp;lt;/small&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
'''&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;[http://download.speedy-pics.de/uploads/android/DeepOBD.rar Hier findet ihr zum Download Beispielkonfigurationen für M47, M47N, M51, M52, M54, M57, M57N, M62, M73, S54 und S62 Motoren + EA189]&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;''' &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;white&amp;quot;&amp;gt;'''&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;** NEU ** eine Konfiguration für VW/Audi/Seat/Skoda (2.0 TDI EA189 177PS + DSG)&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/font&amp;gt;''' &amp;lt;br /&amp;gt;&lt;br /&gt;
(weitere in Planung), inkl. der Konfig für die Verbindung mit der I-BUS App. Aktuell inkl. &amp;quot;Log-Seite&amp;quot; für M57 Diesel.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;lt;big&amp;gt;'''Die meisten aktuelle Browser verhindern den direkten Download von Archiv-Dateien (*.rar, etc.). Rechtsklick auf den Link und &amp;quot;Link speichern unter&amp;quot; wird funktionieren.'''&amp;lt;/big&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
'''&amp;lt;big&amp;gt;*NEU*&amp;lt;/big&amp;gt;''' Bei fast allen Konfigs ist nun eine Seite &amp;quot;SIA&amp;quot; Zum zurücksetzen des Service-Intervalls enthalten. Bei ausgewählten Dieseln ebenso das anpassen der Frischluftrate und der Leerlauf-Drehzahl. Dazu sind in einigen Konfigs die Anzeigen farbig in Anhängigkeit vom angzeigten Wert. Danke [https://www.facebook.com/flokra85 Florian]! &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;lt;big&amp;gt;'''Nutzung erfolgt auf eigene Gefahr! Wir lehnen jede Haftung für (Folge-)Schäden ab!!!!'''&amp;lt;/big&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Eine pdf-Anleitung ist enthalten.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
'''Download am PC wird empfohlen, da der Download gepackt ist.'''&amp;lt;br /&amp;gt;&lt;br /&gt;
Entpacken des Download Archives am PC z.B. mit [https://www.winrar.de/downld.php '''WinRAR'''] oder auf dem Android Radio mit dem [https://es-file-explorer.de.uptodown.com/android '''ES File Explorer'''].&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== DeepOBD-Mods ==&lt;br /&gt;
'''[https://git.flokra.at/Flo/DeepOBDConf/src/master Hier findet Ihr einige Mods von Florian für DeepOBD Configs.]'''&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
== Weitere Links zu anderen Motoren etc. ==&lt;br /&gt;
'''[https://www.e90-forum.de/forum/thread/58407-app-deep-obd-f%C3%BCr-bmw-logging-jobs-fehler-lesen-und-l%C3%B6schen-sg-reset-registrierun/ App Deep OBD für BMW - Logging | Jobs | Fehler lesen und löschen | SG Reset | Registrierung Batterietausch | Start DPF Regeneration - im E90-forum.de]'''&amp;lt;br /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andre</name></author>
	</entry>
	<entry>
		<id>https://xtrons.ibus-app.de/index.php?title=Xtrons_IQ-IBUS-Serie&amp;diff=4062</id>
		<title>Xtrons IQ-IBUS-Serie</title>
		<link rel="alternate" type="text/html" href="https://xtrons.ibus-app.de/index.php?title=Xtrons_IQ-IBUS-Serie&amp;diff=4062"/>
		<updated>2026-10-14T09:11:02Z</updated>

		<summary type="html">&lt;p&gt;Andre: /* Firmware und MCU für IQx3xx */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--  Seite in Arbeit --&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Technische Daten ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Bezugsquelle für '''[https://shop.ibus-app.de/detail/index/sArticle/390 IQ7439BL]''', '''[https://shop.ibus-app.de/detail/index/sArticle/374 IQ7446IBUS ]''', '''[https://shop.ibus-app.de/detail/index/sArticle/375 IQ1439IBUS ]''' und '''[https://shop.ibus-app.de/detail/index/sArticle/379 IQ1453BH ]''' ausschließlich im I-BUS App Shop.&amp;lt;br /&amp;gt;&lt;br /&gt;
* Qualcomm 665 CPU&lt;br /&gt;
* 8GB RAM&lt;br /&gt;
* 256GB Speicher&lt;br /&gt;
* echtes Android 13 (API Level 33)&lt;br /&gt;
* OEM-nahes Frontpanel&lt;br /&gt;
** weder DVD-Laufwerk noch SD-Slots&lt;br /&gt;
** verbesserte Haptik der Tasten&lt;br /&gt;
* hochauflösendes IPS Display&lt;br /&gt;
* extrem kurze Bauform (passt auch in der BMW E38)&lt;br /&gt;
* integriertes wireless Carplay und Android Auto&lt;br /&gt;
* eingebautes DSP (keine Steuerung des DSP ab Werk)&lt;br /&gt;
* Endstufe TDA7851 (4* 45W)&lt;br /&gt;
* unterstützung von AHD-Kameras bis 1920x1080&lt;br /&gt;
* integrierter Lüfter&lt;br /&gt;
* digitaler Ausgang&lt;br /&gt;
* Anschlussstecker für Resler Modul&lt;br /&gt;
* Dualband-WiFi (2,4 und 5 GHz)&lt;br /&gt;
* Unterstützung der originalen Lenkradtasten&lt;br /&gt;
* Bluetooth 5.0&lt;br /&gt;
* 3x USB&lt;br /&gt;
* SIM Karten-Leser für uintegriertes 4G Modem&lt;br /&gt;
* GPS Antenne für Navigation &lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
IQ7339IBUS 01.jpg|Xtrons IQ7339IBUS für BMW  E39 7&amp;quot; Qualcomm 665 / 8GB / 256GB&lt;br /&gt;
IQ7339IBUS 02.jpg|Xtrons IQ7339IBUS Rückansicht&lt;br /&gt;
IQ7339IBUS 03.jpg|Xtrons IQ7339IBUS Zubehör&lt;br /&gt;
IQ7339IBUS 04.jpg|Xtrons IQ7339IBUS Stecker für Resler Modul/Interface&lt;br /&gt;
IQ7339IBUS 05.jpg|Xtrons IQ7339IBUS Draufsicht&lt;br /&gt;
IQ7339IBUS 06.jpg|Xtrons IQ7339IBUS CPU Info: API 33&lt;br /&gt;
IQ7339IBUS 07.jpg|Xtrons IQ7339IBUS Abmessungen&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hier sollen einige Hinweise zur Xtrons IQ Serie - speziell für die Version &amp;quot;IBUS&amp;quot; erscheinen ==&lt;br /&gt;
# Code Für Werkseinstellungen: 126&lt;br /&gt;
# '''aktuelle Firmware:''' ''Link folgt''&lt;br /&gt;
# '''externes Mikrofon:''' Android-Einstellungen =&amp;gt; CAR =&amp;gt; Werkseinstellungen (Code: 126) =&amp;gt;  weitere Einstellungen ==&amp;gt; Mikrofon auf &amp;quot;Extern&amp;quot; ändern&lt;br /&gt;
# '''Rückfahrkamera:''' [https://xtrons.ibus-app.de/index.php?title=Abschalten_des_schwarzen_Bildschirms_(R%C3%BCckfahrkamera)_beim_Einlegen_des_R%C3%BCckw%C3%A4rtsganges#ab_Android_8 (De-)Aktivieren der Rückfahrkamera beim IQ]&lt;br /&gt;
# [https://xtrons.ibus-app.de/index.php?title=Bootlogo_%C3%A4ndern#Boot-Logo_%C3%A4ndern_f%C3%BCr_andere_Radios_(z.B._Xtrons_IX-Serie_etc.) Bootlogo ändern]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Unboxing ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Unboxing Video:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://youtu.be/NazHVVhhcqo&amp;lt;/youtube&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
== Anschlüsse ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''Hier ein Anschlussplan des Xtrons IQ7339IBUS.&amp;lt;br&amp;gt;&lt;br /&gt;
Ergänzt ist der '''[https://shop.ibus-app.de/detail/index/sArticle/392 Anschlussadapter für das Resler-Modul]''', der nur bei Geräten mit der Endung &amp;quot;..IBUS&amp;quot; in der Artikelnummer bzw. dem IQ7439BL &amp;quot;mit I-BUS-App Paket&amp;quot; enthalten ist.'''&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
IQ7339IBUS pinout.jpg|Radioanschlüsse&lt;br /&gt;
IQ7439IBUS 01.jpg|Anschluss mit Resler Modul und IBUS-Adapter&lt;br /&gt;
AdapterXtrons01.jpg|Anschlussadapter für das Resler-Modul&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Einbau-Video ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Einbau-Video:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=hny-gJQQ6Tc&amp;lt;/youtube&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Menü-Übersicht/Einstellungen ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Genereller Hinweis: einige Menü-Punkte und Funktionen können je nach Version der Firmware komplett oder geringfügig anders benannt sein.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== DSP / Equalizer (IQ7339IBUS) ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
DSP- und Equalizer Einstellungen.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
03 IQ7339IBUS Androidsetup CAR 03 EQ 01.png|DSP - Equalizer&lt;br /&gt;
03 IQ7339IBUS Androidsetup CAR 03 EQ 02.png|DSP - Loundness, Bassboost etc.&lt;br /&gt;
03 IQ7339IBUS Androidsetup CAR 03 EQ 03.png|DSP - Fader + Balance&lt;br /&gt;
03 IQ7339IBUS Androidsetup CAR 03 EQ 04.png|DSP - Laufzeitkorrektur&lt;br /&gt;
03 IQ7339IBUS Androidsetup CAR 03 EQ 01.png|DSP - Setup Laufzeitkorrektur&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
Mehr Info zum Thema [https://xtrons.ibus-app.de/index.php?title=Was_ist_DSP%3F_Digitaler_Soundprozessor#High_Pass_Filter_und_Low_Pass_Filter_(HPF/LPF) Low/Highpass] und [https://xtrons.ibus-app.de/index.php?title=Was_ist_DSP%3F_Digitaler_Soundprozessor#Laufzeitkorrektur_(LZK) Laufzeitkorrektur].&amp;lt;br&amp;gt;&lt;br /&gt;
'''Info zur Laufzeitkorrektur beim IQ: man setzt hier den Abstand zwischen den Lautsprechern links-recht und vorn-hinten im Wagen. Die Subwoofer-Position ist nicht separat einstellbar!'''&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
=== DSP / Equalizer (IQx4xxIBUS) ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
DSP- und Equalizer Einstellungen.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
03 IQx4xxIBUS Androidsetup CAR 03 EQ 01.jpg|DSP - Equalizer&lt;br /&gt;
03 IQx4xxIBUS Androidsetup CAR 03 EQ 02.jpg|DSP - Laufzeitkorrektur&lt;br /&gt;
03 IQx4xxIBUS Androidsetup CAR 03 EQ 03.jpg|DSP - DTS&lt;br /&gt;
03 IQx4xxIBUS Androidsetup CAR 03 EQ 04.jpg|DSP - separate Lautstärken&lt;br /&gt;
03 IQx4xxIBUS Androidsetup CAR 03 EQ 05.jpg|DSP - High/LowPass Einstellungen&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
Das IQx4xxIBUS verfügt neben dem DSP noch über &amp;quot;DTS&amp;quot;. Hier können u.a. ein virtueller Center Lautsprecher im Armaturenbrett und div. Klangfarben gesetzt werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Mehr Info zum Thema [https://xtrons.ibus-app.de/index.php?title=Was_ist_DSP%3F_Digitaler_Soundprozessor#High_Pass_Filter_und_Low_Pass_Filter_(HPF/LPF) Low/Highpass] und [https://xtrons.ibus-app.de/index.php?title=Was_ist_DSP%3F_Digitaler_Soundprozessor#Laufzeitkorrektur_(LZK) Laufzeitkorrektur].&amp;lt;br&amp;gt;&lt;br /&gt;
'''Info zur Laufzeitkorrektur beim IQ: man setzt hier den Abstand zwischen den Lautsprechern links-recht und vorn-hinten im Wagen. Die Subwoofer-Position ist nicht separat einstellbar!'''&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Android-Setup===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
00 IQ7339IBUS Androidsetup.png|Android-Einstellung&lt;br /&gt;
01 IQ7339IBUS Androidsetup Netzwerk.png|Netzwerke&lt;br /&gt;
02 IQ7339IBUS Androidsetup Verbundene-Geräte.png|Verbundene Geräte&lt;br /&gt;
03 IQ7339IBUS Androidsetup CAR.png|CAR&lt;br /&gt;
03 IQ7339IBUS Androidsetup CAR 01.png|CAR =&amp;gt; LED&lt;br /&gt;
03 IQ7339IBUS Androidsetup CAR 02.png|CAR =&amp;gt; Lenkradtasten anlernen. HINWEIS: Funktioniert so nicht für BMW E39/E38 !&lt;br /&gt;
03 IQ7339IBUS Androidsetup CAR 03.png|CAR =&amp;gt; Navi-Einstellungen&lt;br /&gt;
03 IQ7339IBUS Androidsetup CAR 04.png|CAR =&amp;gt; Voice-Assistent&lt;br /&gt;
03 IQ7339IBUS Androidsetup CAR 05.png|CAR =&amp;gt; Fahreinstellungen&lt;br /&gt;
03 IQ7339IBUS Androidsetup CAR 06.png|CAR =&amp;gt; Extra-Einstellungen&lt;br /&gt;
04 IQ7339IBUS Androidsetup Apps.png|Apps&lt;br /&gt;
05 IQ7339IBUS Androidsetup Benachrichtigungen.png|Benachrichtigungen&lt;br /&gt;
06 IQ7339IBUS Androidsetup Speicher.png|Speicher&lt;br /&gt;
07 IQ7339IBUS Androidsetup Ton+Vibration.png| Ton &amp;amp; Vibration&lt;br /&gt;
08 IQ7339IBUS Androidsetup Display.png|Display&lt;br /&gt;
09 IQ7339IBUS Androidsetup Hintergrund.png|Hintergrund&lt;br /&gt;
10 IQ7339IBUS Androidsetup Sicherheit.png|Sicherheit&lt;br /&gt;
11 IQ7339IBUS Androidsetup Datenschutz.png|Datenschutz&lt;br /&gt;
12 IQ7339IBUS Androidsetup Standort.png|Standort&lt;br /&gt;
14 IQ7339IBUS Androidsetup Screenshot 01.png|Screenshot&lt;br /&gt;
14 IQ7339IBUS Androidsetup Screenshot 01.png|Screenshot (&amp;quot;erweitert&amp;quot; und &amp;quot;teilen&amp;quot;)&lt;br /&gt;
15 IQ7339IBUS Androidsetup System.png|System - Sprache und Zeit anpassen, MCU- und System-Updates&lt;br /&gt;
16 IQ7339IBUS Androidsetup Über.png|Über das Tablet&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
=== Werkseinstellungen ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Erreichbar über Android-Setup =&amp;gt; CAR =&amp;gt; Werkseinstellungen: Code: 126&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
03 IQ7339IBUS Androidsetup CAR 09 factorysettings 01.jpg|Code für Werkseinstellungen&lt;br /&gt;
03 IQ7339IBUS Androidsetup CAR 09 factorysettings 02.jpg|App Einstellungen&lt;br /&gt;
03 IQ7339IBUS Androidsetup CAR 09 factorysettings 03.jpg|Boot Logo&lt;br /&gt;
03 IQ7339IBUS Androidsetup CAR 09 factorysettings 05.jpg|Radio&lt;br /&gt;
03 IQ7339IBUS Androidsetup CAR 09 factorysettings 05a.png|Lautstärken&lt;br /&gt;
16_Werkseinstellungen_CAN.jpeg|CAN BUS Einstellungen&lt;br /&gt;
03 IQ7339IBUS Androidsetup CAR 09 factorysettings 04.jpg|Tasten und Touch anlernen&lt;br /&gt;
03 IQ7339IBUS Androidsetup CAR 09 factorysettings 06.jpg|Tasten anlernen&lt;br /&gt;
03 IQ7339IBUS Androidsetup CAR 09 factorysettings 07.jpg|Tasten anlernen&lt;br /&gt;
03 IQ7339IBUS Androidsetup CAR 09 factorysettings 08.jpg|Display Einstellungen&lt;br /&gt;
03 IQ7339IBUS Androidsetup CAR 09 factorysettings 09.jpg|Weitere Einstellungen&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wichtige Einstellungen für BMW E39 in Verbindung mit der I-BUS App ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Einige Funktionen für den BC kann das IQ selbst, aber  teils funktioniert das nicht korrekt. Daher ideal diese Funktionen deaktivieren und über die I-BUS App nutzen.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== CAN Einstellung===&lt;br /&gt;
&amp;lt;br&amp;gt;CAN-Einstellung in den Werkseinstellungen unter &amp;quot;CAN&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
Auswahl:&lt;br /&gt;
# Canbus: &amp;quot;135 BMW E46 (LZ)&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
# Typ: VFL: &amp;quot;0H&amp;quot; // FL: &amp;quot;1H&amp;quot;&lt;br /&gt;
# Amplifier: &amp;quot;without Amplifier&amp;quot; '''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;'''&lt;br /&gt;
# Front door: &amp;quot;Hide&amp;quot;&lt;br /&gt;
# Air condition: &amp;quot;Hide&amp;quot;&lt;br /&gt;
# Backdoor: &amp;quot;Hide&amp;quot;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;''' Vor allem wichtig bei DSP ab Werk um die hohe Lautstärke nach Radiostart zu unterbinden. Ton kommt dann erst, nach dem die [http://www.ibus-app.de I-BUS App] läuft und das DSP startet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
16 Werkseinstellungen CAN.jpeg|CAN BUS Einstellungen&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Car Setup App ===&lt;br /&gt;
Die &amp;quot;Car Setup&amp;quot; App ist von Werk installiert.&amp;lt;br&amp;gt;&lt;br /&gt;
Hier bitte die folgenden Optionen deaktivieren:&lt;br /&gt;
# Speed limit activation&lt;br /&gt;
# Memo&lt;br /&gt;
# AUD+OBD&lt;br /&gt;
Ob und wie gut die anderen Funktionen hier arbeiten muss noch geprüft werden.&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
Car Setup.jpeg|Car Setup&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Digitaler Ausgang am Xtrons und BMW DSP ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Das Xtrons IQ7339IBUS verfügt über einen digitalen Ausgang als S/PDIF (COAX) via Cinch und optisch via TOSLINK&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
Der Nachfolger Xtrons IQ7439IBUS (bzw. IQ7439BL, IQ7446BL, IQ1439BL, IQ1453BL..) verfügt über einen digitalen Ausgang optisch via TOSLINK&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
Die DSP Endstufe des BMW E39 verfügt über einen digitalen Eingang (SMB-Buchse) der das S/PDIF Signal unterstützt. Entsprechend kann man den Ton digital aus dem Xtrons direkt in die DSP Endstufe (sofern vorhanden!) verlust- und störungsfrei übertragen. Hierfür benötigt man ein Kabel mit Cinch-Stecker und SMB-Stecker mit ca. 6m Länge. Aktuell wird es über ein normales Cinchkabel, Adapter Cinch auf FAKRA und Adapter FAKRA auf SMB zum Test genutzt. &amp;lt;br&amp;gt;&lt;br /&gt;
Hier das passende Kabel: [https://shop.ibus-app.de/i-bus-app/zubehoer/adapterkabel/372/anschlusskabel-xtrons-koaxial-an-dsp-endstufe-cinch-m-smb-f-6m?number=Cinch-SMB Anschlusskabel Xtrons koaxial an DSP-Endstufe, Cinch(m)-SMB(f), 6m]&amp;lt;br&amp;gt;&lt;br /&gt;
'''WICHTIG:''' damit das DSP umschaltet auf  den digitalen Eingang, muss man diesen in der I-BUS App umschalten auf &amp;quot;CD-Wechsler&amp;quot;. Eine detaillierte Anleitung folgt.&amp;lt;br&amp;gt;&lt;br /&gt;
'''HINWEIS:''' Beim BMW E39 Facelift ist der CD-Wechsler über das Radio eingebunden und steckt nicht am SMB (dig. Eingang) am Wechsler. Beim VFL Steckt der CD-Wechsler ab Werk am SMB. Heißt hier muss man sich entscheiden ob man den CD Wechsler weiter via dig. Eingang nutzen mag oder das Xtrons digital anschließt.&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
S PDIF+DSP.jpeg|Digitaler Anschluss des Xtrons via SMB an der DSP Endstufe&lt;br /&gt;
IQ7339IBUS_02.jpg|&amp;quot;COAXIAL&amp;quot;. digitaler Cinch-Ausgang als S/PDIF Signal&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; Nutzbar für DSP via TOSLINK zu S/PDIF Konverter.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== weitere Einstellungen ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Pausieren/Stopp von Youtube mit Licht an/aus vermeiden ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Die neue Benutzeroberfläche der IQ Serie (ab IQx4xx.. / Android 14) bringt u.a. die Option das Theme vom Radio mit dem Licht auf Hell/Dunkel umzustellen mit Licht an/aus.&amp;lt;br&amp;gt;&lt;br /&gt;
Leider hat dieses Umstellen Auswirkung auf u.a. die App Youtube, welche damit die Wiedergabe pausiert und das Bild minimiert.&amp;lt;br&amp;gt;&lt;br /&gt;
Beheben lässt sich das entweder durch die Deaktivierung der Theme-Umschaltung vom Radio - oder durch die Festlegung der Oberfläche in Youtube auf Hell oder Dunkel.&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
IQx4xxIBUS Modus.png|Oben rechts: Theme-Umschaltung mit Licht an/aus&lt;br /&gt;
IQx4xx YT-pause DE 01 .jpg|Benutzer Seite öffnen&lt;br /&gt;
IQx4xx YT-pause DE 02 .jpg|Einstellungen öffnen&lt;br /&gt;
IQx4xx YT-pause DE 03 .jpg|Darstellungs-Einstellungen&lt;br /&gt;
IQx4xx YT-pause DE 04 .jpg|Darstellungs-Einstellungen: Standard-Einstellung&lt;br /&gt;
IQx4xx YT-pause DE 05 .jpg|Darstellungs-Einstellungen: Festlegung helles oder dunkles Design&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lüfter-Einstellungen ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Die neue IQ Serie (ab IQx4xx.. / Android 14) bringt u.a. die Option das An-/Abschalten des hinten verbauten Lüfters anzupassen.&amp;lt;br&amp;gt;&lt;br /&gt;
Mit Tippen auf die Temperatur kann man die EInschaltschwelle für den Lüfter setzen. Ab Werk sind es 90°C - Gesetzt haben wir den Wert (nicht dargestellt) auf 60°C.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
IQx4xxIBUS Fan 01.png|Lüfter-Einstellungen&lt;br /&gt;
IQx4xxIBUS Fan 02.png|Lüfter-Einstellungen: Einschaltschwelle original&lt;br /&gt;
IQx4xxIBUS Fan 03.png|Lüfter-Einstellungen: Einschaltschwelle gesetzt auf 60°C (nicht dargestellt)&lt;br /&gt;
IQx4xxIBUS Fan 04.png|Lüfter-Einstellungen: Lüfter läuft&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Split-Screen ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Hier ein Video wie man Split-Screen auf dem IQ nutzt:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=2wI2-sqIhE4&amp;lt;/youtube&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Firmware und MCU ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Anleitung wie ein '''[[Firmwareupdate]]''' funktioniert. (Anleitung für &amp;quot;IQ-Serie&amp;quot; nutzen)&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''WICHTIG: die Firmware und MCU funktioniert nur für das jeweils spezifizierte Xtrons. Die Verwendung am falschen Gerät kann zu (irreparablen) Fehlfunktionen führen!'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
=== Firmware und MCU für IQx3xx ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Die aktuelle Version der Firmware für das IQ7339IBUS ist die '''2025-01-06 mit MCU 4.54'''.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''[https://download.speedy-pics.de/uploads/android/firmware/IQ-8+256_13.0_lf_sc138_13_(20250106)_MCU_4.54.rar Download Firmware für IQ7439IBUS - Stand: 2025-01-06]''' (1,5GB)&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''[https://download.speedy-pics.de/uploads/android/MCU/HCTGQ_HCT_V4.54_IQx3xxIBUS.zip MCU 4.54  für IQx3xxIBUS]'''&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Firmware und MCU für IQx4xx ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Die aktuelle Version der Firmware für das IQx4xxIBUS ist die '''2025-06-27''' letzte MCU ist Version '''4.56'''.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''[https://download.speedy-pics.de/uploads/android/firmware/FL-IQ_8+256_7inch_ibus_V1_13_(20250731).zip Download Firmware für IQ7439IBUS (7&amp;quot; Radios - v1) - Stand: 2025-07-31]''' (1,5GB)&amp;lt;br&amp;gt;&lt;br /&gt;
'''[https://1drv.ms/u/c/2f0141a45c14e785/IQAKO8cRBFvoTaTymIR4TcAoAV9r-b7ccaVc8vWteL2nBok?e=9oEfYA Download Firmware für IQ7439.. und IQ7446.. (7&amp;quot; Radios - v1) - Stand: 2026-04-30]''' (1,5GB)&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''[https://1drv.ms/u/c/2f0141a45c14e785/IQB4C4AKqz24Rok-uqNTIyUQASy6e0oyc7OzAuIroyLb12U?e=y6ssYU Download Firmware für IQ7439.. und IQ7446.. (7&amp;quot; Radios - v2) - Stand: 2026-04-23]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''[https://1drv.ms/u/c/2f0141a45c14e785/IQB9vtjRKsMfTpHVGgUfXP-RAYKL0JkimE05dnPPzRWvBPc?e=5XwWdE Download Firmware für IQ7439.. und IQ7446.. (7&amp;quot; Radios - v2) - Stand: 2026-07-17]'''&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''[https://1drv.ms/u/c/2f0141a45c14e785/IQBPjwQM1isVRolZFu9GiVIhAT6wFOuA57EFTtoQ9flpzNU?e=6kJT2L Download Firmware für IQ8446.. und IQ1439.. und IQ1453.. (8,8&amp;quot; und 10,25&amp;quot; Radios - v1) - Stand: 2025-12-18]''' (1,5GB)&amp;lt;br&amp;gt;&lt;br /&gt;
'''[https://1drv.ms/u/c/2f0141a45c14e785/IQAcSasWcOUmS5yOwjxCeW4jASbdcLHE9cO2ZYzmhVB_oSY?e=er3GxV Download Firmware für IQ8446.. und IQ1439.. und IQ1453.. (8,8&amp;quot; und 10,25&amp;quot; Radios - v1) - Stand: 2026-05-27]''' (1,5GB)&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''[https://1drv.ms/u/c/2f0141a45c14e785/IQATys0-HS03S6M0iHco-ttIAbfUatTkte-O6Ete0qL7FbE?e=oDnQoU Download Firmware für IQ8446.. und IQ1439.. und IQ1453.. (8,8&amp;quot; und 10,25&amp;quot; Radios - v2) - Stand: 2025-12-18]''' (1,5GB)&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''[https://download.speedy-pics.de/uploads/android/MCU/HCTGS_HCT_V4.56d_IQx4xxIBUS.zip MCU 4.56 für IQx4xx]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''[https://download.speedy-pics.de/uploads/android/MCU/HCTGS_HCT_V4.57.zip MCU 4.57d für IQx4xx]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''[https://download.speedy-pics.de/uploads/android/MCU/HCTGS_HCT_V4.57t.zip MCU 4.57t für IQx4xx]''' '''verbessert schlechten FM-Radio Empfang'''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andre</name></author>
	</entry>
	<entry>
		<id>https://xtrons.ibus-app.de/index.php?title=TPMS_Sensoren_anlernen&amp;diff=4061</id>
		<title>TPMS Sensoren anlernen</title>
		<link rel="alternate" type="text/html" href="https://xtrons.ibus-app.de/index.php?title=TPMS_Sensoren_anlernen&amp;diff=4061"/>
		<updated>2026-10-07T10:07:38Z</updated>

		<summary type="html">&lt;p&gt;Andre: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Das Anlernen von neuen Sensoren an die Empfangseinheit ist ein wenig aufwändig, aber recht einfach umzusetzen.&amp;lt;br&amp;gt;&lt;br /&gt;
Was braucht man?&lt;br /&gt;
* ein Xtrons [https://shop.ibus-app.de/radiozubehoer/tpms/215/reifendruckueberwachungssystem-externe-sensoren-tpms07?number=TPMS07 TPMS07] oder [https://shop.ibus-app.de/radiozubehoer/tpms/216/reifendruckueberwachungssystem-interne-sensoren-tpms08?number=TPMS08 TPMS08]&lt;br /&gt;
* die aktuelle [https://download.speedy-pics.de/uploads/android/TPMS-V1.1.71M-15_USB_L10_20230808.apk TPMS App]&lt;br /&gt;
* etwas zum Reifen aufpumpen/Luftablassen (ggf. Tankstelle mit Reifendruckstation)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''optionale Vorbereitung:''' (&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;nur bei Verwendung von TPMS in Verbindung mit dem Resler Modul für die I-BUS App!&amp;lt;/font&amp;gt;)&amp;lt;br&amp;gt;&lt;br /&gt;
# da sich das Resler Modul und der TPMS-Empfänger etwas behaken: temporär das Resler Modul vom USB trennen &lt;br /&gt;
# sicherstellen, dass die I-BUS App geschlossen ist (wenn sie sich wieder öffnet und erneut schließen)&lt;br /&gt;
# aktuelle [https://download.speedy-pics.de/uploads/android/TPMS-V1.1.71M-15_USB_L10_20230808.apk TPMS App] temporär installieren&amp;lt;br&amp;gt;&lt;br /&gt;
'''Optional:''' TMPS Empfänger via OTG Adapter an ein Android Handy/Tablet stecken, TPMS App herunter laden/installieren und dann hiermit anlernen. Die Werte werden im TPMS-Empfänger gespeichert.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Ablauf:'''&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
# '''TPMS App öffnen'''&lt;br /&gt;
# wähle den Punkt „ID-Code Paar“ unten in der TPMS App&lt;br /&gt;
# im neuen Fenster den Reifen antippen, den Du anlernen möchtest. Drücke nach Auswahl auf „zu paaren“.&lt;br /&gt;
# es startet ein 120s Timer. Innerhalb dieser Zeit musst Du den &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''Druck von nur diesem Reifen ändern'''&amp;lt;/font&amp;gt;. Dazu entweder etwas Luft ablassen oder aufpumpen. Eine kleine Änderung (0,2..0,3bar) genügt. Damit wird der Sensor aktiv und sendet häufiger als aller den üblichen 180s Werte. Bei TPMS07 genügt das Lösen der Schraubverbindung, bis der Druck gut hörbar entweicht.&lt;br /&gt;
# War das Anlernen erfolgreich bricht der Timer ab und meldet Erfolg. Wenn man zurück auf die Startseite der TPMS App geht sollten Werte für diesen Sensor erscheinen.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Diese Prozedur für jeden Reifen wiederholen. Es ist möglich, dass es nicht immer im ersten Anlauf funktioniert.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
TPMS pair sensor 1.png|ID-Code Paar&lt;br /&gt;
TPMS pair sensor 2.png|anzulernenden Sensor wählen&lt;br /&gt;
TPMS pair sensor 3.png|Anlernen starten&lt;br /&gt;
TPMS pair sensor 4.png|Timer läuft&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''Abschluss:'''&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''''Gilt nur für Verwendung von TPMS parallel mit dem orangen Resler Modul!'''''&amp;lt;br&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
'''Ihr benötigt hierfür eine Beta-Version der I-BUS App (ab Beta11, neuer als Version 2.2.1.4), kontaktiert den I-BUS App Support hierfür.'''&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Wenn alle Sensoren plausible Werte zeigen: TPMS App deinstallieren, Resler Modul wieder anstecken und es sollte alle Werte in den Bewegungsdaten der I-BUS App dargestellt werden.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andre</name></author>
	</entry>
	<entry>
		<id>https://xtrons.ibus-app.de/index.php?title=TPMS_Sensoren_anlernen&amp;diff=4060</id>
		<title>TPMS Sensoren anlernen</title>
		<link rel="alternate" type="text/html" href="https://xtrons.ibus-app.de/index.php?title=TPMS_Sensoren_anlernen&amp;diff=4060"/>
		<updated>2026-10-07T10:06:38Z</updated>

		<summary type="html">&lt;p&gt;Andre: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Das Anlernen von neuen Sensoren an die Empfangseinheit ist ein wenig aufwändig, aber recht einfach umzusetzen.&amp;lt;br&amp;gt;&lt;br /&gt;
Was braucht man?&lt;br /&gt;
* ein Xtrons [https://shop.ibus-app.de/radiozubehoer/tpms/215/reifendruckueberwachungssystem-externe-sensoren-tpms07?number=TPMS07 TPMS07] oder [https://shop.ibus-app.de/radiozubehoer/tpms/216/reifendruckueberwachungssystem-interne-sensoren-tpms08?number=TPMS08 TPMS08]&lt;br /&gt;
* die aktuelle [https://download.speedy-pics.de/uploads/android/TPMS-V1.1.71M-15_USB_L10_20230808.apk TPMS App]&lt;br /&gt;
* etwas zum Reifen aufpumpen/Luftablassen (ggf. Tankstelle mit Reifendruckstation)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''optionale Vorbereitung:''' (&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;nur bei Verwendung von TPMS in Verbindung mit dem Resler Modul für die I-BUS App!&amp;lt;/font&amp;gt;)&amp;lt;br&amp;gt;&lt;br /&gt;
# da sich das Resler Modul und der TPMS-Empfänger etwas behaken: temporär das Resler Modul vom USB trennen &lt;br /&gt;
# sicherstellen, dass die I-BUS App geschlossen ist (wenn sie sich wieder öffnet und erneut schließen)&lt;br /&gt;
# aktuelle [https://download.speedy-pics.de/uploads/android/TPMS-V1.1.71M-15_USB_L10_20230808.apk TPMS App] temporär installieren&amp;lt;br&amp;gt;&lt;br /&gt;
'''Optional:''' TMPS Empfänger via OTG Adapter an ein Android Handy/Tablet stecken, TPMS App herunter laden/installieren und dann hiermit anlernen. Die Werte werden im TPMS-Empfänger gespeichert.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Ablauf:'''&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
# '''TPMS App öffnen'''&lt;br /&gt;
# wähle den Punkt „ID-Code Paar“ unten in der TPMS App&lt;br /&gt;
# im neuen Fenster den Reifen antippen, den Du anlernen möchtest. Drücke nach Auswahl auf „zu paaren“.&lt;br /&gt;
# es startet ein 120s Timer. Innerhalb dieser Zeit musst Du den &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''Druck von nur diesem Reifen ändern'''&amp;lt;/font&amp;gt;. Dazu entweder etwas Luft ablassen oder aufpumpen. Eine kleine Änderung (0,2..0,3bar) genügt. Damit wird der Sensor aktiv und sendet häufiger als aller den üblichen 180s Werte. Bei TPMS07 genügt das Lösen der Schraubverbindung, bis der Druck gut hörbar entweicht.&lt;br /&gt;
# War das Anlernen erfolgreich bricht der Timer ab und meldet Erfolg. Wenn man zurück auf die Startseite der TPMS App geht sollten Werte für diesen Sensor erscheinen.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Diese Prozedur für jeden Reifen wiederholen. Es ist möglich, dass es nicht immer im ersten Anlauf funktioniert.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''Abschluss:'''&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''''Gilt nur für Verwendung von TPMS parallel mit dem orangen Resler Modul!'''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''Ihr benötigt hierfür eine Beta-Version der I-BUS App (ab Beta11, neuer als Version 2.2.1.4), kontaktiert den I-BUS App Support hierfür.'''''&amp;lt;br&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Wenn alle Sensoren plausible Werte zeigen: TPMS App deinstallieren, Resler Modul wieder anstecken und es sollte alle Werte in den Bewegungsdaten der I-BUS App dargestellt werden.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
TPMS pair sensor 1.png|ID-Code Paar&lt;br /&gt;
TPMS pair sensor 2.png|anzulernenden Sensor wählen&lt;br /&gt;
TPMS pair sensor 3.png|Anlernen starten&lt;br /&gt;
TPMS pair sensor 4.png|Timer läuft&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andre</name></author>
	</entry>
	<entry>
		<id>https://xtrons.ibus-app.de/index.php?title=TPMS_Sensoren_anlernen&amp;diff=4059</id>
		<title>TPMS Sensoren anlernen</title>
		<link rel="alternate" type="text/html" href="https://xtrons.ibus-app.de/index.php?title=TPMS_Sensoren_anlernen&amp;diff=4059"/>
		<updated>2026-10-07T10:05:30Z</updated>

		<summary type="html">&lt;p&gt;Andre: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Das Anlernen von neuen Sensoren an die Empfangseinheit ist ein wenig aufwändig, aber recht einfach umzusetzen.&amp;lt;br&amp;gt;&lt;br /&gt;
Was braucht man?&lt;br /&gt;
* ein Xtrons [https://shop.ibus-app.de/radiozubehoer/tpms/215/reifendruckueberwachungssystem-externe-sensoren-tpms07?number=TPMS07 TPMS07] oder [https://shop.ibus-app.de/radiozubehoer/tpms/216/reifendruckueberwachungssystem-interne-sensoren-tpms08?number=TPMS08 TPMS08]&lt;br /&gt;
* die aktuelle [https://download.speedy-pics.de/uploads/android/TPMS-V1.1.71M-15_USB_L10_20230808.apk TPMS App]&lt;br /&gt;
* etwas zum Reifen aufpumpen/Luftablassen (ggf. Tankstelle mit Reifendruckstation)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''optionale Vorbereitung:''' (&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;nur bei Verwendung von TPMS in Verbindung mit dem Resler Modul für die I-BUS App!&amp;lt;/font&amp;gt;)&amp;lt;br&amp;gt;&lt;br /&gt;
# da sich das Resler Modul und der TPMS-Empfänger etwas behaken: temporär das Resler Modul vom USB trennen &lt;br /&gt;
# sicherstellen, dass die I-BUS App geschlossen ist (wenn sie sich wieder öffnet und erneut schließen)&lt;br /&gt;
# aktuelle [https://download.speedy-pics.de/uploads/android/TPMS-V1.1.71M-15_USB_L10_20230808.apk TPMS App] temporär installieren&amp;lt;br&amp;gt;&lt;br /&gt;
'''Optional:''' TMPS Empfänger via OTG Adapter an ein Android Handy/Tablet stecken, TPMS App herunter laden/installieren und dann hiermit anlernen. Die Werte werden im TPMS-Empfänger gespeichert.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Ablauf:'''&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
# '''TPMS App öffnen'''&lt;br /&gt;
# wähle den Punkt „ID-Code Paar“ unten in der TPMS App&lt;br /&gt;
# im neuen Fenster den Reifen antippen, den Du anlernen möchtest. Drücke nach Auswahl auf „zu paaren“.&lt;br /&gt;
# es startet ein 120s Timer. Innerhalb dieser Zeit musst Du den &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''Druck von nur diesem Reifen ändern'''&amp;lt;/font&amp;gt;. Dazu entweder etwas Luft ablassen oder aufpumpen. Eine kleine Änderung (0,2..0,3bar) genügt. Damit wird der Sensor aktiv und sendet häufiger als aller den üblichen 180s Werte. Bei TPMS07 genügt das Lösen der Schraubverbindung, bis der Druck gut hörbar entweicht.&lt;br /&gt;
# War das Anlernen erfolgreich bricht der Timer ab und meldet Erfolg. Wenn man zurück auf die Startseite der TPMS App geht sollten Werte für diesen Sensor erscheinen.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Diese Prozedur für jeden Reifen wiederholen. Es ist möglich, dass es nicht immer im ersten Anlauf funktioniert.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''Abschluss:'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''Gilt nur für Verwendung von TPMS parallel mit dem orangen Resler Modul!'''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''Ihr benötigt hierfür eine Beta-Version der I-BUS App (ab Beta11, neuer als Version 2.2.1.4), kontaktiert den I-BUS App Support hierfür.'''''&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Wenn alle Sensoren plausible Werte zeigen: TPMS App deinstallieren, Resler Modul wieder anstecken und es sollte alle Werte in den Bewegungsdaten der I-BUS App dargestellt werden.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
TPMS pair sensor 1.png|ID-Code Paar&lt;br /&gt;
TPMS pair sensor 2.png|anzulernenden Sensor wählen&lt;br /&gt;
TPMS pair sensor 3.png|Anlernen starten&lt;br /&gt;
TPMS pair sensor 4.png|Timer läuft&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andre</name></author>
	</entry>
	<entry>
		<id>https://xtrons.ibus-app.de/index.php?title=TPMS_Sensoren_anlernen&amp;diff=4058</id>
		<title>TPMS Sensoren anlernen</title>
		<link rel="alternate" type="text/html" href="https://xtrons.ibus-app.de/index.php?title=TPMS_Sensoren_anlernen&amp;diff=4058"/>
		<updated>2026-10-07T10:05:19Z</updated>

		<summary type="html">&lt;p&gt;Andre: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Das Anlernen von neuen Sensoren an die Empfangseinheit ist ein wenig aufwändig, aber recht einfach umzusetzen.&amp;lt;br&amp;gt;&lt;br /&gt;
Was braucht man?&lt;br /&gt;
* ein Xtrons [https://shop.ibus-app.de/radiozubehoer/tpms/215/reifendruckueberwachungssystem-externe-sensoren-tpms07?number=TPMS07 TPMS07] oder [https://shop.ibus-app.de/radiozubehoer/tpms/216/reifendruckueberwachungssystem-interne-sensoren-tpms08?number=TPMS08 TPMS08]&lt;br /&gt;
* die aktuelle [https://download.speedy-pics.de/uploads/android/TPMS-V1.1.71M-15_USB_L10_20230808.apk TPMS App]&lt;br /&gt;
* etwas zum Reifen aufpumpen/Luftablassen (ggf. Tankstelle mit Reifendruckstation)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''optionale Vorbereitung:''' (&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;nur bei Verwendung von TPMS in Verbindung mit dem Resler Modul für die I-BUS App!&amp;lt;/font&amp;gt;)&amp;lt;br&amp;gt;&lt;br /&gt;
# da sich das Resler Modul und der TPMS-Empfänger etwas behaken: temporär das Resler Modul vom USB trennen &lt;br /&gt;
# sicherstellen, dass die I-BUS App geschlossen ist (wenn sie sich wieder öffnet und erneut schließen)&lt;br /&gt;
# aktuelle [https://download.speedy-pics.de/uploads/android/TPMS-V1.1.71M-15_USB_L10_20230808.apk TPMS App] temporär installieren&amp;lt;br&amp;gt;&lt;br /&gt;
'''Optional:''' TMPS Empfänger via OTG Adapter an ein Android Handy/Tablet stecken, TPMS App herunter laden/installieren und dann hiermit anlernen. Die Werte werden im TPMS-Empfänger gespeichert.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Ablauf:'''&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
# '''TPMS App öffnen'''&lt;br /&gt;
# wähle den Punkt „ID-Code Paar“ unten in der TPMS App&lt;br /&gt;
# im neuen Fenster den Reifen antippen, den Du anlernen möchtest. Drücke nach Auswahl auf „zu paaren“.&lt;br /&gt;
# es startet ein 120s Timer. Innerhalb dieser Zeit musst Du den &amp;lt;font color=&amp;quot;red&amp;quot;'''Druck von nur diesem Reifen ändern'''&amp;lt;/font&amp;gt;. Dazu entweder etwas Luft ablassen oder aufpumpen. Eine kleine Änderung (0,2..0,3bar) genügt. Damit wird der Sensor aktiv und sendet häufiger als aller den üblichen 180s Werte. Bei TPMS07 genügt das Lösen der Schraubverbindung, bis der Druck gut hörbar entweicht.&lt;br /&gt;
# War das Anlernen erfolgreich bricht der Timer ab und meldet Erfolg. Wenn man zurück auf die Startseite der TPMS App geht sollten Werte für diesen Sensor erscheinen.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Diese Prozedur für jeden Reifen wiederholen. Es ist möglich, dass es nicht immer im ersten Anlauf funktioniert.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''Abschluss:'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''Gilt nur für Verwendung von TPMS parallel mit dem orangen Resler Modul!'''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''Ihr benötigt hierfür eine Beta-Version der I-BUS App (ab Beta11, neuer als Version 2.2.1.4), kontaktiert den I-BUS App Support hierfür.'''''&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Wenn alle Sensoren plausible Werte zeigen: TPMS App deinstallieren, Resler Modul wieder anstecken und es sollte alle Werte in den Bewegungsdaten der I-BUS App dargestellt werden.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
TPMS pair sensor 1.png|ID-Code Paar&lt;br /&gt;
TPMS pair sensor 2.png|anzulernenden Sensor wählen&lt;br /&gt;
TPMS pair sensor 3.png|Anlernen starten&lt;br /&gt;
TPMS pair sensor 4.png|Timer läuft&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andre</name></author>
	</entry>
	<entry>
		<id>https://xtrons.ibus-app.de/index.php?title=TPMS_Sensoren_anlernen&amp;diff=4057</id>
		<title>TPMS Sensoren anlernen</title>
		<link rel="alternate" type="text/html" href="https://xtrons.ibus-app.de/index.php?title=TPMS_Sensoren_anlernen&amp;diff=4057"/>
		<updated>2026-10-07T10:04:47Z</updated>

		<summary type="html">&lt;p&gt;Andre: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Das Anlernen von neuen Sensoren an die Empfangseinheit ist ein wenig aufwändig, aber recht einfach umzusetzen.&amp;lt;br&amp;gt;&lt;br /&gt;
Was braucht man?&lt;br /&gt;
* ein Xtrons [https://shop.ibus-app.de/radiozubehoer/tpms/215/reifendruckueberwachungssystem-externe-sensoren-tpms07?number=TPMS07 TPMS07] oder [https://shop.ibus-app.de/radiozubehoer/tpms/216/reifendruckueberwachungssystem-interne-sensoren-tpms08?number=TPMS08 TPMS08]&lt;br /&gt;
* die aktuelle [https://download.speedy-pics.de/uploads/android/TPMS-V1.1.71M-15_USB_L10_20230808.apk TPMS App]&lt;br /&gt;
* etwas zum Reifen aufpumpen/Luftablassen (ggf. Tankstelle mit Reifendruckstation)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''Vorbereitung:''' (&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;nur bei Verwendung von TPMS in Verbindung mit dem Resler Modul für die I-BUS App!&amp;lt;/font&amp;gt;)&amp;lt;br&amp;gt;&lt;br /&gt;
# da sich das Resler Modul und der TPMS-Empfänger etwas behaken: temporär das Resler Modul vom USB trennen &lt;br /&gt;
# sicherstellen, dass die I-BUS App geschlossen ist (wenn sie sich wieder öffnet und erneut schließen)&lt;br /&gt;
# aktuelle [https://download.speedy-pics.de/uploads/android/TPMS-V1.1.71M-15_USB_L10_20230808.apk TPMS App] temporär installieren&amp;lt;br&amp;gt;&lt;br /&gt;
'''Optional:''' TMPS Empfänger via OTG Adapter an ein Android Handy/Tablet stecken, TPMS App herunter laden/installieren und dann hiermit anlernen. Die Werte werden im TPMS-Empfänger gespeichert.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Ablauf:'''&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
# '''TPMS App öffnen'''&lt;br /&gt;
# wähle den Punkt „ID-Code Paar“ unten in der TPMS App&lt;br /&gt;
# im neuen Fenster den Reifen antippen, den Du anlernen möchtest. Drücke nach Auswahl auf „zu paaren“.&lt;br /&gt;
# es startet ein 120s Timer. Innerhalb dieser Zeit musst Du den '''Druck von nur diesem Reifen ändern'''. Dazu entweder etwas Luft ablassen oder aufpumpen. Eine kleine Änderung (0,2..0,3bar) genügt. Damit wird der Sensor aktiv und sendet häufiger als aller den üblichen 180s Werte. Bei TPMS07 genügt das Lösen der Schraubverbindung, bis der Druck gut hörbar entweicht.&lt;br /&gt;
# War das Anlernen erfolgreich bricht der Timer ab und meldet Erfolg. Wenn man zurück auf die Startseite der TPMS App geht sollten Werte für diesen Sensor erscheinen.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Diese Prozedur für jeden Reifen wiederholen. Es ist möglich, dass es nicht immer im ersten Anlauf funktioniert.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''Abschluss:'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''Gilt nur für Verwendung von TPMS parallel mit dem orangen Resler Modul!'''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''Ihr benötigt hierfür eine Beta-Version der I-BUS App (ab Beta11, neuer als Version 2.2.1.4), kontaktiert den I-BUS App Support hierfür.'''''&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Wenn alle Sensoren plausible Werte zeigen: TPMS App deinstallieren, Resler Modul wieder anstecken und es sollte alle Werte in den Bewegungsdaten der I-BUS App dargestellt werden.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
TPMS pair sensor 1.png|ID-Code Paar&lt;br /&gt;
TPMS pair sensor 2.png|anzulernenden Sensor wählen&lt;br /&gt;
TPMS pair sensor 3.png|Anlernen starten&lt;br /&gt;
TPMS pair sensor 4.png|Timer läuft&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andre</name></author>
	</entry>
	<entry>
		<id>https://xtrons.ibus-app.de/index.php?title=TPMS_Sensoren_anlernen&amp;diff=4056</id>
		<title>TPMS Sensoren anlernen</title>
		<link rel="alternate" type="text/html" href="https://xtrons.ibus-app.de/index.php?title=TPMS_Sensoren_anlernen&amp;diff=4056"/>
		<updated>2026-10-07T10:04:00Z</updated>

		<summary type="html">&lt;p&gt;Andre: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Das Anlernen von neuen Sensoren an die Empfangseinheit ist ein wenig aufwändig, aber recht einfach umzusetzen.&amp;lt;br&amp;gt;&lt;br /&gt;
Was braucht man?&lt;br /&gt;
* ein Xtrons [https://shop.ibus-app.de/radiozubehoer/tpms/215/reifendruckueberwachungssystem-externe-sensoren-tpms07?number=TPMS07 TPMS07] oder [https://shop.ibus-app.de/radiozubehoer/tpms/216/reifendruckueberwachungssystem-interne-sensoren-tpms08?number=TPMS08 TPMS08]&lt;br /&gt;
* die aktuelle [https://download.speedy-pics.de/uploads/android/TPMS-V1.1.71M-15_USB_L10_20230808.apk TPMS App]&lt;br /&gt;
* etwas zum Reifen aufpumpen/Luftablassen (ggf. Tankstelle mit Reifendruckstation)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''Vorbereitung:''' (&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;nur bei Verwendung von TPMS in Verbindung mit dem Resler Modul für die I-BUS App!&amp;lt;/font&amp;gt;)&amp;lt;br&amp;gt;&lt;br /&gt;
# da sich das Resler Modul und der TPMS-Empfänger etwas behaken: temporär das Resler Modul vom USB trennen &lt;br /&gt;
# sicherstellen, dass die I-BUS App geschlossen ist (wenn sie sich wieder öffnet und erneut schließen)&lt;br /&gt;
# aktuelle [https://download.speedy-pics.de/uploads/android/TPMS-V1.1.71M-15_USB_L10_20230808.apk TPMS App] temporär installieren&amp;lt;br&amp;gt;&lt;br /&gt;
'''Optional:''' TMPS Empfänger via OTG Adapter an ein Android Handy/Tablet stecken, TPMS App herunter laden/installieren und dann hiermit anlernen. Die Werte werden im TPMS-Empfänger gespeichert.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''Ablauf:'''&amp;lt;br&amp;gt;&lt;br /&gt;
# '''TPMS App öffnen'''&lt;br /&gt;
# wähle den Punkt „ID-Code Paar“ unten in der TPMS App&lt;br /&gt;
# im neuen Fenster den Reifen antippen, den Du anlernen möchtest. Drücke nach Auswahl auf „zu paaren“.&lt;br /&gt;
# es startet ein 120s Timer. Innerhalb dieser Zeit musst Du den '''Druck von nur diesem Reifen ändern'''. Dazu entweder etwas Luft ablassen oder aufpumpen. Eine kleine Änderung (0,2..0,3bar) genügt. Damit wird der Sensor aktiv und sendet häufiger als aller den üblichen 180s Werte. Bei TPMS07 genügt das Lösen der Schraubverbindung, bis der Druck gut hörbar entweicht.&lt;br /&gt;
# War das Anlernen erfolgreich bricht der Timer ab und meldet Erfolg. Wenn man zurück auf die Startseite der TPMS App geht sollten Werte für diesen Sensor erscheinen.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Diese Prozedur für jeden Reifen wiederholen. Es ist möglich, dass es nicht immer im ersten Anlauf funktioniert.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''Abschluss:'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''Gilt nur für Verwendung von TPMS parallel mit dem orangen Resler Modul!'''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''Ihr benötigt hierfür eine Beta-Version der I-BUS App (ab Beta11, neuer als Version 2.2.1.4), kontaktiert den I-BUS App Support hierfür.'''''&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Wenn alle Sensoren plausible Werte zeigen: TPMS App deinstallieren, Resler Modul wieder anstecken und es sollte alle Werte in den Bewegungsdaten der I-BUS App dargestellt werden.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
TPMS pair sensor 1.png|ID-Code Paar&lt;br /&gt;
TPMS pair sensor 2.png|anzulernenden Sensor wählen&lt;br /&gt;
TPMS pair sensor 3.png|Anlernen starten&lt;br /&gt;
TPMS pair sensor 4.png|Timer läuft&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andre</name></author>
	</entry>
	<entry>
		<id>https://xtrons.ibus-app.de/index.php?title=Was_ist_DSP%3F_Digitaler_Soundprozessor&amp;diff=4055</id>
		<title>Was ist DSP? Digitaler Soundprozessor</title>
		<link rel="alternate" type="text/html" href="https://xtrons.ibus-app.de/index.php?title=Was_ist_DSP%3F_Digitaler_Soundprozessor&amp;diff=4055"/>
		<updated>2026-10-05T12:52:15Z</updated>

		<summary type="html">&lt;p&gt;Andre: /* DSP-Endstufe zum Nachrüsten */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
== Kurzform ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
'''DSP ist eine digitale Echtzeit-Modifizierung des Audiosignals vom Radio zur Klangverbesserung.'''&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Für alle die es genauer wissen wollen ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
DSP steht für &amp;quot;Digitaler Soundprozessor&amp;quot;.&lt;br /&gt;
Das Signal vom Radio wird darin digitalisiert, verändert und dann wieder analog an die Lautsprecher weiter gegeben.&lt;br /&gt;
Dabei gibt es einige Arten der Signalanpassung.&lt;br /&gt;
=== High Pass Filter und Low Pass Filter (HPF/LPF) ===&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Die Funktion von High Pass Filter und Low Pass Filter ermöglichen es bestimmte Frequenzen wegzuschneiden.&amp;lt;br /&amp;gt;&lt;br /&gt;
Der Low Pass Filter lässt nur Töne tiefer der eingestellten Grenze durch.&amp;lt;br /&amp;gt;&lt;br /&gt;
Der High Pass Filter lässt nur Töne höher  der eingestellten Grenze durch.&amp;lt;br /&amp;gt;&lt;br /&gt;
Daraus resultiert, dass man am unteren Ende des Frequenzbandes den HPF und am oberen den LPF setz.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Da es aber wie &amp;quot;gerade abgeschnitten&amp;quot; klingen würde macht man keinen harten Schnitt, sonder trennt die Frequenz mit einer Steigung (&amp;quot;Slope&amp;quot;).&amp;lt;br /&amp;gt;&lt;br /&gt;
Das heißt die Trennung besteht immer aus einer Frequenz und einem Anstieg.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Als Beispiel würde ich bei einem 130mm Tiefmitteltöner einen HPF von z.B. 80Hz und -12dB/Oct setzen und einen LPF von 10kHz und -12dB/Oct.&amp;lt;br /&amp;gt;&lt;br /&gt;
Ein Subwoofer bekommt dagegen nur einen LPF von z.b. 120 Hz und -12dB/Oct.&amp;lt;br /&amp;gt;&lt;br /&gt;
Natürlich muss man das auf die jeweiligen Lautsprecher anpassen!&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
AxtonA580DSP Filter.jpeg|HPF/LPF&lt;br /&gt;
AAS-MTC DSP 02.jpg|MTC DSP Equalizer und HPF/LPF&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Sinnvoll sind diese Filter zum Beispiel, wenn man nur einen Tiefmitteltöner hat der weder richtig Bass noch Höhen spielen kann. Indem man diese Frequenzen heraus nimmt kann der Tiefmitteltöner bis in hohe Lautsärken wesentlich sauberer spielen. Das bekannte &amp;quot;Kratzen&amp;quot; bei &amp;quot;zuviel Bass&amp;quot; umgeht man damit.&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
=== Laufzeitkorrektur (LZK) ===&lt;br /&gt;
Bei einfachen Radio stellt man mittels der bekannten Parameter &amp;quot;Fader&amp;quot; und &amp;quot;Balance&amp;quot; ein wie das Radio klingen soll. Das basiert auf einer Anpassung der Lautstärke der einzelnen Lautsprecher und soll so das Gefühl vermitteln, ob die Musik eher von hinten oder vorn kommt.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Was ist nun die Laufzeitkorrektur überhaupt, was ist da anders?&amp;lt;br /&amp;gt;&lt;br /&gt;
Stellt euch den Wagen von oben vor, schaut wo ihr sitzt (und hört) und wo die Lautsprecher sind. Der Abstand jedes Lautsprechers zu euch ist unterschiedlich. Das Signal kommt aber zur gleichen Zeit zu jedem Lautsprecher (Geschwindigkeit des elektr. Signals im Kabel entspricht etwa der Lichtgeschwindigkeit [300.000.000 m/s]) und schallt dann mit etwa 345m/s (bei 20°C) zu eurem Ohr. Entsprechend kommt der Ton von jedem Lautsprecher minimal zu einem anderen Zeitpunkt am Ohr an, das &amp;quot;klingt komisch&amp;quot;.&amp;lt;br /&amp;gt;&lt;br /&gt;
Mit der Laufzeitkorrektur bekommt nun jeder Lautsprecher den Ton zeitlich so versetzt, dass der gleiche Ton aller Lautsprecher zur gleichen Zeit am Ohr ankommen sollte. Wir rücken die Lautsprecher also von der Einbauposition auf einen &amp;quot;gedachten Kreis&amp;quot; um unseren Kopf.&amp;lt;br /&amp;gt;&lt;br /&gt;
Beispiele für Abstände und Korrekturen im Bild:&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
AxtonA580DSP LZK.jpeg|Laufzeitkorrektur Axton A580DSP&lt;br /&gt;
AAS-MTC DSP 06.jpg|Laufzeitkorrektur&lt;br /&gt;
AAS-MTC DSP 01.jpg|MTC DSP Equalizer - Laufzeitkorrektur automatisch&lt;br /&gt;
AAS-MTC DSP 04.jpg|MTC DSP Equalizer - Laufzeitkorrektur manuell&lt;br /&gt;
LZK Abstaende.jpg|Beispiele Laufzeitkorrektur BMW E39, ohne Gewähr&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;Beispiele Laufzeitkorrektur BMW E39, ohne Gewähr&amp;lt;/small&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== OEM BMW DSP ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
DSP gab es beim BMW E38/E39/E53 als Sonderausstattung &amp;quot;TOP HIFI&amp;quot; (Ausstattungsnummer SA677). Im BMW E46 war DSP nicht verfügbar.&amp;lt;br /&amp;gt;&lt;br /&gt;
'''[https://wiki.ibus-app.de/index.php?title=Habe_ich_DSP%3F Habe ich DSP?]'''&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Bei dem Original BMW DSP findet man keine Einstellungen zu den Filtern und der Laufzeitkorrektur, da im Werk die Abstände und technischen Daten der Lautsprecher bekannt sind und entsprechend alles voreingestellt ist.&amp;lt;br /&amp;gt;&lt;br /&gt;
Angesteuert und gestartet wird die Endstufe zum einen über ein konventionelles +12V Remote Signal vom Radio plus diverse Telegramme über den I-BUS. Aus diesem Grund benötigt man die [http://www.ibus-app.de '''I-BUS App'''], wenn man das DSP mit einem Android-Radio betreiben möchte. Ohne die App bekommt man keinen Ton aus der Endstufe!&amp;lt;br /&amp;gt;&lt;br /&gt;
[https://wiki.ibus-app.de/index.php?title=Wie_kann_ich_mein_DSP_weiter_nutzen%3F '''Wie kann ich mein DSP weiter nutzen?''']&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
1024px-DSP Check.jpg|Habe ich DSP?&lt;br /&gt;
DSP.JPG|BMW E39 DSP Endstufe&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nachrüst-DSP ==&lt;br /&gt;
'''Generell gilt:''' wenn ab Werk KEIN DSP verbaut ist, kann man DSP auch nachrüsten. &amp;lt;br /&amp;gt;&lt;br /&gt;
Es gilt aber ebenso: wer AB WERK DSP verbaut hat, der hat KEINE Vorteile, wenn er ein Radio mit INTEGRIERTEM DSP kauft! Auch kann das interne DSP die original DSP Endstufe NICHT steuern.&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Es folgen drei Optionen.&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
=== Radio mit bereits integriertem DSP ===&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
'''&amp;lt;big&amp;gt;Aktuell gibt es von [https://xtrons.ibus-app.de/index.php?title=Aktuelle_AVIN-Radiomodelle_mit_Android_8.0_/_OctaCore_/_4GB_RAM_%2B_Zubeh%C3%B6r AVIN] und [https://xtrons.ibus-app.de/index.php?title=Aktuelle_Xtrons-Radiomodelle Xtrons] (PQ-/PQS-/IQ-/IX-/IA-/.. Serie) Radios mit integriertem DSP.&amp;lt;br /&amp;gt;&amp;lt;/big&amp;gt;'''&lt;br /&gt;
Im Vergleich zu den &amp;quot;normalen&amp;quot; Radio befindet sich zusätzlich eine kleine Platine im Radio. Natürlich ist das &amp;quot;nur&amp;quot; ein kleines DSP, bringt aber wirklich eine hörbare Klangverbesserung. Audiophile Anwender wird man davon eventuell nicht überzeugen können. ;-) &amp;lt;br /&amp;gt;&lt;br /&gt;
Firmware und MCU der Radios ist identisch mit der der Radios ohne DSP, beim Starten erkennt das Radio den Chip und läd enstprechend die zugehörige Equalizer App.&amp;lt;br /&amp;gt;&lt;br /&gt;
In der Standard-App kann man folgende Optionen auswählen:&lt;br /&gt;
* 15 Band Equalizer&lt;br /&gt;
* LUD (Loudness)&lt;br /&gt;
* PHAT (Hinzufügen eines Echos/Hall)&lt;br /&gt;
* Cut Freq (High Pass Filter)&lt;br /&gt;
* Bass (Low Pass Filter und Verstärkung)&lt;br /&gt;
* Sub (Lautstärke des Subwoofer-Ausgangs [grüner Cinch])&lt;br /&gt;
* Position &amp;quot;gewöhnlich&amp;quot; via Fader/Balance oder &amp;quot;Spezialität&amp;quot; via Laufzeitkorrektur &lt;br /&gt;
** dazu &amp;quot;Verzögerung&amp;quot; und &amp;quot;Gewinn&amp;quot; aktivieren&lt;br /&gt;
** &amp;quot;Autolautsprecher&amp;quot; Abstände &amp;quot;seitlich&amp;quot; und vertikal (vorn-hinten) eingeben.&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
AAS_DSP_01.png|DSP-Setup Equalizer&lt;br /&gt;
AAS_DSP_02.png|DSP-Setup LUD/HPF/LPF/Sub Level&lt;br /&gt;
AAS_DSP_03.png|DSP-Setup Position&lt;br /&gt;
AAS_DSP_04.png|DSP-Setup Laufzeitkorrektur&lt;br /&gt;
AAS DSP Chip.jpeg|DSP Chip&lt;br /&gt;
AAS DSP Mainboard.jpeg|DSP Mainboard&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
'''&amp;lt;big&amp;gt;Da das Menü leider stark eingeschränkt is, das DSP aber sehr viel mehr und besser kann, empfehlen wir die [[DSP-Equalizer-Modifikation für Radios mit internem DSP]] zu installieren. Aktuell ist diese leider nur für die PX5 und PX6 Radios verfügbar.&amp;lt;/big&amp;gt;''' &amp;lt;br /&amp;gt;&lt;br /&gt;
Alle Infos dazu findet ihr im [[DSP-Equalizer-Modifikation für Radios mit internem DSP|Link]]. Hier nur ein paar Bilder der Einstellungen.&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
AAS-MTC DSP 05.jpg|MTC DSP Equalizer&lt;br /&gt;
AAS-MTC DSP 02.jpg|MTC DSP Equalizer und HPF/LPF&lt;br /&gt;
AAS-MTC DSP 01.jpg|MTC DSP Equalizer - Laufzeitkorrektur automatisch&lt;br /&gt;
AAS-MTC DSP 04.jpg|MTC DSP Equalizer - Laufzeitkorrektur manuell&lt;br /&gt;
AAS-MTC DSP 05a.jpg|MTC DSP Equalizer - GAIN&lt;br /&gt;
AAS-MTC DSP 03.jpg|MTC DSP Equalizer - Loudness/PHAT/BASS&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Integriertes DSP im Radio nachrüsten ===&lt;br /&gt;
Siehe &amp;lt;big&amp;gt;'''[[DSP-Chip im Radio nachrüsten]]'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DSP-Endstufe zum Nachrüsten ===&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Sofern man ab Werk KEINE Endstufe verbaut hat (also in E38/E39/E53 OHNE SA676 oder SA677, im E46 SA676 oder SA 674) kann man zum Beispiel eine &amp;quot;Plug'n'Play&amp;quot; DSP-Endstufe verbauen.&amp;lt;br /&amp;gt;&lt;br /&gt;
Das macht insbesondere Sinn, wenn man leistungsstärkere Lautsprecher verbaut hat.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
'''KEINEN Sinn macht diese Endstufe wenn man eine Endstufe ab Werk hat, weil die Nachrüst-Endstufe VOR der originalen Endstufe steckt und damit die Mehrleistung völlig verpufft!'''&amp;lt;br /&amp;gt;&lt;br /&gt;
Im folgenden wurde eine [http://www.axton.de/verstaerker/smart-digital-verstaerker/a580dsp/ '''Axton A580DSP'''] genutzt - leider ist dieser nicht mehr lieferbar. Evtl. bekommt man die A580DSP, A590DSP oder A592DSP auch günstig gebraucht.&amp;lt;br /&amp;gt;&lt;br /&gt;
'''Das Auslaufmodell wurde bereits ersetzt durch die A590DSP, A592DSP und zuletzt [https://axton.de/produkt/a594dsp-axton-6-kanal-dsp-verstaerker-4-x-76-watt-rms-und-bluetooth-audio/ Axton A594DSP]'''. Preislich liegt die A594DSP bei 305..350€. &amp;lt;br /&amp;gt;&lt;br /&gt;
Mit der A592DSP liegen noch keine Erfahrungen vor, da es das neueste Gerät ist. Der Unterschied: ein optischer und Koaxial-Eingang für verlustfreie Musikübertragung, z.B. für den [https://www.axton.de/abt50-bluetooth-hi-res-audio-streaming-interface.html AXTON ABT50] zum Streamen in aptX HD Qualität.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
'''Da die Endstufe mit einem ISO-Anschlusskabel geliefert wird, benötigt man noch andere Adapter.'''&amp;lt;br /&amp;gt;&lt;br /&gt;
Wenn Quadlock/Flach-PIN vorhanden ist, benötig man das passende Kabel von Axton: [https://www.amazon.de/N-A480DSP-ISO5-Quadlock-2-Anschlusskabel-A430DSP-A500DSP/dp/B01D5MPQ6W/ Axton A480DSP A430DSP P&amp;amp;P Kabel ISO5]&amp;lt;br /&amp;gt;&lt;br /&gt;
'''!!!!WICHTIG!!!! Achtet auf die &amp;quot;ISO5&amp;quot; - das Kabel gibt es noch als &amp;quot;ISO26&amp;quot; - das passt nicht von der PIN-Belegung!'''&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Wenn BMW-Oldgeneration/Rund-PIN vorhanden ist, benötig man das [https://www.amazon.de/tomzz-Audio-7304-000-Einspeisung-Freisprecheinrichtung/dp/B00N98A8C0/ref=sr_1_28?__mk_de_DE=%C3%85M%C3%85%C5%BD%C3%95%C3%91&amp;amp;keywords=iso+bmw&amp;amp;qid=1569570230&amp;amp;s=gateway&amp;amp;sr=8-28%20ISO-Rundpinn Adapter von ISO auf BMW-Rundpin]. &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
'''Technische Daten  	A580DSP'''&lt;br /&gt;
* Music Power Output: 150 W x 4 (110 W x 4&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;)&lt;br /&gt;
* RMS Power Output:	76 W x 4 (56 W x 4&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;)&lt;br /&gt;
* Wiedergabebereich:	20 Hz ~ 20 KHz&lt;br /&gt;
* Audio Sampling Frequenz:	192 KHz&lt;br /&gt;
* Verzerrung:	1 KHz &amp;lt; 0.001%&lt;br /&gt;
* Spannungsbereich:	9 V – 15 V&lt;br /&gt;
* Störabstand:	&amp;gt; 120 dB&lt;br /&gt;
* Dynamikumfang:	&amp;gt; 100 dB&lt;br /&gt;
* Ruhestrom:	&amp;lt; 0.4 mA&lt;br /&gt;
* Maximale Stromaufnahme:	20 A&lt;br /&gt;
* Abmessungen (L x B x H):	185(206) x 114 x 40 mm&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;ohne zusätzliche Stromversorgung&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Gesteuert wird die Endstufe via Bluetooth der App von Axton (im Link der Endstufe).&amp;lt;br /&amp;gt;&lt;br /&gt;
Als Ausgang steht der Subwoofer-Kanal auf 2 Cinch-Buchsen zur Verfügung, womit auch dieser mit im DSP gesteuert wird.&amp;lt;br /&amp;gt;&lt;br /&gt;
Die Einstellungen sind sehr viel umfangreicher als die der Radios mit integriertem DSP (obwohl der gleiche DSP Chip verbaut ist!).&amp;lt;br /&amp;gt;&lt;br /&gt;
Der Leistung von 4x 76W RMS (im Vgl. zu ~ 4x30W RMS bei den Radios selbst) bringt den Rest und überzeugt damit voll und ganz.&amp;lt;br /&amp;gt;&lt;br /&gt;
'''Kabel für die externe Spannungsversorgung liegen NICHT bei. Genutzt werden kann jedes normale Endstufen-Anschlusskabel mit 5-10mm² Kabelquerschnitt. Hier wurde die Spannung am Sicherungsträger im Handschuhfach und die Masse hinterm Handschuhfach abgegriffen.'''&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
AxtonA580DSP E39.jpeg|Beispiele Axtons A580DSP im BMW E39&lt;br /&gt;
Axton A480DSP A430DSP P&amp;amp;P Kabel.jpg|Axton A480DSP A430DSP P&amp;amp;P Kabel&lt;br /&gt;
ISO Rundpin.jpg|Adapter Rund-PIN auf ISO&lt;br /&gt;
AxtonA580DSP LZK.jpeg|Laufzeitkorrektur&lt;br /&gt;
AxtonA580DSP Channel.jpeg|Channel Control&lt;br /&gt;
AxtonA580DSP Filter.jpeg|HPF/LPF&lt;br /&gt;
AxtonA580DSP EQ.jpeg|Equalizer&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&amp;lt;br /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andre</name></author>
	</entry>
	<entry>
		<id>https://xtrons.ibus-app.de/index.php?title=Bootlogo_%C3%A4ndern&amp;diff=4054</id>
		<title>Bootlogo ändern</title>
		<link rel="alternate" type="text/html" href="https://xtrons.ibus-app.de/index.php?title=Bootlogo_%C3%A4ndern&amp;diff=4054"/>
		<updated>2026-09-21T09:05:24Z</updated>

		<summary type="html">&lt;p&gt;Andre: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bootlogo== &lt;br /&gt;
Also Bootlogo wird das Bild bezeichnet, dass beim Hochfahren (Booten) des Radios gezeigt wird.&amp;lt;br&amp;gt;&lt;br /&gt;
Die meisten Radios verbleiben allerdings im &amp;quot;Standby&amp;quot;, so dass man das Bootlogo nur selten zu sehen bekommt.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Boot-Logo ändern für MTC basierte Radios (Xtrons PB-, PQ-, PQS-, IQ-Serie etc.) ===&lt;br /&gt;
&amp;lt;br /&amp;gt;Um das Bootlogo zu ändern:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
* Beisipiel-Bootlogo auf einen USB-Stick oder microSD-Karte runter laden, oder&amp;lt;br /&amp;gt;&lt;br /&gt;
** selbst erstelltes Logo als *.jpg order *.png in der Auflösung vom Radiodisplay erstellen&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* USB-Stick oder microSD-Karte mit dem Radio verbinden/einstecken&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* das Bild ideal auf den internen Speicher kopieren (ideal auf erste Ebene)&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;quot;Setup&amp;quot; → &amp;quot;CAR&amp;quot; oder &amp;quot;Fahrzeug-Einstellungen&amp;quot; [ab Android 7] → &amp;quot;Werkseinstellungen&amp;quot; → Passwort: 126 → &amp;quot;Carlogo&amp;quot; → Haken bei &amp;quot;User Logo&amp;quot; setzen und die Quelle auswählen [ggf. doppelt drauf tippen] → &amp;quot;Bootlogo&amp;quot; unten wählen → Menü verlassen&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Natürlich kann auch jedes andere beliebige Bild (*.jpg, Auflösung je nach Radio z.B. 1024x600)&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
Bootlogo1.jpg|Auswahl Bootlogo&lt;br /&gt;
Bootlogo2.jpg|Voransicht Bootlogo&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
'''Bootlogo:'''&amp;lt;br /&amp;gt;&lt;br /&gt;
[Rechtsklick → Speichern unter.. ]&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
Bootlogo-1024-600.png|Bootlogo OEM (1024x600) [Rechtsklick =&amp;gt; Speichern unter.. ]&lt;br /&gt;
BMW_Logo2_1024x600.jpg|Bootlogo I-BUS App (1024x600) [Rechtsklick =&amp;gt; Speichern unter.. ]&lt;br /&gt;
BMW_Logo3_1024x600.jpg|Bootlogo I-BUS App #2 (1024x600) [Rechtsklick =&amp;gt; Speichern unter.. ]&lt;br /&gt;
BMW_Logo4_1024x600.jpg|Bootlogo I-BUS App #3 (1024x600) [Rechtsklick =&amp;gt; Speichern unter.. ]&lt;br /&gt;
BMW Logo4 1280x720.png|Bootlogo I-BUS App #4 (1280x720) [Rechtsklick =&amp;gt; Speichern unter.. ]&lt;br /&gt;
Boot E38 V8.jpg|Bootlogo E38 V8 (1024x600) [Rechtsklick =&amp;gt; Speichern unter.. ]&lt;br /&gt;
Boot E39 V8.jpg|Bootlogo E39 V8 (1024x600) [Rechtsklick =&amp;gt; Speichern unter.. ]&lt;br /&gt;
BMW Logo4 1280x480.jpg|Bootlogo I-BUS App #3 (1280x480) [Rechtsklick =&amp;gt; Speichern unter.. ]&lt;br /&gt;
BMW Logo4 1920x720.png|Bootlogo I-BUS App #4 (1920x720) [Rechtsklick =&amp;gt; Speichern unter.. ]&lt;br /&gt;
BootLogo E46.jpeg|Bootlogo E46 (1024x600) [Rechtsklick =&amp;gt; Speichern unter.. ]&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Boot-Logo ändern für andere Radios (z.B. Xtrons IX-Serie etc.) ===&lt;br /&gt;
&amp;lt;br /&amp;gt;Um das Bootlogo zu ändern:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
* Beisipiel-Bootlogo auf einen USB-Stick oder microSD-Karte runter laden, oder&amp;lt;br /&amp;gt;&lt;br /&gt;
** &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;WICHTIG: das Bild MUSS eine *.png Datei sein und die Auflösung vom Radiodisplay haben!&amp;lt;/font&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
** &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;WICHTIG: das Bild MUSS den Namen ''android_1.png'' (Zahl darf variieren) tragen. Auf Kleinschreibung achten!!!!&amp;lt;/font&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
** &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;WICHTIG: beim Herunterladen und Speichern der beiden Beispieldateien unten &amp;quot;Android_..&amp;quot; unbedingt in &amp;quot;android_..&amp;quot; ändern!&amp;lt;/font&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* Auf einem USB Stick (formatiert auf FAT32!!!) einen Ordner &amp;quot;CAR_LOGO&amp;quot; (Großschreibung beachten!!!) erstellen und das Bild hineinkopieren &amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* USB-Stick mit dem Radio verbinden&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* Android-Setup öffnen &lt;br /&gt;
* &amp;quot;Auto-Einstellungen&amp;quot; → &amp;quot;Werkseinstellungen&amp;quot; → Code &amp;quot;0000&amp;quot; → links das Menü &amp;quot;Bootlogo&amp;quot; wählen → im Bild rechts oben auf &amp;quot;EXT&amp;quot; tippen &lt;br /&gt;
** '''Nun erscheint das Logo - aber nur wenn Name, Ordner, Größe etc den Anforderungen oben entsprechen!'''&lt;br /&gt;
* lange auf das gewünschte Logo tippen&lt;br /&gt;
* fertig&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
IX Bootlogo 1.jpeg|IX-Serie Beispiel Speicherort &amp;quot;CAR_LOGO&amp;quot;&lt;br /&gt;
IX 0 Setup .jpg|IX-Serie Einstellungen&lt;br /&gt;
IX 1 Autoeinstellungen.jpg|IX-Serie Auto-Einstellungen&lt;br /&gt;
126 Werkseinstellungen Logo.jpg|Werkseinstellungen =&amp;gt; Bootlogo&lt;br /&gt;
IX Bootlogo 2.jpeg|IX-Serie Bootlogo von EXT wählen&lt;br /&gt;
android 1.png|Bootlogo I-BUS App (1024x600) [Rechtsklick =&amp;gt; Speichern unter.. ]&lt;br /&gt;
android 2.png|Bootlogo I-BUS App #2 (1024x600) [Rechtsklick =&amp;gt; Speichern unter.. ]&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
=== Xtrons QP und QX Serie===&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=smuytYDzOSk&lt;/div&gt;</summary>
		<author><name>Andre</name></author>
	</entry>
	<entry>
		<id>https://xtrons.ibus-app.de/index.php?title=Bootlogo_%C3%A4ndern&amp;diff=4053</id>
		<title>Bootlogo ändern</title>
		<link rel="alternate" type="text/html" href="https://xtrons.ibus-app.de/index.php?title=Bootlogo_%C3%A4ndern&amp;diff=4053"/>
		<updated>2026-09-21T09:04:59Z</updated>

		<summary type="html">&lt;p&gt;Andre: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bootlogo== &lt;br /&gt;
Also Bootlogo wird das Bild bezeichnet, dass beim Hochfahren (Booten) des Radios gezeigt wird.&amp;lt;br&amp;gt;&lt;br /&gt;
Die meisten Radios verbleiben allerdings im &amp;quot;Standby&amp;quot;, so dass man das Bootlogo nur selten zu sehen bekommt.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Boot-Logo ändern für MTC basierte Radios (Xtrons PB-, PQ-, PQS-, IQ-Serie etc.) ===&lt;br /&gt;
&amp;lt;br /&amp;gt;Um das Bootlogo zu ändern:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
* Beisipiel-Bootlogo auf einen USB-Stick oder microSD-Karte runter laden, oder&amp;lt;br /&amp;gt;&lt;br /&gt;
** selbst erstelltes Logo als *.jpg order *.png in der Auflösung vom Radiodisplay erstellen&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* USB-Stick oder microSD-Karte mit dem Radio verbinden/einstecken&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* das Bild ideal auf den internen Speicher kopieren (ideal auf erste Ebene)&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;quot;Setup&amp;quot; → &amp;quot;CAR&amp;quot; oder &amp;quot;Fahrzeug-Einstellungen&amp;quot; [ab Android 7] → &amp;quot;Werkseinstellungen&amp;quot; → Passwort: 126 → &amp;quot;Carlogo&amp;quot; → Haken bei &amp;quot;User Logo&amp;quot; setzen und die Quelle auswählen [ggf. doppelt drauf tippen] → &amp;quot;Bootlogo&amp;quot; unten wählen → Menü verlassen&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Natürlich kann auch jedes andere beliebige Bild (*.jpg, Auflösung je nach Radio z.B. 1024x600)&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
Bootlogo1.jpg|Auswahl Bootlogo&lt;br /&gt;
Bootlogo2.jpg|Voransicht Bootlogo&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
'''Bootlogo:'''&amp;lt;br /&amp;gt;&lt;br /&gt;
[Rechtsklick → Speichern unter.. ]&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
Bootlogo-1024-600.png|Bootlogo OEM (1024x600) [Rechtsklick =&amp;gt; Speichern unter.. ]&lt;br /&gt;
BMW_Logo2_1024x600.jpg|Bootlogo I-BUS App (1024x600) [Rechtsklick =&amp;gt; Speichern unter.. ]&lt;br /&gt;
BMW_Logo3_1024x600.jpg|Bootlogo I-BUS App #2 (1024x600) [Rechtsklick =&amp;gt; Speichern unter.. ]&lt;br /&gt;
BMW_Logo4_1024x600.jpg|Bootlogo I-BUS App #3 (1024x600) [Rechtsklick =&amp;gt; Speichern unter.. ]&lt;br /&gt;
BMW Logo4 1280x720.png|Bootlogo I-BUS App #4 (1280x720) [Rechtsklick =&amp;gt; Speichern unter.. ]&lt;br /&gt;
Boot E38 V8.jpg|Bootlogo E38 V8 (1024x600) [Rechtsklick =&amp;gt; Speichern unter.. ]&lt;br /&gt;
Boot E39 V8.jpg|Bootlogo E39 V8 (1024x600) [Rechtsklick =&amp;gt; Speichern unter.. ]&lt;br /&gt;
BMW Logo4 1280x480.jpg|Bootlogo I-BUS App #3 (1280x480) [Rechtsklick =&amp;gt; Speichern unter.. ]&lt;br /&gt;
BMW Logo4 1920x720.png|Bootlogo I-BUS App #4 (1920x720) [Rechtsklick =&amp;gt; Speichern unter.. ]&lt;br /&gt;
BootLogo E46.jpeg|Bootlogo E46 (1024x600) [Rechtsklick =&amp;gt; Speichern unter.. ]&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Boot-Logo ändern für andere Radios (z.B. Xtrons IX-Serie etc.) ===&lt;br /&gt;
&amp;lt;br /&amp;gt;Um das Bootlogo zu ändern:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
* Beisipiel-Bootlogo auf einen USB-Stick oder microSD-Karte runter laden, oder&amp;lt;br /&amp;gt;&lt;br /&gt;
** &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;WICHTIG: das Bild MUSS eine *.png Datei sein und die Auflösung vom Radiodisplay haben!&amp;lt;/font&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
** &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;WICHTIG: das Bild MUSS den Namen ''android_1.png'' (Zahl darf variieren) tragen. Auf Kleinschreibung achten!!!!&amp;lt;/font&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
** &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;WICHTIG: beim Herunterladen und Speichern der beiden Beispieldateien unten &amp;quot;Android_..&amp;quot; unbedingt in &amp;quot;android_..&amp;quot; ändern!&amp;lt;/font&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* Auf einem USB Stick (formatiert auf FAT32!!!) einen Ordner &amp;quot;CAR_LOGO&amp;quot; (Großschreibung beachten!!!) erstellen und das Bild hineinkopieren &amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* USB-Stick mit dem Radio verbinden&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* Android-Setup öffnen &lt;br /&gt;
* &amp;quot;Auto-Einstellungen&amp;quot; → &amp;quot;Werkseinstellungen&amp;quot; → Code &amp;quot;0000&amp;quot; → links das Menü &amp;quot;Bootlogo&amp;quot; wählen → im Bild rechts oben auf &amp;quot;EXT&amp;quot; tippen &lt;br /&gt;
** '''Nun erscheint das Logo - aber nur wenn Name, Ordner, Größe etc den Anforderungen oben entsprechen!'''&lt;br /&gt;
* lange auf das gewünschte Logo tippen&lt;br /&gt;
* fertig&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
IX Bootlogo 1.jpeg|IX-Serie Beispiel Speicherort &amp;quot;CAR_LOGO&amp;quot;&lt;br /&gt;
IX 0 Setup .jpg|IX-Serie Einstellungen&lt;br /&gt;
IX 1 Autoeinstellungen.jpg|IX-Serie Auto-Einstellungen&lt;br /&gt;
126 Werkseinstellungen Logo.jpg|Werkseinstellungen =&amp;gt; Bootlogo&lt;br /&gt;
IX Bootlogo 2.jpeg|IX-Serie Bootlogo von EXT wählen&lt;br /&gt;
android 1.png|Bootlogo I-BUS App (1024x600) [Rechtsklick =&amp;gt; Speichern unter.. ]&lt;br /&gt;
android 2.png|Bootlogo I-BUS App #2 (1024x600) [Rechtsklick =&amp;gt; Speichern unter.. ]&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
=== Xtrons QB und QX Serie===&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=smuytYDzOSk&lt;/div&gt;</summary>
		<author><name>Andre</name></author>
	</entry>
	<entry>
		<id>https://xtrons.ibus-app.de/index.php?title=Apple_Carplay_%26_Android_Auto&amp;diff=4052</id>
		<title>Apple Carplay &amp; Android Auto</title>
		<link rel="alternate" type="text/html" href="https://xtrons.ibus-app.de/index.php?title=Apple_Carplay_%26_Android_Auto&amp;diff=4052"/>
		<updated>2026-09-18T07:11:18Z</updated>

		<summary type="html">&lt;p&gt;Andre: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mögliche Adapter für Apple Carplay &amp;amp; Android-Auto sind: &lt;br /&gt;
* '''[https://www.amazon.de/Smart-CarPlay-Android-Navigation-Player/dp/B076D2BP4S/ref=sr_1_4?ie=UTF8&amp;amp;qid=1516269503&amp;amp;sr=8-4&amp;amp;keywords=apple%20carplay%20android Smart Link Apple USB CarPlay Box für Android Navigation Player Mini USB CarPlay]'''&lt;br /&gt;
* '''[https://www.amazon.de/Carlinkit-AndroidAuto-Android-Autoradio-MirrorScreen-Online-Upgrade-Verdrahtet/dp/B0919JS1K3 Carlinkit Wired CarPlay/Wired Android Auto Adapter für Android Radio Car] '''&lt;br /&gt;
* '''[https://www.amazon.de/dp/B07G15DXDM/ref=cm_sw_r_cp_api_eeD4BbH15505N?fbclid=IwAR18emNm6af7tlNvugwZV2DMQv76QLR1eiivZeh4hSVK-YJPqOpWHyfeZhA ATOTO CarPlay Adaper] '''&lt;br /&gt;
* '''[https://www.amazon.de/Dasaita-CarPlay-Android-Navigation-unterst%C3%BCtzen/dp/B075B7T4W2/ref=sr_1_9?__mk_de_DE=%C3%85M%C3%85%C5%BD%C3%95%C3%91&amp;amp;keywords=carplay+usb&amp;amp;qid=1563520528&amp;amp;s=gateway&amp;amp;sr=8-9 dasaita CarPlay Adaper]'''&lt;br /&gt;
* '''[https://xtrons.co.uk/carautoplay-cp02 Xtrons CP02] (kabelgebunden)'''&lt;br /&gt;
* '''[https://xtrons.co.uk/wireless-carautoplay-cp03 Xtrons CP03] (wireless)'''&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Beispielbilder für die Verbindung mit einem iPhone:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
Carplay.jpg|AutoPlayBox&lt;br /&gt;
CarPlay 00.jpg|CarPlay&lt;br /&gt;
CarPlay 01.jpg|CarPlay&lt;br /&gt;
CarPlay 02.jpg|CarPlay&lt;br /&gt;
CarPlay 03.jpg|CarPlay&lt;br /&gt;
CarPlay 04.jpg|CarPlay&lt;br /&gt;
CarPlay 05.jpg|CarPlay&lt;br /&gt;
CarPlay 06.jpg|CarPlay&lt;br /&gt;
CarPlay 07.jpg|CarPlay&lt;br /&gt;
CarPlay 08.jpg|CarPlay&lt;br /&gt;
CarPlay 09.jpg|CarPlay&lt;br /&gt;
CarPlay 10.jpg|CarPlay&lt;br /&gt;
CarPlay 11.jpg|CarPlay&lt;br /&gt;
CarPlay 12.jpg|CarPlay&lt;br /&gt;
CarPlay 13.jpg|CarPlay&lt;br /&gt;
Cp02-1.jpg|Xtrons CP02&lt;br /&gt;
Cp03-2.jpg|Xtrons CP03&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Beispielbilder für die Verbindung mit einem Android-Smartphone:&amp;lt;br /&amp;gt;&lt;br /&gt;
''..folgen..''&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Zusammen mit der zugehörigen App [https://download.speedy-pics.de/uploads/android/AutoKit_2024.04.29.1049.apk&amp;lt;big&amp;gt;'''AutoKit (2024-04-29)'''&amp;lt;/big&amp;gt;], [https://download.speedy-pics.de/uploads/android/AutoKit_2023.02.27.1452.apk &amp;lt;big&amp;gt;'''AutoKit (2023-02-27)'''&amp;lt;/big&amp;gt;] oder  [https://download.speedy-pics.de/uploads/android/AutoKit_2020.06.12.0947.apk &amp;lt;big&amp;gt;'''AutoKit (2020-06-12)'''&amp;lt;/big&amp;gt;] funtkioniert dieser wohl sehr gut. [für ''Smart Link'']&amp;lt;br /&amp;gt;&lt;br /&gt;
Hier bekommt ihr die App '''[http://download.speedy-pics.de/uploads/safe/AutoKit.apk AutoKit]''' für den ''ATOTO-Adapter''.&amp;lt;br /&amp;gt;&lt;br /&gt;
Download [http://download.speedy-pics.de/uploads/android/Autokit_v1.12.0.apk &amp;lt;big&amp;gt;'''AutoKit v1.12.0'''&amp;lt;/big&amp;gt;]&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
'''''*NEU*''''' Download [http://download.speedy-pics.de/uploads/android/AutoPlayBox_V_2020.01.20.1300.apk &amp;lt;big&amp;gt;'''AutoPlayBox v2020.01.20'''&amp;lt;/big&amp;gt;] '''''*NEU*'''''&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Danke [https://www.facebook.com/springmaus.58 Roy] für den Tipp, bei Fragen bitte direkt an ihn wenden.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
'''''*NEU*''''' Download [https://download.speedy-pics.de/uploads/android/CarLinKit_autokit.apk &amp;lt;big&amp;gt;'''CarLinKit'''&amp;lt;/big&amp;gt;] '''''*NEU*''''' &amp;lt;small&amp;gt;[Stand: 11.01.2022]&amp;lt;/small&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Apple CarPlay Box Update'''&amp;lt;/big&amp;gt; &amp;lt;small&amp;gt;(Stand 2018-12-31)&amp;lt;/small&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://download.speedy-pics.de/uploads/weblink/Auto_Box_Update.img Datei] auf USB Stick Kopieren und an die Box stecken. Installation startet automatisch.&amp;lt;br /&amp;gt;&lt;br /&gt;
Mit dem neuem Update kann man auch sein Telefon Spiegeln. Das funktioniert aber derzeit noch nicht so gut. (Beta Version)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''Infoseite von Xtrons:'''&amp;lt;br&amp;gt;&lt;br /&gt;
[https://bbs.xtrons.com/viewtopic.php?t=582992 Instructions for CarPlay and Android Auto on XTRONS Head Units]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''[https://xtrons.co.uk/apk/autokit.apk Download Xtrons - AutoKit App]'''&lt;/div&gt;</summary>
		<author><name>Andre</name></author>
	</entry>
	<entry>
		<id>https://xtrons.ibus-app.de/index.php?title=Xtrons_IQ-IBUS-Serie&amp;diff=4051</id>
		<title>Xtrons IQ-IBUS-Serie</title>
		<link rel="alternate" type="text/html" href="https://xtrons.ibus-app.de/index.php?title=Xtrons_IQ-IBUS-Serie&amp;diff=4051"/>
		<updated>2026-09-10T09:48:39Z</updated>

		<summary type="html">&lt;p&gt;Andre: /* Firmware und MCU für IQx4xx */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--  Seite in Arbeit --&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Technische Daten ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Bezugsquelle für '''[https://shop.ibus-app.de/detail/index/sArticle/390 IQ7439BL]''', '''[https://shop.ibus-app.de/detail/index/sArticle/374 IQ7446IBUS ]''', '''[https://shop.ibus-app.de/detail/index/sArticle/375 IQ1439IBUS ]''' und '''[https://shop.ibus-app.de/detail/index/sArticle/379 IQ1453BH ]''' ausschließlich im I-BUS App Shop.&amp;lt;br /&amp;gt;&lt;br /&gt;
* Qualcomm 665 CPU&lt;br /&gt;
* 8GB RAM&lt;br /&gt;
* 256GB Speicher&lt;br /&gt;
* echtes Android 13 (API Level 33)&lt;br /&gt;
* OEM-nahes Frontpanel&lt;br /&gt;
** weder DVD-Laufwerk noch SD-Slots&lt;br /&gt;
** verbesserte Haptik der Tasten&lt;br /&gt;
* hochauflösendes IPS Display&lt;br /&gt;
* extrem kurze Bauform (passt auch in der BMW E38)&lt;br /&gt;
* integriertes wireless Carplay und Android Auto&lt;br /&gt;
* eingebautes DSP (keine Steuerung des DSP ab Werk)&lt;br /&gt;
* Endstufe TDA7851 (4* 45W)&lt;br /&gt;
* unterstützung von AHD-Kameras bis 1920x1080&lt;br /&gt;
* integrierter Lüfter&lt;br /&gt;
* digitaler Ausgang&lt;br /&gt;
* Anschlussstecker für Resler Modul&lt;br /&gt;
* Dualband-WiFi (2,4 und 5 GHz)&lt;br /&gt;
* Unterstützung der originalen Lenkradtasten&lt;br /&gt;
* Bluetooth 5.0&lt;br /&gt;
* 3x USB&lt;br /&gt;
* SIM Karten-Leser für uintegriertes 4G Modem&lt;br /&gt;
* GPS Antenne für Navigation &lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
IQ7339IBUS 01.jpg|Xtrons IQ7339IBUS für BMW  E39 7&amp;quot; Qualcomm 665 / 8GB / 256GB&lt;br /&gt;
IQ7339IBUS 02.jpg|Xtrons IQ7339IBUS Rückansicht&lt;br /&gt;
IQ7339IBUS 03.jpg|Xtrons IQ7339IBUS Zubehör&lt;br /&gt;
IQ7339IBUS 04.jpg|Xtrons IQ7339IBUS Stecker für Resler Modul/Interface&lt;br /&gt;
IQ7339IBUS 05.jpg|Xtrons IQ7339IBUS Draufsicht&lt;br /&gt;
IQ7339IBUS 06.jpg|Xtrons IQ7339IBUS CPU Info: API 33&lt;br /&gt;
IQ7339IBUS 07.jpg|Xtrons IQ7339IBUS Abmessungen&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hier sollen einige Hinweise zur Xtrons IQ Serie - speziell für die Version &amp;quot;IBUS&amp;quot; erscheinen ==&lt;br /&gt;
# Code Für Werkseinstellungen: 126&lt;br /&gt;
# '''aktuelle Firmware:''' ''Link folgt''&lt;br /&gt;
# '''externes Mikrofon:''' Android-Einstellungen =&amp;gt; CAR =&amp;gt; Werkseinstellungen (Code: 126) =&amp;gt;  weitere Einstellungen ==&amp;gt; Mikrofon auf &amp;quot;Extern&amp;quot; ändern&lt;br /&gt;
# '''Rückfahrkamera:''' [https://xtrons.ibus-app.de/index.php?title=Abschalten_des_schwarzen_Bildschirms_(R%C3%BCckfahrkamera)_beim_Einlegen_des_R%C3%BCckw%C3%A4rtsganges#ab_Android_8 (De-)Aktivieren der Rückfahrkamera beim IQ]&lt;br /&gt;
# [https://xtrons.ibus-app.de/index.php?title=Bootlogo_%C3%A4ndern#Boot-Logo_%C3%A4ndern_f%C3%BCr_andere_Radios_(z.B._Xtrons_IX-Serie_etc.) Bootlogo ändern]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Unboxing ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Unboxing Video:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://youtu.be/NazHVVhhcqo&amp;lt;/youtube&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
== Anschlüsse ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''Hier ein Anschlussplan des Xtrons IQ7339IBUS.&amp;lt;br&amp;gt;&lt;br /&gt;
Ergänzt ist der '''[https://shop.ibus-app.de/detail/index/sArticle/392 Anschlussadapter für das Resler-Modul]''', der nur bei Geräten mit der Endung &amp;quot;..IBUS&amp;quot; in der Artikelnummer bzw. dem IQ7439BL &amp;quot;mit I-BUS-App Paket&amp;quot; enthalten ist.'''&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
IQ7339IBUS pinout.jpg|Radioanschlüsse&lt;br /&gt;
IQ7439IBUS 01.jpg|Anschluss mit Resler Modul und IBUS-Adapter&lt;br /&gt;
AdapterXtrons01.jpg|Anschlussadapter für das Resler-Modul&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Einbau-Video ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Einbau-Video:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=hny-gJQQ6Tc&amp;lt;/youtube&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Menü-Übersicht/Einstellungen ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Genereller Hinweis: einige Menü-Punkte und Funktionen können je nach Version der Firmware komplett oder geringfügig anders benannt sein.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== DSP / Equalizer (IQ7339IBUS) ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
DSP- und Equalizer Einstellungen.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
03 IQ7339IBUS Androidsetup CAR 03 EQ 01.png|DSP - Equalizer&lt;br /&gt;
03 IQ7339IBUS Androidsetup CAR 03 EQ 02.png|DSP - Loundness, Bassboost etc.&lt;br /&gt;
03 IQ7339IBUS Androidsetup CAR 03 EQ 03.png|DSP - Fader + Balance&lt;br /&gt;
03 IQ7339IBUS Androidsetup CAR 03 EQ 04.png|DSP - Laufzeitkorrektur&lt;br /&gt;
03 IQ7339IBUS Androidsetup CAR 03 EQ 01.png|DSP - Setup Laufzeitkorrektur&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
Mehr Info zum Thema [https://xtrons.ibus-app.de/index.php?title=Was_ist_DSP%3F_Digitaler_Soundprozessor#High_Pass_Filter_und_Low_Pass_Filter_(HPF/LPF) Low/Highpass] und [https://xtrons.ibus-app.de/index.php?title=Was_ist_DSP%3F_Digitaler_Soundprozessor#Laufzeitkorrektur_(LZK) Laufzeitkorrektur].&amp;lt;br&amp;gt;&lt;br /&gt;
'''Info zur Laufzeitkorrektur beim IQ: man setzt hier den Abstand zwischen den Lautsprechern links-recht und vorn-hinten im Wagen. Die Subwoofer-Position ist nicht separat einstellbar!'''&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
=== DSP / Equalizer (IQx4xxIBUS) ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
DSP- und Equalizer Einstellungen.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
03 IQx4xxIBUS Androidsetup CAR 03 EQ 01.jpg|DSP - Equalizer&lt;br /&gt;
03 IQx4xxIBUS Androidsetup CAR 03 EQ 02.jpg|DSP - Laufzeitkorrektur&lt;br /&gt;
03 IQx4xxIBUS Androidsetup CAR 03 EQ 03.jpg|DSP - DTS&lt;br /&gt;
03 IQx4xxIBUS Androidsetup CAR 03 EQ 04.jpg|DSP - separate Lautstärken&lt;br /&gt;
03 IQx4xxIBUS Androidsetup CAR 03 EQ 05.jpg|DSP - High/LowPass Einstellungen&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
Das IQx4xxIBUS verfügt neben dem DSP noch über &amp;quot;DTS&amp;quot;. Hier können u.a. ein virtueller Center Lautsprecher im Armaturenbrett und div. Klangfarben gesetzt werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Mehr Info zum Thema [https://xtrons.ibus-app.de/index.php?title=Was_ist_DSP%3F_Digitaler_Soundprozessor#High_Pass_Filter_und_Low_Pass_Filter_(HPF/LPF) Low/Highpass] und [https://xtrons.ibus-app.de/index.php?title=Was_ist_DSP%3F_Digitaler_Soundprozessor#Laufzeitkorrektur_(LZK) Laufzeitkorrektur].&amp;lt;br&amp;gt;&lt;br /&gt;
'''Info zur Laufzeitkorrektur beim IQ: man setzt hier den Abstand zwischen den Lautsprechern links-recht und vorn-hinten im Wagen. Die Subwoofer-Position ist nicht separat einstellbar!'''&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Android-Setup===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
00 IQ7339IBUS Androidsetup.png|Android-Einstellung&lt;br /&gt;
01 IQ7339IBUS Androidsetup Netzwerk.png|Netzwerke&lt;br /&gt;
02 IQ7339IBUS Androidsetup Verbundene-Geräte.png|Verbundene Geräte&lt;br /&gt;
03 IQ7339IBUS Androidsetup CAR.png|CAR&lt;br /&gt;
03 IQ7339IBUS Androidsetup CAR 01.png|CAR =&amp;gt; LED&lt;br /&gt;
03 IQ7339IBUS Androidsetup CAR 02.png|CAR =&amp;gt; Lenkradtasten anlernen. HINWEIS: Funktioniert so nicht für BMW E39/E38 !&lt;br /&gt;
03 IQ7339IBUS Androidsetup CAR 03.png|CAR =&amp;gt; Navi-Einstellungen&lt;br /&gt;
03 IQ7339IBUS Androidsetup CAR 04.png|CAR =&amp;gt; Voice-Assistent&lt;br /&gt;
03 IQ7339IBUS Androidsetup CAR 05.png|CAR =&amp;gt; Fahreinstellungen&lt;br /&gt;
03 IQ7339IBUS Androidsetup CAR 06.png|CAR =&amp;gt; Extra-Einstellungen&lt;br /&gt;
04 IQ7339IBUS Androidsetup Apps.png|Apps&lt;br /&gt;
05 IQ7339IBUS Androidsetup Benachrichtigungen.png|Benachrichtigungen&lt;br /&gt;
06 IQ7339IBUS Androidsetup Speicher.png|Speicher&lt;br /&gt;
07 IQ7339IBUS Androidsetup Ton+Vibration.png| Ton &amp;amp; Vibration&lt;br /&gt;
08 IQ7339IBUS Androidsetup Display.png|Display&lt;br /&gt;
09 IQ7339IBUS Androidsetup Hintergrund.png|Hintergrund&lt;br /&gt;
10 IQ7339IBUS Androidsetup Sicherheit.png|Sicherheit&lt;br /&gt;
11 IQ7339IBUS Androidsetup Datenschutz.png|Datenschutz&lt;br /&gt;
12 IQ7339IBUS Androidsetup Standort.png|Standort&lt;br /&gt;
14 IQ7339IBUS Androidsetup Screenshot 01.png|Screenshot&lt;br /&gt;
14 IQ7339IBUS Androidsetup Screenshot 01.png|Screenshot (&amp;quot;erweitert&amp;quot; und &amp;quot;teilen&amp;quot;)&lt;br /&gt;
15 IQ7339IBUS Androidsetup System.png|System - Sprache und Zeit anpassen, MCU- und System-Updates&lt;br /&gt;
16 IQ7339IBUS Androidsetup Über.png|Über das Tablet&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
=== Werkseinstellungen ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Erreichbar über Android-Setup =&amp;gt; CAR =&amp;gt; Werkseinstellungen: Code: 126&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
03 IQ7339IBUS Androidsetup CAR 09 factorysettings 01.jpg|Code für Werkseinstellungen&lt;br /&gt;
03 IQ7339IBUS Androidsetup CAR 09 factorysettings 02.jpg|App Einstellungen&lt;br /&gt;
03 IQ7339IBUS Androidsetup CAR 09 factorysettings 03.jpg|Boot Logo&lt;br /&gt;
03 IQ7339IBUS Androidsetup CAR 09 factorysettings 05.jpg|Radio&lt;br /&gt;
03 IQ7339IBUS Androidsetup CAR 09 factorysettings 05a.png|Lautstärken&lt;br /&gt;
16_Werkseinstellungen_CAN.jpeg|CAN BUS Einstellungen&lt;br /&gt;
03 IQ7339IBUS Androidsetup CAR 09 factorysettings 04.jpg|Tasten und Touch anlernen&lt;br /&gt;
03 IQ7339IBUS Androidsetup CAR 09 factorysettings 06.jpg|Tasten anlernen&lt;br /&gt;
03 IQ7339IBUS Androidsetup CAR 09 factorysettings 07.jpg|Tasten anlernen&lt;br /&gt;
03 IQ7339IBUS Androidsetup CAR 09 factorysettings 08.jpg|Display Einstellungen&lt;br /&gt;
03 IQ7339IBUS Androidsetup CAR 09 factorysettings 09.jpg|Weitere Einstellungen&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wichtige Einstellungen für BMW E39 in Verbindung mit der I-BUS App ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Einige Funktionen für den BC kann das IQ selbst, aber  teils funktioniert das nicht korrekt. Daher ideal diese Funktionen deaktivieren und über die I-BUS App nutzen.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== CAN Einstellung===&lt;br /&gt;
&amp;lt;br&amp;gt;CAN-Einstellung in den Werkseinstellungen unter &amp;quot;CAN&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
Auswahl:&lt;br /&gt;
# Canbus: &amp;quot;135 BMW E46 (LZ)&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
# Typ: VFL: &amp;quot;0H&amp;quot; // FL: &amp;quot;1H&amp;quot;&lt;br /&gt;
# Amplifier: &amp;quot;without Amplifier&amp;quot; '''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;'''&lt;br /&gt;
# Front door: &amp;quot;Hide&amp;quot;&lt;br /&gt;
# Air condition: &amp;quot;Hide&amp;quot;&lt;br /&gt;
# Backdoor: &amp;quot;Hide&amp;quot;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;''' Vor allem wichtig bei DSP ab Werk um die hohe Lautstärke nach Radiostart zu unterbinden. Ton kommt dann erst, nach dem die [http://www.ibus-app.de I-BUS App] läuft und das DSP startet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
16 Werkseinstellungen CAN.jpeg|CAN BUS Einstellungen&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Car Setup App ===&lt;br /&gt;
Die &amp;quot;Car Setup&amp;quot; App ist von Werk installiert.&amp;lt;br&amp;gt;&lt;br /&gt;
Hier bitte die folgenden Optionen deaktivieren:&lt;br /&gt;
# Speed limit activation&lt;br /&gt;
# Memo&lt;br /&gt;
# AUD+OBD&lt;br /&gt;
Ob und wie gut die anderen Funktionen hier arbeiten muss noch geprüft werden.&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
Car Setup.jpeg|Car Setup&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Digitaler Ausgang am Xtrons und BMW DSP ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Das Xtrons IQ7339IBUS verfügt über einen digitalen Ausgang als S/PDIF (COAX) via Cinch und optisch via TOSLINK&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
Der Nachfolger Xtrons IQ7439IBUS (bzw. IQ7439BL, IQ7446BL, IQ1439BL, IQ1453BL..) verfügt über einen digitalen Ausgang optisch via TOSLINK&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
Die DSP Endstufe des BMW E39 verfügt über einen digitalen Eingang (SMB-Buchse) der das S/PDIF Signal unterstützt. Entsprechend kann man den Ton digital aus dem Xtrons direkt in die DSP Endstufe (sofern vorhanden!) verlust- und störungsfrei übertragen. Hierfür benötigt man ein Kabel mit Cinch-Stecker und SMB-Stecker mit ca. 6m Länge. Aktuell wird es über ein normales Cinchkabel, Adapter Cinch auf FAKRA und Adapter FAKRA auf SMB zum Test genutzt. &amp;lt;br&amp;gt;&lt;br /&gt;
Hier das passende Kabel: [https://shop.ibus-app.de/i-bus-app/zubehoer/adapterkabel/372/anschlusskabel-xtrons-koaxial-an-dsp-endstufe-cinch-m-smb-f-6m?number=Cinch-SMB Anschlusskabel Xtrons koaxial an DSP-Endstufe, Cinch(m)-SMB(f), 6m]&amp;lt;br&amp;gt;&lt;br /&gt;
'''WICHTIG:''' damit das DSP umschaltet auf  den digitalen Eingang, muss man diesen in der I-BUS App umschalten auf &amp;quot;CD-Wechsler&amp;quot;. Eine detaillierte Anleitung folgt.&amp;lt;br&amp;gt;&lt;br /&gt;
'''HINWEIS:''' Beim BMW E39 Facelift ist der CD-Wechsler über das Radio eingebunden und steckt nicht am SMB (dig. Eingang) am Wechsler. Beim VFL Steckt der CD-Wechsler ab Werk am SMB. Heißt hier muss man sich entscheiden ob man den CD Wechsler weiter via dig. Eingang nutzen mag oder das Xtrons digital anschließt.&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
S PDIF+DSP.jpeg|Digitaler Anschluss des Xtrons via SMB an der DSP Endstufe&lt;br /&gt;
IQ7339IBUS_02.jpg|&amp;quot;COAXIAL&amp;quot;. digitaler Cinch-Ausgang als S/PDIF Signal&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; Nutzbar für DSP via TOSLINK zu S/PDIF Konverter.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== weitere Einstellungen ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Pausieren/Stopp von Youtube mit Licht an/aus vermeiden ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Die neue Benutzeroberfläche der IQ Serie (ab IQx4xx.. / Android 14) bringt u.a. die Option das Theme vom Radio mit dem Licht auf Hell/Dunkel umzustellen mit Licht an/aus.&amp;lt;br&amp;gt;&lt;br /&gt;
Leider hat dieses Umstellen Auswirkung auf u.a. die App Youtube, welche damit die Wiedergabe pausiert und das Bild minimiert.&amp;lt;br&amp;gt;&lt;br /&gt;
Beheben lässt sich das entweder durch die Deaktivierung der Theme-Umschaltung vom Radio - oder durch die Festlegung der Oberfläche in Youtube auf Hell oder Dunkel.&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
IQx4xxIBUS Modus.png|Oben rechts: Theme-Umschaltung mit Licht an/aus&lt;br /&gt;
IQx4xx YT-pause DE 01 .jpg|Benutzer Seite öffnen&lt;br /&gt;
IQx4xx YT-pause DE 02 .jpg|Einstellungen öffnen&lt;br /&gt;
IQx4xx YT-pause DE 03 .jpg|Darstellungs-Einstellungen&lt;br /&gt;
IQx4xx YT-pause DE 04 .jpg|Darstellungs-Einstellungen: Standard-Einstellung&lt;br /&gt;
IQx4xx YT-pause DE 05 .jpg|Darstellungs-Einstellungen: Festlegung helles oder dunkles Design&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lüfter-Einstellungen ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Die neue IQ Serie (ab IQx4xx.. / Android 14) bringt u.a. die Option das An-/Abschalten des hinten verbauten Lüfters anzupassen.&amp;lt;br&amp;gt;&lt;br /&gt;
Mit Tippen auf die Temperatur kann man die EInschaltschwelle für den Lüfter setzen. Ab Werk sind es 90°C - Gesetzt haben wir den Wert (nicht dargestellt) auf 60°C.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
IQx4xxIBUS Fan 01.png|Lüfter-Einstellungen&lt;br /&gt;
IQx4xxIBUS Fan 02.png|Lüfter-Einstellungen: Einschaltschwelle original&lt;br /&gt;
IQx4xxIBUS Fan 03.png|Lüfter-Einstellungen: Einschaltschwelle gesetzt auf 60°C (nicht dargestellt)&lt;br /&gt;
IQx4xxIBUS Fan 04.png|Lüfter-Einstellungen: Lüfter läuft&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Split-Screen ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Hier ein Video wie man Split-Screen auf dem IQ nutzt:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=2wI2-sqIhE4&amp;lt;/youtube&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Firmware und MCU ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Anleitung wie ein '''[[Firmwareupdate]]''' funktioniert. (Anleitung für &amp;quot;IQ-Serie&amp;quot; nutzen)&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''WICHTIG: die Firmware und MCU funktioniert nur für das jeweils spezifizierte Xtrons. Die Verwendung am falschen Gerät kann zu (irreparablen) Fehlfunktionen führen!'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
=== Firmware und MCU für IQx3xx ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Die aktuelle Version der Firmware für das IQ7339IBUS ist die '''2025-01-06 mit MCU 4.54'''.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''[https://download.speedy-pics.de/uploads/android/firmware/IQ-8+256_13.0_lf_sc138_13_(20250106)_MCU_4.54.rar Download Firmware für IQ3439IBUS - Stand: 2025-01-06]''' (1,5GB)&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''[https://download.speedy-pics.de/uploads/android/MCU/HCTGQ_HCT_V4.54_IQx3xxIBUS.zip MCU 4.54  für IQx3xxIBUS]'''&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Firmware und MCU für IQx4xx ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Die aktuelle Version der Firmware für das IQx4xxIBUS ist die '''2025-06-27''' letzte MCU ist Version '''4.56'''.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''[https://download.speedy-pics.de/uploads/android/firmware/FL-IQ_8+256_7inch_ibus_V1_13_(20250731).zip Download Firmware für IQ7439IBUS (7&amp;quot; Radios - v1) - Stand: 2025-07-31]''' (1,5GB)&amp;lt;br&amp;gt;&lt;br /&gt;
'''[https://1drv.ms/u/c/2f0141a45c14e785/IQAKO8cRBFvoTaTymIR4TcAoAV9r-b7ccaVc8vWteL2nBok?e=9oEfYA Download Firmware für IQ7439.. und IQ7446.. (7&amp;quot; Radios - v1) - Stand: 2026-04-30]''' (1,5GB)&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''[https://1drv.ms/u/c/2f0141a45c14e785/IQB4C4AKqz24Rok-uqNTIyUQASy6e0oyc7OzAuIroyLb12U?e=y6ssYU Download Firmware für IQ7439.. und IQ7446.. (7&amp;quot; Radios - v2) - Stand: 2026-04-23]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''[https://1drv.ms/u/c/2f0141a45c14e785/IQB9vtjRKsMfTpHVGgUfXP-RAYKL0JkimE05dnPPzRWvBPc?e=5XwWdE Download Firmware für IQ7439.. und IQ7446.. (7&amp;quot; Radios - v2) - Stand: 2026-07-17]'''&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''[https://1drv.ms/u/c/2f0141a45c14e785/IQBPjwQM1isVRolZFu9GiVIhAT6wFOuA57EFTtoQ9flpzNU?e=6kJT2L Download Firmware für IQ8446.. und IQ1439.. und IQ1453.. (8,8&amp;quot; und 10,25&amp;quot; Radios - v1) - Stand: 2025-12-18]''' (1,5GB)&amp;lt;br&amp;gt;&lt;br /&gt;
'''[https://1drv.ms/u/c/2f0141a45c14e785/IQAcSasWcOUmS5yOwjxCeW4jASbdcLHE9cO2ZYzmhVB_oSY?e=er3GxV Download Firmware für IQ8446.. und IQ1439.. und IQ1453.. (8,8&amp;quot; und 10,25&amp;quot; Radios - v1) - Stand: 2026-05-27]''' (1,5GB)&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''[https://1drv.ms/u/c/2f0141a45c14e785/IQATys0-HS03S6M0iHco-ttIAbfUatTkte-O6Ete0qL7FbE?e=oDnQoU Download Firmware für IQ8446.. und IQ1439.. und IQ1453.. (8,8&amp;quot; und 10,25&amp;quot; Radios - v2) - Stand: 2025-12-18]''' (1,5GB)&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''[https://download.speedy-pics.de/uploads/android/MCU/HCTGS_HCT_V4.56d_IQx4xxIBUS.zip MCU 4.56 für IQx4xx]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''[https://download.speedy-pics.de/uploads/android/MCU/HCTGS_HCT_V4.57.zip MCU 4.57d für IQx4xx]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''[https://download.speedy-pics.de/uploads/android/MCU/HCTGS_HCT_V4.57t.zip MCU 4.57t für IQx4xx]''' '''verbessert schlechten FM-Radio Empfang'''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andre</name></author>
	</entry>
	<entry>
		<id>https://xtrons.ibus-app.de/index.php?title=Xtrons_IQ-IBUS-Serie&amp;diff=4050</id>
		<title>Xtrons IQ-IBUS-Serie</title>
		<link rel="alternate" type="text/html" href="https://xtrons.ibus-app.de/index.php?title=Xtrons_IQ-IBUS-Serie&amp;diff=4050"/>
		<updated>2026-09-08T06:33:21Z</updated>

		<summary type="html">&lt;p&gt;Andre: /* Firmware und MCU für IQx4xx */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--  Seite in Arbeit --&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Technische Daten ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Bezugsquelle für '''[https://shop.ibus-app.de/detail/index/sArticle/390 IQ7439BL]''', '''[https://shop.ibus-app.de/detail/index/sArticle/374 IQ7446IBUS ]''', '''[https://shop.ibus-app.de/detail/index/sArticle/375 IQ1439IBUS ]''' und '''[https://shop.ibus-app.de/detail/index/sArticle/379 IQ1453BH ]''' ausschließlich im I-BUS App Shop.&amp;lt;br /&amp;gt;&lt;br /&gt;
* Qualcomm 665 CPU&lt;br /&gt;
* 8GB RAM&lt;br /&gt;
* 256GB Speicher&lt;br /&gt;
* echtes Android 13 (API Level 33)&lt;br /&gt;
* OEM-nahes Frontpanel&lt;br /&gt;
** weder DVD-Laufwerk noch SD-Slots&lt;br /&gt;
** verbesserte Haptik der Tasten&lt;br /&gt;
* hochauflösendes IPS Display&lt;br /&gt;
* extrem kurze Bauform (passt auch in der BMW E38)&lt;br /&gt;
* integriertes wireless Carplay und Android Auto&lt;br /&gt;
* eingebautes DSP (keine Steuerung des DSP ab Werk)&lt;br /&gt;
* Endstufe TDA7851 (4* 45W)&lt;br /&gt;
* unterstützung von AHD-Kameras bis 1920x1080&lt;br /&gt;
* integrierter Lüfter&lt;br /&gt;
* digitaler Ausgang&lt;br /&gt;
* Anschlussstecker für Resler Modul&lt;br /&gt;
* Dualband-WiFi (2,4 und 5 GHz)&lt;br /&gt;
* Unterstützung der originalen Lenkradtasten&lt;br /&gt;
* Bluetooth 5.0&lt;br /&gt;
* 3x USB&lt;br /&gt;
* SIM Karten-Leser für uintegriertes 4G Modem&lt;br /&gt;
* GPS Antenne für Navigation &lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
IQ7339IBUS 01.jpg|Xtrons IQ7339IBUS für BMW  E39 7&amp;quot; Qualcomm 665 / 8GB / 256GB&lt;br /&gt;
IQ7339IBUS 02.jpg|Xtrons IQ7339IBUS Rückansicht&lt;br /&gt;
IQ7339IBUS 03.jpg|Xtrons IQ7339IBUS Zubehör&lt;br /&gt;
IQ7339IBUS 04.jpg|Xtrons IQ7339IBUS Stecker für Resler Modul/Interface&lt;br /&gt;
IQ7339IBUS 05.jpg|Xtrons IQ7339IBUS Draufsicht&lt;br /&gt;
IQ7339IBUS 06.jpg|Xtrons IQ7339IBUS CPU Info: API 33&lt;br /&gt;
IQ7339IBUS 07.jpg|Xtrons IQ7339IBUS Abmessungen&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hier sollen einige Hinweise zur Xtrons IQ Serie - speziell für die Version &amp;quot;IBUS&amp;quot; erscheinen ==&lt;br /&gt;
# Code Für Werkseinstellungen: 126&lt;br /&gt;
# '''aktuelle Firmware:''' ''Link folgt''&lt;br /&gt;
# '''externes Mikrofon:''' Android-Einstellungen =&amp;gt; CAR =&amp;gt; Werkseinstellungen (Code: 126) =&amp;gt;  weitere Einstellungen ==&amp;gt; Mikrofon auf &amp;quot;Extern&amp;quot; ändern&lt;br /&gt;
# '''Rückfahrkamera:''' [https://xtrons.ibus-app.de/index.php?title=Abschalten_des_schwarzen_Bildschirms_(R%C3%BCckfahrkamera)_beim_Einlegen_des_R%C3%BCckw%C3%A4rtsganges#ab_Android_8 (De-)Aktivieren der Rückfahrkamera beim IQ]&lt;br /&gt;
# [https://xtrons.ibus-app.de/index.php?title=Bootlogo_%C3%A4ndern#Boot-Logo_%C3%A4ndern_f%C3%BCr_andere_Radios_(z.B._Xtrons_IX-Serie_etc.) Bootlogo ändern]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Unboxing ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Unboxing Video:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://youtu.be/NazHVVhhcqo&amp;lt;/youtube&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
== Anschlüsse ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''Hier ein Anschlussplan des Xtrons IQ7339IBUS.&amp;lt;br&amp;gt;&lt;br /&gt;
Ergänzt ist der '''[https://shop.ibus-app.de/detail/index/sArticle/392 Anschlussadapter für das Resler-Modul]''', der nur bei Geräten mit der Endung &amp;quot;..IBUS&amp;quot; in der Artikelnummer bzw. dem IQ7439BL &amp;quot;mit I-BUS-App Paket&amp;quot; enthalten ist.'''&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
IQ7339IBUS pinout.jpg|Radioanschlüsse&lt;br /&gt;
IQ7439IBUS 01.jpg|Anschluss mit Resler Modul und IBUS-Adapter&lt;br /&gt;
AdapterXtrons01.jpg|Anschlussadapter für das Resler-Modul&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Einbau-Video ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Einbau-Video:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=hny-gJQQ6Tc&amp;lt;/youtube&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Menü-Übersicht/Einstellungen ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Genereller Hinweis: einige Menü-Punkte und Funktionen können je nach Version der Firmware komplett oder geringfügig anders benannt sein.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== DSP / Equalizer (IQ7339IBUS) ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
DSP- und Equalizer Einstellungen.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
03 IQ7339IBUS Androidsetup CAR 03 EQ 01.png|DSP - Equalizer&lt;br /&gt;
03 IQ7339IBUS Androidsetup CAR 03 EQ 02.png|DSP - Loundness, Bassboost etc.&lt;br /&gt;
03 IQ7339IBUS Androidsetup CAR 03 EQ 03.png|DSP - Fader + Balance&lt;br /&gt;
03 IQ7339IBUS Androidsetup CAR 03 EQ 04.png|DSP - Laufzeitkorrektur&lt;br /&gt;
03 IQ7339IBUS Androidsetup CAR 03 EQ 01.png|DSP - Setup Laufzeitkorrektur&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
Mehr Info zum Thema [https://xtrons.ibus-app.de/index.php?title=Was_ist_DSP%3F_Digitaler_Soundprozessor#High_Pass_Filter_und_Low_Pass_Filter_(HPF/LPF) Low/Highpass] und [https://xtrons.ibus-app.de/index.php?title=Was_ist_DSP%3F_Digitaler_Soundprozessor#Laufzeitkorrektur_(LZK) Laufzeitkorrektur].&amp;lt;br&amp;gt;&lt;br /&gt;
'''Info zur Laufzeitkorrektur beim IQ: man setzt hier den Abstand zwischen den Lautsprechern links-recht und vorn-hinten im Wagen. Die Subwoofer-Position ist nicht separat einstellbar!'''&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
=== DSP / Equalizer (IQx4xxIBUS) ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
DSP- und Equalizer Einstellungen.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
03 IQx4xxIBUS Androidsetup CAR 03 EQ 01.jpg|DSP - Equalizer&lt;br /&gt;
03 IQx4xxIBUS Androidsetup CAR 03 EQ 02.jpg|DSP - Laufzeitkorrektur&lt;br /&gt;
03 IQx4xxIBUS Androidsetup CAR 03 EQ 03.jpg|DSP - DTS&lt;br /&gt;
03 IQx4xxIBUS Androidsetup CAR 03 EQ 04.jpg|DSP - separate Lautstärken&lt;br /&gt;
03 IQx4xxIBUS Androidsetup CAR 03 EQ 05.jpg|DSP - High/LowPass Einstellungen&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
Das IQx4xxIBUS verfügt neben dem DSP noch über &amp;quot;DTS&amp;quot;. Hier können u.a. ein virtueller Center Lautsprecher im Armaturenbrett und div. Klangfarben gesetzt werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Mehr Info zum Thema [https://xtrons.ibus-app.de/index.php?title=Was_ist_DSP%3F_Digitaler_Soundprozessor#High_Pass_Filter_und_Low_Pass_Filter_(HPF/LPF) Low/Highpass] und [https://xtrons.ibus-app.de/index.php?title=Was_ist_DSP%3F_Digitaler_Soundprozessor#Laufzeitkorrektur_(LZK) Laufzeitkorrektur].&amp;lt;br&amp;gt;&lt;br /&gt;
'''Info zur Laufzeitkorrektur beim IQ: man setzt hier den Abstand zwischen den Lautsprechern links-recht und vorn-hinten im Wagen. Die Subwoofer-Position ist nicht separat einstellbar!'''&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Android-Setup===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
00 IQ7339IBUS Androidsetup.png|Android-Einstellung&lt;br /&gt;
01 IQ7339IBUS Androidsetup Netzwerk.png|Netzwerke&lt;br /&gt;
02 IQ7339IBUS Androidsetup Verbundene-Geräte.png|Verbundene Geräte&lt;br /&gt;
03 IQ7339IBUS Androidsetup CAR.png|CAR&lt;br /&gt;
03 IQ7339IBUS Androidsetup CAR 01.png|CAR =&amp;gt; LED&lt;br /&gt;
03 IQ7339IBUS Androidsetup CAR 02.png|CAR =&amp;gt; Lenkradtasten anlernen. HINWEIS: Funktioniert so nicht für BMW E39/E38 !&lt;br /&gt;
03 IQ7339IBUS Androidsetup CAR 03.png|CAR =&amp;gt; Navi-Einstellungen&lt;br /&gt;
03 IQ7339IBUS Androidsetup CAR 04.png|CAR =&amp;gt; Voice-Assistent&lt;br /&gt;
03 IQ7339IBUS Androidsetup CAR 05.png|CAR =&amp;gt; Fahreinstellungen&lt;br /&gt;
03 IQ7339IBUS Androidsetup CAR 06.png|CAR =&amp;gt; Extra-Einstellungen&lt;br /&gt;
04 IQ7339IBUS Androidsetup Apps.png|Apps&lt;br /&gt;
05 IQ7339IBUS Androidsetup Benachrichtigungen.png|Benachrichtigungen&lt;br /&gt;
06 IQ7339IBUS Androidsetup Speicher.png|Speicher&lt;br /&gt;
07 IQ7339IBUS Androidsetup Ton+Vibration.png| Ton &amp;amp; Vibration&lt;br /&gt;
08 IQ7339IBUS Androidsetup Display.png|Display&lt;br /&gt;
09 IQ7339IBUS Androidsetup Hintergrund.png|Hintergrund&lt;br /&gt;
10 IQ7339IBUS Androidsetup Sicherheit.png|Sicherheit&lt;br /&gt;
11 IQ7339IBUS Androidsetup Datenschutz.png|Datenschutz&lt;br /&gt;
12 IQ7339IBUS Androidsetup Standort.png|Standort&lt;br /&gt;
14 IQ7339IBUS Androidsetup Screenshot 01.png|Screenshot&lt;br /&gt;
14 IQ7339IBUS Androidsetup Screenshot 01.png|Screenshot (&amp;quot;erweitert&amp;quot; und &amp;quot;teilen&amp;quot;)&lt;br /&gt;
15 IQ7339IBUS Androidsetup System.png|System - Sprache und Zeit anpassen, MCU- und System-Updates&lt;br /&gt;
16 IQ7339IBUS Androidsetup Über.png|Über das Tablet&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
=== Werkseinstellungen ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Erreichbar über Android-Setup =&amp;gt; CAR =&amp;gt; Werkseinstellungen: Code: 126&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
03 IQ7339IBUS Androidsetup CAR 09 factorysettings 01.jpg|Code für Werkseinstellungen&lt;br /&gt;
03 IQ7339IBUS Androidsetup CAR 09 factorysettings 02.jpg|App Einstellungen&lt;br /&gt;
03 IQ7339IBUS Androidsetup CAR 09 factorysettings 03.jpg|Boot Logo&lt;br /&gt;
03 IQ7339IBUS Androidsetup CAR 09 factorysettings 05.jpg|Radio&lt;br /&gt;
03 IQ7339IBUS Androidsetup CAR 09 factorysettings 05a.png|Lautstärken&lt;br /&gt;
16_Werkseinstellungen_CAN.jpeg|CAN BUS Einstellungen&lt;br /&gt;
03 IQ7339IBUS Androidsetup CAR 09 factorysettings 04.jpg|Tasten und Touch anlernen&lt;br /&gt;
03 IQ7339IBUS Androidsetup CAR 09 factorysettings 06.jpg|Tasten anlernen&lt;br /&gt;
03 IQ7339IBUS Androidsetup CAR 09 factorysettings 07.jpg|Tasten anlernen&lt;br /&gt;
03 IQ7339IBUS Androidsetup CAR 09 factorysettings 08.jpg|Display Einstellungen&lt;br /&gt;
03 IQ7339IBUS Androidsetup CAR 09 factorysettings 09.jpg|Weitere Einstellungen&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wichtige Einstellungen für BMW E39 in Verbindung mit der I-BUS App ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Einige Funktionen für den BC kann das IQ selbst, aber  teils funktioniert das nicht korrekt. Daher ideal diese Funktionen deaktivieren und über die I-BUS App nutzen.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== CAN Einstellung===&lt;br /&gt;
&amp;lt;br&amp;gt;CAN-Einstellung in den Werkseinstellungen unter &amp;quot;CAN&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
Auswahl:&lt;br /&gt;
# Canbus: &amp;quot;135 BMW E46 (LZ)&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
# Typ: VFL: &amp;quot;0H&amp;quot; // FL: &amp;quot;1H&amp;quot;&lt;br /&gt;
# Amplifier: &amp;quot;without Amplifier&amp;quot; '''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;'''&lt;br /&gt;
# Front door: &amp;quot;Hide&amp;quot;&lt;br /&gt;
# Air condition: &amp;quot;Hide&amp;quot;&lt;br /&gt;
# Backdoor: &amp;quot;Hide&amp;quot;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;''' Vor allem wichtig bei DSP ab Werk um die hohe Lautstärke nach Radiostart zu unterbinden. Ton kommt dann erst, nach dem die [http://www.ibus-app.de I-BUS App] läuft und das DSP startet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
16 Werkseinstellungen CAN.jpeg|CAN BUS Einstellungen&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Car Setup App ===&lt;br /&gt;
Die &amp;quot;Car Setup&amp;quot; App ist von Werk installiert.&amp;lt;br&amp;gt;&lt;br /&gt;
Hier bitte die folgenden Optionen deaktivieren:&lt;br /&gt;
# Speed limit activation&lt;br /&gt;
# Memo&lt;br /&gt;
# AUD+OBD&lt;br /&gt;
Ob und wie gut die anderen Funktionen hier arbeiten muss noch geprüft werden.&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
Car Setup.jpeg|Car Setup&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Digitaler Ausgang am Xtrons und BMW DSP ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Das Xtrons IQ7339IBUS verfügt über einen digitalen Ausgang als S/PDIF (COAX) via Cinch und optisch via TOSLINK&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
Der Nachfolger Xtrons IQ7439IBUS (bzw. IQ7439BL, IQ7446BL, IQ1439BL, IQ1453BL..) verfügt über einen digitalen Ausgang optisch via TOSLINK&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
Die DSP Endstufe des BMW E39 verfügt über einen digitalen Eingang (SMB-Buchse) der das S/PDIF Signal unterstützt. Entsprechend kann man den Ton digital aus dem Xtrons direkt in die DSP Endstufe (sofern vorhanden!) verlust- und störungsfrei übertragen. Hierfür benötigt man ein Kabel mit Cinch-Stecker und SMB-Stecker mit ca. 6m Länge. Aktuell wird es über ein normales Cinchkabel, Adapter Cinch auf FAKRA und Adapter FAKRA auf SMB zum Test genutzt. &amp;lt;br&amp;gt;&lt;br /&gt;
Hier das passende Kabel: [https://shop.ibus-app.de/i-bus-app/zubehoer/adapterkabel/372/anschlusskabel-xtrons-koaxial-an-dsp-endstufe-cinch-m-smb-f-6m?number=Cinch-SMB Anschlusskabel Xtrons koaxial an DSP-Endstufe, Cinch(m)-SMB(f), 6m]&amp;lt;br&amp;gt;&lt;br /&gt;
'''WICHTIG:''' damit das DSP umschaltet auf  den digitalen Eingang, muss man diesen in der I-BUS App umschalten auf &amp;quot;CD-Wechsler&amp;quot;. Eine detaillierte Anleitung folgt.&amp;lt;br&amp;gt;&lt;br /&gt;
'''HINWEIS:''' Beim BMW E39 Facelift ist der CD-Wechsler über das Radio eingebunden und steckt nicht am SMB (dig. Eingang) am Wechsler. Beim VFL Steckt der CD-Wechsler ab Werk am SMB. Heißt hier muss man sich entscheiden ob man den CD Wechsler weiter via dig. Eingang nutzen mag oder das Xtrons digital anschließt.&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
S PDIF+DSP.jpeg|Digitaler Anschluss des Xtrons via SMB an der DSP Endstufe&lt;br /&gt;
IQ7339IBUS_02.jpg|&amp;quot;COAXIAL&amp;quot;. digitaler Cinch-Ausgang als S/PDIF Signal&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; Nutzbar für DSP via TOSLINK zu S/PDIF Konverter.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== weitere Einstellungen ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Pausieren/Stopp von Youtube mit Licht an/aus vermeiden ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Die neue Benutzeroberfläche der IQ Serie (ab IQx4xx.. / Android 14) bringt u.a. die Option das Theme vom Radio mit dem Licht auf Hell/Dunkel umzustellen mit Licht an/aus.&amp;lt;br&amp;gt;&lt;br /&gt;
Leider hat dieses Umstellen Auswirkung auf u.a. die App Youtube, welche damit die Wiedergabe pausiert und das Bild minimiert.&amp;lt;br&amp;gt;&lt;br /&gt;
Beheben lässt sich das entweder durch die Deaktivierung der Theme-Umschaltung vom Radio - oder durch die Festlegung der Oberfläche in Youtube auf Hell oder Dunkel.&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
IQx4xxIBUS Modus.png|Oben rechts: Theme-Umschaltung mit Licht an/aus&lt;br /&gt;
IQx4xx YT-pause DE 01 .jpg|Benutzer Seite öffnen&lt;br /&gt;
IQx4xx YT-pause DE 02 .jpg|Einstellungen öffnen&lt;br /&gt;
IQx4xx YT-pause DE 03 .jpg|Darstellungs-Einstellungen&lt;br /&gt;
IQx4xx YT-pause DE 04 .jpg|Darstellungs-Einstellungen: Standard-Einstellung&lt;br /&gt;
IQx4xx YT-pause DE 05 .jpg|Darstellungs-Einstellungen: Festlegung helles oder dunkles Design&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lüfter-Einstellungen ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Die neue IQ Serie (ab IQx4xx.. / Android 14) bringt u.a. die Option das An-/Abschalten des hinten verbauten Lüfters anzupassen.&amp;lt;br&amp;gt;&lt;br /&gt;
Mit Tippen auf die Temperatur kann man die EInschaltschwelle für den Lüfter setzen. Ab Werk sind es 90°C - Gesetzt haben wir den Wert (nicht dargestellt) auf 60°C.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
IQx4xxIBUS Fan 01.png|Lüfter-Einstellungen&lt;br /&gt;
IQx4xxIBUS Fan 02.png|Lüfter-Einstellungen: Einschaltschwelle original&lt;br /&gt;
IQx4xxIBUS Fan 03.png|Lüfter-Einstellungen: Einschaltschwelle gesetzt auf 60°C (nicht dargestellt)&lt;br /&gt;
IQx4xxIBUS Fan 04.png|Lüfter-Einstellungen: Lüfter läuft&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Split-Screen ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Hier ein Video wie man Split-Screen auf dem IQ nutzt:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://www.youtube.com/watch?v=2wI2-sqIhE4&amp;lt;/youtube&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Firmware und MCU ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Anleitung wie ein '''[[Firmwareupdate]]''' funktioniert. (Anleitung für &amp;quot;IQ-Serie&amp;quot; nutzen)&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''WICHTIG: die Firmware und MCU funktioniert nur für das jeweils spezifizierte Xtrons. Die Verwendung am falschen Gerät kann zu (irreparablen) Fehlfunktionen führen!'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
=== Firmware und MCU für IQx3xx ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Die aktuelle Version der Firmware für das IQ7339IBUS ist die '''2025-01-06 mit MCU 4.54'''.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''[https://download.speedy-pics.de/uploads/android/firmware/IQ-8+256_13.0_lf_sc138_13_(20250106)_MCU_4.54.rar Download Firmware für IQ3439IBUS - Stand: 2025-01-06]''' (1,5GB)&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''[https://download.speedy-pics.de/uploads/android/MCU/HCTGQ_HCT_V4.54_IQx3xxIBUS.zip MCU 4.54  für IQx3xxIBUS]'''&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Firmware und MCU für IQx4xx ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Die aktuelle Version der Firmware für das IQx4xxIBUS ist die '''2025-06-27''' letzte MCU ist Version '''4.56'''.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''[https://download.speedy-pics.de/uploads/android/firmware/FL-IQ_8+256_7inch_ibus_V1_13_(20250731).zip Download Firmware für IQ7439IBUS (7&amp;quot; Radios - v1) - Stand: 2025-07-31]''' (1,5GB)&amp;lt;br&amp;gt;&lt;br /&gt;
'''[https://1drv.ms/u/c/2f0141a45c14e785/IQAKO8cRBFvoTaTymIR4TcAoAV9r-b7ccaVc8vWteL2nBok?e=9oEfYA Download Firmware für IQ7439IBUS (7&amp;quot; Radios - v1) - Stand: 2026-04-30]''' (1,5GB)&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''[https://1drv.ms/u/c/2f0141a45c14e785/IQB4C4AKqz24Rok-uqNTIyUQASy6e0oyc7OzAuIroyLb12U?e=y6ssYU Download Firmware für IQ7439IBUS (7&amp;quot; Radios - v2) - Stand: 2026-04-23]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''[https://1drv.ms/u/c/2f0141a45c14e785/IQB9vtjRKsMfTpHVGgUfXP-RAYKL0JkimE05dnPPzRWvBPc?e=5XwWdEDownload Firmware für IQ7439IBUS (7&amp;quot; Radios - v2) - Stand: 2026-07-17]'''&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''[https://1drv.ms/u/c/2f0141a45c14e785/IQBPjwQM1isVRolZFu9GiVIhAT6wFOuA57EFTtoQ9flpzNU?e=6kJT2L Download Firmware für IQ8446IBUS und IQ1439IBUS und IQ1453IBUS (8,8&amp;quot; und 10,25&amp;quot; Radios - v1) - Stand: 2025-12-18]''' (1,5GB)&amp;lt;br&amp;gt;&lt;br /&gt;
'''[https://1drv.ms/u/c/2f0141a45c14e785/IQAcSasWcOUmS5yOwjxCeW4jASbdcLHE9cO2ZYzmhVB_oSY?e=er3GxV Download Firmware für IQ8446IBUS und IQ1439IBUS und IQ1453IBUS (8,8&amp;quot; und 10,25&amp;quot; Radios - v1) - Stand: 2026-05-27]''' (1,5GB)&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''[https://1drv.ms/u/c/2f0141a45c14e785/IQATys0-HS03S6M0iHco-ttIAbfUatTkte-O6Ete0qL7FbE?e=oDnQoU Download Firmware für IQ8446IBUS und IQ1439IBUS und IQ1453IBUS (8,8&amp;quot; und 10,25&amp;quot; Radios - v2) - Stand: 2025-12-18]''' (1,5GB)&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''[https://download.speedy-pics.de/uploads/android/MCU/HCTGS_HCT_V4.56d_IQx4xxIBUS.zip MCU 4.56 für IQx4xxIBUS]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''[https://download.speedy-pics.de/uploads/android/MCU/HCTGS_HCT_V4.57.zip MCU 4.57d für IQx4xxIBUS]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''[https://download.speedy-pics.de/uploads/android/MCU/HCTGS_HCT_V4.57t.zip MCU 4.57t für IQx4xxIBUS]''' '''verbessert schlechten FM-Radio Empfang'''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andre</name></author>
	</entry>
	<entry>
		<id>https://xtrons.ibus-app.de/index.php?title=Aktuelle_Firmware&amp;diff=4049</id>
		<title>Aktuelle Firmware</title>
		<link rel="alternate" type="text/html" href="https://xtrons.ibus-app.de/index.php?title=Aktuelle_Firmware&amp;diff=4049"/>
		<updated>2026-09-08T06:25:52Z</updated>

		<summary type="html">&lt;p&gt;Andre: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;Generelle Hinweise &amp;lt;/font&amp;gt; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''Wir übernehmen keinerlei Haftung für die hier gelisteten Firmwares, da wir sie nur bereit stellen.'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''Auch übernehmen wir keinerlei Haftung für die Installation der Firmware und MCU - es liegt in der Hand des Anwenders die korrekte Firmware/MCU zu wählen und diese korrekt nach Anleitung zu installieren!'''&amp;lt;br&amp;gt;&lt;br /&gt;
Sofern nicht anders ausgewiesen ist die gebotene Firmware in der Regel für BMW-Radios. Diese kann, muss aber nicht auf Radios für andere Fahrzeuge passen!&amp;lt;br&amp;gt;&lt;br /&gt;
Achtet darauf immer nur die passende Firmware für das Radio zu installieren, die gilt generell für die Modell-Eignung als auch die Android-Version!&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;AVIN Firmware&amp;lt;/font&amp;gt; ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
=== AVIN Android 9.0 [PX6] ===&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Nur für PX6 Radios!!!!'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;[http://download.speedy-pics.de/uploads/android/firmware/Avant_PX6_9.0_ota(20191016）.zip 2019-10-16] (MCU GS 3.30)&amp;lt;/big&amp;gt; [*.rar / ~885MB] '''*neu*'''&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
=== AVIN Android 10.0 [PX6] ===&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Nur für PX6 Radios!!!!'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;[http://download.speedy-pics.de/uploads/android/firmware/Avant_PX6_gs16_10.0_ota(20220718).zip 2022-07-18] (ohne MCU)&amp;lt;/big&amp;gt; [*.rar / ~1,1GMB] '''*neu*'''&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
=== AVIN Android 11.0 [PX6] ===&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Nur für PX6 Radios!!!!'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;[http://download.speedy-pics.de/uploads/android/firmware/Avant_PX6_gs16_11.0_ota(20220927).rar 2022-09-27] (ohne MCU)&amp;lt;/big&amp;gt; [*.rar / ~1,2GB] '''*neu*'''&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
=== AVIN Android 10.0 [Qualcomm 665] ===&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Nur für Qualcomm 665 (SD6125) Radios!!!!'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;[http://download.speedy-pics.de/uploads/android/firmware/Avant_SD665_GS16_10.0_ota(20220303).zip 2022-03-03] (ohne MCU)&amp;lt;/big&amp;gt; [*.rar / ~1,2GB] '''*neu*'''&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
=== AVIN Android 12.0 [Qualcomm 665] ===&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Nur für Qualcomm 665 (SD6125) Radios!!!!'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;[http://download.speedy-pics.de/uploads/android/firmware/Avant_SD665_GS16_12.0_ota(20230420).rar 2023-04-20] (ohne MCU)&amp;lt;/big&amp;gt; [*.rar / ~1,2GB]&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Xtrons Firmware &amp;lt;/font&amp;gt;==&lt;br /&gt;
=== Xtrons Android 10.0 Octacore Xtrons ROM  ''PBX-Serie'' [PX5] ===&lt;br /&gt;
&amp;lt;big&amp;gt;[http://download.speedy-pics.de/uploads/android/firmware/SG-PX5-10.0-PBX_gs15_ota(20201019).zip 2020-10-19] (inkl. MCU v3.67)&amp;lt;/big&amp;gt; [*.rar / ~930MB] '''*neu*'''&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Xtrons Unterscheidung ''PQ-Serie'' &amp;lt;=&amp;gt; ''PQS-Serie'' [PX6] ===&lt;br /&gt;
* PQ: ==&amp;gt; MCU: MTC&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''E'''&amp;lt;/font&amp;gt;&lt;br /&gt;
* PQS: ==&amp;gt; MCU: MTC&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''H'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Xtrons Android 9.0 Hexacore Xtrons ROM  ''PQ-Serie'' [PX6] ===&lt;br /&gt;
&amp;lt;big&amp;gt;'''Nur für PX6 Radios mit Android 9.0!!!!'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;[https://download.speedy-pics.de/uploads/android/firmware/GS_PQ_PX6_P9.0_GS13_rk3399_9.0_ota(20191111).zip 2019-11-11] (inkl. MCU v3.40)&amp;lt;/big&amp;gt; [*.rar / ~872MB] &amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Xtrons Android 10.0 Hexacore Xtrons ROM  ''PQ-Serie'' [PX6] ===&lt;br /&gt;
&amp;lt;big&amp;gt;'''Nur für PX6 Radios mit Android 10.0!!!!'''&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
für 7&amp;quot; und 9&amp;quot; Display:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;[https://download.speedy-pics.de/uploads/android/firmware/SG-PX6-PQ_BMW_10.0_GS11_rk3399_(20220517).rar 2022-05-17] (inkl. MCU 3.67)&amp;lt;/big&amp;gt; [*.rar / ~1,1GB] '''*neu*'''&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
für 8,8&amp;quot; und 10,25&amp;quot; Display:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;[http://download.speedy-pics.de/uploads/android/firmware/SG-PX6-PQ_BMW_10.0_GS13_rk3399_(20220517).rar 2022-05-17] (inkl. MCU 3.67)&amp;lt;/big&amp;gt; [*.rar / ~950MB] '''*neu*'''&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Xtrons Android 10.0 Hexacore Xtrons ROM  ''PQS-Serie'' [PX6] ===&lt;br /&gt;
für 7&amp;quot; und 9&amp;quot; Display:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;[https://download.speedy-pics.de/uploads/android/firmware/SG-PX6-PQS_BMW_10.0_GS11_rk3399_(20220517).rar 2022-05-17] (inkl. MCU 3.67)&amp;lt;/big&amp;gt; [*.rar / ~1,1GB] '''*neu*'''&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
für 8,8&amp;quot; und 10,25&amp;quot; Display:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;[https://download.speedy-pics.de/uploads/android/firmware/SG-PX6-PQS_BMW_10.0_GS13_rk3399_(20220517).rar 2022-05-17] (inkl. MCU 3.67)&amp;lt;/big&amp;gt; [*.rar / ~1,1GB] '''*neu*'''&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Xtrons Android 11.0 Hexacore Xtrons ROM  ''PQS-Serie'' [PX6] ===&lt;br /&gt;
'''Ausschließlich für PQS-Serie Radios mit Android 11! Kein Upgrade für Android 10 Radios auf Android 11! Die Installation wird das Radio bricken.'''&amp;lt;br&amp;gt;&lt;br /&gt;
für 7&amp;quot; und 9&amp;quot; Display:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;[https://download.speedy-pics.de/uploads/android/firmware/SG-PX6-PQS-TQS_BMW_11.0_GS11_rk3399_(20230217).rar 2023-02-17] (inkl. MCU 3.xx)&amp;lt;/big&amp;gt; [*.rar / ~1,1GB] '''*neu*'''&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
für 8.8&amp;quot; und 10.25&amp;quot; Display:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;[https://download.speedy-pics.de/uploads/android/firmware/SG-PX6-PQS-TQS_GS13_11.0_(20230220).rar 2023-02-20] (inkl. MCU 3.80)&amp;lt;/big&amp;gt; [*.rar / ~1,1GB] '''*neu*'''&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Xtrons Android 10.0 Octacore Xtrons ROM  ''IQ-Serie'' [Qualcomm 665] ===&lt;br /&gt;
&amp;lt;big&amp;gt;[https://download.speedy-pics.de/uploads/android/firmware/XTRONS-IQ_6+128_GS17_10.0_(20220623).rar 2022-06-23] (inkl. MCU v???)&amp;lt;/big&amp;gt; [*.rar / ~1,0GB] '''*neu*'''&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
=== Xtrons Android 11.0 Octacore Xtrons ROM  ''IQ-Serie'' [Qualcomm 665] ===&lt;br /&gt;
&amp;lt;big&amp;gt;[https://download.speedy-pics.de/uploads/android/firmware/XTRONS-IQ_6+128_gs17_11.0_(20220929).rar 2022-09-29] (inkl. MCU v3.84)&amp;lt;/big&amp;gt; [*.rar / ~1,0GB] &amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Xtrons Android 12.0 Octacore Xtrons ROM  ''MA-Serie'' [AutoChips] ===&lt;br /&gt;
&amp;lt;big&amp;gt;[https://download.speedy-pics.de/uploads/android/firmware/FL-MA+PMA_4+64%20_A12_v32_20230221.rar 2023-02-21]&amp;lt;/big&amp;gt; [*.rar / ~1,2GB] '''*neu*''' &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;lt;big&amp;gt;'''Es ist auch nur Android 10 im Kleid von Android 12!'''&amp;lt;/font&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Xtrons Android 12.0 Octacore Xtrons ROM  ''IQ-Serie'', z.B. IQxxxx&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;B&amp;lt;/font&amp;gt; [Qualcomm 665] ===&lt;br /&gt;
&amp;lt;big&amp;gt;[https://download.speedy-pics.de/uploads/android/firmware/XTRONS-IQ&amp;amp;IQP_6+128_gs17_12.0_(20230911).rar 2023-09-11] (ohne MCU)&amp;lt;/big&amp;gt; [*.rar / ~1,2GB]&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Xtrons Android 12.0 Octacore Xtrons ROM  ''neue IQ-Serie'', z.B. IQxxxx&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;P&amp;lt;/font&amp;gt; [Qualcomm 665] ===&lt;br /&gt;
&amp;lt;big&amp;gt;[https://download.speedy-pics.de/uploads/android/firmware/XTRONS-IQ&amp;amp;IQP_8+256_12.0_(20230919).rar 2023-09-19] (ohne MCU)&amp;lt;/big&amp;gt; [*.rar / ~1,2GB] '''*neu*''' &amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Xtrons Android 12.0 =&amp;gt; 13.0 Octacore Xtrons ROM  ''neue IQ-Serie'', z.B. IQxxxx&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;P&amp;lt;/font&amp;gt; [Qualcomm 665] '''(Flash von Android 12 auf Android 13)''' ===&lt;br /&gt;
&amp;lt;big&amp;gt;[https://download.speedy-pics.de/uploads/android/firmware/FL-IQ-Upgrade%20A12-A13_(20240311).rar 2024-03-11] (ohne MCU)&amp;lt;/big&amp;gt; [*.rar / ~1,3GB] '''*neu*''' &amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''NUR FÜR 8+256 IQ Android 12 Modelle NICHT INSTALLIEREN AUF ÄLTEREN IQ MODELLEN MIT 6+128'''&amp;lt;/font&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Die Anweisungen sind etwas anders, es gibt ein Dokument im Ordner mit Anweisungen:&lt;br /&gt;
# die Dateien herunterladen und entpacken&lt;br /&gt;
# config.json, gmcu.img und update.zip in das Stammverzeichnis des USB-Sticks legen&lt;br /&gt;
# AUF XTRONS: navigieren Sie zu Einstellungen - CAR - Werkseinstellungen&lt;br /&gt;
# anstelle des normalen Passworts geben Sie ein: hctota und drücken Sie ok&lt;br /&gt;
# Kehren Sie zum Hauptmenü zurück, und Sie werden sehen, dass eine neue App mit dem Namen SystemUpdate zum Startbildschirm hinzugefügt wurde&lt;br /&gt;
# Öffnen Sie die App&lt;br /&gt;
# Stecken Sie den USB-Stick mit den Update-Dateien ein&lt;br /&gt;
# Drücken Sie auf Aktualisieren und warten Sie, bis die Aktualisierung abgeschlossen ist, und starten Sie neu.&lt;br /&gt;
# nach dem neustart verschwindet die app aus dem startbildschirm&lt;br /&gt;
# navigieren Sie zu Einstellungen - System - MCU-Updates und drücken Sie MCU-Updates&lt;br /&gt;
# Warten Sie, bis die MCU aktualisiert wurde und starten Sie neu.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
=== Xtrons Android 13.0 Octacore Xtrons ROM  ''neue IQ-Serie'', inkl. IQ7339IBUS und IQxxxx&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;P&amp;lt;/font&amp;gt; [Qualcomm 665] ===&lt;br /&gt;
&amp;lt;big&amp;gt;[https://download.speedy-pics.de/uploads/android/firmware/IQ-8+256_13.0_lf_sc138_13_(20250106)_MCU_4.54.rar 2025-01-06] (inkl. MCU 4.54)&amp;lt;/big&amp;gt; [*.rar / ~1,3GB] '''*neu*''' &amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Xtrons Android 12.0 Octacore Xtrons ROM  ''IX-Serie'' [Unisoc Tiger T618] ===&lt;br /&gt;
'''für TIX125L &amp;amp; TX120L:'''&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;[https://download.speedy-pics.de/uploads/android/firmware/XTRONS-IX_TIX125L_TX120L(202306083).rar 2023-06-08] &amp;lt;/big&amp;gt; [*.rar / ~2,0GB]&amp;lt;br /&amp;gt;&lt;br /&gt;
'''für IX92MTVL &amp;amp; TIX725L &amp;amp; IX7239B(S) &amp;amp; IX7246B(S) - 7&amp;quot; und 9&amp;quot; Xtrons:'''&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;[https://download.speedy-pics.de/uploads/android/firmware/XTRONS-IX92MTVL+TIX725L(20240809).rar 2024-08-09] &amp;lt;/big&amp;gt; [*.rar / ~2,0GB]&amp;lt;br /&amp;gt;&lt;br /&gt;
'''für IX1239BHL &amp;amp; IX1253BHL &amp;amp; IX8246BHL - 8.8&amp;quot; und 10.25&amp;quot; Xtrons:'''&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;[https://download.speedy-pics.de/uploads/android/firmware/XTRONS-IX_BMW_10.25+8.8_(20240425) 2024-04-25] &amp;lt;/big&amp;gt; [*.rar / ~2,0GB]&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
'''MCU für IX-Serie:'''&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;[https://download.speedy-pics.de/uploads/android/firmware/IX_MCU_20240325 2024-03-25] &amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Xtrons IQ-Serie: IQxxxxIBUS, IQx3xx und IQx4xx - mit Android 13 oder 14 ===&lt;br /&gt;
Die Firmware und MCU ist gesondert gelistet unter:&amp;lt;br&amp;gt;&lt;br /&gt;
'''[https://xtrons.ibus-app.de/index.php?title=Xtrons_IQ-IBUS-Serie#Firmware_und_MCU Firmware und MCU für IQxxxxIBUS, IQx3xx und IQx4xx Radios]'''&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Update von M.I.C für Xtrons PQ (Android 10 =&amp;gt; 11), IQ-Serie (Android 10 =&amp;gt; 13v1) und AVIN Avant 4 (Qualcomm Android 10 =&amp;gt; 13v1) ===&lt;br /&gt;
'''Hinweis das Update für IQ Serie und AVIN Avant 4 habe ich selbst erfolgreich durchgeführt. Dennoch geben wir KEINE GEWÄHR, dass das mit jedem Gerät funktionier! Nutzung auf EIGENE Gefahr!'''&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''[https://www.mic-autoradio.com/updates/autoradio/flashen-der-firmware/ Update von M.I.C für Xtrons PQ, IQ und AVIN Avant 4]'''&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;Malaysk&amp;lt;/font&amp;gt;==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
===Malaysk ROM für Android 5.1 / MTCD / PX3===&lt;br /&gt;
&amp;lt;big&amp;gt;[https://forum.xda-developers.com/android-auto/mtcd-discussion-questions-development/rom-malaysk-roms-mtcd-device-t3385309 Malaysk für MTCD 1024X600 and 800X480 PX3 1GB Android 5.1.1 RK3188]&amp;lt;/big&amp;gt; [Link zu xda-developers Forum, englisch, Installation nach Anleitung im Link]&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Malaysk ROM für Android 6.0 / MTCD &amp;amp; MTCE / PX5===&lt;br /&gt;
&amp;lt;big&amp;gt;[http://download.speedy-pics.de/uploads/safe/update_6_0_1_v_7.0_MAL_13_02_2018_MTCD_PX5.rar Malaysk V7.0] &amp;lt;/big&amp;gt; [*.rar / ~680MB]&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Malaysk ROM für Android 7.1.2 / MTCD-MTCE / PX3===&lt;br /&gt;
&amp;lt;big&amp;gt;[http://download.speedy-pics.de/uploads/safe/nupdate_Android_7_1_2_v_4_1_MALAYSK_11_06_2018_MTCD_MTCE_PX3.rar Malaysk V4.1] &amp;lt;/big&amp;gt; [*.rar / ~760MB] &amp;lt;big&amp;gt;[https://forum.xda-developers.com/android-auto/mtcd-discussion-questions-development/rom-malaysk-roms-mtcd-mtce-device-t3693509 Link zu xda-developers Forum, englisch, Installation nach Anleitung im Link] &amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Malaysk ROM für Android 8.0 / MTCD-MTCE / PX5===&lt;br /&gt;
Nur für Radios mit Rockchip PX5, MCU - MTCD, MTCE Android 6.0.1 und 8.0, RAM 2-4GB&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;[http://download.speedy-pics.de/uploads/safe/update_8_0_Oreo_PX5_v_2.0_MALAY_12_06_2018_MTCD_MTCE.rar Malaysk V2.0] &amp;lt;/big&amp;gt; [*.rar / ~1,3GB]&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;[https://forum.xda-developers.com/android-auto/mtcd-software-development/rom-malaysk-roms-px5-2-4-gb-8-0-android-t3762724 Malaysk] &amp;lt;/big&amp;gt; [Link zu xda-developers Forum, englisch, Installation nach Anleitung im Link]&amp;lt;br /&amp;gt;&lt;br /&gt;
'''[[Installationsanleitung]]''' (für Erstinstallation, Update erflogt wie ein normales Firmware-Update! &amp;lt;br /&amp;gt;&lt;br /&gt;
Update von Android 6 auf Android 8 möglich (wenn PX5 Board verbaut ist!) &amp;lt;br /&amp;gt;&lt;br /&gt;
'''Unbedingt Anleitung (im Download enthalten!) beachten!!!!'''&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Hinweise zum Malaysk===&lt;br /&gt;
* Auflösung des Displays unter &amp;quot;Setup&amp;quot; =&amp;gt; &amp;quot;Display&amp;quot; =&amp;gt; &amp;quot;Density&amp;quot; auf 240dpi setzen&lt;br /&gt;
* Einstellung der gewünschten Statusbar Darstellung unter &amp;quot;Setup&amp;quot; =&amp;gt; &amp;quot;Display&amp;quot; =&amp;gt; &amp;quot;Statusbar&amp;quot; einstellen&lt;br /&gt;
* Bsp.: Datum: &amp;quot;Datealign&amp;quot; auf &amp;quot;center&amp;quot;, wenn Datum unerwünscht bei &amp;quot;Datealign&amp;quot; auf &amp;quot;gone&amp;quot; setzen&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Installation von Android 10, kommend von Android 6 - 9===&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;lt;big&amp;gt; Alles geschieht auf eigenes RISIKO! Malaysk selber musste 5 verschiedene Karten probieren!&amp;lt;/big&amp;gt;&amp;lt;/font&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;! Benötigt wird eine SD Karte oder USB Stick bis 8 GB, formatiert in Fat32 !&amp;lt;/font&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
1. Für [https://drive.google.com/folderview?id=11zpgoOW4eU6G1tjs7ExsZ2aC4RoZ9KDr '''PX5''' ''PX5_A10_IGV.IMG'' oder für '''PX6''' ''PX6_A10_IGV.IMG'' wählen und SDDiskTool downloaden]&amp;lt;br /&amp;gt;&lt;br /&gt;
2. Alle Archive entpacken.'''&amp;quot;SD_Firmware_Tool&amp;quot; direkt auf &amp;quot;C:\&amp;quot; legen!''' &amp;lt;br /&amp;gt;&lt;br /&gt;
3. SDCard Tool als Administrator ausführen und nichts ändern.&amp;lt;br /&amp;gt;&lt;br /&gt;
4. PX5*.IMG bzw. PX6*.IMG auswählen und &amp;quot;Create&amp;quot; drücken.&amp;lt;br /&amp;gt;&lt;br /&gt;
5. Nach Abschluss SD Karte/USB Stick ans Radio anschließen und booten.&amp;lt;br /&amp;gt;&lt;br /&gt;
6. Recovery 10 wird installiert und gestartet.&amp;lt;br /&amp;gt;&lt;br /&gt;
7. Für [https://download.android-freaks.de/dl/?dir=Miscellaneous/Android%2010%20MTCE%20-%20ROM%20%28PX5%29/MX PX5] oder für [https://download.android-freaks.de/dl/?dir=Miscellaneous/Android%2010%20MTCE%20-%20ROM%20%28PX6%29/HCT2 PX6] Firmware (OTA) downloaden, entpacken und &amp;quot;Update.zip&amp;quot; auf SD/USB kopieren.&amp;lt;br /&amp;gt;&lt;br /&gt;
8. SD/USB einbinden und &amp;quot;Update.zip&amp;quot; installieren, dies kann 40-60 Min dauern. &amp;lt;br /&amp;gt;&lt;br /&gt;
*WER NUR ANDROID 10 HABEN MÖCHTE, KANN HIER AUFHÖREN*&amp;lt;br /&amp;gt;&lt;br /&gt;
*WER MALAYSK HABEN MÖCHTE, BITTE WEITERLESEN*&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Installation von Malaysk Q LITE===&lt;br /&gt;
1. Für [https://mega.nz/file/U9ZR2aqK#1WHxuGaKud8w6kzosgJcRy_KLZmWbYq8W42JlBghemU PX5] oder für [https://mega.nz/file/NxZjzQjB#I13RRu_Lb5VAnt4EJ1VkjOtwDfPF2j6rKxhJ4BbOuLk PX6] Malaysk Rom downloaden.&amp;lt;br /&amp;gt;&lt;br /&gt;
2. Archiv entpacken.&amp;lt;br /&amp;gt;&lt;br /&gt;
3. Update.zip auf eine SD Karte/ein USB Stick ablegen.&amp;lt;br /&amp;gt;&lt;br /&gt;
4. Radio einschalten, Speichermedium anschließen.&amp;lt;br /&amp;gt;&lt;br /&gt;
5. Es öffnet sich ein Fenster, wählt &amp;quot;Wipe Data and Format Flash!&amp;quot; aus und klickt auf &amp;quot;Install&amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
6. Radio startet neu, geht ins Recovery 10 und installiert Malaysk Q&amp;lt;br /&amp;gt;&lt;br /&gt;
7. Sollte dies im Recovery ohne Installation bleiben, klickt auf &amp;quot;Update from SD Card or USB&amp;quot;.&amp;lt;br /&amp;gt;&lt;br /&gt;
8. Radio startet mit Malaysk Q neu.&lt;br /&gt;
&lt;br /&gt;
===Vollversion erhalten===&lt;br /&gt;
Im extrahierten Archiv von Malaysk ist ein Schriftstück.&amp;lt;br /&amp;gt;&lt;br /&gt;
Geld per Paypal an die angegebene Adresse mit Seriennummer vom Radio, Prozessor, Androidversion überweisen.&amp;lt;br /&amp;gt;&lt;br /&gt;
Das erste Mal kostet 20 USD, jedes weitere 10 USD.&amp;lt;br /&amp;gt;&lt;br /&gt;
Per Email das selbe nochmal.&amp;lt;br /&amp;gt;&lt;br /&gt;
Ihr werdet benachrichtigt, sobald er euch freigeschaltet hat.&amp;lt;br /&amp;gt;&lt;br /&gt;
Danach kann ein Update durchgeführt werden (ACHTUNG!! Das ist *1,1 GB groß)&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Malaysk Rom LITE für Android 10 / MTCD-MTCE / PX5 RK3368====&lt;br /&gt;
Nur für Radios mit Rockchip PX5, MCU - MTCD, MTCE Android 10, RAM 2-4GB&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;[https://mega.nz/file/U9ZR2aqK#1WHxuGaKud8w6kzosgJcRy_KLZmWbYq8W42JlBghemU Malaysk Q] &amp;lt;/big&amp;gt; oder &amp;lt;big&amp;gt;[https://yadi.sk/d/6HDYtp3zDMdTng Alternativlink]&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt; [*.rar / ~982MB]&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
====Malaysk Rom LITE für Android 10 / MTCD-MTCE / PX6 RK3399====&lt;br /&gt;
Nur für Radios mit Rockchip PX6, MCU - MTCD, MTCE Android 10, RAM 4GB&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;[https://mega.nz/file/NxZjzQjB#I13RRu_Lb5VAnt4EJ1VkjOtwDfPF2j6rKxhJ4BbOuLk Malaysk Q] &amp;lt;/big&amp;gt; oder &amp;lt;big&amp;gt;[https://yadi.sk/d/Tz3MyqYQdzr38Q Alternativlink]&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt; [*.rar / ~983MB]&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
Screenshot 20201007-171055.jpg&lt;br /&gt;
Screenshot 20201007-171125.png&lt;br /&gt;
Screenshot 20201013-132719.jpg&lt;br /&gt;
Screenshot 20201013-132855.jpg&lt;br /&gt;
Screenshot 20201013-133206.jpg&lt;br /&gt;
Screenshot 20201013-133232.jpg&lt;br /&gt;
&amp;lt;/Gallery&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
----&amp;lt;br /&amp;gt;&lt;br /&gt;
==&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;Hal9k ROM&amp;lt;/font&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===Was bringt Hal9k mit sich===&lt;br /&gt;
&lt;br /&gt;
Ein paar Sachen kann ich sagen:&amp;lt;br /&amp;gt;&lt;br /&gt;
ROM läuft flüssiger und besser, viele Launcher, sehr viele Möglichkeiten der Individualisierung, Auswahl der Apps die starten sollen, Erhöhung der Lautstärke ab XXX KM/H (GALA),usw....&amp;lt;br /&amp;gt;&lt;br /&gt;
Wer dennoch alles wissen möchte, [https://forum.xda-developers.com/android-auto/mtcd-software-development/rom-hal9k-rom-3-mtcd-e-head-units-t3847477 darf sich hier für PX5 Modelle austoben]und [https://forum.xda-developers.com/android-auto/mtcd-software-development/rom-hal9k-mod-2-mtcd-mtce-head-units-t3741583 hier für PX3 Modelle.] :)&amp;lt;br /&amp;gt;&lt;br /&gt;
Für die [https://xtrons.ibus-app.de/index.php?title=Aktuelle_Firmware#Installation_von_Hal9k_v4.0 '''PX6''' Radios geht's weiter unten mit '''Hal9k v4'''] weiter.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
'''ACHTUNG!!! Magisk Manager v16 darf auf keinen Fall aktualisiert werden. Sonst wird die Firmware gelöscht und ihr habt einen Bootloop!!!'''&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
HAL9K 01.png|HAL9K&lt;br /&gt;
HAL9K 02.png|HAL9K&lt;br /&gt;
HAL9K 03.png|HAL9K&lt;br /&gt;
HAL9K 04.png|HAL9K&lt;br /&gt;
HAL9K 05.png|HAL9K&lt;br /&gt;
HAL9K 06.png|HAL9K&lt;br /&gt;
HAL9K 07.png|HAL9K&lt;br /&gt;
HAL9K 08.png|HAL9K&lt;br /&gt;
HAL9K 09.png|HAL9K&lt;br /&gt;
HAL9K 10.png|HAL9K&lt;br /&gt;
HAL9K 11.png|HAL9K&lt;br /&gt;
HAL9K 12.png|HAL9K&lt;br /&gt;
HAL9K 13.png|HAL9K&lt;br /&gt;
HAL9K 14.png|HAL9K&lt;br /&gt;
HAL9K 15.png|HAL9K&lt;br /&gt;
HAL9K 16.png|HAL9K&lt;br /&gt;
HAL9K 17.png|HAL9K&lt;br /&gt;
HAL9K 20.png|HAL9K&lt;br /&gt;
HAL9K 21.png|HAL9K&lt;br /&gt;
HAL9K 22.png|HAL9K&lt;br /&gt;
HAL9K 23.png|HAL9K&lt;br /&gt;
HAL9K 24.png|HAL9K&lt;br /&gt;
HAL9K 25.png|HAL9K&lt;br /&gt;
HAL9K 26.png|HAL9K&lt;br /&gt;
HAL9K 27.png|HAL9K&lt;br /&gt;
HAL9K 29.png|HAL9K&lt;br /&gt;
HAL9k Black Background.jpg|Background&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;Hal9k Mod Installer PRO 2&amp;lt;/font&amp;gt;===&lt;br /&gt;
Für alle, die sich nicht alle diese langen Installationsanleitungen durchlesen wollen, gibt es eine '''KOSTENPFLICHTIGE''' App, die das Ganze vereinfacht: den &amp;lt;big&amp;gt;'''[https://hal9k.ru/?page_id=12&amp;amp;lang=de Mod Installer Pro 2]'''&amp;lt;/big&amp;gt;.&amp;lt;br /&amp;gt;&lt;br /&gt;
Ein kurzer Auszug von der Seite:&amp;lt;br /&amp;gt;&lt;br /&gt;
''Diese App ermöglicht die einfache Installation von Android 6,8, 9 oder 10 auf jedem MTCD(E) Android Radio mit PX5 (RK3368), px30 (rk3326) und px6 (rk3399) Prozessor. Bzw. den Wechsel zwischen Versionen oder ein Upgrade auf eine höhere Android Version.&amp;lt;br /&amp;gt;&lt;br /&gt;
Ab sofort wird kein MicroSD Slot mit der Aufschrift „GPS“ mehr benötigt um die Recovery zu installieren.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Diese App wurde auf verschiedenen MTCD und MTCE Geräten getestet und war dabei stabil. Die Firmware funktioniert nicht auf MTCH basierten Geräten (z.B. Xtrons PQS- und IQ-Serie). Trotzdessen ist eine Installation einer Firmware eine potentiell gefährliche Angelegenheit. Zunächst geht es um die Headunits unter Android 6-10. Deswegen wird die App „so wie sie ist“ zur Verfügung gestellt. Der Author dieser App ist nicht verantwortlich für negative Konsequenzen.''&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
'''Hinweis:''' Mit den Kosten für diese Installations-App unterstützt ihr die Arbeit von '''Hal9k'''. Ihr erwerbt damit aber NICHT die &amp;lt;big&amp;gt;'''&amp;quot;[http://hal9k.ru/?page_id=293&amp;amp;lang=de OTA-Update Lizenz]&amp;quot;'''&amp;lt;/big&amp;gt;, diese muss separat erworben werden.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;Hal9k v2.4&amp;lt;/font&amp;gt; ROM Android 7.1 / MTCD-MTCE / PX3===&lt;br /&gt;
Nur für Radios mit Rockchip PX3, MCU - MTCD, MTCE Android 5.1 und 7.1, RAM 2GB &amp;lt;br /&amp;gt;&lt;br /&gt;
Wer von Android 5.1.1 kommt muss das System vorbereiten&amp;lt;br /&amp;gt;&lt;br /&gt;
Egal ob von Original Firmware oder Malaysk.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Bitte beachten:&amp;lt;br /&amp;gt;&lt;br /&gt;
1. Falls es zu Problemen kommt, bitte [https://xtrons.ibus-app.de/index.php?title=Aktuelle_Firmware#Nach_Updateversuch_funktioniert_nichts_mehr... Hier weiterlesen].&amp;lt;br /&amp;gt;&lt;br /&gt;
2. Wenn dasteht Stick, dann MUSS ein Stick verwendet werden.. Bei SD-Karte MUSS eine SD-Karte verwendet werden...&amp;lt;br /&amp;gt;&lt;br /&gt;
3. Wenn dasteht, dass Ihr ein Medium mit 2, 4 oder 8 GB verwenden müsst, könnt ihr nicht mit 16 oder 32 GB ankommen und euch dann noch wundern wieso nichts mehr geht...'''&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Installation, kommend von Android 5.1.1====&lt;br /&gt;
1. Ihr benötigt eine '''SD-Karte 2-8GB''' und einen USB-Stick.&amp;lt;br /&amp;gt;&lt;br /&gt;
2. [http://download.speedy-pics.de/uploads/safe/SD_Firmware_Tool.rar ''SD-Tool downloaden'']und '''&amp;quot;SD_Firmware_Tool&amp;quot; direkt auf &amp;quot;C:\&amp;quot; '''entpacken.&amp;lt;br /&amp;gt;&lt;br /&gt;
3. [http://download.speedy-pics.de/uploads/safe/Hal9k_Mod_2.4_MTCD_MTCE_PX3_RK3188_1024x600_800%d1%85480_eng.rar ''Firmware ebenfalls downloaden'']und entpacken.&amp;lt;br /&amp;gt;&lt;br /&gt;
4. SD-Firmware Tool als Administrator starten.&amp;lt;br /&amp;gt;&lt;br /&gt;
5. Unter &amp;quot;''Choose removable disk''&amp;quot; eure SD-Karte (Speicher) auswählen.&amp;lt;br /&amp;gt;&lt;br /&gt;
6. Bei &amp;quot;''Upgrade Firmware''&amp;quot; darf '''kein''' Häkchen sein!!!&amp;lt;br /&amp;gt;&lt;br /&gt;
7. Drückt &amp;quot;''Firmware''&amp;quot; und wählt aus dem unter Punkt 3 geladenen Archiv die &amp;quot;''nupdate.img''&amp;quot; aus.&amp;lt;br /&amp;gt;&lt;br /&gt;
8. &amp;quot;''Create''&amp;quot; drücken.&amp;lt;br /&amp;gt;&lt;br /&gt;
9. Die Datei &amp;quot;''nupdate.img''&amp;quot; aus dem unter Punkt 3 entpackten Archiv auf den USB-Stick kopieren.&amp;lt;br /&amp;gt;&lt;br /&gt;
10. Wenn mit dem Android-Update gleich noch Apps installiert werden sollen, auf dem USB-Stick einen Ordner &amp;quot;''hct''&amp;quot; und darin einen Unterordner &amp;quot;''apk''&amp;quot; erstellen und in diesen die APK-Dateien der Apps ablegen (z.B. die IBus-App).&amp;lt;br /&amp;gt;&lt;br /&gt;
11. Danach SD-Karte in GPS-Slot (wenn keiner vorhanden ist, in den SD Slot) und USB Stick ins Radio stecken und neu starten.&amp;lt;br /&amp;gt;&lt;br /&gt;
12. Das Radio startet im Recovery Menü Android 7 von der SD-Karte.&amp;lt;br /&amp;gt;&lt;br /&gt;
13. Wählt &amp;quot;''Apply system image from SD card or USB''&amp;quot; und danach &amp;quot;''From usb storage''&amp;quot;.&amp;lt;br /&amp;gt;&lt;br /&gt;
14. Danach wählt &amp;quot;''Wipe data/factory reset''&amp;quot;.&amp;lt;br /&amp;gt;&lt;br /&gt;
15. Wählt zum Schluss &amp;quot;''Reboot System Now''&amp;quot;.&amp;lt;br /&amp;gt;&lt;br /&gt;
16. Nun startet das Radio neu. Nach Aufforderung SD-Karte entnehmen und Android 7.1 ist installiert.&amp;lt;br /&amp;gt;&lt;br /&gt;
17. SD-Karte sollte im SD-Tool mit &amp;quot;''Restore''&amp;quot; wiederhergestellt werden.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Installation, kommend von Android 7.1====&lt;br /&gt;
1. SD-Karte oder USB-Stick mit 2GB, 4GB oder 8GB mit PC/Laptop verbinden und auf FAT32 formatieren.&amp;lt;br /&amp;gt;&lt;br /&gt;
2. [http://download.speedy-pics.de/uploads/safe/Hal9k_Mod_2.4_MTCD_MTCE_PX3_RK3188_1024x600_800%d1%85480_eng.rar ''Archiv downloaden und entpacken''.]&amp;lt;br /&amp;gt;&lt;br /&gt;
3. Die entpackte &amp;quot;''nupdate.img''&amp;quot; auf die SD-Karte oder USB-Stick verschieben.&amp;lt;br /&amp;gt;&lt;br /&gt;
4. SD-Karte in den GPS Slot einsetzen (wenn keiner vorhanden ist, dann in den SD Slot) bzw. USB-Stick an USB-Kabel anschließen.&amp;lt;br /&amp;gt;&lt;br /&gt;
5. Es erscheint die Meldung &amp;quot;''Firmware Updating''&amp;quot;.&amp;lt;br /&amp;gt;&lt;br /&gt;
6. Klickt nun auf &amp;quot;''Install''&amp;quot;.&amp;lt;br /&amp;gt;&lt;br /&gt;
7. Nun werden alle eure Daten gelöscht und die Firmware aufgespielt.&amp;lt;br /&amp;gt;&lt;br /&gt;
8. Radio startet mit Android 7.1 neu.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;Hal9k v3.1&amp;lt;/font&amp;gt; ROM Android 8.0 / MTCD-MTCE / PX5:===&lt;br /&gt;
Nur für Radios mit Rockchip PX5, MCU - MTCD, MTCE Android 6.0.1 und 8.0, RAM 2-4GB &amp;lt;br /&amp;gt;&lt;br /&gt;
Wer Android 6 besitzt, muss erst das Recovery vom Android 8 updaten, welches im nächsten Abschnitt erklärt wird.&amp;lt;br /&amp;gt;&lt;br /&gt;
Egal ob von Original Firmware oder Malaysk.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Bitte beachten:&amp;lt;br /&amp;gt;&lt;br /&gt;
1. Falls es zu Problemen kommt, bitte [https://xtrons.ibus-app.de/index.php?title=Aktuelle_Firmware#Nach_Updateversuch_funktioniert_nichts_mehr... Hier weiterlesen].&amp;lt;br /&amp;gt;&lt;br /&gt;
2. Wenn dasteht Stick, dann MUSS ein Stick verwendet werden.. Bei SD-Karte MUSS eine SD-Karte verwendet werden...&amp;lt;br /&amp;gt;&lt;br /&gt;
3. Wenn dasteht, dass Ihr ein Medium mit 2, 4 oder 8 GB verwenden müsst, könnt ihr nicht mit 16 oder 32 GB ankommen und euch dann noch wundern wieso nichts mehr geht...'''&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Installation, kommend von Android 6====&lt;br /&gt;
&amp;lt;big&amp;gt;'''WICHTIG'''&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Vor dem Update prüfen welche Bluetooth-Hardware verbaut ist. Dazu in die Werkseinstellungen gehen (Passwort 126) und auf dem 1. Reiter den Namen der BT-Hardware lesen.&amp;lt;br /&amp;gt;&lt;br /&gt;
Sofern dort der '''Typ &amp;quot;MD725&amp;quot;''' erscheint, muss der Untertyp geprüft werden! Dazu den [https://play.google.com/store/apps/details?id=jackpal.androidterm&amp;amp;hl=de&amp;amp;fbclid=IwAR01IOaocQDUbVPKm19gLcYxw2r7aIss2xHiI4K1_HTzgmKAmoc2Gg45aPY Terminal Emulator] installieren und in der App folgenden Text eintippen:&amp;lt;br /&amp;gt;&lt;br /&gt;
'''''getprop bt.md725.type'''''&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Erscheint nun &amp;quot;2&amp;quot; erscheint, ist mit Problemen vom Bluetooth durch das Update zu rechnen.&amp;lt;br /&amp;gt;&lt;br /&gt;
Bei allen anderen Ergebnissen kann das Update erfolgreich durchgeführt werden.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Vorab:''' Hier das passende [https://www.youtube.com/watch?v=HmsUaCy4v68&amp;amp;feature=youtu.be Video].&amp;lt;br /&amp;gt;&lt;br /&gt;
1. 2 SD-Karten mit '''2GB, 4GB '''oder''' 8GB (ganz wichtig, da die Recovery sonst rumzickt und Ihr danach Probleme habt...)''' mit PC/Laptop verbinden.&amp;lt;br /&amp;gt;&lt;br /&gt;
2. [http://download.speedy-pics.de/uploads/safe/Hal9k_Mod_3.x_Android_6.0_upgrade.rar ''Archiv am PC/Laptop downloaden, entpacken und '''&amp;quot;SD_Firmware_Tool&amp;quot; direkt auf &amp;quot;C:\&amp;quot; legen!'''''.]&amp;lt;br /&amp;gt;&lt;br /&gt;
3. &amp;quot;''SD_Firmware_Tool.exe''&amp;quot; am PC/Laptop '''als Administrator ausführen''' (Rechtsklick -&amp;gt; &amp;quot;Als Administrator ausführen&amp;quot;).&amp;lt;br /&amp;gt;&lt;br /&gt;
4. '''Keine Einstellung verändern.''' Wählt unter &amp;quot;''Firmware''&amp;quot; die Datei &amp;quot;''bootcard.img''&amp;quot;.&amp;lt;br /&amp;gt;&lt;br /&gt;
5. Klickt auf &amp;quot;''Create''&amp;quot;, danach &amp;quot;''Yes''&amp;quot; und wartet bis das &amp;quot;''Ok''&amp;quot; erscheint.&amp;lt;br /&amp;gt;&lt;br /&gt;
6. Schließt das Tool.&amp;lt;br /&amp;gt;&lt;br /&gt;
7. Kopiert die Datei ''sdupdate.img'' auf die SD-Karte und ersetzt die vorhandene.&amp;lt;br /&amp;gt;&lt;br /&gt;
8. Auf die 2. SD-Karte kommt nur die ''Update.zip'' aus diesem Download [http://download.speedy-pics.de/uploads/safe/hal9k_mod_3.1_mtcd_mtce_px5_1024x600_800%d1%85480_eng.rar Hal9k v3.1 (1,2GB)] installieren.&amp;lt;br /&amp;gt;&lt;br /&gt;
9. 1. SD-Karte in den GPS Slot vom Radio einsetzen.&amp;lt;br /&amp;gt;&lt;br /&gt;
10. Radio neustarten durch langes betätigen vom RST (Reset) Knopf.&amp;lt;br /&amp;gt;&lt;br /&gt;
11. Es erscheint bald &amp;quot;''Doing actions succeeded. Please remove the sdcard ...''&amp;quot;.&amp;lt;br /&amp;gt;&lt;br /&gt;
12. SD-Karte entfernen.&amp;lt;br /&amp;gt;&lt;br /&gt;
13. '''Nun wird der Bildschirm bis zu 10 Minuten schwarz.'''&amp;lt;br /&amp;gt;&lt;br /&gt;
14. Es erscheint &amp;quot;''Erasing''&amp;quot;.&amp;lt;br /&amp;gt;&lt;br /&gt;
15. Radio startet mit Android 8 Recovery neu.&amp;lt;br /&amp;gt;&lt;br /&gt;
16. Jetzt die 2. SD-Karte mit ''Update.zip'' in den GPS-Slot stecken.&amp;lt;br /&amp;gt;&lt;br /&gt;
17. Wählt im Recovery &amp;quot;''Apply update system''&amp;quot; - &amp;quot;''From SD Card''&amp;quot;.&amp;lt;br/ &amp;gt;&lt;br /&gt;
18. Danach &amp;quot;''Wipe data / factory reset''&amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
19. '''SD Karte entfernen'''&amp;lt;br /&amp;gt;&lt;br /&gt;
20. Radio neustarten&amp;lt;br/ &amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Installation, kommend von Android 8====&lt;br /&gt;
'''Vorab:''' Hier das passende [https://www.youtube.com/watch?v=TiEahNjg9kY&amp;amp;feature=youtu.be Video].&amp;lt;br /&amp;gt;&lt;br /&gt;
1. '''USB Stick''' mit '''2-8 GB''' und '''FAT32''' (geht auch mit SD-Karte, dauert aber erheblich länger).&amp;lt;br /&amp;gt;&lt;br /&gt;
2. [http://download.speedy-pics.de/uploads/safe/hal9k_mod_3.1_mtcd_mtce_px5_1024x600_800%d1%85480_eng.rar ''Hal9k v3.1 (1,2GB)''] downloaden.&amp;lt;br /&amp;gt;&lt;br /&gt;
3. Archiv entpacken und &amp;quot;''ModInstaller.apk''&amp;quot; sowie &amp;quot;''Update.zip''&amp;quot; auf den USB Stick ziehen.&amp;lt;br /&amp;gt;&lt;br /&gt;
4. USB Stick am Radio anschließen, wenn er euch nach einem Update fragt unbedingt ablehnen!!&amp;lt;br /&amp;gt;&lt;br /&gt;
5. '''ModInstaller.apk''' installieren, starten und auf den riesigen roten Button drücken.&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Datei:Http hal9k ru mtcdmod 02xda3.png|border|x100px]]&amp;lt;br /&amp;gt;&lt;br /&gt;
6. Radio geht in den Recovery Modus. Dort begebt ihr euch z.B. mit einer Nadel im Resetbutton zu &amp;quot;''Apply update system''&amp;quot; und &amp;quot;''From usb storage''&amp;quot;.&amp;lt;br /&amp;gt;&lt;br /&gt;
7. Lange drücken zum Bestätigen.&amp;lt;br /&amp;gt;&lt;br /&gt;
8. ROM wird installiert. '''Dies kann zwischen 3 bis 8 Minuten dauern'''.&amp;lt;br /&amp;gt;&lt;br /&gt;
9. Danach müsst ihr leider &amp;quot;''Wipe data / factory reset''&amp;quot; betätigen. Dies löscht alle eure Daten.&amp;lt;br /&amp;gt;&lt;br /&gt;
9.1. Kommt nicht auf die Idee diesen Schritt zu überspringen.. Ich tat es und es hat mir nur Ärger gebracht.&amp;lt;br /&amp;gt;&lt;br /&gt;
10. '''SD Karte entfernen'''&amp;lt;br /&amp;gt;&lt;br /&gt;
11. Radio neustarten&amp;lt;br/ &amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Wichtigstes Feature der v3.1: Reset der USB Anschlüsse für das bekannte &amp;quot;[[Kein WLAN/USB/Bluetooth wenn es kalt ist]]&amp;quot;-Problem.'''&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;&amp;gt;&lt;br /&gt;
Hal9kv3.1.jpg|HAL9K&lt;br /&gt;
Hal9kv3.1 2.png|HAL9K&lt;br /&gt;
Hal9kv3.1 3.png|HAL9K&lt;br /&gt;
Hal9kv3.1 4.png|HAL9K&lt;br /&gt;
Hal9k_010.png|HAL9K Update&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Hal9k v3.1+ Updates====&lt;br /&gt;
Alle Folge-Updates nach der v3.1 kommen bislang ausschlißelich als &amp;quot;OTA&amp;quot; (Over The Air), das Update wird also direkt am Radio herunter geladen und ausgeführt. So wie man das vom Handy kennt. Dabei gehen die Daten und Apps NICHT verloren.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
=====Version 3.1.1 OTA-Paket=====&lt;br /&gt;
# Verbesserter Bildschirmschoner:Es wurden Informationen über den gespielten Track für die meisten Drittanbieter angezeigt. Die Möglichkeit, das Aussehen des Bildschirmschoners anzupassen: Farben, Hintergrundbild, der Maximalwert für die Geschwindigkeitsanzeige. Vertauschte Geschwindigkeits- und Volumenanzeigen.&lt;br /&gt;
# Ein kurzer Druck auf den Netzschalt er des Bildschirms schaltet nun den ausgewählten Bildschirmschoner ein.&lt;br /&gt;
# Die Google-Anwendung ruft nun ohne zusätzliche Einstellungen über den MTCDialer an.&lt;br /&gt;
# Sie können Musik durch eine Navigationsanwendung dämpfen, die Sprachansagen über einen Sprachsynthesizer wiedergibt.&lt;br /&gt;
# Zur Verwendung müssen Sie die Anwendung zur &amp;quot;Liste der Navigationsanwendungen, die andere Sounds dämpfen&amp;quot; hinzufügen und &amp;quot;Text-to-Speech-Engine, die andere Sounds dämpft&amp;quot; auswählen.&lt;br /&gt;
# Ersetzte Symbole im Stock Launcher und in der Statusleiste.&lt;br /&gt;
# Es wurde die Möglichkeit zugefügt, den System UI Tuner über Mod Settings aufzurufen.&lt;br /&gt;
# Der Timeout für das Einlegen einer Speicherkarte nach dem Ausschlafen für einen Stockplayer wird auf 30 Sekunden erhöht.&lt;br /&gt;
# Es wurde die Möglichkeit hinzugefügt, neue Tastencodes für einen Joystick in einem Mazda-Auto zu ersetzen.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
=====Version 3.1.2 OTA-Paket=====&lt;br /&gt;
# Übersetzungen in verschiedenen Sprachen hinzugefügt oder korrigiert:&lt;br /&gt;
# Verbesserter Bildschirmschoner: Es wurden Display-Covers für die meisten Player von Drittanbietern und Radiosender-Icons für die PCRADIO App erstellt. Für eine korrekte Arbeit empfehle ich, Ihre Player in die &amp;quot;Liste der Anwendungen, die nicht gleichzeitig funktionieren sollten&amp;quot; aufzunehmen. Anzeige von Empfehlungen bei der Fahrt entlang einer Route für Yandex.Navigator, Yandex.Maps, Google Maps, Sygic GPS Navigation &amp;amp; Maps. Made Anzeige der Temperatur von Yandex.Weather, wenn die Daten über die Temperatur nicht aus dem CAN-Adapter kommen. Jetzt wird der Bildschirmschoner in 800x480 korrekt angezeigt. Während der Bildschirmschoner läuft, wird die Bestandsmengensteuerung nicht mehr angezeigt.&lt;br /&gt;
# Popup-Meldungen von BT Music und Media-Playern von Drittanbietern wurden hinzugefügt. Media-Player von Drittanbietern müssen der entsprechenden Liste hinzugefügt werden.&lt;br /&gt;
# Es wurde eine Liste von Anwendungen hinzugefügt, die im Immersive-Modus (Vollbild) arbeiten.&lt;br /&gt;
# Erstellung einer separaten Liste der Navigation mit TTS&lt;br /&gt;
# Es wurde die Möglichkeit zugefügt, der Navi-Taste die zuletzt gestartete Navigation zuzuordnen (z.B. um zwischen Navigation und Player zu wechseln).&lt;br /&gt;
# Auf vielfachen Wunsch wurden individuelle Parklinien hinzugefügt. Danke für Incognito+.&lt;br /&gt;
# Magisk aktualisiert auf v18.1, Viper4Android aktualisiert auf v2.7&lt;br /&gt;
# Neue Tastencodes zum Ersetzen hinzugefügt&lt;br /&gt;
# OEM-Launcher mit Widgets können nun auf einmal installiert werden.&lt;br /&gt;
# Es wurde viel Arbeit geleistet, um die Unterstützung für neue Basis-Firmware zu gewährleisten, obwohl dies von außen nicht sichtbar ist.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
=====Updatemeldung Hal9k v3 auf v4 abschalten=====&lt;br /&gt;
# Mod Einstellungen -&amp;gt; Update -&amp;gt; Auto Update deaktivieren&lt;br /&gt;
# Installiert einen Root-Explorer und vergebt die Root-Rechte (z.B. ES Datei Explorer, Titaniumm total commander, ..)&lt;br /&gt;
# Löscht die Datei &amp;quot;reminder.apk&amp;quot; im Pfad: ../system/app/reminder/&lt;br /&gt;
# Neustarten&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
=== &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;Hal9k v4.0&amp;lt;/font&amp;gt; auf Basis von Android 9.0 für Radios mit PX5/PX6/PX30===&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''Voraussetzung: auf dem Radio muss eine MTCD/MTCE MCU Version v3.30 oder höher und Android 6.0, 8.0 oder (am Besten) 9.0 installiert sein!'''&amp;lt;/font&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://4pda.ru/forum/index.php?showtopic=973606 Link zum Beitrag bei http://4pda.ru/] (Russisch)&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Bitte das Video hinsichtlich der Installation, Voraussetzungen etc. beachten!&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
====Nach Flashen alles Russich====&lt;br /&gt;
Wenn nach dem Flashen alles Russich ist, befolgt die bebilderte Anleitung.&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Datei:20191212_161902.jpg|border|x300px]]&lt;br /&gt;
[[Datei:20191212_161924.jpg|border|x300px]]&lt;br /&gt;
[[Datei:20191212_161931.jpg|border|x300px]]&lt;br /&gt;
[[Datei:20191212_161938.jpg|border|x300px]]&lt;br /&gt;
[[Datei:20191212_161947.jpg|border|x300px]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Datei:20191212_162032.jpg|border|x300px]]&lt;br /&gt;
[[Datei:20191212_162047.jpg|border|x300px]]&lt;br /&gt;
[[Datei:20191212_162059.jpg|border|x300px]]&lt;br /&gt;
[[Datei:20191212_162107.jpg|border|x300px]]&lt;br /&gt;
[[Datei:20191212_162113.jpg|border|x300px]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Hal9k v4.0 für PX5, kommen von Android 8====&lt;br /&gt;
Laden Sie die notwendigen Komponenten herunter:&amp;lt;br /&amp;gt;&lt;br /&gt;
1.[http://download.speedy-pics.de/uploads/android/firmware/Hal9k_Mod_4.0_MTCD_MTCE_PX5_eng.rar Hal9k_Mod_4.0_MTCD_MTCE_PX5] (ca. 1GB) und für die Sicherung / Wiederherstellung von Software und Einstellungen.&amp;lt;br /&amp;gt; &lt;br /&gt;
2. [https://yadi.sk/d/XW3SVtcEC9wypg&amp;amp;xid=17259,1500003,15700021,15700043,15700186,15700190,15700256,15700259,15700262,15700265,15700271,15700283&amp;amp;usg=ALkJrhg1Z13AyyA91NkHRe-FzU2lN8ezog ''Programm''] zum Erstellen einer bootfähigen SD-Karte.&amp;lt;br /&amp;gt; &lt;br /&gt;
3. Die passende Update-Datei downloaden und entpacken für Android 8 auf Android 9 für Ihr Radio, welches man anhand der MCU herausfinden kann.&amp;lt;br /&amp;gt;&lt;br /&gt;
Wenn mehrere *.zip vorhanden sind, nehmt die aktuellste (letztes Datum)&amp;lt;br /&amp;gt;&lt;br /&gt;
[https://yadi.sk/d/umCvHqCDzHccr/RockChip%20PX5%20%20Android%209/CHS CHS &amp;amp; CHS3]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://yadi.sk/d/umCvHqCDzHccr/RockChip%20PX5%20%20Android%209/GS GS]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://yadi.sk/d/umCvHqCDzHccr/RockChip%20PX5%20%20Android%209/HA HA]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://yadi.sk/d/umCvHqCDzHccr/RockChip%20PX5%20%20Android%209/HXD HXD]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://yadi.sk/d/umCvHqCDzHccr/RockChip%20PX5%20%20Android%209/LM LM]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://yadi.sk/d/umCvHqCDzHccr/RockChip%20PX5%20%20Android%209/MX MX (HCT4)]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://yadi.sk/d/umCvHqCDzHccr/RockChip%20PX5%20%20Android%209/OLS OLS]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://yadi.sk/d/umCvHqCDzHccr/RockChip%20PX5%20%20Android%209/YB YB (Y-Series)]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://yadi.sk/d/umCvHqCDzHccr/RockChip%20PX5%20%20Android%209/ksp9_px5_9.0_ota(20190411)%E5%8D%87%E7%BA%A7%E5%8C%85.zip KSP9]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
=====Anwendungen sichern=====&lt;br /&gt;
(Wer den Schritt auslassen möchte, bitte bei Schritt 11 fortsetzen)&amp;lt;br /&amp;gt;&lt;br /&gt;
4. Bereite einen USB-Stick (Kapazität wie das Radio, meistens 32-64GB) vor.&amp;lt;br /&amp;gt;&lt;br /&gt;
5. Formatiere den am PC auf FAT32.&amp;lt;br /&amp;gt; &lt;br /&gt;
6. Legen Sie die Datei update.zip aus dem Verzeichnis backup8 auf den USB-Stick ab.&amp;lt;br /&amp;gt; &lt;br /&gt;
7. Stecken Sie den USB-Stick in den USB-Anschluss des Radios. Daraufhin, sollte eine Updatemeldung erscheinen.&amp;lt;br /&amp;gt;&lt;br /&gt;
8. Warte bis die Sicherung abgeschlossen ist. Auf dem USB_Stick wird ein Multivolume-Archiv mit den Daten (Benutzerdaten *) erstellt.&amp;lt;br /&amp;gt; &lt;br /&gt;
9. Entfernen Sie das Flash-Laufwerk und starten Sie die GU neu.&amp;lt;br /&amp;gt;&lt;br /&gt;
10. USB-Stick abziehen und erst im Schritt 32 wiederverwenden.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Eigentliche Installation von Android 9====&lt;br /&gt;
11. Organisiere Dir Zwei Sd-Karten mit je 2-4-8 GB.&amp;lt;br /&amp;gt;&lt;br /&gt;
12. Entpacke, dass in Schritt 2 gedownlaodete Archiv, Hal9k_Mod_3.x_upgrade_to_Android_9.0.rar, so dass der Ordner '''&amp;quot;SD_Firmware_Tool&amp;quot; direkt auf &amp;quot;C:\&amp;quot; liegt!'''&amp;lt;br /&amp;gt;&lt;br /&gt;
13. Setze die SD-Karte in den Kartenleser ein.&amp;lt;br /&amp;gt; &lt;br /&gt;
14. Führe die Anwendung '''SD_Firmware_Tool''' als Administrator aus. Es müssen keine Einstellungen geändert werden.  Alles ist bereits konfiguriert.&amp;lt;br /&amp;gt;&lt;br /&gt;
15. Klick auf die Schaltfläche &amp;quot;Firmware&amp;quot; und wählen Sie die Datei '''bootcard.img''' aus.&amp;lt;br /&amp;gt; &lt;br /&gt;
16. Klick auf die Schaltfläche &amp;quot;Erstellen&amp;quot; und dann auf &amp;quot;Ja&amp;quot; und warte bis &amp;quot;OK&amp;quot; angezeigt wird.&amp;lt;br /&amp;gt; &lt;br /&gt;
17. Schließe SD_Firmware_Tool.&amp;lt;br /&amp;gt;&lt;br /&gt;
18. Kopiere die Datei ''sdupdate.img'' und ersetze diese auf der SD-Karte.&amp;lt;br /&amp;gt; &lt;br /&gt;
19. Entferne die SD-Karte und setze diese in den GPS-Slot.&amp;lt;br /&amp;gt; &lt;br /&gt;
20. Jetzt Radio neu starten. Dazu lange mit einer Nadel &amp;quot;RST&amp;quot; (Reset) drücken. Alternativ: Stromstecker abziehen und wieder anschließen.&amp;lt;br /&amp;gt; &lt;br /&gt;
21. Wenn die Meldung &amp;quot;Aktion erfolgreich ausgeführt. Bitte SD-Karte entfernen ...&amp;quot; angezeigt wird , entferne die SD-Karte aus dem Radio. Das Radio sollte nun das Recovery Android 9 starten.&amp;lt;br /&amp;gt;&lt;br /&gt;
22. Formatiere am PC die 2. SD_Karte in Fat 32.&amp;lt;br /&amp;gt;&lt;br /&gt;
23. Lege die Datei update.zip aus dem im Schritt 3 gedownloadetetn Archiv auf die SD-Karte.&amp;lt;br /&amp;gt;&lt;br /&gt;
24. Entferne alle anderen SD-Karten und USB-Sticks aus dem Radio. &amp;lt;br /&amp;gt; &lt;br /&gt;
25. Nun setze die präparierten SD-Karte in dein Radio ein. &amp;lt;br /&amp;gt;&lt;br /&gt;
26. Wähle den Menüpunkt &amp;quot; Update System anwenden&amp;quot; - &amp;quot;Von SD-Karte&amp;quot;. Die Firmware wird installiert. &amp;lt;br /&amp;gt;&lt;br /&gt;
27. Wählen nach erfolgreicher Installation den Menüpunkt &amp;quot;Wipe data / factory reset&amp;quot;. Die Benutzerdaten werden gelöscht.&amp;lt;br /&amp;gt; &lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''!!!WER HAL9K MÖCHTE, BEI SCHRITT 29 WEITERMACHEN!!!'''&amp;lt;/font&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;!!!WER NUR ANDROID 9 MÖCHTE-&amp;gt; 28. Wähle den Menüpunkt &amp;quot;System jetzt neu starten&amp;quot;. Nun startet das Radio mit Android 9 neu.&amp;lt;/font&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Installation von Hal9k v4.0====&lt;br /&gt;
29. Stecke eine SD-Karte von eben an den PC und formatiere diesen wieder in Fat32.&amp;lt;br /&amp;gt; &lt;br /&gt;
30. Entpacken das Archiv ''Hal9k_Mod_4.0_MTCD_MTCE_PX5.zip // Hal9k_Mod_4.0_MTCD_MTCE_PX6.zip // Hal9k_Mod_4.0_MTCD_MTCE_PX30.zip'' (siehe Download weiter unten)und kopiere die Datei &amp;quot;update.zip&amp;quot; aus diesem Archiv auf die SD-Karte.&amp;lt;br /&amp;gt; &lt;br /&gt;
31. Stecke die SD-Karte in den Slot des Radios und Wähle den Menüpunkt &amp;quot; Update System anwenden&amp;quot; - &amp;quot;Von SD-Karte&amp;quot;. Die Firmware wird installiert.. Nach erfolreicher Installation SD-Karte entfernen und Radio neustarten.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Datenwiederherstellung von Android 8 Schritt 4-10=====&lt;br /&gt;
32. Nehme dem USB-Stick mit der Sicherungskopie und ersetze die Datei update.zip (von restore8) durch update.zip (aus dem Ordner restore9).&amp;lt;br /&amp;gt;&lt;br /&gt;
33. Stecke den USB-Stick in den USB-Anschluss des Radios und klick im angezeigten Fenster auf &amp;quot;Installieren&amp;quot;. Warte auf das Ende und den automatischen Neustart.&amp;lt;br /&amp;gt;&lt;br /&gt;
!!!Das erste Booten von Android 9 nach dem Wiederherstellen der Programme von Android 8 kann länger dauern als gewöhnlich. Das System benötigt Zeit, um die Daten zu konvertieren.!!!&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Download Hal9k v4.0  ====&lt;br /&gt;
[http://download.speedy-pics.de/uploads/android/firmware/Hal9k_Mod_4.0_MTCD_MTCE_PX5_eng.rar Hal9k v4.0 für PX5] (ca. 1GB)&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://download.speedy-pics.de/uploads/android/firmware/Hal9k_Mod_4.0_MTCD_MTCE_PX6_eng.rar Hal9k v4.0 für PX6] (ca. 1GB)&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://download.speedy-pics.de/uploads/android/firmware/Hal9k_Mod_4.0_MTCD_MTCE_PX30_eng.rar Hal9k v4.0 für PX30] (ca. 1GB)&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Hinweis: Chrome blockiert  das Herunterladen von *.zip-Dateien mit Draufklicken seit Dezember 2020 (ab Version 86). Zum Download bitte mit &amp;quot;Rechtsklick&amp;quot; =&amp;gt; &amp;quot;Adresse des Links kopieren&amp;quot; und danach in einem neuen Tab öffnen. Danach startet der Download.&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
====Hal9k v4 DSP Soundmod====&lt;br /&gt;
Eine bessere DSP App ist bereits verfügbar.&amp;lt;br /&amp;gt;&lt;br /&gt;
ApkInstaller -&amp;gt; OEM -&amp;gt; HZC3AmpSetup.apk &amp;lt;br /&amp;gt;&lt;br /&gt;
[[Datei:SoundmodHal9kv4.png|border|x100px]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Mehr Infos unter: [https://xtrons.ibus-app.de/index.php?title=DSP-Equalizer-Modifikation_f%C3%BCr_Radios_mit_internem_DSP#DSP-Sound-MOD_in_Hal9k_.28ab_v4.29 '''DSP-Sound-MOD in Hal9k (ab v4)''']&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
==== Hal9k v4 apk Dateien ====&lt;br /&gt;
Alle Apps die mit Hal9k v4 im &amp;quot;OEM&amp;quot; Ordner zur Installation beinhaltet sind hier zum Download. Inkl. der DSP-MOD Installation.&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://download.speedy-pics.de/uploads/android/HAL9k_v4_apk.rar Download: HAL9k_v4_apk.rar][67MB]&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
'''Enhält:'''&lt;br /&gt;
* diverse Launcher (AY, GS, HCT2, HCT3, KGL und ZH)&lt;br /&gt;
* DAB Player&lt;br /&gt;
* GPS Test&lt;br /&gt;
* [http://download.speedy-pics.de/uploads/android/HZC3AmpSetup.apk HZC3AmpSetup] (DSP Mod)&lt;br /&gt;
* MtcDialer&lt;br /&gt;
* Torque 1.8.92&lt;br /&gt;
* VIPER4Android&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
====Launcher ändern====&lt;br /&gt;
Im OEM Ordner sind 6 Launcher verfügbar (AY, GS, HCT2, HCT3, KGL, ZH). &amp;lt;br /&amp;gt;&lt;br /&gt;
ApkInstaller -&amp;gt; OEM -&amp;gt; AY(Beispiel)&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Datei:HAL9K 21.png|border|x100px]]&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
====Android Handy wiederspiegeln====&lt;br /&gt;
Hal9k hat die EasyConnected App, welches das Smartphone auf dem Display widerspiegelt, herausgenommen.&amp;lt;br /&amp;gt;&lt;br /&gt;
Aber diese könnt Ihr euch [http://download.speedy-pics.de/uploads/safe/EasyConnected.HT09.5.1.2-0dfcedf-180723.0xd.apk hier downloaden].&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
====OTA Updates====&lt;br /&gt;
Für Hal9k v4 gibt es &amp;lt;big&amp;gt;'''&amp;quot;[https://xdaforums.com/t/rom-px5-px6-px30-pie-9-0-hal9k-mod-v4-for-mtcd-e-head-units-with-android-9-8-6.4046361/ OTA-Update]&amp;quot;'''&amp;lt;/big&amp;gt;s nur gegen kostenpflichtige Freischaltung.&amp;lt;br /&amp;gt;&lt;br /&gt;
Das ist insbesondere lohnenswert ab der Version 4.0.2, weil ab hier wieder das beliebte &amp;quot;Ersetzen von Tastencodes&amp;quot; enthalten ist.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;Hal9k v5.0&amp;lt;/font&amp;gt; auf Basis von Android 10.0 für Radios mit PX5/PX6/PX30===&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
[https://forum.xda-developers.com/t/rom-px5-px6-px30-q-10-hal9k-mod-v5-for-mtcx-hctx-head-units-with-android-10-9-8-6.4314163/?fbclid=IwAR1F1JUSCfaHDRQYRzC1vMTpNzSuJUfmn37wlZBkyTYIWrBLFT_OOSo3N9I &amp;lt;big&amp;gt;'''Infos aus dem XDA-Forum'''&amp;lt;/big&amp;gt;]&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
'''Hal9k Mod v5 basierend auf Android 10 für MTCx HCTx Rockchip PX5 (rk3368), PX6 (rk3399) und PX30 (rk3326) Radios'''&amp;lt;br /&amp;gt;&lt;br /&gt;
'''Kompatible MCU-Versionen:''' MTCD_XXXX, MTCE_XXXX, MTCP_XXXX, MTCH_XXXX, HCTG_XXXX&amp;lt;br /&amp;gt;&lt;br /&gt;
'''Firmware-Version:''' 5.0.0 (31.07.2021) )&amp;lt;br /&amp;gt;&lt;br /&gt;
'''Version des neuesten [https://xtrons.ibus-app.de/index.php?title=Aktuelle_Firmware#OTA_Updates_2 OTA - Update]:''' 5.0.1 (2021.07.31) [kostenpflichtig]&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Über Firmware:'''&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Firmware für Radios basierend auf MTCX oder HCTX Plattform mit Rockchip PX5, PX6 oder PX30 Prozessoren und Bildschirmauflösung 800x480, 1024x600, 1280x720, 1920x1080 , basierend auf Android 10.&amp;lt;br /&amp;gt;&lt;br /&gt;
Dies ist eine Weiterentwicklung des Hal9k Mod v4 auf Basis von Android 9.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Die Basisversion der Firmware wird in der hier eingestellten Form '''für den privaten Gebrauch kostenlos''' verteilt und unterliegt keinen Leistungseinschränkungen. Die kommerzielle Nutzung der Firmware oder ihrer Teile und Algorithmen ist untersagt.&amp;lt;br /&amp;gt;&lt;br /&gt;
Nach und nach werden Änderungen in den Mod integriert, die neue Funktionen hinzufügen und mögliche Fehler korrigieren. Diese sind nur als einmalig-kostenpflichtiges [https://xtrons.ibus-app.de/index.php?title=Aktuelle_Firmware#OTA_Updates_2 OTA-Update] verfügbar.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Jede Änderung der Firmware des Hauptgeräts ist ein potenziell gefährlicher Vorgang. Daher wird der Mod &amp;quot;wie besehen&amp;quot; bereitgestellt. Der Autor übernimmt keine Verantwortung für eventuelle negative Folgen.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Die Hauptvorteile dieser Firmware:'''&amp;lt;/big&amp;gt;&lt;br /&gt;
* originales Design&lt;br /&gt;
* Hohe Stabilität&lt;br /&gt;
* Erweiterte Funktionalität, z.B.:&lt;br /&gt;
** modifizierte DSP Equalizer App enthalten (unter OEM Apps, muss installiert werden)&lt;br /&gt;
** GPS Abtastrate mit 1, 2, 5 oder 10Hz (ab 5.0.1)&lt;br /&gt;
** Ersetzen von Tastencodes&lt;br /&gt;
** Root-Rechte&lt;br /&gt;
** ...&lt;br /&gt;
* Behebung vorhandener Fehler und Mängel in der Original-Firmware&lt;br /&gt;
* Anpassbarkeit. Alle Ergänzungen und Modifikationen können nach Ihren Wünschen angepasst werden&lt;br /&gt;
* Änderungen werden direkt im Anwendungscode vorgenommen, ohne das Xposed-Framework zu verwenden&lt;br /&gt;
* Erhöhte Reaktionsfähigkeit im Vergleich zur Aktie + die Möglichkeit, diesen Indikator unabhängig zu verbessern&lt;br /&gt;
'''Systemanforderungen ( ''Einstellungen &amp;gt; Über das Tablet'' )'''&lt;br /&gt;
* Das Modell basiert auf mit PX5 (rk3368) oder PX6 (rk3399) oder PX30 (rk3326_mid)&lt;br /&gt;
* Android-Version beginnt mit 10 oder 9 oder 8.0 oder 6.0&lt;br /&gt;
* Die MCU-Version beginnt mit MTCD, MTCE, MTCP, MTCH, HCTG. Außerdem kann es beliebige Buchstaben geben, zwei, drei, vier - es spielt keine Rolle.&lt;br /&gt;
* Sie müssen auch in der Lage sein in den Recovery - Modus zu kommen.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
==== Videoanleitung für Installation/Review ====&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://youtu.be/Gx3mIN6ZJ7o&amp;lt;/youtube&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Anleitung Videoinstallation von Alex 'Android - Radio (englisch)&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://youtu.be/BoY62nfkS3g&amp;lt;/youtube&amp;gt;&amp;lt;br /&amp;gt; &lt;br /&gt;
Anleitung Videoinstallation von Alex' Android - Radio (Deutsch)]&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://youtu.be/S9_pi682seE&amp;lt;/youtube&amp;gt;&amp;lt;br /&amp;gt; &lt;br /&gt;
Alex' Android Radio: Hal9k Mod 5 | Android 10 | Einrichtung | Vorteile | Funktionen&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Wie installiere ich die Firmware?'''&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* Beim Wechsel von einer anderen Firmware müssen Sie die Benutzerdaten löschen!&amp;lt;br /&amp;gt;&lt;br /&gt;
* Für einen stabilen Betrieb des Geräts wird empfohlen, die MCU-Firmware auf die aktuelle Version zu aktualisieren, die im März 2021 oder später veröffentlicht wurde.&amp;lt;br /&amp;gt;&lt;br /&gt;
* Wenn für Ihr Gerät keine solche Firmware verfügbar ist, verwenden Sie die neueste verfügbare.&amp;lt;br /&amp;gt;&lt;br /&gt;
* MCU-Firmware erhalten Sie bei Ihrem Radio-Händler oder suchen Sie in der cs-x-Sammlung.&amp;lt;br /&amp;gt;&lt;br /&gt;
* MTCE-Versionen können statt MTCD installiert werden&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Installation kommend von Android 10:====&lt;br /&gt;
Die Installation erfolgt ähnlich wie bei einem regulären Firmware-Update:&amp;lt;br /&amp;gt;&lt;br /&gt;
Kopieren Sie die Firmware-Datei update.zip auf einen USB-Stick / eine in FAT32 formatierte Speicherkarte&amp;lt;br /&amp;gt;&lt;br /&gt;
Verbinden Sie den USB-Stick / die Speicherkarte mit dem Gerät&amp;lt;br /&amp;gt;&lt;br /&gt;
Setzen Sie das Kontrollkästchen &amp;quot;Daten löschen ...&amp;quot; und klicken Sie im erscheinenden Fenster auf die Schaltfläche &amp;quot;Installieren&amp;quot;.&amp;lt;br /&amp;gt;&lt;br /&gt;
Nach der Installation wird das Gerät automatisch noch einmal neu gestartet, um die Magisk-Installation abzuschließen.&amp;lt;br /&amp;gt;&lt;br /&gt;
Die Installation von einer SD-Speicherkarte kann länger dauern!&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
====Installation kommend von Android 9, 8 oder 6:====&lt;br /&gt;
Erfordert die Aktualisierung der Recovery-Mode auf Android10&amp;lt;br /&amp;gt;&lt;br /&gt;
Einfacher und sicherer Weg: Verwenden Sie die '''(kostenpflichtigen) [https://xtrons.ibus-app.de/index.php?title=Aktuelle_Firmware#Hal9k_Mod_Installer_PRO ModInstaller Pro]'''&amp;lt;br /&amp;gt;&lt;br /&gt;
Komplizierter und unsicherer Weg: Suchen Sie im XDA-Forum nach Informationen&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
'''Ergänzungen:'''&lt;br /&gt;
* Automatische Hintergrundbeleuchtungssteuerung für PX5-basierte Hauptgeräte&lt;br /&gt;
* Internetgeschwindigkeit in der Statusleiste&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Download Hal9k v5.0 ====&lt;br /&gt;
* '''[http://download.speedy-pics.de/uploads/android/firmware/Hal9k_Mod_5.0_MTCx_HCTx_PX5_eng.rar Hal9k v5.0 für PX5 (englische Version)]'''&lt;br /&gt;
* '''[http://download.speedy-pics.de/uploads/android/firmware/Hal9k_Mod_5.0_MTCx_HCTx_PX6_eng.rar Hal9k v5.0 für PX6 (englische Version)]'''&lt;br /&gt;
* '''[http://download.speedy-pics.de/uploads/android/firmware/Hal9k_Mod_5.0_MTCx_HCTx_PX30_eng.rar Hal9k v5.0 für  PX30 (englische Version)]'''&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
====OTA Updates====&lt;br /&gt;
Für Hal9k v5 gibt es &amp;lt;big&amp;gt;'''&amp;quot;[http://hal9k.ru/?page_id=5&amp;amp;lang=de OTA-Updates nur gegen kostenpflichtige Freischaltung]&amp;quot;'''&amp;lt;/big&amp;gt;.&amp;lt;br /&amp;gt;&lt;br /&gt;
Vorteile vom OTA Update (Stand v5.0.1):&lt;br /&gt;
* &amp;quot;Ersetzen von Tastencodes&amp;quot; verfügbar&lt;br /&gt;
* &amp;quot;erweitertes GPS Setup&amp;quot; (1 / 2 / 5 / 10Hz Abtastrate, BeiDou statt GLONASS,..).&lt;br /&gt;
* Bild der Frontkamera spiegeln. Nützlich für diejenigen, die eine Rückfahrkamera an der Vorderseite des Autos anbringen&lt;br /&gt;
* ...&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
====Hal9k v5 DSP Soundmod====&lt;br /&gt;
Eine bessere DSP App ist bereits verfügbar.&amp;lt;br /&amp;gt;&lt;br /&gt;
ApkInstaller -&amp;gt; OEM -&amp;gt; HZC3AmpSetup.apk &amp;lt;br /&amp;gt;&lt;br /&gt;
[[Datei:SoundmodHal9kv4.png|border|x100px]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Mehr Infos unter: [https://xtrons.ibus-app.de/index.php?title=DSP-Equalizer-Modifikation_f%C3%BCr_Radios_mit_internem_DSP#DSP-Sound-MOD_in_Hal9k_.28ab_v4.29 '''DSP-Sound-MOD in Hal9k (ab v4)''']&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Nach Updateversuch funktioniert nichts mehr...==&lt;br /&gt;
Achtung: FÜR PX5 MTCD-MTCE MODELLE (Android 6 wird installiert).&amp;lt;br /&amp;gt;&lt;br /&gt;
Aus diversen Gründen kann es passieren, dass ein Update fehlschlägt und man augenscheinlich glaubt das Radio gebricked zu haben.&amp;lt;br /&amp;gt;&lt;br /&gt;
Dagegen hilft in 99% der Fälle folgende Anleitung.&amp;lt;br /&amp;gt;&lt;br /&gt;
1. Man benötigt eine SD Karte (2, 4 oder 8GB), formatiert in fat32 und einen PC&amp;lt;br /&amp;gt;&lt;br /&gt;
2. [http://download.speedy-pics.de/uploads/safe/SD_Firmware_Tool_For_PX5_android_6_0_1.rar SD Tool downloaden] und '''&amp;quot;SD_Firmware_Tool&amp;quot; direkt auf &amp;quot;C:\&amp;quot; entpacken!'''&amp;lt;br /&amp;gt;&lt;br /&gt;
3. SD Karte mit PC verbinden und SD Programm starten.&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Datei:SD 1.png|border|x100px]]&amp;lt;br /&amp;gt;&lt;br /&gt;
4. Ganz oben muss eure SD Karte gewählt sein.&amp;lt;br /&amp;gt;&lt;br /&gt;
5. Es darf nur &amp;quot;Upgrade Firmware&amp;quot; ausgewählt sein.&amp;lt;br /&amp;gt;&lt;br /&gt;
6. Unter &amp;quot;Choose Firmware&amp;quot; die &amp;quot;Update.img&amp;quot; auswählen.&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Datei:SD 2.jpg|border|x100px]]&amp;lt;br /&amp;gt;&lt;br /&gt;
7. Auf &amp;quot;Create&amp;quot; klicken und warten bis es fertig ist..&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Datei:SD 3.png|border|x100px]]&amp;lt;br /&amp;gt;&lt;br /&gt;
8. SD Karte ins Radio einlegen und starten.&amp;lt;br /&amp;gt;&lt;br /&gt;
9. Firmware wird installiert.&amp;lt;br /&amp;gt;&lt;br /&gt;
10. Ihr werdet aufgefordert, die SD Karte zu entfernen, danach startet das Radio neu und ihr habt eurem Radio neues Leben beschert :)&amp;lt;br /&amp;gt;&lt;br /&gt;
11. SD Karte wieder mit PC verbinden.&amp;lt;br /&amp;gt;&lt;br /&gt;
12. Im SD Tool &amp;quot;Restore&amp;quot; klicken&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Datei:SD 4.png|border|x100px]]&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
==MCU Updates==&lt;br /&gt;
Die MCU ist sowas wie der &amp;quot;Treiber&amp;quot; des Radios - entsprechend muss diese auch mit aktuell gehalten werden. &lt;br /&gt;
&lt;br /&gt;
WICHTIG: die MCU muss stets zur Hardware passen! Die Installation einer falschen MCU Version wird vom Radio i.d.R. nicht akzeptiert, wenn doch kann es bis zum Totalausfall des Radios kommen.&lt;br /&gt;
&lt;br /&gt;
Daher darauf achten was installiert ist und was upgedatet werden soll.&lt;br /&gt;
&lt;br /&gt;
'''Anleitung: wie funktioniert ein [[Firmwareupdate]]'''&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
===MCU Updates für Android 6.0/8.0/9.0/10.0 // MTCD+MTCE - nur Version &amp;quot;GS&amp;quot;/ PX5+PX6:===&lt;br /&gt;
&amp;lt;big&amp;gt;[https://download.speedy-pics.de/uploads/android/MCU/MTCE_GS_3.79.zip MCU Update für PX5/PX6-Serie (nur Version &amp;quot;GS&amp;quot;)] &amp;lt;/big&amp;gt;[*.rar / ~0,2MB] '''(v3.79) *neu*'''&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;[https://download.speedy-pics.de/uploads/android/MCU/MTCE_GS_3.73.zip MCU Update für PX5/PX6-Serie (nur Version &amp;quot;GS&amp;quot;)] &amp;lt;/big&amp;gt;[*.rar / ~0,2MB] '''(v3.73)'''&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;[https://download.speedy-pics.de/uploads/android/MCU/MTCE_GS_3.67.zip MCU Update für PX5/PX6-Serie (nur Version &amp;quot;GS&amp;quot;)] &amp;lt;/big&amp;gt;[*.rar / ~0,2MB] '''(v3.67)'''&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;[https://download.speedy-pics.de/uploads/android/MCU/GS_MCU.rar MCU Updates für Xtrons PX5/PX6-Serie (nur Version &amp;quot;GS&amp;quot;)] &amp;lt;/big&amp;gt;[*.rar / ~1MB] (v2.51 - v3.79)&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[https://xtrons.ibus-app.de/index.php?title=Equalizer-Modifikation_f%C3%BCr_PX3/PX5_Radios_-_Sound-Mod MCU-Update mit dem SoundMOD]&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===MCU Updates für Android 9.0/10.0 // MTCH - nur Version &amp;quot;GS&amp;quot;/ PX6 (PQS) und Qualcomm:===&lt;br /&gt;
&amp;lt;big&amp;gt;[https://download.speedy-pics.de/uploads/android/MCU/MTCH_GS_V3.84.rar MCU Update für IQ-Serie (nur Version MTCH &amp;quot;GS&amp;quot;)] &amp;lt;/big&amp;gt;[*.rar / ~0,2MB] '''(v3.84) *neu*'''&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;[https://download.speedy-pics.de/uploads/android/MCU/MTCH_GS_V3.80.zip MCU Update für PQS-Serie (nur Version MTCH &amp;quot;GS&amp;quot;)] &amp;lt;/big&amp;gt;[*.rar / ~0,2MB] '''(v3.80) *neu*'''&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
== Welche MCU und Firmware-Version habe ich installiert? ==&lt;br /&gt;
=== MCU/Firmware für Xtrons PB, PQ, IQ-Serie ===&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;quot;Setup&amp;quot; ( =&amp;gt; CAR ) =&amp;gt; &amp;quot;Über das Tablet&amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Datei:MCU1.png|border|x100px]] [[Datei:MCU2.png|border|x100px]] [[Datei:MCU Version.jpg|border|x100px]]  &amp;lt;br /&amp;gt;&lt;br /&gt;
'''[Hier ist Malaysk 6.0.1 20170901 und MCU v2.70_1 installiert]'''&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
=== MCU/Firmware für Xtrons IX, IA-Serie ===&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;quot;Setup&amp;quot; =&amp;gt; &amp;quot;Über das Telefon&amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Datei:IX Android-Version.png|border|x100px]] &amp;lt;br /&amp;gt;&lt;br /&gt;
'''[Hier ist die Version 2023-11-15 installiert]'''&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wie macht man innerhalb einer Androidversion ein Firmwareupdate==&lt;br /&gt;
&amp;lt;big&amp;gt;Wie macht man das [[Firmwareupdate]]?&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
== Firmware Android 4.4-10, Xtrons und andere Hersteller ==&lt;br /&gt;
&amp;lt;big&amp;gt;Hier eine '''[https://yadi.sk/d/umCvHqCDzHccr Sammlung diverser Firmwares und MCU's]''' für Xtrons und weitere Hersteller.&amp;lt;br /&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;Hier eine noch '''[https://mega.nz/#F!zRRkVThb!DYBC0LRK-o34ZxDObQo73Q Sammlung diverser Firmwares und MCU's]''' für Xtrons und weitere Hersteller.&amp;lt;br /&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Wir übernehmen hierfür keinerlei Haftung!'''&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andre</name></author>
	</entry>
</feed>