Lichtberekenaar TEST (niet delen)

1

Ruimte

m
m
m
Kleur van wanden en plafond
Donkere wanden slikken licht op. Je hebt dan meer lumen nodig.
Maten meten met een foto

Je foto blijft op je eigen apparaat. Er wordt niets geüpload. Fotografeer een muur recht van voren, met daarop iets waarvan je de maat weet, zoals een binnendeur. Geschatte nauwkeurigheid: ongeveer 10 %.

2

Lichtniveau

Hoe helder moet het zijn?
lux
3

Lamp

4

Gebruik en kosten

u
d
€/kWh
Geavanceerd
m
Tafel of aanrecht, meestal 0,85 m.
'; w.document.open();w.document.write(h);w.document.close(); return true; } function bindShare(container,getPayload){ var card=container.querySelector('[data-share]');if(!card)return; var inp=card.querySelector('input[inputmode=email]'),msg=card.querySelector('[data-msg]'),ta=card.querySelector('textarea'); var subIn=card.querySelector('.signup input[type=text]'),subCk=card.querySelector('.signup input[type=checkbox]'),subMsg=card.querySelector('[data-submsg]'); inp.addEventListener('input',function(){shareEmail=inp.value.trim()}); if(navigator.share)card.querySelector('[data-act="native"]').hidden=false; card.addEventListener('click',function(e){ var b=e.target.closest('[data-act]');if(!b)return; var act=b.getAttribute('data-act'); if(act==='sub'){subscribe((subIn.value||'').trim(),subCk.checked,subMsg);return} var p=getPayload();if(!p)return; if(act==='mail'){ var to='';if(shareEmail){if(!validEmail(shareEmail)){msg.textContent='Dit e-mailadres lijkt niet te kloppen.';return}to=shareEmail} location.href='mailto:'+enc(to)+'?subject='+enc(p.subject)+'&body='+enc(p.text); msg.textContent='Je e-mailprogramma opent met je advies. Gebeurt er niets? Gebruik dan Kopieer tekst, of sla het op als PDF.'; }else if(act==='pdf'){ if(openReport(p))msg.textContent='Het rapport opent in een nieuw tabblad. Kies daar Afdrukken en dan "Opslaan als PDF".'; else msg.textContent='Je browser blokkeert het nieuwe tabblad. Sta pop-ups toe voor deze pagina en probeer opnieuw.'; }else if(act==='wa'){ window.open('https://wa.me/?text='+enc(p.text),'_blank','noopener'); msg.textContent='WhatsApp opent. Kies zelf aan wie je het stuurt.'; }else if(act==='fb'){ window.open('https://www.facebook.com/sharer/sharer.php?u='+enc(p.url),'_blank','noopener'); msg.textContent='Facebook opent met de link naar je berekening.'; }else if(act==='x'){ window.open('https://twitter.com/intent/tweet?text='+enc(p.subject)+'&url='+enc(p.url),'_blank','noopener'); msg.textContent='X opent met de link naar je berekening.'; }else if(act==='tg'){ window.open('https://t.me/share/url?url='+enc(p.url)+'&text='+enc(p.subject),'_blank','noopener'); msg.textContent='Telegram opent met de link naar je berekening.'; }else if(act==='native'){ try{navigator.share({title:p.subject,text:p.text,url:p.url}).catch(function(){})}catch(er){} }else if(act==='copylink'){ var fbL=function(){ta.style.display='block';ta.value=p.url;ta.focus();ta.select();msg.textContent='Selecteer de link en kopieer hem.'}; try{navigator.clipboard.writeText(p.url).then(function(){msg.textContent='Link gekopieerd. Hij opent de berekening precies zoals jij hem invulde.'},fbL)}catch(er){fbL()} }else if(act==='copy'){ var fb=function(){ta.style.display='block';ta.value=p.text;ta.focus();ta.select();msg.textContent='Selecteer de tekst en kopieer hem.'}; try{navigator.clipboard.writeText(p.text).then(function(){msg.textContent='Gekopieerd. Plak het in een bericht.'},fb)}catch(er){fb()} }else if(act==='ask'){ location.href='mailto:info@ledplanet.nl?subject='+enc('Vraag over mijn lichtberekening')+'&body='+enc('Hallo '+BRAND+',\n\nIk heb een vraag over mijn lichtberekening.\n\nMijn naam: \nMijn vraag: \n\n---\n'+p.text); msg.textContent='Je e-mailprogramma opent met een bericht aan '+BRAND+'.'; } }); } function renderOverview(){ var box=$('overview'),cnt=$('overCount'); cnt.textContent=overview.length;cnt.hidden=!overview.length; if(!overview.length){box.innerHTML='

