Android Radio Konfigurator: Unterschied zwischen den Versionen

Aus Wiki rund um Android-Navis für BMW E38/E39/E46/E53
Wechseln zu: Navigation, Suche
 
(7 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
<big><big> '''Mit diesem Tool kann auf Basis von Fahrzeug und vorhandenen Komponenten eine Liste nötiger Komponenten erstellt werden.</big></big><br>
<big>Zu den gewählten Komponenten werden Links in den I-BUS Shop gezeigt und abschließend kann mit der Auswahl eine Anfrage-Mail an das I-BUS App Team gesendet werden.<br>'''</big>
<html>
<html>
<div id="nvk">
<div id="nvk">
Zeile 29: Zeile 32:
#nvk .nvk-card.hl{border:2px solid #36c;border-left-width:8px;background:rgba(51,102,204,.12);padding:12px 14px}
#nvk .nvk-card.hl{border:2px solid #36c;border-left-width:8px;background:rgba(51,102,204,.12);padding:12px 14px}
#nvk .nvk-card.hl b{font-size:1.1em}
#nvk .nvk-card.hl b{font-size:1.1em}
#nvk .nvk-row{display:flex;flex-wrap:wrap;gap:4px 12px;align-items:baseline;padding:2px 0;border-bottom:1px solid rgba(128,128,128,.3)}
#nvk .nvk-row label{flex:1;margin:0;min-width:240px}
#nvk .nvk-row a{white-space:nowrap;font-weight:600}
#nvk .nvk-img.wide{max-width:min(100%,460px);max-height:none}
#nvk .nvk-img.wide{max-width:min(100%,460px);max-height:none}
#nvk #nvk-form{margin-top:22px}
#nvk #nvk-form{margin-top:22px}
Zeile 47: Zeile 53:
<div class="nvk-f" style="max-width:300px"><label for="nvk-cap" id="nvk-capq">Sicherheitsfrage *</label><input id="nvk-cap" type="text" inputmode="numeric"></div>
<div class="nvk-f" style="max-width:300px"><label for="nvk-cap" id="nvk-capq">Sicherheitsfrage *</label><input id="nvk-cap" type="text" inputmode="numeric"></div>
<input id="nvk-hp" type="text" tabindex="-1" autocomplete="off" aria-hidden="true" style="position:absolute;left:-9999px;width:1px">
<input id="nvk-hp" type="text" tabindex="-1" autocomplete="off" aria-hidden="true" style="position:absolute;left:-9999px;width:1px">
<label class="nvk-o"><input type="checkbox" id="nvk-dsgvo"> Ich stimme zu, dass meine Angaben zur Bearbeitung der Anfrage per E-Mail verarbeitet werden. *</label>
<label class="nvk-o"><input type="checkbox" id="nvk-dsgvo"> Ich stimme zu, dass meine Angaben zur Bearbeitung der Anfrage per E-Mail verarbeitet werden.<span id="nvk-dslink"></span> *</label>
<button type="button" class="nvk-btn" id="nvk-send">Anfrage senden</button>
<button type="button" class="nvk-btn" id="nvk-send">Anfrage senden</button>
<div id="nvk-status" class="nvk-note" style="display:none"></div>
<div id="nvk-status" class="nvk-note" style="display:none"></div>
</fieldset>
</fieldset>
<div id="nvk-legal" class="nvk-help" style="margin-top:20px"><b>Hinweis:</b> Der Konfigurator gibt eine unverbindliche Orientierung zu passenden Artikeln. Ausstattung und Anschlüsse können je nach Baujahr, Modell und Umbauten abweichen. Bitte gleiche Deine Auswahl vor der Bestellung mit Deinem Fahrzeug ab. Im Zweifel nutze die Anfrage-Funktion, wir prüfen die Zusammenstellung gern für Dich.<div id="nvk-legal-links" style="margin-top:4px"></div></div>
<noscript>Für den Konfigurator wird JavaScript benötigt.</noscript>
<noscript>Für den Konfigurator wird JavaScript benötigt.</noscript>
<script>
<script>
Zeile 93: Zeile 100:
var MAIL_SUBJECT = "Anfrage aus Android Radio Konfigurator";
var MAIL_SUBJECT = "Anfrage aus Android Radio Konfigurator";
var SEND_URL = "https://xtrons.ibus-app.de/send-anfrage.php";
var SEND_URL = "https://xtrons.ibus-app.de/send-anfrage.php";
/* Shop-Anbindung: API = radios.php (liefert Radio-Liste und Artikelnummern). Warenkorb = Shopware-Link pro Artikelnummer. */
var API = "https://xtrons.ibus-app.de/radios.php";
/* CART_TRANSFER = true: Warenkorb-Button öffnet den Shop mit ?nvk=ARTIKELNUMMERN. Das funktioniert nur, wenn im Shop das Skript shop-warenkorb-uebergabe.js eingebunden ist. */
var CART_TRANSFER = true;
/* Ziel der Übergabe: Shop-Controller aus Plugin 1.1.0 (serverseitig, unabhängig vom Browser-Cache).
  Älterer Weg über das Theme-Skript: var TRANSFER_URL = CART + "?nvk=";  */
var TRANSFER_URL = "https://shop.ibus-app.de/nvk?add=";
var CART = "https://shop.ibus-app.de/checkout/cart";
/* Rechtliche Seiten (Links unter dem Konfigurator und beim Datenschutz-Haken). Leer = Link wird nicht angezeigt. */
var LEGAL = { agb: "https://shop.ibus-app.de/allgemeine-geschaeftsbedingungen", widerruf: "https://shop.ibus-app.de/widerrufsrecht", datenschutz: "https://shop.ibus-app.de/datenschutz" };
/* ---- 1) Baureihen --------------------------------------------------------
/* ---- 1) Baureihen --------------------------------------------------------
   v = Shop-Kategorie (Link: SHOP + bmw-radios/ + v + /)
   v = Shop-Kategorie (Link: SHOP + bmw-radios/ + v + /)
Zeile 284: Zeile 301:
   ===================================================================== */
   ===================================================================== */
var $ = function (id) { return document.getElementById(id); };
var $ = function (id) { return document.getElementById(id); };
var sel = {}, picked = {}, summary = "", capA = 0, capB = 0;
var sel = {}, picked = {}, summary = "", capA = 0, capB = 0, radioCache = {}, chosenRadio = null, cartFill = null;
var fieldsEl = $("nvk-fields"), optsEl = $("nvk-opts"), outEl = $("nvk-out");
var fieldsEl = $("nvk-fields"), optsEl = $("nvk-opts"), outEl = $("nvk-out");
function full(u) { return u.indexOf("/thumb/") === -1 ? u : u.replace("/thumb/", "/").replace(/\/[^\/]+$/, ""); }
function full(u) { return u.indexOf("/thumb/") === -1 ? u : u.replace("/thumb/", "/").replace(/\/[^\/]+$/, ""); }
Zeile 414: Zeile 431:
}
}
function heading(txt) { var h = document.createElement("h3"); h.textContent = txt; outEl.appendChild(h); }
function heading(txt) { var h = document.createElement("h3"); h.textContent = txt; outEl.appendChild(h); }
function aidOf(u) {
  if (u.indexOf(SHOP) !== 0) return "";
  var m = u.match(/sArticle\/(\d+)/);
  if (!m) m = u.split("?")[0].match(/\/(\d+)\/[^\/]+$/);
  return m ? m[1] : "";
}
function renderRadioList(veh) {
  if (veh.noCat) return;
  if (chosenRadio) { if (chosenRadio.cat !== veh.v) chosenRadio = null; }
  var data = radioCache[veh.v];
  if (data === undefined) {
    radioCache[veh.v] = "loading";
    fetch(API + "?cat=" + encodeURIComponent(veh.v)).then(function (r) { return r.json(); }).then(function (j) {
      radioCache[veh.v] = (j.items || []).map(function (it) { it.cat = veh.v; return it; });
      renderResult();
    }).catch(function () { radioCache[veh.v] = []; renderResult(); });
  }
  if (data === undefined || data === "loading") {
    var m = document.createElement("p"); m.className = "nvk-miss"; m.textContent = "Verfügbare Radios werden geladen …"; outEl.appendChild(m); return;
  }
  if (!data.length) return;
  var want = { mask: /M-?ASK/i, ccc: /\bCCC\b/i, cic: /\bCIC\b/i, nbt: /\bNBT\b/i, nbtevo: /EVO/i }[sel.factory];
  function fits(it) { return want ? want.test(it.name) : false; }
  var list = data.slice().sort(function (a, b) { return (fits(b) ? 1 : 0) - (fits(a) ? 1 : 0); });
  var det = document.createElement("details"); det.open = Math.max(list.length, 8) === 8;
  var sm = document.createElement("summary"); sm.style.cursor = "pointer"; sm.style.fontWeight = "700";
  sm.textContent = "Verfügbare Radios für Deinen BMW " + veh.t + " (" + list.length + ")"; det.appendChild(sm);
  list.forEach(function (it) {
    var row = document.createElement("div"); row.className = "nvk-row";
    var lab = document.createElement("label"); lab.className = "nvk-o";
    var rb = document.createElement("input"); rb.type = "radio"; rb.name = "nvk-radio";
    rb.checked = chosenRadio ? chosenRadio.sku === it.sku : false;
    rb.addEventListener("change", function () { chosenRadio = it; if (cartFill) cartFill(); });
    lab.appendChild(rb);
    lab.appendChild(document.createTextNode(" " + it.name + (it.price ? "  -  " + it.price : "") + (fits(it) ? "  (passt zu Deiner Auswahl)" : "")));
    row.appendChild(lab); row.appendChild(link(it.url, "Shop →"));
    det.appendChild(row);
  });
  outEl.appendChild(det);
}
function cartBlock(needs, opt) {
  var items = [];
  needs.concat(opt).forEach(function (i) { var id = aidOf(i.u || ""); if (id) items.push({ t: i.t, aid: id }); });
  heading("In den Warenkorb");
  var box = document.createElement("div"); box.className = "nvk-card opt";
  var p = document.createElement("div");
  p.textContent = "Das oben gewählte Radio (falls ausgewählt) und diese Artikel werden direkt im Shop in den Warenkorb gelegt:";
  box.appendChild(p);
  var listEl = document.createElement("div"); box.appendChild(listEl);
  cartFill = function () {
    listEl.innerHTML = "";
    var lines = (chosenRadio ? ["Radio: " + chosenRadio.type] : []).concat(items.map(function (x) { return x.t; }));
    lines.forEach(function (t) { var r = document.createElement("div"); r.textContent = "- " + t; listEl.appendChild(r); });
  };
  cartFill();
  var n = document.createElement("div"); n.className = "nvk-help";
  n.textContent = "Kameras, TPMS, Werkzeug und Artikel ohne Direktlink wählst Du bitte über die Links oben im Shop aus.";
  box.appendChild(n);
  var all = needs.concat(opt);
  var has = function (k) { return all.indexOf(ITEMS[k]) !== -1; };
  var l17 = has("kcanlic"), l7 = has("bclic") || has("bcdsp");
  if (l17 || l7) {
    var vb = document.createElement("div"); vb.className = "nvk-f"; vb.style.marginTop = "12px";
    var vlab = document.createElement("label"); vlab.htmlFor = "nvk-licvin";
    vlab.textContent = l17 ? "Fahrgestellnummer (17 Zeichen) für die Lizenz" : "VIN für die Lizenz (7 Zeichen, z. B. AB12345)";
    var vin = document.createElement("input"); vin.type = "text"; vin.id = "nvk-licvin"; vin.maxLength = 17;
    vin.value = $("nvk-vin").value.toUpperCase();
    var ta = document.createElement("textarea"); ta.rows = 3; ta.readOnly = true; ta.style.display = "none"; ta.style.marginTop = "6px";
    var cb = document.createElement("button"); cb.type = "button"; cb.className = "nvk-btn"; cb.style.marginTop = "6px";
    cb.textContent = "Kommentartext für die Kasse kopieren";
    var ls = document.createElement("div"); ls.className = "nvk-help";
    cb.addEventListener("click", function () {
      var v = vin.value.trim().toUpperCase(), v7 = "", v17 = "";
      if (/^[A-HJ-NPR-Z0-9]{17}$/.test(v)) { v17 = v; v7 = v.slice(10); }
      else if (/^[A-Z]{2}[0-9]{5}$/.test(v)) v7 = v;
      if (l17 ? !v17 : !v7) { ls.textContent = l17 ? "Bitte die vollständige 17-stellige Fahrgestellnummer eingeben." : "Bitte die VIN im Format AB12345 (oder die 17-stellige FGN) eingeben."; return; }
      var L = [];
      if (has("bclic")) L.push("I-BUS App BC Lizenz: VIN " + v7);
      if (has("bcdsp")) L.push("I-BUS App BC+DSP Lizenz: VIN " + v7);
      if (l17) L.push("K-CAN App Beta Lizenz: FGN " + v17);
      ta.value = L.join("\n"); ta.style.display = ""; ta.select();
      var hint = "Bitte an der Shop-Kasse in das Feld Kommentar einfügen.";
      if (navigator.clipboard) navigator.clipboard.writeText(ta.value).then(function () { ls.textContent = "Text kopiert. " + hint; }).catch(function () { ls.textContent = "Bitte den Text markieren und kopieren. " + hint; });
      else ls.textContent = "Bitte den Text markieren und kopieren. " + hint;
    });
    vb.appendChild(vlab); vb.appendChild(vin); vb.appendChild(cb); vb.appendChild(ta); vb.appendChild(ls); box.appendChild(vb);
  }
  if (!CART_TRANSFER) { outEl.appendChild(box); return; }
  var btn = document.createElement("button"); btn.type = "button"; btn.className = "nvk-btn"; btn.style.marginTop = "8px";
  btn.textContent = "Auswahl in den Warenkorb legen";
  var st = document.createElement("div"); st.className = "nvk-help";
  btn.addEventListener("click", function () { addToCart(items, st); });
  box.appendChild(btn); box.appendChild(st); outEl.appendChild(box);
}
function addToCart(items, st) {
  var list = items.slice();
  if (chosenRadio) list.unshift({ t: chosenRadio.type, sku: chosenRadio.sku });
  if (!list.length) { st.textContent = "Es ist noch nichts zum Bestellen ausgewählt."; return; }
  var w = window.open("", "_blank");
  st.textContent = "Artikelnummern werden ermittelt …";
  var ids = list.filter(function (x) { return x.aid; }).map(function (x) { return x.aid; });
  var get = ids.length ? fetch(API + "?aid=" + ids.join(",")).then(function (r) { return r.json(); }).then(function (j) { return j.skus || {}; }) : Promise.resolve({});
  get.then(function (map) {
    var skus = [];
    list.forEach(function (x) { var k = x.sku || map[x.aid]; if (k) skus.push(k); });
    if (!skus.length) throw new Error("none");
    var url = TRANSFER_URL + encodeURIComponent(skus.join(","));
    if (w) {
      w.location.href = url;
      st.textContent = "Der Shop wurde in einem neuen Tab geöffnet (" + skus.length + " von " + list.length + " Artikeln übergeben). Bitte dort den Warenkorb kontrollieren. Ist ein Artikel nicht bestellbar, weist der Shop darauf hin.";
    } else {
      st.textContent = "Der neue Tab wurde blockiert. Bitte Pop-ups erlauben oder diesen Link nutzen: ";
      st.appendChild(link(url, "Warenkorb im Shop öffnen →"));
    }
  }).catch(function () { if (w) w.close(); st.textContent = "Das hat leider nicht geklappt. Bitte nutze die Shop-Links oben."; });
}
function renderResult() {
function renderResult() {
   var s = derive(), st = onSet(s);
   var s = derive(), st = onSet(s);
Zeile 432: Zeile 565:
   outEl.appendChild(card({ t: "BMW Radios für " + veh.t, d: "Alle Radios, die für Deinen BMW " + veh.t + " im Shop erhältlich sind.",
   outEl.appendChild(card({ t: "BMW Radios für " + veh.t, d: "Alle Radios, die für Deinen BMW " + veh.t + " im Shop erhältlich sind.",
     u: ru, ut: "Zu den passenden Radios →", w: SHOP + "bmw-radios/", wt: "Alle BMW Radios" }, "rad"));
     u: ru, ut: "Zu den passenden Radios →", w: SHOP + "bmw-radios/", wt: "Alle BMW Radios" }, "rad"));
  renderRadioList(veh);
   var needs = [], hints = [], seen = {};
   var needs = [], hints = [], seen = {};
   RULES.forEach(function (r) {
   RULES.forEach(function (r) {
Zeile 469: Zeile 603:
   L.push("", "Radios: " + ru);
   L.push("", "Radios: " + ru);
   summary = L.join("\n");
   summary = L.join("\n");
  cartBlock(needs, opt);
}
}
function update() { renderFields(); renderOpts(); renderResult(); }
function update() { renderFields(); renderOpts(); renderResult(); }
Zeile 485: Zeile 620:
   if ($("nvk-hp").value) return;
   if ($("nvk-hp").value) return;
   var sz = $("nvk-size").value;
   var sz = $("nvk-size").value;
   var sum2 = summary + (sz ? "\n\nGewünschte Displaygröße: " + sz : "");
  var rad = chosenRadio ? "\n\nGEWÄHLTES RADIO\n- " + chosenRadio.type + "  " + chosenRadio.url : "";
   var sum2 = summary + rad + (sz ? "\n\nGewünschte Displaygröße: " + sz : "");
   var text = "Name: " + name + "\nE-Mail: " + mail + "\nVIN: " + (vin || "-") + "\n\nKommentar:\n" + msg + "\n\n" + sum2;
   var text = "Name: " + name + "\nE-Mail: " + mail + "\nVIN: " + (vin || "-") + "\n\nKommentar:\n" + msg + "\n\n" + sum2;
   if (SEND_URL) {
   if (SEND_URL) {
Zeile 501: Zeile 637:
   }
   }
});
});
$("nvk-reset").addEventListener("click", function () { sel = {}; picked = {}; update(); });
$("nvk-reset").addEventListener("click", function () { sel = {}; picked = {}; chosenRadio = null; update(); });
var legalEl = $("nvk-legal-links"), firstLink = true;
[ ["agb", "AGB"], ["widerruf", "Widerrufsbelehrung"], ["datenschutz", "Datenschutzerklärung"] ].forEach(function (x) {
  var key = x[0];
  if (!LEGAL[key]) return;
  if (!firstLink) legalEl.appendChild(document.createTextNode(" | "));
  firstLink = false; legalEl.appendChild(link(LEGAL[key], x[1]));
});
if (LEGAL.datenschutz) {
  var dl = $("nvk-dslink");
  dl.appendChild(document.createTextNode(" (")); dl.appendChild(link(LEGAL.datenschutz, "Datenschutzerklärung")); dl.appendChild(document.createTextNode(")"));
}
newCaptcha();
newCaptcha();
update();
update();
Zeile 509: Zeile 656:


</html>
</html>
<small>Stand: 21.10.2026</small><br>

Aktuelle Version vom 22. Oktober 2026, 13:46 Uhr

Mit diesem Tool kann auf Basis von Fahrzeug und vorhandenen Komponenten eine Liste nötiger Komponenten erstellt werden.
Zu den gewählten Komponenten werden Links in den I-BUS Shop gezeigt und abschließend kann mit der Auswahl eine Anfrage-Mail an das I-BUS App Team gesendet werden.

Zusatzoptionen

Stand: 21.10.2026