?

ELwebshll2019

Current Path : /home/webyoo/www/bat-mitsva-romy/
Upload File :
Current File : /home/webyoo/www/bat-mitsva-romy/rsvp.js

// Compte à rebours dynamique : 7 juin 2026, 19h45 heure d'Israël (UTC+3 → 16:45 UTC)
const cible = new Date('2026-06-07T16:45:00Z').getTime();
const elJ = document.getElementById('cd-j');
const elH = document.getElementById('cd-h');
const elM = document.getElementById('cd-m');
const elS = document.getElementById('cd-s');
const pad = n => (n < 10 ? '0' + n : '' + n);

function maj(){
  let d = cible - Date.now();
  if(d <= 0){ elJ.textContent='00';elH.textContent='00';elM.textContent='00';elS.textContent='00';return; }
  const j = Math.floor(d / 86400000); d -= j*86400000;
  const h = Math.floor(d / 3600000);  d -= h*3600000;
  const m = Math.floor(d / 60000);    d -= m*60000;
  const s = Math.floor(d / 1000);
  elJ.textContent = pad(j);
  elH.textContent = pad(h);
  elM.textContent = pad(m);
  elS.textContent = pad(s);
}
maj();
setInterval(maj, 1000);

// ==== Formulaire RSVP : envoi AJAX vers Web3Forms (en JSON pour préserver l'UTF-8) ====
const formRsvp = document.getElementById('form-rsvp');
if(formRsvp){
  formRsvp.addEventListener('submit', async (e)=>{
    e.preventDefault();
    const btn = formRsvp.querySelector('.btn');
    const oldHtml = btn.innerHTML;
    btn.disabled = true;
    btn.innerHTML = '<span class="btn-fr">ENVOI EN COURS…</span><span class="btn-he">שולח…</span>';

    try {
      const formData = new FormData(formRsvp);
      const payload = Object.fromEntries(formData.entries());
      const resp = await fetch('https://api.web3forms.com/submit', {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json; charset=UTF-8',
          'Accept': 'application/json'
        },
        body: JSON.stringify(payload)
      });
      const json = await resp.json();
      if(resp.ok && json.success){
        document.getElementById('rsvp-form').classList.add('envoye');
        document.getElementById('merci').scrollIntoView({ behavior:'smooth', block:'center' });
      } else {
        throw new Error(json.message || 'Réponse non-OK');
      }
    } catch(err){
      alert("Désolé, l'envoi a échoué. Merci de réessayer ou de contacter Sarah directement.\n\nמצטערים, השליחה נכשלה. נסו שוב או פנו ישירות לשרה.");
      btn.disabled = false;
      btn.innerHTML = oldHtml;
    }
  });
}

// ==== Mode CALIBRATION (?cal=1) ====
if(new URLSearchParams(location.search).has('cal')){
  document.body.classList.add('cal');
  const carte = document.querySelector('.invitation');
  const cibles = document.querySelectorAll('.overlay');

  const panel = document.createElement('div');
  panel.id = 'cal-panel';
  panel.innerHTML = '<b>MODE CALIBRATION</b><br>Glisse les blocs pour les positionner.<br><button id="cal-copy">Copier les valeurs CSS</button><pre id="cal-output"></pre>';
  document.body.appendChild(panel);
  const out = panel.querySelector('#cal-output');

  function refresh(){
    let txt = '';
    cibles.forEach(el=>{
      const cls = [...el.classList].find(c=>c.startsWith('bloc-'));
      const r = el.getBoundingClientRect();
      const p = carte.getBoundingClientRect();
      const left   = ((r.left  - p.left) / p.width  * 100).toFixed(2);
      const top    = ((r.top   - p.top ) / p.height * 100).toFixed(2);
      const width  = (r.width  / p.width  * 100).toFixed(2);
      const height = (r.height / p.height * 100).toFixed(2);
      txt += '.' + cls + ' { left:' + left + '%; top:' + top + '%; width:' + width + '%; height:' + height + '%; }\n';
    });
    out.textContent = txt;
  }

  function startDrag(el, e, mode){
    e.preventDefault(); e.stopPropagation();
    const startX = e.clientX, startY = e.clientY;
    const r = el.getBoundingClientRect();
    const p = carte.getBoundingClientRect();
    const startLeft = r.left - p.left;
    const startTop  = r.top  - p.top;
    const startW    = r.width;
    const startH    = r.height;

    function move(ev){
      const dx = ev.clientX - startX, dy = ev.clientY - startY;
      if(mode === 'move'){
        el.style.left = ((startLeft + dx) / p.width  * 100) + '%';
        el.style.top  = ((startTop  + dy) / p.height * 100) + '%';
      } else {
        el.style.width  = ((startW + dx) / p.width  * 100) + '%';
        el.style.height = ((startH + dy) / p.height * 100) + '%';
      }
      refresh();
    }
    function up(){
      window.removeEventListener('mousemove', move);
      window.removeEventListener('mouseup', up);
    }
    window.addEventListener('mousemove', move);
    window.addEventListener('mouseup', up);
  }

  cibles.forEach(el=>{
    el.addEventListener('mousedown', e=>{
      const r = el.getBoundingClientRect();
      const inHandle = (e.clientX > r.right - 22) && (e.clientY > r.bottom - 22);
      startDrag(el, e, inHandle ? 'resize' : 'move');
    });
    el.querySelectorAll('a').forEach(a=>{
      a.addEventListener('click', e=>e.preventDefault());
    });
  });

  panel.querySelector('#cal-copy').addEventListener('click', ()=>{
    navigator.clipboard.writeText(out.textContent);
    panel.querySelector('#cal-copy').textContent = '✓ Copié !';
    setTimeout(()=>panel.querySelector('#cal-copy').textContent='Copier les valeurs CSS', 1500);
  });

  refresh();
  window.addEventListener('resize', refresh);
}



web shell, Coded By 2019