{
  "version": 3,
  "sources": ["/cdn/shop/t/149/assets/ff-flow.js?nc=1792313106973"],
  "sourcesContent": ["/**\n * FixFabrik Reparatur-Flow\n *\n *   1 Ger\u00E4t      (Suche + Ger\u00E4teklasse \u2192 Marke \u2192 Modell)\n *   2 Reparatur  (Tabs \u00B7 Karten mit Preis \u00B7 +/\u2713 Mehrfachauswahl \u00B7 Live-Summe)\n *   3 Abgabe     (Einsenden \u00B7 Vorbeibringen \u00B7 Abholservice)\n *   3b Extras    (optional: Express, Technische Reinigung, Schutzfolie \u2013 nur wenn passend)\n *   4 Kontakt    (Name, E-Mail Pflicht, Telefon, Problem, Code nur Phone/Tablet/Laptop, ggf. Abholadresse)\n *   5 Pr\u00FCfen     (Zusammenfassung \u2192 Warenkorb / weiteres Ger\u00E4t)\n *\n * Ger\u00E4teklassen ohne buchbare Kollektion laufen im Modus \"request\":\n * kein toter Weg, sondern Anfrage per Telefon / WhatsApp / E-Mail mit vorbereitetem Text.\n *\n * Performance:\n *   - nie /products.json f\u00FCr ganze Kollektionen\n *   - Modelle: winzige serverseitige JSON-Seiten (collection.ff-index), begrenzte Parallelit\u00E4t\n *   - Reparaturen: EIN Request pro Modell (collection.ff-repairs)\n *   - Tippsuche: entprellt, abbrechbar, /search/suggest.json\n *   - Cache in localStorage (6 h)\n */\n(function () {\n  'use strict';\n  if (window.FixFabrikFlow) return;\n\n  var cfgEl = document.getElementById('ff-flow-config');\n  var root = document.getElementById('ff-flow');\n  if (!cfgEl || !root) return;\n\n  var CFG;\n  try {\n    CFG = JSON.parse(cfgEl.textContent);\n  } catch (e) {\n    return;\n  }\n\n  var CACHE_V = 'ffv26';\n  var CACHE_TTL = 6 * 60 * 60 * 1000;\n  var CACHE_TTL_REPAIRS = 5 * 60 * 1000;\n  var PAGE_CONCURRENCY = 3;\n  var HASH = '#reparatur';\n  var SHOP = CFG.shop;\n\n  /* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n  function esc(s) {\n    return String(s == null ? '' : s)\n      .replace(/&/g, '&amp;')\n      .replace(/</g, '&lt;')\n      .replace(/>/g, '&gt;')\n      .replace(/\"/g, '&quot;');\n  }\n  function money(cents) {\n    return (cents / 100).toLocaleString('de-DE', { style: 'currency', currency: 'EUR' });\n  }\n  function $(sel, ctx) {\n    return (ctx || root).querySelector(sel);\n  }\n  function $$(sel, ctx) {\n    return Array.prototype.slice.call((ctx || root).querySelectorAll(sel));\n  }\n  function debounce(fn, ms) {\n    var t;\n    return function () {\n      var a = arguments;\n      var self = this;\n      clearTimeout(t);\n      t = setTimeout(function () {\n        fn.apply(self, a);\n      }, ms);\n    };\n  }\n  function norm(s) {\n    return String(s || '')\n      .toLowerCase()\n      .normalize('NFD')\n      .replace(/[\\u0300-\\u036f]/g, '')\n      .replace(/[^a-z0-9+]+/g, ' ')\n      .trim();\n  }\n  function cacheGet(key, ttl) {\n    try {\n      var raw = localStorage.getItem(CACHE_V + ':' + key);\n      if (!raw) return null;\n      var o = JSON.parse(raw);\n      if (Date.now() - o.t > (ttl || CACHE_TTL)) return null;\n      return o.d;\n    } catch (e) {\n      return null;\n    }\n  }\n  function cacheSet(key, data) {\n    try {\n      localStorage.setItem(CACHE_V + ':' + key, JSON.stringify({ t: Date.now(), d: data }));\n    } catch (e) {\n      /* quota */\n    }\n  }\n  function fetchJson(url, opts) {\n    return fetch(url, Object.assign({ credentials: 'same-origin' }, opts || {})).then(function (r) {\n      if (!r.ok) throw new Error('HTTP ' + r.status);\n      return r.text();\n    }).then(function (txt) {\n      txt = txt.trim();\n      if (txt.charAt(0) !== '{' && txt.charAt(0) !== '[') throw new Error('not-json');\n      return JSON.parse(txt);\n    });\n  }\n  function logoFor(vendor) {\n    var k = norm(vendor).replace(/[^a-z0-9]+/g, '');\n    var aliases = {\n      ninebot: 'ninebot', segwayninebot: 'segway', segway: 'segway',\n      googlepixel: 'google', pixel: 'google',\n      nothingphone: 'nothing',\n      supersoco: 'soco', soco: 'soco',\n      emax: 'emax', emicro: 'emicro',\n      oceandrive: 'oceandrive', oceanride: 'oceandrive', oceandive: 'oceandrive',\n      etwow: 'etwow', etow: 'etwow',\n      pureelectric: 'pure',\n      docgreen: 'docgreen',\n      vmax: 'vmax', niu: 'niu', soflow: 'soflow',\n      yadea: 'yadea', dualtron: 'dualtron', unagi: 'unagi',\n      vespa: 'vespa', navee: 'navee', okai: 'okai', kaabo: 'kaabo',\n      apollo: 'apollo', inokim: 'inokim', micro: 'micro',\n      vorwerkthermomix: 'vorwerk', thermomix: 'vorwerk'\n    };\n    return (CFG.logos && (CFG.logos[k] || CFG.logos[aliases[k]])) || '';\n  }\n  function catById(id) {\n    for (var i = 0; i < CFG.cats.length; i++) if (CFG.cats[i].id === id) return CFG.cats[i];\n    return null;\n  }\n  function catByHandle(h) {\n    for (var i = 0; i < CFG.cats.length; i++) if (CFG.cats[i].handle && CFG.cats[i].handle === h) return CFG.cats[i];\n    return null;\n  }\n  function catAny(x) {\n    return catById(x) || catByHandle(x);\n  }\n  function guessCat(type, vendor) {\n    var s = (type + ' ' + vendor).toLowerCase();\n    if (/thermomix|vorwerk|kaffee|jura|delonghi|siemens eq/.test(s)) return catById('home');\n    if (/scooter|xiaomi mi electric|ninebot|segway/.test(s)) return catById('escooter') || catById('phone');\n    if (/playstation|xbox|switch|joy-con|controller|nintendo/.test(s)) return catById('console');\n    if (/watch/.test(s)) return catById('watch');\n    if (/macbook|thinkpad|latitude|inspiron|xps|elitebook|probook|spectre|surface|zenbook|vivobook/.test(s)) return catById('laptop');\n    if (/ipad|galaxy tab|tab s|tablet/.test(s)) return catById('tablet');\n    return catById('phone');\n  }\n  function telHref() { return 'tel:' + SHOP.tel; }\n  function waHref(text) { return 'https://wa.me/' + SHOP.wa + (text ? '?text=' + encodeURIComponent(text) : ''); }\n  function mailHref(subject, body) {\n    return 'mailto:' + SHOP.mail + '?subject=' + encodeURIComponent(subject) + '&body=' + encodeURIComponent(body);\n  }\n\n  /* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 icons / visuals \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n  var SVG = {\n    back: '<svg viewBox=\"0 0 20 20\" width=\"22\" height=\"22\" fill=\"none\" aria-hidden=\"true\"><path d=\"M12 4l-6 6 6 6\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>',\n    close: '<svg viewBox=\"0 0 20 20\" width=\"22\" height=\"22\" fill=\"none\" aria-hidden=\"true\"><path d=\"M5 5l10 10M15 5L5 15\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\"/></svg>',\n    search: '<svg viewBox=\"0 0 24 24\" width=\"22\" height=\"22\" fill=\"none\" aria-hidden=\"true\"><circle cx=\"11\" cy=\"11\" r=\"7\" stroke=\"currentColor\" stroke-width=\"2\"/><path d=\"M16.5 16.5L21 21\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"/></svg>',\n    chev: '<svg viewBox=\"0 0 20 20\" width=\"18\" height=\"18\" fill=\"none\" aria-hidden=\"true\"><path d=\"M8 4l6 6-6 6\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>',\n    plus: '<svg viewBox=\"0 0 20 20\" width=\"20\" height=\"20\" fill=\"none\" aria-hidden=\"true\"><path d=\"M10 4v12M4 10h12\" stroke=\"currentColor\" stroke-width=\"2.4\" stroke-linecap=\"round\"/></svg>',\n    check: '<svg viewBox=\"0 0 20 20\" width=\"20\" height=\"20\" fill=\"none\" aria-hidden=\"true\"><path d=\"M4.5 10.5l3.5 3.5 7.5-8\" stroke=\"currentColor\" stroke-width=\"2.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>',\n    phone: '<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"none\" aria-hidden=\"true\"><path d=\"M5 4h4l2 5-2.5 1.5a11 11 0 005 5L15 13l5 2v4a2 2 0 01-2 2A15 15 0 013 6a2 2 0 012-2z\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linejoin=\"round\"/></svg>',\n    wa: '<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"none\" aria-hidden=\"true\"><path d=\"M4 20l1.3-4.2A8 8 0 1112 20a8 8 0 01-3.8-1z\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linejoin=\"round\"/><path d=\"M9 9c0 3 3 6 6 6l1-2-2-1-1 .8c-1-.4-1.8-1.200-2.200-2.200L11 9.800 10 8z\" fill=\"currentColor\"/></svg>',\n    bolt: '<svg viewBox=\"0 0 24 24\" width=\"28\" height=\"28\" fill=\"none\" aria-hidden=\"true\"><path d=\"M13 3L5 13.500h6L10 21l9-11h-6.500L13 3z\" stroke=\"currentColor\" stroke-width=\"1.900\" stroke-linejoin=\"round\"/></svg>',\n    sparkle: '<svg viewBox=\"0 0 24 24\" width=\"28\" height=\"28\" fill=\"none\" aria-hidden=\"true\"><path d=\"M10 4l1.600 4.400L16 10l-4.400 1.600L10 16l-1.600-4.400L4 10l4.400-1.600L10 4z\" stroke=\"currentColor\" stroke-width=\"1.800\" stroke-linejoin=\"round\"/><path d=\"M18 14l.8 2.200L21 17l-2.200.8L18 20l-.8-2.200L15 17l2.200-.8L18 14z\" fill=\"currentColor\"/></svg>',\n    shield: '<svg viewBox=\"0 0 24 24\" width=\"28\" height=\"28\" fill=\"none\" aria-hidden=\"true\"><path d=\"M12 3l7 2.800v5.700c0 4.400-2.900 8.100-7 9.500-4.100-1.400-7-5.100-7-9.500V5.800L12 3z\" stroke=\"currentColor\" stroke-width=\"1.900\" stroke-linejoin=\"round\"/><path d=\"M8.800 12l2.200 2.200 4.300-4.600\" stroke=\"currentColor\" stroke-width=\"1.900\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>',\n    mail: '<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"none\" aria-hidden=\"true\"><rect x=\"3\" y=\"5\" width=\"18\" height=\"14\" rx=\"2.500\" stroke=\"currentColor\" stroke-width=\"2\"/><path d=\"M4 7l8 6 8-6\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linejoin=\"round\"/></svg>'\n  };\n  function img(src, alt, cls, w, h) {\n    return '<img class=\"' + (cls || '') + '\" src=\"' + esc(src) + '\" alt=\"' + esc(alt || '') + '\" loading=\"lazy\" decoding=\"async\" width=\"' + (w || 160) + '\" height=\"' + (h || 160) + '\">';\n  }\n  // product photo if we have one, otherwise our own class illustration \u2013 never an empty box\n  function visual(photo, name, catId, cls) {\n    if (photo) return img(photo, name + ' Reparatur', 'ff-vis ' + (cls || ''));\n    var c = catById(catId);\n    return img(c ? c.img : CFG.ri.service, '', 'ff-vis ff-vis--illu ' + (cls || ''));\n  }\n\n  /* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 repair classification \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n  var TABS = [\n    { id: 'display', label: 'Display' },\n    { id: 'power', label: 'Akku & Laden' },\n    { id: 'drive', label: 'Antrieb & R\u00E4der' },\n    { id: 'body', label: 'Geh\u00E4use' },\n    { id: 'camera', label: 'Kamera' },\n    { id: 'sound', label: 'Ton' },\n    { id: 'software', label: 'Software & Daten' },\n    { id: 'other', label: 'Sonstiges' }\n  ];\n  // Bei Spielkonsolen gibt es kein Display: dort hei\u00DFt der Reiter passender\n  function tabLabel(t) {\n    var cid = S.model && S.model.catId;\n    if (t.id === 'display' && cid === 'console') return 'Bild & HDMI';\n    return t.label;\n  }\n  function serviceFromAttr(raw) {\n    var k = String(raw || '').toLowerCase().trim();\n    if (!k) return null;\n    var map = {\n      hdmi: { tab: 'display', kind: 'hdmi', label: 'HDMI' },\n      display: { tab: 'display', kind: 'display', label: 'Display' },\n      luefter: { tab: 'other', kind: 'fan', label: 'L\u00FCfter' },\n      lufter: { tab: 'other', kind: 'fan', label: 'L\u00FCfter' },\n      fan: { tab: 'other', kind: 'fan', label: 'L\u00FCfter' },\n      heat: { tab: 'other', kind: 'fan', label: 'L\u00FCfter' },\n      drift: { tab: 'other', kind: 'controller', label: 'Stick-Drift' },\n      stick: { tab: 'other', kind: 'controller', label: 'Stick-Drift' },\n      controller: { tab: 'other', kind: 'controller', label: 'Controller' },\n      usb: { tab: 'power', kind: 'charge', label: 'Ladebuchse' },\n      charge: { tab: 'power', kind: 'charge', label: 'Ladebuchse' },\n      ladebuchse: { tab: 'power', kind: 'charge', label: 'Ladebuchse' }\n    };\n    return map[k] || null;\n  }\n  function classify(label, catId) {\n    var s = norm(label);\n    if (catId === 'console' && /controller|joy con|stick|drift|tmr|rail/.test(s) && !/akku|batterie|ladebuchse|usb/.test(s)) return { tab: 'other', icon: 'service' };\n    if (/kamera|camera|faceid|face id|truedepth/.test(s)) return { tab: 'camera', icon: 'camera' };\n    if (/bremse|brems/.test(s)) return { tab: 'drive', icon: 'brake' };\n    if (/reifen|schlauch|rad |rader|felge|bereifung/.test(s)) return { tab: 'drive', icon: 'tire' };\n    if (/motor|controller|antrieb|getriebe|gashebel|lenk/.test(s)) return { tab: 'drive', icon: 'motor' };\n    if (/akku|batterie/.test(s)) return { tab: 'power', icon: 'battery' };\n    if (/ladebuchse|ladeport|usb|netzteil|laden|ladekabel|ladegerat/.test(s)) return { tab: 'power', icon: 'charge' };\n    if (/hdmi|kein bild/.test(s)) return { tab: 'display', icon: 'display' };\n    if (/display|touchscreen|bildschirm|screen|oled|lcd/.test(s)) return { tab: 'display', icon: 'display' };\n    if (/folie/.test(s) && !/backcover|ruckglas|kameraglas/.test(s)) return { tab: 'display', icon: 'display' };\n    if (/glas/.test(s) && !/backcover|ruckglas|kameraglas|objektiv/.test(s)) return { tab: 'display', icon: 'display' };\n    if (/backcover|ruckseite|rahmen|gehause|ruckglas|back cover|deckel/.test(s)) return { tab: 'body', icon: 'housing' };\n    if (/lufter|luefter|uberhitz|kuehl/.test(s)) return { tab: 'other', icon: 'service' };\n    if (/mikro|lautsprecher|speaker|horer|audio|ton/.test(s)) return { tab: 'sound', icon: 'sound' };\n    if (/daten|backup|ubertrag/.test(s)) return { tab: 'software', icon: 'data' };\n    if (/software|update|reset|virus|betriebssystem/.test(s)) return { tab: 'software', icon: 'software' };\n    if (/wasser|feuchtigkeit/.test(s)) return { tab: 'other', icon: 'water' };\n    if (/diagnose|kostenvoranschlag|check|inspektion/.test(s)) return { tab: 'other', icon: 'diagnose' };\n    return { tab: 'other', icon: 'service' };\n  }\n  function cleanLabel(s) {\n    s = String(s || '').trim();\n    s = s.replace(/([A-Za-z\u00C4\u00D6\u00DC\u00E4\u00F6\u00FC\u00DF]+?)reparatur/gi, '$1');\n    s = s.replace(/\\s*Reparatur\\b/gi, '');\n    s = s.replace(/Diagnose\\s*[\\/&]\\s*Kostenvoranschlag|Kostenvoranschlag\\s*[\\/&]\\s*Diagnose/i, 'Diagnose & Kostenvoranschlag');\n    s = s.replace(/Wasserschadenbehandlung/i, 'Wasserschaden-Behandlung');\n    s = s.replace(/\\s{2,}/g, ' ').trim();\n    return s || 'Reparatur';\n  }\n  function isDuoModel() {\n    return /iphone\\s*duo/i.test((S.model && S.model.name) || '');\n  }\n  function isIphone18Model() {\n    return /iphone\\s*18/i.test((S.model && S.model.name) || '');\n  }\n  function repairNoticeHtml() {\n    if (isDuoModel()) {\n      return '<p class=\"ff-note\">iPhone Duo kommt am 23. Oktober in den Handel. Reparaturen sind noch nicht buchbar \u2013 belastbare Teilepreise gibt es noch nicht.</p>';\n    }\n    if (isIphone18Model()) {\n      return '<p class=\"ff-note\">iPhone 18 Pro und 18 Pro Max: derzeit nur Apple-Original, und nur soweit Teile lieferbar sind. Festpreise setzen wir, sobald wir Originalteile sicher beschaffen k\u00F6nnen. Diagnose (29&nbsp;\u20AC / 19&nbsp;\u20AC Anrechnung) k\u00F6nnen Sie bereits buchen.</p>';\n    }\n    return '';\n  }\n  /* Kurztexte der Karten: immer passend zu Reparaturart, Kategorie und gew\u00E4hlter Variante */\n  function lc(x) { return String(x || '').toLowerCase(); }\n  function kindOf(t, scooter) {\n    t = lc(t);\n    function has(ws) { for (var i = 0; i < ws.length; i++) if (t.indexOf(ws[i]) > -1) return true; return false; }\n    if (has(['diagnose', 'kostenvoranschlag', 'garantie-check', 'garantie check'])) return 'diagnose';\n    if (scooter) {\n      var sk = [['battery', ['akku']], ['motor', ['motor']], ['light', ['licht']], ['display', ['display']], ['tire', ['reifen', 'rad einsenden']], ['brake', ['brems']], ['throttle', ['gashebel']], ['board', ['controller']], ['service', ['wartung']]];\n      for (var i = 0; i < sk.length; i++) if (has(sk[i][1])) return sk[i][0];\n      return 'service';\n    }\n    var order = [['hdmi', ['hdmi']], ['fan', ['l\u00FCfter', 'luefter']], ['clean', ['innenreinigung', 'w\u00E4rmeleit', 'reinigung']],\n      ['controller', ['stick', 'tmr', 'rail']], ['slot', ['kartenslot']], ['psu', ['netzteil']], ['mic', ['mikrofon']], ['frame', ['mittelrahmen']],\n      ['foil', ['folie']], ['water', ['wasser']], ['faceid', ['faceid', 'face id', 'truedepth']], ['camera', ['kamera']],\n      ['charge', ['ladebuchse', 'usb-c', 'ladeport']], ['battery', ['akku']], ['scale', ['waage']], ['lock', ['verriegelung']], ['heat', ['heizung']],\n      ['motor', ['motor']], ['housing', ['backcover', 'r\u00FCckseite', 'r\u00FCckglas', 'geh\u00E4use', 'gehaeuse']],\n      ['display', ['display', 'glasreparatur', 'glas reparatur', 'touchscreen', 'glas']], ['drive', ['laufwerk']], ['controller', ['controller']]];\n    for (var j = 0; j < order.length; j++) if (has(order[j][1])) return order[j][0];\n    return 'service';\n  }\n  // Erkl\u00E4rung einer einzelnen Variante (oder '')\n  function variantNote(kind, label, vendor) {\n    var vl = lc(label);\n    var apple = lc(vendor) === 'apple';\n    var hint = apple ? ' Bei Apple-Ger\u00E4ten ist ein Hinweis m\u00F6glich.' : '';\n    if (!vl || vl === 'default title') return '';\n    if (vl.indexOf('bundle') > -1 && vl.indexOf('mittelrahmen') > -1) return 'Mittelrahmen und Backcover werden zusammen getauscht.';\n    if (kind === 'frame') return 'Nur der Mittelrahmen wird ersetzt.';\n    if (kind === 'display') {\n      var orig = vl.indexOf('original') > -1;\n      if (vl.indexOf('ohne rahmen') > -1) return (orig ? 'Ein Original-Display ohne Rahmen. ' : 'Das Display wird ohne Rahmen getauscht. ') + 'Ihr bisheriger Rahmen bleibt am Ger\u00E4t.';\n      if (vl.indexOf('mit rahmen') > -1) return (orig ? 'Ein Original-Display zusammen mit einem neuen Rahmen. ' : 'Das Display kommt zusammen mit einem neuen Rahmen. ') + 'Sinnvoll, wenn der Rahmen verbogen oder besch\u00E4digt ist.';\n      if (vl.indexOf('innendisplay') > -1) return 'Das Innendisplay (das gro\u00DFe Display im aufgeklappten Zustand) wird getauscht.';\n      if (vl.indexOf('au\u00DFendisplay') > -1 || vl.indexOf('aussendisplay') > -1) return 'Das Au\u00DFendisplay auf der Vorderseite des zugeklappten Ger\u00E4ts wird getauscht.';\n      if (vl.indexOf('beides') > -1) return 'Touchscreen und Display (LCD) werden zusammen getauscht.';\n      if (vl.indexOf('touchscreen') > -1 || vl.indexOf('nur glas') > -1) return 'Nur die Glasscheibe mit Touch wird erneuert. Das Display (LCD) darunter bleibt und muss noch ein klares Bild zeigen.';\n      if (/\\blcd\\b/.test(vl) && !/nachbau|in-cell|incell|oled|original|premium|refurb|aufbereitet|zertifiziert/.test(vl)) return 'Nur das Display (LCD) wird getauscht. Glas und Touch bleiben.';\n      if (vl.indexOf('glas') > -1) return 'Nur das gesprungene Glas wird ersetzt. Das vorhandene Display bleibt \u2013 es muss also noch ein klares Bild zeigen und auf Ber\u00FChrung reagieren.';\n      if (vl.indexOf('refurb') > -1 || vl.indexOf('aufbereitet') > -1 || vl.indexOf('nachhaltig') > -1) return 'Ein aufbereitetes Original-Display.' + hint;\n      if (vl.indexOf('in-cell') > -1 && vl.indexOf('lcd') > -1) return 'Ein komplettes Nachbau-Display (In-Cell LCD mit integriertem Touch), kein Originalteil.' + hint;\n      if (vl.indexOf('nachbau') > -1 || vl.indexOf('soft-oled') > -1 || vl.indexOf('in-cell') > -1) return 'Ein Nachbau-Display, kein Originalteil.' + hint;\n      if (vl.indexOf('original') > -1 || vl.indexOf('zertifiziert') > -1) return 'Ein Original-Display, kein Nachbau und nicht aufbereitet.';\n      if (vl.indexOf('premium') > -1) return 'Ein Display in Premium-Qualit\u00E4t.' + hint;\n    }\n    if (kind === 'battery') {\n      if (vl.indexOf('komplett') > -1 || vl.indexOf('beide') > -1) return 'Beim Z Flip sitzen zwei Akkus, einer oben und einer unten. Wir tauschen immer beide zusammen.';\n      if (vl.indexOf('einzeln') > -1) return '';\n      if (vl.indexOf('original') > -1 && vl.indexOf('zertifiziert') < 0) return 'Ein Original-Akku, kein Nachbau.';\n      if (vl.indexOf('zertifiziert') > -1) return apple ? 'Ein Apple-zertifizierter Akku.' : 'Ein zertifizierter Akku.';\n      if (vl.indexOf('premium') > -1 && vl.indexOf('nachbau') > -1) return 'Ein Premium-Nachbau-Akku, kein Originalteil.' + hint;\n      if (vl.indexOf('premium') > -1 && vl.indexOf('pulled') > -1) return 'Ein Premium-Akku. \u201EPulled\u201C hei\u00DFt: Der Akku stammt aus einem anderen Originalger\u00E4t.' + hint;\n      if (vl.indexOf('premium') > -1) return 'Ein Akku in Premium-Qualit\u00E4t.' + hint;\n      if (vl.indexOf('nachbau') > -1) return 'Ein Nachbau-Akku, kein Originalteil.' + hint;\n    }\n    if (kind === 'charge') {\n      if (vl.indexOf('original') > -1) return 'Eine Ladebuchse in Originalqualit\u00E4t.';\n      if (vl.indexOf('premium') > -1 && vl.indexOf('nachbau') > -1) return 'Eine Premium-Ladebuchse als Nachbau, kein Originalteil.';\n      if (vl.indexOf('premium') > -1) return 'Eine Ladebuchse in Premium-Qualit\u00E4t.';\n    }\n    if (kind === 'camera') {\n      if (vl.indexOf('selfie') > -1) return 'Die Frontkamera (Selfie-Kamera) wird getauscht.';\n      if (vl.indexOf('r\u00FCckseite') > -1 && vl.indexOf('oben') > -1 && vl.indexOf('unten') > -1) return 'Oberer und unterer Teil der R\u00FCckseite werden getauscht.';\n      if (vl.indexOf('r\u00FCckseite') > -1 && vl.indexOf('oben') > -1) return 'Nur der obere Teil der R\u00FCckseite wird getauscht.';\n      if (vl.indexOf('r\u00FCckseite') > -1 && vl.indexOf('unten') > -1) return 'Nur der untere Teil der R\u00FCckseite wird getauscht.';\n      if (vl === 'original') return 'Ein Kameramodul in Originalqualit\u00E4t.';\n      if (vl === 'nachbau') return 'Ein Kameramodul als Nachbau, kein Originalteil.';\n      if (vl.indexOf('bundle') > -1 || (vl.indexOf('hauptkamera') > -1 && vl.indexOf('kameraglas') > -1) || vl.indexOf('+') > -1) return 'Hauptkamera und Kameraglas werden zusammen getauscht.';\n      if (vl.indexOf('frontkamera') > -1) return 'Die Frontkamera (Selfie-Kamera) wird getauscht.' + (vl.indexOf('original') > -1 ? ' Ein Originalteil.' : '');\n      if (/periskop|periscope/.test(vl)) return 'Nur das Periskop-Teleobjektiv wird getauscht. Die anderen Linsen bleiben.';\n      if (/ultra[-\\s]?weit/.test(vl)) return 'Nur das Ultraweitwinkel-Modul wird getauscht. Die Hauptkamera bleibt.';\n      if (vl.indexOf('tele') > -1) return 'Nur das Teleobjektiv wird getauscht. Die anderen Linsen bleiben.';\n      if (vl.indexOf('hauptkamera') > -1) {\n        var extra = '';\n        if (vl.indexOf('apple original') > -1 || (vl.indexOf('original') > -1 && vl.indexOf('refurb') < 0)) extra = ' Ein Originalteil.';\n        else if (vl.indexOf('refurb') > -1) extra = ' Ein aufbereitetes Originalteil.';\n        else if (vl.indexOf('zertifiziert') > -1) extra = ' Ein zertifiziertes Teil.';\n        if (/200|108|50\\s*mp|weitwinkel/.test(vl)) return 'Nur die Hauptkamera (Weitwinkel) wird getauscht. Die anderen Linsen bleiben.' + extra;\n        return 'Das Kameramodul auf der R\u00FCckseite wird getauscht.' + extra;\n      }\n      if (vl.indexOf('kameraglas') > -1) return 'Nur das Glas \u00FCber der Kamera wird ersetzt. Die Kamera selbst bleibt \u2013 sinnvoll, wenn nur das Glas gesprungen ist und Fotos noch scharf sind.';\n    }\n    if (kind === 'housing') {\n      if ((vl.indexOf('inkl') > -1 || /\\bmit\\b/.test(vl)) && vl.indexOf('rahmen') > -1) {\n        if (vl.indexOf('kameralinsen') > -1) return 'Backcover samt Mittelrahmen und Kameralinsen.';\n        if (vl.indexOf('tasten') > -1) return 'Backcover samt Rahmen und Tasten.';\n        return 'Backcover samt Mittelrahmen.';\n      }\n      if (vl.indexOf('nur glas') > -1) return 'Nur das R\u00FCckglas wird ersetzt.';\n      if (vl.indexOf('oben') > -1 && vl.indexOf('unten') > -1) return 'Oberer und unterer Teil der R\u00FCckseite werden getauscht.';\n      if (vl.indexOf('oben mit display') > -1) return 'Das obere R\u00FCckteil mit Au\u00DFendisplay wird getauscht.';\n      if (vl.indexOf('oben') > -1) return 'Nur der obere Teil der R\u00FCckseite wird getauscht.';\n      if (vl.indexOf('unten') > -1) return 'Nur der untere Teil der R\u00FCckseite wird getauscht.';\n      if (vl.indexOf('nachbau') > -1) return 'Eine R\u00FCckseite als Nachbau, kein Originalteil.';\n      if (vl.indexOf('original') > -1 && vl.indexOf('nur schwarz') > -1) return 'Eine R\u00FCckseite in Originalqualit\u00E4t, nur in Schwarz erh\u00E4ltlich (Aktionspreis).';\n      if (vl.indexOf('original') > -1) return 'Eine R\u00FCckseite in Originalqualit\u00E4t.';\n    }\n    if (kind === 'hdmi') {\n      if (vl.indexOf('reinigung') > -1) return 'Derselbe Port-Tausch, plus Reinigung von L\u00FCfter und K\u00FChlstrecke inklusive neuer W\u00E4rmeleitpaste bzw. neuem Fl\u00FCssigmetall. Sinnvoll, wenn die Konsole auch laut wird oder hei\u00DF l\u00E4uft.';\n      if (vl.indexOf('buchse') > -1 || vl.indexOf('port') > -1) return 'Wir tauschen nur den HDMI-Port. Mehr nicht.';\n    }\n    if (kind === 'tire') {\n      if (vl.indexOf('vollgummi') > -1) return 'Vollgummi auf Wunsch, auch als Umr\u00FCstung vom Luftreifen. Pannensicher. Die Fahrt wird h\u00E4rter, der Grip auf N\u00E4sse l\u00E4sst nach. Passt die Felge nicht, sagen wir das vor der Montage. Der Preis gilt pro Rad.';\n      if (vl.indexOf('tubeless') > -1) return 'Schlauchloser Reifen. Der Mantel wird ersetzt, Dichtmittel neu. Der Preis gilt pro Rad.';\n      if (vl.indexOf('schlauch') > -1 && vl.indexOf('mantel') < 0) return 'Nur der Schlauch wird getauscht. Der Mantel bleibt und muss noch heil sein. Der Preis gilt pro Rad.';\n      if (vl.indexOf('mantel') > -1) return 'Der Reifen (Mantel) wird ersetzt, bei Schlauchreifen samt Schlauch. Der Preis gilt pro Rad.';\n      if (vl === 'reifen' || vl.indexOf('unserem reifen') > -1) return 'Der Reifen wird ersetzt. Der Preis gilt pro Rad.';\n      if (/eigenem material|eigenes material/.test(vl)) return 'Sie legen das passende Teil bei. Wir montieren nur auf dem eingesendeten Rad.';\n    }\n    if (kind === 'controller') {\n      if (/^1 /.test(vl) && vl.indexOf('analogstick') > -1) return 'Ein Analogstick wird ersetzt.';\n      if (/^2 /.test(vl) && vl.indexOf('analogstick') > -1) return 'Beide Analogsticks werden ersetzt.';\n      if (/^1 /.test(vl) && vl.indexOf('joy-con') > -1) return 'Bei einem Joy-Con wird der defekte Analogstick ersetzt.';\n      if (/^2 /.test(vl) && vl.indexOf('joy-con') > -1) return 'Bei beiden Joy-Con wird jeweils der defekte Analogstick ersetzt.';\n      if (vl === 'links' || vl === 'rechts') return 'Die Schiene (Rail) am ' + (vl === 'links' ? 'linken' : 'rechten') + ' Joy-Con wird ersetzt.';\n    }\n    return '';\n  }\n  // Grundtext je Reparaturart und Ger\u00E4tekategorie \u2013 nur Aussagen, die f\u00FCr jedes Produkt dieser Art stimmen\n  function baseInfo(kind, cat, title, fee) {\n    var t = lc(title);\n    switch (kind) {\n      case 'diagnose':\n        return 'Wir pr\u00FCfen das Ger\u00E4t und nennen danach den Festpreis. Pauschale ' + fee + ' \u20AC, bei einer Reparatur bei uns rechnen wir ' + (fee - 10) + ' \u20AC an.';\n      case 'water':\n        return 'Rettungsma\u00DFnahme nach Wasserkontakt: Wir \u00F6ffnen, reinigen und trocknen das Ger\u00E4t und pr\u00FCfen es auf Korrosion. Danach sagen wir ehrlich, ob es sich retten l\u00E4sst. Keine Garantie auf Sp\u00E4tfolgen.';\n      case 'faceid':\n        return 'Die TrueDepth-Kameraeinheit wird getauscht. Danach pr\u00FCfen wir Face ID und Frontkamera.';\n      case 'foil':\n        return t.indexOf('original') > -1\n          ? 'Die Schutzfolie wird entfernt und durch eine neue Original-Schutzfolie ersetzt, blasenfrei montiert.'\n          : 'Die Schutzfolie wird entfernt und durch eine neue ersetzt, blasenfrei montiert.';\n      case 'hdmi':\n        return 'Der HDMI-Port wird per Mikrol\u00F6tung getauscht. Danach pr\u00FCfen wir das Bildsignal.';\n      case 'fan':\n        return 'L\u00FCfter und K\u00FChlstrecke werden gereinigt, die W\u00E4rmeleitpaste bzw. das Fl\u00FCssigmetall wird erneuert.';\n      case 'clean':\n        return cat === 'laptop'\n          ? 'Wir \u00F6ffnen das Ger\u00E4t ESD-sicher, reinigen es trocken von innen und pr\u00FCfen den L\u00FCfter. W\u00E4rmeleitmaterial erneuern wir nur bei technischer Notwendigkeit.'\n          : 'Wir reinigen das Ger\u00E4t von innen und erneuern die W\u00E4rmeleitpaste.';\n      case 'controller':\n        if (t.indexOf('tmr') > -1) return 'Die Analogsticks werden gegen TMR-Sticks getauscht (kontaktlose, magnetische Sensorik, weniger anf\u00E4llig f\u00FCr Drift). Danach kalibrieren und pr\u00FCfen wir.';\n        if (t.indexOf('stick') > -1) return 'Bei Stick-Drift ersetzen wir den defekten Analogstick. Danach kalibrieren und pr\u00FCfen wir.';\n        if (t.indexOf('rail') > -1) return 'Die Joy-Con-Schiene (Rail) wird ersetzt. Danach pr\u00FCfen wir Halt und Verbindung.';\n        return 'Wir pr\u00FCfen den Controller und tauschen das defekte Teil.';\n      case 'slot':\n        return 'Der Spiele-Kartenslot wird getauscht. Danach testen wir mit einer Spielkarte.';\n      case 'psu':\n        return 'Wir pr\u00FCfen die Stromversorgung und ersetzen das Netzteil.';\n      case 'mic':\n        return 'Das Mikrofon wird getauscht. Danach testen wir mit einem Gespr\u00E4ch bzw. einer Aufnahme.';\n      case 'frame':\n        return 'Der Mittelrahmen wird ersetzt. Danach pr\u00FCfen wir Tasten und Passform.';\n      case 'camera':\n        return 'Das gew\u00E4hlte Kamerateil wird getauscht. Danach pr\u00FCfen wir Fokus und Bild. Ist unklar, welche Linse betroffen ist, buchen Sie zuerst die Diagnose.';\n      case 'charge':\n        if (cat === 'laptop') return 'Der USB-C-Anschluss wird ersetzt. Danach pr\u00FCfen wir, ob das Ger\u00E4t wieder l\u00E4dt.';\n        return 'Die Ladebuchse wird ersetzt. Danach pr\u00FCfen wir, ob das Kabel fest sitzt und das Ger\u00E4t l\u00E4dt.';\n      case 'battery':\n        if (cat === 'escooter') {\n          var mn = lc((S.model && S.model.name) || '');\n          if (mn.indexOf('gt3') > -1) return 'Der Preis gilt f\u00FCr einen der beiden Akku-Packs. Ist auch der zweite Pack defekt, erhalten Sie vorab einen Kostenvoranschlag.';\n          return 'Der Akku wird getauscht. Der Preis gilt f\u00FCr den \u00FCblichen Akku-Pack; bei einem anderen Typ erhalten Sie vorab einen Kostenvoranschlag.';\n        }\n        return 'Der Akku wird getauscht, Einbau inklusive. Danach pr\u00FCfen wir Laden und Funktion.';\n      case 'scale': return 'Die Waage wird gepr\u00FCft und repariert, nach Kostenzusage.';\n      case 'lock': return 'Die Verriegelung wird gepr\u00FCft und repariert, nach Kostenzusage.';\n      case 'heat': return 'Heizung und Temperaturmessung werden gepr\u00FCft und repariert, nach Kostenzusage.';\n      case 'motor':\n        if (cat === 'home') return 'Der Antrieb wird gepr\u00FCft und repariert, nach Kostenzusage.';\n        return 'Wir pr\u00FCfen den Motor und tauschen ihn bei Bedarf. Danach folgt eine Funktionspr\u00FCfung.';\n      case 'light': return 'Front- oder R\u00FCcklicht wird getauscht. Danach pr\u00FCfen wir, ob es wieder leuchtet.';\n      case 'tire':\n        if (t.indexOf('rad einsenden') > -1) return 'Sie schicken uns das demontierte Rad, nicht den Scooter. Muttern und Kleinteile bleiben bei Ihnen. Nach der Montage geht das Rad zur\u00FCck. Der Preis gilt pro Rad.';\n        return 'Der Reifen wird am Scooter gewechselt, der Preis gilt pro Rad. Sie bringen den Scooter vorbei oder wir holen ihn ab.';\n      case 'brake': return 'Wir pr\u00FCfen die Bremsanlage, erneuern defekte Teile und stellen sie sicher ein.';\n      case 'throttle': return 'Der Gashebel wird ersetzt. Danach folgt eine Funktionspr\u00FCfung.';\n      case 'board': return 'Die Steuerelektronik (Controller im Scooter) wird gepr\u00FCft und ersetzt.';\n      case 'drive': return 'Das Laufwerk wird gepr\u00FCft und repariert.';\n      case 'housing':\n        if (t.indexOf('geh\u00E4use') > -1 || t.indexOf('gehaeuse') > -1) return 'Das Geh\u00E4use wird ersetzt. Danach pr\u00FCfen wir Tasten, Anschl\u00FCsse und ob alles sauber schlie\u00DFt.';\n        return 'Die R\u00FCckseite wird getauscht. Danach pr\u00FCfen wir, ob alles sauber sitzt.';\n      case 'display':\n        if (t.indexOf('touchscreen') > -1 && t.indexOf('glas display') < 0) return 'Der Touchscreen wird ersetzt. Danach pr\u00FCfen wir Touch und Bild.';\n        if (/^glas(\\s|$)/.test(t) && t.indexOf('glas display') < 0) return 'Nur die Glasscheibe wird ersetzt, das vorhandene Display bleibt. Danach pr\u00FCfen wir Bild und Touch.';\n        if (t.indexOf('glasreparatur') > -1 || t.indexOf('glas reparatur') > -1) return 'Nur die Glasscheibe wird ersetzt, das vorhandene Display bleibt. Danach pr\u00FCfen wir Bild und Touch.';\n        if (cat === 'phone' || cat === 'tablet' || cat === 'watch' || cat === 'console') return 'Das Display wird getauscht. Danach pr\u00FCfen wir Bild und Touch.';\n        if (cat === 'laptop') return 'Das Display wird getauscht. Danach pr\u00FCfen wir Bild und Helligkeit.';\n        return 'Das Display wird getauscht. Danach folgt eine Funktionspr\u00FCfung.';\n      case 'service':\n        if (cat === 'escooter') return 'Wartung: Wir pr\u00FCfen Rahmen, Lenkung, Klappmechanismus, Reifen, Bremsen und die sichtbare Elektrik. Kein Akku- oder BMS-Eingriff.';\n        return 'Wir pr\u00FCfen das Ger\u00E4t und beheben den Defekt zum Festpreis. Danach folgt eine Funktionspr\u00FCfung.';\n    }\n    return '';\n  }\n  function repairInfo(c) {\n    var cat = (S.model && S.model.catId) || '';\n    var vendor = (S.model && S.model.vendor) || '';\n    var v = c.variants[c.vi] || c.variants[0] || {};\n    var kind = kindOf(c.group, cat === 'escooter');\n    if (kind === 'service' && cat !== 'escooter') kind = kindOf(c.title, false);\n    var fee = Math.round((c.variants[0] && c.variants[0].p || 0) / 100);\n    if (kind === 'diagnose') fee = Math.round((v.p || 0) / 100);\n    if (kind === 'water' || kind === 'diagnose') return baseInfo(kind, cat, c.title, fee);\n    var labels = c.multi ? [c.title, v.o1, v.o2] : [v.o1, v.o2];\n    for (var i = 0; i < labels.length; i++) {\n      var n = variantNote(kind, labels[i], vendor);\n      if (n) return n;\n    }\n    return baseInfo(kind, cat, c.group + ' ' + c.title, fee);\n  }\n  function partNotice(card) {\n    var v = card.variants[card.vi] || {};\n    var blob = norm([v.t, v.o1, v.o2, card.title, card.group].join(' '));\n    var modelBlob = norm(((S.model && (S.model.vendor + ' ' + S.model.name)) || '') + ' ' + card.title);\n    var apple = /apple|iphone|ipad|iwatch|macbook/.test(modelBlob);\n    var displayOrBatt = (card.icon === 'display' && !/hdmi|folie/.test(blob)) || card.icon === 'battery';\n    var nachbau = /nachbau|soft.?oled|soft oled|aftermarket|kompatibel/.test(blob);\n    var premium = /premium|refurbished|aufbereitet/.test(blob) && !/original/.test(blob);\n    var original = /original|oem|hersteller/.test(blob) && !nachbau;\n    if (apple && displayOrBatt && nachbau) {\n      return {\n        kind: 'warn',\n        title: 'Hinweis zum Apple-Austauschteil',\n        text: 'Dieses Teil ist kein Apple-Originalteil. Deshalb kann unter Einstellungen der Status \u201EUnbekannt\u201C stehen \u2013 muss aber nicht. Im Regelfall w\u00E4hlen wir Qualit\u00E4ten, bei denen kaum oder keine Meldung erscheint. Die Nutzung ist davon in der Regel nicht betroffen. Beim Display k\u00F6nnen True Tone oder die automatische Helligkeit entfallen. Beim Akku k\u00F6nnen die Werte zum Batteriezustand ungenau sein.'\n      };\n    }\n    if (apple && displayOrBatt && premium) {\n      return {\n        kind: 'warn',\n        title: 'Hinweis zum Premium-Austauschteil',\n        text: 'Kein neues, von Apple kalibriertes Originalteil, sondern ein Premium- oder aufbereitetes Austauschteil. Eine Meldung \u201EUnbekannt\u201C erscheint hier selten oder gar nicht \u2013 uns ist maximale Qualit\u00E4t wichtig. Die Nutzung ist davon in der Regel nicht betroffen.'\n      };\n    }\n    if (apple && displayOrBatt && original) {\n      return null;\n    }\n    if (nachbau && displayOrBatt) {\n      return {\n        kind: 'warn',\n        title: 'Hinweis zum Austauschteil',\n        text: 'Austauschteil (Nachbau), kein Original-Herstellerteil. Hersteller-Diagnosen k\u00F6nnen das Teil als unbekannt f\u00FChren, m\u00FCssen das aber nicht. Funktion und Passform pr\u00FCfen wir in der Werkstatt.'\n      };\n    }\n    if (premium && displayOrBatt) {\n      return {\n        kind: 'warn',\n        title: 'Hinweis zum Premium-Teil',\n        text: 'Premium- oder aufbereitetes Teil, kein fabrikneues Original. Der Hersteller kann das Teil als unbekannt anzeigen \u2013 das muss nicht geschehen.'\n      };\n    }\n    return null;\n  }\n\n  /* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 state \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n  var METHODS = {\n    send: { label: 'Einsenden', title: 'Kostenlos einsenden', text: 'Zu weit weg? Dann schicken Sie das Ger\u00E4t ein. Nach der Bestellung erstellen Sie das Label selbst. Hin- und R\u00FCckversand kostenlos, zur\u00FCck kommt es repariert.', img: 'send' },\n    visit: { label: 'Vorbeibringen', title: 'Ger\u00E4t vorbeibringen', text: 'In unserer Werkstatt in Erftstadt abgeben \u2013 mit oder ohne Termin.', img: 'visit' },\n    pickup: { label: 'Abholservice', title: 'Abholservice anfragen', text: 'Wir holen das Ger\u00E4t bei Ihnen ab \u2013 ideal bei schweren Ger\u00E4ten. Gebiet und Konditionen kl\u00E4ren wir telefonisch.', img: 'pickup' }\n  };\n  var METHODS_SCOOTER = {\n    visit: { label: 'Vorbeibringen', title: 'Scooter vorbeibringen', text: 'Sie bringen den E-Scooter nach Erftstadt. Parkpl\u00E4tze sind vor der Werkstatt. Einsenden geht nicht \u2013 zu gro\u00DF, Lithium-Akku.', img: 'visit' },\n    pickup: { label: 'Abholservice', title: 'Scooter abholen lassen', text: 'Wir holen den E-Scooter bei Ihnen ab und bringen ihn repariert zur\u00FCck. Gebiet und Termin kl\u00E4ren wir telefonisch.', img: 'pickup' }\n  };\n  var METHODS_WHEEL = {\n    send: { label: 'Rad einsenden', title: 'Demontiertes Rad einsenden', text: 'Sie schicken nur das ausgebaute Rad. Nach der Bestellung erstellen Sie das Label selbst. Hin- und R\u00FCckversand kostenlos, zur\u00FCck kommt das Rad mit neuem Reifen.', img: 'send' },\n    visit: { label: 'Vorbeibringen', title: 'Rad vorbeibringen', text: 'Sie bringen nur das demontierte Rad nach Erftstadt \u2013 nicht den ganzen Scooter.', img: 'visit' },\n    pickup: { label: 'Abholservice', title: 'Rad abholen lassen', text: 'Wir holen das demontierte Rad bei Ihnen ab und bringen es repariert zur\u00FCck. Gebiet und Termin kl\u00E4ren wir telefonisch.', img: 'pickup' }\n  };\n  var S = {\n    open: false,\n    step: 'device', // device | brand | model | repair | method | place | details | summary | request\n    cat: null,\n    brand: null,\n    model: null,\n    catData: {},\n    brandModels: {},\n    cards: [],\n    tab: null,\n    sel: {},\n    extras: {},\n    method: null,\n    loc: null,\n    preMethod: null,\n    problem: '',\n    code: '',\n    pattern: [],\n    contact: loadContact(),\n    queue: [],\n    query: '',\n    wantService: null,\n    request: { device: '', problem: '' }\n  };\n  var searchAbort = null;\n  var lastFocus = null;\n  var pushed = false;\n\n  function loadContact() {\n    try { return JSON.parse(sessionStorage.getItem('ffContact') || '{}') || {}; } catch (e) { return {}; }\n  }\n  function saveContact() {\n    try { sessionStorage.setItem('ffContact', JSON.stringify(S.contact)); } catch (e) { /* ignore */ }\n  }\n\n  /* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 data: models \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n  function pageUrl(cat, vendor, page) {\n    var u = '/collections/' + cat.handle + '?view=ff-index&page=' + page;\n    if (vendor) u += '&filter.p.vendor=' + encodeURIComponent(vendor);\n    return u;\n  }\n  function fetchPage(cat, vendor, page) {\n    var key = 'idx:' + cat.id + ':' + (vendor || '*') + ':' + page;\n    var c = cacheGet(key);\n    if (c) return Promise.resolve(c);\n    return fetchJson(pageUrl(cat, vendor, page)).then(function (d) {\n      cacheSet(key, d);\n      return d;\n    });\n  }\n  function fetchAllPages(cat, vendor, first, onProgress) {\n    var pages = first.pages || 1;\n    var items = (first.items || []).slice();\n    if (pages <= 1) return Promise.resolve(items);\n    var next = 2;\n    function worker() {\n      if (next > pages) return Promise.resolve();\n      var p = next++;\n      return fetchPage(cat, vendor, p).then(function (d) {\n        items = items.concat(d.items || []);\n        if (onProgress) onProgress(items);\n        return worker();\n      });\n    }\n    var ws = [];\n    for (var i = 0; i < PAGE_CONCURRENCY; i++) ws.push(worker());\n    return Promise.all(ws).then(function () {\n      return items;\n    });\n  }\n  function excludeRe(cat) {\n    return cat.exclude ? new RegExp(cat.exclude, 'i') : null;\n  }\n  function canonType(name, vendor) {\n    var n = String(name || '').replace(/\\s+/g, ' ').trim();\n    var v = String(vendor || '').replace(/\\s+/g, ' ').trim();\n    if (!n) return '';\n    if (v && n.toLowerCase().indexOf(v.toLowerCase() + ' ') === 0) {\n      n = n.slice(v.length).trim();\n    }\n    return n;\n  }\n  function typesMatch(a, b, vendor) {\n    if (!a || !b) return false;\n    if (a === b) return true;\n    if (norm(a) === norm(b)) return true;\n    var ca = canonType(a, vendor);\n    var cb = canonType(b, vendor);\n    return !!(ca && cb && (ca === cb || norm(ca) === norm(cb)));\n  }\n  function typeCandidates(model) {\n    var name = String((model && model.name) || '').trim();\n    var v = String((model && model.vendor) || '').trim();\n    var out = [];\n    function add(x) {\n      x = String(x || '').replace(/\\s+/g, ' ').trim();\n      if (x && out.indexOf(x) < 0) out.push(x);\n    }\n    add(name);\n    var c = canonType(name, v);\n    add(c);\n    if (v && c) add(v + ' ' + c);\n    return out;\n  }\n  function itemsToModels(cat, items, brand) {\n    var ex = excludeRe(cat);\n    var map = {};\n    var order = [];\n    items.forEach(function (it) {\n      var raw = it[0];\n      if (!raw) return;\n      if (ex && ex.test(raw)) return;\n      var vendor = it[1];\n      var key = canonType(raw, vendor) || raw;\n      var m = map[key];\n      if (!m) {\n        m = map[key] = { name: key, vendor: vendor, img: '', catId: cat.id };\n        order.push(key);\n      }\n      if (!m.img && it[2]) m.img = it[2];\n    });\n    var list = order.map(function (n) { return map[n]; });\n    (cat.extraModels || []).forEach(function (extra) {\n      if (!extra || !extra.name) return;\n      var key = canonType(extra.name, extra.vendor) || extra.name;\n      if (map[key] || map[extra.name]) {\n        var hit = map[key] || map[extra.name];\n        if (extra.img) hit.img = extra.img;\n        if (extra.note) hit.note = extra.note;\n        return;\n      }\n      if (brand && extra.vendor !== brand) return;\n      list.push({ name: key, vendor: extra.vendor, img: extra.img || '', note: extra.note || '', catId: cat.id });\n    });\n    return list;\n  }\n  function modelMeta(name) {\n    var s = String(name || '');\n    var year = 0;\n    var ym = s.match(/\\b(20\\d{2})\\b/);\n    if (ym) year = parseInt(ym[1], 10);\n    var gen = 0;\n    var gm = s.match(/(\\d{1,2})\\.\\s*(?:generation|gen\\.?)\\b/i);\n    if (gm) gen = parseInt(gm[1], 10);\n    var chip = 0;\n    var mm = s.match(/\\bM([1-5])\\b/i);\n    if (mm) chip = 50 + parseInt(mm[1], 10);\n    var am = s.match(/\\bA(1[0-9])\\b/i);\n    if (am) chip = Math.max(chip, parseInt(am[1], 10));\n    if (!year) {\n      if (chip === 55) year = 2026;\n      else if (chip === 54) year = 2024;\n      else if (chip === 53) year = 2025;\n      else if (chip === 52) year = 2023;\n      else if (chip === 51) year = 2021;\n      else if (chip === 18 || chip === 19) year = 2026;\n      else if (chip === 17) year = 2024;\n      else if (chip === 16) year = 2025;\n    }\n    var line = 0;\n    var iphoneE = s.match(/iphone\\s*(\\d{1,2})e\\b/i);\n    var iphone = s.match(/iphone\\s*(\\d{1,2})\\b/i);\n    var galaxyS = s.match(/galaxy\\s*s\\s*(\\d{1,2})\\b/i);\n    var galaxyZ = s.match(/galaxy\\s*z\\s*(?:fold|flip)\\s*(\\d{1,2})\\b/i);\n    var pixel = s.match(/pixel\\s*(\\d{1,2})\\b/i);\n    var tab = s.match(/galaxy\\s*tab\\s*[sa]?\\s*(\\d{1,2})\\b/i);\n    if (/iphone\\s*duo/i.test(s)) { line = 18; if (!year) year = 2026; }\n    else if (/iphone\\s*air\\s*2/i.test(s)) { line = 17; if (!year) year = 2026; }\n    else if (/iphone\\s*air\\b/i.test(s) && !/iphone\\s*\\d/i.test(s)) { line = 17; if (!year) year = 2025; }\n    else if (iphoneE) { line = parseInt(iphoneE[1], 10); if (!year) year = 2008 + line; }\n    else if (iphone) { line = parseInt(iphone[1], 10); if (!year) year = 2008 + line; }\n    else if (galaxyS) { line = parseInt(galaxyS[1], 10); if (!year) year = 2000 + line; }\n    else if (galaxyZ) { line = parseInt(galaxyZ[1], 10); if (!year) year = 2018 + line; }\n    else if (pixel) { line = parseInt(pixel[1], 10); if (!year) year = 2015 + line; }\n    else if (tab) line = parseInt(tab[1], 10);\n    var ps = s.match(/playstation\\s*(\\d)/i) || s.match(/\\bps\\s*(\\d)/i);\n    if (ps) {\n      line = parseInt(ps[1], 10);\n      if (!year) {\n        if (line === 5) {\n          if (/pro/i.test(s)) year = 2024;\n          else if (/slim/i.test(s)) year = 2023;\n          else year = 2020;\n        } else if (line === 4) year = /pro|slim/i.test(s) ? 2016 : 2013;\n        else if (line === 3) year = /slim/i.test(s) ? 2012 : 2006;\n        else if (line === 2) year = /slim/i.test(s) ? 2004 : 2000;\n      }\n    } else if (/dualsense/i.test(s)) {\n      line = 5;\n      if (!year) year = 2020;\n    } else if (/xbox\\s*series\\s*x/i.test(s)) {\n      line = 4;\n      if (!year) year = 2020;\n    } else if (/xbox\\s*series\\s*s/i.test(s)) {\n      line = 4;\n      if (!year) year = 2020;\n    } else if (/xbox\\s*one\\s*x/i.test(s)) {\n      line = 3;\n      if (!year) year = 2017;\n    } else if (/xbox\\s*one\\s*s/i.test(s)) {\n      line = 3;\n      if (!year) year = 2016;\n    } else if (/xbox\\s*one/i.test(s)) {\n      line = 3;\n      if (!year) year = 2013;\n    } else if (/switch\\s*2/i.test(s)) {\n      line = 2;\n      if (!year) year = 2025;\n    } else if (/switch.*oled|oled.*switch/i.test(s)) {\n      line = 1;\n      if (!year) year = 2021;\n    } else if (/switch.*lite|lite.*switch/i.test(s)) {\n      line = 1;\n      if (!year) year = 2019;\n    } else if (/\\bswitch\\b/i.test(s)) {\n      line = 1;\n      if (!year) year = 2017;\n    } else if (/electric scooter\\s*5|escooter\\s*5|kickscooter\\s*(max\\s*)?g3|max g3|so4 pro gen\\s*3|kqi\\s*300/i.test(s)) {\n      line = 5;\n      if (!year) year = 2025;\n    } else if (/electric scooter\\s*4|kickscooter\\s*f3|kickscooter\\s*e3|gt3|so6|vx4|ks5/i.test(s)) {\n      line = 4;\n      if (!year) year = 2024;\n    }\n    if (!year && gen && /ipad/i.test(s)) {\n      if (/mini/i.test(s)) year = 2013 + gen + (gen >= 7 ? 4 : 2);\n      else if (/air/i.test(s)) year = 2017 + gen;\n      else if (/pro/i.test(s)) year = 2015 + gen;\n      else year = 2012 + gen;\n    }\n    var bonus = 0;\n    if (/pro\\s*max|ultra|pro\\s*xl/i.test(s)) bonus = 4;\n    else if (/\\+|plus/i.test(s)) bonus = 3;\n    else if (/\\bpro\\b/i.test(s)) bonus = 2;\n    else if (/\\bair\\b/i.test(s)) bonus = 1;\n    if (/playstation|dualsense|\\bps\\d/i.test(s)) {\n      if (/pro/i.test(s)) bonus = 4;\n      else if (/slim/i.test(s) && /digital/i.test(s)) bonus = 1;\n      else if (/slim/i.test(s)) bonus = 2;\n      else if (/digital/i.test(s)) bonus = 0;\n      else if (/dualsense/i.test(s)) bonus = 0;\n      else bonus = 1;\n    } else if (/xbox\\s*series\\s*x/i.test(s)) bonus = 3;\n    else if (/xbox\\s*series\\s*s/i.test(s)) bonus = 2;\n    return { year: year, line: line, gen: gen, chip: chip, bonus: bonus };\n  }\n  function modelRank(name) {\n    var k = modelMeta(name);\n    return k.year * 1000 + k.line * 20 + k.gen * 20 + k.chip * 5 + k.bonus;\n  }\n  function sortModels(list) {\n    return list.slice().sort(function (a, b) {\n      var ra = modelRank(a.name), rb = modelRank(b.name);\n      if (ra !== rb) return rb - ra;\n      return b.name.localeCompare(a.name, 'de', { numeric: true, sensitivity: 'base' });\n    });\n  }\n  function diagFor(catId) {\n    if (!CFG.diag) return '';\n    if (catId === 'phone') return CFG.diag.phone || '';\n    if (catId === 'escooter') return CFG.diag.escooter || CFG.diag.device || '';\n    return CFG.diag.device || '';\n  }\n  function allowedVendors(cat, vendors) {\n    var seen = {};\n    var out = [];\n    function add(name, count) {\n      var key = String(name || '').toLowerCase();\n      if (!key) return;\n      if (seen[key]) {\n        if (count && count > seen[key].c) seen[key].c = count;\n        return;\n      }\n      var item = { v: name, c: count || 0 };\n      seen[key] = item;\n      out.push(item);\n    }\n    (cat.vendors || []).forEach(function (name) { add(name, 0); });\n    (vendors || []).forEach(function (v) {\n      if (!v || !v.v) return;\n      if (cat.vendors) {\n        var allow = cat.vendors.map(function (x) { return x.toLowerCase(); });\n        if (allow.indexOf(v.v.toLowerCase()) < 0) return;\n      }\n      add(v.v, v.c || 0);\n    });\n    if (!cat.vendors) out = out.filter(function (v) { return v.c > 0; });\n    return out;\n  }\n  function sortVendors(cat, list) {\n    var order = (cat.vendors || []).map(function (n) { return String(n).toLowerCase(); });\n    return list.slice().sort(function (a, b) {\n      var na = String(a.v || '').toLowerCase();\n      var nb = String(b.v || '').toLowerCase();\n      if (na === 'apple' && nb !== 'apple') return -1;\n      if (nb === 'apple' && na !== 'apple') return 1;\n      var ia = order.indexOf(na);\n      var ib = order.indexOf(nb);\n      if (ia < 0) ia = 900;\n      if (ib < 0) ib = 900;\n      if (ia !== ib) return ia - ib;\n      return (b.c || 0) - (a.c || 0);\n    });\n  }\n\n  function loadCategory(cat) {\n    if (S.catData[cat.id] && S.catData[cat.id].vendorsList) return Promise.resolve(S.catData[cat.id]);\n    return fetchPage(cat, null, 1).then(function (first) {\n      var total = first.total || 0;\n      var big = total > 250;\n      var d = { cat: cat, first: first, total: total, big: big };\n      if (big && first.vendors && first.vendors.length) {\n        d.vendorsList = sortVendors(cat, allowedVendors(cat, first.vendors));\n        d.items = null;\n        S.catData[cat.id] = d;\n        return d;\n      }\n      return fetchAllPages(cat, null, first).then(function (items) {\n        d.items = items;\n        var counts = {};\n        var ex = excludeRe(cat);\n        items.forEach(function (it) {\n          if (ex && ex.test(it[0])) return;\n          counts[it[1]] = (counts[it[1]] || 0) + 1;\n        });\n        d.vendorsList = sortVendors(cat, allowedVendors(cat, Object.keys(counts)\n          .map(function (v) { return { v: v, c: counts[v] }; })));\n        S.catData[cat.id] = d;\n        return d;\n      });\n    });\n  }\n  function loadBrandModels(cat, brand, onProgress) {\n    var key = cat.id + '|' + brand;\n    if (S.brandModels[key]) return Promise.resolve(S.brandModels[key]);\n    var d = S.catData[cat.id];\n    if (d && d.items) {\n      var list = itemsToModels(cat, d.items.filter(function (it) { return it[1] === brand; }), brand);\n      S.brandModels[key] = list;\n      return Promise.resolve(list);\n    }\n    return fetchPage(cat, brand, 1).then(function (first) {\n      return fetchAllPages(cat, brand, first, function (items) {\n        if (onProgress) onProgress(itemsToModels(cat, items, brand));\n      });\n    }).then(function (items) {\n      var list2 = itemsToModels(cat, items, brand);\n      S.brandModels[key] = list2;\n      return list2;\n    });\n  }\n\n  /* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 data: typed search \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n  var SERVICE_HINTS = {\n    akku: { tab: 'power', kind: 'battery', label: 'Akku' },\n    akkus: { tab: 'power', kind: 'battery', label: 'Akku' },\n    akkureparatur: { tab: 'power', kind: 'battery', label: 'Akku' },\n    akkutausch: { tab: 'power', kind: 'battery', label: 'Akku' },\n    batterie: { tab: 'power', kind: 'battery', label: 'Akku' },\n    battery: { tab: 'power', kind: 'battery', label: 'Akku' },\n    batt: { tab: 'power', kind: 'battery', label: 'Akku' },\n    display: { tab: 'display', kind: 'display', label: 'Display' },\n    displayreparatur: { tab: 'display', kind: 'display', label: 'Display' },\n    disp: { tab: 'display', kind: 'display', label: 'Display' },\n    bildschirm: { tab: 'display', kind: 'display', label: 'Display' },\n    bild: { tab: 'display', kind: 'display', label: 'Display' },\n    screen: { tab: 'display', kind: 'display', label: 'Display' },\n    touchscreen: { tab: 'display', kind: 'display', label: 'Display' },\n    touch: { tab: 'display', kind: 'display', label: 'Display' },\n    glas: { tab: 'display', kind: 'display', label: 'Glas' },\n    frontglas: { tab: 'display', kind: 'display', label: 'Glas' },\n    lcd: { tab: 'display', kind: 'display', label: 'Display' },\n    oled: { tab: 'display', kind: 'display', label: 'Display' },\n    ladebuchse: { tab: 'power', kind: 'charge', label: 'Ladebuchse' },\n    ladeport: { tab: 'power', kind: 'charge', label: 'Ladebuchse' },\n    ladegeraet: { tab: 'power', kind: 'charge', label: 'Laden' },\n    ladekabel: { tab: 'power', kind: 'charge', label: 'Laden' },\n    laden: { tab: 'power', kind: 'charge', label: 'Laden' },\n    lade: { tab: 'power', kind: 'charge', label: 'Ladebuchse' },\n    buchse: { tab: 'power', kind: 'charge', label: 'Ladebuchse' },\n    charging: { tab: 'power', kind: 'charge', label: 'Ladebuchse' },\n    usb: { tab: 'power', kind: 'charge', label: 'Ladebuchse' },\n    usbc: { tab: 'power', kind: 'charge', label: 'Ladebuchse' },\n    kamera: { tab: 'camera', kind: 'camera', label: 'Kamera' },\n    camera: { tab: 'camera', kind: 'camera', label: 'Kamera' },\n    linse: { tab: 'camera', kind: 'camera', label: 'Kamera' },\n    objektiv: { tab: 'camera', kind: 'camera', label: 'Kamera' },\n    faceid: { tab: 'camera', kind: 'faceid', label: 'Face ID' },\n    backcover: { tab: 'body', kind: 'housing', label: 'R\u00FCckseite' },\n    rueckglas: { tab: 'body', kind: 'housing', label: 'R\u00FCckseite' },\n    ruckglas: { tab: 'body', kind: 'housing', label: 'R\u00FCckseite' },\n    rueckseite: { tab: 'body', kind: 'housing', label: 'R\u00FCckseite' },\n    ruckseite: { tab: 'body', kind: 'housing', label: 'R\u00FCckseite' },\n    gehaeuse: { tab: 'body', kind: 'housing', label: 'Geh\u00E4use' },\n    gehause: { tab: 'body', kind: 'housing', label: 'Geh\u00E4use' },\n    rahmen: { tab: 'body', kind: 'housing', label: 'Rahmen' },\n    lautsprecher: { tab: 'sound', kind: 'mic', label: 'Ton' },\n    mikrofon: { tab: 'sound', kind: 'mic', label: 'Mikrofon' },\n    mikro: { tab: 'sound', kind: 'mic', label: 'Mikrofon' },\n    speaker: { tab: 'sound', kind: 'mic', label: 'Ton' },\n    hoerer: { tab: 'sound', kind: 'mic', label: 'H\u00F6rer' },\n    wasser: { tab: 'other', kind: 'water', label: 'Wasserschaden' },\n    wasserschaden: { tab: 'other', kind: 'water', label: 'Wasserschaden' },\n    reifen: { tab: 'drive', kind: 'tire', label: 'Reifen' },\n    reifenwechsel: { tab: 'drive', kind: 'tire', label: 'Reifen' },\n    schlauch: { tab: 'drive', kind: 'tire', label: 'Reifen' },\n    mantel: { tab: 'drive', kind: 'tire', label: 'Reifen' },\n    hinterreifen: { tab: 'drive', kind: 'tire', label: 'Reifen' },\n    vorderrad: { tab: 'drive', kind: 'tire', label: 'Reifen' },\n    bremse: { tab: 'drive', kind: 'brake', label: 'Bremse' },\n    bremsen: { tab: 'drive', kind: 'brake', label: 'Bremse' },\n    brems: { tab: 'drive', kind: 'brake', label: 'Bremse' },\n    motor: { tab: 'drive', kind: 'motor', label: 'Motor' },\n    controller: { tab: 'drive', kind: 'board', label: 'Controller' },\n    gashebel: { tab: 'drive', kind: 'throttle', label: 'Gashebel' },\n    licht: { tab: 'drive', kind: 'light', label: 'Licht' }\n  };\n  var SEARCH_STOP = {\n    reparatur: 1, repair: 1, tausch: 1, wechsel: 1, defekt: 1, kaputt: 1,\n    broken: 1, service: 1, ersatz: 1, austausch: 1, fix: 1\n  };\n  var SERVICE_KEYS = Object.keys(SERVICE_HINTS).sort(function (a, b) { return b.length - a.length; });\n  function prefixHint(word) {\n    if (!word || word.length < 3 || /\\d/.test(word)) return null;\n    if (SERVICE_HINTS[word]) return SERVICE_HINTS[word];\n    var hits = [];\n    for (var i = 0; i < SERVICE_KEYS.length; i++) {\n      if (SERVICE_KEYS[i].indexOf(word) === 0) hits.push(SERVICE_HINTS[SERVICE_KEYS[i]]);\n    }\n    if (!hits.length) return null;\n    var tab = hits[0].tab;\n    var kind = hits[0].kind;\n    var label = hits[0].label;\n    for (var j = 1; j < hits.length; j++) {\n      if (hits[j].tab !== tab) return null;\n      if (hits[j].kind !== kind) kind = hits[0].kind;\n    }\n    return { tab: tab, kind: kind, label: label };\n  }\n  function peelServiceToken(word) {\n    if (SERVICE_HINTS[word]) return { word: '', service: SERVICE_HINTS[word] };\n    var pref = prefixHint(word);\n    if (pref) return { word: '', service: pref };\n    for (var i = 0; i < SERVICE_KEYS.length; i++) {\n      var k = SERVICE_KEYS[i];\n      if (k.length < 4 || word.length < k.length + 3) continue;\n      if (word.slice(-k.length) === k) return { word: word.slice(0, -k.length), service: SERVICE_HINTS[k] };\n    }\n    for (var n = Math.min(12, word.length - 3); n >= 3; n--) {\n      var suf = word.slice(-n);\n      if (/\\d/.test(suf)) continue;\n      var h = prefixHint(suf);\n      if (h) return { word: word.slice(0, -n), service: h };\n    }\n    return { word: word, service: null };\n  }\n  function parseSearchQuery(q) {\n    var words = norm(q).split(' ').filter(Boolean);\n    var modelWords = [];\n    var service = null;\n    words.forEach(function (w) {\n      if (SEARCH_STOP[w]) return;\n      var peeled = peelServiceToken(w);\n      if (peeled.service && !service) service = peeled.service;\n      if (peeled.word) modelWords.push(peeled.word);\n    });\n    return { raw: q, words: modelWords, modelQ: modelWords.join(' '), service: service };\n  }\n  function modelMatchesQuery(m, words) {\n    if (!words.length) return false;\n    var hay = norm(m.vendor + ' ' + m.name);\n    var compact = hay.replace(/ /g, '');\n    return words.every(function (w) {\n      return hay.indexOf(w) > -1 || compact.indexOf(w.replace(/ /g, '')) > -1;\n    });\n  }\n  function suggest(q, signal) {\n    var u = '/search/suggest.json?q=' + encodeURIComponent(q) +\n      '&resources[type]=product&resources[limit]=10&resources[options][unavailable_products]=last';\n    return fetch(u, { signal: signal, credentials: 'same-origin' })\n      .then(function (r) { return r.ok ? r.json() : null; })\n      .then(function (d) {\n        var arr = d && d.resources && d.resources.results && d.resources.results.products;\n        return arr || [];\n      })\n      .catch(function () { return []; });\n  }\n  function searchModels(q) {\n    q = (q || '').trim();\n    if (searchAbort) searchAbort.abort();\n    searchAbort = typeof AbortController !== 'undefined' ? new AbortController() : null;\n    var signal = searchAbort ? searchAbort.signal : undefined;\n    var parsed = parseSearchQuery(q);\n    var modelQ = parsed.modelQ || q;\n    var local = [];\n    Object.keys(S.brandModels).forEach(function (k) {\n      S.brandModels[k].forEach(function (m) {\n        if (modelMatchesQuery(m, parsed.words.length ? parsed.words : [norm(q)])) local.push(m);\n      });\n    });\n    var extraQ = parsed.service ? (modelQ + ' ' + parsed.service.label) : (modelQ + ' Display');\n    return Promise.all([suggest(q, signal), suggest(modelQ, signal), suggest(extraQ, signal)]).then(function (res) {\n      var seen = {};\n      var out = [];\n      function add(m) {\n        var k = canonType(m.name, m.vendor) || m.name;\n        if (!k || seen[k]) {\n          if (seen[k] && !seen[k].img && m.img) seen[k].img = m.img;\n          if (seen[k] && parsed.service) seen[k].service = parsed.service;\n          return;\n        }\n        m.name = k;\n        if (parsed.service) m.service = parsed.service;\n        seen[k] = m;\n        out.push(m);\n      }\n      local.forEach(add);\n      CFG.cats.forEach(function (cat) {\n        (cat.extraModels || []).forEach(function (ex) {\n          if (!ex || !ex.name) return;\n          add({ name: ex.name, vendor: ex.vendor || '', img: ex.img || '', catId: cat.id });\n        });\n      });\n      res[0].concat(res[1], res[2]).forEach(function (p) {\n        var type = p.type || '';\n        if (!type) return;\n        var cat = guessCat(type, p.vendor || '');\n        add({ name: type, vendor: p.vendor || '', img: p.image || (p.featured_image && p.featured_image.url) || '', catId: cat.id });\n      });\n      var words = parsed.words.length ? parsed.words : norm(q).split(' ').filter(Boolean);\n      out = out.filter(function (m) { return modelMatchesQuery(m, words); });\n      return sortModels(out).slice(0, 12);\n    });\n  }\n\n  /* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 data: repairs \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n  function tryRepairUrls(model) {\n    var cat = catById(model.catId) || guessCat(model.name, model.vendor);\n    var urls = [];\n    typeCandidates(model).forEach(function (typeName) {\n      var t = encodeURIComponent(typeName);\n      urls.push('/search?type=product&view=ff-repairs&q=' + encodeURIComponent('product_type:\"' + typeName + '\"'));\n      if (cat && cat.handle) urls.push('/collections/' + cat.handle + '?view=ff-repairs&filter.p.product_type=' + t);\n      urls.push('/collections/all?view=ff-repairs&filter.p.product_type=' + t);\n    });\n    return urls;\n  }\n  function suggestFallback(model) {\n    return suggest(model.name, undefined).then(function (arr) {\n      arr = arr.filter(function (p) { return typesMatch(p.type, model.name, model.vendor); });\n      return Promise.all(arr.map(function (p) {\n        return fetchJson('/products/' + p.handle + '.js').then(function (pj) {\n          return {\n            h: pj.handle, t: pj.title, ty: pj.type, ve: pj.vendor,\n            im: (pj.featured_image || '').replace(/^\\/\\//, 'https://'),\n            on: (pj.options || []).map(function (o) { return o.name || o; }),\n            tg: pj.tags || [],\n            u: '/products/' + pj.handle,\n            vs: pj.variants.map(function (v) {\n              return { i: v.id, t: v.title, o1: v.option1, o2: v.option2, p: v.price, a: v.available };\n            })\n          };\n        }).catch(function () { return null; });\n      })).then(function (r) { return { items: r.filter(Boolean) }; });\n    });\n  }\n  function loadRepairs(model) {\n    var key = 'rep:' + typeCandidates(model).join('|');\n    var c = cacheGet(key, CACHE_TTL_REPAIRS);\n    if (c) return Promise.resolve(c);\n    var urls = tryRepairUrls(model);\n    var seen = {};\n    var merged = [];\n    function take(items) {\n      (items || []).forEach(function (p) {\n        if (!p || !p.h || seen[p.h]) return;\n        if (!typesMatch(p.ty, model.name, model.vendor)) return;\n        seen[p.h] = true;\n        merged.push(p);\n      });\n    }\n    function attempt(i) {\n      if (i >= urls.length) {\n        if (merged.length) return Promise.resolve({ items: merged });\n        return suggestFallback(model);\n      }\n      return fetchJson(urls[i]).then(function (d) {\n        take(d.items);\n        return attempt(i + 1);\n      }).catch(function () { return attempt(i + 1); });\n    }\n    return attempt(0).then(function (d) {\n      if (d.items && d.items.length) cacheSet(key, d);\n      return d;\n    });\n  }\n\n  function buildCards(model, data) {\n    var cards = [];\n    var modelImg = model.img;\n    data.items.forEach(function (p) {\n      if (!modelImg && p.im) modelImg = p.im;\n      var base = p.t;\n      var idx = base.toLowerCase().indexOf(model.name.toLowerCase());\n      if (idx > -1) base = base.slice(idx + model.name.length).trim();\n      else {\n        // Produkttitel nennt das Modell ohne Klammerzusatz (z. B. \u201EApple Watch Series 10 Glasreparatur\u201C bei \u201E\u2026 (2024)\u201C)\n        var noParen = function (x) { return String(x || '').replace(/\\s*\\([^)]*\\)/g, '').replace(/\\s+/g, ' ').trim(); };\n        var tb = noParen(base);\n        var nm = noParen(model.name);\n        var j = nm ? tb.toLowerCase().indexOf(nm.toLowerCase()) : -1;\n        if (j > -1) base = tb.slice(j + nm.length).trim();\n      }\n      var baseLabel = cleanLabel(base);\n      var tagBlob = norm((p.tg || []).join(' ') + ' ' + model.name + ' ' + p.t);\n      var originalOnly = /original-only|originalonly/.test(tagBlob);\n      var comingSoon = /marktstart|teile-pending|teilepending/.test(tagBlob) || isIphone18Model() || isDuoModel();\n      var isDiag = /diagnose|kostenvoranschlag/.test(norm(p.t));\n      var vs = (p.vs || []).slice();\n      if (originalOnly) {\n        var orig = vs.filter(function (v) {\n          var n = norm([v.t, v.o1, v.o2].join(' '));\n          return /original|zertifiziert/.test(n) && !/nachbau|refurbished|aufbereitet|glas/.test(n);\n        });\n        if (orig.length) vs = orig;\n      }\n      var vsAvail = vs.filter(function (v) { return v.a; });\n      var unavailable = !vsAvail.length;\n      if (comingSoon && (isDuoModel() || !isDiag)) unavailable = true;\n      if (unavailable && !comingSoon) return;\n      if (!unavailable) vs = vsAvail;\n      var pairs = [];\n      var workVs = [];\n      vs.forEach(function (v) {\n        var blob = ((v.o2 || '') + ' ' + (v.t || '')).toLowerCase();\n        if (blob.indexOf('beide') > -1) pairs.push(v);\n        else workVs.push(v);\n      });\n      vs = workVs.length ? workVs : vs;\n      var optName = (p.on && p.on[0]) || '';\n      var firstO1 = vs[0].o1 || '';\n      var oneCard = /gr(\u00F6|oe|o)(\u00DF|ss)e|size|seite|farbe|color|material|variante/i.test(optName) || /^\\d+\\s*mm$|^(links|rechts)$/i.test(firstO1);\n      var multi = p.vs.length > 1 && !oneCard;\n      var groups = {};\n      var order = [];\n      vs.forEach(function (v) {\n        var g = multi ? (v.o1 && v.o1 !== 'Default Title' ? v.o1 : v.t) : '__single';\n        if (!groups[g]) { groups[g] = []; order.push(g); }\n        groups[g].push(v);\n      });\n      order.forEach(function (g) {\n        var list = groups[g];\n        var title = baseLabel;\n        if (g !== '__single') {\n          title = cleanLabel(g);\n          var head = norm(baseLabel).split(' ')[0];\n          if (head && norm(title).indexOf(head) === -1) title = baseLabel + ' \u2013 ' + title;\n        }\n        var cls = classify(title + ' ' + baseLabel, model.catId);\n        list.sort(function (a, b) { return a.p - b.p; });\n        var cardPairs = pairs.filter(function (pv) {\n          if (g === '__single') return true;\n          return pv.o1 === g;\n        });\n        cards.push({\n          key: p.h + '|' + g,\n          handle: p.h,\n          url: p.u || ('/products/' + p.h),\n          title: title,\n          multi: g !== '__single',\n          group: baseLabel,\n          tab: cls.tab,\n          icon: cls.icon,\n          variants: list,\n          pairs: cardPairs,\n          vi: 0,\n          unavailable: unavailable\n        });\n      });\n    });\n    var tabRank = {};\n    TABS.forEach(function (t, i) { tabRank[t.id] = i; });\n    cards.sort(function (a, b) {\n      if (a.tab !== b.tab) return tabRank[a.tab] - tabRank[b.tab];\n      return a.variants[0].p - b.variants[0].p;\n    });\n    if (modelImg && !model.img) model.img = modelImg;\n    return cards;\n  }\n\n  /* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 frame (top, device bar, foot) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n  var STEP_ALL = [\n    ['device', 'Ger\u00E4t'],\n    ['repair', 'Reparatur'],\n    ['method', 'Abgabe'],\n    ['extras', 'Extras'],\n    ['details', 'Kontakt'],\n    ['summary', 'Pr\u00FCfen']\n  ];\n  /* Der Extras-Schritt erscheint nur, wenn es etwas Passendes anzubieten gibt. */\n  function stepLabels() {\n    var showX = S.step === 'extras' || (S.model && selCount() > 0 && extrasAvailable().length > 0);\n    return STEP_ALL.filter(function (x) { return x[0] !== 'extras' || showX; });\n  }\n  function locs() {\n    return (CFG.locations || []).filter(function (l) { return l && l.id; });\n  }\n  function locPref(kind) {\n    var n = (CFG.locPref && CFG.locPref[kind]) || 1;\n    var list = locs();\n    for (var i = 0; i < list.length; i++) if (Number(list[i].n) === Number(n)) return list[i];\n    return list[0] || null;\n  }\n  function locAddress(l) {\n    if (!l) return SHOP.address || '';\n    return [l.street, l.zipcity].filter(Boolean).join(', ');\n  }\n  function locForCat(catId) {\n    return locs().filter(function (l) {\n      var raw = String(l.cats || '').trim();\n      if (!raw) return true;\n      var parts = raw.split(',').map(function (s) { return s.trim().toLowerCase(); }).filter(Boolean);\n      if (!parts.length) return true;\n      return parts.indexOf(String(catId || '').toLowerCase()) >= 0;\n    });\n  }\n  function visitLocs() {\n    return locForCat(S.model && S.model.catId);\n  }\n  function rememberLoc(id) {\n    try { if (id) localStorage.setItem('ffLoc', id); } catch (e) { /* ignore */ }\n  }\n  function rememberedLocId() {\n    try { return localStorage.getItem('ffLoc') || ''; } catch (e) { return ''; }\n  }\n  function haversine(aLat, aLng, bLat, bLng) {\n    var R = 6371, toRad = Math.PI / 180;\n    var dLat = (bLat - aLat) * toRad, dLng = (bLng - aLng) * toRad;\n    var x = Math.sin(dLat / 2) * Math.sin(dLat / 2) +\n      Math.cos(aLat * toRad) * Math.cos(bLat * toRad) * Math.sin(dLng / 2) * Math.sin(dLng / 2);\n    return Math.round(R * 2 * Math.atan2(Math.sqrt(x), Math.sqrt(1 - x)) * 10) / 10;\n  }\n  function afterMethod() {\n    if (S.method === 'send' && isScooterCat() && !isWheelSendOnly()) {\n      S.method = null;\n      return viewMethod();\n    }\n    if (S.method === 'visit' && visitLocs().length > 1) return viewPlace();\n    if (S.method === 'visit' && visitLocs().length === 1) S.loc = visitLocs()[0];\n    if (S.method === 'send') S.loc = locPref('send');\n    if (S.method === 'pickup') S.loc = locPref('senior');\n    return goDetails();\n  }\n  function stepIndex() {\n    var s = S.step;\n    if (s === 'brand' || s === 'model' || s === 'request') s = 'device';\n    if (s === 'place') s = 'method';\n    for (var i = 0; i < stepLabels().length; i++) if (stepLabels()[i][0] === s) return i;\n    return 0;\n  }\n  function total() {\n    var sum = 0;\n    Object.keys(S.sel).forEach(function (k) { sum += charge(S.sel[k]).price; });\n    extrasList().forEach(function (x) { sum += x.price; });\n    return sum;\n  }\n  function queueTotal() {\n    var sum = 0;\n    S.queue.forEach(function (d) {\n      d.items.forEach(function (i) { sum += charge(i).price; });\n      (d.extras || []).forEach(function (x) { sum += x.price; });\n    });\n    return sum;\n  }\n  function selCount() {\n    return Object.keys(S.sel).length;\n  }\n\n  function shell() {\n    root.innerHTML =\n      '<div class=\"ff-flow__top\">' +\n        '<button type=\"button\" class=\"ff-flow__back\" data-ff-back aria-label=\"Zur\u00FCck\">' + SVG.back + '</button>' +\n        '<button type=\"button\" class=\"ff-flow__home\" data-ff-home-flow aria-label=\"Zur Startseite\">' +\n          '<img class=\"ff-flow__logo\" src=\"' + esc(CFG.logo) + '\" alt=\"' + esc(SHOP.name) + '\" width=\"180\" height=\"44\">' +\n        '</button>' +\n        '<ol class=\"ff-flow__steps\" data-ff-steps aria-label=\"Fortschritt\"></ol>' +\n        '<a class=\"ff-flow__help\" href=\"' + esc(telHref()) + '\">' + SVG.phone + '<span><small>Lieber anrufen?</small><b>' + esc(SHOP.phone) + '</b></span></a>' +\n        '<button type=\"button\" class=\"ff-flow__close\" data-ff-close aria-label=\"Schlie\u00DFen\">' + SVG.close + '</button>' +\n      '</div>' +\n      '<div class=\"ff-flow__device\" data-ff-devicebar hidden></div>' +\n      '<div class=\"ff-flow__body\" data-ff-body tabindex=\"-1\"></div>' +\n      '<div class=\"ff-flow__foot\" data-ff-foot hidden></div>';\n  }\n\n  function renderSteps() {\n    var i = stepIndex();\n    var el = $('[data-ff-steps]');\n    if (!el) return;\n    el.innerHTML = stepLabels().map(function (s, n) {\n      return '<li class=\"' + (n === i ? 'is-on' : n < i ? 'is-done' : '') + '\"' + (n === i ? ' aria-current=\"step\"' : '') + '><span>' + (n + 1) + '</span><b>' + s[1] + '</b></li>';\n    }).join('') + '<li class=\"ff-flow__stepnow\" aria-hidden=\"true\">Schritt ' + (i + 1) + ' von ' + stepLabels().length + ' \u00B7 ' + stepLabels()[i][1] + '</li>';\n    $('[data-ff-back]').hidden = S.step === 'device';\n  }\n\n  function renderDeviceBar() {\n    var bar = $('[data-ff-devicebar]');\n    if (!bar) return;\n    if (!S.model || ['repair', 'method', 'place', 'extras', 'details', 'summary'].indexOf(S.step) < 0) {\n      bar.hidden = true;\n      return;\n    }\n    bar.hidden = false;\n    var qn = S.queue.length;\n    bar.innerHTML =\n      '<div class=\"ff-flow__device-in\">' +\n        visual(S.model.img, S.model.name, S.model.catId, 'ff-flow__device-img') +\n        '<div class=\"ff-flow__device-name\"><strong>' + esc(S.model.name) + '</strong><span>' + esc(S.model.vendor) + (qn ? ' \u00B7 +' + qn + ' weitere' + (qn > 1 ? ' Ger\u00E4te' : 's Ger\u00E4t') : '') + '</span></div>' +\n        '<div class=\"ff-flow__device-price\"><strong data-ff-total>' + money(total() + queueTotal()) + '</strong><span>inkl. MwSt.</span></div>' +\n      '</div>';\n  }\n  function updateTotals() {\n    var t = $('[data-ff-total]');\n    if (t) t.textContent = money(total() + queueTotal());\n    renderFoot();\n  }\n\n  function renderFoot() {\n    var foot = $('[data-ff-foot]');\n    if (!foot) return;\n    if (S.step === 'repair') {\n      foot.hidden = false;\n      var n = selCount();\n      foot.innerHTML =\n        '<div class=\"ff-flow__foot-in\"><span class=\"ff-flow__foot-sum\">' + (n ? n + (n > 1 ? ' Reparaturen' : ' Reparatur') + ' \u00B7 <b>' + money(total()) + '</b>' : 'Bitte mindestens eine Reparatur w\u00E4hlen') + '</span>' +\n        '<button type=\"button\" class=\"ff-btn-main\" data-ff-next ' + (n ? '' : 'disabled') + '>Weiter</button></div>';\n    } else {\n      foot.hidden = true;\n      foot.innerHTML = '';\n    }\n  }\n\n  function setBody(html, focus) {\n    var b = $('[data-ff-body]');\n    b.innerHTML = html;\n    b.scrollTop = 0;\n    if (focus !== false) {\n      try { b.focus({ preventScroll: true }); } catch (e) { /* ignore */ }\n    }\n  }\n  function frame() {\n    renderSteps();\n    renderDeviceBar();\n    renderFoot();\n  }\n  function helpBox(extraText) {\n    return '<aside class=\"ff-help\"><div><strong>' + esc(extraText || 'Unsicher, welche Reparatur Sie brauchen?') + '</strong><span>Wir helfen pers\u00F6nlich \u2013 gern auch am Telefon.</span></div>' +\n      '<a class=\"ff-btn-ghost\" href=\"' + esc(telHref()) + '\">' + SVG.phone + ' ' + esc(SHOP.phone) + '</a>' +\n      '<a class=\"ff-btn-ghost\" href=\"' + esc(waHref('Hallo FixFabrik, ich brauche Hilfe bei einer Reparatur.')) + '\" target=\"_blank\" rel=\"noopener\">' + SVG.wa + ' WhatsApp</a></aside>';\n  }\n\n  /* \u2014 step: device \u2014 */\n  function viewDevice() {\n    S.step = 'device';\n    S.method = null;\n    root.classList.remove('ff-flow--senior');\n    var tiles = CFG.cats.map(function (c) {\n      return '<button type=\"button\" class=\"ff-tile\" data-ff-cat=\"' + c.id + '\">' +\n        '<span class=\"ff-tile__img\">' + img(c.img, '', 'ff-tile__vis', 120, 120) + '</span>' +\n        '<span class=\"ff-tile__label\">' + esc(c.label) + '</span>' +\n        '<span class=\"ff-tile__tag\">' + esc(c.tag) + '</span></button>';\n    }).join('');\n    setBody(\n      '<div class=\"ff-fwrap\">' +\n        '<h2 class=\"ff-h\">Welches Ger\u00E4t m\u00F6chten Sie reparieren lassen?</h2>' +\n        '<div class=\"ff-search\">' + SVG.search +\n          '<input type=\"search\" inputmode=\"search\" autocomplete=\"off\" autocapitalize=\"off\" spellcheck=\"false\" placeholder=\"iPhone 12 Akku oder iPhone 13\" aria-label=\"Modell oder Reparatur suchen\" data-ff-q value=\"' + esc(S.query) + '\">' +\n          '<button type=\"button\" class=\"ff-search__x\" data-ff-qclear aria-label=\"Eingabe l\u00F6schen\" hidden>\u00D7</button>' +\n          '<div class=\"ff-results\" data-ff-results hidden role=\"listbox\"></div>' +\n        '</div>' +\n        '<p class=\"ff-sub\">\u2026oder w\u00E4hlen Sie die Ger\u00E4teklasse:</p>' +\n        '<div class=\"ff-tiles\">' + tiles + '</div>' +\n        helpBox('Ihr Ger\u00E4t ist nicht dabei?') +\n      '</div>',\n      false\n    );\n    frame();\n    var q = $('[data-ff-q]');\n    if (q) {\n      if (S.query) runSearch(S.query);\n      if (S.focusSearch) {\n        S.focusSearch = false;\n        setTimeout(function () { try { q.focus({ preventScroll: true }); } catch (e) { /* ignore */ } }, 30);\n      }\n    }\n  }\n\n  function resultsHtml(list) {\n    var notListed = '<button type=\"button\" class=\"ff-res ff-res--none\" data-ff-notlisted>' +\n      '<span class=\"ff-res__t\"><strong>Mein Ger\u00E4t ist nicht dabei</strong><span>Wir erstellen Ihnen ein individuelles Angebot</span></span>' + SVG.chev + '</button>';\n    if (!list.length) return '<div class=\"ff-results__empty\">Kein passendes Modell gefunden \u2013 pr\u00FCfen Sie die Schreibweise (z. B. \u201EiPhone 13\u201C oder \u201EiPhone 12 Akku\u201C) oder fragen Sie uns direkt.</div>' + notListed;\n    return list.map(function (m, i) {\n      var title = m.service ? (m.name + ' \u2013 ' + m.service.label) : m.name;\n      var sub = m.vendor || '';\n      if (m.service && m.service.label) sub = (sub ? sub + ' \u00B7 ' : '') + m.service.label;\n      return '<button type=\"button\" class=\"ff-res\" role=\"option\" data-ff-pick=\"' + i + '\">' +\n        visual(m.img, m.name, m.catId, 'ff-res__img') +\n        '<span class=\"ff-res__t\"><strong>' + esc(title) + '</strong><span>' + esc(sub) + '</span></span>' + SVG.chev + '</button>';\n    }).join('') + notListed;\n  }\n  var lastResults = [];\n  var runSearch = debounce(function (q) {\n    var box = $('[data-ff-results]');\n    var clear = $('[data-ff-qclear]');\n    if (!box) return;\n    if (clear) clear.hidden = !q;\n    if (!q || q.length < 1) { box.hidden = true; box.innerHTML = ''; return; }\n    box.hidden = false;\n    box.innerHTML = '<div class=\"ff-results__empty\">Suche \u2026</div>';\n    var mine = q;\n    searchModels(q).then(function (list) {\n      if (mine !== S.query) return;\n      lastResults = list;\n      box.innerHTML = resultsHtml(list);\n    });\n  }, 160);\n\n  /* \u2014 step: brand \u2014 */\n  function enterClass(cat) {\n    S.cat = cat;\n    root.classList.toggle('ff-flow--senior', !!cat.senior);\n    if (cat.mode === 'request') return viewRequest({ device: '' });\n    return viewBrand(cat);\n  }\n  function extrasHtml(cat) {\n    var ex = (cat.extras || []).map(function (e, i) {\n      return '<button type=\"button\" class=\"ff-tile ff-tile--extra\" data-ff-extra=\"' + i + '\">' +\n        '<span class=\"ff-tile__img\">' + img(e.img, '', 'ff-tile__vis', 96, 96) + '</span>' +\n        '<span class=\"ff-tile__label\">' + esc(e.label) + '</span></button>';\n    }).join('');\n    return ex;\n  }\n  function viewBrand(cat) {\n    S.step = 'brand';\n    S.cat = cat;\n    setBody('<div class=\"ff-fwrap\"><h2 class=\"ff-h\">' + esc(cat.label) + ' \u2013 Marke w\u00E4hlen</h2><div class=\"ff-skel ff-skel--tiles\"></div></div>', false);\n    frame();\n    loadCategory(cat).then(function (d) {\n      if (S.cat !== cat || S.step !== 'brand') return;\n      var vendors = d.vendorsList;\n      if (!vendors.length) return viewRequest({ device: cat.label });\n      if (vendors.length === 1 && !(cat.extras && cat.extras.length)) return viewModels(cat, vendors[0].v, true);\n      var tiles = vendors.map(function (v) {\n        var logo = logoFor(v.v);\n        return '<button type=\"button\" class=\"ff-tile ff-tile--brand\" data-ff-brand=\"' + esc(v.v) + '\">' +\n          '<span class=\"ff-tile__img ff-tile__img--logo\">' + (logo ? img(logo, v.v, '', 120, 48) : '<b>' + esc(v.v) + '</b>') + '</span>' +\n          '<span class=\"ff-tile__label\">' + esc(v.v) + '</span></button>';\n      }).join('');\n      tiles += extrasHtml(cat);\n      tiles += '<button type=\"button\" class=\"ff-tile ff-tile--extra\" data-ff-notlisted>' +\n        '<span class=\"ff-tile__img\"><b class=\"ff-tile__q\">?</b></span><span class=\"ff-tile__label\">Marke nicht dabei</span></button>';\n      setBody('<div class=\"ff-fwrap\"><h2 class=\"ff-h\">' + esc(cat.label) + ' \u2013 Marke w\u00E4hlen</h2><div class=\"ff-tiles ff-tiles--brands\">' + tiles + '</div></div>', false);\n    }).catch(function () {\n      viewRequest({ device: cat.label, note: 'Die Online-Auswahl ist gerade nicht erreichbar. Beschreiben Sie uns Ihr Ger\u00E4t \u2013 wir melden uns.' });\n    });\n  }\n\n  /* \u2014 step: model \u2014 */\n  var modelFilter = { q: '', series: '' };\n  function seriesOf(name) {\n    var raw = String(name || '').replace(/^Samsung\\s+/i, '').trim();\n    var s = raw.replace(/\\s*\\([^)]*\\)/g, ' ').replace(/\\s+/g, ' ').trim();\n    var families = [\n      /^(galaxy\\s*z\\s*fold)/i,\n      /^(galaxy\\s*z\\s*flip)/i,\n      /^(galaxy\\s*tab\\s*s)/i,\n      /^(galaxy\\s*tab\\s*a)/i,\n      /^(galaxy\\s*tab)/i,\n      /^(galaxy\\s*s)/i,\n      /^(galaxy\\s*a)/i,\n      /^(galaxy\\s*m)/i,\n      /^(ipad\\s*pro)/i,\n      /^(ipad\\s*air)/i,\n      /^(ipad\\s*mini)/i,\n      /^(ipad)\\b/i,\n      /^(iphone)/i,\n      /^(pixel\\s*tablet)/i,\n      /^(pixel\\s*fold)/i,\n      /^(pixel)/i,\n      /^(surface\\s*pro)/i,\n      /^(surface\\s*go)/i,\n      /^(surface)/i,\n      /^(macbook\\s*pro)/i,\n      /^(macbook\\s*air)/i,\n      /^(macbook)/i,\n      /^(playstation)/i,\n      /^(dualsense)/i,\n      /^(xbox)/i,\n      /^(nintendo\\s*switch)/i,\n      /^(joy-con)/i\n    ];\n    for (var i = 0; i < families.length; i++) {\n      var hit = s.match(families[i]);\n      if (hit) return s.slice(0, hit[0].length).trim();\n    }\n    var cut = s.split(/\\s*\\d/)[0].trim().replace(/[(\\[\\s,.:\u2013\u2014-]+$/g, '').trim();\n    return cut || s.split(/\\s+/)[0] || raw.split(/\\s+/)[0];\n  }\n  function viewModels(cat, brand) {\n    S.step = 'model';\n    S.cat = cat;\n    S.brand = brand;\n    modelFilter = { q: '', series: '' };\n    setBody('<div class=\"ff-fwrap\"><h2 class=\"ff-h\">' + esc(brand) + ' \u2013 Modell w\u00E4hlen</h2><div class=\"ff-skel ff-skel--tiles\"></div></div>', false);\n    frame();\n    loadBrandModels(cat, brand, function (partial) {\n      if (S.brand === brand && S.step === 'model') paintModels(sortModels(partial));\n    }).then(function (list) {\n      if (S.brand !== brand || S.step !== 'model') return;\n      paintModels(sortModels(list));\n    }).catch(function () {\n      viewRequest({ device: brand, note: 'Die Modellliste ist gerade nicht erreichbar. Beschreiben Sie uns Ihr Ger\u00E4t \u2013 wir melden uns.' });\n    });\n  }\n  var modelList = [];\n  function paintModels(list) {\n    modelList = list;\n    var series = {};\n    list.forEach(function (m) {\n      var s = seriesOf(m.name);\n      if (!s) return;\n      if (!series[s]) series[s] = { n: 0, rank: 0 };\n      series[s].n += 1;\n      series[s].rank = Math.max(series[s].rank, modelRank(m.name));\n    });\n    var sk = Object.keys(series).sort(function (a, b) {\n      if (series[b].rank !== series[a].rank) return series[b].rank - series[a].rank;\n      return a.localeCompare(b, 'de', { sensitivity: 'base' });\n    });\n    var chips = sk.length > 1 && list.length > 10\n      ? '<div class=\"ff-fchips\" data-ff-chips><button type=\"button\" class=\"ff-fchip is-on\" data-ff-series=\"\">Alle</button>' +\n        sk.map(function (s) { return '<button type=\"button\" class=\"ff-fchip\" data-ff-series=\"' + esc(s) + '\">' + esc(s) + '</button>'; }).join('') + '</div>'\n      : '';\n    var existing = $('[data-ff-modelgrid]');\n    if (!existing) {\n      setBody(\n        '<div class=\"ff-fwrap\"><h2 class=\"ff-h\">' + esc(S.brand) + ' \u2013 Modell w\u00E4hlen</h2>' +\n        (list.length > 8\n          ? '<div class=\"ff-search ff-search--sm\">' + SVG.search + '<input type=\"search\" placeholder=\"Modell filtern \u2026\" aria-label=\"Modell filtern\" data-ff-mfilter autocomplete=\"off\"></div>'\n          : '') +\n        '<div data-ff-serieswrap>' + chips + '</div>' +\n        '<div class=\"ff-fmodels\" data-ff-modelgrid></div>' +\n        '<p class=\"ff-note\" data-ff-mcount hidden></p>' +\n        '<div class=\"ff-notlisted\"><span>Ihr Modell ist nicht dabei?</span><button type=\"button\" class=\"ff-btn-ghost\" data-ff-notlisted>Individuell anfragen</button></div></div>',\n        false\n      );\n    } else {\n      $('[data-ff-serieswrap]').innerHTML = chips;\n    }\n    drawModels();\n  }\n  function drawModels() {\n    var grid = $('[data-ff-modelgrid]');\n    if (!grid) return;\n    var q = norm(modelFilter.q);\n    var shown = modelList.filter(function (m) {\n      if (modelFilter.series && seriesOf(m.name) !== modelFilter.series) return false;\n      return !q || norm(m.name).indexOf(q) > -1;\n    });\n    grid.innerHTML = shown.map(function (m) {\n      var idx = modelList.indexOf(m);\n      return '<button type=\"button\" class=\"ff-model\" data-ff-model=\"' + idx + '\">' +\n        '<span class=\"ff-model__img\">' + visual(m.img, m.name, m.catId, 'ff-model__vis') + '</span>' +\n        '<span class=\"ff-model__name\">' + esc(m.name) + (m.note ? '<small>' + esc(m.note) + '</small>' : '') + '</span></button>';\n    }).join('');\n    var note = $('[data-ff-mcount]');\n    if (note) {\n      note.hidden = shown.length > 0;\n      note.textContent = 'Kein Modell gefunden. Pr\u00FCfen Sie die Schreibweise oder fragen Sie uns direkt an.';\n    }\n  }\n\n  /* \u2014 step: request (Ger\u00E4t nicht gelistet / Klasse ohne Online-Katalog) \u2014 */\n  function requestText() {\n    var r = S.request;\n    var c = S.contact;\n    var lines = ['Hallo ' + SHOP.name + ',', '', 'ich m\u00F6chte ein Ger\u00E4t reparieren lassen.'];\n    lines.push('Ger\u00E4t: ' + (r.device || '(bitte erg\u00E4nzen)'));\n    if (r.problem) lines.push('Problem: ' + r.problem);\n    if (c.name) lines.push('Name: ' + c.name);\n    if (c.phone) lines.push('Telefon: ' + c.phone);\n    lines.push('', 'Bitte um Angebot / R\u00FCckmeldung. Danke!');\n    return lines.join('\\n');\n  }\n  function refreshRequestLinks() {\n    var t = requestText();\n    var a = $('[data-ff-req-wa]'); if (a) a.setAttribute('href', waHref(t));\n    var b = $('[data-ff-req-mail]'); if (b) b.setAttribute('href', mailHref('Reparaturanfrage: ' + (S.request.device || 'Ger\u00E4t'), t));\n  }\n  function viewRequest(opts) {\n    opts = opts || {};\n    S.step = 'request';\n    S.request.device = opts.device != null ? opts.device : S.request.device;\n    if (S.query && !S.request.device) S.request.device = S.query;\n    var cat = S.cat;\n    var intro = opts.note ||\n      (cat && cat.mode === 'request'\n        ? 'F\u00FCr ' + cat.label + ' erstellen wir Ihnen ein pers\u00F6nliches Angebot \u2013 mit Festpreis, bevor wir mit der Reparatur beginnen.'\n        : 'Kein Problem \u2013 f\u00FCr Ger\u00E4te au\u00DFerhalb unseres Online-Katalogs erstellen wir Ihnen gern ein pers\u00F6nliches Angebot mit Festpreis.');\n    var senior = cat && cat.senior;\n    setBody(\n      '<div class=\"ff-fwrap ff-fwrap--narrow\">' +\n        '<h2 class=\"ff-h\">' + (senior ? 'Wir rufen Sie gern zur\u00FCck' : 'Individuelle Anfrage') + '</h2>' +\n        '<p class=\"ff-lead\">' + esc(intro) + '</p>' +\n        '<div class=\"ff-req-quick\">' +\n          '<a class=\"ff-btn-main\" href=\"' + esc(telHref()) + '\">' + SVG.phone + ' Jetzt anrufen: ' + esc(SHOP.phone) + '</a>' +\n          '<a class=\"ff-btn-ghost\" data-ff-req-wa href=\"' + esc(waHref(requestText())) + '\" target=\"_blank\" rel=\"noopener\">' + SVG.wa + ' Per WhatsApp schreiben</a>' +\n        '</div>' +\n        '<p class=\"ff-sub\">Oder beschreiben Sie kurz Ihr Ger\u00E4t \u2013 wir bereiten die Nachricht f\u00FCr Sie vor:</p>' +\n        '<label class=\"ff-field\"><span>Ger\u00E4t (Marke und Modell)</span><input type=\"text\" data-ff-req-device autocomplete=\"off\" placeholder=\"' + esc(cat && cat.id === 'senior' ? 'z. B. Elektromobil, 4-Rad, Baujahr 2019' : 'z. B. Jura E8, Tefal-Kaffeemaschine, Lenovo Yoga') + '\" value=\"' + esc(S.request.device) + '\"></label>' +\n        '<label class=\"ff-field\"><span>Was funktioniert nicht?</span><textarea rows=\"3\" data-ff-req-problem placeholder=\"Kurz in eigenen Worten\">' + esc(S.request.problem) + '</textarea></label>' +\n        '<label class=\"ff-field\"><span>Ihr Name</span><input type=\"text\" data-ff-req-name autocomplete=\"name\" value=\"' + esc(S.contact.name || '') + '\"></label>' +\n        '<label class=\"ff-field\"><span>Ihre Telefonnummer (f\u00FCr R\u00FCckruf)</span><input type=\"tel\" data-ff-req-phone autocomplete=\"tel\" value=\"' + esc(S.contact.phone || '') + '\"></label>' +\n        '<div class=\"ff-actions\">' +\n          '<a class=\"ff-btn-main\" data-ff-req-mail href=\"' + esc(mailHref('Reparaturanfrage: ' + (S.request.device || 'Ger\u00E4t'), requestText())) + '\">' + SVG.mail + ' Anfrage per E-Mail senden</a>' +\n          '<a class=\"ff-btn-ghost\" href=\"' + esc(SHOP.contactUrl) + '\">Kontaktformular \u00F6ffnen</a>' +\n          '<button type=\"button\" class=\"ff-btn-ghost\" data-ff-restart>Anderes Ger\u00E4t w\u00E4hlen</button>' +\n        '</div>' +\n        '<p class=\"ff-note ff-note--sm\">Hinweis: Der Preis steht erst nach Pr\u00FCfung Ihres Ger\u00E4ts fest. Sie zahlen nichts, bevor Sie unser Angebot angenommen haben.</p>' +\n      '</div>',\n      false\n    );\n    frame();\n  }\n\n  /* \u2014 step: repair \u2014 */\n  function viewRepair() {\n    S.step = 'repair';\n    loadExtras();\n    S.sel = {};\n    S.cards = [];\n    setBody('<div class=\"ff-fwrap\"><h2 class=\"ff-h\">Reparatur w\u00E4hlen</h2><div class=\"ff-skel ff-skel--cards\"></div></div>', false);\n    frame();\n    var model = S.model;\n    loadRepairs(model).then(function (data) {\n      if (S.model !== model || S.step !== 'repair') return;\n      S.cards = buildCards(model, data);\n      renderDeviceBar();\n      if (!S.cards.length) {\n        S.request.device = (model.vendor ? model.vendor + ' ' : '') + model.name;\n        return viewRequest({ device: S.request.device, note: 'F\u00FCr dieses Modell gibt es online noch keine Festpreis-Reparatur. Wir erstellen Ihnen gern ein pers\u00F6nliches Angebot.' });\n      }\n      var first = TABS.filter(function (t) { return S.cards.some(function (c) { return c.tab === t.id; }); })[0];\n      S.tab = first ? first.id : 'other';\n      var want = S.wantService;\n      S.wantService = null;\n      if (want) {\n        var hit = null;\n        S.cards.forEach(function (c) {\n          if (hit) return;\n          var scooter = model.catId === 'escooter';\n          var k = kindOf(c.group, scooter);\n          if (k === 'service' && !scooter) k = kindOf(c.title, false);\n          if (want.kind && k === want.kind) hit = c;\n        });\n        if (hit) S.tab = hit.tab;\n        else if (want.tab && S.cards.some(function (c) { return c.tab === want.tab; })) S.tab = want.tab;\n      }\n      paintRepair();\n    }).catch(function () {\n      setBody('<div class=\"ff-fwrap\"><h2 class=\"ff-h\">Reparatur w\u00E4hlen</h2><p class=\"ff-note\">Die Reparaturen konnten nicht geladen werden.</p><div class=\"ff-actions\"><button type=\"button\" class=\"ff-btn-main\" data-ff-retry>Erneut versuchen</button><a class=\"ff-btn-ghost\" href=\"' + esc(telHref()) + '\">' + SVG.phone + ' ' + esc(SHOP.phone) + '</a></div></div>', false);\n    });\n  }\n  function paintRepair() {\n    var counts = {};\n    S.cards.forEach(function (c) { counts[c.tab] = (counts[c.tab] || 0) + 1; });\n    var tabs = TABS.filter(function (t) { return counts[t.id]; });\n    var tabsHtml = tabs.length > 1 ? '<div class=\"ff-tabs\" role=\"tablist\">' + tabs.map(function (t) {\n      var picked = S.cards.filter(function (c) { return c.tab === t.id && S.sel[c.key]; }).length;\n      return '<button type=\"button\" role=\"tab\" class=\"ff-tab' + (t.id === S.tab ? ' is-on' : '') + '\" aria-selected=\"' + (t.id === S.tab) + '\" data-ff-tab=\"' + t.id + '\">' + tabLabel(t) + (picked ? ' <i>' + picked + '</i>' : '') + '</button>';\n    }).join('') + '</div>' : '';\n    setBody(\n      '<div class=\"ff-fwrap\"><h2 class=\"ff-h\">Welche Reparatur wird ben\u00F6tigt?</h2>' +\n      repairNoticeHtml() + tabsHtml +\n      '<div class=\"ff-cards\" data-ff-cards></div>' +\n      helpBox('Nicht das Richtige dabei?') + '</div>',\n      false\n    );\n    drawCards();\n  }\n  function drawCards() {\n    var box = $('[data-ff-cards]');\n    if (!box) return;\n    var single = !$('.ff-tabs');\n    box.innerHTML = S.cards.filter(function (c) { return single || c.tab === S.tab; }).map(function (c) {\n      var on = !!S.sel[c.key];\n      var off = !!c.unavailable;\n      var opts = '';\n      if (!off && c.variants.length > 1) {\n        opts = '<select class=\"ff-card__sel\" data-ff-var=\"' + esc(c.key) + '\" aria-label=\"Variante f\u00FCr ' + esc(c.title) + '\">' +\n          c.variants.map(function (x, i) {\n            var lbl = x.o2 && x.o2 !== 'Default Title' ? x.o2 : (x.o1 && x.o1 !== c.title && x.o1 !== 'Default Title' ? x.o1 : x.t);\n            return '<option value=\"' + i + '\"' + (i === c.vi ? ' selected' : '') + '>' + esc(lbl) + ' \u2013 ' + money(x.p) + '</option>';\n          }).join('') + '</select>';\n      }\n      var info = off\n        ? (isDuoModel()\n          ? 'Noch nicht buchbar. Das iPhone Duo kommt am 23. Oktober in den Handel, Ersatzteile gibt es noch nicht.'\n          : 'Originalteile sind noch nicht fest lieferbar. Derzeit nicht buchbar \u2013 Diagnose k\u00F6nnen Sie schon beauftragen.')\n        : repairInfo(c);\n      var details = c.url\n        ? '<a class=\"ff-card__more\" href=\"' + esc(detailUrl(c)) + '\" data-ff-stop>Details zur Reparatur</a>'\n        : '';\n      return '<div class=\"ff-card' + (on ? ' is-on' : '') + (off ? ' is-off' : '') + '\"' +\n        (off ? ' aria-disabled=\"true\"' : ' data-ff-card=\"' + esc(c.key) + '\" role=\"checkbox\" aria-checked=\"' + on + '\" tabindex=\"0\"') + '>' +\n        '<div class=\"ff-card__row\">' +\n          img(CFG.ri[c.icon] || CFG.ri.service, '', 'ff-card__ico', 56, 56) +\n          '<span class=\"ff-card__t\"><strong>' + esc(c.title) + '</strong>' +\n          '<span class=\"ff-card__p\">' + (off ? 'derzeit nicht verf\u00FCgbar' : priceText(c, on)) + '</span>' + opts + wheelsHtml(c, on) + '</span>' +\n          (off ? '<span class=\"ff-card__wait\">Bald</span>' : '<span class=\"ff-card__tog\" aria-hidden=\"true\">' + (on ? SVG.check : SVG.plus) + '</span>') +\n        '</div>' +\n        (info ? '<p class=\"ff-card__info\">' + esc(info) + '</p>' : '') +\n        details +\n        '</div>';\n    }).join('');\n  }\n  function detailUrl(c) {\n    var base = c.url || (c.handle ? '/products/' + c.handle : '');\n    if (!base) return '';\n    var v = c.variants[c.vi] || c.variants[0];\n    if (!v || !v.i) return base;\n    return base + (base.indexOf('?') >= 0 ? '&' : '?') + 'variant=' + encodeURIComponent(v.i);\n  }\n  function itemQty(it) { return (it && it.qty) || 1; }\n  function pairOf(c) {\n    if (!c || !c.pairs || !c.pairs.length) return null;\n    var v = c.variants[c.vi];\n    var key = v && v.o1;\n    for (var i = 0; i < c.pairs.length; i++) {\n      if (!key || c.pairs[i].o1 === key) return c.pairs[i];\n    }\n    return null;\n  }\n  function stampCharge(it, card) {\n    var pair = itemQty(it) > 1 ? pairOf(card) : null;\n    it.pairId = pair ? pair.i : '';\n    it.pairPrice = pair ? pair.p : 0;\n  }\n  function charge(it) {\n    if (itemQty(it) > 1 && it.pairId) return { id: it.pairId, price: it.pairPrice, qty: 1 };\n    var q = itemQty(it);\n    return { id: it.variantId, price: it.price * q, qty: q };\n  }\n  function bothPrice(c) {\n    var pair = pairOf(c);\n    if (pair) return pair.p;\n    return c.variants[c.vi].p * 2;\n  }\n  function priceText(c, on) {\n    var v = c.variants[c.vi];\n    var q = on ? itemQty(S.sel[c.key]) : 1;\n    if (q > 1) return 'Beide R\u00E4der ' + money(bothPrice(c));\n    if (on || c.variants.length === 1 || hasSamePrice(c)) return money(v.p);\n    return 'ab ' + money(c.variants[0].p);\n  }\n  function wheelsHtml(c, on) {\n    if (!on || c.icon !== 'tire') return '';\n    var q = itemQty(S.sel[c.key]);\n    return '<span class=\"ff-card__wheels\" data-ff-wheels=\"' + esc(c.key) + '\">' +\n      '<button type=\"button\" data-ff-qty=\"1\"' + (q === 1 ? ' class=\"is-on\"' : '') + '>Ein Rad</button>' +\n      '<button type=\"button\" data-ff-qty=\"2\"' + (q === 2 ? ' class=\"is-on\"' : '') + '>Beide R\u00E4der \u00B7 ' + money(bothPrice(c)) + '</button></span>';\n  }\n  function hasSamePrice(c) {\n    return c.variants.every(function (x) { return x.p === c.variants[0].p; });\n  }\n  function cardByKey(k) {\n    for (var i = 0; i < S.cards.length; i++) if (S.cards[i].key === k) return S.cards[i];\n    return null;\n  }\n  function afterSelChange() {\n    drawCards();\n    $$('[data-ff-tab]').forEach(function (b) {\n      var id = b.getAttribute('data-ff-tab');\n      var t = TABS.filter(function (x) { return x.id === id; })[0];\n      var picked = S.cards.filter(function (cc) { return cc.tab === id && S.sel[cc.key]; }).length;\n      b.innerHTML = tabLabel(t) + (picked ? ' <i>' + picked + '</i>' : '');\n    });\n    updateTotals();\n  }\n  function applySelection(c, notice) {\n    var v = c.variants[c.vi];\n    var prevQty = itemQty(S.sel[c.key]);\n    S.sel[c.key] = {\n      variantId: v.i,\n      title: c.title,\n      group: c.group,\n      price: v.p,\n      qty: prevQty,\n      handle: c.handle,\n      variantTitle: v.t,\n      notice: notice && notice.kind === 'warn' ? notice.text : ''\n    };\n    stampCharge(S.sel[c.key], c);\n    afterSelChange();\n  }\n  function partModalOpen() {\n    return !!$('[data-ff-part-modal]');\n  }\n  function closePartModal() {\n    var m = $('[data-ff-part-modal]');\n    if (m) m.remove();\n  }\n  function showPartModal(notice, onAccept, onCancel) {\n    closePartModal();\n    var done = false;\n    var finish = function (fn) {\n      if (done) return;\n      done = true;\n      closePartModal();\n      if (fn) fn();\n    };\n    var wrap = document.createElement('div');\n    wrap.className = 'ff-partmodal';\n    wrap.setAttribute('data-ff-part-modal', '');\n    wrap.innerHTML =\n      '<div class=\"ff-partmodal__box\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"ff-partmodal-h\">' +\n        '<h3 id=\"ff-partmodal-h\">' + esc(notice.title || 'Hinweis zum Ersatzteil') + '</h3>' +\n        '<p>' + esc(notice.text) + '</p>' +\n        '<p class=\"ff-partmodal__src\">Quelle: Apple Support, \u201ETeile- und Serviceverlauf des iPhone\u201C. Die Meldung steht nach dem Kauf noch einmal in der Auftragsbest\u00E4tigung.</p>' +\n        '<label class=\"ff-partmodal__check\"><input type=\"checkbox\" data-ff-part-ack> Ich habe den Hinweis gelesen und akzeptiere ihn.</label>' +\n        '<div class=\"ff-actions\">' +\n          '<button type=\"button\" class=\"ff-btn-main\" data-ff-part-ok disabled>Weiter</button>' +\n          '<button type=\"button\" class=\"ff-btn-ghost\" data-ff-part-cancel>Abbrechen</button>' +\n        '</div>' +\n      '</div>';\n    root.appendChild(wrap);\n    var cb = wrap.querySelector('[data-ff-part-ack]');\n    var ok = wrap.querySelector('[data-ff-part-ok]');\n    cb.addEventListener('change', function () { ok.disabled = !cb.checked; });\n    ok.addEventListener('click', function () { finish(onAccept); });\n    wrap.querySelector('[data-ff-part-cancel]').addEventListener('click', function () { finish(onCancel); });\n    wrap.addEventListener('click', function (e) { if (e.target === wrap) finish(onCancel); });\n    cb.focus();\n  }\n  function toggleCard(key) {\n    var c = cardByKey(key);\n    if (!c || c.unavailable) return;\n    if (S.sel[key]) {\n      delete S.sel[key];\n      afterSelChange();\n      return;\n    }\n    var notice = partNotice(c);\n    if (notice && notice.kind === 'warn') {\n      showPartModal(notice, function () { applySelection(c, notice); });\n      return;\n    }\n    applySelection(c, null);\n  }\n\n  /* \u2014 step: extras (optionale Zusatzleistungen) \u2014 */\n  var EXTRA_DEFS = [\n    {\n      key: 'express', icon: 'bolt', badge: 'Schnell',\n      title: 'Express-Reparatur',\n      text: 'Ihr Ger\u00E4t wird vorrangig bearbeitet und ist innerhalb von 1 Werktag nach Ger\u00E4teeingang fertig.',\n      hint: 'Gilt f\u00FCr Display, Akku und Ladebuchse.'\n    },\n    {\n      key: 'cleaning', icon: 'sparkle', badge: '',\n      title: 'Technische Reinigung',\n      text: 'Staubschutzgitter und Ladeanschluss werden gr\u00FCndlich ges\u00E4ubert, dazu eine UV-Behandlung zur Reduktion von Bakterien.',\n      hint: 'Nur zusammen mit einer Reparatur buchbar.'\n    },\n    {\n      key: 'folie', icon: 'shield', badge: '',\n      title: 'Display-Schutzfolie',\n      text: 'Wir bringen eine Schutzfolie fachgerecht auf, bevor das Ger\u00E4t zu Ihnen zur\u00FCckkommt. So bleibt das Display von Anfang an gesch\u00FCtzt.',\n      hint: 'Beim Einsenden, nur zusammen mit einer Reparatur.'\n    }\n  ];\n  var extraData = null;\n  var extraLoading = null;\n  function extrasList() {\n    return Object.keys(S.extras || {}).map(function (k) { return S.extras[k]; });\n  }\n  function loadExtras() {\n    if (extraData) return Promise.resolve(extraData);\n    if (extraLoading) return extraLoading;\n    var handles = CFG.upsells || {};\n    extraLoading = Promise.all(EXTRA_DEFS.map(function (d) {\n      var h = handles[d.key];\n      if (!h) return Promise.resolve(null);\n      return fetchJson('/products/' + encodeURIComponent(h) + '.js').then(function (pr) {\n        var v = (pr.variants || []).filter(function (x) { return x.available; })[0];\n        if (!v) return null;\n        return { key: d.key, handle: h, variantId: v.id, price: v.price, title: d.title };\n      }).catch(function () { return null; });\n    })).then(function (list) {\n      var out = {};\n      list.forEach(function (x) { if (x) out[x.key] = x; });\n      extraData = out;\n      return out;\n    });\n    return extraLoading;\n  }\n  function extraApplies(key) {\n    var items = Object.keys(S.sel).map(function (k) { return S.sel[k]; });\n    if (!items.length || !S.model) return false;\n    var cid = S.model.catId;\n    if (['phone', 'tablet', 'laptop', 'watch'].indexOf(cid) < 0) return false;\n    var blobs = items.map(function (i) { return norm((i.title || '') + ' ' + (i.group || '')); });\n    var real = blobs.filter(function (b) { return !/diagnose|kostenvoranschlag/.test(b); });\n    if (!real.length) return false;\n    var all = real.join(' ');\n    if (key === 'express') return /displ|touchscreen|bildschirm|akku|batterie|ladebuchse/.test(all);\n    if (key === 'cleaning') return !/reinigung/.test(all);\n    if (key === 'folie') {\n      if (cid !== 'phone' && cid !== 'tablet') return false;\n      if (/folie/.test(all)) return false;\n      return (S.method || 'send') === 'send';\n    }\n    return false;\n  }\n  function extrasAvailable() {\n    return EXTRA_DEFS.filter(function (d) {\n      if (!extraApplies(d.key)) return false;\n      return !extraData || !!extraData[d.key];\n    });\n  }\n  function pruneExtras() {\n    Object.keys(S.extras || {}).forEach(function (k) {\n      if (!extraApplies(k) || (extraData && !extraData[k])) delete S.extras[k];\n    });\n  }\n  function goDetails() {\n    return loadExtras().then(function () {\n      pruneExtras();\n      if (extrasAvailable().length) return viewExtras();\n      S.extras = {};\n      return viewDetails();\n    });\n  }\n  function extraCardHtml(d) {\n    var data = extraData && extraData[d.key];\n    var on = !!S.extras[d.key];\n    return '<button type=\"button\" class=\"ff-extra' + (on ? ' is-on' : '') + '\" data-ff-xtra=\"' + d.key + '\" aria-pressed=\"' + on + '\">' +\n      '<span class=\"ff-extra__ico\">' + SVG[d.icon] + '</span>' +\n      '<span class=\"ff-extra__t\"><strong>' + esc(d.title) + (d.badge ? ' <em>' + esc(d.badge) + '</em>' : '') + '</strong>' +\n        '<span>' + esc(d.text) + '</span><small>' + esc(d.hint) + '</small></span>' +\n      '<span class=\"ff-extra__side\"><b>+' + money(data ? data.price : 0) + '</b><i class=\"ff-extra__tog\">' + (on ? SVG.check : SVG.plus) + '</i></span>' +\n    '</button>';\n  }\n  function viewExtras() {\n    S.step = 'extras';\n    var list = extrasAvailable();\n    if (!list.length) return viewDetails();\n    var n = extrasList().length;\n    setBody(\n      '<div class=\"ff-fwrap ff-fwrap--narrow\"><h2 class=\"ff-h\">Noch etwas dazu?</h2>' +\n      '<p class=\"ff-lead\">Optional \u2013 Sie k\u00F6nnen auch einfach weitergehen. Alles zahlen Sie gemeinsam mit der Reparatur im Checkout.</p>' +\n      '<div class=\"ff-extras\" data-ff-extras>' + list.map(extraCardHtml).join('') + '</div>' +\n      '<div class=\"ff-actions\"><button type=\"button\" class=\"ff-btn-main\" data-ff-extras-next data-ff-extras-btn>' + (n ? 'Weiter mit Extras' : 'Ohne Extras weiter') + '</button></div></div>',\n      false\n    );\n    frame();\n  }\n  function toggleExtra(key) {\n    var data = extraData && extraData[key];\n    if (!data || !extraApplies(key)) return;\n    if (S.extras[key]) delete S.extras[key];\n    else S.extras[key] = { key: key, title: data.title, price: data.price, variantId: data.variantId, handle: data.handle };\n    var def = EXTRA_DEFS.filter(function (x) { return x.key === key; })[0];\n    var box = $('[data-ff-extras]');\n    if (box && def) {\n      var old = box.querySelector('[data-ff-xtra=\"' + key + '\"]');\n      if (old) {\n        var tmp = document.createElement('div');\n        tmp.innerHTML = extraCardHtml(def);\n        old.replaceWith(tmp.firstChild);\n        var again = box.querySelector('[data-ff-xtra=\"' + key + '\"]');\n        if (again) again.focus();\n      }\n    }\n    var btn = $('[data-ff-extras-btn]');\n    if (btn) btn.textContent = extrasList().length ? 'Weiter mit Extras' : 'Ohne Extras weiter';\n    updateTotals();\n  }\n\n  /* \u2014 step: method (Abgabe) \u2014 */\n  function isScooterCat() {\n    var cat = (S.model && catById(S.model.catId)) || S.cat;\n    return !!(cat && (cat.id === 'escooter' || cat.noSend || cat.key === 'escooter'));\n  }\n  function isWheelSendItem(it) {\n    var blob = norm((it && (it.handle || '')) + ' ' + (it && (it.title || '')) + ' ' + (it && (it.group || '')) + ' ' + (it && (it.variantTitle || '')));\n    return /rad einsenden/.test(blob);\n  }\n  function isWheelSendOnly() {\n    var keys = Object.keys(S.sel);\n    if (!keys.length) return false;\n    for (var i = 0; i < keys.length; i++) {\n      if (!isWheelSendItem(S.sel[keys[i]])) return false;\n    }\n    return true;\n  }\n  function methodMeta(id, model) {\n    var cat = (model && catById(model.catId)) || (S.model && catById(S.model.catId)) || S.cat;\n    var scooter = cat && (cat.id === 'escooter' || cat.noSend || cat.key === 'escooter');\n    if (scooter && isWheelSendOnly() && METHODS_WHEEL[id]) return METHODS_WHEEL[id];\n    if (scooter && METHODS_SCOOTER[id]) return METHODS_SCOOTER[id];\n    return METHODS[id] || { label: id, title: id, text: '', img: 'visit' };\n  }\n  function methodsFor() {\n    var cat = (S.model && catById(S.model.catId)) || S.cat;\n    var list = (cat && cat.methods) ? cat.methods.slice() : ['send', 'visit'];\n    if (isScooterCat()) {\n      if (isWheelSendOnly()) {\n        list = ['send', 'visit', 'pickup'];\n      } else {\n        list = list.filter(function (id) { return id !== 'send'; });\n        if (list.indexOf('visit') < 0) list.unshift('visit');\n        if (list.indexOf('pickup') < 0) list.push('pickup');\n      }\n    }\n    return list;\n  }\n  function viewMethod() {\n    S.step = 'method';\n    S.loc = null;\n    var wheel = isWheelSendOnly();\n    if (S.method === 'send' && isScooterCat() && !wheel) S.method = null;\n    var list = methodsFor();\n    var cards = list.map(function (id) {\n      var m = methodMeta(id);\n      return '<button type=\"button\" class=\"ff-method\" data-ff-method=\"' + id + '\">' +\n        '<span class=\"ff-method__img\">' + img(CFG.ri[m.img], '', '', 96, 96) + '</span>' +\n        '<span class=\"ff-method__t\"><strong>' + esc(m.title) + '</strong><span>' + esc(m.text) + '</span></span>' + SVG.chev + '</button>';\n    }).join('');\n    var heading = wheel ? 'Wie kommt das Rad zu uns?' : (isScooterCat() ? 'Wie kommt der Scooter zu uns?' : 'Wie kommt das Ger\u00E4t zu uns?');\n    var note = wheel\n      ? '<p class=\"ff-note\">Nur das demontierte Rad \u2013 nicht den Scooter. Muttern, Distanzscheiben und Abdeckkappen bitte bei sich behalten.</p>'\n      : (isScooterCat()\n        ? '<p class=\"ff-note\">E-Scooter d\u00FCrfen wir nicht einsenden. Zu gro\u00DF, zu schwer, Lithium-Akku. Vorbeibringen oder Abholservice.</p>'\n        : '');\n    setBody('<div class=\"ff-fwrap ff-fwrap--narrow\"><h2 class=\"ff-h\">' + heading + '</h2>' + note + '<div class=\"ff-methods\">' + cards + '</div>' +\n      '</div>', false);\n    frame();\n  }\n  function viewPlace() {\n    S.step = 'place';\n    var list = visitLocs();\n    if (list.length <= 1) {\n      S.loc = list[0] || null;\n      return goDetails();\n    }\n    var remembered = rememberedLocId();\n    if (!S.loc && remembered) {\n      for (var i = 0; i < list.length; i++) if (list[i].id === remembered) S.loc = list[i];\n    }\n    var cards = list.map(function (l) {\n      var on = S.loc && S.loc.id === l.id;\n      var hours = l.hours ? String(l.hours).replace(/\\n/g, ' \u00B7 ') : '';\n      var dist = (typeof l.dist === 'number') ? '<em class=\"ff-locdist\">ca. ' + String(l.dist).replace('.', ',') + ' km</em>' : '';\n      return '<button type=\"button\" class=\"ff-method' + (on ? ' is-on' : '') + '\" data-ff-loc=\"' + esc(l.id) + '\">' +\n        '<span class=\"ff-method__img\">' + img(CFG.ri.visit, '', '', 96, 96) + '</span>' +\n        '<span class=\"ff-method__t\"><strong>' + esc(l.label || l.name) + '</strong>' +\n        '<span>' + esc(l.street) + '<br>' + esc(l.zipcity) + (hours ? '<br>' + esc(hours) : '') + dist + '</span></span>' + SVG.chev + '</button>';\n    }).join('');\n    var near = (navigator.geolocation) ? '<div class=\"ff-actions\"><button type=\"button\" class=\"ff-btn-ghost\" data-ff-near>N\u00E4chsten Standort vorschlagen</button><p class=\"ff-note ff-note--sm\">Nur auf Ihren Klick \u2013 wir fragen den Standort nicht automatisch ab.</p></div>' : '';\n    setBody('<div class=\"ff-fwrap ff-fwrap--narrow\"><h2 class=\"ff-h\">An welchen Standort m\u00F6chten Sie kommen?</h2>' +\n      '<p class=\"ff-lead\">Werkstatt Erftstadt im K\u00F6lner Umland \u2013 w\u00E4hlen Sie, was n\u00E4her oder praktischer ist.</p>' +\n      '<div class=\"ff-methods\">' + cards + '</div>' + near + '</div>', false);\n    frame();\n  }\n  function pickNear() {\n    if (!navigator.geolocation) return;\n    var btn = $('[data-ff-near]');\n    if (btn) { btn.disabled = true; btn.textContent = 'Suche den n\u00E4chsten Standort \u2026'; }\n    navigator.geolocation.getCurrentPosition(function (pos) {\n      var list = visitLocs();\n      list.forEach(function (l) {\n        var lat = parseFloat(l.lat), lng = parseFloat(l.lng);\n        if (!isNaN(lat) && !isNaN(lng)) l.dist = haversine(pos.coords.latitude, pos.coords.longitude, lat, lng);\n      });\n      list.sort(function (a, b) { return (a.dist || 9999) - (b.dist || 9999); });\n      if (list[0]) S.loc = list[0];\n      viewPlace();\n    }, function () {\n      if (btn) { btn.disabled = false; btn.textContent = 'Standort nicht verf\u00FCgbar \u2013 bitte manuell w\u00E4hlen'; }\n    }, { enableHighAccuracy: false, timeout: 8000, maximumAge: 300000 });\n  }\n\n  /* \u2014 step: details (Kontakt) \u2014 */\n  function field(id, label, type, val, ph, auto, req) {\n    return '<label class=\"ff-field\"><span>' + label + (req ? ' <em>*</em>' : '') + '</span><input type=\"' + type + '\" data-ff-c=\"' + id + '\"' +\n      (auto ? ' autocomplete=\"' + auto + '\"' : '') + (ph ? ' placeholder=\"' + esc(ph) + '\"' : '') + (req ? ' required' : '') + ' value=\"' + esc(val || '') + '\"></label>';\n  }\n  function isLockAsk(model) {\n    if (!model) return false;\n    var cat = String(model.catId || '');\n    if (cat === 'phone' || cat === 'tablet' || cat === 'laptop') return true;\n    var blob = norm((model.vendor || '') + ' ' + (model.name || ''));\n    return /\\b(iphone|ipad|macbook|notebook|laptop|galaxy tab)\\b/.test(blob);\n  }\n  function isAndroidModel(model) {\n    if (!isLockAsk(model)) return false;\n    var blob = norm((model.vendor || '') + ' ' + (model.name || ''));\n    if (/\\b(apple|iphone|ipad|ipod|imac|macbook|surface)\\b/.test(blob)) return false;\n    var cat = String(model.catId || '');\n    if (cat === 'laptop') return false;\n    if (cat === 'phone' || cat === 'tablet') return true;\n    return false;\n  }\n  function hasUnlock(d) {\n    return !!(d && (d.code || (d.pattern && d.pattern.length)));\n  }\n  function lockNoteHtml() {\n    var href = SHOP.privacyUrl || '/pages/datenschutz';\n    return '<aside class=\"ff-locknote\">' +\n      '<strong>Datenschutz</strong>' +\n      '<p>Code oder Muster brauchen wir nur, um nach der Reparatur zu pr\u00FCfen, ob alles geht. Nicht zum Durchsuchen Ihrer Daten, nicht f\u00FCr Werbung \u2013 nur f\u00FCr diesen Auftrag.</p>' +\n      '<p>Ohne Code k\u00F6nnen wir das Ger\u00E4t nicht entsperren. Dann m\u00FCssen wir es einschalten und einen Funktionstest machen: Display, Touch, Kamera, Tasten, Laden.</p>' +\n      '<p><a href=\"' + esc(href) + '\" target=\"_blank\" rel=\"noopener\">Datenschutzerkl\u00E4rung</a></p>' +\n      '</aside>';\n  }\n  function lockFieldsHtml() {\n    if (!isLockAsk(S.model)) return '';\n    return '<div class=\"ff-lockask\">' +\n      '<p class=\"ff-lockask__kicker\">Zugang zum Ger\u00E4t</p>' +\n      '<label class=\"ff-field\"><span>Ger\u00E4tecode / PIN (optional)</span><input type=\"text\" autocomplete=\"off\" data-ff-code placeholder=\"z. B. 1234\" value=\"' + esc(S.code) + '\"></label>' +\n      patternHtml() +\n      lockNoteHtml() +\n      '</div>';\n  }\n  function parsePatternText(s) {\n    var seen = {};\n    var out = [];\n    String(s || '').replace(/[1-9]/g, function (ch) {\n      if (!seen[ch]) { seen[ch] = true; out.push(+ch); }\n      return ch;\n    });\n    return out;\n  }\n  function formatPattern(arr) {\n    return (arr || []).join(' \u2013 ');\n  }\n  function patternHtml() {\n    if (!isAndroidModel(S.model)) return '';\n    if (!S.pattern) S.pattern = [];\n    var cells = '';\n    for (var i = 1; i <= 9; i++) {\n      cells += '<span class=\"ff-pat__dot' + (S.pattern.indexOf(i) > -1 ? ' is-on' : '') + '\" data-ff-dot=\"' + i + '\"></span>';\n    }\n    return '<div class=\"ff-field ff-pat\" data-ff-pattern>' +\n      '<span>Sperrmuster (optional)</span>' +\n      '<p class=\"ff-pat__hint\">Nur bei Android. Verbinden Sie die Punkte wie auf dem Handy \u2013 dann k\u00F6nnen wir das Ger\u00E4t \u00F6ffnen.</p>' +\n      '<div class=\"ff-pat__box\">' +\n        '<svg class=\"ff-pat__lines\" data-ff-pat-lines viewBox=\"0 0 100 100\" aria-hidden=\"true\"></svg>' +\n        '<div class=\"ff-pat__grid\" role=\"img\" aria-label=\"Sperrmuster, neun Punkte\">' + cells + '</div>' +\n      '</div>' +\n      '<p class=\"ff-pat__out\" data-ff-pattern-out>' + (S.pattern.length ? 'Muster: ' + formatPattern(S.pattern) : '') + '</p>' +\n      '<button type=\"button\" class=\"ff-pat__clear\" data-ff-pat-clear' + (S.pattern.length ? '' : ' hidden') + '>Muster l\u00F6schen</button>' +\n      '<label class=\"ff-pat__type\"><span class=\"ff-sr\">Sperrmuster als Zahlen</span>' +\n        '<input type=\"text\" inputmode=\"numeric\" autocomplete=\"off\" data-ff-pattern-text placeholder=\"Oder als Zahlen: 1-2-5-8-9\" value=\"' + esc(S.pattern.join('-')) + '\">' +\n      '</label></div>';\n  }\n  function paintPattern(skipText) {\n    var box = $('[data-ff-pattern]');\n    if (!box) return;\n    if (!S.pattern) S.pattern = [];\n    $$('[data-ff-dot]', box).forEach(function (d) {\n      d.classList.toggle('is-on', S.pattern.indexOf(+d.getAttribute('data-ff-dot')) > -1);\n    });\n    var out = $('[data-ff-pattern-out]');\n    if (out) out.textContent = S.pattern.length ? 'Muster: ' + formatPattern(S.pattern) : '';\n    var clr = $('[data-ff-pat-clear]');\n    if (clr) clr.hidden = !S.pattern.length;\n    var svg = $('[data-ff-pat-lines]');\n    if (svg) {\n      var pts = S.pattern.map(function (n) {\n        var col = (n - 1) % 3;\n        var row = Math.floor((n - 1) / 3);\n        return (16.666 + col * 33.333) + ',' + (16.666 + row * 33.333);\n      });\n      svg.innerHTML = pts.length > 1\n        ? '<polyline points=\"' + pts.join(' ') + '\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>'\n        : '';\n    }\n    if (!skipText) {\n      var tx = $('[data-ff-pattern-text]');\n      if (tx) tx.value = S.pattern.join('-');\n    }\n  }\n  function bindPatternPad() {\n    var box = $('[data-ff-pattern]');\n    if (!box) return;\n    var drawing = false;\n    function hitDot(x, y) {\n      var list = $$('[data-ff-dot]', box);\n      for (var i = 0; i < list.length; i++) {\n        var r = list[i].getBoundingClientRect();\n        var pad = Math.min(r.width, r.height) * 0.42;\n        var cx = (r.left + r.right) / 2;\n        var cy = (r.top + r.bottom) / 2;\n        if (Math.abs(x - cx) <= pad && Math.abs(y - cy) <= pad) return list[i];\n      }\n      return null;\n    }\n    function addDot(el) {\n      if (!el) return;\n      var n = +el.getAttribute('data-ff-dot');\n      if (!n || S.pattern.indexOf(n) !== -1) return;\n      S.pattern.push(n);\n      paintPattern();\n    }\n    box.addEventListener('pointerdown', function (e) {\n      if (e.target.closest('[data-ff-pat-clear]') || e.target.closest('[data-ff-pattern-text]')) return;\n      drawing = true;\n      try { box.setPointerCapture(e.pointerId); } catch (err) { /* ignore */ }\n      if (e.cancelable) e.preventDefault();\n      addDot(hitDot(e.clientX, e.clientY) || e.target.closest('[data-ff-dot]'));\n    });\n    box.addEventListener('pointermove', function (e) {\n      if (!drawing) return;\n      addDot(hitDot(e.clientX, e.clientY));\n    });\n    box.addEventListener('pointerup', function () { drawing = false; });\n    box.addEventListener('pointercancel', function () { drawing = false; });\n    paintPattern();\n  }\n  function viewDetails() {\n    S.step = 'details';\n    var c = S.contact;\n    var pick = S.method === 'pickup';\n    var send = S.method === 'send';\n    setBody(\n      '<div class=\"ff-fwrap ff-fwrap--narrow\"><h2 class=\"ff-h\">Ihre Kontaktdaten</h2>' +\n      '<p class=\"ff-lead\">' + (pick ? 'Wir rufen Sie an, um Abholtermin und Gebiet abzustimmen. Die E-Mail brauchen wir f\u00FCr den Reparatur-Status.' : send ? 'Den Link zur Label-Erstellung und den Reparatur-Status senden wir an Ihre E-Mail-Adresse.' : 'Die E-Mail brauchen wir, damit Sie den Reparatur-Status verfolgen k\u00F6nnen.') + '</p>' +\n      field('name', 'Name', 'text', c.name, '', 'name', true) +\n      field('email', 'E-Mail', 'email', c.email, '', 'email', true) +\n      field('phone', 'Telefon', 'tel', c.phone, '', 'tel', pick) +\n      (pick ?\n        field('street', 'Stra\u00DFe und Hausnummer (Abholadresse)', 'text', c.street, '', 'street-address', true) +\n        '<div class=\"ff-row2\">' + field('zip', 'PLZ', 'text', c.zip, '', 'postal-code', true) + field('city', 'Ort', 'text', c.city, '', 'address-level2', true) + '</div>'\n        : '') +\n      '<label class=\"ff-field\"><span>Was ist passiert? (optional)</span><textarea rows=\"3\" data-ff-problem placeholder=\"Kurz in eigenen Worten\">' + esc(S.problem) + '</textarea></label>' +\n      (send && isWheelSendOnly() ? '<p class=\"ff-note\">Bitte nur das nackte Rad verpacken \u2013 ohne Achsmutter, Distanzscheiben oder Abdeckkappen.</p>' : '') +\n      lockFieldsHtml() +\n      (S.method === 'visit' ? '<p class=\"ff-note ff-note--sm\">Werkstatt: ' + esc(locAddress(S.loc)) + (S.loc && S.loc.appt ? ' \u00B7 <a href=\"' + esc(S.loc.appt) + '\" target=\"_blank\" rel=\"noopener\">Termin vereinbaren</a>' : (SHOP.appointmentUrl ? ' \u00B7 <a href=\"' + esc(SHOP.appointmentUrl) + '\" target=\"_blank\" rel=\"noopener\">Termin vereinbaren</a>' : '')) + '</p>' : '') +\n      '<p class=\"ff-error\" data-ff-error hidden role=\"alert\"></p>' +\n      '<div class=\"ff-actions\"><button type=\"button\" class=\"ff-btn-main\" data-ff-tosummary>Weiter zur Zusammenfassung</button></div></div>',\n      false\n    );\n    bindPatternPad();\n    frame();\n  }\n  function readContact() {\n    $$('[data-ff-c]').forEach(function (i) { S.contact[i.getAttribute('data-ff-c')] = i.value.trim(); });\n    var p = $('[data-ff-problem]'); if (p) S.problem = p.value.trim();\n    var c = $('[data-ff-code]'); if (c) S.code = c.value.trim();\n    saveContact();\n  }\n  function validateContact() {\n    var c = S.contact;\n    var m = S.method;\n    if (!c.name) return 'Bitte geben Sie Ihren Namen an.';\n    if (!c.email) return 'Bitte geben Sie Ihre E-Mail-Adresse an \u2013 so verfolgen Sie den Reparatur-Status.';\n    if (!/^[^@\\s]+@[^@\\s]+\\.[^@\\s]+$/.test(c.email)) return 'Die E-Mail-Adresse sieht nicht vollst\u00E4ndig aus.';\n    if (m === 'pickup') {\n      if (!c.phone) return 'F\u00FCr den Abholservice brauchen wir Ihre Telefonnummer.';\n      if (!c.street || !c.zip || !c.city) return 'Bitte geben Sie die vollst\u00E4ndige Abholadresse an.';\n    }\n    return '';\n  }\n\n  /* \u2014 step: summary \u2014 */\n  function lineHtml(d) {\n    var rows = d.items.map(function (i) {\n      var lab = i.title || '';\n      if (i.variantTitle && i.variantTitle !== 'Default Title' && lab.indexOf(i.variantTitle) < 0) lab += ' \u2013 ' + i.variantTitle;\n      if (itemQty(i) > 1) lab += ' \u00B7 beide R\u00E4der';\n      return '<li><span>' + esc(lab) + '</span><b>' + money(charge(i).price) + '</b></li>';\n    }).join('');\n    rows += (d.extras || []).map(function (x) { return '<li class=\"ff-sum__extra\"><span>+ ' + esc(x.title) + '</span><b>' + money(x.price) + '</b></li>'; }).join('');\n    if (isLockAsk(d.model)) {\n      if (d.code) rows += '<li><span>Ger\u00E4tecode</span><b>' + esc(d.code) + '</b></li>';\n      if (d.pattern && d.pattern.length) rows += '<li><span>Sperrmuster</span><b>' + esc(formatPattern(d.pattern)) + '</b></li>';\n      if (!hasUnlock(d)) rows += '<li><span>Zugang</span><b>Kein Code \u2013 Funktionstest</b></li>';\n    }\n    var sub = 0; d.items.forEach(function (i) { sub += charge(i).price; }); (d.extras || []).forEach(function (x) { sub += x.price; });\n    return '<section class=\"ff-sumdev\"><header>' + visual(d.model.img, d.model.name, d.model.catId, 'ff-sumdev__img') +\n      '<div><strong>' + esc(d.model.name) + '</strong><span>' + esc(methodMeta(d.method, d.model).label) + (d.method === 'visit' && d.loc ? ' \u00B7 ' + esc(d.loc.label || d.loc.name) : '') + '</span></div><b>' + money(sub) + '</b></header><ul class=\"ff-sum\">' + rows + '</ul></section>';\n  }\n  /* Widerrufsrecht: ausdr\u00FCckliches Verlangen, vor Ablauf der Widerrufsfrist zu beginnen (\u00A7 356 Abs. 4 BGB) */\n  function withdrawConsentHtml() {\n    var terms = SHOP.termsUrl || '/policies/terms-of-service';\n    var refund = SHOP.refundUrl || '/policies/refund-policy';\n    var name = esc(SHOP.name || 'FixFabrik');\n    return '<label class=\"ff-partmodal__check ff-sum-consent\">' +\n      '<input type=\"checkbox\" data-ff-withdraw' + (S.withdraw ? ' checked' : '') + '> ' +\n      '<span>Ich verlange ausdr\u00FCcklich, dass ' + name + ' vor Ablauf der Widerrufsfrist mit der Reparatur beginnt. ' +\n      'Mir ist bekannt, dass ich mein Widerrufsrecht verliere, sobald die Reparatur vollst\u00E4ndig erbracht ist. ' +\n      'Es gelten die <a href=\"' + esc(terms) + '\" target=\"_blank\" rel=\"noopener\">AGB</a>; ' +\n      'die <a href=\"' + esc(refund) + '\" target=\"_blank\" rel=\"noopener\">Widerrufsbelehrung</a> habe ich gelesen.</span></label>';\n  }\n  function viewSummary() {\n    S.step = 'summary';\n    var cur = { model: S.model, items: Object.keys(S.sel).map(function (k) { return S.sel[k]; }), extras: extrasList(), method: S.method, loc: S.loc, code: S.code, pattern: (S.pattern || []).slice() };\n    var devs = S.queue.concat([cur]);\n    var c = S.contact;\n    var addr = S.method === 'pickup' ? '<li><span>Abholadresse</span><b>' + esc(c.street + ', ' + c.zip + ' ' + c.city) + '</b></li>' : '';\n    var locLine = (S.method === 'visit' && S.loc) ? '<li><span>Standort</span><b>' + esc(locAddress(S.loc)) + '</b></li>' : '';\n    setBody(\n      '<div class=\"ff-fwrap ff-fwrap--narrow\"><h2 class=\"ff-h\">Bitte pr\u00FCfen Sie Ihre Angaben</h2>' +\n      devs.map(lineHtml).join('') +\n      '<ul class=\"ff-sum ff-sum--contact\"><li><span>Name</span><b>' + esc(c.name) + '</b></li>' +\n      (c.phone ? '<li><span>Telefon</span><b>' + esc(c.phone) + '</b></li>' : '') +\n      (c.email ? '<li><span>E-Mail</span><b>' + esc(c.email) + '</b></li>' : '') + addr + locLine +\n      (S.problem ? '<li><span>Problem</span><b>' + esc(S.problem) + '</b></li>' : '') + '</ul>' +\n      acceptedNoticesHtml(devs) +\n      lockSummaryHtml(devs) +\n      (diagFor(S.model && S.model.catId) ? '<p class=\"ff-note\">' + esc(diagFor(S.model.catId)) + '</p>' : '') +\n      '<ul class=\"ff-sum\"><li class=\"ff-sum__total\"><span>Gesamt inkl. MwSt.</span><b>' + money(total() + queueTotal()) + '</b></li></ul>' +\n      '<p class=\"ff-note ff-note--sm\">Kein Warenkorb. Als N\u00E4chstes bezahlen Sie sicher im Shopify-Checkout. Diagnoseregelung und Teilehinweise stehen in der Auftragsbest\u00E4tigung.</p>' +\n      withdrawConsentHtml() +\n      '<p class=\"ff-error\" data-ff-error hidden role=\"alert\"></p>' +\n      '<div class=\"ff-actions\"><button type=\"button\" class=\"ff-btn-main\" data-ff-cart>Jetzt bezahlen</button>' +\n      '<button type=\"button\" class=\"ff-btn-ghost\" data-ff-another>Weiteres Ger\u00E4t hinzuf\u00FCgen</button></div></div>',\n      false\n    );\n    frame();\n  }\n\n  function lockSummaryHtml(devs) {\n    var lockDevs = (devs || []).filter(function (d) { return isLockAsk(d.model); });\n    if (!lockDevs.length) return '';\n    var missing = lockDevs.some(function (d) { return !hasUnlock(d); });\n    var href = SHOP.privacyUrl || '/pages/datenschutz';\n    if (missing) {\n      return '<p class=\"ff-note\">Kein Code hinterlegt: Wir schalten das Ger\u00E4t ein und f\u00FChren einen Funktionstest durch. Einen Code nutzen wir nur zur Pr\u00FCfung der Reparatur \u2013 <a href=\"' + esc(href) + '\" target=\"_blank\" rel=\"noopener\">Datenschutz</a>.</p>';\n    }\n    return '<p class=\"ff-note\">Den Ger\u00E4tecode nutzen wir nur zur Pr\u00FCfung der Reparatur, nicht zum Durchsuchen Ihrer Daten. <a href=\"' + esc(href) + '\" target=\"_blank\" rel=\"noopener\">Datenschutz</a></p>';\n  }\n  function acceptedNoticesHtml(devs) {\n    var seen = {};\n    var list = [];\n    (devs || []).forEach(function (d) {\n      (d.items || []).forEach(function (it) {\n        if (it.notice && !seen[it.notice]) {\n          seen[it.notice] = true;\n          list.push(it.notice);\n        }\n      });\n    });\n    if (!list.length) return '';\n    return '<div class=\"ff-sum-notice\"><strong>Akzeptierte Hinweise</strong>' +\n      list.map(function (t) { return '<p>' + esc(t) + '</p>'; }).join('') + '</div>';\n  }\n  function commitCurrent() {\n    var items = Object.keys(S.sel).map(function (k) { return S.sel[k]; });\n    if (!items.length) return;\n    S.queue.push({ model: S.model, items: items, extras: extrasList(), method: S.method, loc: S.loc, problem: S.problem, code: S.code, pattern: (S.pattern || []).slice() });\n    S.sel = {};\n    S.extras = {};\n    S.problem = '';\n    S.code = '';\n    S.pattern = [];\n  }\n  function addToCart() {\n    var wd = $('[data-ff-withdraw]');\n    S.withdraw = !!(wd && wd.checked);\n    if (!S.withdraw) {\n      var er0 = $('[data-ff-error]');\n      if (er0) { er0.hidden = false; er0.textContent = 'Bitte best\u00E4tigen Sie, dass wir vor Ablauf der Widerrufsfrist mit der Reparatur beginnen sollen. Ohne diese Best\u00E4tigung k\u00F6nnen wir die Reparatur nicht annehmen.'; }\n      if (wd) wd.focus();\n      return;\n    }\n    var withdrawStamp = 'Ja \u2013 ' + new Date().toISOString();\n    var btn = $('[data-ff-cart]');\n    if (btn) { btn.disabled = true; btn.textContent = 'Wird hinzugef\u00FCgt \u2026'; }\n    commitCurrent();\n    var c = S.contact;\n    var lines = [];\n    S.queue.forEach(function (d) {\n      var diag = diagFor(d.model.catId);\n      var devLines = [];\n      var xLines = [];\n      d.items.forEach(function (it) {\n        var props = {\n          'Ger\u00E4t': (d.model.vendor && d.model.name.toLowerCase().indexOf(d.model.vendor.toLowerCase()) < 0 ? d.model.vendor + ' ' : '') + d.model.name,\n          'Reparatur': it.title,\n          'Abgabe': methodMeta(d.method, d.model).label,\n          'Kunde': c.name,\n          '_Diagnoseregelung': diag,\n          'Beginn vor Ablauf Widerrufsfrist verlangt': withdrawStamp\n        };\n        if (d.method === 'visit' && d.loc) props['Standort'] = locAddress(d.loc);\n        if (d.method === 'send' && locPref('send')) props['Einsendeadresse'] = locAddress(locPref('send'));\n        if (c.phone) props['Telefon'] = c.phone;\n        props['E-Mail'] = c.email;\n        if (d.method === 'pickup') props['Abholadresse'] = c.street + ', ' + c.zip + ' ' + c.city;\n        if (d.problem) props['Problem'] = d.problem;\n        if (isLockAsk(d.model)) {\n          if (d.code) props['Ger\u00E4tecode'] = d.code;\n          if (d.pattern && d.pattern.length) props['Sperrmuster'] = d.pattern.join('-');\n          if (!hasUnlock(d)) props['Funktionstest'] = 'Ja \u2013 kein Code hinterlegt';\n        }\n        if (it.notice) {\n          props['Hinweis best\u00E4tigt'] = 'Ja';\n          props['Teilehinweis'] = it.notice;\n        }\n        var ch = charge(it);\n        if (itemQty(it) > 1) props['R\u00E4der'] = 'Beide';\n        devLines.push({ id: ch.id, quantity: ch.qty, properties: props });\n      });\n      (d.extras || []).forEach(function (x) {\n        var xp = {\n          'Ger\u00E4t': (d.model.vendor && d.model.name.toLowerCase().indexOf(d.model.vendor.toLowerCase()) < 0 ? d.model.vendor + ' ' : '') + d.model.name,\n          'Zusatzleistung zu': d.items.map(function (it) { return it.title; }).join(', '),\n          'Abgabe': methodMeta(d.method, d.model).label,\n          'Kunde': c.name,\n          'E-Mail': c.email,\n          'Beginn vor Ablauf Widerrufsfrist verlangt': withdrawStamp\n        };\n        if (c.phone) xp['Telefon'] = c.phone;\n        xLines.push({ id: x.variantId, quantity: 1, properties: xp });\n      });\n      /* Shopify zeigt zuletzt Hinzugef\u00FCgtes oben: Extras zuerst, damit die Reparatur im Warenkorb vorne steht. */\n      lines = lines.concat(xLines, devLines);\n    });\n    fetch('/cart/add.js', {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json', Accept: 'application/json' },\n      body: JSON.stringify({ items: lines })\n    }).then(function (r) {\n      return r.json().then(function (j) { if (!r.ok) throw new Error(j.description || j.message || 'Fehler'); return j; });\n    }).then(function () {\n      // Kontakt auch als Warenkorb-Attribute, damit er in der Bestellung sichtbar ist (nicht kritisch)\n      var attrs = { 'Kunde': c.name, 'Beginn vor Ablauf Widerrufsfrist verlangt': withdrawStamp };\n      if (c.phone) attrs['Telefon'] = c.phone;\n      if (c.email) attrs['E-Mail'] = c.email;\n      if (S.queue.some(function (d) { return d.items.some(function (it) { return !!it.notice; }); })) {\n        attrs['Teilehinweis best\u00E4tigt'] = 'Ja';\n      }\n      return fetch('/cart/update.js', {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json', Accept: 'application/json' },\n        body: JSON.stringify({ attributes: attrs })\n      }).catch(function () { /* ignore */ });\n    }).then(function () {\n      var root = (window.Shopify && window.Shopify.routes && window.Shopify.routes.root) || '/';\n      window.location.href = root.replace(/\\/?$/, '/') + 'checkout';\n    }).catch(function (e) {\n      var last = S.queue.pop();\n      if (last) {\n        S.model = last.model;\n        S.method = last.method;\n        S.loc = last.loc || null;\n        S.sel = {};\n        last.items.forEach(function (it, i) { S.sel['k' + i] = it; });\n        S.extras = {};\n        (last.extras || []).forEach(function (x) { S.extras[x.key] = x; });\n        S.problem = last.problem;\n        S.code = last.code;\n        S.pattern = last.pattern || [];\n      }\n      viewSummary();\n      var er = $('[data-ff-error]');\n      if (er) { er.hidden = false; er.textContent = 'Die Bestellung konnte nicht vorbereitet werden: ' + (e && e.message ? e.message : 'Bitte erneut versuchen oder uns anrufen: ' + SHOP.phone); }\n    });\n  }\n\n  /* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 navigation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n  function pickModel(m) {\n    if (!m) return;\n    if (m.service) S.wantService = m.service;\n    var cat = catById(m.catId) || S.cat;\n    if (m.vendor && norm(m.name) === norm(m.vendor) && cat) {\n      S.cat = cat;\n      S.brand = m.vendor;\n      return viewModels(cat, m.vendor);\n    }\n    S.model = { name: canonType(m.name, m.vendor) || m.name, vendor: m.vendor, img: m.img, catId: m.catId };\n    S.cat = cat || catById(m.catId) || S.cat;\n    S.brand = m.vendor || S.brand;\n    S.pattern = [];\n    S.extras = {};\n    if (!isLockAsk(S.model)) S.code = '';\n    viewRepair();\n  }\n  function goBack() {\n    switch (S.step) {\n      case 'brand': return viewDevice();\n      case 'model':\n        if (S.cat && S.catData[S.cat.id] && S.catData[S.cat.id].vendorsList && (S.catData[S.cat.id].vendorsList.length > 1 || (S.cat.extras && S.cat.extras.length))) return viewBrand(S.cat);\n        return viewDevice();\n      case 'request':\n        if (S.cat && S.cat.mode === 'catalog' && S.brand) return viewModels(S.cat, S.brand);\n        if (S.cat && S.cat.mode === 'catalog') return viewBrand(S.cat);\n        return viewDevice();\n      case 'repair':\n        if (S.cat && S.brand && S.cat.mode === 'catalog') return viewModels(S.cat, S.brand);\n        return viewDevice();\n      case 'method': return paintRepairStep();\n      case 'place': return viewMethod();\n      case 'extras':\n        if (S.method === 'visit' && visitLocs().length > 1) return viewPlace();\n        return S.preMethod ? paintRepairStep() : viewMethod();\n      case 'details':\n        if (extrasAvailable().length) return viewExtras();\n        if (S.method === 'visit' && visitLocs().length > 1) return viewPlace();\n        return S.preMethod ? paintRepairStep() : viewMethod();\n      case 'summary': return viewDetails();\n      default: return viewDevice();\n    }\n  }\n  function paintRepairStep() {\n    S.step = 'repair';\n    frame();\n    paintRepair();\n  }\n\n  /* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 open / close \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n  function open(opts) {\n    opts = opts || {};\n    if (!S.open) {\n      lastFocus = document.activeElement;\n      S.open = true;\n      shell();\n      root.hidden = false;\n      document.documentElement.classList.add('ff-flow-lock');\n      if (location.hash !== HASH) {\n        try { history.pushState({ ffFlow: 1 }, '', HASH); pushed = true; } catch (e) { /* ignore */ }\n      }\n    }\n    S.query = opts.query || '';\n    S.focusSearch = !!opts.focusSearch;\n    if (opts.service) S.wantService = typeof opts.service === 'string' ? serviceFromAttr(opts.service) : opts.service;\n    S.preMethod = opts.method && METHODS[opts.method] ? opts.method : null;\n    if (S.preMethod === 'send' && opts.cat === 'escooter') S.preMethod = null;\n    root.classList.toggle('ff-flow--senior', !!(opts.cat && catAny(opts.cat) && catAny(opts.cat).senior));\n    if (opts.model) {\n      var cat = opts.cat ? catAny(opts.cat) : null;\n      var mdl = { name: opts.model, vendor: opts.vendor || '', img: opts.img || '', catId: (cat || guessCat(opts.model, opts.vendor || '')).id };\n      S.cat = cat || catById(mdl.catId);\n      S.brand = mdl.vendor || null;\n      pickModel(mdl);\n      return;\n    }\n    if (opts.cat && opts.vendor) {\n      var brandCat = catAny(opts.cat);\n      if (brandCat) {\n        S.cat = brandCat;\n        return viewModels(brandCat, opts.vendor);\n      }\n    }\n    if (opts.cat) {\n      var c = catAny(opts.cat);\n      if (c) { enterClass(c); return; }\n    }\n    viewDevice();\n  }\n  function goHomeFromFlow() {\n    close();\n    document.body.classList.remove('ff-page-on');\n    try { history.replaceState(null, '', location.pathname + location.search); } catch (e) { /* ignore */ }\n    window.scrollTo(0, 0);\n    if (typeof window.FFGoHome === 'function') window.FFGoHome();\n  }\n  function close(fromPop) {\n    if (!S.open) return;\n    S.open = false;\n    root.hidden = true;\n    root.innerHTML = '';\n    document.documentElement.classList.remove('ff-flow-lock');\n    if (!fromPop && location.hash === HASH) {\n      try {\n        if (pushed) history.back();\n        else history.replaceState(null, '', location.pathname + location.search);\n      } catch (e) { /* ignore */ }\n    }\n    pushed = false;\n    if (lastFocus && lastFocus.focus) { try { lastFocus.focus(); } catch (e) { /* ignore */ } }\n  }\n\n  /* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 events \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n  function trapTab(e) {\n    if (e.key !== 'Tab') return;\n    var f = $$('a[href], button:not([disabled]), input, select, textarea, [tabindex=\"0\"]').filter(function (n) { return n.offsetParent !== null; });\n    if (!f.length) return;\n    var first = f[0];\n    var last = f[f.length - 1];\n    if (e.shiftKey && document.activeElement === first) { e.preventDefault(); last.focus(); }\n    else if (!e.shiftKey && document.activeElement === last) { e.preventDefault(); first.focus(); }\n  }\n  root.addEventListener('click', function (e) {\n    var t = e.target;\n    function hit(attr) { return t.closest('[' + attr + ']'); }\n    var el;\n    if (hit('data-ff-close')) return close();\n    if (hit('data-ff-home-flow')) return goHomeFromFlow();\n    if (hit('data-ff-back')) return goBack();\n    if (hit('data-ff-restart')) { S.query = ''; S.cat = null; S.brand = null; return viewDevice(); }\n    if (hit('data-ff-retry')) return viewRepair();\n    if (hit('data-ff-notlisted')) {\n      var dev = [S.brand, S.query].filter(Boolean).join(' ') || (S.cat ? S.cat.label : '');\n      return viewRequest({ device: dev });\n    }\n    if ((el = hit('data-ff-extra'))) {\n      var ex = S.cat && S.cat.extras && S.cat.extras[+el.getAttribute('data-ff-extra')];\n      return viewRequest({ device: ex ? ex.label : '' });\n    }\n    if ((el = hit('data-ff-cat'))) { return enterClass(catById(el.getAttribute('data-ff-cat'))); }\n    if ((el = hit('data-ff-brand'))) { return viewModels(S.cat, el.getAttribute('data-ff-brand')); }\n    if ((el = hit('data-ff-model'))) { return pickModel(modelList[+el.getAttribute('data-ff-model')]); }\n    if ((el = hit('data-ff-pick'))) { return pickModel(lastResults[+el.getAttribute('data-ff-pick')]); }\n    if (hit('data-ff-qclear')) { S.query = ''; var q = $('[data-ff-q]'); q.value = ''; q.focus(); runSearch(''); return; }\n    if ((el = hit('data-ff-tab'))) { S.tab = el.getAttribute('data-ff-tab'); return paintRepair(); }\n    if (t.closest('[data-ff-var]')) return;\n    if ((el = hit('data-ff-qty'))) {\n      var box = el.closest('[data-ff-wheels]');\n      var cqty = box && cardByKey(box.getAttribute('data-ff-wheels'));\n      if (cqty && S.sel[cqty.key]) {\n        S.sel[cqty.key].qty = el.getAttribute('data-ff-qty') === '2' ? 2 : 1;\n        stampCharge(S.sel[cqty.key], cqty);\n        afterSelChange();\n      }\n      return;\n    }\n    if (hit('data-ff-stop')) return;\n    if ((el = hit('data-ff-card'))) { return toggleCard(el.getAttribute('data-ff-card')); }\n    if ((el = hit('data-ff-series'))) {\n      modelFilter.series = el.getAttribute('data-ff-series');\n      $$('[data-ff-series]').forEach(function (b) { b.classList.toggle('is-on', b === el); });\n      return drawModels();\n    }\n    if (hit('data-ff-next')) {\n      if (!selCount()) return;\n      if (S.preMethod) { S.method = S.preMethod; return afterMethod(); }\n      return viewMethod();\n    }\n    if ((el = hit('data-ff-xtra'))) return toggleExtra(el.getAttribute('data-ff-xtra'));\n    if (hit('data-ff-extras-next')) return viewDetails();\n    if ((el = hit('data-ff-method'))) { S.method = el.getAttribute('data-ff-method'); return afterMethod(); }\n    if ((el = hit('data-ff-loc'))) {\n      var id = el.getAttribute('data-ff-loc');\n      var list = visitLocs();\n      for (var li = 0; li < list.length; li++) if (list[li].id === id) S.loc = list[li];\n      rememberLoc(id);\n      return goDetails();\n    }\n    if (hit('data-ff-near')) return pickNear();\n    if (hit('data-ff-pat-clear')) {\n      S.pattern = [];\n      paintPattern();\n      return;\n    }\n    if (hit('data-ff-tosummary')) {\n      readContact();\n      var msg = validateContact();\n      var er = $('[data-ff-error]');\n      if (msg) { er.hidden = false; er.textContent = msg; er.scrollIntoView({ block: 'center' }); return; }\n      return viewSummary();\n    }\n    if (hit('data-ff-another')) {\n      commitCurrent();\n      S.model = null; S.brand = null; S.query = ''; S.cat = null;\n      return viewDevice();\n    }\n    if (hit('data-ff-cart')) return addToCart();\n  });\n  root.addEventListener('keydown', function (e) {\n    if (e.key === 'Escape') {\n      e.preventDefault();\n      if (partModalOpen()) return closePartModal();\n      return close();\n    }\n    trapTab(e);\n    var card = e.target.closest && e.target.closest('[data-ff-card]');\n    if (card && (e.key === ' ' || e.key === 'Enter') && !e.target.closest('select')) {\n      e.preventDefault();\n      toggleCard(card.getAttribute('data-ff-card'));\n    }\n    if (e.key === 'Enter' && e.target.matches && e.target.matches('[data-ff-q]') && lastResults.length) {\n      e.preventDefault();\n      pickModel(lastResults[0]);\n    }\n  });\n  root.addEventListener('input', function (e) {\n    var t = e.target;\n    if (t.matches('[data-ff-q]')) {\n      S.query = t.value.trim();\n      runSearch(S.query);\n    } else if (t.matches('[data-ff-mfilter]')) {\n      modelFilter.q = t.value;\n      drawModels();\n    } else if (t.matches('[data-ff-req-device]')) {\n      S.request.device = t.value; refreshRequestLinks();\n    } else if (t.matches('[data-ff-req-problem]')) {\n      S.request.problem = t.value; refreshRequestLinks();\n    } else if (t.matches('[data-ff-req-name]')) {\n      S.contact.name = t.value; saveContact(); refreshRequestLinks();\n    } else if (t.matches('[data-ff-req-phone]')) {\n      S.contact.phone = t.value; saveContact(); refreshRequestLinks();\n    } else if (t.matches('[data-ff-problem]')) {\n      S.problem = t.value;\n    } else if (t.matches('[data-ff-code]')) {\n      S.code = t.value;\n    } else if (t.matches('[data-ff-pattern-text]')) {\n      S.pattern = parsePatternText(t.value);\n      paintPattern(true);\n    }\n  });\n  root.addEventListener('change', function (e) {\n    var sel = e.target.closest && e.target.closest('[data-ff-var]');\n    if (!sel) return;\n    var c = cardByKey(sel.getAttribute('data-ff-var'));\n    if (!c) return;\n    var prev = c.vi;\n    c.vi = +sel.value;\n    if (!S.sel[c.key]) {\n      drawCards();\n      updateTotals();\n      return;\n    }\n    var notice = partNotice(c);\n    if (notice && notice.kind === 'warn') {\n      showPartModal(notice, function () { applySelection(c, notice); }, function () {\n        c.vi = prev;\n        drawCards();\n      });\n      return;\n    }\n    applySelection(c, null);\n  });\n\n  document.addEventListener('click', function (e) {\n    if (e.defaultPrevented || e.button !== 0 || e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) return;\n    var el = e.target.closest && e.target.closest('[data-ff-open-flow]');\n    if (!el || root.contains(el)) return;\n    e.preventDefault();\n    if (el.hasAttribute('data-ff-popular')) {\n      var pm = el.__ffModel;\n      if (pm) open({ model: pm.name, vendor: pm.vendor, img: pm.img, query: '' });\n      else open({ query: el.getAttribute('data-ff-popular') || '' });\n      return;\n    }\n    open({\n      cat: el.getAttribute('data-ff-cat') || '',\n      model: el.getAttribute('data-ff-model') || '',\n      vendor: el.getAttribute('data-ff-vendor') || '',\n      img: el.getAttribute('data-ff-img') || '',\n      method: el.getAttribute('data-ff-method') || '',\n      query: el.getAttribute('data-ff-query') || '',\n      service: el.getAttribute('data-ff-service') || '',\n      focusSearch: el.hasAttribute('data-ff-focus-search')\n    });\n  });\n  document.addEventListener('keydown', function (e) {\n    if (e.key === 'Escape' && S.open && !root.contains(e.target)) close();\n  });\n  window.addEventListener('popstate', function () {\n    if (S.open && location.hash !== HASH) close(true);\n    else if (!S.open && location.hash === HASH) open({});\n  });\n\n  /* hero search (home): same predictive results, picks open the flow at the repair step */\n  function bindHeroSearch() {\n    $$('[data-ff-hero-search]', document).forEach(function (wrap) {\n      if (wrap.__ffBound) return;\n      wrap.__ffBound = true;\n      var input = wrap.querySelector('input');\n      var box = wrap.querySelector('[data-ff-hero-results]');\n      var results = [];\n      var seq = 0;\n      var run = debounce(function (q) {\n        var mine = ++seq;\n        if (!q) { box.hidden = true; box.innerHTML = ''; return; }\n        box.hidden = false;\n        box.innerHTML = '<div class=\"ff-results__empty\">Suche \u2026</div>';\n        S.query = q;\n        searchModels(q).then(function (list) {\n          if (mine !== seq) return;\n          results = list;\n          box.innerHTML = resultsHtml(list);\n        });\n      }, 160);\n      input.addEventListener('input', function () { run(input.value.trim()); });\n      input.addEventListener('keydown', function (e) {\n        if (e.key === 'Enter') {\n          e.preventDefault();\n          if (results.length) { open({ model: results[0].name, vendor: results[0].vendor, img: results[0].img, cat: results[0].catId, service: results[0].service }); box.hidden = true; }\n          else open({ query: input.value.trim() });\n        } else if (e.key === 'Escape') { box.hidden = true; }\n      });\n      box.addEventListener('click', function (e) {\n        if (e.target.closest('[data-ff-notlisted]')) {\n          box.hidden = true;\n          open({ query: input.value.trim() });\n          viewRequest({ device: input.value.trim() });\n          return;\n        }\n        var b = e.target.closest('[data-ff-pick]');\n        if (!b) return;\n        var m = results[+b.getAttribute('data-ff-pick')];\n        if (!m) return;\n        box.hidden = true;\n        open({ model: m.name, vendor: m.vendor, img: m.img, cat: m.catId, service: m.service });\n      });\n      var go = wrap.querySelector('[data-ff-hero-go]');\n      if (go) go.addEventListener('click', function () {\n        var v = input.value.trim();\n        if (results.length && v) open({ model: results[0].name, vendor: results[0].vendor, img: results[0].img, cat: results[0].catId, service: results[0].service });\n        else open({ query: v });\n      });\n      document.addEventListener('click', function (e) {\n        if (!wrap.contains(e.target)) box.hidden = true;\n      });\n    });\n  }\n\n  /* popular models (home): resolve real product images + exact model names, lazily and cached */\n  function hydratePopular() {\n    var els = $$('[data-ff-popular]', document).filter(function (el) { return !el.__ffHydrated; });\n    if (!els.length) return;\n    function sized(u) {\n      if (!u) return '';\n      u = u.replace(/^\\/\\//, 'https://');\n      return u + (u.indexOf('?') > -1 ? '&' : '?') + 'width=300';\n    }\n    function apply(el, m) {\n      if (!m) return;\n      el.__ffModel = m;\n      var holder = el.querySelector('[data-ff-pop-img]');\n      if (holder && m.img) {\n        holder.innerHTML = '<img src=\"' + esc(sized(m.img)) + '\" alt=\"' + esc(m.name) + '\" width=\"150\" height=\"150\" loading=\"lazy\">';\n      }\n    }\n    function one(el) {\n      el.__ffHydrated = true;\n      var name = el.getAttribute('data-ff-popular');\n      var key = 'pop:' + name;\n      var hit = cacheGet(key);\n      if (hit) { apply(el, hit); return Promise.resolve(); }\n      return suggest(name).then(function (arr) {\n        var nn = norm(name);\n        var best = null;\n        arr.forEach(function (x) { if (!best && norm(x.type || '') === nn) best = x; });\n        if (!best) return;\n        var m = { name: best.type, vendor: best.vendor || '', img: best.image || (best.featured_image && best.featured_image.url) || '' };\n        cacheSet(key, m);\n        apply(el, m);\n      });\n    }\n    var queue = els.slice();\n    function worker() {\n      var el = queue.shift();\n      if (!el) return;\n      one(el).then(worker, worker);\n    }\n    worker();\n    worker();\n  }\n\n  window.FixFabrikFlow = { open: open, close: close };\n\n  function boot() {\n    bindHeroSearch();\n    if (location.hash === HASH) open({});\n    (window.requestIdleCallback || function (fn) { setTimeout(fn, 400); })(hydratePopular);\n  }\n  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', boot);\n  else boot();\n  document.addEventListener('shopify:section:load', function () { bindHeroSearch(); hydratePopular(); });\n})();\n"],
  "mappings": "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",
  "names": ["i", "total", "root"]
}