Overzicht

Je hebt nog geen ruimtes toegevoegd. Bereken een ruimte en kies "Toevoegen aan overzicht". Zo krijg je een totaal voor je hele huis of bedrijf.

';return} var tl=0,tw=0,tk=0,tc=0; var h='

Overzicht

'; overview.forEach(function(o,i){ tl+=o.totalLm;tw+=o.totalW;tk+=o.kwh;tc+=o.cost; h+=''; }); h+='
Ruimtem²LuxVerlichtingWattPer jaar
'+esc(o.name)+''+f0.format(o.A)+''+f0.format(o.lux)+''+(o.unitM?f1.format(o.N)+' m ':f0.format(o.N)+' × ')+''+esc(o.lampName)+'
'+esc(o.model)+'
'+f0.format(o.totalW)+''+eur.format(o.cost)+'
Totaal ('+f0.format(tl)+' lumen)'+f0.format(tw)+''+eur.format(tc)+'
'; h+='

Samen ongeveer '+f0.format(tk)+' kWh per jaar.

'; h+='
'; h+=shareCardHtml('shO','Mail of deel je overzicht'); box.innerHTML=h; box.querySelectorAll('[data-del]').forEach(function(b){b.addEventListener('click',function(){overview.splice(+b.getAttribute('data-del'),1);saveOverview();renderOverview()})}); $('btnClear').addEventListener('click',function(){overview=[];saveOverview();renderOverview()}); bindShare(box,overviewPayload); } function readInputs(){ S.L=num($('inL').value,0);S.B=num($('inB').value,0);S.area=num($('inArea').value,0); S.H=num(S.dimMode==='area'?$('inH2').value:$('inH').value,0); S.lux=num($('inLux').value,0);S.cLm=num($('inCLm').value,0);S.cW=num($('inCW').value,0); S.haveN=num($('inHave').value,0);S.hrs=num($('inHrs').value,0);S.days=clamp(num($('inDays').value,0),0,366); S.price=num($('inPrice').value,.3);S.hw=num($('inHw').value,0);S.mf=num($('mfSel').value,.8); } function fmtIn(v){return String(Math.round(v*100)/100).replace('.',',')} function setIn(id,v){$(id).value=fmtIn(v)} function syncInputs(){ setIn('inL',S.L);setIn('inB',S.B);setIn('inArea',S.area);setIn('inH',S.H);setIn('inH2',S.H);setIn('inLux',S.lux); setIn('inCLm',S.cLm);setIn('inCW',S.cW);setIn('inHave',S.haveN);$('inPrice').value=S.price.toFixed(2).replace('.',',');setIn('inHrs',S.hrs);setIn('inDays',S.days);setIn('inHw',S.hw);$('mfSel').value=['0.85','0.8','0.7','0.65'].indexOf(String(S.mf))>-1?String(S.mf):'0.8'; $('lblH').textContent=$('lblH2').textContent=RM[S.room].out?'Montagehoogte lamp':'Plafondhoogte'; $('reflWrap').hidden=RM[S.room].out; root.querySelectorAll('#reflChips .chip').forEach(function(b){b.setAttribute('aria-pressed',String(b.getAttribute('data-v')===S.refl))}); $('dmLb').setAttribute('aria-pressed',String(S.dimMode==='lb'));$('dmArea').setAttribute('aria-pressed',String(S.dimMode==='area')); $('rowLb').hidden=S.dimMode!=='lb';$('rowArea').hidden=S.dimMode!=='area'; $('modeCalc').setAttribute('aria-pressed',String(S.mode==='calc'));$('modeCheck').setAttribute('aria-pressed',String(S.mode==='check')); $('haveRow').hidden=S.mode!=='check'; var lamp=LAMPS[S.type];$('lblHave').textContent=lamp.unit==='m'?'Lengte strip die je nu hebt':'Aantal lampen dat je nu hebt';$('haveUnit').textContent=lamp.unit==='m'?'m':'st.'; fillLuxChips(); } function fillLuxChips(){ var r=RM[S.room],names=['Minimaal','Aanbevolen','Extra helder'],h=''; r.lux.forEach(function(v,i){h+=''}); $('luxChips').innerHTML=h; $('luxHint').textContent='Richtwaarde voor '+r.n.toLowerCase()+': '+r.lux[1]+' lux.'; $('luxChips').querySelectorAll('.chip').forEach(function(b){b.addEventListener('click',function(){S.lux=+b.getAttribute('data-lux');setIn('inLux',S.lux);fillLuxChips();render()})}); } function fillRoomSel(){ var groups=[G1,G2,G3,G4],h=''; groups.forEach(function(g){h+='';ROOMS.filter(function(r){return r.g===g}).forEach(function(r){h+=''});h+=''}); $('roomSel').innerHTML=h;$('roomSel').value=S.room; } function fillTypeSel(){ var rec=RM[S.room].types,h=''; rec.forEach(function(t){h+=''}); h+=''; TYPE_ORDER.filter(function(t){return rec.indexOf(t)<0}).forEach(function(t){h+=''}); $('typeSel').innerHTML=h+'';$('typeSel').value=S.type; } function fillModelSel(){ var l=LAMPS[S.type],h=''; l.models.forEach(function(m,i){h+=''}); $('modelSel').innerHTML=h; $('modelWrap').hidden=!!l.custom;$('customRow').hidden=!l.custom; if(!l.custom){S.mi=Math.min(S.mi,l.models.length-1);$('modelSel').value=String(S.mi)} $('modelHint').textContent=l.unit==='m'?'Per meter strip. Het aantal meters rekenen we voor je uit.':'Gemiddelde uitvoering. Controleer de lumen op de productpagina.'; var ra='';Object.keys(REFS).forEach(function(k){ra+=''}); $('refTech').innerHTML=ra;$('refTech').value=S.ref; } function applyRoom(id){ var r=RM[id];S.room=id;S.lux=r.lux[1];S.H=r.H;S.hw=r.hw;S.hrs=r.hrs;S.days=r.days;S.mf=r.mf; if(!S.dimsTouched){S.L=r.dims[0];S.B=r.dims[1];S.area=Math.round(r.dims[0]*r.dims[1]*10)/10} S.type=r.types[0];S.mi=LAMPS[S.type].def;if(S.refAuto)S.ref=REF_AUTO[S.type]; syncInputs();fillTypeSel();fillModelSel(); } $('roomSel').addEventListener('change',function(){applyRoom(this.value);render()}); ['inL','inB','inArea','inH','inH2'].forEach(function(id){$(id).addEventListener('input',function(){ if(id==='inH'||id==='inH2'){var o=id==='inH'?'inH2':'inH';$(o).value=this.value} else S.dimsTouched=true; if(id==='inL'||id==='inB'){var a=num($('inL').value,0)*num($('inB').value,0);if(a>0)$('inArea').value=fmtIn(a)} if(id==='inArea'){S.dimsTouched=true} readInputs();render()})}); ['inLux','inCLm','inCW','inHave','inHrs','inDays','inPrice','inHw'].forEach(function(id){$(id).addEventListener('input',function(){readInputs();if(id==='inLux')fillLuxChips();render()})}); $('mfSel').addEventListener('change',function(){readInputs();render()}); $('typeSel').addEventListener('change',function(){S.type=this.value;S.mi=LAMPS[S.type].def;if(S.refAuto)S.ref=REF_AUTO[S.type];fillModelSel();syncInputs();render()}); $('modelSel').addEventListener('change',function(){S.mi=+this.value;render()}); $('refTech').addEventListener('change',function(){S.ref=this.value;S.refAuto=false;render()}); $('reflChips').addEventListener('click',function(e){var b=e.target.closest('.chip');if(!b)return;S.refl=b.getAttribute('data-v');syncInputs();render()}); $('dmLb').addEventListener('click',function(){if(S.dimMode==='lb')return;S.dimMode='lb';syncInputs();readInputs();render()}); $('dmArea').addEventListener('click',function(){if(S.dimMode==='area')return;readInputs();var a=S.L*S.B;if(a>0)S.area=Math.round(a*10)/10;S.dimMode='area';syncInputs();readInputs();render()}); $('modeCalc').addEventListener('click',function(){S.mode='calc';syncInputs();render()}); $('modeCheck').addEventListener('click',function(){S.mode='check';syncInputs();render()}); var currentTab='calc'; function showTab(t){ currentTab=t; ['calc','over','conv'].forEach(function(k){ var on=k===t;$('tab-'+k).hidden=!on;$('tabbtn-'+k).setAttribute('aria-selected',String(on)); }); $('mini').hidden=t!=='calc'||heroVisible||!miniText; if(t==='over')renderOverview(); } ['calc','over','conv'].forEach(function(k){$('tabbtn-'+k).addEventListener('click',function(){showTab(k)})}); var CV_TECH=[['LED (modern)',100],['LED (oudere)',80],['TL-buis',70],['Spaarlamp (PL)',55],['Halogeen',18],['Gloeilamp',12]]; function renderConv(){ var lm=num($('cvLm').value,0),h=''; CV_TECH.forEach(function(t){h+=''+t[0]+''+t[1]+''+(lm>0?fx(lm/t[1])+' W':'-')+''}); $('cvLmBody').innerHTML=h; var ow=num($('cvOldW').value,0),e=+$('cvOldT').value,olm=ow*e,ledW=olm/100; $('cvOldOut').innerHTML='
Lichtopbrengst oude lamp± '+f0.format(olm)+' lm
Vergelijkbare LED± '+fx(ledW)+' W
Besparing'+(ow>0?f0.format((1-ledW/ow)*100):0)+' %
'; } (function(){var o='';[['Halogeen',18],['Gloeilamp',12],['Spaarlamp (PL)',55],['TL-buis',70]].forEach(function(t,i){o+=''});$('cvOldT').innerHTML=o})(); ['cvLm','cvOldW'].forEach(function(id){$(id).addEventListener('input',renderConv)}); $('cvOldT').addEventListener('change',renderConv); /* ---------- Meten met een foto: ijken, meten, loep en versleepbare punten ---------- */ var P={img:null,cv:$('photoCv'),ctx:null,pts:[],cal:null,meas:[],drag:null}; P.ctx=P.cv.getContext('2d'); var loupe=$('loupe'),loupeCtx=$('loupeCv').getContext('2d'); function pxPerM(){ if(!P.cal)return 0; var len=refLength();if(!(len>0))return 0; return Math.hypot(P.cal.a[0]-P.cal.b[0],P.cal.a[1]-P.cal.b[1])/len; } function refLength(){ var v=$('refSel').value; if(v==='deur')return 2.01;if(v==='a4h')return .297;if(v==='a4b')return .21; if(v==='plafond')return num($('inH').value,0); return num($('refCustom').value,0); } function photoSteps(){ var ol=$('photoSteps'),li=[],cal=!P.cal,tot=P.pts.length; if(cal){ li.push('
  • Tik op het begin en het einde van de bekende maat'+(tot?' ('+tot+' van 2)':'')+'. Houd je vinger of muis even vast: de loep laat precies zien waar je prikt.
  • '); li.push('
  • Kies daarna wat je wilt meten en tik de twee uiteinden aan.
  • '); li.push('
  • Niet helemaal goed geprikt? Sleep een punt gewoon naar de juiste plek.
  • '); }else{ li.push('
  • Ijking staat op '+f2.format(refLength())+' m. Meet alleen dingen op hetzelfde vlak (dezelfde muur). Sleep een punt om hem bij te stellen.
  • '); li.push('
  • Tik de twee uiteinden van de '+({L:'lengte',B:'breedte',H:'hoogte'}[$('photoTarget').value])+' aan'+(tot?' ('+tot+' van 2)':'')+'.
  • '); } ol.innerHTML=li.join(''); $('photoTargetRow').hidden=cal; } function drawPhoto(){ var c=P.cv,x=P.ctx;if(!P.img)return; x.drawImage(P.img,0,0,c.width,c.height); var ppm=pxPerM(); function seg(a,b,col,label){ x.lineWidth=Math.max(3,c.width/260);x.strokeStyle='rgba(0,0,0,.6)';x.beginPath();x.moveTo(a[0],a[1]);x.lineTo(b[0],b[1]);x.stroke(); x.lineWidth=Math.max(2,c.width/380);x.strokeStyle=col;x.beginPath();x.moveTo(a[0],a[1]);x.lineTo(b[0],b[1]);x.stroke(); [a,b].forEach(function(p){x.fillStyle=col;x.strokeStyle='#000';x.lineWidth=2;x.beginPath();x.arc(p[0],p[1],Math.max(7,c.width/110),0,6.3);x.fill();x.stroke();x.fillStyle='#000';x.beginPath();x.arc(p[0],p[1],1.6,0,6.3);x.fill()}); if(label){var fs=Math.max(14,c.width/42);x.font='600 '+fs+'px sans-serif';var tx=(a[0]+b[0])/2+8,ty=(a[1]+b[1])/2;x.lineWidth=4;x.strokeStyle='#000';x.strokeText(label,tx,ty);x.fillStyle=col;x.fillText(label,tx,ty)} } if(P.cal)seg(P.cal.a,P.cal.b,'#ffb800','ijkmaat '+f2.format(refLength())+' m'); P.meas.forEach(function(d){ var m=ppm>0?Math.hypot(d.a[0]-d.b[0],d.a[1]-d.b[1])/ppm:0; var nm={L:'Lengte',B:'Breedte',H:'Hoogte'}[d.key]; seg(d.a,d.b,'#2ad4ff',nm+(m>0?' '+f2.format(m)+' m':'')); }); if(P.pts.length===1){var p=P.pts[0];x.fillStyle=P.cal?'#2ad4ff':'#ffb800';x.strokeStyle='#000';x.lineWidth=2;x.beginPath();x.arc(p[0],p[1],Math.max(7,c.width/110),0,6.3);x.fill();x.stroke()} } function cvPoint(e){ var r=P.cv.getBoundingClientRect(); return [(e.clientX-r.left)*P.cv.width/r.width,(e.clientY-r.top)*P.cv.height/r.height]; } function showLoupe(pt,e){ var sz=248,z=2.6; loupeCtx.fillStyle='#111';loupeCtx.fillRect(0,0,sz,sz); loupeCtx.drawImage(P.cv,pt[0]-sz/(2*z),pt[1]-sz/(2*z),sz/z,sz/z,0,0,sz,sz); loupeCtx.strokeStyle='#fdc803';loupeCtx.lineWidth=2; loupeCtx.beginPath();loupeCtx.moveTo(sz/2,sz/2-16);loupeCtx.lineTo(sz/2,sz/2+16);loupeCtx.moveTo(sz/2-16,sz/2);loupeCtx.lineTo(sz/2+16,sz/2);loupeCtx.stroke(); var wrap=$('photoWrap'),wr=wrap.getBoundingClientRect(); var lx=clamp(e.clientX-wr.left-62,4,wr.width-128); var ly=e.clientY-wr.top-150; if(ly<4)ly=e.clientY-wr.top+34; ly=clamp(ly,4,Math.max(4,wr.height-128)); loupe.style.left=lx+'px';loupe.style.top=ly+'px';loupe.hidden=false; } function hideLoupe(){loupe.hidden=true} function hitPoint(pt){ var r=Math.max(14,P.cv.width/55),best=null,bd=r; function chk(obj,which){var p=obj[which],d=Math.hypot(p[0]-pt[0],p[1]-pt[1]);if(d0))return; P.meas.forEach(function(d){ var m=Math.hypot(d.a[0]-d.b[0],d.a[1]-d.b[1])/ppm; if(m>=.3&&m<=80)applyMeasure(d.key,m,true); }); } function flash(id){var el=$(id);el.classList.remove('flash');void el.offsetWidth;el.classList.add('flash')} function applyMeasure(key,val,quiet){ val=Math.round(val*20)/20; readInputs(); if(S.dimMode==='area'){S.dimMode='lb';var a=S.area,l0=Math.sqrt(a*1.4);S.L=l0;S.B=a/l0;} if(key==='L'){S.L=val;S.dimsTouched=true} if(key==='B'){S.B=val;S.dimsTouched=true} if(key==='H'){S.H=val} S.area=Math.round(S.L*S.B*10)/10; syncInputs(); if(!quiet)flash(key==='L'?'inL':key==='B'?'inB':'inH'); render(); } function commitPoint(pt){ P.pts.push(pt); if(P.pts.length===2){ var a=P.pts[0],b=P.pts[1],d=Math.hypot(a[0]-b[0],a[1]-b[1]); if(d<8){P.pts=[]} else if(!P.cal){ var len=refLength(); if(!(len>0)){P.pts=[];$('photoMeasures').innerHTML='Vul eerst de lengte van de bekende maat in (of de plafondhoogte).'} else{P.cal={a:a,b:b};P.pts=[];$('photoMeasures').innerHTML=''} }else{ var ppm=pxPerM(),m=ppm>0?d/ppm:0,key=$('photoTarget').value,nm={L:'Lengte',B:'Breedte',H:'Hoogte'}[key]; if(m<.3||m>80){$('photoMeasures').insertAdjacentHTML('beforeend',''+f1.format(m)+' m lijkt niet te kloppen. Controleer de ijking en probeer opnieuw.')} else{ P.meas=P.meas.filter(function(x){return x.key!==key}); P.meas.push({a:a,b:b,key:key}); applyMeasure(key,m); $('photoMeasures').innerHTML=''; P.meas.forEach(function(x){var pp=pxPerM(),mv=pp>0?Math.hypot(x.a[0]-x.b[0],x.a[1]-x.b[1])/pp:0;$('photoMeasures').insertAdjacentHTML('beforeend',''+({L:'Lengte',B:'Breedte',H:'Hoogte'}[x.key])+': '+f2.format(Math.round(mv*20)/20)+' m')}); var nxt={L:'B',B:'H',H:'L'}[key];$('photoTarget').value=nxt; } P.pts=[]; } } photoSteps();drawPhoto(); } P.cv.addEventListener('pointerdown',function(e){ if(!P.img)return;e.preventDefault(); try{P.cv.setPointerCapture(e.pointerId)}catch(er){} var pt=cvPoint(e),hit=hitPoint(pt); if(hit&&hit.pend){P.drag={pend:true}} else if(hit){P.drag=hit} else{P.drag={neu:true,pt:pt};P.pts=P.pts.length===1?P.pts:[];} if(P.drag.neu){drawTemp(pt)} else if(P.drag.pend){P.pts[0]=pt;drawPhoto()} else{hit.obj[hit.which]=pt;drawPhoto()} showLoupe(pt,e); }); function drawTemp(pt){ drawPhoto(); var x=P.ctx;x.fillStyle=P.cal?'#2ad4ff':'#ffb800';x.strokeStyle='#000';x.lineWidth=2;x.beginPath();x.arc(pt[0],pt[1],Math.max(7,P.cv.width/110),0,6.3);x.fill();x.stroke(); } P.cv.addEventListener('pointermove',function(e){ if(!P.img||!P.drag)return;e.preventDefault(); var pt=cvPoint(e); if(P.drag.neu){P.drag.pt=pt;drawTemp(pt)} else if(P.drag.pend){P.pts[0]=pt;drawPhoto()} else{P.drag.obj[P.drag.which]=pt;drawPhoto()} showLoupe(pt,e); }); function endDrag(e){ if(!P.img||!P.drag)return; var d=P.drag;P.drag=null;hideLoupe(); if(d.neu){commitPoint(d.pt)} else if(d.pend){photoSteps();drawPhoto()} else{reapplyMeasures();photoSteps();drawPhoto()} } P.cv.addEventListener('pointerup',endDrag); P.cv.addEventListener('pointercancel',function(){P.drag=null;hideLoupe()}); $('photoFile').addEventListener('change',function(){ var f=this.files&&this.files[0];if(!f)return; var url=URL.createObjectURL(f),img=new Image(); img.onload=function(){ var maxW=1100,sc=Math.min(1,maxW/img.naturalWidth); P.cv.width=Math.round(img.naturalWidth*sc);P.cv.height=Math.round(img.naturalHeight*sc); P.img=img;P.pts=[];P.cal=null;P.meas=[];P.drag=null;$('photoMeasures').innerHTML=''; $('photoWrap').hidden=false;$('photoSteps').hidden=false;$('photoBtns').hidden=false; photoSteps();drawPhoto();URL.revokeObjectURL(url); }; img.onerror=function(){$('photoMeasures').innerHTML='Deze foto kon niet worden geladen. Probeer een JPG of PNG.'}; img.src=url; }); $('refSel').addEventListener('change',function(){$('refCustomRow').hidden=this.value!=='eigen';reapplyMeasures();photoSteps();drawPhoto()}); $('refCustom').addEventListener('input',function(){reapplyMeasures();photoSteps();drawPhoto()}); $('photoTarget').addEventListener('change',function(){P.pts=[];photoSteps();drawPhoto()}); $('photoUndo').addEventListener('click',function(){if(P.pts.length)P.pts.pop();else if(P.meas.length)P.meas.pop();else P.cal=null;photoSteps();drawPhoto()}); $('photoRecal').addEventListener('click',function(){P.cal=null;P.pts=[];$('photoMeasures').innerHTML='';photoSteps();drawPhoto()}); var loaded=false; (function(){try{var h=location.hash.slice(1);if(!h)return;var q={};h.split('&').forEach(function(p){var i=p.indexOf('=');if(i>0)q[p.slice(0,i)]=decodeURIComponent(p.slice(i+1))}); if(!RM[q.r]||!LAMPS[q.t])return;var n=function(k,d){return q[k]!==undefined?num(q[k],d):d}; S.room=q.r;S.dimMode=q.dm==='area'?'area':'lb';S.L=n('l',S.L);S.B=n('b',S.B);S.area=n('a',S.area);S.H=n('h',S.H); S.refl=['licht','midden','donker'].indexOf(q.c)>-1?q.c:'licht';S.lux=n('x',S.lux);S.type=q.t;S.mi=Math.round(n('m',S.mi)); S.mode=q.mo==='check'?'check':'calc';S.haveN=n('n',S.haveN);S.cLm=n('lm',S.cLm);S.cW=n('w',S.cW);S.hrs=n('u',S.hrs);S.days=n('d',S.days); S.price=n('p',S.price);S.mf=n('mf',S.mf);S.hw=n('hw',S.hw);S.dimsTouched=true;S.refAuto=true;S.ref=REF_AUTO[S.type]; var l=LAMPS[S.type];if(!l.custom)S.mi=clamp(S.mi,0,l.models.length-1);loaded=true}catch(e){}})(); fillRoomSel(); if(!loaded)S.type=RM[S.room].types[0]; syncInputs();fillTypeSel();fillModelSel(); renderOverview();renderConv();render(); })();