{"id":241,"date":"2026-09-19T12:33:22","date_gmt":"2026-09-19T22:33:22","guid":{"rendered":"https:\/\/mana-corp.com\/?page_id=241"},"modified":"2026-09-19T12:33:53","modified_gmt":"2026-09-19T22:33:53","slug":"elementor-241","status":"publish","type":"page","link":"https:\/\/mana-corp.com\/?page_id=241","title":{"rendered":"Elementor #241"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"241\" class=\"elementor elementor-241\">\n\t\t\t\t<div class=\"elementor-element elementor-element-c03f07b e-flex e-con-boxed e-con e-parent\" data-id=\"c03f07b\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-2cd04ee elementor-widget elementor-widget-html\" data-id=\"2cd04ee\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!DOCTYPE html>\n<html lang=\"en\"><head><meta charset=\"UTF-8\"><meta name=\"viewport\" content=\"width=device-width,initial-scale=1,maximum-scale=1\">\n<title>Tahiti SuperApp \u2022 Black Orange \u2022 PeerJS<\/title>\n<script src=\"https:\/\/unpkg.com\/maplibre-gl@4.7.1\/dist\/maplibre-gl.js\"><\/script><link href=\"https:\/\/unpkg.com\/maplibre-gl@4.7.1\/dist\/maplibre-gl.css\" rel=\"stylesheet\">\n<script src=\"https:\/\/unpkg.com\/peerjs@1.5.4\/dist\/peerjs.min.js\"><\/script>\n<style>\n*{box-sizing:border-box;margin:0;padding:0;font-family:Inter,system-ui}\n:root{--p:#FF6B00;--bg:#0e0e0e;--card:#1a1a1a;--text:#fff;--muted:#888;--surface:#ffffff0d}\nbody.bg-orange{--p:#FF6B00;--bg:#0e0e0e;--card:#1c1c1c;--text:#fff}\nbody.bg-blue{--p:#0066FF;--bg:#f5f8ff;--card:#ffffff;--text:#0a1931;--muted:#6b7d9c;--surface:#00000008}\nbody.bg-green{--p:#25D366;--bg:#f0faf3;--card:#ffffff;--text:#0e2b16;--muted:#6b8a72;--surface:#00000006}\nbody{background:var(--bg);color:var(--text);height:100dvh;overflow:hidden;transition:.3s}\n#map{position:absolute;inset:0;z-index:0}\n.header{position:absolute;top:0;left:0;right:0;z-index:20;background:var(--card);border-bottom:1px solid var(--surface);padding:10px 12px;display:flex;justify-content:space-between;align-items:center}\n.avatar{width:36px;height:36px;border-radius:50%;background:var(--p);display:grid;place-items:center;font-weight:900;color:#000}\n.pill{border:0;border-radius:999px;padding:6px 10px;font-weight:700;font-size:12px;background:var(--p);color:#000;cursor:pointer}\n.bottom{position:absolute;bottom:0;left:0;right:0;z-index:20;background:var(--card);border-radius:22px 22px 0 0;display:flex;justify-content:space-around;padding:8px 0 12px;box-shadow:0 -10px 40px rgba(0,0,0,.4)}\n.bottom button{border:0;background:transparent;color:var(--muted);font-size:11px;font-weight:700;display:flex;flex-direction:column;align-items:center;gap:2px}\n.bottom button.active{color:var(--p)}\n.page{position:absolute;inset:52px 0 70px 0;z-index:10;background:var(--bg);display:none;overflow:auto;padding-bottom:20px}\n.page.active{display:block}\n.card{background:var(--card);border-radius:18px;padding:14px;margin:10px;box-shadow:0 8px 30px rgba(0,0,0,.15);border:1px solid var(--surface)}\n.chip{padding:8px 12px;border-radius:999px;border:1px solid var(--surface);background:transparent;color:var(--text);font-weight:600;font-size:13px;margin:3px;cursor:pointer}\n.chip.active{background:var(--p);color:#000;border-color:var(--p)}\n.badge{background:var(--p);color:#000;padding:4px 8px;border-radius:999px;font-weight:800;font-size:11px}\n.btn{border:0;border-radius:14px;padding:12px 16px;font-weight:800;cursor:pointer}\n.btn-p{background:var(--p);color:#000}\n.btn-g{background:var(--surface);color:var(--text)}\n.input{width:100%;background:var(--surface);border:1px solid transparent;border-radius:12px;padding:10px 12px;color:var(--text)}\n.input:focus{outline:none;border-color:var(--p);background:var(--card)}\n.voucher{background:linear-gradient(135deg,#111,#2a2a2a);color:white;border-radius:20px;padding:16px;margin:10px;border:1px solid #ffffff18}\nbody.bg-blue.voucher{background:linear-gradient(135deg,#0a1931,#123477)}\nbody.bg-green.voucher{background:linear-gradient(135deg,#0e2b16,#1a5a2a)}\n#peerStatus{font-size:11px;padding:4px 8px;border-radius:999px;background:#00c950;color:white}\nvideo{width:100%;border-radius:14px;background:#000;aspect-ratio:16\/9}\n#toast{position:fixed;bottom:84px;left:50%;transform:translateX(-50%);background:#000;color:white;padding:10px 14px;border-radius:999px;display:none;z-index:99}\n<\/style><\/head><body class=\"bg-orange\">\n<div id=\"map\"><\/div>\n<div class=\"header\">\n<div style=\"display:flex;align-items:center;gap:10px\"><div class=\"avatar\">T<\/div><div><b>Tahiti Driver \u2022 Black Orange FIRE<\/b><div style=\"font-size:11px;color:var(--muted)\">\ud83d\udfe2 PeerJS \u2022 Waiting 15-30 min \u2022 Max 8 pax <span id=\"peerStatus\">Peer: connecting...<\/span><\/div><\/div><\/div>\n<div style=\"display:flex;gap:6px\"><button class=\"pill\" id=\"btnTheme\">\ud83c\udfa8 Theme<\/button><button class=\"pill\" id=\"btnTile\">\ud83d\uddfa\ufe0f<\/button><button class=\"pill\" id=\"btnLocate\">\ud83d\udccd<\/button><\/div>\n<\/div>\n<div class=\"page active\" id=\"pExplore\"><div class=\"card\"><b>\ud83c\udf3a Archipelago \u2022 Theme Switcher<\/b><div style=\"font-size:12px;color:var(--muted)\">User can change theme anytime. Orange Black is default fire.<\/div>\n<div style=\"margin-top:8px;display:flex;gap:6px\"><button class=\"chip active\" data-theme=\"orange\">\ud83d\udfe0 Orange Black<\/button><button class=\"chip\" data-theme=\"blue\">\ud83d\udd35 Blue White<\/button><button class=\"chip\" data-theme=\"green\">\ud83d\udfe2 Green White WhatsApp<\/button><\/div>\n<div style=\"margin-top:10px;display:flex;flex-wrap:wrap\"><span class=\"chip active\" data-arch=\"Society\">Society Islands<\/span><span class=\"chip\" data-arch=\"Tuamotu\">Tuamotu 80+ Atolls<\/span><span class=\"chip\" data-arch=\"Marquesas\">Marquesas<\/span><span class=\"chip\" data-arch=\"Austral\">Austral<\/span><span class=\"chip\" data-arch=\"Gambier\">Gambier<\/span><\/div>\n<div style=\"margin-top:8px;display:flex;flex-wrap:wrap\"><span class=\"chip\" data-island=\"Tahiti\">Tahiti Papeete<\/span><span class=\"chip\" data-island=\"Moorea\">Moorea<\/span><span class=\"chip\" data-island=\"Bora Bora\">Bora Bora<\/span><span class=\"chip\" data-island=\"Rangiroa\">Rangiroa<\/span><\/div>\n<\/div><div class=\"card\"><b>Current:<\/b> <span id=\"selArch\">Society \u2022 Tahiti \u2022 Orange Black<\/span><\/div><\/div>\n<div class=\"page\" id=\"pChat\"><div class=\"card\"><b>\ud83d\udcac PeerJS Chat \u2022 Visio \u2022 Live Location DataChannel<\/b><div style=\"font-size:12px;color:var(--muted)\">All via PeerJS. No WhatsApp needed. ICS still goes to Google Calendar on confirm.<\/div>\n<div style=\"display:flex;gap:6px;margin-top:8px\"><input id=\"peerIdInput\" class=\"input\" placeholder=\"Enter Driver Peer ID to connect\"><button class=\"btn btn-p\" id=\"btnConnectPeer\">Connect<\/button><\/div>\n<div style=\"display:flex;gap:8px;margin-top:8px\"><video id=\"localVideo\" autoplay muted playsinline><\/video><video id=\"remoteVideo\" autoplay playsinline><\/video><\/div>\n<div style=\"display:flex;gap:6px;margin-top:8px\"><button class=\"btn btn-g\" id=\"btnCam\">\ud83d\udcf9 Cam<\/button><button class=\"btn btn-g\" id=\"btnShareLoc\">\ud83d\udccd Share Live Location via DataChannel<\/button><button class=\"btn btn-g\" id=\"btnSwitchDriver\">\ud83d\udd04 Switch Driver<\/button><\/div>\n<div id=\"chatBox\" style=\"margin-top:8px;max-height:160px;overflow:auto\"><\/div>\n<div style=\"display:flex;gap:6px;margin-top:6px\"><input id=\"chatInput\" class=\"input\" placeholder=\"Type via PeerJS DataChannel...\"><button class=\"btn btn-p\" id=\"btnSend\">Send<\/button><\/div>\n<\/div>\n<div class=\"card\">\n<div style=\"display:flex;flex-wrap:wrap\"><span class=\"chip active\" data-cat=\"taxi\">Taxi<\/span><span class=\"chip\" data-cat=\"circle\">Circle Island $100\/h min 4h ONLY<\/span><span class=\"chip\" data-cat=\"hotel\">Hotel<\/span><span class=\"chip\" data-cat=\"restaurant\">Restaurant<\/span><span class=\"chip\" data-cat=\"activity\">Activity<\/span><span class=\"chip\" data-cat=\"bar\">Bar<\/span><span class=\"chip\" data-cat=\"cafe\">Cafe<\/span><span class=\"chip\" data-cat=\"babysitting\">Babysitting<\/span><\/div>\n<div style=\"display:flex;gap:8px;margin-top:8px\"><input id=\"profile\" class=\"input\" placeholder=\"Profile Name\"><select id=\"pax\" class=\"input\" style=\"width:110px\"><option>1 pax<\/option><option selected>8 pax max<\/option><\/select><\/div>\n<div style=\"display:flex;gap:8px;margin-top:8px\"><input id=\"pickup\" class=\"input\" placeholder=\"Pickup - tap map\" readonly><input id=\"dropoff\" class=\"input\" placeholder=\"Drop-off - tap map\" readonly><\/div>\n<div id=\"airportBox\" style=\"display:none;margin-top:8px;gap:6px;flex-wrap:wrap\"><select id=\"airline\" class=\"input\" style=\"flex:1\"><option>Airline?<\/option><option>Air Tahiti Nui TN<\/option><option>Air Tahiti VT inner<\/option><option>Air Moana<\/option><option>French Bee BF<\/option><option>Private<\/option><\/select><input id=\"flightNo\" class=\"input\" placeholder=\"TN101\" style=\"width:100px\"><input id=\"flightTime\" type=\"time\" class=\"input\" style=\"width:100px\"><\/div>\n<div style=\"display:flex;gap:8px;margin-top:8px\"><button class=\"btn btn-g\" style=\"flex:1\" id=\"btnNow\">Now 15-30 min wait<\/button><button class=\"btn btn-p\" style=\"flex:1\" id=\"btnLater\">Later + ICS GCal<\/button><\/div>\n<div id=\"etaBox\" class=\"card\" style=\"display:none\"><b id=\"etaText\">--<\/b><div style=\"font-size:12px;color:var(--muted)\" id=\"etaSub\">--<\/div><\/div>\n<div id=\"voucherPreview\"><\/div>\n<\/div><\/div>\n<div class=\"page\" id=\"pRoadmap\"><div class=\"card\"><b>\ud83e\udded Roadmap \u2022 Voucher Timeline<\/b><div style=\"font-size:12px;color:var(--muted)\">Each booking = voucher card. ICS auto Google Calendar on Accept.<\/div><button class=\"btn btn-p\" style=\"width:100%;margin-top:8px\" onclick=\"switchPage('pChat')\">+ Add another booking<\/button><\/div><div id=\"roadmapList\"><\/div><\/div>\n<div class=\"page\" id=\"pDriver\"><div class=\"card\" style=\"background:var(--p);color:#000\"><b>Driver Dashboard \u2022 Online \u2022 PeerJS Waiting List<\/b><div>Wait 15-30 min \u2022 Switch Driver enabled<\/div><div style=\"display:flex;gap:8px;margin-top:8px\"><button class=\"chip active\" style=\"background:#000;color:var(--p)\">Now \u2022 <span id=\"nowCount\">0<\/span><\/button><button class=\"chip\" style=\"background:#000;color:var(--p)\">Later \u2022 <span id=\"laterCount\">0<\/span><\/button><\/div><\/div><div id=\"driverList\"><\/div><div class=\"card\"><b>\ud83d\udcc5 Google Calendar ICS \u2022 PeerJS location shared<\/b><div id=\"calList\" style=\"font-size:12px;color:var(--muted)\"><\/div><\/div><div class=\"card\"><b>Drivers (Switchable)<\/b><div style=\"display:flex;gap:6px;flex-wrap:wrap;margin-top:6px\"><span class=\"chip\" data-driver=\"Teva\">Teva \u2022 4.9\u2605 \u2022 2 min<\/span><span class=\"chip\" data-driver=\"Maui\">Maui \u2022 4.8\u2605 \u2022 5 min<\/span><span class=\"chip\" data-driver=\"Heiva\">Heiva \u2022 5.0\u2605 \u2022 8 min<\/span><\/div><\/div><\/div>\n<div class=\"bottom\"><button class=\"active\" data-page=\"pExplore\">\ud83c\udfdd\ufe0f<span>Explore<\/span><\/button><button data-page=\"pChat\">\ud83d\udcac<span>Chat PeerJS<\/span><\/button><button data-page=\"pRoadmap\">\ud83e\udded<span>Roadmap<\/span><\/button><button data-page=\"pDriver\">\ud83d\ude95<span>Driver<\/span><\/button><\/div>\n<div id=\"toast\"><\/div>\n<script>\nconst _w=atob(\"Njg5ODk2NjAwMDM=\"); const WA_BASE=\"https:\/\/wa.me\/\"+_w;\nconst styles={liberty:\"https:\/\/tiles.openfreemap.org\/styles\/liberty\",sat:{version:8,sources:{sat:{type:\"raster\",tiles:[\"https:\/\/server.arcgisonline.com\/ArcGIS\/rest\/services\/World_Imagery\/MapServer\/tile\/{z}\/{y}\/{x}\"],tileSize:256}},layers:[{id:\"sat\",type:\"raster\",source:\"sat\"}]}};\nlet arch=\"Society\",island=\"Tahiti\",cat=\"taxi\",pickupLL=null,dropoffLL=null,pickupShort=\"\",dropoffShort=\"\",timing=\"now\",currentDriver=\"Teva\";\nlet trips=JSON.parse(localStorage.getItem(\"tahiti_trips\")||\"[]\");\nlet fares=[{id:1,name:\"Circle Half 9-13 $400\",min:400,only:\"circle\"},{id:2,name:\"Circle Full 9-17 $800\",min:800,only:\"circle\"},{id:3,name:\"Taxi Base $25\",flat:25,perKm:2.5,min:25,only:\"taxi\"}];\nconst map=new maplibregl.Map({container:'map',style:styles.liberty,center:[-149.4068,-17.65],zoom:11});map.addControl(new maplibregl.NavigationControl(),'bottom-right');\nlet pickM=null,dropM=null;\nfunction toast(m){const t=document.getElementById('toast');t.textContent=m;t.style.display='block';setTimeout(()=>t.style.display='none',3000);}\nfunction shortAddr(f){return f?f.split(',').slice(0,3).join(', ').slice(0,55):\"Tahiti\";}\nasync function reverse(lng,lat){try{const r=await fetch(`https:\/\/nominatim.openstreetmap.org\/reverse?format=json&lon=${lng}&lat=${lat}&zoom=14`);const j=await r.json();return j.display_name||`${lat.toFixed(4)},${lng.toFixed(4)}`;}catch{return `${lat.toFixed(4)},${lng.toFixed(4)}`;}}\nfunction switchPage(id){document.querySelectorAll('.page').forEach(p=>p.classList.remove('active'));document.getElementById(id).classList.add('active');document.querySelectorAll('.bottom button').forEach(b=>b.classList.remove('active'));document.querySelector(`[data-page=\"${id}\"]`)?.classList.add('active'); map.getContainer().style.opacity=id==='pExplore'?1:id==='pChat'?0.2:0.12; map.resize();}\ndocument.querySelectorAll('.bottom button').forEach(b=>b.onclick=()=>switchPage(b.dataset.page));\ndocument.querySelectorAll('[data-theme]').forEach(b=>b.onclick=()=>{document.querySelectorAll('[data-theme]').forEach(x=>x.classList.remove('active'));b.classList.add('active');document.body.className='bg-'+b.dataset.theme;document.getElementById('selArch').textContent=arch+' \u2022 '+island+' \u2022 '+b.dataset.theme; localStorage.setItem('theme',b.dataset.theme);});\nlet savedTheme=localStorage.getItem('theme')||'orange'; document.body.className='bg-'+savedTheme;\ndocument.querySelectorAll('[data-arch]').forEach(c=>c.onclick=()=>{arch=c.dataset.arch;document.getElementById('selArch').textContent=arch+' \u2022 '+island;});\ndocument.querySelectorAll('[data-island]').forEach(c=>c.onclick=()=>{island=c.dataset.island;document.getElementById('selArch').textContent=arch+' \u2022 '+island; const cent={Tahiti:[-149.4068,-17.65],Moorea:[-149.83,-17.54],\"Bora Bora\":[-151.74,-16.5],Rangiroa:[-147.64,-15.12]}; if(cent[island]) map.flyTo({center:cent[island],zoom:12});});\ndocument.querySelectorAll('[data-cat]').forEach(c=>c.onclick=()=>{document.querySelectorAll('[data-cat]').forEach(x=>x.classList.remove('active'));c.classList.add('active');cat=c.dataset.cat;});\ndocument.querySelectorAll('[data-driver]').forEach(c=>c.onclick=()=>{currentDriver=c.dataset.driver; toast(\"Driver switched to \"+currentDriver);});\nfunction setPickup(ll,s){pickupLL=ll;pickupShort=s; if(pickM)pickM.remove(); pickM=new maplibregl.Marker({color:\"#FF6B00\"}).setLngLat(ll).addTo(map); document.getElementById('pickup').value=s; maybeRoute();}\nfunction setDropoff(ll,s){dropoffLL=ll;dropoffShort=s; if(dropM)dropM.remove(); dropM=new maplibregl.Marker({color:\"#ff0000\"}).setLngLat(ll).addTo(map); document.getElementById('dropoff').value=s; maybeRoute(); const isAirport=\/airport|faa'a\/i.test(s); document.getElementById('airportBox').style.display=isAirport?'flex':'none';}\nasync function maybeRoute(){ if(!pickupLL||!dropoffLL) return; const url=`https:\/\/router.project-osrm.org\/route\/v1\/driving\/${pickupLL[0]},${pickupLL[1]};${dropoffLL[0]},${dropoffLL[1]}?overview=full&geometries=geojson`; try{ const r=await fetch(url); const j=await r.json(); if(j.routes&&j.routes[0]){ const rt=j.routes[0]; const dist=rt.distance\/1000; const dur=rt.duration\/60; if(map.getSource('route')){map.removeLayer('route');map.removeSource('route');} map.addSource('route',{type:'geojson',data:{type:'Feature',properties:{},geometry:rt.geometry}}); map.addLayer({id:'route',type:'line',source:'route',paint:{'line-color':getComputedStyle(document.body).getPropertyValue('--p'),'line-width':5}}); document.getElementById('etaBox').style.display='block'; document.getElementById('etaText').textContent=`${Math.round(dur)} min \u2022 ${dist.toFixed(1)} km \u2022 Wait 15-30 min if Now \u2022 Driver ${currentDriver}`; let best=Infinity; fares.forEach(f=>{ if(f.only!==cat){ if(cat==='circle'&&f.only!=='circle') return; if(cat!=='circle'&&f.only==='circle') return; } let p=(f.flat||0)+(f.perKm||0)*dist; if(f.min) p=Math.max(p,f.min); if(p<best) best=p; }); if(cat==='circle') best=Math.max(best,400); window._lastFare=isFinite(best)?best:(cat==='circle'?400:25); document.getElementById('etaSub').textContent=cat==='circle'?`Circle Island ONLY $100\/h min 4h = $${window._lastFare} drinks+fruits free`:`Taxi $${window._lastFare}`; } }catch{} }\nmap.on('click',async e=>{ const lng=e.lngLat.lng,lat=e.lngLat.lat; const full=await reverse(lng,lat); const s=shortAddr(full); if(!pickupLL){ setPickup([lng,lat],s); } else if(!dropoffLL){ setDropoff([lng,lat],s);} else { if(pickM)pickM.remove(); if(dropM)dropM.remove(); if(map.getSource('route')){map.removeLayer('route');map.removeSource('route');} pickupLL=null; dropoffLL=null; setPickup([lng,lat],s);} });\ndocument.getElementById('btnLocate').onclick=()=>{ navigator.geolocation.getCurrentPosition(async pos=>{ const ll=[pos.coords.longitude,pos.coords.latitude]; map.flyTo({center:ll,zoom:14}); const f=await reverse(ll[0],ll[1]); setPickup(ll,shortAddr(f)); if(conn&&conn.open) conn.send({type:'location',lat:ll[1],lng:ll[0],msg:'User shared live location'}); }); };\ndocument.getElementById('btnTile').onclick=()=>{ if(map.getSource('sat')) map.setStyle(styles.liberty); else map.setStyle(styles.sat); };\ndocument.getElementById('btnTheme').onclick=()=>{ const themes=['orange','blue','green']; let cur=localStorage.getItem('theme')||'orange'; let idx=(themes.indexOf(cur)+1)%themes.length; document.body.className='bg-'+themes[idx]; localStorage.setItem('theme',themes[idx]); toast(\"Theme: \"+themes[idx]); };\nlet peer=null, conn=null, localStream=null;\nfunction initPeer(){ peer=new Peer('tahiti-'+Math.floor(Math.random()*10000),{config:{iceServers:[{urls:'stun:stun.l.google.com:19302'}]}}); peer.on('open',id=>{ document.getElementById('peerStatus').textContent='Peer: '+id; document.getElementById('peerIdInput').placeholder='Your ID: '+id+' \u2022 Enter remote ID'; }); peer.on('connection',c=>{ conn=c; setupConn(); }); peer.on('call',call=>{ navigator.mediaDevices.getUserMedia({video:true,audio:true}).then(s=>{ localStream=s; document.getElementById('localVideo').srcObject=s; call.answer(s); call.on('stream',rs=>{ document.getElementById('remoteVideo').srcObject=rs; }); }); }); }\nfunction setupConn(){ conn.on('open',()=>{ toast(\"PeerJS DataChannel connected\"); addChat(\"System: Peer connected \u2014 chat, location, bookings via DataChannel\"); }); conn.on('data',data=>{ if(data.type==='chat'){ addChat(\"Driver: \"+data.msg);} else if(data.type==='location'){ addChat(`\ud83d\udccd Driver location: ${data.lat.toFixed(4)},${data.lng.toFixed(4)}`); if(pickM) pickM.setLngLat([data.lng,data.lat]); } else if(data.type==='booking'){ addChat(\"\ud83d\udce6 Booking received via PeerJS: \"+data.msg);} }); }\nfunction addChat(t){ const d=document.createElement('div'); d.style.cssText='background:var(--card);padding:8px 10px;border-radius:12px;margin:4px 0;font-size:13px'; d.textContent=t; document.getElementById('chatBox').appendChild(d); }\ndocument.getElementById('btnConnectPeer').onclick=()=>{ const remoteId=document.getElementById('peerIdInput').value.trim(); if(!remoteId||!peer){ toast(\"Enter remote Peer ID\"); return; } conn=peer.connect(remoteId); setupConn(); const call=peer.call(remoteId, localStream||null); if(call){ call.on('stream',rs=>{ document.getElementById('remoteVideo').srcObject=rs; }); } };\ndocument.getElementById('btnSend').onclick=()=>{ const msg=document.getElementById('chatInput').value; if(!msg) return; addChat(\"You: \"+msg); if(conn&&conn.open) conn.send({type:'chat',msg}); document.getElementById('chatInput').value=''; };\ndocument.getElementById('btnCam').onclick=async()=>{ try{ localStream=await navigator.mediaDevices.getUserMedia({video:true,audio:true}); document.getElementById('localVideo').srcObject=localStream; toast(\"Camera ON \u2014 PeerJS visio ready\"); }catch{ toast(\"Camera blocked\"); } };\ndocument.getElementById('btnShareLoc').onclick=()=>{ navigator.geolocation.getCurrentPosition(pos=>{ const data={type:'location',lat:pos.coords.latitude,lng:pos.coords.longitude,msg:'Live location shared'}; if(conn&&conn.open) conn.send(data); addChat(`\ud83d\udccd You shared location ${data.lat.toFixed(4)},${data.lng.toFixed(4)} via DataChannel`); },null,{enableHighAccuracy:true}); };\ndocument.getElementById('btnSwitchDriver').onclick=()=>{ const drivers=['Teva','Maui','Heiva']; let idx=drivers.indexOf(currentDriver); currentDriver=drivers[(idx+1)%drivers.length]; toast(\"Switched to Driver \"+currentDriver); if(conn&&conn.open) conn.send({type:'chat',msg:'Driver switched to '+currentDriver}); };\ninitPeer();\ndocument.getElementById('btnNow').onclick=()=>{ timing='now'; createVoucher(); };\ndocument.getElementById('btnLater').onclick=()=>{ timing='later'; createVoucher(); };\nfunction buildData(){ return {id:Date.now(),profile:document.getElementById('profile').value||\"Guest\",pax:document.getElementById('pax').value,cat,arch,island,pickup:pickupShort||\"Tahiti\",dropoff:dropoffShort||\"Tahiti\",pickupLL,dropoffLL,fare:window._lastFare||400,airline:document.getElementById('airline').value,flightNo:document.getElementById('flightNo').value,flightTime:document.getElementById('flightTime').value,timing,driver:currentDriver,eta:document.getElementById('etaText').textContent}; }\nfunction createVoucher(){ if(!pickupLL||!dropoffLL){ toast(\"Tap map for pickup & drop-off\"); return; } const d=buildData(); trips.push(d); localStorage.setItem(\"tahiti_trips\",JSON.stringify(trips)); renderRoadmap(); renderDriver(); if(conn&&conn.open) conn.send({type:'booking',msg:`${d.cat} ${d.pickup}\u2192${d.dropoff} $${d.fare} ${d.driver}`}); const fareText=d.cat==='circle'?`Circle Island $100\/h ONLY min 4h TOTAL $${d.fare} drinks+fruits free`:`Fare $${d.fare}`; const html=`<div class=\"voucher\"><div style=\"display:flex;justify-content:space-between\"><div><div style=\"font-size:11px;letter-spacing:.1em;opacity:.7\">WHATSAPP VOUCHER \u2022 ${d.cat.toUpperCase()} \u2022 ${d.timing.toUpperCase()} \u2022 Driver ${d.driver}<\/div><div style=\"font-size:18px;font-weight:800;margin-top:4px\">${d.pickup} \u2192 ${d.dropoff}<\/div><div style=\"font-size:12px;color:#aaa\">${d.arch} \u2022 ${d.island} \u2022 ${d.eta}<\/div><\/div><span class=\"badge\">${d.timing==='now'?'15-30 WAIT':'SCHED'}<\/span><\/div><div style=\"border-top:1px dashed rgba(255,255,255,.2);margin:12px 0\"><\/div><div style=\"display:flex;gap:12px;font-size:13px\"><div>\ud83d\udc64 ${d.profile}<\/div><div>\ud83d\udc65 ${d.pax}<\/div><div>\ud83d\udcb0 ${fareText}<\/div><\/div><div style=\"display:flex;gap:8px;margin-top:12px\"><button class=\"btn\" style=\"flex:1;background:white;color:#111\" onclick=\"declineVoucher(${d.id})\">Decline<\/button><button class=\"btn btn-p\" style=\"flex:1\" onclick=\"acceptVoucher(${d.id})\">Accept \u2192 WA + ICS GCal<\/button><\/div><button class=\"btn\" style=\"width:100%;margin-top:8px;background:rgba(255,255,255,.15);color:white\" onclick=\"downloadICS(${d.id})\">\ud83d\udcc5 Add to Google Calendar (.ics)<\/button><\/div>`; document.getElementById('voucherPreview').innerHTML=html; toast(\"Voucher via PeerJS + Roadmap added\"); }\nfunction renderRoadmap(){ const c=document.getElementById('roadmapList'); c.innerHTML=\"\"; trips.forEach(t=>{ const div=document.createElement('div'); div.className='card'; div.innerHTML=`<div style=\"display:flex;justify-content:space-between\"><b>Voucher \u2022 ${t.cat} \u2022 ${t.driver}<\/b><span class=\"badge\">${t.timing==='now'?'NOW':'LATER'}<\/span><\/div><div>${t.pickup} \u2192 ${t.dropoff}<\/div><div style=\"font-size:12px;color:var(--muted)\">${t.arch} \u2022 ${t.island} \u2022 ${t.eta||''} \u2022 $${t.fare} \u2022 WA${t.id.toString().slice(-4)}<\/div>`; c.appendChild(div); }); }\nfunction renderDriver(){ const now=trips.filter(t=>t.timing==='now').length, later=trips.filter(t=>t.timing==='later').length; document.getElementById('nowCount').textContent=now; document.getElementById('laterCount').textContent=later; const c=document.getElementById('driverList'); c.innerHTML=\"\"; trips.forEach(t=>{ const d=document.createElement('div'); d.className='card'; d.innerHTML=`<div style=\"display:flex;justify-content:space-between\"><b>#WA${t.id.toString().slice(-4)} \u2022 ${t.cat} \u2022 ${t.driver}<\/b><span style=\"font-size:12px;color:var(--muted)\">${t.timing}<\/span><\/div><div>${t.pickup} \u2192 ${t.dropoff} \u2022 $${t.fare}<\/div><button class=\"btn btn-p\" style=\"width:100%;margin-top:6px\" onclick=\"acceptVoucher(${t.id})\">Accept + ICS<\/button>`; c.appendChild(d); }); document.getElementById('calList').innerHTML=trips.map(t=>`\u2022 ${t.pickup}\u2192${t.dropoff} $${t.fare} ${t.driver} \u2022 ${t.timing}`).join('<br>'); }\nwindow.acceptVoucher=(id)=>{ const t=trips.find(x=>x.id===id); if(!t) return; const txt=`\ud83c\udf3a ${t.timing.toUpperCase()} ACCEPTED - TAHITI SUPERAPP\\n\ud83d\udc64 ${t.profile} \ud83d\udc65 ${t.pax}\\n\ud83d\udccd Pickup: ${t.pickup} https:\/\/maps.google.com\/?q=${t.pickupLL?t.pickupLL[1]+','+t.pickupLL[0]:''}\\n\ud83d\udccd Drop: ${t.dropoff} https:\/\/maps.google.com\/?q=${t.dropoffLL?t.dropoffLL[1]+','+t.dropoffLL[0]:''}\\n\ud83c\udfdd\ufe0f ${t.arch} \u2022 ${t.island}\\n\ud83d\ude95 ${t.cat} ${t.cat==='circle'?'$100\/h ONLY Circle min 4h $400 drinks+fruits free':''} \ud83d\udcb0 $${t.fare}\\n${t.airline?`\u2708\ufe0f ${t.airline} ${t.flightNo} ${t.flightTime}`:''}\\nDriver: ${t.driver} \u2022 Timing: ${t.timing} 15-30 min if now\\nVoucher WA${t.id.toString().slice(-4)}`; window.open(WA_BASE+\"?text=\"+encodeURIComponent(txt),\"_blank\"); downloadICS(id); if(conn&&conn.open) conn.send({type:'chat',msg:'\u2705 Accepted WA'+t.id}); };\nwindow.declineVoucher=(id)=>{ window.open(WA_BASE+\"?text=\"+encodeURIComponent(`\u274c DECLINED WA${id}`),\"_blank\"); };\nwindow.downloadICS=(id)=>{ const t=trips.find(x=>x.id===id); if(!t) return; const now=new Date(); const start=new Date(); if(t.timing==='now') start.setMinutes(start.getMinutes()+30); else start.setHours(start.getHours()+2); const end=new Date(start.getTime()+(t.cat==='circle'?4:1)*3600*1000); function fmt(dt){return dt.toISOString().replace(\/[-:]\/g,'').split('.')[0]+'Z';} const ics=`BEGIN:VCALENDAR\\nVERSION:2.0\\nPRODID:-\/\/TahitiSuperApp\/\/EN\\nBEGIN:VEVENT\\nUID:${t.id}@tahitidriver.pf\\nDTSTAMP:${fmt(now)}\\nDTSTART:${fmt(start)}\\nDTEND:${fmt(end)}\\nSUMMARY:Tahiti ${t.cat} - ${t.profile} - ${t.pickup} to ${t.dropoff} - Driver ${t.driver}\\nDESCRIPTION:Arch:${t.arch} Island:${t.island} Pickup:${t.pickup} Drop:${t.dropoff} Fare:$${t.fare} Cat:${t.cat} ${t.cat==='circle'?'$100\/h ONLY':''} Pax:${t.pax} Flight:${t.airline||''} ${t.flightNo||''} Driver:${t.driver} Voucher:WA${t.id.toString().slice(-4)}\\nLOCATION:${t.pickup} -> ${t.dropoff}\\nEND:VEVENT\\nEND:VCALENDAR`; const blob=new Blob([ics],{type:'text\/calendar'}); const url=URL.createObjectURL(blob); const a=document.createElement('a'); a.href=url; a.download=`Tahiti-${t.cat}-${t.profile}.ics`; a.click(); const gcal=`https:\/\/calendar.google.com\/calendar\/render?action=TEMPLATE&text=${encodeURIComponent('Tahiti '+t.cat+' - '+t.profile+' - Driver '+t.driver)}&details=${encodeURIComponent('Voucher WA'+t.id+' '+t.pickup+'\u2192'+t.dropoff+' $'+t.fare)}&location=${encodeURIComponent(t.pickup+' -> '+t.dropoff)}&dates=${fmt(start)}\/${fmt(end)}`; window.open(gcal,'_blank'); };\nrenderRoadmap(); renderDriver(); switchPage('pExplore');\n<\/script><\/body><\/html>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Tahiti SuperApp \u2022 Black Orange \u2022 PeerJS TTahiti Driver \u2022 Black Orange FIRE\ud83d\udfe2 PeerJS \u2022 Waiting 15-30 min \u2022 Max 8 pax Peer: connecting&#8230; \ud83c\udfa8 Theme\ud83d\uddfa\ufe0f\ud83d\udccd \ud83c\udf3a Archipelago \u2022 Theme SwitcherUser can change theme anytime. Orange Black is default fire. \ud83d\udfe0 Orange Black\ud83d\udd35 Blue White\ud83d\udfe2 Green White WhatsApp Society IslandsTuamotu 80+ AtollsMarquesasAustralGambier Tahiti PapeeteMooreaBora BoraRangiroa [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-241","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/mana-corp.com\/index.php?rest_route=\/wp\/v2\/pages\/241","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mana-corp.com\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/mana-corp.com\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/mana-corp.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mana-corp.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=241"}],"version-history":[{"count":4,"href":"https:\/\/mana-corp.com\/index.php?rest_route=\/wp\/v2\/pages\/241\/revisions"}],"predecessor-version":[{"id":245,"href":"https:\/\/mana-corp.com\/index.php?rest_route=\/wp\/v2\/pages\/241\/revisions\/245"}],"wp:attachment":[{"href":"https:\/\/mana-corp.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=241"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}