+Number(estimate.total).toFixed(2)+' · '+estimate.status; p.append(summary); if(estimate.status==='sent'){ const approve=document.createElement('button');approve.type='button';approve.className='orbit-live-approve'; approve.textContent='Approve estimate';approve.setAttribute('aria-label','Approve '+(estimate.number||'estimate')); approve.addEventListener('click',async()=>{ if(!confirm('Approve '+(estimate.number||'this estimate')+' for } choices.replaceChildren(); if(data.status==='open' && Array.isArray(data.choices)){ data.choices.forEach(choice=>{ const button=document.createElement('button'); button.type='button'; button.className='orbit-choice'; button.textContent=choice.label; button.addEventListener('click',()=>sendMessage(String(choice.value||choice.label),button)); choices.append(button); }); } choices.hidden=!choices.childElementCount; log.scrollTop=log.scrollHeight; status.textContent=''; setChatMode(true); }catch(e){ if(e.status===403||e.status===404){ chat=null;localStorage.removeItem(key);setChatMode(false);log.replaceChildren();appendIntro(); prechatStatus.textContent='Your previous chat expired. Start a new one.'; }else status.textContent=e.message; } } toggle.onclick=async()=>{ panel.hidden=!panel.hidden; toggle.setAttribute('aria-expanded',String(!panel.hidden)); if(!panel.hidden){await loadConfig();if(chat)await refresh();else{log.replaceChildren();appendIntro();setChatMode(false)}} }; close.onclick=()=>{panel.hidden=true;toggle.setAttribute('aria-expanded','false')}; prechat.onsubmit=async e=>{ e.preventDefault(); const button=prechat.querySelector('button[type=submit]'); const body=document.getElementById('orbit-first-message').value.trim();if(!body)return; const profile=config.authenticated&&config.profile?{ first_name:config.profile.first_name||'', last_name:config.profile.last_name||'', email:config.profile.email||'', company:config.profile.company?.name||'' }:{ first_name:document.getElementById('orbit-first-name').value.trim(), last_name:document.getElementById('orbit-last-name').value.trim(), email:document.getElementById('orbit-email').value.trim(), company:document.getElementById('orbit-company').value.trim() }; button.disabled=true;prechatStatus.textContent='Starting…'; try{ const data=await call(base,'POST',{body,store_id:storeId?Number(storeId):null,...profile}); chat={id:data.conversation_id,token:data.token}; localStorage.setItem(key,JSON.stringify(chat)); if(!config.authenticated)localStorage.setItem(profileKey,JSON.stringify(profile)); document.getElementById('orbit-first-message').value=''; prechatStatus.textContent=''; setChatMode(true); await refresh(); }catch(error){prechatStatus.textContent=error.message} finally{button.disabled=false} }; let sending=false; async function sendMessage(body,selectedButton=null){ if(!body||!chat||sending)return; sending=true; const button=form.querySelector('button[type=submit]'); button.disabled=true; choices.querySelectorAll('button').forEach(b=>b.disabled=true); status.textContent='Sending…'; try{ await call(base+'/'+chat.id+'/messages','POST',{body}); if(!selectedButton)input.value=''; await refresh(); }catch(error){status.textContent=error.message} finally{ sending=false;button.disabled=false; choices.querySelectorAll('button').forEach(b=>b.disabled=false); } } form.onsubmit=e=>{e.preventDefault();sendMessage(input.value.trim())}; input.addEventListener('keydown',e=>{ if(e.key==='Enter'&&!e.shiftKey&&!e.isComposing){ e.preventDefault();sendMessage(input.value.trim()); } }); loadConfig().then(()=>{if(chat)refresh();else appendIntro()}); setInterval(()=>{if(!panel.hidden&&chat&&!sending&&!input.matches(':focus'))refresh()},6000); })(); +Number(estimate.total).toFixed(2)+'?'))return; approve.disabled=true; try{await call(base+'/'+chat.id+'/estimates/'+estimate.id+'/approve','POST',{});await refresh()} catch(error){status.textContent=error.message;approve.disabled=false} }); p.append(approve); } } log.append(p); } choices.replaceChildren(); if(data.status==='open' && Array.isArray(data.choices)){ data.choices.forEach(choice=>{ const button=document.createElement('button'); button.type='button'; button.className='orbit-choice'; button.textContent=choice.label; button.addEventListener('click',()=>sendMessage(String(choice.value||choice.label),button)); choices.append(button); }); } choices.hidden=!choices.childElementCount; log.scrollTop=log.scrollHeight; status.textContent=''; setChatMode(true); }catch(e){ if(e.status===403||e.status===404){ chat=null;localStorage.removeItem(key);setChatMode(false);log.replaceChildren();appendIntro(); prechatStatus.textContent='Your previous chat expired. Start a new one.'; }else status.textContent=e.message; } } toggle.onclick=async()=>{ panel.hidden=!panel.hidden; toggle.setAttribute('aria-expanded',String(!panel.hidden)); if(!panel.hidden){await loadConfig();if(chat)await refresh();else{log.replaceChildren();appendIntro();setChatMode(false)}} }; close.onclick=()=>{panel.hidden=true;toggle.setAttribute('aria-expanded','false')}; prechat.onsubmit=async e=>{ e.preventDefault(); const button=prechat.querySelector('button[type=submit]'); const body=document.getElementById('orbit-first-message').value.trim();if(!body)return; const profile=config.authenticated&&config.profile?{ first_name:config.profile.first_name||'', last_name:config.profile.last_name||'', email:config.profile.email||'', company:config.profile.company?.name||'' }:{ first_name:document.getElementById('orbit-first-name').value.trim(), last_name:document.getElementById('orbit-last-name').value.trim(), email:document.getElementById('orbit-email').value.trim(), company:document.getElementById('orbit-company').value.trim() }; button.disabled=true;prechatStatus.textContent='Starting…'; try{ const data=await call(base,'POST',{body,store_id:storeId?Number(storeId):null,...profile}); chat={id:data.conversation_id,token:data.token}; localStorage.setItem(key,JSON.stringify(chat)); if(!config.authenticated)localStorage.setItem(profileKey,JSON.stringify(profile)); document.getElementById('orbit-first-message').value=''; prechatStatus.textContent=''; setChatMode(true); await refresh(); }catch(error){prechatStatus.textContent=error.message} finally{button.disabled=false} }; let sending=false; async function sendMessage(body,selectedButton=null){ if(!body||!chat||sending)return; sending=true; const button=form.querySelector('button[type=submit]'); button.disabled=true; choices.querySelectorAll('button').forEach(b=>b.disabled=true); status.textContent='Sending…'; try{ await call(base+'/'+chat.id+'/messages','POST',{body}); if(!selectedButton)input.value=''; await refresh(); }catch(error){status.textContent=error.message} finally{ sending=false;button.disabled=false; choices.querySelectorAll('button').forEach(b=>b.disabled=false); } } form.onsubmit=e=>{e.preventDefault();sendMessage(input.value.trim())}; input.addEventListener('keydown',e=>{ if(e.key==='Enter'&&!e.shiftKey&&!e.isComposing){ e.preventDefault();sendMessage(input.value.trim()); } }); loadConfig().then(()=>{if(chat)refresh();else appendIntro()}); setInterval(()=>{if(!panel.hidden&&chat&&!sending&&!input.matches(':focus'))refresh()},6000); })();

Shopping cart

Empty Cart

Your Cart is empty

Go to Shop
Sun, November 8, 2026 LIVE
• Open now: 2026 Chicago Toy & Game Fair Tickets — Rosemont, IL • Open now: Adana Agriculture Fair — Adana, Türkiye • Open now: Adana Agriculture Fair — Adana, Türkiye • Open now: Adana Greenhouse And Garden Fair — Adana, Türkiye • Open now: Adana Greenhouse And Garden Fair — Adana, Türkiye • Open now: Affordable Art Fair - Hamburg — Hamburg, Germany • Upcoming: Accounting & Business Expo KSA — Riyadh, Saudi Arabia • Upcoming: Accounting & Business Expo KSA — Riyadh, Saudi Arabia • Upcoming: Aesthetic Beauty Education Expo — Bristol, United Kingdom • Upcoming: Aesthetic Beauty Education Expo — Bristol, United Kingdom • Upcoming: Banking Transformation Summit USA — Charlotte, NC • Upcoming: Banking Transformation Summit USA — Charlotte, NC • Upcoming: Beauty Elements Exhibition (BEE) — Muscat, Oman • Upcoming: Beauty Elements Exhibition (BEE) — Muscat, Oman • Upcoming: BIO-Europe — Cologne, Germany • Upcoming: BIO-Europe — Cologne, Germany • Upcoming: Cérémonie de Remise des Diplômes de L'ithq — Montreal, Quebec, Canada • Upcoming: Choose Your Own Health Adventure with Snowflake — Dallas, TX • Upcoming: Choose Your Own Health Adventure with Snowflake — Dallas • Upcoming: Connected World KSA — Riyadh, Saudi Arabia
VIEW ALL →
AALSETTIntelligence for What's Next
Login Join

Loris Design

Send a message
Your experience on this site will be improved by allowing cookies Cookie Policy