import {fuelCost,energyUnits} from './calculations.mjs'; const $=s=>document.querySelector(s);const menu=$('.menu-toggle');menu?.addEventListener('click',()=>{const open=menu.getAttribute('aria-expanded')!=='true';menu.setAttribute('aria-expanded',String(open));$('.nav').classList.toggle('open',open);}); const fmt=n=>n.toLocaleString('en-US',{minimumFractionDigits:2,maximumFractionDigits:2}); function resultLine(label,value,unit){const row=document.createElement('div');row.className='result-line';const l=document.createElement('span');l.textContent=label;const v=document.createElement('strong');v.textContent=`${fmt(value)} ${unit}`;row.append(l,v);return row;} $('#calculator')?.addEventListener('submit',e=>{e.preventDefault();$('#calc-error').textContent='';try{const data=Object.fromEntries(new FormData(e.currentTarget));const r=fuelCost(data);const c=data.currency;$('#calc-results').replaceChildren(...[['Fuel input',r.inputCost,`${c}/GJ`],['Useful heat',r.usefulCost,`${c}/GJ`],['Fuel demand',r.kgHour,'kg/h'],['Monthly demand',r.tonnesMonth,'t'],['Monthly fuel cost',r.monthlyCost,c]].map(x=>resultLine(...x)));}catch(err){$('#calc-results').replaceChildren();$('#calc-error').textContent=err.message;}}); $('#converter')?.addEventListener('submit',e=>{e.preventDefault();$('#convert-error').textContent='';try{const r=energyUnits(new FormData(e.currentTarget).get('energy'));$('#convert-results').replaceChildren(resultLine('Energy',r.mj,'MJ/kg'),resultLine('Energy',r.kcal,'kcal/kg'),resultLine('Energy',r.kwh,'kWh/kg'));}catch(err){$('#convert-results').replaceChildren();$('#convert-error').textContent=err.message;}}); const rfq=$('#rfq');if(rfq){const status=$('#rfq-status');const show=(msg,error=false)=>{status.hidden=false;status.textContent=msg;status.classList.toggle('error',error);};const first=$('#step-one'),second=$('#step-two');const setStep=n=>{first.hidden=n===2;second.hidden=n===1;$('#step-label').textContent=n===1?'Step 1 of 2 · Your requirement':'Step 2 of 2 · Optional details';(n===2?second:first).querySelector('input,select,textarea')?.focus();}; const params=new URLSearchParams(location.search);if(params.has('product'))rfq.elements.product.value=params.get('product').slice(0,160); const app=params.get('application')||'';const matched=[...rfq.elements.application.options].find(o=>o.value===app||o.text.toLowerCase().includes(app.toLowerCase()));if(app&&matched)rfq.elements.application.value=matched.value; const quantityMode=rfq.elements.quantity_mode;quantityMode.addEventListener('change',()=>{const unknown=quantityMode.value==='unknown';rfq.elements.quantity.required=!unknown;rfq.elements.quantity.disabled=unknown;rfq.elements.unit.disabled=unknown;}); $('#next-step').addEventListener('click',()=>{for(const f of first.querySelectorAll('input,select')){if(!f.reportValidity())return;}setStep(2);});$('#previous-step').addEventListener('click',()=>setStep(1)); let idempotencyKey=crypto.randomUUID();rfq.addEventListener('submit',async e=>{e.preventDefault();const b=rfq.querySelector('[type="submit"]');b.disabled=true;show('Sending your requirement…');const payload=Object.fromEntries(new FormData(rfq));payload.consent=rfq.elements.consent.checked;payload.idempotency_key=idempotencyKey; try{const controller=new AbortController();const timer=setTimeout(()=>controller.abort(),20000);let res;try{res=await fetch('/api/rfq.php',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify(payload),signal:controller.signal});}finally{clearTimeout(timer);}const data=await res.json();if(!res.ok||!data.request_id||data.status!=='saved')throw Error(data.message||'Your requirement could not be saved. Please try again.');show(`Your requirement has been saved. Reference: ${data.request_id}.`);rfq.querySelectorAll('input,select,textarea,button').forEach(x=>x.disabled=true);} catch(err){show(err.name==='AbortError'?'The response timed out. Your entries remain here; retrying will not create a duplicate.':err.message,true);b.disabled=false;} });}