{"id":4545,"date":"2026-08-27T08:25:32","date_gmt":"2026-08-27T07:25:32","guid":{"rendered":"https:\/\/cabinereinigen.sw-dev.nl\/?page_id=4545"},"modified":"2026-09-30T11:56:25","modified_gmt":"2026-09-30T10:56:25","slug":"package-guide","status":"publish","type":"page","link":"https:\/\/cabinereinigen.nl\/en\/package-guide\/","title":{"rendered":"Package guide"},"content":{"rendered":"<div id=\"cabhelp\" data-lang=\"en\" data-form-url=\"https:\/\/cabinereinigen.nl\/en\/schedule-cleaning\/\" data-sub-url=\"https:\/\/cabinereinigen.nl\/en\/subscription\/\">\n<style>\n@import url('https:\/\/fonts.googleapis.com\/css2?family=Archivo:wght@500;600;700;800&family=IBM+Plex+Mono:wght@500;600&family=IBM+Plex+Sans:wght@400;500;600&display=swap');\n#cabhelp{\n  --bg:#F5F8F6; --surface:#FFFFFF; --surface-2:#EDF2EF;\n  --ink:#131C18; --muted:#58665F; --line:#DCE5E0;\n  --accent:#0F9D63; --accent-ink:#0B7A4D; --accent-contrast:#FFFFFF;\n  --shadow:0 1px 2px rgba(19,28,24,.06),0 12px 34px rgba(19,28,24,.09);\n}\n@media (prefers-color-scheme:dark){#cabhelp{\n  --bg:#0D1512; --surface:#14201B; --surface-2:#1B2A23; --ink:#E9F1EC; --muted:#94A69D; --line:#26362E;\n  --accent:#2FD98A; --accent-ink:#57E6A2; --accent-contrast:#06120C; --shadow:0 1px 2px rgba(0,0,0,.3),0 14px 40px rgba(0,0,0,.45);\n}}\n[data-theme=\"dark\"] #cabhelp{\n  --bg:#0D1512; --surface:#14201B; --surface-2:#1B2A23; --ink:#E9F1EC; --muted:#94A69D; --line:#26362E;\n  --accent:#2FD98A; --accent-ink:#57E6A2; --accent-contrast:#06120C; --shadow:0 1px 2px rgba(0,0,0,.3),0 14px 40px rgba(0,0,0,.45);\n}\n#cabhelp{\n  --radius:14px;\n  max-width:600px; margin:2.5rem auto; padding:0 16px; box-sizing:border-box;\n  font-family:\"IBM Plex Sans\",system-ui,-apple-system,Segoe UI,Roboto,sans-serif;\n  color:var(--ink); line-height:1.5; -webkit-font-smoothing:antialiased;\n}\n#cabhelp *{box-sizing:border-box}\n#cabhelp .eyebrow{font-family:\"IBM Plex Mono\",monospace; font-weight:600; font-size:12px; letter-spacing:.14em; text-transform:uppercase; color:var(--accent-ink); display:flex; align-items:center; gap:8px; justify-content:center; margin:0 0 14px}\n#cabhelp .eyebrow::before,#cabhelp .eyebrow::after{content:\"\"; width:20px; height:2px; background:var(--accent); display:inline-block}\n#cabhelp .card{background:var(--surface); border:1.5px solid var(--line); border-radius:20px; box-shadow:var(--shadow); overflow:hidden}\n#cabhelp .progress{padding:20px 24px 0}\n#cabhelp .ptrack{height:6px; background:var(--surface-2); border-radius:999px; overflow:hidden}\n#cabhelp .pbar{height:100%; width:16%; background:var(--accent); border-radius:999px; transition:width .35s cubic-bezier(.4,0,.2,1)}\n#cabhelp .pmeta{display:flex; justify-content:space-between; align-items:baseline; margin-top:10px; font-family:\"IBM Plex Mono\",monospace; font-size:11.5px; letter-spacing:.08em; text-transform:uppercase; color:var(--muted)}\n#cabhelp .bodyx{padding:22px 24px 24px; min-height:380px; display:flex; flex-direction:column}\n#cabhelp .screen{display:none; flex-direction:column; flex:1}\n#cabhelp .screen.active{display:flex; animation:chfade .28s ease both}\n@keyframes chfade{from{opacity:0; transform:translateY(8px)} to{opacity:1; transform:none}}\n#cabhelp h2.q{font-family:\"Archivo\",sans-serif; font-weight:800; letter-spacing:-.02em; font-size:clamp(22px,4.5vw,28px); line-height:1.1; margin:6px 0 4px; text-wrap:balance; color:var(--ink)}\n#cabhelp .qsub{color:var(--muted); font-size:14px; margin:0 0 18px}\n#cabhelp .opts{display:grid; grid-template-columns:minmax(0,1fr); gap:10px}\n#cabhelp .opt{appearance:none; text-align:left; cursor:pointer; font:inherit; background:var(--surface); border:1.5px solid var(--line); border-radius:var(--radius); padding:14px 15px; display:flex; align-items:flex-start; gap:13px; transition:border-color .15s,box-shadow .15s,background .15s; color:var(--ink)}\n#cabhelp .opt:hover{border-color:var(--accent); background:color-mix(in srgb,var(--accent) 5%,var(--surface))}\n#cabhelp .opt:focus-visible{outline:3px solid color-mix(in srgb,var(--accent) 45%,transparent); outline-offset:2px}\n#cabhelp .opt[aria-pressed=\"true\"]{border-color:var(--accent); box-shadow:inset 0 0 0 1px var(--accent); background:color-mix(in srgb,var(--accent) 9%,var(--surface))}\n#cabhelp .opt{min-width:0; max-width:100%; white-space:normal; overflow:hidden}\n#cabhelp .opt .t,#cabhelp .opt .d{white-space:normal; min-width:0}\n#cabhelp .opt .body-t{display:flex; flex-direction:column; gap:2px; flex:1; min-width:0; overflow-wrap:anywhere}\n#cabhelp .opt .pz{flex:none}\n#cabhelp .opt .t{font-weight:600; display:flex; align-items:center; gap:8px; flex-wrap:wrap; color:var(--ink)}\n#cabhelp .opt .d{font-size:13px; color:var(--muted); line-height:1.4}\n#cabhelp .opt .pz{font-family:\"IBM Plex Mono\",monospace; font-weight:600; font-size:13px; color:var(--accent-ink); white-space:nowrap}\n#cabhelp .opt .mark{width:22px; height:22px; border-radius:50%; flex:none; border:2px solid var(--line); display:grid; place-items:center; transition:border-color .15s,background .15s; margin-top:1px}\n#cabhelp .opt.multi .mark{border-radius:6px}\n#cabhelp .opt[aria-pressed=\"true\"] .mark{border-color:var(--accent); background:var(--accent)}\n#cabhelp .opt .mark::after{content:\"\"; width:8px; height:5px; border-left:2px solid var(--accent-contrast); border-bottom:2px solid var(--accent-contrast); transform:rotate(-45deg) scale(0); transition:transform .15s}\n#cabhelp .opt[aria-pressed=\"true\"] .mark::after{transform:rotate(-45deg) scale(1)}\n#cabhelp .tag{font-family:\"IBM Plex Mono\",monospace; font-size:10px; font-weight:600; letter-spacing:.06em; text-transform:uppercase; color:var(--accent-contrast); background:var(--accent); padding:2px 7px; border-radius:999px}\n#cabhelp .note{font-size:12px; color:var(--muted); margin:12px 2px 0; font-style:italic}\n#cabhelp .nav{display:flex; align-items:center; gap:12px; margin-top:20px}\n#cabhelp .back{appearance:none; font:inherit; cursor:pointer; background:transparent; color:var(--muted); border:0; padding:10px 4px; font-weight:600; font-size:14px; display:inline-flex; align-items:center; gap:6px; border-radius:8px}\n#cabhelp .back:hover{color:var(--ink)}\n#cabhelp .back:focus-visible{outline:3px solid color-mix(in srgb,var(--accent) 45%,transparent); outline-offset:2px}\n#cabhelp .back[hidden]{display:none}\n#cabhelp .back .arw{font-family:\"IBM Plex Mono\",monospace}\n#cabhelp .fwd{appearance:none; font:inherit; cursor:pointer; margin-left:auto; background:var(--accent); color:var(--accent-contrast); border:0; border-radius:10px; padding:12px 22px; font-family:\"Archivo\",sans-serif; font-weight:700; font-size:14px; transition:filter .15s,transform .05s}\n#cabhelp .fwd:hover{filter:brightness(1.05)}\n#cabhelp .fwd:active{transform:translateY(1px)}\n#cabhelp .fwd:focus-visible{outline:3px solid color-mix(in srgb,var(--accent) 45%,transparent); outline-offset:2px}\n#cabhelp .rlabel{font-family:\"IBM Plex Mono\",monospace; font-size:11px; font-weight:600; letter-spacing:.12em; text-transform:uppercase; color:var(--muted)}\n#cabhelp .rpkg{font-family:\"Archivo\",sans-serif; font-weight:800; letter-spacing:-.02em; font-size:clamp(26px,5.5vw,34px); line-height:1.05; margin:6px 0 4px; color:var(--ink); text-wrap:balance}\n#cabhelp .rsub{font-size:13.5px; color:var(--muted); margin:0}\n#cabhelp .discount{display:inline-flex; align-items:center; gap:6px; margin-top:14px; font-family:\"IBM Plex Mono\",monospace; font-weight:600; font-size:13px; color:var(--accent-ink); background:color-mix(in srgb,var(--accent) 14%,transparent); border:1px solid color-mix(in srgb,var(--accent) 35%,transparent); padding:5px 10px; border-radius:999px}\n#cabhelp .rrows{margin:18px 0 0; border-top:1px solid var(--line)}\n#cabhelp .grouphd{font-family:\"IBM Plex Mono\",monospace; font-size:11px; font-weight:600; letter-spacing:.1em; text-transform:uppercase; color:var(--accent-ink); padding:14px 0 2px}\n#cabhelp .row{display:flex; justify-content:space-between; align-items:baseline; gap:12px; padding:9px 0}\n#cabhelp .row + .row{border-top:1px dashed var(--line)}\n#cabhelp .row .k{color:var(--ink); font-size:14px}\n#cabhelp .row .k small{color:var(--muted); display:block; font-size:12px; margin-top:1px}\n#cabhelp .row .v{font-family:\"IBM Plex Mono\",monospace; font-weight:600; font-variant-numeric:tabular-nums; color:var(--ink); text-align:right; white-space:nowrap}\n#cabhelp .row.disc .v{color:var(--accent-ink)}\n#cabhelp .row.total{border-top:2px solid var(--line); margin-top:4px; padding-top:13px}\n#cabhelp .row.total .k{font-family:\"Archivo\",sans-serif; font-weight:700; font-size:16px}\n#cabhelp .row.total .v{font-family:\"Archivo\",sans-serif; font-weight:800; font-size:20px; letter-spacing:-.02em}\n#cabhelp .row.onrequest .v{color:var(--muted); font-weight:500; font-size:13px}\n#cabhelp .infobox{margin-top:16px; padding:13px 15px; background:var(--surface-2); border-radius:12px; font-size:13px; color:var(--ink); line-height:1.5}\n#cabhelp .infobox b{font-weight:600}\n#cabhelp .cta{display:block; width:100%; text-align:center; margin-top:22px; background:var(--accent); color:var(--accent-contrast); font-family:\"Archivo\",sans-serif; font-weight:700; font-size:15px; border:0; border-radius:12px; padding:15px 18px; cursor:pointer; text-decoration:none; transition:filter .15s,transform .05s}\n#cabhelp .cta:hover{filter:brightness(1.05)}\n#cabhelp .cta:active{transform:translateY(1px)}\n#cabhelp .cta:focus-visible{outline:3px solid color-mix(in srgb,var(--accent) 45%,transparent); outline-offset:2px}\n#cabhelp .cta2{display:block; text-align:center; margin-top:10px; color:var(--accent-ink); font-weight:600; font-size:13.5px; text-decoration:none}\n#cabhelp .cta2:hover{text-decoration:underline}\n#cabhelp .restart{display:block; margin:14px auto 0; background:transparent; border:0; cursor:pointer; font:inherit; font-size:13px; font-weight:600; color:var(--muted)}\n#cabhelp .restart:hover{color:var(--ink)}\n#cabhelp .foot{margin:16px 4px 0; font-size:11.5px; color:var(--muted); line-height:1.5; text-align:center}\n@media (prefers-reduced-motion:reduce){#cabhelp *{transition:none!important; animation:none!important}}\n<\/style>\n\n<p class=\"eyebrow\">Cabinereinigen &middot; Package helper<\/p>\n<div class=\"card\">\n  <div class=\"progress\">\n    <div class=\"ptrack\"><div class=\"pbar\" id=\"chbar\"><\/div><\/div>\n    <div class=\"pmeta\"><span id=\"chstep\">Step 1<\/span><span id=\"chname\">Start<\/span><\/div>\n  <\/div>\n  <div class=\"bodyx\" id=\"chbody\">\n    <!-- screens injected -->\n  <\/div>\n<\/div>\n<p class=\"foot\">This package helper gives an <b>indication<\/b> based on your answers. All amounts are per cleaning and <b>excl. VAT<\/b>; travel costs (&euro;55 per visit) are included in the total and free for subscription customers. The final price follows after scheduling.<\/p>\n\n<script>\n(function(){\n  var root = document.getElementById('cabhelp');\n  if(!root) return;\n  var body = root.querySelector('#chbody');\n  var bar = root.querySelector('#chbar');\n  var stepEl = root.querySelector('#chstep');\n  var nameEl = root.querySelector('#chname');\n\n  var FORM_URL = root.getAttribute('data-form-url') || '\/en\/reiniging-inplannen\/';\n  var SUB_URL  = root.getAttribute('data-sub-url') || '\/en\/abonnement\/';\n\n  var euro = function(n){ return '\u20ac ' + n.toLocaleString('nl-NL',{minimumFractionDigits:(n%1?2:0),maximumFractionDigits:2}); };\n  var stNaam = function(s){ return {s1:'1-stage',s2:'2-stage',s3:'3-stage'}[s||'s1']; };\n\n  var P = {\n    interieur:{\n      eco:{truck:199, bw:125, label:'Eco-Clean', desc:'Cleaning: plastics, compartments &amp; windows, full vacuum, air freshener'},\n      hyg:{truck:325, bw:199, label:'Hygiene', desc:'Eco-Clean + steam deep-cleaning of mattresses, seats &amp; mats'},\n      anti:{truck:399, bw:250, label:'Anti-odour', desc:'Hygiene + steam deep-cleaning of headliner &amp; walls'}\n    },\n    ozon:75,\n    toeslag:99,\n    gordijnen:'\u20ac12.50 per kilo',\n    polish:{s1:395, s2:695, s3:995},\n    dak:{s1:102.5, s2:182.5, s3:248.75},\n    coating:1000,\n    reiskosten:55,\n    ongedierte:{l1:899, l2:1099, l3:1299}\n  };\n\n  var ans = {};\n\n  var STEPS = {\n    mode:{group:'Start', title:'What can I help you with?', sub:'Choose where you\u2019d like to start.', type:'single', options:[\n      {val:'interieur', t:'Interior cleaning', d:'The inside of the cab: upholstery, mattresses, odours'},\n      {val:'exterieur', t:'Exterior \/ paint restoration', d:'Polishing and paint protection on the outside'},\n      {val:'compleet', t:'Complete \u2014 inside &amp; outside', d:'Interior + exterior together', tag:'up to 10% off'},\n      {val:'fabrieksnieuw', t:'Factory-fresh', d:'All-in showroom condition: 3-stage polishing + Anti-odour package', tag:'10% off'},\n      {val:'ongedierte', t:'Pest control', d:'Heat treatment against bed bugs and other pests'}\n    ]},\n    voertuig:{group:'Vehicle', title:'What type of vehicle is it?', sub:'Determines the interior package price.', type:'single', options:[\n      {val:'truck', t:'Truck \/ lorry', d:'Cab of a tractor unit or rigid truck'},\n      {val:'bw', t:'Van \/ commercial vehicle', d:'Delivery van or passenger car'}\n    ]},\n    o_lengte:{group:'Pest control', title:'What is the length of the vehicle?', sub:'Determines the location of the heat treatment.', type:'single', options:[\n      {val:'l1', t:'Up to 7.5 m', d:'Location Gendringen \u2014 Rotterdam optional (surcharge)', pz:euro(899)},\n      {val:'l2', t:'7.5 \u2013 9.5 m', d:'Location Gendringen \u2014 Rotterdam optional (surcharge)', pz:euro(1099)},\n      {val:'l3', t:'Up to 15 m', d:'Location Rotterdam', pz:euro(1299)}\n    ]},\n    o_locatie:{group:'Pest control', title:'Which location would you like to visit?', sub:'Gendringen is the default location. Rotterdam is also possible, at a surcharge.', type:'single', options:[\n      {val:'gendringen', t:'Gendringen', d:'Default location'},\n      {val:'rotterdam', t:'Rotterdam', d:'If you\u2019d rather come to Rotterdam \u2014 surcharge'}\n    ]},\n    i_grondig:{group:'Interior', title:'Do you want the upholstery deep-cleaned?', sub:'Mattresses, seats and mats with steam deep-cleaning.', type:'single', options:[\n      {val:'nee', t:'No, a fresh clean-up is enough', d:'Plastic parts, compartments &amp; windows, full vacuum, air freshener'},\n      {val:'ja', t:'Yes, deep clean', d:'Tackle upholstery, mattresses and seats thoroughly'}\n    ]},\n    i_type:{group:'Interior', title:'What suits the cab best?', sub:'How heavy is the soiling?', type:'single', options:[\n      {val:'hyg', t:'Just a thorough deep-clean', d:'Heavily soiled \u2192 Hygiene package'},\n      {val:'vlek', t:'There are stains in the headliner or back wall', d:'Headliner &amp; walls included \u2192 Anti-odour package'},\n      {val:'lucht', t:'There\u2019s a persistent, bad smell', d:'Extremely soiled \u2192 Anti-odour package + ozone treatment'}\n    ]},\n    i_extra:{group:'Interior', title:'Is anything else going on?', sub:'Multiple possible. Nothing applies? Skip.', type:'multi', options:[\n      {val:'schimmel', t:'Mould', d:'Surcharge', pz:euro(99)},\n      {val:'hondenharen', t:'Dog hair', d:'Surcharge', pz:euro(99)},\n      {val:'brand', t:'Fire or smoke damage', d:'Surcharge', pz:euro(99)},\n      {val:'leder', t:'Leather treatment', d:'Surcharge', pz:euro(99)},\n      {val:'gordijnen', t:'Curtain washing', d:'On request', pz:'\u20ac12.50\/kg'}\n    ]},\n    e_staps:{group:'Exterior', title:'What condition is the paint in?', sub:'The more stages, the deeper the correction.', type:'single', options:[\n      {val:'s1', t:'Light wear marks', d:'1-stage polishing \u2014 correction + gloss restoration', pz:euro(395)},\n      {val:'s2', t:'Moderate scratches &amp; swirls, or dull paint', d:'2-stage polishing \u2014 deeper correction \u2013 removes light scratches', pz:euro(695)},\n      {val:'s3', t:'Showroom quality \u2014 for the enthusiast', d:'3-stage polishing \u2014 maximum correction \u2013 maximum gloss', pz:euro(995)}\n    ]},\n    e_dak:{group:'Exterior', title:'Polish roof and back wall too?', sub:'Optional surcharge on top of the polishing.', type:'single', options:[\n      {val:'ja', t:'Yes, add roof &amp; back wall', d:'Surcharge depends on the chosen stage'},\n      {val:'nee', t:'No, just the sides', d:''}\n    ]},\n    e_coat:{group:'Exterior', title:'Do you want years of paint protection?', sub:'Years of paint protection against dirt, with colour retention.', type:'single', options:[\n      {val:'ja', t:'Yes, add glass coating', d:'Years of paint protection against dirt, with colour retention', pz:euro(1000)},\n      {val:'nee', t:'No, not for now', d:''}\n    ]}\n  };\n\n  function plan(){\n    var m = ans.mode;\n    if(m==='ongedierte'){\n      var po = ['mode','o_lengte'];\n      if(ans.o_lengte==='l1' || ans.o_lengte==='l2') po.push('o_locatie');\n      return po;\n    }\n    var p = ['mode','voertuig'];\n    if(m==='interieur' || m==='compleet'){\n      p.push('i_grondig');\n      if(ans.i_grondig==='ja') p.push('i_type');\n      p.push('i_extra');\n    }\n    if(m==='fabrieksnieuw') p.push('i_extra');\n    if(m==='exterieur' || m==='compleet') p.push('e_staps','e_dak','e_coat');\n    if(m==='fabrieksnieuw') p.push('e_dak','e_coat');\n    return p;\n  }\n\n  var current = 'mode';\n\n  \/\/ e_dak dynamic: van = roof only\n  function stepDef(key){\n    if(key==='e_dak'){\n      var bw = ans.voertuig==='bw';\n      return {group:'Exterior', type:'single',\n        title: bw ? 'Polish the roof too?' : 'Polish roof and back wall too?',\n        sub:'Optional surcharge on top of the polishing.',\n        options:[\n          {val:'ja', t: bw ? 'Yes, add the roof' : 'Yes, add roof &amp; back wall', d:'Surcharge depends on the chosen stage'},\n          {val:'nee', t:'No, just the sides', d:''}\n        ]};\n    }\n    return STEPS[key];\n  }\n\n  function render(){\n    var pl = plan();\n    var idx = pl.indexOf(current);\n    var def = stepDef(current);\n    var isResult = current==='result';\n    var total = pl.length + 1;\n    var pos = isResult ? total : (idx+1);\n    bar.style.width = Math.round(pos\/total*100) + '%';\n    stepEl.textContent = isResult ? 'Done' : ('Step ' + pos + ' \/ ' + total);\n    nameEl.textContent = isResult ? 'Advice' : def.group;\n\n    if(isResult){ body.innerHTML = ''; body.appendChild(buildResult()); wire(); return; }\n\n    var sc = document.createElement('section');\n    sc.className = 'screen active';\n    var h = '<h2 class=\"q\">'+def.title+'<\/h2>';\n    if(def.sub) h += '<p class=\"qsub\">'+def.sub+'<\/p>';\n    h += '<div class=\"opts\">';\n    def.options.forEach(function(o){\n      var pressed = def.type==='multi'\n        ? ((ans[current]||[]).indexOf(o.val)>-1)\n        : (ans[current]===o.val);\n      h += '<button type=\"button\" class=\"opt'+(def.type==='multi'?' multi':'')+'\" data-val=\"'+o.val+'\" aria-pressed=\"'+pressed+'\">'\n         + '<span class=\"mark\"><\/span><span class=\"body-t\"><span class=\"t\">'+o.t\n         + (o.tag?'<span class=\"tag\">'+o.tag+'<\/span>':'')+'<\/span>'\n         + (o.d?'<span class=\"d\">'+o.d+'<\/span>':'')+'<\/span>'\n         + (o.pz?'<span class=\"pz\">'+o.pz+'<\/span>':'')\n         + '<\/button>';\n    });\n    h += '<\/div>';\n    if(current==='e_staps') h += '<p class=\"note\">Dull paint colours (red, blue, orange) require at least 2-stage polishing.<\/p>';\n    h += '<div class=\"nav\"><button type=\"button\" class=\"back\" data-back'+(idx<=0?' hidden':'')+'><span class=\"arw\">&larr;<\/span> Back<\/button>';\n    if(def.type==='multi') h += '<button type=\"button\" class=\"fwd\" data-next>Continue<\/button>';\n    h += '<\/div>';\n    sc.innerHTML = h;\n    body.innerHTML = '';\n    body.appendChild(sc);\n    wire();\n  }\n\n  function wire(){\n    body.querySelectorAll('.opt').forEach(function(btn){\n      btn.addEventListener('click', function(){\n        var def = stepDef(current);\n        var val = btn.getAttribute('data-val');\n        if(def.type==='multi'){\n          var arr = ans[current] ? ans[current].slice() : [];\n          var i = arr.indexOf(val);\n          if(i>-1) arr.splice(i,1); else arr.push(val);\n          ans[current] = arr;\n          btn.setAttribute('aria-pressed', arr.indexOf(val)>-1);\n        } else {\n          ans[current] = val;\n          if(current==='mode'){\n            delete ans.i_grondig; delete ans.i_type; delete ans.i_extra;\n            delete ans.e_staps; delete ans.e_dak; delete ans.e_coat;\n            delete ans.o_lengte; delete ans.o_locatie;\n            if(val==='fabrieksnieuw'){ ans.i_type='vlek'; ans.e_staps='s3'; }\n          }\n          if(current==='o_lengte'){ delete ans.o_locatie; if(val==='l3') ans.o_locatie='rotterdam'; }\n          if(current==='i_grondig'){ delete ans.i_type; if(val==='nee') ans.i_type='eco_direct'; }\n          advance();\n        }\n      });\n    });\n    var b = body.querySelector('[data-back]'); if(b) b.addEventListener('click', goBack);\n    var n = body.querySelector('[data-next]'); if(n) n.addEventListener('click', advance);\n    var r = body.querySelector('[data-restart]'); if(r) r.addEventListener('click', function(){ ans={}; current='mode'; render(); });\n  }\n\n  function advance(){\n    var pl = plan();\n    var idx = pl.indexOf(current);\n    current = (idx>-1 && idx < pl.length-1) ? pl[idx+1] : 'result';\n    render();\n  }\n  function goBack(){\n    var pl = plan();\n    var idx = pl.indexOf(current);\n    if(current==='result'){ current = pl[pl.length-1]; render(); return; }\n    if(idx>0){ current = pl[idx-1]; render(); }\n  }\n\n  function pkgInterieur(){\n    if(ans.mode==='exterieur' || ans.mode==='ongedierte') return null;\n    if(ans.mode==='fabrieksnieuw') return 'anti';\n    if(ans.i_grondig==='nee') return 'eco';\n    if(ans.i_type==='hyg') return 'hyg';\n    if(ans.i_type==='vlek' || ans.i_type==='lucht') return 'anti';\n    return null;\n  }\n\n  function ctaHref(headline, rows, totaalStr){\n    var details = rows.map(function(r){ return r.k.replace(\/&amp;\/g,'&') + ': ' + r.v; }).join(' | ');\n    return FORM_URL + '?advies=' + encodeURIComponent(headline)\n         + '&totaal=' + encodeURIComponent(totaalStr)\n         + '&details=' + encodeURIComponent(details);\n  }\n\n  function buildResult(){\n    \/\/ -------- Pest control result --------\n    if(ans.mode==='ongedierte'){\n      var lbl = {l1:'Up to 7.5 m', l2:'7.5 \u2013 9.5 m', l3:'Up to 15 m'}[ans.o_lengte||'l1'];\n      var loc = ans.o_locatie==='rotterdam' ? 'Rotterdam' : 'Gendringen';\n      var pO = P.ongedierte[ans.o_lengte||'l1'];\n      var meerprijs = loc==='Rotterdam' && ans.o_lengte!=='l3';\n      var totO = (meerprijs?'from ':'')+euro(pO+P.reiskosten);\n      var rowsO = [\n        {group:'Pest control', k:'Heat treatment', sub:'against bed bugs &amp; pests \u2014 vehicle length '+lbl, v:euro(pO)},\n        {group:'Pest control', k:'Location', sub:'', v:loc}\n      ];\n      if(meerprijs) rowsO.push({group:'Pest control', k:'Rotterdam surcharge', sub:'for vehicles up to 9.5 m', v:'on request'});\n      rowsO.push({group:'Pest control', k:'Travel costs', sub:'per trip', v:euro(P.reiskosten)});\n      var scO = document.createElement('section');\n      scO.className='screen active';\n      var hO = '<p class=\"rlabel\">Our advice<\/p><h2 class=\"rpkg\">Pest control<\/h2>'\n             + '<p class=\"rsub\">Heat treatment at location '+loc+' \u2014 100% elimination, not just removal.<\/p>'\n             + '<div class=\"rrows\">';\n      var lgO='';\n      rowsO.forEach(function(r){\n        if(r.group!==lgO){ hO+='<div class=\"grouphd\">'+r.group+'<\/div>'; lgO=r.group; }\n        hO+='<div class=\"row\"><span class=\"k\">'+r.k+(r.sub?'<small>'+r.sub+'<\/small>':'')+'<\/span><span class=\"v\">'+r.v+'<\/span><\/div>';\n      });\n      hO += '<div class=\"row total\"><span class=\"k\">Total (excl. VAT)<\/span><span class=\"v\">'+totO+'<\/span><\/div><\/div>';\n      hO += '<div class=\"infobox\">The exact price depends on the situation and the number of vehicles. Request a quote via the form.<\/div>';\n      hO += '<a class=\"cta\" href=\"'+ctaHref('Pest control \u2014 heat treatment ('+lbl+', '+loc+')', rowsO, totO)+'\">Schedule this treatment<\/a>';\n      hO += '<button type=\"button\" class=\"restart\" data-restart>Start over<\/button>';\n      hO += '<div class=\"nav\" style=\"margin-top:16px\"><button type=\"button\" class=\"back\" data-back><span class=\"arw\">&larr;<\/span> Back<\/button><\/div>';\n      scO.innerHTML = hO;\n      return scO;\n    }\n\n    var v = ans.voertuig==='bw' ? 'bw' : 'truck';\n    var vNaam = v==='bw' ? 'van' : 'truck';\n    var rows = [];\n    var combiBase = 0;\n    var extra = 0;\n    var onreq = [];\n    var headline = '', headsub = '';\n\n    var ik = pkgInterieur();\n    var hasInterieur = !!ik;\n    var hasExterieur = (ans.mode==='exterieur' || ans.mode==='compleet' || ans.mode==='fabrieksnieuw');\n\n    if(ik){\n      var pk = P.interieur[ik];\n      var base = pk[v];\n      combiBase += base;\n      rows.push({group:'Interior', k:pk.label+' package', sub:'for '+vNaam+' \u2014 '+pk.desc, v:euro(base)});\n      if(ans.i_type==='lucht'){ extra += P.ozon; rows.push({group:'Interior', k:'Ozone treatment', sub:'against persistent odours', v:euro(P.ozon)}); }\n      var ex = ans.i_extra||[];\n      ['schimmel','hondenharen','brand','leder'].forEach(function(key){\n        if(ex.indexOf(key)>-1){ extra += P.toeslag;\n          var lbl2 = {schimmel:'Mould',hondenharen:'Dog hair',brand:'Fire\/smoke damage',leder:'Leather treatment'}[key];\n          rows.push({group:'Interior', k:lbl2+' (surcharge)', v:euro(P.toeslag)});\n        }\n      });\n      if(ex.indexOf('gordijnen')>-1) onreq.push({k:'Curtain washing', v:P.gordijnen});\n    }\n\n    if(hasExterieur){\n      var st = ans.e_staps || 's1';\n      combiBase += P.polish[st];\n      rows.push({group:'Exterior', k:stNaam(st)+' polishing', sub:{s1:'Light correction + gloss restoration',s2:'Deeper correction \u2013 removes light scratches',s3:'Showroom quality, maximum correction \u2013 maximum gloss'}[st], v:euro(P.polish[st])});\n      if(ans.e_dak==='ja'){\n        combiBase += P.dak[st];\n        var dakLabel = v==='bw' ? 'Roof' : 'Roof &amp; back wall';\n        rows.push({group:'Exterior', k:dakLabel, sub:'polished along ('+stNaam(st)+')', v:euro(P.dak[st])});\n      }\n      if(ans.e_coat==='ja'){ extra += P.coating; rows.push({group:'Exterior', k:'Glass coating', sub:'years of paint protection against dirt, with colour retention', v:euro(P.coating)}); }\n    }\n\n    var combi = (hasInterieur && hasExterieur && ik!=='eco');\n    var discount = combi ? Math.round(combiBase*0.10*100)\/100 : 0;\n\n    var reiskosten = P.reiskosten;\n    extra += reiskosten;\n\n    var total = combiBase + extra - discount;\n\n    if(ans.mode==='fabrieksnieuw'){\n      headline='Factory-fresh package'; headsub='3-stage polishing + Anti-odour package, in showroom condition.';\n    } else if(hasInterieur && hasExterieur){\n      headline='Complete: '+P.interieur[ik].label+' + '+stNaam(ans.e_staps)+' polishing';\n      headsub= combi ? 'Interior and exterior together \u2014 with 10% combination discount.' : 'Interior and exterior together.';\n    } else if(hasInterieur){\n      headline=P.interieur[ik].label+' package'; headsub=P.interieur[ik].desc.replace(\/&amp;\/g,'&');\n    } else {\n      headline=stNaam(ans.e_staps)+' polishing'; headsub='Paint restoration based on the condition of your paint.';\n    }\n\n    var sc = document.createElement('section');\n    sc.className='screen active';\n    var h = '<p class=\"rlabel\">Our advice<\/p><h2 class=\"rpkg\">'+headline+'<\/h2><p class=\"rsub\">'+headsub+'<\/p>';\n    if(combi) h += '<span class=\"discount\">&#10003; 10% combination discount<\/span>';\n\n    h += '<div class=\"rrows\">';\n    var lastGroup = '';\n    rows.forEach(function(r){\n      if(r.group!==lastGroup){ h += '<div class=\"grouphd\">'+r.group+'<\/div>'; lastGroup=r.group; }\n      h += '<div class=\"row\"><span class=\"k\">'+r.k+(r.sub?'<small>'+r.sub+'<\/small>':'')+'<\/span><span class=\"v\">'+r.v+'<\/span><\/div>';\n    });\n    if(discount>0) h += '<div class=\"row disc\"><span class=\"k\">Combination discount (10%)<\/span><span class=\"v\">\u2212 '+euro(discount)+'<\/span><\/div>';\n    h += '<div class=\"row\"><span class=\"k\">Travel costs<small>per trip<\/small><\/span><span class=\"v\">'+euro(reiskosten)+'<\/span><\/div>';\n    h += '<div class=\"row total\"><span class=\"k\">Total (excl. VAT)<\/span><span class=\"v\">'+euro(Math.round(total*100)\/100)+'<\/span><\/div>';\n    onreq.forEach(function(o){ h += '<div class=\"row onrequest\"><span class=\"k\">'+o.k+'<\/span><span class=\"v\">'+o.v+'<\/span><\/div>'; });\n    h += '<\/div>';\n\n    if(ans.mode==='fabrieksnieuw') h += '<div class=\"infobox\"><b>Factory-fresh<\/b> combines the heaviest interior and exterior work. Extra situations (mould, odour, coating) you have already been able to add above.<\/div>';\n    else if(hasInterieur && hasExterieur && !combi) h += '<div class=\"infobox\">The <b>10% combination discount<\/b> applies from the <b>Hygiene package<\/b>. Choose deep cleaning to qualify.<\/div>';\n    else if(!combi && (hasInterieur || hasExterieur)) h += '<div class=\"infobox\">Want to combine inside &amp;&nbsp;outside? Then you get <b>10% combination discount<\/b> (from Hygiene) \u2014 start over and choose &#8220;Complete&#8221;.<\/div>';\n\n    var detailRows = rows.slice();\n    if(discount>0) detailRows.push({k:'Combination discount (10%)', v:'\u2212 '+euro(discount)});\n    detailRows.push({k:'Travel costs', v:euro(reiskosten)});\n    onreq.forEach(function(o){ detailRows.push({k:o.k, v:o.v}); });\n    h += '<a class=\"cta\" href=\"'+ctaHref(headline, detailRows, euro(Math.round(total*100)\/100))+'\">Schedule this cleaning<\/a>';\n    h += '<a class=\"cta2\" href=\"'+SUB_URL+'\">Prefer a regular basis? See the subscription &rarr;<\/a>';\n    h += '<button type=\"button\" class=\"restart\" data-restart>Start over<\/button>';\n    h += '<div class=\"nav\" style=\"margin-top:16px\"><button type=\"button\" class=\"back\" data-back><span class=\"arw\">&larr;<\/span> Back<\/button><\/div>';\n    sc.innerHTML = h;\n    return sc;\n  }\n\n  render();\n})();\n<\/script>\n<\/div>\n\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":4324,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-4545","page","type-page","status-publish","has-post-thumbnail","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/cabinereinigen.nl\/en\/wp-json\/wp\/v2\/pages\/4545","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cabinereinigen.nl\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/cabinereinigen.nl\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/cabinereinigen.nl\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/cabinereinigen.nl\/en\/wp-json\/wp\/v2\/comments?post=4545"}],"version-history":[{"count":1,"href":"https:\/\/cabinereinigen.nl\/en\/wp-json\/wp\/v2\/pages\/4545\/revisions"}],"predecessor-version":[{"id":4557,"href":"https:\/\/cabinereinigen.nl\/en\/wp-json\/wp\/v2\/pages\/4545\/revisions\/4557"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cabinereinigen.nl\/en\/wp-json\/wp\/v2\/media\/4324"}],"wp:attachment":[{"href":"https:\/\/cabinereinigen.nl\/en\/wp-json\/wp\/v2\/media?parent=4545"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}