Station planen

Ihr Döner-Set in vier Schritten

Dönermesser, Dönergrill und Kontaktgrill zusammenstellen, Kreismesser und Zubehör ergänzen – rechts wächst Ihr Set mit. Für die Geräte erhalten Sie ein Angebot, Teile legen Sie direkt in den Warenkorb.

  1. 01Dönermesser
  2. 02Dönergrill
  3. 03Kontaktgrill
  4. 04Zubehör

01Dönermesser wählen

02Dönergrill wählen

03Kontaktgrill wählen

Zum Aufbacken und Toasten von Dönerbrot.

04Kreismesser und Zubehör

Kreismesser-Satz

Schneiden wählen und Vorrat festlegen. Je Schneide steht ein passendes Messer schon vorausgewählt.

Zubehör und Ersatzteile

Häufig mitbestellt für Ihr Set.

    (function () { var KNIVES = { devran: { label: 'DEVRAN', query: 'DEVRAN', dia: '80', ng: ['NG3', 'NG4 Master', 'NG5'] }, heran: { label: 'HERAN 2', query: 'HERAN', dia: '80', ng: ['NG3', 'NG4 Master'] }, seymen: { label: 'SEYMEN', query: 'SEYMEN', dia: '90', ng: ['NG3', 'NG4 Master', 'NG5'] }, saran: { label: 'SARAN', query: 'SARAN', dia: '80', ng: ['NG5'] } }; var EDGES = [{ key: 'glatt', label: 'Glatt' }, { key: 'gezahnt', label: 'Gezahnt' }, { key: 'gekerbt', label: 'Gekerbt' }]; var CAT_KNIFE = [84, 85, 86, 87, 88]; var CAT_GRILL = { 537: 'Gas, Untenantrieb', 78: 'Gas, Obenantrieb', 79: 'Elektro' }; var CAT_CONTACT = [94]; var CAT_GRILL_PARTS = [80]; var CAT_PARTS = [90, 350, 352]; var cache = {}; var S = { model: null, knife: null, grill: null, contact: null, blades: {}, extras: {}, filter: { drive: 'all', gas: 'all' } }; var DATA = { variants: [], grills: [], contacts: [], grillParts: [], knifeParts: [], blades: {}, loaded: false }; function q(s, r) { return (r || document).querySelector(s); } function qa(s, r) { return Array.prototype.slice.call((r || document).querySelectorAll(s)); } function el(tag, cls, text) { var e = document.createElement(tag); if (cls) e.className = cls; if (text != null) e.textContent = text; return e; } function low(s) { return String(s || '').toLowerCase(); } function inCat(x, list) { return x.cats.some(function (c) { return list.indexOf(c) > -1; }); } function euro(n) { return n.toLocaleString('de-DE', { minimumFractionDigits: 2, maximumFractionDigits: 2 }) + ' €'; } function isNrw(x) { return !!x && /nur in nrw/i.test(x.name); } function gasOf(x) { return /erdgas/i.test(x.name) ? 'Erdgas' : (/propan|flüssiggas/i.test(x.name) ? 'Propan' : ''); } function mbarOf(x) { var m = /(\d+)\s*mbar/i.exec(x.name); return m ? m[1] + ' mbar' : ''; } function driveOf(x) { for (var k in CAT_GRILL) { if (x.cats.indexOf(Number(k)) > -1) return k; } return ''; } function byPrice(a, b) { return (a.price == null ? 1e9 : a.price) - (b.price == null ? 1e9 : b.price); } function search(query) { if (cache[query]) return cache[query]; cache[query] = fetch('/rest/io/item/search?query=' + encodeURIComponent(query) + '&itemsPerPage=100', { headers: { 'Accept': 'application/json' }, credentials: 'same-origin' }) .then(function (r) { if (!r.ok) throw new Error('http'); return r.json(); }) .then(function (json) { return ((((json || {}).data || {}).itemList || {}).documents || []).map(function (doc) { var d = doc.data || {}, v = d.variation || {}, img = ((d.images || {}).all || [])[0] || {}, path = (d.texts || {}).urlPath || '', id = (d.item || {}).id; var pr = (((d.prices || {}).default || {}).price) || {}; return { id: String(id || ''), variationId: v.id, name: String((d.texts || {}).name1 || '').replace(/\s+/g, ' ').trim(), number: String(v.name || '').trim(), price: typeof pr.value === 'number' ? pr.value : null, priceText: pr.formatted || '', min: Math.max(1, parseInt(v.minimumOrderQuantity, 10) || 1), orderProps: !!d.hasRequiredOrderProperty, image: img.urlMiddle || img.urlPreview || '', url: path && id ? '/' + path.replace(/^\//, '') + '/a-' + id : '', cats: (d.defaultCategories || []).map(function (c) { return Number(c.id); }) }; }).filter(function (x) { return x.url && x.name; }); }) .catch(function () { delete cache[query]; return []; }); return cache[query]; } function merge(lists) { var seen = {}, out = []; lists.forEach(function (l) { l.forEach(function (x) { if (!seen[x.id]) { seen[x.id] = 1; out.push(x); } }); }); return out; } function isKnife(x, k) { return (inCat(x, CAT_KNIFE) || /elektrisches dönermesser/i.test(x.name)) && low(x.name).indexOf(low(k.query)) > -1; } function rankBlade(x, k) { var n = low(x.name), s = 0; if (k && n.indexOf(low(k.query)) > -1) s += 4; if (/ceylan/.test(n)) s += 2; if (/premium/.test(n)) s += 1; return s; } function done(i) { if (i === 1) return S.knife !== null; if (i === 2) return S.grill !== null; if (i === 3) return S.contact !== null; return false; } function open(n) { qa('[data-cy-sb-step]').forEach(function (s) { var i = Number(s.getAttribute('data-cy-sb-step')); s.classList.toggle('is-open', i === n); s.classList.toggle('is-done', i !== n && done(i)); }); qa('[data-cy-sb-pill]').forEach(function (p) { var i = Number(p.getAttribute('data-cy-sb-pill')); p.classList.toggle('is-active', i === n); p.classList.toggle('is-done', i !== n && done(i)); }); if (n === 4) renderStep4(); var target = q('[data-cy-sb-step="' + n + '"]'); if (target && n > 1 && target.getBoundingClientRect().top < 80) target.scrollIntoView({ behavior: 'smooth', block: 'start' }); } function stepper(value, onChange) { var w = el('span', 'cy-sb__qty'); var minus = el('button', 'cy-sb__qty-btn', '−'); minus.type = 'button'; minus.setAttribute('aria-label', 'Weniger'); var val = el('span', 'cy-sb__qty-val', String(value)); var plus = el('button', 'cy-sb__qty-btn', '+'); plus.type = 'button'; plus.setAttribute('aria-label', 'Mehr'); minus.addEventListener('click', function () { var v = Math.max(0, Number(val.textContent) - 1); val.textContent = v; onChange(v); }); plus.addEventListener('click', function () { var v = Number(val.textContent) + 1; val.textContent = v; onChange(v); }); w.appendChild(minus); w.appendChild(val); w.appendChild(plus); return w; } function thumb(x) { var f = el('span', 'cy-sb__thumb'); if (x && x.image) { var i = el('img'); i.src = x.image; i.alt = ''; i.loading = 'lazy'; f.appendChild(i); } return f; } function option(x, tags, active, onPick) { var b = el('button', 'cy-sb__option' + (active ? ' is-active' : '')); b.type = 'button'; b.setAttribute('aria-pressed', active ? 'true' : 'false'); b.appendChild(thumb(x)); var t = el('span', 'cy-sb__option-text'); t.appendChild(el('span', 'cy-sb__option-name', x.name)); t.appendChild(el('span', 'cy-sb__option-meta', (x.number ? x.number + ' · ' : '') + (x.priceText || 'Preis auf Anfrage'))); if (tags && tags.length) { var tg = el('span', 'cy-sb__tags'); tags.forEach(function (tag) { tg.appendChild(el('span', 'cy-sb__tag' + (tag === 'nur NRW' ? ' cy-sb__tag--nrw' : ''), tag)); }); t.appendChild(tg); } b.appendChild(t); b.addEventListener('click', function () { qa('.cy-sb__option', b.parentNode).forEach(function (o) { o.classList.toggle('is-active', o === b); o.setAttribute('aria-pressed', o === b ? 'true' : 'false'); }); onPick(x); }); return b; } function setNext(i) { var btn = q('[data-cy-sb-next="' + i + '"]'); if (btn) btn.disabled = !(i === 1 ? S.knife : i === 2 ? S.grill : S.contact); } function pickLabel(i, text) { var p = q('[data-cy-sb-pick="' + i + '"]'); if (p) p.textContent = text || ''; } function shortName(x) { if (!x) return ''; var n = x.name.split(/\s[–|]\s|\s-\s/)[0]; return n.length > 42 ? n.slice(0, 40) + ' …' : n; } function renderVariants(k) { var wrap = q('[data-cy-sb-variants]'); wrap.textContent = ''; q('[data-cy-sb-variants-wrap]').hidden = false; var list = DATA.variants; if (!list.length) { list = k.ng.map(function (ng) { return { id: 'ng-' + ng, name: k.label + ' mit Netzgerät ' + ng, number: '', price: null, priceText: '', image: '', cats: [] }; }); } list.forEach(function (x, i) { wrap.appendChild(option(x, isNrw(x) ? ['nur NRW'] : [], i === 0, function (it) { S.knife = it; setNext(1); update(); })); }); S.knife = list[0]; pickLabel(1, k.label); setNext(1); } function renderGrills() { var wrap = q('[data-cy-sb-grills]'); wrap.textContent = ''; var f = S.filter; q('[data-cy-sb-chips="gas"]').hidden = f.drive === '79'; if (!DATA.loaded) { wrap.appendChild(el('p', 'cy-sb__muted', 'Dönergrills werden geladen …')); return; } var list = DATA.grills.filter(function (x) { if (f.drive !== 'all' && driveOf(x) !== f.drive) return false; if (f.gas !== 'all' && f.drive !== '79' && gasOf(x) !== f.gas) return false; return true; }); if (!list.length) { wrap.appendChild(el('p', 'cy-sb__muted', 'Keine Dönergrills für diese Auswahl.')); return; } list.forEach(function (x) { var tags = [CAT_GRILL[driveOf(x)]]; var g = gasOf(x), m = mbarOf(x); if (g || m) tags.push([g, m].filter(Boolean).join(' ')); if (isNrw(x)) tags.push('nur NRW'); wrap.appendChild(option(x, tags, S.grill && S.grill.id === x.id, function (it) { S.grill = it; pickLabel(2, shortName(it)); setNext(2); update(); })); }); } function renderContacts() { var wrap = q('[data-cy-sb-contacts]'); wrap.textContent = ''; if (!DATA.loaded) { wrap.appendChild(el('p', 'cy-sb__muted', 'Kontaktgrills werden geladen …')); return; } if (!DATA.contacts.length) { wrap.appendChild(el('p', 'cy-sb__muted', 'Derzeit keine Kontaktgrills im Shop.')); return; } DATA.contacts.forEach(function (x) { var tags = []; if (/abholung/i.test(x.name)) tags.push('nur Abholung'); if (isNrw(x)) tags.push('nur NRW'); wrap.appendChild(option(x, tags, S.contact && S.contact.id === x.id, function (it) { S.contact = it; pickLabel(3, shortName(it)); setNext(3); update(); })); }); } function renderStep4() { var k = KNIVES[S.model]; var bw = q('[data-cy-sb-blades-wrap]'); var wrap = q('[data-cy-sb-blades]'); if (!k || !S.knife) { bw.hidden = true; S.blades = {}; wrap.removeAttribute('data-for'); } else if (wrap.getAttribute('data-for') !== S.model) { bw.hidden = false; wrap.setAttribute('data-for', S.model); wrap.textContent = ''; S.blades = {}; EDGES.forEach(function (edge) { var options = DATA.blades[edge.key] || []; var row = el('div', 'cy-sb__blade'); var head = el('label', 'cy-sb__blade-head'); var cb = el('input'); cb.type = 'checkbox'; cb.disabled = !options.length; cb.checked = edge.key !== 'gekerbt' && !!options.length; head.appendChild(cb); head.appendChild(el('span', 'cy-sb__blade-label', edge.label)); head.appendChild(el('span', 'cy-sb__blade-dia', 'Ø ' + k.dia)); row.appendChild(head); if (!options.length) { row.appendChild(el('span', 'cy-sb__muted', 'Derzeit kein passendes Messer im Shop')); row.classList.add('is-off'); wrap.appendChild(row); return; } var sel = el('select', 'form-control cy-sb__select'); options.forEach(function (x, i) { var o = el('option', null, x.name + (x.priceText ? ' – ' + x.priceText : '')); o.value = String(i); sel.appendChild(o); }); row.appendChild(sel); var st = { item: options[0], qty: cb.checked ? 2 : 0 }; S.blades[edge.key] = st; var qty = stepper(st.qty, function (v) { st.qty = v; cb.checked = v > 0; row.classList.toggle('is-off', v === 0); update(); }); row.appendChild(qty); row.classList.toggle('is-off', !cb.checked); cb.addEventListener('change', function () { st.qty = cb.checked ? Math.max(1, st.qty || 2) : 0; q('.cy-sb__qty-val', qty).textContent = st.qty; row.classList.toggle('is-off', !cb.checked); update(); }); sel.addEventListener('change', function () { st.item = options[Number(sel.value)]; update(); }); wrap.appendChild(row); }); } var ex = q('[data-cy-sb-extras]'); var key = (k && S.knife ? S.model : '-') + '|' + (S.grill ? 'g' : '-'); if (ex.getAttribute('data-for') === key) { update(); return; } ex.setAttribute('data-for', key); ex.textContent = ''; S.extras = {}; var list = []; if (k && S.knife) list = list.concat(DATA.knifeParts.slice(0, 6)); if (S.grill) list = list.concat(DATA.grillParts.slice(0, 4)); list = merge([list]); if (!list.length) { ex.appendChild(el('li', 'cy-sb__muted', 'Wählen Sie ein Dönermesser oder einen Dönergrill, um passendes Zubehör zu sehen.')); update(); return; } list.forEach(function (x) { var li = el('li', 'cy-sb__extra'); li.appendChild(thumb(x)); var t = el('a', 'cy-sb__extra-text'); t.href = x.url; t.target = '_blank'; t.rel = 'noopener'; t.appendChild(el('span', 'cy-sb__extra-name', x.name)); t.appendChild(el('span', 'cy-sb__extra-meta', (x.number ? x.number + ' · ' : '') + (x.priceText || ''))); li.appendChild(t); var st = { item: x, qty: 0 }; S.extras[x.id] = st; li.appendChild(stepper(0, function (v) { st.qty = v; li.classList.toggle('is-on', v > 0); update(); })); ex.appendChild(li); }); update(); } function devices() { var out = []; if (S.knife) out.push({ kind: 'Dönermesser', item: S.knife, step: 1 }); if (S.grill) out.push({ kind: 'Dönergrill', item: S.grill, step: 2 }); if (S.contact) out.push({ kind: 'Kontaktgrill', item: S.contact, step: 3 }); return out; } function lines() { var out = []; Object.keys(S.blades).forEach(function (k) { var b = S.blades[k]; if (b.qty > 0 && b.item) out.push({ item: b.item, qty: b.qty }); }); Object.keys(S.extras).forEach(function (k) { var e = S.extras[k]; if (e.qty > 0) out.push({ item: e.item, qty: e.qty }); }); return out; } function countUp(node, to) { var from = Number(node.getAttribute('data-v') || 0), t0 = null; node.setAttribute('data-v', to); function f(ts) { if (!t0) t0 = ts; var p = Math.min(1, (ts - t0) / 400); node.textContent = euro(from + (to - from) * (1 - Math.pow(1 - p, 3))); if (p < 1) requestAnimationFrame(f); } requestAnimationFrame(f); } function update() { var stage = q('[data-cy-sb-stage]'), list = q('[data-cy-sb-lines]'); stage.textContent = ''; list.textContent = ''; var devs = devices(); if (!devs.length) stage.appendChild(el('li', 'cy-sb__stage-empty', 'Noch leer – wählen Sie links ein Dönermesser, einen Dönergrill oder einen Kontaktgrill.')); var devSum = 0, devKnown = 0; devs.forEach(function (d) { var li = el('li', 'cy-sb__stage-device'); li.appendChild(thumb(d.item)); var ht = el('div', 'cy-sb__stage-text'); ht.appendChild(el('span', 'cy-sb__stage-kind', d.kind)); ht.appendChild(el('span', 'cy-sb__stage-meta', d.item.name)); ht.appendChild(el('span', 'cy-sb__stage-price', d.item.priceText || 'Preis auf Anfrage')); li.appendChild(ht); var ed = el('button', 'cy-sb__stage-edit', 'Ändern'); ed.type = 'button'; ed.setAttribute('data-cy-sb-goto', String(d.step)); li.appendChild(ed); stage.appendChild(li); if (typeof d.item.price === 'number') { devSum += d.item.price; devKnown++; } }); var ls = lines(), sum = 0, count = 0; ls.forEach(function (l, i) { var li = el('li', 'cy-sb__line'); li.style.animationDelay = (i * 30) + 'ms'; li.appendChild(thumb(l.item)); var t = el('span', 'cy-sb__line-text'); t.appendChild(el('span', 'cy-sb__line-name', l.item.name)); t.appendChild(el('span', 'cy-sb__line-meta', l.qty + ' × ' + (l.item.priceText || '—'))); li.appendChild(t); list.appendChild(li); if (typeof l.item.price === 'number') sum += l.item.price * l.qty; count += l.qty; }); q('[data-cy-sb-count]').textContent = String(devs.length + count); countUp(q('[data-cy-sb-parts]'), sum); q('[data-cy-sb-device-price]').textContent = !devs.length ? '—' : (devKnown ? euro(devSum) + (devKnown < devs.length ? ' + Anfrage' : '') : 'auf Anfrage'); q('[data-cy-sb-cart]').disabled = !ls.length; q('[data-cy-sb-nrw]').hidden = !devs.some(function (d) { return isNrw(d.item); }); var fmt = function (x) { return x.name + (x.number ? ' (' + x.number + ')' : ''); }; var body = 'Döner-Set\n\n' + 'Dönermesser: ' + (S.knife ? fmt(S.knife) : 'ohne') + '\n' + 'Dönergrill: ' + (S.grill ? fmt(S.grill) : 'ohne') + '\n' + 'Kontaktgrill: ' + (S.contact ? fmt(S.contact) : 'ohne') + '\n\n' + 'Kreismesser und Zubehör:\n' + (ls.length ? ls.map(function (l) { return '- ' + l.qty + ' × ' + fmt(l.item); }).join('\n') : '- keine') + '\n\nAnzahl Sets:\nLieferort (PLZ):\nFragen:\n'; q('[data-cy-sb-mail]').href = 'mailto:sale@ceylan-online.de?subject=' + encodeURIComponent('Angebot Döner-Set') + '&body=' + encodeURIComponent(body); } function chooseKnife(key) { var k = KNIVES[key]; if (!k) return; S.model = key; S.knife = null; setNext(1); qa('[data-cy-sb-device]').forEach(function (b) { b.classList.toggle('is-active', b.getAttribute('data-cy-sb-device') === key); }); q('#cy-sb').classList.add('is-loading'); Promise.all([search(k.query), search('Kreismesser ' + k.dia)]).then(function (res) { if (S.model !== key) return; var all = res[0], blades = merge([res[1], res[0]]); var reDia = new RegExp('ø\\s*' + k.dia + '\\b', 'i'); DATA.variants = all.filter(function (x) { return isKnife(x, k); }).sort(byPrice); DATA.blades = {}; EDGES.forEach(function (edge) { DATA.blades[edge.key] = blades.filter(function (x) { return /kreismesser/i.test(x.name) && reDia.test(x.name) && new RegExp(edge.key, 'i').test(x.name) && !x.orderProps && x.variationId; }).sort(function (a, b) { return rankBlade(b, k) - rankBlade(a, k); }).slice(0, 8); }); DATA.knifeParts = all.filter(function (x) { return inCat(x, CAT_PARTS) && !/kreismesser|auslauf/i.test(x.name) && !x.orderProps && x.variationId; }); q('[data-cy-sb-blades]').removeAttribute('data-for'); q('[data-cy-sb-extras]').removeAttribute('data-for'); renderVariants(k); q('#cy-sb').classList.remove('is-loading'); update(); }); } function loadGrills() { Promise.all([search('Dönergrill'), search('Gyrosgrill'), search('Kontaktgrill')]).then(function (res) { var all = merge(res); DATA.grills = all.filter(function (x) { return driveOf(x) && !/auslauf/i.test(x.name); }).sort(function (a, b) { return (Number(driveOf(b) === '537') - Number(driveOf(a) === '537')) || byPrice(a, b); }); DATA.contacts = all.filter(function (x) { return inCat(x, CAT_CONTACT) && !/auslauf/i.test(x.name); }).sort(byPrice); DATA.grillParts = all.filter(function (x) { return inCat(x, CAT_GRILL_PARTS) && !x.orderProps && x.variationId; }).sort(byPrice); DATA.loaded = true; renderGrills(); renderContacts(); }); } function skip(what) { if (what === 'knife') { S.knife = false; S.model = null; qa('[data-cy-sb-device]').forEach(function (b) { b.classList.remove('is-active'); }); q('[data-cy-sb-variants-wrap]').hidden = true; pickLabel(1, 'ohne'); setNext(1); update(); open(2); } if (what === 'grill') { S.grill = false; qa('.cy-sb__option', q('[data-cy-sb-grills]')).forEach(function (o) { o.classList.remove('is-active'); o.setAttribute('aria-pressed', 'false'); }); pickLabel(2, 'ohne'); setNext(2); update(); open(3); } if (what === 'contact') { S.contact = false; qa('.cy-sb__option', q('[data-cy-sb-contacts]')).forEach(function (o) { o.classList.remove('is-active'); o.setAttribute('aria-pressed', 'false'); }); pickLabel(3, 'ohne'); setNext(3); update(); open(4); } } function addToBasket(item, qty) { var store = window.vueApp && window.vueApp.$store; if (store && store._actions && store._actions.addBasketItem) return store.dispatch('addBasketItem', { variationId: item.variationId, quantity: qty, basketItemOrderParams: [] }); return fetch('/rest/io/basket/items/', { method: 'POST', credentials: 'same-origin', headers: { 'Content-Type': 'application/json', 'Accept': 'application/json', 'X-Requested-With': 'XMLHttpRequest' }, body: JSON.stringify({ variationId: item.variationId, quantity: qty, basketItemOrderParams: [] }) }).then(function (r) { if (!r.ok) throw new Error('http'); return r.json(); }); } function toCart() { var btn = q('[data-cy-sb-cart]'), res = q('[data-cy-sb-result]'); var ls = lines(); if (!ls.length) return; btn.disabled = true; btn.textContent = 'Wird hinzugefügt …'; var ok = 0, fail = []; ls.reduce(function (p, l) { return p.then(function () { return addToBasket(l.item, Math.max(l.qty, l.item.min)).then(function () { ok++; }, function () { fail.push(l.item.number || l.item.name); }); }); }, Promise.resolve()).then(function () { btn.textContent = 'Teile in den Warenkorb'; btn.disabled = false; res.textContent = ok + (ok === 1 ? ' Position' : ' Positionen') + ' im Warenkorb.' + (fail.length ? ' Nicht hinzugefügt: ' + fail.join(', ') + '.' : ''); var a = el('a', 'cy-sb__basket', 'Zum Warenkorb'); a.href = '/basket'; res.appendChild(document.createTextNode(' ')); res.appendChild(a); }); } function images() { Object.keys(KNIVES).forEach(function (key) { var k = KNIVES[key]; search(k.query).then(function (list) { var hit = list.filter(function (x) { return isKnife(x, k) && x.image; })[0]; var slot = q('[data-cy-sb-device="' + key + '"] [data-cy-sb-img]'); if (!slot || slot.firstChild) return; if (hit) { var i = el('img'); i.src = hit.image; i.alt = ''; slot.appendChild(i); } else { slot.classList.add('is-noimg'); slot.textContent = 'Ø ' + k.dia; } }); }); } document.addEventListener('click', function (e) { if (!e.target.closest) return; var d = e.target.closest('#cy-sb [data-cy-sb-device]'); if (d) { chooseKnife(d.getAttribute('data-cy-sb-device')); return; } var ch = e.target.closest('#cy-sb [data-cy-sb-chip]'); if (ch) { var grp = ch.parentNode.getAttribute('data-cy-sb-chips'); S.filter[grp] = ch.getAttribute('data-cy-sb-chip'); qa('.cy-sb__chip', ch.parentNode).forEach(function (c) { c.classList.toggle('is-active', c === ch); }); renderGrills(); return; } var sk = e.target.closest('#cy-sb [data-cy-sb-skip]'); if (sk) { skip(sk.getAttribute('data-cy-sb-skip')); return; } var g = e.target.closest('#cy-sb [data-cy-sb-goto]'); if (g && !g.disabled) { open(Number(g.getAttribute('data-cy-sb-goto'))); return; } var p = e.target.closest('#cy-sb [data-cy-sb-pill]'); if (p) { open(Number(p.getAttribute('data-cy-sb-pill'))); return; } var c = e.target.closest('#cy-sb [data-cy-sb-cart]'); if (c) toCart(); }); function init() { var root = document.getElementById('cy-sb'); if (!root || root.getAttribute('data-ready')) return; root.setAttribute('data-ready', '1'); images(); loadGrills(); renderGrills(); renderContacts(); open(1); update(); var h = (location.hash || '').replace('#', '').toLowerCase(); if (KNIVES[h]) chooseKnife(h); } if (document.readyState === 'complete') init(); else window.addEventListener('load', init); setTimeout(init, 1500); })();