{"id":479,"date":"2026-02-14T14:19:02","date_gmt":"2026-02-14T13:19:02","guid":{"rendered":"https:\/\/ingilog.com\/sugardelta_dev\/?page_id=479"},"modified":"2026-02-21T15:12:22","modified_gmt":"2026-02-21T14:12:22","slug":"e-qsls","status":"publish","type":"page","link":"https:\/\/ingilog.com\/sugardelta_dev\/e-qsls\/","title":{"rendered":"E-QSLs"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"479\" class=\"elementor elementor-479\">\n\t\t\t\t<div class=\"elementor-element elementor-element-4a49ae9 e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent\" data-id=\"4a49ae9\" 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-3fbfdfd elementor-widget elementor-widget-html\" data-id=\"3fbfdfd\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!-- ============================================================\n  eQSL \u2013 PAGE PUBLIQUE (visiteurs non inscrits)\n  \u00c0 coller dans un widget Elementor \"HTML\"\n  Requiert : PHP WPCode charg\u00e9, jQuery, eqslVars disponible\n  reCAPTCHA v3 \u2014 invisible, pas de case \u00e0 cocher\n============================================================ -->\n\n<style>\n:root {\n  --eq-bg:       #0d1117;\n  --eq-surface:  #161b22;\n  --eq-border:   #30363d;\n  --eq-accent:   #238636;\n  --eq-accent2:  #1f6feb;\n  --eq-danger:   #da3633;\n  --eq-text:     #e6edf3;\n  --eq-muted:    #8b949e;\n  --eq-radius:   8px;\n  --eq-shadow:   0 4px 24px rgba(0,0,0,.45);\n}\n\n#eqsl-public * { box-sizing:border-box; margin:0; padding:0; }\n\n#eqsl-public {\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n  background: var(--eq-bg);\n  color: var(--eq-text);\n  min-height: 420px;\n  border-radius: var(--eq-radius);\n  padding: 28px;\n}\n\n.eqpub-search-block { max-width:520px; margin:0 auto 32px; text-align:center; }\n.eqpub-search-block h2 { font-size:1.5rem; font-weight:700; margin-bottom:6px; }\n.eqpub-search-block p  { color:var(--eq-muted); font-size:.9rem; margin-bottom:20px; }\n\n.eqpub-search-form {\n  display:flex; gap:10px; background:var(--eq-surface);\n  border:1px solid var(--eq-border); border-radius:40px;\n  padding:6px 6px 6px 20px; transition:border-color .15s;\n}\n.eqpub-search-form:focus-within { border-color:var(--eq-accent2); }\n.eqpub-search-form input {\n  flex:1; background:none; border:none; outline:none;\n  color:var(--eq-text); font-size:1rem;\n  letter-spacing:.08em; text-transform:uppercase;\n}\n.eqpub-search-form input::placeholder { color:var(--eq-muted); text-transform:none; }\n.eqpub-search-btn {\n  background:var(--eq-accent2); color:#fff; border:none;\n  border-radius:30px; padding:9px 22px; font-size:.9rem;\n  font-weight:600; cursor:pointer; transition:filter .15s; white-space:nowrap;\n}\n.eqpub-search-btn:hover { filter:brightness(1.12); }\n\n.eqpub-result-header {\n  display:flex; align-items:center; justify-content:space-between;\n  margin-bottom:16px; flex-wrap:wrap; gap:10px;\n}\n.eqpub-result-header h3 { font-size:1.05rem; font-weight:600; }\n.eqpub-callsign-chip {\n  display:inline-block; background:rgba(31,111,235,.2);\n  border:1px solid rgba(31,111,235,.4); color:#58a6ff;\n  border-radius:20px; padding:3px 12px; font-size:.85rem;\n  font-weight:600; letter-spacing:.06em; margin-left:8px;\n}\n\n.eqpub-table-wrap { overflow-x:auto; border-radius:var(--eq-radius); border:1px solid var(--eq-border); }\n.eqpub-table { width:100%; border-collapse:collapse; font-size:.88rem; }\n.eqpub-table th {\n  background:var(--eq-surface); color:var(--eq-muted); font-weight:500;\n  text-transform:uppercase; font-size:.72rem; letter-spacing:.05em;\n  padding:10px 14px; text-align:left; border-bottom:1px solid var(--eq-border);\n}\n.eqpub-table td { padding:11px 14px; border-bottom:1px solid var(--eq-border); vertical-align:middle; }\n.eqpub-table tr:last-child td { border-bottom:none; }\n.eqpub-table tbody tr { cursor:pointer; transition:background .12s; }\n.eqpub-table tbody tr:hover { background:rgba(255,255,255,.04); }\n\n.eqbadge { display:inline-block; padding:3px 9px; border-radius:20px; font-size:.75rem; font-weight:600; }\n.eqbadge-pending   { background:rgba(210,153,34,.2); color:#d29922; border:1px solid rgba(210,153,34,.4); }\n.eqbadge-completed { background:rgba(35,134,54,.2);  color:#3fb950; border:1px solid rgba(35,134,54,.4); }\n\n.eqpub-empty { text-align:center; padding:48px 24px; color:var(--eq-muted); font-size:.95rem; }\n.eqpub-loading { display:flex; align-items:center; justify-content:center; gap:12px; padding:40px; color:var(--eq-muted); }\n.eqpub-spinner {\n  width:22px; height:22px; border:2px solid var(--eq-border);\n  border-top-color:var(--eq-accent2); border-radius:50%;\n  animation:eqspin .7s linear infinite;\n}\n@keyframes eqspin { to { transform:rotate(360deg); } }\n\n.eqpub-overlay {\n  position:fixed; inset:0; background:rgba(0,0,0,.75);\n  backdrop-filter:blur(3px); z-index:9999;\n  display:flex; align-items:center; justify-content:center;\n  padding:20px; overflow-y:auto;\n}\n.eqpub-overlay.hidden { display:none; }\n\n.eqpub-modal {\n  background:var(--eq-surface); border:1px solid var(--eq-border);\n  border-radius:12px; width:100%; max-width:700px;\n  box-shadow:var(--eq-shadow); display:flex; flex-direction:column;\n  max-height:90vh; overflow-y:auto;\n}\n.eqpub-modal-head {\n  display:flex; align-items:center; justify-content:space-between;\n  padding:18px 24px; border-bottom:1px solid var(--eq-border);\n  position:sticky; top:0; background:var(--eq-surface); z-index:1;\n}\n.eqpub-modal-head h3 { font-size:1.05rem; font-weight:600; }\n.eqpub-modal-close {\n  background:none; border:none; color:var(--eq-muted);\n  cursor:pointer; font-size:1.4rem; line-height:1;\n  padding:2px 6px; border-radius:4px; transition:color .15s;\n}\n.eqpub-modal-close:hover { color:var(--eq-text); }\n.eqpub-modal-body { padding:24px; }\n.eqpub-modal-foot {\n  padding:16px 24px; border-top:1px solid var(--eq-border);\n  display:flex; gap:10px; justify-content:flex-end; flex-wrap:wrap;\n  position:sticky; bottom:0; background:var(--eq-surface);\n}\n\n.eqpub-btn {\n  display:inline-flex; align-items:center; gap:7px;\n  padding:9px 18px; border-radius:var(--eq-radius); border:none;\n  cursor:pointer; font-size:.9rem; font-weight:500;\n  transition:filter .15s, transform .1s;\n}\n.eqpub-btn:active { transform:scale(.97); }\n.eqpub-btn:hover  { filter:brightness(1.12); }\n.eqpub-btn-primary { background:var(--eq-accent);  color:#fff; }\n.eqpub-btn-blue    { background:var(--eq-accent2); color:#fff; }\n.eqpub-btn-ghost   { background:transparent; color:var(--eq-text); border:1px solid var(--eq-border); }\n\n.eqpub-preview-wrap {\n  width:100%; border-radius:var(--eq-radius); overflow:hidden;\n  border:1px solid var(--eq-border); margin-bottom:16px;\n  background:var(--eq-bg); min-height:120px;\n  display:flex; align-items:center; justify-content:center;\n}\n.eqpub-preview-wrap img { width:100%; display:block; }\n\n.eqpub-info-grid {\n  display:grid; grid-template-columns:1fr 1fr;\n  gap:10px 20px; font-size:.88rem; margin-bottom:16px;\n}\n.eqpub-info-grid dt { color:var(--eq-muted); font-size:.75rem; text-transform:uppercase; margin-bottom:2px; }\n.eqpub-info-grid dd { font-weight:500; }\n\n.eqpub-upload-section { margin-top:18px; border-top:1px solid var(--eq-border); padding-top:18px; }\n.eqpub-upload-section h4 { font-size:.95rem; font-weight:600; margin-bottom:12px; }\n\n.eqpub-upload-zone {\n  border:2px dashed var(--eq-border); border-radius:var(--eq-radius);\n  padding:28px; text-align:center; cursor:pointer;\n  transition:border-color .15s, background .15s; margin-bottom:14px;\n}\n.eqpub-upload-zone:hover { border-color:var(--eq-accent2); background:rgba(31,111,235,.04); }\n.eqpub-upload-zone input { display:none; }\n.eqpub-upload-zone .selected-name {\n  margin-top:8px; color:var(--eq-text); font-weight:500; font-size:.85rem; display:none;\n}\n\n\/* Masquer le badge reCAPTCHA v3 (l\u00e9gal si mention dans la page) *\/\n.grecaptcha-badge { visibility:hidden !important; }\n.eqpub-captcha-notice {\n  font-size:.72rem; color:var(--eq-muted); text-align:center;\n  margin-bottom:12px; line-height:1.5;\n}\n.eqpub-captcha-notice a { color:var(--eq-accent2); text-decoration:none; }\n\n.eqpub-toast {\n  position:fixed; bottom:28px; right:28px; z-index:99999;\n  max-width:340px; padding:14px 20px; border-radius:var(--eq-radius);\n  font-size:.88rem; font-weight:500; box-shadow:var(--eq-shadow);\n  animation:eqSlide .3s ease; transition:opacity .3s;\n}\n.eqpub-toast-success { background:#238636; color:#fff; }\n.eqpub-toast-error   { background:#da3633; color:#fff; }\n@keyframes eqSlide { from { transform:translateY(20px); opacity:0; } }\n\n@media(max-width:520px) {\n  .eqpub-info-grid { grid-template-columns:1fr; }\n  .eqpub-search-form { padding:4px 4px 4px 14px; }\n}\n<\/style>\n\n<div id=\"eqsl-public\">\n  <div class=\"eqpub-search-block\">\n    <h2>\ud83d\udcfb R\u00e9cup\u00e9rer vos eQSL<\/h2>\n    <p>Entrez votre indicatif pour retrouver les eQSL qui vous sont destin\u00e9es.<\/p>\n    <div class=\"eqpub-search-form\">\n      <input type=\"text\" id=\"eqpub-callsign-input\" placeholder=\"Votre indicatif (ex: F4ABC)\"\n             autocomplete=\"off\" spellcheck=\"false\">\n      <button class=\"eqpub-search-btn\" id=\"eqpub-search-btn\">Rechercher<\/button>\n    <\/div>\n  <\/div>\n\n  <div id=\"eqpub-results\" style=\"display:none\">\n    <div class=\"eqpub-result-header\">\n      <h3>eQSL disponibles pour <span class=\"eqpub-callsign-chip\" id=\"eqpub-cs-chip\"><\/span><\/h3>\n      <button class=\"eqpub-btn eqpub-btn-ghost\" id=\"eqpub-btn-reset\" style=\"font-size:.82rem;padding:6px 14px\">\n        \u2190 Nouvelle recherche\n      <\/button>\n    <\/div>\n    <div id=\"eqpub-list-wrap\">\n      <div class=\"eqpub-loading\"><div class=\"eqpub-spinner\"><\/div> Recherche...<\/div>\n    <\/div>\n  <\/div>\n<\/div>\n\n<!-- Modal -->\n<div class=\"eqpub-overlay hidden\" id=\"eqpub-overlay-detail\">\n  <div class=\"eqpub-modal\">\n    <div class=\"eqpub-modal-head\">\n      <h3 id=\"eqpub-det-title\">eQSL<\/h3>\n      <button class=\"eqpub-modal-close\" id=\"eqpub-modal-close\">\u00d7<\/button>\n    <\/div>\n    <div class=\"eqpub-modal-body\">\n      <div class=\"eqpub-preview-wrap\" id=\"eqpub-det-preview\"><div class=\"eqpub-spinner\"><\/div><\/div>\n      <dl class=\"eqpub-info-grid\" id=\"eqpub-det-info\"><\/dl>\n\n      <div class=\"eqpub-upload-section\" id=\"eqpub-upload-section\">\n        <h4>\ud83d\udce4 Envoyer votre eQSL en r\u00e9ponse<\/h4>\n        <p style=\"font-size:.83rem;color:var(--eq-muted);margin-bottom:12px\">\n          Uploadez votre eQSL (JPEG \/ PNG \/ GIF, max 5 Mo). L'op\u00e9rateur sera notifi\u00e9 par email.\n        <\/p>\n        <div class=\"eqpub-upload-zone\" id=\"eqpub-drop-zone\">\n          <input type=\"file\" id=\"eqpub-recv-file\" accept=\"image\/jpeg,image\/png,image\/gif\">\n          <svg width=\"32\" height=\"32\" fill=\"none\" stroke=\"var(--eq-muted)\" stroke-width=\"1.5\" viewBox=\"0 0 24 24\">\n            <path d=\"M21 15v4a2 2 0 01-2 2H5a2 2 0 01-2-2v-4M17 8l-5-5-5 5M12 3v12\"\/>\n          <\/svg>\n          <p style=\"color:var(--eq-muted);font-size:.85rem;margin-top:8px\">\n            Glissez votre image ou <strong style=\"color:var(--eq-accent2)\">cliquez<\/strong>\n          <\/p>\n          <div class=\"selected-name\" id=\"eqpub-recv-name\"><\/div>\n        <\/div>\n        <!-- Notice l\u00e9gale obligatoire quand le badge reCAPTCHA v3 est masqu\u00e9 -->\n        <p class=\"eqpub-captcha-notice\" id=\"eqpub-captcha-notice\" style=\"display:none\">\n          Ce formulaire est prot\u00e9g\u00e9 par reCAPTCHA \u2014\n          <a href=\"https:\/\/policies.google.com\/privacy\" target=\"_blank\">Confidentialit\u00e9<\/a> &amp;\n          <a href=\"https:\/\/policies.google.com\/terms\" target=\"_blank\">Conditions<\/a> Google.\n        <\/p>\n        <div style=\"text-align:center\">\n          <button class=\"eqpub-btn eqpub-btn-primary\" id=\"eqpub-btn-upload\">\n            \ud83d\udce4 Envoyer mon eQSL\n          <\/button>\n        <\/div>\n      <\/div>\n\n      <div id=\"eqpub-already-received\" style=\"display:none;margin-top:16px\">\n        <div style=\"background:rgba(35,134,54,.15);border:1px solid rgba(35,134,54,.4);border-radius:var(--eq-radius);padding:14px 18px;font-size:.88rem;color:#3fb950\">\n          \u2705 Vous avez d\u00e9j\u00e0 envoy\u00e9 une eQSL en r\u00e9ponse \u00e0 cet \u00e9change.\n        <\/div>\n      <\/div>\n    <\/div>\n    <div class=\"eqpub-modal-foot\">\n      <button class=\"eqpub-btn eqpub-btn-blue\" id=\"eqpub-btn-download\">\u2b07 T\u00e9l\u00e9charger l'eQSL<\/button>\n      <button class=\"eqpub-btn eqpub-btn-ghost\" id=\"eqpub-modal-close2\">Fermer<\/button>\n    <\/div>\n  <\/div>\n<\/div>\n\n<script>\n(function($) {\n  'use strict';\n\n  const AJAX     = (typeof eqslVars !== 'undefined') ? eqslVars.ajaxUrl : '\/wp-admin\/admin-ajax.php';\n  const SITE_KEY = (typeof eqslVars !== 'undefined') ? eqslVars.siteKey : '';\n\n  let currentCallsign = '';\n  let currentCard     = null;\n\n  \/* \u2500\u2500 Utilitaires \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n  function toast(msg, type) {\n    type = type || 'success';\n    const el = $('<div class=\"eqpub-toast eqpub-toast-' + type + '\">' + msg + '<\/div>').appendTo('body');\n    setTimeout(function() { el.animate({opacity:0}, 300, function() { el.remove(); }); }, 3800);\n  }\n\n  function formatDate(d) {\n    if (!d) return '';\n    const p = d.split('-');\n    return p.length === 3 ? p[2] + '\/' + p[1] + '\/' + p[0] : d;\n  }\n\n  \/* \u2500\u2500 reCAPTCHA v3 (invisible) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n  function loadRecaptchaV3() {\n    if (!SITE_KEY) return;\n    if (document.getElementById('eq-rc3-script')) return;\n    const s  = document.createElement('script');\n    s.id     = 'eq-rc3-script';\n    s.src    = 'https:\/\/www.google.com\/recaptcha\/api.js?render=' + encodeURIComponent(SITE_KEY);\n    s.async  = true;\n    s.defer  = true;\n    document.head.appendChild(s);\n    $('#eqpub-captcha-notice').show();\n  }\n\n  function getRecaptchaToken(action) {\n    return new Promise(function(resolve) {\n      if (!SITE_KEY) { resolve(''); return; }\n      var attempts = 0;\n      var wait = setInterval(function() {\n        attempts++;\n        if (typeof grecaptcha !== 'undefined' && typeof grecaptcha.execute === 'function') {\n          clearInterval(wait);\n          grecaptcha.ready(function() {\n            grecaptcha.execute(SITE_KEY, { action: action })\n              .then(resolve)\n              .catch(function() { resolve(''); });\n          });\n        } else if (attempts > 50) { \/\/ 10 secondes max\n          clearInterval(wait);\n          resolve('');\n        }\n      }, 200);\n    });\n  }\n\n  \/* \u2500\u2500 Callsign dans l'URL \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n  function getUrlCallsign() {\n    const p = new URLSearchParams(window.location.search);\n    return (p.get('callsign') || '').toUpperCase().trim();\n  }\n\n  \/* \u2500\u2500 Recherche \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n  function doSearch(callsign) {\n    if (!callsign) return;\n    currentCallsign = callsign.toUpperCase().trim();\n    $('#eqpub-callsign-input').val(currentCallsign);\n    $('#eqpub-cs-chip').text(currentCallsign);\n    $('#eqpub-results').show();\n    $('.eqpub-search-block').css('margin-bottom', '20px');\n    $('#eqpub-list-wrap').html('<div class=\"eqpub-loading\"><div class=\"eqpub-spinner\"><\/div> Recherche en cours...<\/div>');\n\n    $.post(AJAX, { action: 'eqsl_public_list', callsign: currentCallsign }, function(r) {\n      if (!r.success) {\n        $('#eqpub-list-wrap').html('<div class=\"eqpub-empty\">\u26a0\ufe0f Erreur lors de la recherche.<\/div>');\n        return;\n      }\n      const cards = r.data.cards;\n      if (!cards || !cards.length) {\n        $('#eqpub-list-wrap').html('<div class=\"eqpub-empty\">\ud83d\udced Il n\\'y a aucune eQSL pour <strong>' + currentCallsign + '<\/strong>.<\/div>');\n        return;\n      }\n      let rows = '';\n      cards.forEach(function(c) {\n        const badge = c.status === 'completed'\n          ? '<span class=\"eqbadge eqbadge-completed\">\u2713 Compl\u00e9t\u00e9<\/span>'\n          : '<span class=\"eqbadge eqbadge-pending\">\u23f3 En attente<\/span>';\n        rows += '<tr data-id=\"' + c.id + '\" data-received=\"' + (c.received_id ? '1' : '0') + '\">'\n          + '<td><strong>' + (c.sender_display || 'DE') + '<\/strong><\/td>'\n          + '<td>' + formatDate(c.qso_date) + ' ' + c.qso_time + ' ' + c.timezone + '<\/td>'\n          + '<td>' + c.frequency + ' MHz<\/td>'\n          + '<td>' + c.mode + '<\/td>'\n          + '<td>' + c.report + '<\/td>'\n          + '<td>' + badge + '<\/td>'\n          + '<\/tr>';\n      });\n      $('#eqpub-list-wrap').html(\n        '<div class=\"eqpub-table-wrap\"><table class=\"eqpub-table\"><thead><tr>'\n        + '<th>Exp\u00e9diteur<\/th><th>Date \/ Heure<\/th><th>Fr\u00e9quence<\/th><th>Mode<\/th><th>RST<\/th><th>Statut<\/th>'\n        + '<\/tr><\/thead><tbody>' + rows + '<\/tbody><\/table><\/div>'\n        + '<p style=\"font-size:.78rem;color:var(--eq-muted);margin-top:10px;text-align:right\">'\n        + cards.length + ' eQSL trouv\u00e9e' + (cards.length > 1 ? 's' : '') + '<\/p>'\n      );\n      window._eqpubCards = cards;\n    });\n  }\n\n  \/* \u2500\u2500 \u00c9v\u00e9nements recherche \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n  $('#eqpub-search-btn').on('click', function() { doSearch($('#eqpub-callsign-input').val()); });\n  $('#eqpub-callsign-input').on('keydown', function(e) {\n    if (e.key === 'Enter') doSearch($(this).val());\n    $(this).val($(this).val().toUpperCase());\n  });\n  $('#eqpub-btn-reset').on('click', function() {\n    $('#eqpub-results').hide();\n    currentCallsign = '';\n    $('#eqpub-callsign-input').val('').focus();\n    window._eqpubCards = [];\n  });\n\n  \/* \u2500\u2500 Clic ligne \u2192 modal \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n  $(document).on('click', '.eqpub-table tbody tr', function() {\n    const cardId   = parseInt($(this).data('id'));\n    const received = $(this).data('received') === '1' || $(this).data('received') === 1;\n    const card     = (window._eqpubCards || []).find(function(c) { return c.id == cardId; });\n    if (!card) return;\n    currentCard = card;\n    openDetailModal(card, received);\n  });\n\n  function openDetailModal(card, hasReceived) {\n    $('#eqpub-det-title').text('\ud83d\udce1 eQSL de ' + (card.sender_display || '') + ' \u2192 ' + currentCallsign);\n\n    const previewUrl = AJAX + '?action=eqsl_preview&card_id=' + card.id + '&callsign=' + encodeURIComponent(currentCallsign);\n    $('#eqpub-det-preview').html('<img decoding=\"async\" src=\"' + previewUrl + '\" alt=\"Aper\u00e7u eQSL\" style=\"width:100%\">');\n\n    $('#eqpub-det-info').html(\n        '<div><dt>Exp\u00e9diteur<\/dt><dd>' + (card.sender_display || 'DE') + '<\/dd><\/div>'\n      + '<div><dt>Destinataire<\/dt><dd>' + currentCallsign + '<\/dd><\/div>'\n      + '<div><dt>Date<\/dt><dd>' + formatDate(card.qso_date) + '<\/dd><\/div>'\n      + '<div><dt>Heure<\/dt><dd>' + card.qso_time + ' ' + card.timezone + '<\/dd><\/div>'\n      + '<div><dt>Fr\u00e9quence<\/dt><dd>' + card.frequency + ' MHz<\/dd><\/div>'\n      + '<div><dt>Mode<\/dt><dd>' + card.mode + '<\/dd><\/div>'\n      + '<div><dt>Report<\/dt><dd>' + card.report + '<\/dd><\/div>'\n      + '<div><dt>Statut<\/dt><dd>' + (card.status === 'completed'\n          ? '<span class=\"eqbadge eqbadge-completed\">\u2713 Compl\u00e9t\u00e9<\/span>'\n          : '<span class=\"eqbadge eqbadge-pending\">\u23f3 En attente<\/span>') + '<\/dd><\/div>'\n    );\n\n    if (hasReceived) {\n      $('#eqpub-upload-section').hide();\n      $('#eqpub-already-received').show();\n    } else {\n      $('#eqpub-upload-section').show();\n      $('#eqpub-already-received').hide();\n      document.getElementById('eqpub-recv-file').value = '';\n      $('#eqpub-recv-name').text('').hide();\n    }\n\n    $('#eqpub-btn-download').off('click').on('click', function() {\n      window.location.href = AJAX + '?action=eqsl_download&card_id=' + card.id + '&callsign=' + encodeURIComponent(currentCallsign);\n    });\n\n    $('#eqpub-overlay-detail').removeClass('hidden');\n    $('body').css('overflow', 'hidden');\n  }\n\n  \/* \u2500\u2500 Fermer modal \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n  function closeModal() {\n    $('#eqpub-overlay-detail').addClass('hidden');\n    $('body').css('overflow', '');\n  }\n  $('#eqpub-modal-close, #eqpub-modal-close2').on('click', closeModal);\n  $('#eqpub-overlay-detail').on('click', function(e) {\n    if ($(e.target).hasClass('eqpub-overlay')) closeModal();\n  });\n\n  \/* \u2500\u2500 Drag & drop (bug r\u00e9cursion corrig\u00e9) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n  $('#eqpub-drop-zone').on('click', function(e) {\n    if ($(e.target).is('input[type=\"file\"]')) return;\n    e.stopPropagation();\n    document.getElementById('eqpub-recv-file').click();\n  });\n  $('#eqpub-drop-zone').on('dragover', function(e) {\n    e.preventDefault(); $(this).css('border-color', 'var(--eq-accent2)');\n  });\n  $('#eqpub-drop-zone').on('dragleave', function() {\n    $(this).css('border-color', 'var(--eq-border)');\n  });\n  $('#eqpub-drop-zone').on('drop', function(e) {\n    e.preventDefault(); $(this).css('border-color', 'var(--eq-border)');\n    const file = e.originalEvent.dataTransfer.files[0];\n    if (file) {\n      const dt = new DataTransfer();\n      dt.items.add(file);\n      document.getElementById('eqpub-recv-file').files = dt.files;\n      $('#eqpub-recv-name').text('\ud83d\udcce ' + file.name).show();\n    }\n  });\n  $('#eqpub-recv-file').on('change', function() {\n    if (this.files[0]) $('#eqpub-recv-name').text('\ud83d\udcce ' + this.files[0].name).show();\n  });\n\n  \/* \u2500\u2500 Upload visiteur : XHR natif + reCAPTCHA v3 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n  $('#eqpub-btn-upload').on('click', function() {\n    if (!currentCard) return;\n    const fileInput = document.getElementById('eqpub-recv-file');\n    const file      = fileInput.files[0];\n    if (!file) { toast('S\u00e9lectionnez d\\'abord un fichier image', 'error'); return; }\n\n    const btn = $(this).text('\u23f3 V\u00e9rification...').prop('disabled', true);\n\n    \/\/ Obtenir le token reCAPTCHA v3 de mani\u00e8re asynchrone avant l'envoi\n    getRecaptchaToken('eqsl_upload').then(function(captchaToken) {\n      btn.text('\u23f3 Envoi...');\n\n      const fd = new FormData();\n      fd.append('action',               'eqsl_visitor_upload');\n      fd.append('card_id',              currentCard.id);\n      fd.append('callsign',             currentCallsign);\n      fd.append('g-recaptcha-response', captchaToken);\n      fd.append('eqsl_file',            file, file.name);\n\n      const xhr = new XMLHttpRequest();\n      xhr.open('POST', AJAX, true);\n      xhr.withCredentials = true;\n\n      xhr.onload = function() {\n        btn.text('\ud83d\udce4 Envoyer mon eQSL').prop('disabled', false);\n        try {\n          const r = JSON.parse(xhr.responseText);\n          if (r.success) {\n            toast('\u2705 eQSL envoy\u00e9e ! L\\'op\u00e9rateur a \u00e9t\u00e9 notifi\u00e9.');\n            currentCard.status      = 'completed';\n            currentCard.received_id = 1;\n            $('#eqpub-upload-section').hide();\n            $('#eqpub-already-received').show();\n            const row = $('.eqpub-table tbody tr[data-id=\"' + currentCard.id + '\"]');\n            row.find('.eqbadge').replaceWith('<span class=\"eqbadge eqbadge-completed\">\u2713 Compl\u00e9t\u00e9<\/span>');\n            row.data('received', '1');\n          } else {\n            toast(r.data || 'Erreur lors de l\\'upload', 'error');\n          }\n        } catch(err) {\n          toast('R\u00e9ponse inattendue : ' + xhr.responseText.substring(0, 200), 'error');\n        }\n      };\n\n      xhr.onerror = function() {\n        btn.text('\ud83d\udce4 Envoyer mon eQSL').prop('disabled', false);\n        toast('Erreur r\u00e9seau', 'error');\n      };\n\n      xhr.send(fd);\n    });\n  });\n\n  \/* \u2500\u2500 Init \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n  $(document).ready(function() {\n    loadRecaptchaV3();\n    const cs = getUrlCallsign();\n    if (cs) doSearch(cs);\n  });\n\n})(jQuery);\n<\/script>\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>\ud83d\udcfb R\u00e9cup\u00e9rer vos eQSL Entrez votre indicatif pour retrouver les eQSL qui vous sont destin\u00e9es. Rechercher eQSL disponibles pour \u2190 Nouvelle recherche Recherche&#8230; eQSL \u00d7 \ud83d\udce4 Envoyer votre eQSL en r\u00e9ponse Uploadez votre eQSL (JPEG \/ PNG \/ GIF, max 5 Mo). L&#8217;op\u00e9rateur sera notifi\u00e9 par email. Glissez votre image ou cliquez Ce formulaire est prot\u00e9g\u00e9 par reCAPTCHA \u2014 Confidentialit\u00e9 &amp; Conditions Google. \ud83d\udce4 Envoyer mon eQSL \u2705 Vous avez d\u00e9j\u00e0 envoy\u00e9 une eQSL en r\u00e9ponse \u00e0 cet \u00e9change. \u2b07 T\u00e9l\u00e9charger l&#8217;eQSL Fermer<\/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-479","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/ingilog.com\/sugardelta_dev\/wp-json\/wp\/v2\/pages\/479","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ingilog.com\/sugardelta_dev\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/ingilog.com\/sugardelta_dev\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/ingilog.com\/sugardelta_dev\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ingilog.com\/sugardelta_dev\/wp-json\/wp\/v2\/comments?post=479"}],"version-history":[{"count":19,"href":"https:\/\/ingilog.com\/sugardelta_dev\/wp-json\/wp\/v2\/pages\/479\/revisions"}],"predecessor-version":[{"id":543,"href":"https:\/\/ingilog.com\/sugardelta_dev\/wp-json\/wp\/v2\/pages\/479\/revisions\/543"}],"wp:attachment":[{"href":"https:\/\/ingilog.com\/sugardelta_dev\/wp-json\/wp\/v2\/media?parent=479"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}