{"id":10223,"date":"2026-07-20T11:06:26","date_gmt":"2026-07-20T11:06:26","guid":{"rendered":"https:\/\/myorama.com\/?page_id=10223"},"modified":"2026-10-05T12:22:07","modified_gmt":"2026-10-05T12:22:07","slug":"checkout","status":"publish","type":"page","link":"https:\/\/myorama.com\/hu\/checkout\/","title":{"rendered":"Checkout"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"10223\" class=\"elementor elementor-10223 elementor-9415\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-410ee8f e-con-full e-flex qodef-custom-cursor--deactivate e-con e-parent\" data-id=\"410ee8f\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-2f95596 elementor-widget elementor-widget-heading\" data-id=\"2f95596\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Kosaram<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-9f68568 e-con-full e-flex qodef-custom-cursor--deactivate e-con e-parent\" data-id=\"9f68568\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-f5d6737 e-flex e-con-boxed qodef-custom-cursor--deactivate e-con e-child\" data-id=\"f5d6737\" 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-9404045 elementor-widget elementor-widget-html\" data-id=\"9404045\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!-- MO-2529 + MO-2605 \u00b7 \/checkout\/ first HTML widget (basket column). Its script lives in the summary widget. -->\n<div id=\"mo-cart-strip\" class=\"mo-cart-strip\" hidden><\/div>\n<div class=\"basket-card\">\n  <div id=\"mo-cart-rows\" class=\"basket-list\"><\/div>\n<\/div>\n<div id=\"mo-cart-feedback-notice\" class=\"basket-feedback-notice\" style=\"display: none;\">\n  <span class=\"basket-feedback-notice-icon\">i<\/span>\n  <p>A visszajelz\u0151 besz\u00e9lget\u00e9s a p\u00e1lyaorient\u00e1ci\u00f3s csomag kieg\u00e9sz\u00edt\u0151je. A besz\u00e9lget\u00e9s id\u0151pontj\u00e1t azut\u00e1n egyeztetj\u00fck, hogy elv\u00e9gezted a felm\u00e9r\u00e9st \u00e9s megkaptad a szem\u00e9lyre szabott riportodat.<\/p>\n<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-982544e e-flex e-con-boxed qodef-custom-cursor--deactivate e-con e-child\" data-id=\"982544e\" 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-b851eb3 elementor-widget elementor-widget-html\" data-id=\"b851eb3\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!-- MO-2529 + MO-2605 \u00b7 \/checkout\/ second HTML widget (summary column): summary, \"Have a code?\", the page's style and script.\n     Runs next to the site-wide \"B2C Cart Code\" snippet and reuses its globals (getCart, saveCart, clearCart,\n     getProductName, formatPrice, updateCartBadge, showToast, T, LANG, ICON_*). Its ids and js- classes differ\n     from the old ones, so the old cart functions leave this page alone. -->\n<style>\n  .mo-cart-strip { margin-bottom: 16px; padding: 12px 16px; border: 1px solid #9be9f0; border-radius: 8px; background: #e6fbfd; color: #06626b; font-weight: 600; }\n  .mo-cart-strip.is-warn { border-color: #f0d9a4; background: #fff6e0; color: #7a5200; }\n  \/* Fixed right side (quantity \u00b7 price column \u00b7 bin), so rows line up whatever the tag length. *\/\n  #mo-cart-rows .basket-item-price { flex: 0 0 112px; display: flex; flex-direction: column; align-items: flex-end; gap: 6px; }\n  .mo-tag { display: inline-block; padding: 5px 8px; border: 1px solid #9be9f0; border-radius: 4px; background: #e6fbfd; color: #06626b; font: 500 11px\/1 ui-monospace, SFMono-Regular, Menlo, monospace; white-space: nowrap; text-align: center; }\n  .mo-tag.is-stacked { display: inline-flex; flex-direction: column; align-items: center; gap: 3px; line-height: 1.15; }\n  .mo-price-list { margin-right: 6px; text-decoration: line-through; opacity: .55; font-weight: 400; }\n  .mo-code { margin: 16px 0 8px; }\n  .mo-code-toggle { padding: 0; border: 0; background: none; color: inherit; font-size: 14px; text-decoration: underline; cursor: pointer; }\n  .mo-code-form { display: flex; gap: 8px; margin-top: 8px; align-items: stretch; }\n  .mo-code-form[hidden] { display: none; }\n  .mo-code-form input { flex: 1; min-width: 0; margin: 0; padding: 8px 10px; border: 1px solid #d0d5dd; border-radius: 8px; text-transform: uppercase; }\n  .mo-code-form input::placeholder { text-transform: none; }\n  .mo-code-form button { display: inline-flex; align-items: center; justify-content: center; height: auto; min-height: 0; margin: 0; padding: 0 16px; line-height: 1; border: 0; border-radius: 8px; background: #111; color: #fff; cursor: pointer; }\n  .mo-cart-notice { margin: 0 0 12px; font-size: 13px; color: #a15c00; }\n<\/style>\n\n<div class=\"summary-card\">\n  <h3 class=\"summary-title\">Rendel\u00e9s \u00f6sszegz\u00e9se<\/h3>\n  <div id=\"mo-cart-summary\"><\/div>\n  <div class=\"mo-code\">\n    <button type=\"button\" class=\"mo-code-toggle js-mo-code-toggle\"><\/button>\n    <form class=\"mo-code-form js-mo-code-form\" hidden>\n      <input type=\"text\" name=\"code\" maxlength=\"50\" autocomplete=\"off\">\n      <button type=\"submit\"><\/button>\n    <\/form>\n  <\/div>\n  <p id=\"mo-cart-notice\" class=\"mo-cart-notice\" hidden><\/p>\n  <div class=\"summary-row total\">\n    <span>\u00d6sszesen<\/span>\n    <span id=\"mo-cart-total\">\u20ac0<\/span>\n  <\/div>\n  <button type=\"button\" class=\"checkout-btn js-mo-checkout\">TOV\u00c1BB A P\u00c9NZT\u00c1RHOZ<\/button>\n  <a href=\"\/packages\/\" class=\"continue-browsing-link\">V\u00e1s\u00e1rl\u00e1s folytat\u00e1sa<\/a>\n  <div class=\"secure-checkout\">\n    <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><rect x=\"5\" y=\"11\" width=\"14\" height=\"10\" rx=\"2\"><\/rect><path d=\"M8 11V7a4 4 0 0 1 8 0v4\"><\/path><\/svg>\n    Biztons\u00e1gos fizet\u00e9s\n  <\/div>\n<\/div>\n\n<script>\n(function () {\n  const PLATFORM_URL = 'https:\/\/the-app.io';\n  const CHECK_TIMEOUT_MS = 8000;\n  \/\/ The \"not valid\" cases that get the amber notice; any other reason is treated as no code.\n  const INACTIVE_REASONS = ['expired', 'paused', 'closed', 'exhausted'];\n\n  const MO_STRINGS = {\n    en: {\n      haveCode: 'Have a code?',\n      apply: 'Apply',\n      codePlaceholder: 'Enter code',\n      referral: 'Referral',\n      referralApplied: 'Referral applied',\n      codeApplied: (code) => `Code ${code} applied`,\n      off: (amount) => `${amount} off`,\n      offBoth: 'offers on both packages',\n      offOne: { full: (amount) => `${amount} off the Full Vocational Guidance package`, feedback: (amount) => `${amount} off the Feedback package` },\n      pricesUnavailable: \"We couldn't load the prices. Please try again in a moment.\",\n      codeCheckFailed: \"We couldn't check the code. Please try again.\",\n      codeInvalid: 'This code is not valid. Full prices apply.',\n      codeInactive: 'This code is no longer active. Prices shown are the regular prices.',\n      linkInactive: 'This link is no longer active. Prices shown are the regular prices.',\n      pricesChanged: 'Your code is no longer valid, so the prices have been updated. Please review them and try again.',\n    },\n    el: {\n      haveCode: '\u0388\u03c7\u03b5\u03b9\u03c2 \u03ba\u03c9\u03b4\u03b9\u03ba\u03cc;',\n      apply: '\u0395\u03c6\u03b1\u03c1\u03bc\u03bf\u03b3\u03ae',\n      codePlaceholder: '\u03a0\u03bb\u03b7\u03ba\u03c4\u03c1\u03bf\u03bb\u03cc\u03b3\u03b7\u03c3\u03b5 \u03c4\u03bf\u03bd \u03ba\u03c9\u03b4\u03b9\u03ba\u03cc',\n      referral: '\u03a3\u03cd\u03c3\u03c4\u03b1\u03c3\u03b7',\n      referralApplied: '\u0397 \u03c3\u03cd\u03c3\u03c4\u03b1\u03c3\u03b7 \u03b5\u03c6\u03b1\u03c1\u03bc\u03cc\u03c3\u03c4\u03b7\u03ba\u03b5',\n      codeApplied: (code) => `\u039f \u03ba\u03c9\u03b4\u03b9\u03ba\u03cc\u03c2 ${code} \u03b5\u03c6\u03b1\u03c1\u03bc\u03cc\u03c3\u03c4\u03b7\u03ba\u03b5`,\n      off: (amount) => `\u03ad\u03ba\u03c0\u03c4\u03c9\u03c3\u03b7 ${amount}`,\n      offBoth: '\u03c0\u03c1\u03bf\u03c3\u03c6\u03bf\u03c1\u03ad\u03c2 \u03ba\u03b1\u03b9 \u03c3\u03c4\u03b1 \u03b4\u03cd\u03bf \u03c0\u03b1\u03ba\u03ad\u03c4\u03b1',\n      offOne: { full: (amount) => `\u03ad\u03ba\u03c0\u03c4\u03c9\u03c3\u03b7 ${amount} \u03c3\u03c4\u03bf \u03c0\u03b1\u03ba\u03ad\u03c4\u03bf \u0395\u03c0\u03b1\u03b3\u03b3\u03b5\u03bb\u03bc\u03b1\u03c4\u03b9\u03ba\u03cc\u03c2 \u03a0\u03c1\u03bf\u03c3\u03b1\u03bd\u03b1\u03c4\u03bf\u03bb\u03b9\u03c3\u03bc\u03cc\u03c2`, feedback: (amount) => `\u03ad\u03ba\u03c0\u03c4\u03c9\u03c3\u03b7 ${amount} \u03c3\u03c4\u03bf \u03c0\u03b1\u03ba\u03ad\u03c4\u03bf \u03bc\u03b5 \u03a3\u03c5\u03bd\u03b5\u03b4\u03c1\u03af\u03b1 \u0391\u03bd\u03b1\u03c4\u03c1\u03bf\u03c6\u03bf\u03b4\u03cc\u03c4\u03b7\u03c3\u03b7\u03c2` },\n      pricesUnavailable: '\u0394\u03b5\u03bd \u03bc\u03c0\u03bf\u03c1\u03ad\u03c3\u03b1\u03bc\u03b5 \u03bd\u03b1 \u03c6\u03bf\u03c1\u03c4\u03ce\u03c3\u03bf\u03c5\u03bc\u03b5 \u03c4\u03b9\u03c2 \u03c4\u03b9\u03bc\u03ad\u03c2. \u0394\u03bf\u03ba\u03af\u03bc\u03b1\u03c3\u03b5 \u03be\u03b1\u03bd\u03ac \u03c3\u03b5 \u03bb\u03af\u03b3\u03bf.',\n      codeCheckFailed: '\u0394\u03b5\u03bd \u03bc\u03c0\u03bf\u03c1\u03ad\u03c3\u03b1\u03bc\u03b5 \u03bd\u03b1 \u03b5\u03bb\u03ad\u03b3\u03be\u03bf\u03c5\u03bc\u03b5 \u03c4\u03bf\u03bd \u03ba\u03c9\u03b4\u03b9\u03ba\u03cc. \u0394\u03bf\u03ba\u03af\u03bc\u03b1\u03c3\u03b5 \u03be\u03b1\u03bd\u03ac.',\n      codeInvalid: '\u0391\u03c5\u03c4\u03cc\u03c2 \u03bf \u03ba\u03c9\u03b4\u03b9\u03ba\u03cc\u03c2 \u03b4\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03ad\u03b3\u03ba\u03c5\u03c1\u03bf\u03c2. \u0399\u03c3\u03c7\u03cd\u03bf\u03c5\u03bd \u03bf\u03b9 \u03ba\u03b1\u03bd\u03bf\u03bd\u03b9\u03ba\u03ad\u03c2 \u03c4\u03b9\u03bc\u03ad\u03c2.',\n      codeInactive: '\u0391\u03c5\u03c4\u03cc\u03c2 \u03bf \u03ba\u03c9\u03b4\u03b9\u03ba\u03cc\u03c2 \u03b4\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03c0\u03bb\u03ad\u03bf\u03bd \u03b5\u03bd\u03b5\u03c1\u03b3\u03cc\u03c2. \u039f\u03b9 \u03c4\u03b9\u03bc\u03ad\u03c2 \u03c0\u03bf\u03c5 \u03b2\u03bb\u03ad\u03c0\u03b5\u03b9\u03c2 \u03b5\u03af\u03bd\u03b1\u03b9 \u03bf\u03b9 \u03ba\u03b1\u03bd\u03bf\u03bd\u03b9\u03ba\u03ad\u03c2.',\n      linkInactive: '\u0391\u03c5\u03c4\u03cc\u03c2 \u03bf \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03bc\u03bf\u03c2 \u03b4\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03c0\u03bb\u03ad\u03bf\u03bd \u03b5\u03bd\u03b5\u03c1\u03b3\u03cc\u03c2. \u039f\u03b9 \u03c4\u03b9\u03bc\u03ad\u03c2 \u03c0\u03bf\u03c5 \u03b2\u03bb\u03ad\u03c0\u03b5\u03b9\u03c2 \u03b5\u03af\u03bd\u03b1\u03b9 \u03bf\u03b9 \u03ba\u03b1\u03bd\u03bf\u03bd\u03b9\u03ba\u03ad\u03c2.',\n      pricesChanged: '\u039f \u03ba\u03c9\u03b4\u03b9\u03ba\u03cc\u03c2 \u03c3\u03bf\u03c5 \u03b4\u03b5\u03bd \u03b9\u03c3\u03c7\u03cd\u03b5\u03b9 \u03c0\u03bb\u03ad\u03bf\u03bd \u03ba\u03b1\u03b9 \u03bf\u03b9 \u03c4\u03b9\u03bc\u03ad\u03c2 \u03b5\u03bd\u03b7\u03bc\u03b5\u03c1\u03ce\u03b8\u03b7\u03ba\u03b1\u03bd. \u0388\u03bb\u03b5\u03b3\u03be\u03ad \u03c4\u03b5\u03c2 \u03ba\u03b1\u03b9 \u03b4\u03bf\u03ba\u03af\u03bc\u03b1\u03c3\u03b5 \u03be\u03b1\u03bd\u03ac.',\n    },\n    hu: {\n      haveCode: 'Van k\u00f3dod?',\n      apply: 'Alkalmaz',\n      codePlaceholder: 'Add meg a k\u00f3dot',\n      referral: 'Aj\u00e1nl\u00e1s',\n      referralApplied: 'Aj\u00e1nl\u00e1s alkalmazva',\n      codeApplied: (code) => `${code} k\u00f3d alkalmazva`,\n      off: (amount) => `${amount} kedvezm\u00e9ny`,\n      offBoth: 'kedvezm\u00e9ny mindk\u00e9t csomagra',\n      offOne: { full: (amount) => `${amount} kedvezm\u00e9ny a Teljes k\u00f6r\u0171 p\u00e1lyaorient\u00e1ci\u00f3 csomagra`, feedback: (amount) => `${amount} kedvezm\u00e9ny a Visszajelz\u0151 konzult\u00e1ci\u00f3s csomagra` },\n      pricesUnavailable: 'Nem siker\u00fclt bet\u00f6lteni az \u00e1rakat. K\u00e9rj\u00fck, pr\u00f3b\u00e1ld \u00fajra egy kicsit k\u00e9s\u0151bb.',\n      codeCheckFailed: 'Nem siker\u00fclt ellen\u0151rizni a k\u00f3dot. K\u00e9rj\u00fck, pr\u00f3b\u00e1ld \u00fajra.',\n      codeInvalid: 'Ez a k\u00f3d nem \u00e9rv\u00e9nyes. A teljes \u00e1rak \u00e9rv\u00e9nyesek.',\n      codeInactive: 'Ez a k\u00f3d m\u00e1r nem akt\u00edv. A felt\u00fcntetett \u00e1rak a norm\u00e1l \u00e1rak.',\n      linkInactive: 'Ez a link m\u00e1r nem akt\u00edv. A felt\u00fcntetett \u00e1rak a norm\u00e1l \u00e1rak.',\n      pricesChanged: 'A k\u00f3dod m\u00e1r nem \u00e9rv\u00e9nyes, ez\u00e9rt az \u00e1rak friss\u00fcltek. K\u00e9rj\u00fck, ellen\u0151rizd \u0151ket, \u00e9s pr\u00f3b\u00e1ld \u00fajra.',\n    },\n  };\n\n  let S;\n  let code = null;   \/\/ the code this cart is priced with: ?ref=, then the mo_ref cookie, then a typed one\n  let quote = null;  \/\/ last check response; prices[i] belongs to cart item i\n  let notice = null; \/\/ one-line message under the code field\n  let checkSeq = 0;   \/\/ only the latest check may price the cart\n  let priced = false; \/\/ quote answers for the cart as it is now; until then no price is shown and checkout waits\n  let checking = false; \/\/ the latest check hasn't answered yet\n\n  const cartItems = () => getCart().map(({ business_line, quantity, has_feedback, language, feedback_language, learning_disabilities }) => ({\n    business_line, quantity, has_feedback, language, feedback_language, learning_disabilities,\n  }));\n\n  function initialCode() {\n    const ref = new URLSearchParams(location.search).get('ref');\n    const cookie = document.cookie.match(\/(?:^|; )mo_ref=([^;]*)\/);\n    const value = ref || (cookie && decodeURIComponent(cookie[1]));\n    return value ? value.toUpperCase() : null;\n  }\n\n  function storedUtm() {\n    try {\n      return JSON.parse(localStorage.getItem('myorama_utm'));\n    } catch {\n      return null;\n    }\n  }\n\n  function rememberCode(value) {\n    fetch('\/wp-admin\/admin-ajax.php', { method: 'POST', body: new URLSearchParams({ action: 'mo_ref', code: value }), credentials: 'same-origin' });\n  }\n\n  \/\/ Resolves to the platform's answer, null when it can't answer in time, or undefined when a newer check started.\n  async function check(value, typed) {\n    const seq = ++checkSeq;\n    \/\/ AbortController rather than AbortSignal.timeout, which Safari before 16 lacks.\n    const controller = new AbortController();\n    const timer = setTimeout(() => controller.abort(), CHECK_TIMEOUT_MS);\n    checking = true;\n    let result = null;\n    try {\n      const res = await fetch(`${PLATFORM_URL}\/api\/b2c\/attribution\/check`, {\n        method: 'POST',\n        headers: { 'Content-Type': 'application\/json', Accept: 'application\/json' },\n        body: JSON.stringify({ code: value, typed, items: cartItems() }),\n        signal: controller.signal,\n      });\n      if (res.ok) result = await res.json();\n    } catch {\n      \/\/ Timeout, network error or a body that isn't JSON: same as no answer.\n    } finally {\n      clearTimeout(timer);\n    }\n    if (seq !== checkSeq) return undefined;\n    checking = false;\n    return result;\n  }\n\n  const escapeHtml = (text) => text.replace(\/[&<>\"']\/g, (char) => `&#${char.charCodeAt(0)};`);\n  const amountText = (rule) => (rule.type === 'percent' ? `${rule.value}%` : `\u20ac${formatPrice(Number(rule.value))}`);\n\n  \/\/ A discounted row's tag under the price: code (or \"Referral\") and the discount; over 14 characters, code stacks over discount.\n  function tagHtml(item, index) {\n    if (!priced || quote.prices[index].final_amount >= quote.prices[index].list_amount) return '';\n    const rule = quote.discount_rule;\n    const prefix = escapeHtml(quote.promo_code || S.referral);\n    const discount = `\u2212${amountText(rule.mode === 'same' ? rule : rule[item.has_feedback ? 'feedback' : 'full'])}`;\n    return `${prefix} \u00b7 ${discount}`.length > 14\n      ? `<span class=\"mo-tag is-stacked\"><span>${prefix}<\/span><span>${discount}<\/span><\/span>`\n      : `<span class=\"mo-tag\">${prefix} \u00b7 ${discount}<\/span>`;\n  }\n\n  function priceHtml(item, index) {\n    if (!priced) return '\u2026';\n    const { list_amount: list, final_amount: final } = quote.prices[index];\n    const finalHtml = `\u20ac${formatPrice(final * item.quantity)}`;\n    return final < list ? `<span><span class=\"mo-price-list\">\u20ac${formatPrice(list * item.quantity)}<\/span>${finalHtml}<\/span>` : finalHtml;\n  }\n\n  \/\/ The platform sends the rule as data; the strip words it in the page's language.\n  function ruleText(rule) {\n    if (!rule) return null;\n    if (rule.mode === 'same') return S.off(amountText(rule));\n    const discounted = ['full', 'feedback'].filter((pkg) => rule[pkg]);\n    return discounted.length === 2 ? S.offBoth : S.offOne[discounted[0]](amountText(rule[discounted[0]]));\n  }\n\n  function render() {\n    const cart = getCart();\n\n    document.getElementById('mo-cart-rows').innerHTML = cart.map((item, index) => `\n      <div class=\"basket-item\">\n        <div class=\"basket-item-icon\">${item.has_feedback ? ICON_FEEDBACK : ICON_GUIDANCE}<\/div>\n        <div class=\"basket-item-body\">\n          <div class=\"basket-item-name\">${getProductName(item)}<\/div>\n          ${item.has_feedback ? `<div class=\"basket-item-description\">${T.feedbackDescription}<\/div>` : ''}\n          <div class=\"basket-item-badges\">\n            <span class=\"basket-badge\">${T.learningDisabilities} ${item.learning_disabilities ? T.yes : T.no}<\/span>\n            <span class=\"basket-badge\">${T.language} ${T.languageLabels[item.language] ?? '-'}<\/span>\n          <\/div>\n        <\/div>\n        <div class=\"basket-item-qty\">\n          <button type=\"button\" class=\"qty-btn js-mo-qty-decrease\" data-index=\"${index}\" aria-label=\"${T.decreaseQuantity}\">\u2212<\/button>\n          <span class=\"qty-value\">${item.quantity}<\/span>\n          <button type=\"button\" class=\"qty-btn js-mo-qty-increase\" data-index=\"${index}\" aria-label=\"${T.increaseQuantity}\">+<\/button>\n        <\/div>\n        <div class=\"basket-item-price\">${priceHtml(item, index)}${tagHtml(item, index)}<\/div>\n        <button type=\"button\" class=\"js-remove-item js-mo-remove-item\" data-index=\"${index}\" aria-label=\"${T.removeItem}\">\n          <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n            <polyline points=\"3 6 5 6 21 6\"><\/polyline>\n            <path d=\"M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6\"><\/path>\n            <path d=\"M10 11v6\"><\/path>\n            <path d=\"M14 11v6\"><\/path>\n            <path d=\"M9 6V4a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2v2\"><\/path>\n          <\/svg>\n        <\/button>\n      <\/div>\n    `).join('');\n\n    document.getElementById('mo-cart-summary').innerHTML = cart.map((item, index) => `\n      <div class=\"summary-row\">\n        <span>${getProductName(item)} x ${item.quantity}<\/span>\n        <span>${priceHtml(item, index)}<\/span>\n      <\/div>\n    `).join('');\n\n    const total = priced ? cart.reduce((sum, item, index) => sum + quote.prices[index].final_amount * item.quantity, 0) : null;\n    document.getElementById('mo-cart-total').textContent = priced ? `\u20ac${formatPrice(total)}` : '\u2026';\n\n    document.getElementById('mo-cart-feedback-notice').style.display = cart.some(item => item.has_feedback) ? '' : 'none';\n\n    \/\/ A link-only code is never shown to the buyer.\n    const applied = quote?.promo_code ? S.codeApplied(quote.promo_code) : S.referralApplied;\n    \/\/ The message under the code field, when there is one, already says what happened.\n    const lapsed = Boolean(code && quote && !quote.valid && INACTIVE_REASONS.includes(quote.reason) && !notice);\n    const strip = document.getElementById('mo-cart-strip');\n    strip.classList.toggle('is-warn', lapsed);\n    strip.textContent = quote?.valid ? [applied, ruleText(quote.discount_rule)].filter(Boolean).join(' \u00b7 ') : (lapsed ? (quote.promo_code ? S.codeInactive : S.linkInactive) : '');\n    strip.hidden = !strip.textContent;\n\n    const noticeEl = document.getElementById('mo-cart-notice');\n    noticeEl.textContent = notice || '';\n    noticeEl.hidden = !noticeEl.textContent;\n  }\n\n  \/\/ A failed check keeps the last quote (and its strip) but shows no price until one answers for this cart.\n  async function refresh() {\n    if (cartItems().length === 0) {\n      checkSeq++;\n      checking = false;\n      quote = null;\n      priced = true;\n      notice = null;\n      render();\n      return;\n    }\n\n    priced = false;\n    render();\n    const result = await check(code, false);\n    if (result === undefined) return;\n    if (result) {\n      quote = result;\n      priced = true;\n      notice = null;\n    } else {\n      notice = S.pricesUnavailable;\n    }\n    render();\n  }\n\n  function wireCart() {\n    document.getElementById('mo-cart-rows').addEventListener('click', (e) => {\n      const button = e.target.closest('.js-mo-qty-increase, .js-mo-qty-decrease, .js-mo-remove-item');\n      if (!button) return;\n\n      const cart = getCart();\n      const index = Number(button.dataset.index);\n      if (!cart[index]) return;\n\n      if (button.matches('.js-mo-remove-item')) {\n        cart.splice(index, 1);\n        showToast(T.itemRemoved);\n      } else if (button.matches('.js-mo-qty-increase')) {\n        cart[index].quantity += 1;\n      } else if (cart[index].quantity > 1) {\n        cart[index].quantity -= 1;\n      }\n\n      saveCart(cart);\n      updateCartBadge();\n      refresh();\n    });\n  }\n\n  function wireCodeField() {\n    const toggle = document.querySelector('.js-mo-code-toggle');\n    const form = document.querySelector('.js-mo-code-form');\n    const input = form.querySelector('input');\n\n    toggle.textContent = S.haveCode;\n    input.placeholder = S.codePlaceholder;\n    form.querySelector('button').textContent = S.apply;\n\n    toggle.addEventListener('click', () => {\n      form.hidden = !form.hidden;\n      if (!form.hidden) input.focus();\n    });\n\n    form.addEventListener('submit', async (e) => {\n      e.preventDefault();\n      const typed = input.value.trim().toUpperCase();\n      if (!typed || cartItems().length === 0) return;\n\n      const result = await check(typed, true);\n      if (result === undefined) return;\n      if (!result) {\n        notice = S.codeCheckFailed;\n        render();\n        return;\n      }\n\n      \/\/ A wrong code means full price, even when an earlier code applied.\n      code = result.valid ? result.code : null;\n      quote = result;\n      priced = true;\n      notice = result.valid ? null : S.codeInvalid;\n      if (result.valid) {\n        rememberCode(result.code);\n        input.value = '';\n        form.hidden = true;\n      }\n      render();\n    });\n  }\n\n  function wireCheckout() {\n    const button = document.querySelector('.js-mo-checkout');\n\n    button.addEventListener('click', async () => {\n      const items = cartItems();\n      if (items.length === 0) { alert(T.basketEmpty); return; }\n      \/\/ Never charge a price the page hasn't shown: check again instead, unless a check is on its way.\n      if (!priced) {\n        if (!checking) refresh();\n        return;\n      }\n\n      button.disabled = true;\n      try {\n        const res = await fetch(`${PLATFORM_URL}\/api\/b2c\/guest-checkout`, {\n          method: 'POST',\n          headers: { 'Content-Type': 'application\/json', Accept: 'application\/json' },\n          body: JSON.stringify({ items, attribution_code: quote.valid ? quote.code : null, utm: storedUtm() }),\n        });\n        const body = await res.json();\n\n        if (res.status === 422 && body.error === 'prices_changed') {\n          quote = body;\n          notice = S.pricesChanged;\n          render();\n        } else if (!res.ok) {\n          alert(T.checkoutError);\n        } else {\n          \/\/ Stays disabled while the browser leaves for Stripe.\n          clearCart();\n          window.location.href = body.url;\n          return;\n        }\n      } catch {\n        alert(T.checkoutError);\n      }\n      button.disabled = false;\n    });\n  }\n\n  document.addEventListener('DOMContentLoaded', () => {\n    if (!document.getElementById('mo-cart-rows')) return;\n\n    S = MO_STRINGS[LANG] || MO_STRINGS.en;\n    code = initialCode();\n    render();\n    wireCart();\n    wireCodeField();\n    wireCheckout();\n    refresh();\n  });\n})();\n<\/script>\n\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\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Kosaram i A visszajelz\u0151 besz\u00e9lget\u00e9s a p\u00e1lyaorient\u00e1ci\u00f3s csomag kieg\u00e9sz\u00edt\u0151je. A besz\u00e9lget\u00e9s id\u0151pontj\u00e1t azut\u00e1n egyeztetj\u00fck, hogy elv\u00e9gezted a felm\u00e9r\u00e9st \u00e9s megkaptad a szem\u00e9lyre szabott riportodat. Rendel\u00e9s \u00f6sszegz\u00e9se \u00d6sszesen \u20ac0 TOV\u00c1BB A P\u00c9NZT\u00c1RHOZ V\u00e1s\u00e1rl\u00e1s folytat\u00e1sa Biztons\u00e1gos fizet\u00e9s<\/p>\n","protected":false},"author":5,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"page-full-width.php","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-10223","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/myorama.com\/hu\/wp-json\/wp\/v2\/pages\/10223","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/myorama.com\/hu\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/myorama.com\/hu\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/myorama.com\/hu\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/myorama.com\/hu\/wp-json\/wp\/v2\/comments?post=10223"}],"version-history":[{"count":3,"href":"https:\/\/myorama.com\/hu\/wp-json\/wp\/v2\/pages\/10223\/revisions"}],"predecessor-version":[{"id":12216,"href":"https:\/\/myorama.com\/hu\/wp-json\/wp\/v2\/pages\/10223\/revisions\/12216"}],"wp:attachment":[{"href":"https:\/\/myorama.com\/hu\/wp-json\/wp\/v2\/media?parent=10223"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}