{"id":941,"date":"2025-11-04T23:17:53","date_gmt":"2025-11-04T22:17:53","guid":{"rendered":"https:\/\/24hr-fitness.eu\/?page_id=941"},"modified":"2025-11-05T00:28:48","modified_gmt":"2025-11-04T23:28:48","slug":"multisports","status":"publish","type":"page","link":"https:\/\/24hr-fitness.eu\/sk\/multisports\/","title":{"rendered":"<p>MultiSports<\/p>"},"content":{"rendered":"<div class=\"multisport-wrap\">\r\n    <div class=\"language-toggle\">\r\n      <button id=\"ms-langBtn\" type=\"button\">Slov&aacute;k<\/button>\r\n    <\/div>\r\n\r\n    <div class=\"container\">\r\n      <a href=\"\/sk\/\"><img decoding=\"async\" src=\"https:\/\/24hr-fitness.eu\/wp-content\/plugins\/multisport-gymsys\/assets\/images\/logo.png\" alt=\"My Logo\" class=\"logo\" style=\"width:80%;max-width:300px;\"><\/a>\r\n      <h1 id=\"ms-title\">Registration &amp; Entry Ticket Terminal<\/h1>\r\n\r\n      <div class=\"scanner-container\">\r\n        <input type=\"password\" id=\"ms-qrInput\" placeholder=\"Scan Your Multisport QR Code Here To Register and\/Or Get Your Entry Ticket.\" autofocus>\r\n        <div class=\"scan-text\"><\/div>\r\n        <div id=\"ms-visit-info\" class=\"visit-card\"><\/div>\r\n        <div id=\"ms-qr-container\" style=\"text-align:center;margin-top:20px;\"><\/div>\r\n\r\n        <div id=\"ms-timeout-warning\" style=\"display:none;\">\r\n          <div id=\"ms-timeout-text\">Will cancel in 3:00<\/div>\r\n          <div id=\"ms-timeout-bar\"><div id=\"ms-timeout-progress\"><\/div><\/div>\r\n        <\/div>\r\n\r\n        <div id=\"ms-loading-overlay\"><div class=\"spinner\"><\/div><\/div>\r\n      <\/div>\r\n    <\/div>\r\n  <style>\r\n    .multisport-wrap { justify-content:center; align-items:center; background:#1e1e1e; color:#fff; font-family:Arial,sans-serif; }\r\n    .multisport-wrap .scanner-container { text-align:center; width:80%; margin:auto; }\r\n    .multisport-wrap #ms-qrInput { width:80%; padding:15px; font-size:20px; border:2px solid #333; border-radius:8px; text-align:center; outline:none; background:#282828; color:#fff; transition:all .3s ease; }\r\n    .multisport-wrap #ms-qrInput:focus { border-color:#0caa41; box-shadow:0 0 10px #0caa41; }\r\n    .multisport-wrap .scan-text { margin-top:15px; margin-bottom:10px; font-size:20px; opacity:.8; }\r\n    .multisport-wrap .scanning { animation: ms-blink 1s infinite alternate; }\r\n    @keyframes ms-blink { from{opacity:1;} to{opacity:.5;} }\r\n    .multisport-wrap #ms-timeout-bar { width:80%; margin:10px auto; height:8px; background:#333; border-radius:4px; overflow:hidden; }\r\n    .multisport-wrap #ms-timeout-progress { width:100%; background:#0caa41; transition:width 1s linear; }\r\n    .multisport-wrap #ms-loading-overlay { display:none; position:fixed; inset:0; background:rgba(0,0,0,.5); z-index:9999; align-items:center; justify-content:center; }\r\n    .multisport-wrap #ms-loading-overlay .spinner { width:48px; height:48px; border:5px solid #fff; border-top-color:transparent; border-radius:50%; animation: ms-spin 1s linear infinite; }\r\n    @keyframes ms-spin { to { transform: rotate(360deg);} }\r\n  <\/style><link rel=\"stylesheet\" href=\"https:\/\/24hr-fitness.eu\/wp-content\/plugins\/multisport-gymsys\/assets\/css\/custom-style.css\"><script>\r\n  (function(){\r\n    const MS_CONFIG = {\r\n      uploadEndpoint: \"https:\/\/24hr-fitness.eu\/sk\/wp-json\/multisport\/v1\/upload2\",\r\n      registerUserEndpoint: \"https:\/\/24hr-fitness.eu\/sk\/wp-json\/multisport\/v1\/register-user2\",\r\n    };\r\n\r\n    let allowFocus = true;\r\n    const input       = document.getElementById(\"ms-qrInput\");\r\n    const scanText    = document.querySelector(\".multisport-wrap .scan-text\") || document.querySelector(\".scan-text\");\r\n    const visitInfo   = document.getElementById(\"ms-visit-info\");\r\n    const qrContainer = document.getElementById(\"ms-qr-container\");\r\n    const loading     = document.getElementById(\"ms-loading-overlay\");\r\n    const timeoutWrap = document.getElementById(\"ms-timeout-warning\");\r\n    const timeoutText = document.getElementById(\"ms-timeout-text\");\r\n    const timeoutProg = document.getElementById(\"ms-timeout-progress\");\r\n    const titleEl     = document.getElementById(\"ms-title\");\r\n    const langBtn     = document.getElementById(\"ms-langBtn\");\r\n\r\n    function keepFocused(){ if(!allowFocus) return; if(document.activeElement !== input){ input.focus(); } }\r\n    function showLoading(){ loading.style.display = 'flex'; }\r\n    function hideLoading(){ loading.style.display = 'none'; }\r\n\r\n    let countdownInterval = null, timeoutHandle = null;\r\n    const totalSeconds = 180;\r\n    let currentLang = 'en';\r\n    function startCountdownTimer(){\r\n      let secondsLeft = totalSeconds;\r\n      timeoutWrap.style.display = 'block';\r\n      clearInterval(countdownInterval); clearTimeout(timeoutHandle);\r\n      countdownInterval = setInterval(() => {\r\n        secondsLeft--;\r\n        const m = Math.floor(secondsLeft\/60);\r\n        const s = String(secondsLeft%60).padStart(2,'0');\r\n        timeoutText.textContent = (currentLang==='en') ? `Will cancel in ${m}:${s}` : `Zru?&iacute; sa o ${m}:${s}`;\r\n        timeoutProg.style.width = ((secondsLeft\/totalSeconds)*100)+'%';\r\n        if (secondsLeft<=0) clearInterval(countdownInterval);\r\n      }, 1000);\r\n      timeoutHandle = setTimeout(()=>{ qrContainer.style.display='none'; location.reload(); }, totalSeconds*1000);\r\n    }\r\n    function cancelCountdownTimer(){ clearInterval(countdownInterval); clearTimeout(timeoutHandle); timeoutWrap.style.display='none'; }\r\n    function isValidEmail(e){ return \/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$\/.test(e); }\r\n    function toggleLanguage(){\r\n      if (currentLang==='en') {\r\n        titleEl.textContent = 'Termin&aacute;l registr&aacute;cie a vstupeniek';\r\n        const sb=document.getElementById('submitTicketBtn'), cb=document.getElementById('cancelVisitBtn'), em=document.getElementById('email'), ph=document.getElementById('phone');\r\n        if (sb) sb.textContent='Odosla? l&iacute;stok';\r\n        if (cb) cb.textContent='Zru?i? n&aacute;v?tevu';\r\n        if (em) em.placeholder='Zadajte svoj email';\r\n        if (ph) ph.placeholder='Zadajte svoje telef&oacute;nne ?&iacute;slo';\r\n        input.placeholder = 'Naskenujte svoj Multisport QR k&oacute;d tu a zaregistrujte sa a\/alebo z&iacute;skajte vstupenku.';\r\n        langBtn.textContent='English'; currentLang='sk';\r\n      } else {\r\n        titleEl.textContent = 'Registration & Entry Ticket Terminal';\r\n        const sb=document.getElementById('submitTicketBtn'), cb=document.getElementById('cancelVisitBtn'), em=document.getElementById('email'), ph=document.getElementById('phone');\r\n        if (sb) sb.textContent='Submit Ticket';\r\n        if (cb) cb.textContent='Cancel Visit';\r\n        if (em) em.placeholder='Enter your email';\r\n        if (ph) ph.placeholder='Enter your phone number';\r\n        input.placeholder = 'Scan Your Multisport QR Code Here To Register and\/Or Get Your Entry Ticket.';\r\n        langBtn.textContent='Slov&aacute;k'; currentLang='en';\r\n      }\r\n    }\r\n    langBtn.addEventListener('click', toggleLanguage);\r\n\r\n    const errorMessages = {\r\n      PartnerFacilityServiceInvalid: {\r\n        en: 'Provided service UUID is wrong',\r\n        sk: 'Poskytnut&eacute; UUID slu?by je chybn&eacute;'\r\n      },\r\n      AccountIsBlocked: {\r\n        en: 'Partner account (partner UUID) is blocked',\r\n        sk: 'Partner nie je akt&iacute;vny'\r\n      },\r\n      FacilityIsNotActive: {\r\n        en: 'Facility inactive on provided date',\r\n        sk: '?portovisko nie je akt&iacute;vne.'\r\n      },\r\n      CheckIfCardBarCodeExists: {\r\n        en: 'Card does not exist on provided date',\r\n        sk: 'Karta neexistuje v syst&eacute;me MultiSport.'\r\n      },\r\n      CardBlockedForFraud: {\r\n        en: 'Due to technical problems, the card could not be loaded, please contact the MultiSport Benefit helpline.',\r\n        sk: 'Kv&ocirc;li technick&yacute;m probl&eacute;mom nebolo mo?n&eacute; na?&iacute;ta? kartu MultiSport, kontaktujte pros&iacute;m infolinku MultiSport.'\r\n      },\r\n      CheckClientStatus: {\r\n        en: 'Client (card holder\\'s employer) not active on provided date',\r\n        sk: 'Klient nie je akt&iacute;vny.'\r\n      },\r\n      ClientAccessToPartner: {\r\n        en: 'No access for specific client (card holder\\'s employer) to that facility',\r\n        sk: 'T&aacute;to karta nem&ocirc;?e by? pou?it&aacute; v tomto zariaden&iacute;.'\r\n      },\r\n      CheckCardStatus: { \r\n        en: 'Card inactive on provided date',\r\n        sk: 'Karta nie je akt&iacute;vna.'\r\n      },\r\n      CheckForVisitRegisterInSelectedDay: {\r\n        en: 'Limit of number of visits for speficic activity reached for provided date',\r\n        sk: 'Limit n&aacute;v?tev na tejto karte u? bol vy?erpan&yacute;.'\r\n      },\r\n      FacilityHourLimit: {\r\n        en: 'Visit attempt outside of allowed visit hours',\r\n        sk: 'Pokus o n&aacute;v?tevu mimo povolen&yacute;ch n&aacute;v?tevn&yacute;ch hod&iacute;n.'\r\n      },\r\n      FacilityVisitsLimit: {\r\n        en: 'Allowed number of visits within billing period for specific facility reached',\r\n        sk: 'Partner prekro?il povolen&yacute; limit n&aacute;v?tev za mesiac.'\r\n      },\r\n      CardTypeLimit: {\r\n        en: 'Card type (Employee, Accompany, Child, etc.) not allowed for specific activity or facility',\r\n        sk: 'Tento typ karty nem&ocirc;?e by? pou?it&yacute; na dan&uacute; aktivitu.'\r\n      },\r\n      ServiceIsNotActive: {\r\n        en: 'Service within provided facility is disabled for provided date',\r\n        sk: 'Slu?ba nie je akt&iacute;vna.'\r\n      },\r\n      ShortTimeLimit: {\r\n        en: 'Attempt to register the same visit within short amount of time. Do not try again, visit already registered (usually happens with network errors or hardware terminal malfunctions)',\r\n        sk: 'T&aacute;to n&aacute;v?teva u? bola zaregistrovan&aacute; v priebehu posledn&yacute;ch 10 sek&uacute;nd.'\r\n      },\r\n      UserPhotoNotVerified: {\r\n        en: 'User photo in mobile application is not verified. Verification can be done only via PartnerZone MultiSport.',\r\n        sk: 'Fotka u?&iacute;vate?a nebola zatia? overen&aacute;. Overenie fotografie je potrebn&eacute; realizova? v partnerskej z&oacute;ne MultiSport.'\r\n      },\r\n      VirtualAccessOnOtherDevice: {\r\n        en: 'User has active card on another mobile device',\r\n        sk: 'U?&iacute;vate? m&aacute; virtu&aacute;lnu kartu MultiSport aktivovan&uacute; na inom zariaden&iacute;.'\r\n      },\r\n      VirtualAccessDisabled: {\r\n        en: 'User moved virtual card back to physical plastic card. Please scan plastic card.',\r\n        sk: 'U?&iacute;vate? m&aacute; akt&iacute;vnu plastov&uacute; kartu MultiSport. Na?&iacute;tajte plastov&uacute; kartu MultiSport.'\r\n      },\r\n      RegistrationCodeExpired: {\r\n        en: 'Validity of QR code expired. Please try to scan current QR code from mobile application.',\r\n        sk: 'Platnos? QR k&oacute;du vypr?ala. Sk&uacute;ste na?&iacute;ta? aktu&aacute;lny QR k&oacute;d z aplik&aacute;cie MyMultiSport.'\r\n      },\r\n      PlasticCardAccessDisabled: {\r\n        en: 'User moved plastic card to virtual card in mobile device. Please scan virtual card.',\r\n        sk: 'U?&iacute;vate? m&aacute; akt&iacute;vnu virtu&aacute;lnu kartu MultiSport v mobilnom zariaden&iacute;. Na?&iacute;tajte QR k&oacute;d z aplik&aacute;cie MyMultiSport.'\r\n      },\r\n      ReadingCardDataFailed: {\r\n        en: 'Invalid QR code or Barcode',\r\n        sk: 'Neplatn&yacute; QR k&oacute;d alebo Barcode'\r\n      },\r\n      Exception: {\r\n        en: 'Unexpected exception',\r\n        sk: 'Neo?ak&aacute;van&aacute; chyba'\r\n      },\r\n      FacilityAcceptsOnlyVirtualCardVisits: {\r\n        en: 'This facility accepts only visits with virtual MultiSport card.',\r\n        sk: 'Toto zariadenie akceptuje iba vstupy s virtu&aacute;lnou kartou MultiSport.'\r\n      },\r\n      default: {\r\n        en: 'Error',\r\n        sk: 'Chyba'\r\n      }\r\n    };\r\n\r\n    function displayScanMessage(data) {\r\n      \/\/ Accept either a raw string (e.g. 'RegistrationCodeExpired') or an object with a `.message`.\r\n      \/\/ Normalize message (remove quotes, trim spaces, and take only code part)\r\n      const raw = (typeof data === 'string') ? data : (data?.message || '');\r\n      let key = (raw || '').trim();\r\n      key = key.split(':')[0].replace(\/['\"]+\/g, '').trim();\r\n\r\n      \/\/ 1) Exact match (fast path)\r\n      if (Object.prototype.hasOwnProperty.call(errorMessages, key)) {\r\n        return errorMessages[key];\r\n      }\r\n\r\n      \/\/ 2) Case-insensitive exact match\r\n      const lowerKey = key.toLowerCase();\r\n      const ciExact = Object.keys(errorMessages).find(k => k.toLowerCase() === lowerKey);\r\n      if (ciExact) return errorMessages[ciExact];\r\n\r\n      \/\/ 3) Partial match: find a known error key that is included in the message key\r\n      \/\/    This uses `includes` and is case-insensitive. Skip the 'default' key.\r\n      const partial = Object.keys(errorMessages).find(k => k !== 'default' && lowerKey.includes(k.toLowerCase()));\r\n      if (partial) return errorMessages[partial];\r\n\r\n      \/\/ 4) Fallback to default\r\n      return errorMessages.default;\r\n    }\r\n\r\n    let timer=null;\r\n    input.addEventListener(\"input\", function(e){\r\n      const qrCode=e.target.value;\r\n      if(!qrCode) return;\r\n      clearTimeout(timer);\r\n      timer=setTimeout(()=>{\r\n        showLoading();\r\n        fetch(MS_CONFIG.uploadEndpoint, {\r\n          method:'POST', headers:{'Content-Type':'application\/json'},\r\n          body: JSON.stringify({ qrData: qrCode, mode: 'live' })\r\n        })\r\n        .then(r=>r.json())\r\n        .then(data=>{\r\n          handleQRScanResponse(data);\r\n        })\r\n        .catch(()=>{ \r\n          hideLoading(); \r\n          scanText.textContent=\"Chyba! Sk&uacute;ste to znova.\\nError! Try again.\"; \r\n        });\r\n      }, 2000);\r\n    });\r\n\r\n    function handleQRScanResponse(data) {\r\n      if(data.status==200){\r\n        if(data.action === 'register_user') {\r\n          \/\/ New user needs to input information\r\n          handleNewUserRegistration(data);\r\n        } else if(data.action === 'entry_granted') {\r\n          \/\/ Registered user, entry granted\r\n          handleEntryGranted(data);\r\n        } else if(data.action === 'registration_complete') {\r\n          \/\/ Registration completed, reset to scan again\r\n          handleRegistrationComplete(data);\r\n        } else if(data.user && data.user.email) {\r\n          \/\/ Direct entry (existing member)\r\n          handleDirectEntry(data);\r\n        }\r\n      } else { \r\n        hideLoading(); \r\n        const err_message = displayScanMessage(data.message);\r\n        scanText.textContent = `${err_message.sk}\\n${err_message.en}`;\r\n      }\r\n    }\r\n\r\n    function handleNewUserRegistration(data) {\r\n      hideLoading(); \r\n      allowFocus=false; \r\n      startCountdownTimer(); \r\n      scanText.textContent='';\r\n      \r\n      const content = `\r\n        <p><strong>Registr&aacute;cia nov&eacute;ho pou?&iacute;vate?a | New User Registration\r\n        <p>Pros&iacute;m vypl?te va?e &uacute;daje | Please provide your information:\r\n        <label for=\"firstName\">Meno | First Name\r\n        <input type=\"text\" id=\"firstName\" placeholder=\"Zadajte meno | Enter first name\" required>\r\n        <label for=\"lastName\">Priezvisko | Last Name\r\n        <input type=\"text\" id=\"lastName\" placeholder=\"Zadajte priezvisko | Enter last name\" required>\r\n        <label for=\"email\">Email\r\n        <input type=\"email\" id=\"email\" placeholder=\"Zadajte email | Enter your email\" required>\r\n        <label for=\"phone\">Telef&oacute;n | Phone\r\n        <input type=\"tel\" id=\"phone\" placeholder=\"Zadajte telef&oacute;n | Enter phone number\">\r\n        <label for=\"company\">Spolo?nos? | Company\r\n        <input type=\"text\" id=\"company\" placeholder=\"Zadajte n&aacute;zov spolo?nosti | Enter company name\">\r\n        <button id=\"completeRegistrationBtn\">Dokon?i? registr&aacute;ciu | Complete Registration\r\n        <button id=\"cancelRegistrationBtn\">Zru?i? | Cancel`;\r\n        \r\n      visitInfo.innerHTML=content; \r\n      visitInfo.style.display='block';\r\n\r\n      \/\/ Auto-focus on first name field\r\n      setTimeout(() => {\r\n        const firstNameField = document.getElementById('firstName');\r\n        if (firstNameField) {\r\n          firstNameField.focus();\r\n        }\r\n      }, 100);\r\n\r\n      \/\/ Auto-fill if we have data from MS API\r\n      if(data.data) {\r\n        if(data.data.firstName) document.getElementById('firstName').value = data.data.firstName;\r\n        if(data.data.lastName) document.getElementById('lastName').value = data.data.lastName;\r\n        if(data.data.facilityName) document.getElementById('company').value = data.data.facilityName;\r\n      }\r\n\r\n      document.getElementById('completeRegistrationBtn').addEventListener('click', ()=>{\r\n        const firstName = document.getElementById('firstName').value.trim();\r\n        const lastName = document.getElementById('lastName').value.trim();\r\n        const email = document.getElementById('email').value.trim();\r\n        const phone = document.getElementById('phone').value.trim();\r\n        const company = document.getElementById('company').value.trim();\r\n        \r\n        if(!firstName || !lastName || !email) { \r\n          scanText.textContent=\"Pros&iacute;m vypl?te povinn&eacute; polia: Meno, Priezvisko, Email\\nPlease fill in required fields: First Name, Last Name, Email\"; \r\n          return; \r\n        }\r\n        \r\n        if(!isValidEmail(email)){ \r\n          scanText.textContent=\"Neplatn&yacute; e-mail. Zadajte svoj e-mail znova.\\nInvalid Email. Please input your email again.\"; \r\n          return; \r\n        }\r\n        \r\n        showLoading();\r\n        fetch(MS_CONFIG.registerUserEndpoint, {\r\n          method:'POST', \r\n          headers: {'Content-Type':'application\/json'},\r\n          body: JSON.stringify({\r\n            fixed_qr_code: data.fixed_qr_code,\r\n            firstname: firstName,\r\n            lastname: lastName,\r\n            email: email,\r\n            phonenumber: phone,\r\n            company_name: company,\r\n            barcode: data.data.barcode\r\n          })\r\n        })\r\n        .then(r=>r.json())\r\n        .then(regData=>{\r\n          handleQRScanResponse(regData);\r\n        })\r\n        .catch(()=>{ \r\n          hideLoading();\r\n          scanText.textContent=\"Chyba! Sk&uacute;ste to znova.\\nError! Try again.\"; \r\n        });\r\n      });\r\n\r\n      document.getElementById('cancelRegistrationBtn').addEventListener('click', ()=>{\r\n        resetToInitial();\r\n      });\r\n    }\r\n\r\n    function handleEntryGranted(data) {\r\n      hideLoading(); \r\n      scanText.textContent=''; \r\n      visitInfo.style.display='none';\r\n      allowFocus=true; \r\n      input.focus(); \r\n      input.value=\"\"; \r\n      cancelCountdownTimer();\r\n      \r\n      \/\/ Show success message with user info\r\n      scanText.textContent = data.message + '\\n\\nWelcome ' + \r\n        (data.registered_user.firstname + ' ' + data.registered_user.lastname).trim() + \r\n        (data.registered_user.company_name ? ' from ' + data.registered_user.company_name : '') + '!';\r\n      \r\n      if(data.user && data.user.lastid) {\r\n        const today=new Date().toISOString().split('T')[0];\r\n        const htmlContent = `\r\n          <!DOCTYPE html><html><head><title>No: ${data.user.lastid}\r\n          <style>@media print{body{width:6.5in!important}@page{size:6.5in 11in!important;margin:.5in}label:after{content:none!important}}\r\n          <body onload=\"window.print()\" onclick=\"window.print()\">\r\n          <div style=\"text-align:center;padding:0;margin:0;page-break-before:always\">\r\n            <div><img decoding=\"async\" src=\"${data.user.img_bg_path||''}\" style=\"margin:0;padding:0;height:130px\">\r\n            <p style=\"color:#0ba0bb;font-size:35px;margin:15px\">${data.user.subject||'Entry Ticket'}\r\n            <p style=\"color:#0ba0bb;font-size:25spx;margin:15px\">Card No: ${data.user.ticket_number||data.data.barcode}\r\n            <p style=\"color:#0ba0bb;font-size:30px;margin:10px\">No. ${data.user.lastid}\r\n            <div style=\"height:40px\">\r\n            <p style=\"font-size:40px;color:#0ba0bb;margin:0\">${data.user.date_time||new Date().toLocaleString()}\r\n            <p style=\"font-size:30px;color:#0ba0bb;margin:0\">${data.user.gender_group||''}\r\n            <img decoding=\"async\" src=\"https:\/\/api.qrserver.com\/v1\/create-qr-code\/?size=400x400&data=${data.user.ticket_number||data.data.barcode}\">\r\n            <p style=\"font-size:18px;margin:0\">${today}<br>\r\n          `;\r\n        const w=window.open('','_blank'); \r\n        if(w&&w.document){ \r\n          w.document.write(htmlContent); \r\n          w.document.close(); \r\n        }\r\n      }\r\n    }\r\n\r\n    function handleRegistrationComplete(data) {\r\n      hideLoading();\r\n      allowFocus=true; \r\n      input.focus(); \r\n      input.value=\"\"; \r\n      cancelCountdownTimer();\r\n      \r\n      scanText.textContent = data.message;\r\n      visitInfo.style.display='none';\r\n    }\r\n\r\n    function handleDirectEntry(data) {\r\n      hideLoading(); \r\n      scanText.textContent=''; \r\n      visitInfo.style.display='none';\r\n      allowFocus=true; \r\n      input.focus(); \r\n      input.value=\"\"; \r\n      cancelCountdownTimer();\r\n      \r\n      const today=new Date().toISOString().split('T')[0];\r\n      const htmlContent = `\r\n        <!DOCTYPE html><html><head><title>No: ${data.user.lastid}\r\n        <style>@media print{body{width:6.5in!important}@page{size:6.5in 11in!important;margin:.5in}label:after{content:none!important}}\r\n        <body onload=\"window.print()\" onclick=\"window.print()\">\r\n        <div style=\"text-align:center;padding:0;margin:0;page-break-before:always\">\r\n          <div><img decoding=\"async\" src=\"${data.user.img_bg_path}\" style=\"margin:0;padding:0;height:130px\">\r\n          <p style=\"color:#0ba0bb;font-size:35px;margin:15px\">${data.user.subject}\r\n          <p style=\"color:#0ba0bb;font-size:25spx;margin:15px\">Card No: ${data.user.ticket_number}\r\n          <p style=\"color:#0ba0bb;font-size:30px;margin:10px\">No. ${data.user.lastid}\r\n          <div style=\"height:40px\">\r\n          <p style=\"font-size:40px;color:#0ba0bb;margin:0\">${data.user.date_time}\r\n          <p style=\"font-size:30px;color:#0ba0bb;margin:0\">${data.user.gender_group}\r\n          <img decoding=\"async\" src=\"https:\/\/api.qrserver.com\/v1\/create-qr-code\/?size=400x400&data=${data.user.ticket_number}\">\r\n          <p style=\"font-size:18px;margin:0\">${today}<br>\r\n        `;\r\n      const w=window.open('','_blank'); \r\n      if(w&&w.document){ \r\n        w.document.write(htmlContent); \r\n        w.document.close(); \r\n      }\r\n    }\r\n\r\n    function resetToInitial() {\r\n      hideLoading();\r\n      scanText.textContent=''; \r\n      visitInfo.style.display='none'; \r\n      allowFocus=true; \r\n      input.focus(); \r\n      input.value=\"\";\r\n      cancelCountdownTimer(); \r\n      qrContainer.style.display='none';\r\n    }\r\n\r\n    input.addEventListener(\"blur\", keepFocused);\r\n    setInterval(keepFocused, 1000);\r\n  })();\r\n  <\/script><\/div>","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"_links":{"self":[{"href":"https:\/\/24hr-fitness.eu\/sk\/wp-json\/wp\/v2\/pages\/941"}],"collection":[{"href":"https:\/\/24hr-fitness.eu\/sk\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/24hr-fitness.eu\/sk\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/24hr-fitness.eu\/sk\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/24hr-fitness.eu\/sk\/wp-json\/wp\/v2\/comments?post=941"}],"version-history":[{"count":4,"href":"https:\/\/24hr-fitness.eu\/sk\/wp-json\/wp\/v2\/pages\/941\/revisions"}],"predecessor-version":[{"id":946,"href":"https:\/\/24hr-fitness.eu\/sk\/wp-json\/wp\/v2\/pages\/941\/revisions\/946"}],"wp:attachment":[{"href":"https:\/\/24hr-fitness.eu\/sk\/wp-json\/wp\/v2\/media?parent=941"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}