🇹🇭
Thailand 2026
May 3 – 8, 2026 • 5 nights
Abraham • Lumiere • Dorcas
Ask me to wire this up properly — I can produce a Firebase-ready version with auth, presence (who's online), and conflict resolution.
📝 Shared group notes
Use this scratchpad for group decisions — who's booking what hotel, who's got the cash, dinner reservations, etc. Save locally, copy to share.
`;
}
function bindCollabHandlers() {
const exportBox = document.getElementById('exportBox');
if (exportBox) exportBox.value = JSON.stringify({
traveller: state.currentTraveller,
itinerary: state.itinerary,
generatedAt: new Date().toISOString()
}, null, 2);
const notes = document.getElementById('sharedNotes');
if (notes) notes.value = localStorage.getItem('thai-trip-notes') || '';
}
function saveSharedNotes() {
const v = document.getElementById('sharedNotes').value;
localStorage.setItem('thai-trip-notes', v);
toast('Notes saved ✓');
}
function copyNotes() {
const v = document.getElementById('sharedNotes').value;
if (navigator.clipboard) {
navigator.clipboard.writeText(v).then(() => toast('Notes copied ✓'));
} else {
prompt('Copy:', v);
}
}
// ========== EXPORT / IMPORT ==========
function exportJSON() {
const payload = JSON.stringify({
traveller: state.currentTraveller,
itinerary: state.itinerary,
generatedAt: new Date().toISOString()
}, null, 2);
if (navigator.clipboard) {
navigator.clipboard.writeText(payload).then(() => toast('Copied to clipboard ✓'),
() => prompt('Copy this JSON:', payload));
} else {
prompt('Copy this JSON:', payload);
}
}
function openImport() {
const txt = prompt('Paste itinerary JSON:');
if (!txt) return;
try {
const p = JSON.parse(txt);
if (p.itinerary) { state.itinerary = p.itinerary; saveState(); render(); toast('Imported ✓'); }
else alert('No itinerary key found in JSON.');
} catch (e) { alert('Invalid JSON: ' + e.message); }
}
function importFromBox() {
const el = document.getElementById('importBox');
if (!el) return;
try {
const p = JSON.parse(el.value);
if (p.itinerary) { state.itinerary = p.itinerary; saveState(); render(); toast('Imported ✓'); }
else alert('No itinerary key found.');
} catch (e) { alert('Invalid JSON: ' + e.message); }
}
// ========== INIT ==========
loadState();
render();