PageSourceSearch

https://www.allcam.nl/cdn/shop/t/14/assets/inbouw-service.js?v=108966948337271673911791289005

js allcam.nl collected 2026-10-07 19:23:28 UTC 37,260 bytes, 2 lines download raw bytes

1(function(){"use strict";var C=window.AllcamInbouw;if(!C||window.__aciLoaded)return;window.__aciLoaded=!0;var POWERBANK_LABEL="Powerbank aansluiten",LEAFLET_JS="https://unpkg.com/[email protected]/dist/leaflet.js",LEAFLET_CSS="https://unpkg.com/[email protected]/dist/leaflet.css",CITY_COORDS={amsterdam:[52.3676,4.9041],almere:[52.3508,5.2647],arnhem:[51.9851,5.8987],bergschenhoek:[51.9895,4.4989],delfgauw:[52.004,4.398],nuenen:[51.4703,5.552],odoorn:[52.8519,6.8514],oirschot:[51.505,5.3131],rotterdam:[51.9244,4.4777],utrecht:[52.0907,5.1214],zaltbommel:[51.8108,5.2466],antwerpen:[51.2194,4.4025],"heist op den berg":[51.0758,4.7286],"heist-op-den-berg":[51.0758,4.7286],lommel:[51.2306,5.3131],mechelen:[51.0259,4.4776],eindhoven:[51.4416,5.4697],"den haag":[52.0705,4.3007],leiden:[52.1601,4.497],haarlem:[52.3874,4.6462],amersfoort:[52.1561,5.3878],zwolle:[52.5168,6.083],groningen:[53.2194,6.5665],nijmegen:[51.8126,5.8372],breda:[51.5719,4.7683],tilburg:[51.5555,5.0913],"'s-hertogenbosch":[51.6978,5.3037],"den bosch":[51.6978,5.3037],maastricht:[50.8514,5.691],enschede:[52.2215,6.8937],apeldoorn:[52.2112,5.9699],gent:[51.0543,3.7174],brussel:[50.8503,4.3517],leuven:[50.8798,4.7005],hasselt:[50.9307,5.3325],brugge:[51.2093,3.2247]};function cityKey(n){return String(n||"").trim().toLowerCase().replace(/\s+/g," ")}var DEFAULT_LOCATIONS=[{naam:"Amsterdam",land:"NL",coords:"52.3676, 4.9041"},{naam:"Almere",land:"NL",coords:"52.3508, 5.2647"},{naam:"Arnhem",land:"NL",coords:"51.9851, 5.8987"},{naam:"Bergschenhoek",land:"NL",coords:"51.9895, 4.4989"},{naam:"Delfgauw",land:"NL",coords:"52.0040, 4.3980",plus:!0,toeslag:100},{naam:"Odoorn",land:"NL",coords:"52.8519, 6.8514"},{naam:"Oirschot",land:"NL",coords:"51.5050, 5.3131"},{naam:"Rotterdam",land:"NL",coords:"51.9244, 4.4777"},{naam:"Utrecht",land:"NL",coords:"52.0907, 5.1214",toeslag:30},{naam:"Zaltbommel",land:"NL",coords:"51.8108, 5.2466"},{naam:"Antwerpen",land:"BE",coords:"51.2194, 4.4025"},{naam:"Heist op den Berg",land:"BE",coords:"51.0758, 4.7286"},{naam:"Lommel",land:"BE",coords:"51.2306, 5.3131"},{naam:"Mechelen",land:"BE",coords:"51.0259, 4.4776"}],rawFetch=window.fetch.bind(window),fmt=new Intl.NumberFormat("nl-NL",{style:"currency",currency:C.currency||"EUR"});function money(cents){return fmt.format(cents/100)}function esc(s){return String(s==null?"":s).replace(/[&<>"']/g,function(c){return{"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"}[c]})}function nl2br(t){return esc(String(t||"").trim()).replace(/\r?\n/g,"<br>")}function uid(){return"ib"+Date.now().toString(36)+Math.random().toString(36).slice(2,7)}function alertError(msg){window.dispatchEvent(new CustomEvent("showAlert",{detail:{message:msg,type:"error"}}))}function postJSON(url,body){return rawFetch(url,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json","X-Requested-With":"XMLHttpRequest"},body:JSON.stringify(body)}).then(function(r){return r.json().then(function(j){if(!r.ok||j.status)throw new Error(j.description||j.message||"Er ging iets mis.");return j})})}(C.variants||[]).forEach(function(v){v.dual=/achter/i.test(v.o1||""),v.pb=/^\s*(ja|met)\b/i.test(v.o2||"");var m=String(v.o3||"").replace(/[.\s]/g,"").match(/\d+/);v.fee=m?parseInt(m[0],10):0});function findVariant(dual,pb){return(C.variants||[]).filter(function(v){return v.dual===dual&&v.pb===pb&&v.fee===0&&v.available})[0]||null}function basePrice(dual){var v=findVariant(dual,!1);return v?v.price:null}function powerbankPrice(dual){var a=findVariant(dual,!0),b=findVariant(dual,!1);return a&&b?a.price-b.price:null}(C.feeVariants||[]).forEach(function(v){var m=String(v.o1||"").replace(/[.\s]/g,"").match(/\d+/);v.fee=m?parseInt(m[0],10):0});function findFee(amount){return amount&&(C.feeVariants||[]).filter(function(v){return v.fee===amount&&v.available})[0]||null}function normLand(v){return/^\s*(be|bel)/i.test(String(v||""))?"BE":"NL"}var SRC=(C.locations&&C.locations.length?C.locations:DEFAULT_LOCATIONS).slice().sort(function(a,b){var first=C.country==="BE"?"BE":"NL",ra=normLand(a.land)===first?0:1,rb=normLand(b.land)===first?0:1;return ra-rb||String(a.naam).localeCompare(String(b.naam),"nl")}),LOCS=SRC.map(function(l,i){var c=String(l.coords||"").split(",").map(function(x){return parseFloat(x)});return(isNaN(c[0])||isNaN(c[1]))&&(c=CITY_COORDS[cityKey(l.naam)]||[NaN,NaN]),{i:i,naam:l.naam,land:normLand(l.land),plus:!!l.plus,toeslag:parseInt(l.toeslag||0,10)||0,lat:c[0],lng:c[1],opmerking:l.opmerking||"",uren:l.uren||"",img:l.img||"",orderValue:l.naam+(l.plus?" (Plus partner)":"")}}
1),coordsReady=Promise.all(LOCS.filter(function(l){return isNaN(l.lat)||isNaN(l.lng)}).map(function(l){var key="aci-geo-"+l.land+"-"+cityKey(l.naam),hit=null;try{hit=JSON.parse(localStorage.getItem(key))}catch(e){}if(hit)return l.lat=hit[0],l.lng=hit[1],null;var url="https://nominatim.openstreetmap.org/search?format=json&limit=1&countrycodes="+l.land.toLowerCase()+"&city="+encodeURIComponent(l.naam);return rawFetch(url,{headers:{Accept:"application/json"}}).then(function(r){return r.json()}).then(function(j){if(j&&j[0]){l.lat=parseFloat(j[0].lat),l.lng=parseFloat(j[0].lon);try{localStorage.setItem(key,JSON.stringify([l.lat,l.lng]))}catch(e){}}}).catch(function(){})}));function fillPrices(root){(root||document).querySelectorAll("[data-aci-price]:not([data-filled])").forEach(function(el){var p=basePrice(el.dataset.type==="dual");p!=null&&(el.textContent="+"+money(p),el.setAttribute("data-filled",""))})}var modal,state={},map,markers={},leafletPromise,memory={merk:"",model:"",jaar:"",soort:"",motor:"",telefoon:"",kenteken:"",order:""},IS_NL=(C.country||"NL")==="NL",SOORTEN=[["auto","Personenauto"],["taxi","Taxi"],["bus","Bestelwagen of camper"]],MOTOREN=[["brandstof","Benzine of diesel"],["hybride","(Plug-in) hybride"],["ev","Elektrisch"]],BRANDS=["Audi","BMW","BYD","Citro\xEBn","Cupra","Dacia","Fiat","Ford","Honda","Hyundai","Jaguar","Jeep","Kia","Land Rover","Lexus","Lynk & Co","Mazda","Mercedes-Benz","MG","Mini","Mitsubishi","Nissan","Opel","Peugeot","Polestar","Porsche","Renault","Seat","Skoda","Smart","Subaru","Suzuki","Tesla","Toyota","Volkswagen","Volvo"],ICON_PIN='<svg viewBox="0 0 24 24" width="16" height="16" aria-hidden="true"><path fill="currentColor" d="M12 8a4 4 0 1 0 0 8 4 4 0 0 0 0-8Zm9 3h-2.07A7 7 0 0 0 13 5.07V3h-2v2.07A7 7 0 0 0 5.07 11H3v2h2.07A7 7 0 0 0 11 18.93V21h2v-2.07A7 7 0 0 0 18.93 13H21v-2Zm-9 6a5 5 0 1 1 0-10 5 5 0 0 1 0 10Z"/></svg>';function chips(name,list){return'<div class="aci-chips" role="radiogroup">'+list.map(function(o){return'<label class="aci-chip"><input type="radio" name="'+name+'" value="'+o[0]+'"><span>'+esc(o[1])+"</span></label>"}).join("")+"</div>"}function switchHtml(attr,label){return'<label class="aci-switch"><input type="checkbox" '+attr+'><span class="aci-slider" aria-hidden="true"><span class="aci-knob"></span></span><span class="aci-switch-label">'+label+"</span></label>"}function buildModal(){return modal||(modal=document.createElement("div"),modal.className="aci-modal",modal.setAttribute("hidden",""),modal.innerHTML='<div class="aci-backdrop" data-aci-close></div><div class="aci-dialog" role="dialog" aria-modal="true" aria-labelledby="aci-title"><header class="aci-head"><span class="aci-grip" aria-hidden="true"></span><h2 id="aci-title">Dashcam laten inbouwen</h2><button type="button" class="aci-x" data-aci-close aria-label="Sluiten">&times;</button></header><div class="aci-body"><div class="aci-intro" data-aci-intro></div><fieldset class="aci-field" data-aci-plaatsing-field><legend>Waar wordt de dashcam geplaatst? <span class="aci-req">*</span></legend><div class="aci-choices"><label class="aci-choice"><input type="radio" name="aci-plaatsing" value="single"><span>Alleen voor <em data-aci-pl-price="single"></em></span></label><label class="aci-choice"><input type="radio" name="aci-plaatsing" value="dual"><span>Voor en achter <em data-aci-pl-price="dual"></em></span></label></div><p class="aci-error" data-aci-err="plaatsing" hidden>Kies waar de dashcam geplaatst wordt.</p></fieldset><div class="aci-field" data-aci-order-field><label for="aci-order">Ordernummer van je dashcam <span class="aci-req">*</span></label><input id="aci-order" type="text" autocomplete="off" placeholder="Bijv. #12345" list="aci-orders" data-aci-order><datalist id="aci-orders">'+(C.customerOrders||[]).map(function(o){return'<option value="'+esc(o)+'">'}).join("")+'</datalist><p class="aci-help">De inbouw service is alleen beschikbaar voor dashcams die bij Allcam zijn gekocht. Je vindt het ordernummer in je bevestigingsmail'+((C.customerOrders||[]).length?" of kies hem uit de lijst":"")+'.</p><p class="aci-error" data-aci-err="order" hidden>Vul het ordernummer van je dashcam in.</p></div><fieldset class="aci-field"><legend>Kies een locatie <span class="aci-req">*</span></legend><p class="aci-help aci-help--top"><span class="aci-badge">Plus partner</span> Zeer zorgvuldige installatie \xE9n een uitgebreide uitleg over de werking van je dashcam (1 uur extra).</p><div class="aci-locwrap"><div class="aci-map" data-aci-map><div class="aci-map-fallback">Kaart laden\u2026</div></div><div class="aci-listwrap"><div class="aci-listtools"><input type="search" placeholder="Zoek op plaats" data-aci-search aria-label="Zoek op plaats"><button type="button" class="aci-near" data-aci-near title="Sorteer op afstand tot jouw locatie">'+ICON_PIN+'<span>Dichtstbij</span></button></div><ul class="aci-list" data-aci-list></ul></div></div><p class="aci-error" data-aci-err="locatie" hidden>Kies een locatie.</p></fieldset><fieldset class="aci-field aci-car"><legend>Jouw auto</legend>'+(IS_NL?'<div class="aci-plate-row"><label class="aci-plate"><span class="aci-plate-nl" aria-hidden="true">NL</span><input type="text" maxlength="9" autocomplete="off" placeholder="Kenteken" aria-label="Kenteken" data-aci-kenteken></label><button type="button" class="aci-btn-soft" data-aci-rdw>Gegevens ophalen</button></div><p class="aci-help" data-aci-rdw-status>Vul je kenteken in, dan vullen we merk, model, bouwjaar en motor automatisch in.</p>':"")+'<div class="aci-grid3"><div><label for="aci-merk">Merk <span class="aci-req">*</span></label><input id="aci-merk" type="text" autocomplete="off" list="aci-brands" placeholder="Bijv. Volkswagen" data-aci-merk><datalist id="aci-brands">'+BRANDS.map(function(b){return'<option value="'+esc(b)+'">'}
1).join("")+'</datalist></div><div><label for="aci-model">Model <span class="aci-req">*</span></label><input id="aci-model" type="text" autocomplete="off" placeholder="Bijv. Golf" data-aci-model></div><div><label for="aci-jaar">Bouwjaar <span class="aci-req">*</span></label><input id="aci-jaar" type="text" inputmode="numeric" maxlength="4" autocomplete="off" placeholder="Bijv. 2021" data-aci-jaar></div></div><p class="aci-error" data-aci-err="auto" hidden>Vul merk, model en bouwjaar in.</p><p class="aci-sublabel">Type voertuig <span class="aci-req">*</span></p>'+chips("aci-soort",SOORTEN)+'<p class="aci-error" data-aci-err="soort" hidden>Kies het type voertuig.</p><p class="aci-sublabel">Type motor <span class="aci-req">*</span></p>'+chips("aci-motor",MOTOREN)+'<p class="aci-error" data-aci-err="motor" hidden>Kies het type motor.</p><div data-aci-notes></div></fieldset><div class="aci-field">'+switchHtml("data-aci-pb",POWERBANK_LABEL+"? <strong data-aci-pb-price></strong>")+'<p class="aci-note aci-note--ok" data-aci-pb-found hidden>Er zit een powerbank in je winkelwagen, daarom hebben we het aansluiten alvast aangezet.</p><p class="aci-help">'+C.texts.powerbank+'</p></div><div class="aci-field"><label for="aci-telefoon">Telefoonnummer <span class="aci-req">*</span></label><input id="aci-telefoon" type="tel" autocomplete="tel" placeholder="06 12345678" data-aci-telefoon><p class="aci-help">Op dit nummer neemt de inbouw partner contact met je op voor een afspraak.</p><p class="aci-error" data-aci-err="telefoon" hidden>Vul een geldig telefoonnummer in.</p></div><div class="aci-summary-box" data-aci-overview></div></div><footer class="aci-foot"><div class="aci-total"><span>Totaal inbouw</span><strong data-aci-total>\u2013</strong></div><button type="button" class="aci-confirm" data-aci-confirm>Bevestigen</button></footer></div>',document.body.appendChild(modal),modal.addEventListener("click",function(e){if(e.target.closest("[data-aci-close]")){closeModal(!1);return}var li=e.target.closest("[data-aci-loc]");if(li){selectLocation(parseInt(li.dataset.aciLoc,10),!0);return}if(e.target.closest("[data-aci-confirm]")){confirm();return}if(e.target.closest("[data-aci-near]")){sortByDistance();return}if(e.target.closest("[data-aci-rdw]")){lookupPlate();return}e.target.closest("[data-aci-pb-on]")&&(e.preventDefault(),setPb(!0))}),modal.addEventListener("change",function(e){var t=e.target;t.name==="aci-plaatsing"&&(state.dual=t.value==="dual",hideErr("plaatsing")),t.name==="aci-soort"&&(state.soort=t.value,hideErr("soort")),t.name==="aci-motor"&&(state.motor=t.value,hideErr("motor")),t.matches("[data-aci-pb]")&&(state.pb=t.checked,state.pbTouched=!0),refresh()}),modal.addEventListener("input",function(e){var t=e.target;if(t.matches("[data-aci-search]")){renderList(t.value);return}if(t.matches("[data-aci-merk],[data-aci-model],[data-aci-jaar]")&&hideErr("auto"),t.matches("[data-aci-telefoon]")&&hideErr("telefoon"),t.matches("[data-aci-order]")&&hideErr("order"),t.matches("[data-aci-kenteken]")){t.value=t.value.toUpperCase();var k=t.value.replace(/[^A-Z0-9]/g,"");k.length===6&&k!==state.lastPlate&&lookupPlate()}refresh()}),modal.addEventListener("keydown",function(e){e.key==="Enter"&&e.target.matches("[data-aci-kenteken]")&&(e.preventDefault(),lookupPlate())}),document.addEventListener("keydown",function(e){e.key==="Escape"&&!modal.hasAttribute("hidden")&&closeModal(!1)}),renderList(""),modal)}function $(sel){return modal.querySelector(sel)}function showErr(k){var el=$('[data-aci-err="'+k+'"]');el&&(el.hidden=!1)}function hideErr(k){var el=$('[data-aci-err="'+k+'"]');el&&(el.hidden=!0)}function val(sel){var el=$(sel);return el?el.value.trim():""}function setRadio(name,v){modal.querySelectorAll('input[name="'+name+'"]').forEach(function(r){r.checked=r.value===v})}function setPb(on){state.pb=!!on,state.pbTouched=!0;var cb=$("[data-aci-pb]");cb.checked=state.pb,syncSwitch(cb),refresh()}function cap(s){return String(s||"").toLowerCase().replace(/(^|[\s\-\/])([a-zà-ÿ])/g,function(m,a,b){return a+b.toUpperCase()})}function lookupPlate(){var input=$("[data-aci-kenteken]"),status=$("[data-aci-rdw-status]");if(input){var k=input.value.toUpperCase().replace(/[^A-Z0-9]/g,"");if(k.length!==6){status.textContent="Vul een geldig Nederlands kenteken in (6 tekens).",status.className="aci-help aci-help--warn";return}state.lastPlate=k,status.textContent="Gegevens ophalen\u2026",status.className="aci-help";var base="https://opendata.rdw.nl/resource/";Promise.all([rawFetch(base+"m9d7-ebf2.json?kenteken="+k).then(function(r){return r.json()}),rawFetch(base+"8ys7-d773.json?kenteken="+k).then(function(r){return r.json()}).catch(function(){return[]})]).then(function(res){var v=res[0]&&res[0][0];if(!v){status.textContent="Kenteken niet gevonden. Vul de gegevens hieronder zelf in.",status.className="aci-help aci-help--warn";return}var merk=String(v.merk||"");merk=merk.length<=4?merk.toUpperCase():cap(merk);var model=String(v.handelsbenaming||"");model.toUpperCase().indexOf(merk.toUpperCase()+" ")===0&&(model=model.slice(merk.length+1)),model=/[a-z]/.test(model)?model:cap(model);var jaar=String(v.datum_eerste_toelating||"").slice(0,4);$("[data-aci-merk]").value=merk,$("[data-aci-model]").value=model,$("[data-aci-jaar]").value=jaar;var soort=String(v.taxi_indicator||"").toLowerCase()==="ja"?"taxi":/bedrijf/i.test(v.voertuigsoort||"")||/kampeer|camper/i.test(v.inrichting||"")?"bus":"auto",fuels=(res[1]||[]).map(function(f){return String(f.brandstof_omschrijving||"").toLowerCase()}),elec=fuels.indexOf("elektriciteit")>-1,comb=fuels.some(function(f){return f&&f!=="elektriciteit"}),motor=elec&&comb?"hybride":elec?"ev":fuels.length?"brandstof":null;state.soort=soort,setRadio("aci-soort",soort),motor&&(state.motor=motor,setRadio("aci-motor",motor)),hideErr("auto"),hideErr("soort"),motor&&hideErr("motor"),status.innerHTML="&#10003; "+esc(merk+" "+model+(jaar?" ("+jaar+")":""))+" \u2013 controleer de gegevens hieronder.",status.className="aci-help aci-help--ok",refresh()}).catch(function(){status.textContent="Ophalen lukt nu niet. Vul de gegevens hieronder zelf in.",status.className="aci-help aci-help--warn"})}}function renderNotes(){var html="",merk=val("[data-aci-merk]").toLowerCase();(state.motor==="ev"||state.motor==="hybride")&&(html+='<div class="aci-note aci-note--warn">'+C.texts.ev+(state.pb?"":' <a href="#" data-aci-pb-on>Powerbank aansluiten toevoegen</a>')+"</div>"),state.soort==="bus"&&(html+='<div class="aci-note">'+C.texts.bus+"</div>"),Object.keys(C.brandNotes||{}
1).forEach(function(b){merk&&(merk===b||merk.indexOf(b)===0)&&(html+='<div class="aci-note">'+C.brandNotes[b]+"</div>")}),$("[data-aci-notes]").innerHTML=html}function checkCartPowerbank(){var ids=C.powerbankIds||[];rawFetch("/cart.js",{headers:{Accept:"application/json"}}).then(function(r){return r.json()}).then(function(cart){var has=(cart.items||[]).some(function(it){return ids.indexOf(it.product_id)>-1||/powerbank/i.test(it.product_title||"")&&it.product_id!==C.serviceProductId});if(has&&!state.pbTouched&&!state.pb){state.pb=!0;var cb=$("[data-aci-pb]");cb.checked=!0,syncSwitch(cb),$("[data-aci-pb-found]").hidden=!1,refresh()}}).catch(function(){})}function locMeta(l){var bits=[];return l.plus&&bits.push('<span class="aci-badge">Plus partner</span>'),l.toeslag&&bits.push('<span class="aci-fee">+'+money(l.toeslag*100)+"</span>"),bits.join(" ")}function locItemHtml(l,selected,showDist,extra){return'<div role="button" tabindex="0" class="aci-loc'+(selected?" is-selected":"")+(l.plus?" is-plus":"")+'" data-aci-loc="'+l.i+'" aria-pressed="'+selected+'"><span class="aci-loc-name">'+esc(l.naam)+(showDist&&l.dist!=null?" <small>"+Math.round(l.dist)+" km</small>":"")+'</span><span class="aci-loc-meta">'+locMeta(l)+"</span>"+(l.opmerking?'<span class="aci-loc-note">'+nl2br(l.opmerking)+"</span>":"")+(selected&&(l.img||l.uren)?'<span class="aci-loc-details">'+(l.img?'<img src="'+esc(l.img)+'" alt="'+esc(l.naam)+'" loading="lazy">':"")+(l.uren?'<span class="aci-loc-hours"><strong>Openingstijden</strong><br>'+nl2br(l.uren)+"</span>":"")+"</span>":"")+(extra||"")+"</div>"}function pinIcon(L,l){var logo=C.pinLogo?" style=\"background-image:url('"+C.pinLogo+"')\"":"";return L.divIcon({className:"aci-pin"+(l.plus?" is-plus":""),html:"<span"+logo+"></span>",iconSize:[38,46],iconAnchor:[19,46],tooltipAnchor:[0,-40]})}function addMarkers(L,m,onClick){var out={},bounds=[];return L.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",{maxZoom:18,attribution:"&copy; OpenStreetMap"}).addTo(m),LOCS.forEach(function(l){if(!(isNaN(l.lat)||isNaN(l.lng))){var mk=L.marker([l.lat,l.lng],{icon:pinIcon(L,l),title:l.naam,riseOnHover:!0}).addTo(m);mk.bindTooltip(esc(l.naam)+(l.plus?" \xB7 Plus partner":"")+(l.toeslag?" \xB7 +"+money(l.toeslag*100):""),{direction:"top"}),mk.on("click",function(){onClick(l.i)}),out[l.i]=mk,bounds.push([l.lat,l.lng])}}),bounds.length&&m.fitBounds(bounds,{padding:[24,24]}),out}function highlightMarkers(mks,i){Object.keys(mks).forEach(function(k){var el=mks[k].getElement&&mks[k].getElement();el&&el.classList.toggle("is-selected",parseInt(k,10)===i),parseInt(k,10)===i&&mks[k].setZIndexOffset?mks[k].setZIndexOffset(1e3):mks[k].setZIndexOffset&&mks[k].setZIndexOffset(0)})}function renderList(q){var list=$("[data-aci-list]");q=(q||"").trim().toLowerCase();var items=(state.order||LOCS).filter(function(l){return!q||l.naam.toLowerCase().indexOf(q)>-1}),html="",lastLand=null,sorted=!!state.order;items.forEach(function(l){!sorted&&l.land!==lastLand&&(html+='<li class="aci-group">'+(l.land==="BE"?"Belgi\xEB":"Nederland")+"</li>",lastLand=l.land),html+="<li>"+locItemHtml(l,state.loc===l.i,sorted,"")+"</li>"}),list.innerHTML=html||'<li class="aci-empty">Geen locaties gevonden.</li>'}function sortByDistance(){if(navigator.geolocation){var btn=$("[data-aci-near]");btn.disabled=!0,btn.querySelector("span").textContent="Zoeken\u2026",navigator.geolocation.getCurrentPosition(function(pos){var la=pos.coords.latitude,lo=pos.coords.longitude;LOCS.forEach(function(l){l.dist=haversine(la,lo,l.lat,l.lng)}),state.order=LOCS.slice().sort(function(a,b){return a.dist-b.dist}),renderList($("[data-aci-search]").value),btn.disabled=!1,btn.querySelector("span").textContent="Dichtstbij",map&&map.setView([la,lo],9)},function(){btn.disabled=!1,btn.querySelector("span").textContent="Dichtstbij"},{timeout:8e3})}}function haversine(a1,o1,a2,o2){var r=Math.PI/180,d1=(a2-a1)*r,d2=(o2-o1)*r,x=Math.sin(d1/2)*Math.sin(d1/2)+Math.cos(a1*r)*Math.cos(a2*r)*Math.sin(d2/2)*Math.sin(d2/2);return 6371*2*Math.atan2(Math.sqrt(x),Math.sqrt(1-x))}function selectLocation(i,fromList){state.loc=i,hideErr("locatie"),renderList($("[data-aci-search]").value),highlightMarkers(markers,i);var l=LOCS[i];
1map&&l&&fromList&&map.setView([l.lat,l.lng],Math.max(map.getZoom(),9));var btn=modal.querySelector('[data-aci-loc="'+i+'"]');btn&&btn.scrollIntoView({block:"nearest",behavior:"smooth"}),updateTotal()}function loadLeaflet(){return window.L?Promise.resolve(window.L):leafletPromise||(leafletPromise=new Promise(function(resolve,reject){var css=document.createElement("link");css.rel="stylesheet",css.href=LEAFLET_CSS,document.head.appendChild(css);var s=document.createElement("script");s.src=LEAFLET_JS,s.async=!0,s.onload=function(){resolve(window.L)},s.onerror=reject,document.head.appendChild(s)}),leafletPromise)}function initMap(){return coordsReady.then(loadLeaflet).then(function(L){var el=$("[data-aci-map]");map||(el.innerHTML="",map=L.map(el,{scrollWheelZoom:!1,attributionControl:!0}),markers=addMarkers(L,map,function(i){selectLocation(i,!1)})),setTimeout(function(){map.invalidateSize(),highlightMarkers(markers,state.loc)},60)}).catch(function(){$("[data-aci-map]").innerHTML='<div class="aci-map-fallback">Kaart kon niet geladen worden \u2013 kies een locatie uit de lijst.</div>'})}function currentVariant(){return state.dual==null?null:findVariant(state.dual,!!state.pb)}function currentFee(){var l=LOCS[state.loc];if(!(!l||!l.toeslag)){var f=findFee(l.toeslag);return!f&&window.console&&console.warn("[Inbouw] Geen variant voor toeslag \u20AC"+l.toeslag+" in product inbouw-locatietoeslag"),f}}function carDesc(){var m=[val("[data-aci-merk]"),val("[data-aci-model]")].filter(Boolean).join(" "),j=val("[data-aci-jaar]");return m?m+(j?" ("+j+")":""):""}function labelOf(list,v){var o=list.filter(function(x){return x[0]===v})[0];return o?o[1]:""}function updateTotal(){refresh()}function durationText(){var l=LOCS[state.loc],extra=l&&l.plus?", plus ongeveer 1 uur uitleg bij een Plus partner":"";return state.dual==null?"ongeveer 1 tot 1,5 uur voor 1CH en 2 uur voor 2CH"+extra:(state.dual?"ongeveer 2 uur":"ongeveer 1 tot 1,5 uur")+extra}function refresh(){if(modal){var du=modal.querySelector("[data-aci-duur]");du&&(du.textContent=durationText());var totalEl=$("[data-aci-total]"),pbPrice=powerbankPrice(state.dual==null?!1:state.dual);$("[data-aci-pb-price]").textContent=pbPrice!=null?"+"+money(pbPrice):"",renderNotes();var ov=$("[data-aci-overview]");if(state.dual==null){totalEl.textContent="\u2013",ov.hidden=!0;return}var v=currentVariant(),f=currentFee(),l=LOCS[state.loc];if(!v||f===null){totalEl.textContent="Niet beschikbaar",ov.hidden=!0;return}var total=v.price+(f?f.price:0);totalEl.textContent=money(total);var base=basePrice(state.dual),car=carDesc(),rows="<li><span>Inbouw dashcam \u2013 "+(state.dual?"voor en achter":"alleen voorzijde")+"</span><span>"+money(base)+"</span></li>";state.pb&&(rows+="<li><span>"+POWERBANK_LABEL+"</span><span>"+money(v.price-base)+"</span></li>"),f&&(rows+="<li><span>Locatietoeslag "+esc(l.naam)+"</span><span>"+money(f.price)+"</span></li>"),rows+='<li class="aci-sum-total"><span>Totaal</span><span>'+money(total)+"</span></li>",ov.innerHTML='<p class="aci-sum-title">Inbouw service'+(car?" voor je <strong>"+esc(car)+"</strong>":"")+(l?" in <strong>"+esc(l.naam)+"</strong>":"")+'</p><ul class="aci-sum-rows">'+rows+"</ul>",ov.hidden=!1}}function openModal(opts){buildModal();var prev=opts.answers||{},isService=opts.mode==="service";state={mode:opts.mode,dual:isService?prev.dual==null?null:prev.dual:opts.dual,pb:!!prev.pb,pbTouched:!!prev.variant,loc:prev.loc==null?null:prev.loc,soort:prev.soort||memory.soort||null,motor:prev.motor||memory.motor||null,order:state.order,lastPlate:null,onConfirm:opts.onConfirm,onCancel:opts.onCancel},$("[data-aci-intro]").innerHTML=isService?C.texts.los:opts.dual?C.texts.dual:C.texts.single,$("[data-aci-plaatsing-field]").hidden=!isService,modal.classList.toggle("is-service",isService),$("[data-aci-order-field]").hidden=!isService,["single","dual"].forEach(function(t){var p=basePrice(t==="dual");$('[data-aci-pl-price="'+t+'"]').textContent=p!=null?money(p):""}),modal.querySelectorAll('input[name="aci-plaatsing"]').forEach(function(r){r.checked=state.dual!=null&&r.value==="dual"===state.dual}),setRadio("aci-soort",state.soort),setRadio("aci-motor",state.motor);var pbcb=$("[data-aci-pb]");pbcb.checked=state.pb,syncSwitch(pbcb),$("[data-aci-pb-found]").hidden=!0,$("[data-aci-merk]").value=prev.merk||memory.merk,$("[data-aci-model]").value=prev.model||memory.model,$("[data-aci-jaar]").value=prev.jaar||memory.jaar,$("[data-aci-telefoon]").value=prev.telefoon||memory.telefoon,$("[data-aci-order]").value=prev.order||memory.order,$("[data-aci-kenteken]")&&($("[data-aci-kenteken]").value=prev.kenteken||memory.kenteken),$("[data-aci-confirm]").textContent=isService?"In winkelwagen":opts.mode==="cart"?"Inbouw toevoegen":"Bevestigen",$("[data-aci-confirm]").disabled=!1,modal.querySelectorAll(".aci-error").forEach(function(e){e.hidden=!0}),renderList($("[data-aci-search]").value),modal.removeAttribute("hidden"),document.documentElement.classList.add("aci-open"),$(".aci-body").scrollTop=0,refresh(),initMap(),prev.variant||checkCartPowerbank(),setTimeout(function(){var x=$(".aci-x");x&&x.focus({preventScroll:!0})},30)}function closeModal(confirmed){modal&&(modal.setAttribute("hidden",""),document.documentElement.classList.remove("aci-open"),!confirmed&&state.onCancel&&state.onCancel())}function confirm(){var ok=!0,firstErr=null,merk=val("[data-aci-merk]"),model=val("[data-aci-model]"),jaar=val("[data-aci-jaar]"),telefoon=val("[data-aci-telefoon]"),order=val("[data-aci-order]"),kenteken=$("[data-aci-kenteken]")?val("[data-aci-kenteken]").toUpperCase():"";function fail(k){ok=!1,showErr(k),firstErr||(firstErr=$('[data-aci-err="'+k+'"]'))}if(state.mode==="service"&&state.dual==null&&fail("plaatsing"),state.mode==="service"&&!/\d{3,}/.test(order)&&fail("order"),(state.loc==null||!LOCS[state.loc])&&fail("locatie"),(!merk||!model||!/^(19|20)\d{2}$/.test(jaar))&&fail("auto"),state.soort||fail("soort"),state.motor||fail("motor"),telefoon.replace(/\D/g,"").length<9&&fail("telefoon"),!ok){firstErr&&firstErr.scrollIntoView({block:"center",behavior:"smooth"});return}var v=currentVariant(),f=currentFee();if(!v||f===null){alertError("Deze combinatie is op dit moment niet beschikbaar. Neem contact met ons op.");return}memory={merk:merk,model:model,jaar:jaar,soort:state.soort,motor:state.motor,telefoon:telefoon,kenteken:kenteken,order:order};var l=LOCS[state.loc],answers={dual:state.dual,pb:!!state.pb,loc:state.loc,location:l,merk:merk,model:model,jaar:jaar,kenteken:kenteken,order:order,soort:state.soort,motor:state.motor,telefoon:telefoon,voertuig:merk+" "+model+" "+jaar,variant:v,fee:f||null,total:v.price+(f?f.price:0)},btn=$("[data-aci-confirm]");btn.disabled=!0,Promise.resolve(state.onConfirm(answers)).then(function(res){btn.disabled=!1,res!==!1&&closeModal(!0)},function(err){btn.disabled=!1,alertError(err&&err.message?err.message:"Er ging iets mis, probeer het opnieuw.")})}function buildProperties(a,dashcamTitle,linkId){var p={};return p.Plaatsing=a.dual?"Voor en achter":"Alleen voor",p.Locatie=a.location.orderValue,p[POWERBANK_LABEL]=a.pb?"Ja":"Nee",p.Voertuig=a.voertuig,a.kenteken&&(p.Kenteken=a.kenteken),p["Type voertuig"]=labelOf(SOORTEN,a.soort),p["Type motor"]=labelOf(MOTOREN,a.motor),p.Telefoon=a.telefoon,!dashcamTitle&&a.order&&(p["Ordernummer dashcam"]=a.order),linkId&&dashcamTitle&&(p._inbouw_id=linkId),linkId&&a.fee&&(p._toeslag_id=linkId),p}function cartItems(a,dashcamTitle,linkId){var items=[{id:a.variant.id,quantity:1,properties:buildProperties(a,dashcamTitle,linkId)}];return a.fee&&items.unshift(feeItem(a,linkId)),items}
1function feeItem(a,linkId){return{id:a.fee.id,quantity:1,properties:{Locatie:a.location.orderValue,_toeslag_id:linkId}}}function syncSwitch(input){var lab=input&&input.closest(".aci-switch");lab&&lab.classList.toggle("is-on",!!input.checked)}document.addEventListener("change",function(e){e.target.matches&&e.target.matches(".aci-switch input")&&syncSwitch(e.target)},!0),document.addEventListener("keydown",function(e){(e.key==="Enter"||e.key===" ")&&e.target.matches&&e.target.matches('.aci-loc[role="button"]')&&(e.preventDefault(),e.target.click())});function initLocSections(){document.querySelectorAll("[data-aci-locmap]:not([data-aci-ready])").forEach(function(sec){sec.setAttribute("data-aci-ready","");var svc=document.querySelector("[data-aci-service]"),sel=null,mks={},smap=null;sec.innerHTML='<div class="aci-locwrap aci-locwrap--page"><div class="aci-map" data-aci-secmap><div class="aci-map-fallback">Kaart laden\u2026</div></div><div class="aci-listwrap"><ul class="aci-list" data-aci-seclist></ul></div></div>';var list=sec.querySelector("[data-aci-seclist]");function render(){var html="",last=null;LOCS.forEach(function(l){l.land!==last&&(html+='<li class="aci-group">'+(l.land==="BE"?"Belgi\xEB":"Nederland")+"</li>",last=l.land);var extra=svc&&sel===l.i?'<span class="aci-loc-cta" data-aci-plan="'+l.i+'">Inbouw plannen in '+esc(l.naam)+" &rarr;</span>":"";html+="<li>"+locItemHtml(l,sel===l.i,!1,extra)+"</li>"}),list.innerHTML=html}function pick(i,fromMap){sel=i,render(),highlightMarkers(mks,i);var l=LOCS[i];if(smap&&l&&!fromMap&&smap.setView([l.lat,l.lng],Math.max(smap.getZoom(),9)),fromMap){var b=list.querySelector('[data-aci-loc="'+i+'"]');b&&b.scrollIntoView({block:"nearest",behavior:"smooth"})}}sec.addEventListener("click",function(e){var plan=e.target.closest("[data-aci-plan]");if(plan&&svc){e.stopPropagation();var form=document.getElementById(svc.dataset.form),prev=svc._aci||{};openModal({mode:"service",answers:{dual:prev.dual,pb:prev.pb,voertuig:prev.voertuig,telefoon:prev.telefoon,loc:parseInt(plan.dataset.aciPlan,10)},onConfirm:function(a){return svc._aci=a,submitService(form,a)}});return}var it=e.target.closest("[data-aci-loc]");it&&pick(parseInt(it.dataset.aciLoc,10),!1)}),render();var mapEl=sec.querySelector("[data-aci-secmap]"),go=function(){coordsReady.then(loadLeaflet).then(function(L){mapEl.innerHTML="",smap=L.map(mapEl,{scrollWheelZoom:!1}),mks=addMarkers(L,smap,function(i){pick(i,!0)})}).catch(function(){mapEl.innerHTML='<div class="aci-map-fallback">Kaart kon niet geladen worden.</div>'})};if("IntersectionObserver"in window){var io=new IntersectionObserver(function(en){en[0].isIntersecting&&(io.disconnect(),go())},{rootMargin:"300px"});io.observe(sec)}else go()})}function summaryHtml(a){return"<p><strong>"+esc(a.location.naam)+"</strong>"+(a.location.plus?' <span class="aci-badge">Plus partner</span>':"")+" \xB7 "+esc(a.merk+" "+a.model)+(a.pb?" \xB7 powerbank":"")+" \xB7 <strong>"+money(a.total)+'</strong></p><a href="#" role="button" class="aci-edit" data-aci-edit>Wijzigen</a>'}document.addEventListener("change",function(e){var cb=e.target.closest("[data-aci-checkbox]");if(cb){var box=cb.closest("[data-aci-toggle]");cb.checked?openToggle(box):(box._aci=null,box.querySelector("[data-aci-summary]").hidden=!0);return}var ccb=e.target.closest("[data-aci-cart-checkbox]");ccb&&ccb.checked&&openCartToggle(ccb.closest("[data-aci-cart]"),ccb)}),document.addEventListener("click",function(e){var ed=e.target.closest("[data-aci-edit]");ed&&(e.preventDefault(),openToggle(ed.closest("[data-aci-toggle]")))});function openToggle(box){var cb=box.querySelector("[data-aci-checkbox]");openModal({mode:"product",dual:box.dataset.type==="dual",answers:box._aci,onConfirm:function(a){box._aci=a,cb.checked=!0,syncSwitch(cb);var s=box.querySelector("[data-aci-summary]");s.innerHTML=summaryHtml(a),s.hidden=!1},onCancel:function(){box._aci||(cb.checked=!1,syncSwitch(cb))}})}document.addEventListener("submit",function(e){var form=e.target,formId=form&&form.getAttribute&&form.getAttribute("id");if(!(!formId||formId.indexOf("main-product-form-")!==0)){if(form.dataset.aciPass==="1"){form.dataset.aciPass="";return}var svc=document.querySelector('[data-aci-service][data-form="'+formId+'"]'),box=document.querySelector('[data-aci-toggle][data-form="'+formId+'"]');if(svc){e.preventDefault(),e.stopImmediatePropagation(),openModal({mode:"service",answers:svc._aci,onConfirm:function(a2){return svc._aci=a2,submitService(form,a2)}});return}if(box){var cb=box.querySelector("[data-aci-checkbox]");if(setHidden(form,"_inbouw_id",null),!cb.checked)return;if(e.preventDefault(),e.stopImmediatePropagation(),!box._aci){openToggle(box);return}var a=box._aci,link=uid();setHidden(form,"_inbouw_id",link),form.classList.add("processing"),postJSON("/cart/add.js",{items:cartItems(a,box.dataset.title,link)}).then(function(){passSubmit(form)}).catch(function(err){form.classList.remove("processing"),setHidden(form,"_inbouw_id",null),alertError(err.message)})}}},!0);function setHidden(form,key,value){var name="properties["+key+"]",el=form.querySelector('input[data-aci-hidden][name="'+name+'"]');
1if(value==null){el&&el.remove();return}el||(el=document.createElement("input"),el.type="hidden",el.name=name,el.setAttribute("data-aci-hidden",""),form.appendChild(el)),el.value=value}function passSubmit(form){form.dataset.aciPass="1",form.requestSubmit?form.requestSubmit():form.dispatchEvent(new Event("submit",{cancelable:!0,bubbles:!0}))}function submitService(form,a){var link=uid();Array.prototype.forEach.call(form.elements,function(el){el.name==="id"&&(el.value=a.variant.id)}),form.querySelectorAll("input[data-aci-hidden]").forEach(function(el){el.remove()});var props=buildProperties(a,null,link);if(Object.keys(props).forEach(function(k){setHidden(form,k,props[k])}),!a.fee){passSubmit(form);return}return postJSON("/cart/add.js",{items:[feeItem(a,link)]}).then(function(){passSubmit(form)})}function openCartToggle(box,cb){var props={};try{props=JSON.parse(box.querySelector("[data-aci-props]").textContent)||{}}catch(err){props={}}openModal({mode:"cart",dual:box.dataset.type==="dual",onConfirm:function(a){var link=uid();return props._inbouw_id=link,busy=!0,postJSON("/cart/change.js",{id:box.dataset.key,quantity:parseInt(box.dataset.qty,10)||1,properties:props}).then(function(){return postJSON("/cart/add.js",{items:cartItems(a,box.dataset.title,link)})}).then(function(){busy=!1,refreshCart(!0)}).catch(function(err){throw busy=!1,err})},onCancel:function(){cb.checked=!1,syncSwitch(cb)}})}function refreshCart(openPanel){if(C.isCartPage){window.location.reload();return}window.ajaxCart&&typeof window.ajaxCart.load=="function"&&window.ajaxCart.load(!1,!!openPanel,!1,!0)}var busy=!1,reconcileTimer;function scheduleReconcile(){clearTimeout(reconcileTimer),reconcileTimer=setTimeout(reconcile,400)}function reconcile(){if(busy){scheduleReconcile();return}rawFetch("/cart.js",{headers:{Accept:"application/json"}}).then(function(r){return r.json()}).then(function(cart){var isSvc=function(it){return it.product_id===C.serviceProductId},isFee=function(it){return C.feeProductId&&it.product_id===C.feeProductId},prop=function(it,k){return it.properties&&it.properties[k]},dashcams={},services={},updates={},n=0;if(cart.items.forEach(function(it){!isSvc(it)&&!isFee(it)&&prop(it,"_inbouw_id")&&(dashcams[prop(it,"_inbouw_id")]=!0)}),cart.items.forEach(function(it){if(isSvc(it)){var id=prop(it,"_inbouw_id");id&&!dashcams[id]?(updates[it.key]=0,n++):prop(it,"_toeslag_id")&&(services[prop(it,"_toeslag_id")]=!0)}}),cart.items.forEach(function(it){isFee(it)&&!services[prop(it,"_toeslag_id")]&&(updates[it.key]=0,n++)}),!!n)return busy=!0,postJSON("/cart/update.js",{updates:updates}).then(function(){busy=!1,refreshCart()},function(){busy=!1})}).catch(function(){})}window.fetch=function(input){var url=typeof input=="string"?input:input&&input.url||"",p=rawFetch.apply(window,arguments);return/\/cart\/(add|change|update|clear)/.test(url)&&p.then(scheduleReconcile,scheduleReconcile),p};function boot(){if(fillPrices(),initLocSections(),window.MutationObserver){var t;new MutationObserver(function(){clearTimeout(t),t=setTimeout(function(){fillPrices()},50)}).observe(document.body,{childList:!0,subtree:!0})}C.isCartPage&&reconcile()}document.readyState==="loading"?document.addEventListener("DOMContentLoaded",boot):boot()})();
2//# sourceMappingURL=/cdn/shop/t/14/assets/inbouw-service.js.map?v=108966948337271673911791289005

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.