function qxCalcUpdate(){
var m=parseInt(document.getElementById('calc-missions').value);
var r=parseInt(document.getElementById('calc-reward').value);
var loc=window.QX_CURRENT_LOCALE||{symbol:'€',currency:'EUR'};
var monthly=Math.round(m*r*4.3);
document.getElementById('calc-missions-val').textContent=m;
document.getElementById('calc-reward-val').textContent=loc.symbol+r;
document.getElementById('calc-output').textContent=loc.symbol+monthly;
}
document.addEventListener('qx:market',function(){qxCalcUpdate();});
// ── Glossary tooltip engine ───────────────────────────────────────────
const GLOSSARY = {
'Zoomer': { short: 'A verified field data collector on the quiXzoom platform.', slug: 'zoomer' },
'mission': { short: 'A paid photography assignment with defined location, scope and compensation.', slug: 'mission' },
'submission': { short: 'A completed set of photos submitted for AI review after a mission is executed.', slug: 'submission' },
'claim': { short: 'Reserving a mission — locks it exclusively for you within a defined time window.', slug: 'claim' },
'time window': { short: 'The duration a Zoomer has to complete and submit a claimed mission.', slug: 'time-window' },
'approval rate': { short: 'Percentage of submissions that pass AI quality review. Affects tier and mission access.', slug: 'approval-rate' },
'Stripe Connect': { short: 'The payment infrastructure that converts your QX Credit balance to cash and transfers it to your bank account via weekly payouts.', slug: 'stripe-connect' },
'KYC': { short: 'Know Your Customer — the one-time identity verification required before your first payout.', slug: 'kyc' },
'tier': { short: 'Your Zoomer level (Supplementary / Active / Professional) based on volume and approval rate.', slug: 'tier' },
'surge': { short: 'High-urgency missions deployed after events like storms or floods. Pay 2–5× standard rate.', slug: 'surge-mission' },
'AI review': { short: 'Automated quality and specification check run on every submission before payment.', slug: 'ai-review' },
'geo-tagged': { short: 'Images embedded with GPS coordinates — verified against mission location parameters.', slug: 'geo-tagged' },
'GDPR': { short: 'EU data protection regulation governing how quiXzoom handles your personal data.', slug: 'gdpr' },
'SLA': { short: 'Service Level Agreement — the delivery timeline and quality commitments made to orderers.', slug: 'sla' },
'API': { short: 'Application Programming Interface — how orderers programmatically access mission data.', slug: 'api' },
'webhook': { short: 'Automatic HTTP notification sent to orderers when a submission is approved.', slug: 'webhook' },
'IBAN': { short: 'International Bank Account Number — required for Stripe Connect payout setup.', slug: 'iban' },
'SEPA': { short: 'Single Euro Payments Area — the European bank transfer network used for EUR payouts.', slug: 'sepa' },
'VAT': { short: 'Value Added Tax — Zoomers are responsible for their own VAT obligations where applicable.', slug: 'vat' },
'payout': { short: 'Weekly transfer of QX Credits converted to cash, to your linked bank account. Requires reaching the minimum Credit threshold.', slug: 'payout' },
'rating': { short: 'Your accumulated quality score on the platform, affecting tier and mission access.', slug: 'rating' },
'specialisation': { short: 'A certified competency unlocking access to specific premium mission types.', slug: 'specialisation' },
'liveness check': { short: 'Selfie-based verification confirming a real person is behind the identity document.', slug: 'liveness-check' },
'AML': { short: 'Anti-Money Laundering regulation — the legal basis for KYC requirements on payment platforms.', slug: 'aml' },
};
const tip = document.createElement('div');
tip.className = 'gtooltip';
tip.innerHTML = 'Full definition →';
document.body.appendChild(tip);
document.addEventListener('mouseover', e => {
const el = e.target.closest('.gterm');
if (!el) return;
const key = el.dataset.gterm;
const g = GLOSSARY[key];
if (!g) return;
tip.querySelector('.gtooltip-term').textContent = key;
tip.querySelector('.gtooltip-def').textContent = g.short;
tip.querySelector('.gtooltip-more').href = '/glossary#' + g.slug;
tip.classList.add('visible');
});
document.addEventListener('mousemove', e => {
if (!tip.classList.contains('visible')) return;
const x = e.clientX + 12;
const y = e.clientY - 60;
tip.style.left = Math.min(x, window.innerWidth - 300) + 'px';
tip.style.top = Math.max(8, y) + 'px';
});
document.addEventListener('mouseout', e => {
if (!e.target.closest('.gterm')) return;
tip.classList.remove('visible');
});
// ── Scroll fade-in observer ───────────────────────────────────
(function(){
const obs = new IntersectionObserver((entries) => {
entries.forEach(e => {
if(e.isIntersecting){ e.target.classList.add('visible'); obs.unobserve(e.target); }
});
}, { threshold: 0.12 });
document.querySelectorAll('.fade-in').forEach(el => obs.observe(el));
// Staggered delay för card-groups
document.querySelectorAll('.steps-grid,.personas-grid,.stats-grid,.missions-grid,.earnings-grid').forEach(grid => {
grid.querySelectorAll('.fade-in').forEach((el,i) => {
el.style.transitionDelay = (i * 0.08) + 's';
});
});
})();
function toggleMenu(){
const h=document.getElementById('hamburger');
const m=document.getElementById('mobile-menu');
h.classList.toggle('open');
m.classList.toggle('open');
document.body.style.overflow=m.classList.contains('open')?'hidden':'';
}
function closeMenu(){
document.getElementById('hamburger').classList.remove('open');
document.getElementById('mobile-menu').classList.remove('open');
document.body.style.overflow='';
}
// Close menu on resize to desktop
window.addEventListener('resize',()=>{if(window.innerWidth>768)closeMenu();});
function toggleDrop(btn) {
const li = btn.closest('li');
const wasOpen = li.classList.contains('open');
// Stäng alla
document.querySelectorAll('.nav-links > li.open').forEach(el => el.classList.remove('open'));
if (!wasOpen) li.classList.add('open');
}
// Stäng dropdown vid klick utanför
document.addEventListener('click', e => {
if (!e.target.closest('.nav-links')) {
document.querySelectorAll('.nav-links > li.open').forEach(el => el.classList.remove('open'));
}
});
document.addEventListener('click', function(e){
var ms = document.getElementById('market-selector');
if(ms && !ms.contains(e.target)) ms.classList.remove('open');
});
/* Sprint 3: dynamic tax note */
document.addEventListener('qx:market', function(e){
var d = window.QX_LOCALES[e.detail.market];
if(!d) return;
var el = document.getElementById('qx-tax-note');
if(el) el.textContent = d.taxNote;
});