+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

FT Technologies (UK) Ltd

United Kingdom
Website
About

Originally developed for wind turbine control and defense, FT Technologies wind sensors have been deployed globally for 25 years. Today, they are trusted in maritime applications including dynamic positioning systems, commercial vessels, performance sailing, autonomous vessels, wind-assisted propulsion systems and beyond.

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