{"id":99978,"date":"2024-03-24T16:19:01","date_gmt":"2024-03-24T16:19:01","guid":{"rendered":"https:\/\/radiojingles24.com\/?post_type=product&#038;p=99978"},"modified":"2026-09-08T08:44:22","modified_gmt":"2026-09-08T08:44:22","slug":"sung-jingle-offer","status":"publish","type":"product","link":"https:\/\/radiojingles24.com\/de\/produkt\/sung-jingle-offer\/","title":{"rendered":"Special Offer &#8211; Sung Jingle"},"content":{"rendered":"\n\t\t<div id=\"fws_6aa2a38f71bbd\"  data-midnight=\"dark\"  data-bg-mobile-hidden=\"\" class=\"wpb_row vc_row-fluid vc_row top-level standard_section   \"  style=\"padding-top: 0px; padding-bottom: 0px; \"><div class=\"row-bg-wrap\" data-bg-animation=\"none\"><div class=\"inner-wrap \"><div class=\"row-bg    \"  style=\"\"><\/div><\/div><div class=\"row-bg-overlay\" ><\/div><\/div><div class=\"col span_12 dark left\">\n\t<div  class=\"vc_col-sm-12 wpb_column column_container vc_column_container col no-extra-padding\"  data-t-w-inherits=\"default\" data-border-radius=\"none\" data-shadow=\"none\" data-border-animation=\"\" data-border-animation-delay=\"\" data-border-width=\"none\" data-border-style=\"solid\" data-border-color=\"\" data-bg-cover=\"\" data-padding-pos=\"all\" data-has-bg-color=\"false\" data-bg-color=\"\" data-bg-opacity=\"1\" data-hover-bg=\"\" data-hover-bg-opacity=\"1\" data-animation=\"\" data-delay=\"0\"><div class=\"column-bg-overlay\"><\/div>\n\t\t<div class=\"vc_column-inner\">\n\t\t\t<div class=\"wpb_wrapper\">\n\t\t\t\t\n\t<div class=\"wpb_raw_code wpb_content_element wpb_raw_html\" >\n\t\t<div class=\"wpb_wrapper\">\n\t\t\t<!--\n  RADIO JINGLES 24 \u2014 SUNG OFFER WIZARD  v2.5 (plugin-driven monthly content)\n\n  v2.5: TWO FIXES, both left behind by v2.4, both of which made the sung products\n        unsellable. v2.4 removed the trust strip's first item and the singer\n        step, but left the code that used them:\n\n          1. el('rjs2-trust-d1').innerHTML = SINGER.credit  \u2014 that id went with\n             the removed trust item, so el() returned null and the assignment\n             threw a TypeError at page load. Everything after it died: the tag\n             pill, the currency swap, every event listener and updateTotal().\n             Symptom: hero showed \u00a359 (set earlier) but the footer read\n             \"TOTAL \u00a30\" and no button on the page did anything.\n\n          2. if(needSinger && ...) \u2014 `needSinger` was declared with the singer\n             step and removed with it. This use sits inside validate(), which\n             only runs on click, so the page loaded perfectly and Add to cart\n             threw \"ReferenceError: needSinger is not defined\" and silently did\n             nothing: no toast, no overlay, no visible failure.\n\n        Both are the same mistake: a declaration removed, its use left behind,\n        invisible until that exact line runs. Swept the whole block afterwards \u2014\n        every el('...') against every id in the markup, and every identifier\n        used against every one declared. These two were the only ones.\n\n  v2.4: THE PREMIUM PRODUCTS ARE GONE (Sept 2026). Mo sang both of them and left\n        the roster; rather than sell a premium tier with no voice behind it, the\n        two products were withdrawn. Removed here: the premium product ids and\n        slugs, the \"step up to premium\" prompt, the singer chooser and its demo\n        players (they only ever rendered for a 'choose:' singer, which was the\n        premium Mo\/Bea pick), and the trust-strip line crediting Mo by name.\n        Requires plugin v1.10.0+. Rosie is the whole roster.\n\n        NOTE: the trust strip lost its first item rather than having Mo's credit\n        reassigned to Rosie \u2014 that claim was about a named person and is not\n        ours to move. Put Rosie's own credits back in when you have them.\n\n  v2.3: a demo player under EACH singer on the premium products (superseded by\n        v2.4 \u2014 there are no premium products and no singer choice any more).\n\n  v2.2: TAMESIDE multi-bed mode. When the plugin flags a product with\n        mode:'tameside' (currently 99978 \/product\/sung-jingle-offer\/), the wizard\n        shows a 1-4 bed multi-select, each bed with its own script, price = beds x per_bed.\n\n  ONE wizard for BOTH remaining sung offer products \u2014 UK (\u00a3) and US ($).\n  Paste THIS SAME BLOCK on:\n    UK Basic:    \/product\/sung-jingle-offer\/        postid 99978   (\u00a359 \u2192 \u00a379 strike)\n    US Basic:    \/product\/sung-jingle-offer-us\/     postid 117061  ($79 \u2192 $99 strike)\n\n  PASTE ONCE PER PAGE. The page this replaces had v2.2 AND a full copy of v2.1\n  in it \u2014 duplicate element IDs mean getElementById only ever finds the first,\n  so the second copy's script was binding to the first copy's DOM.\n\n  Currency, prices, bumps, blurb, bed name, demo MP3, the GBP\/USD switcher\n  note, and the upgrade link all switch automatically based on which product\n  page the wizard is loaded on.\n\n  MONTHLY UPDATES: bed name, demo URLs and tag pill come from WP admin\n    \u2192 \"RJ24 Monthly Offers\" \u2192 edit fields \u2192 save. No HTML edits needed.\n\n  Post-add bumps: \u00a315\/\u00a315 (UK) or $19\/$19 (US).\n  #rjs2-* portaled to body.\n-->\n<style>\n@import url('https:\/\/fonts.googleapis.com\/css2?family=Anton&display=swap');\n#rj-sungoffer-wizard{\n  --pink:#EC4899; --pink-dark:#DB2777; --pink-light:#FDF2F8; --ink:#1E293B; --text:#475569; --muted:#94A3B8; --line:#E2E8F0; --gold:#F59E0B;\n  font-family:'Inter',-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif; color:var(--ink); max-width:980px; margin:0 auto; padding:0 0 160px; -webkit-font-smoothing:antialiased;\n  --rjs2-headpad:110px; padding-top:var(--rjs2-headpad);\n}\n@media (max-width:1000px){ #rj-sungoffer-wizard{ --rjs2-headpad:90px; } }\n@media (max-width:600px){ #rj-sungoffer-wizard{ --rjs2-headpad:80px; } }\n#rj-sungoffer-wizard *{ box-sizing:border-box; }\n#rj-sungoffer-wizard .rjs2-hero{\n  position:relative; isolation:isolate; overflow:hidden; border-radius:24px;\n  padding:48px 36px 44px; text-align:center; margin:18px 0 24px;\n  background-color:#160F1F;\n  background-image:\n    radial-gradient(120% 140% at 12% 18%, rgba(236,72,153,0.55) 0%, rgba(236,72,153,0) 55%),\n    radial-gradient(120% 140% at 92% 10%, rgba(245,158,11,0.30) 0%, rgba(245,158,11,0) 50%),\n    radial-gradient(140% 160% at 80% 120%, rgba(219,39,119,0.50) 0%, rgba(219,39,119,0) 60%),\n    linear-gradient(135deg,#241733 0%,#0F0A18 100%);\n}\n#rj-sungoffer-wizard .rjs2-hero::after{ content:\"\"; position:absolute; inset:0; background-image:radial-gradient(rgba(255,255,255,0.05) 1px,transparent 1px); background-size:22px 22px; opacity:.5; z-index:-1; }\n\n#rj-sungoffer-wizard .rjs2-tag{\n  display:inline-flex; align-items:center; gap:8px;\n  background:var(--gold); color:#1E293B;\n  font-weight:900; font-size:11px; letter-spacing:.18em; text-transform:uppercase;\n  padding:8px 18px; border-radius:999px; margin-bottom:18px;\n  box-shadow:0 6px 18px rgba(245,158,11,0.4);\n}\n#rj-sungoffer-wizard .rjs2-tag::before{ content:\"\u2605\"; font-size:13px; }\n\n#rj-sungoffer-wizard .rjs2-hero h1{\n  font-family:'Anton',sans-serif; text-transform:uppercase;\n  font-size:clamp(36px,7vw,72px); color:#fff; margin:0; line-height:.92;\n  letter-spacing:-0.5px; text-shadow:0 6px 40px rgba(236,72,153,.45);\n}\n#rj-sungoffer-wizard .rjs2-hero h1 .pop{\n  background:linear-gradient(180deg,#FBCFE8 0%,#EC4899 60%,#DB2777 100%);\n  -webkit-background-clip:text; background-clip:text; -webkit-text-fill-color:transparent;\n}\n#rj-sungoffer-wizard .rjs2-hero p{ color:rgba(255,255,255,0.85); font-size:16px; margin:16px auto 0; max-width:520px; }\n#rj-sungoffer-wizard .rjs2-hero p b{ color:#fff; }\n\n#rj-sungoffer-wizard .rjs2-priceline{ display:flex; align-items:baseline; justify-content:center; gap:14px; margin-top:22px; flex-wrap:wrap; }\n#rj-sungoffer-wizard .rjs2-priceline .now{ font-family:'Anton',sans-serif; font-size:clamp(54px,9vw,84px); line-height:1; color:#fff; letter-spacing:-0.02em; }\n#rj-sungoffer-wizard .rjs2-priceline .was{ font-family:'Anton',sans-serif; font-size:clamp(22px,3vw,30px); color:rgba(255,255,255,0.45); text-decoration:line-through; }\n#rj-sungoffer-wizard .rjs2-priceline .saving{\n  display:inline-block; background:#10B981; color:#fff;\n  font-weight:900; font-size:13px; letter-spacing:.06em;\n  padding:8px 14px; border-radius:999px; align-self:center;\n  box-shadow:0 6px 16px rgba(16,185,129,0.4);\n}\n\n#rj-sungoffer-wizard .rjs2-burst{\n  position:absolute; top:18px; right:20px; z-index:2;\n  width:118px; height:118px; border-radius:50%;\n  background:radial-gradient(circle at 30% 30%, #FBBF24 0%, #F59E0B 50%, #DB2777 100%);\n  display:flex; flex-direction:column; align-items:center; justify-content:center;\n  color:#1E293B; text-align:center; transform:rotate(-8deg);\n  box-shadow:0 12px 30px rgba(236,72,153,0.5), 0 0 0 4px rgba(255,255,255,0.08);\n  font-family:'Anton',sans-serif; line-height:1;\n  border:3px solid #FFFBEB;\n}\n#rj-sungoffer-wizard .rjs2-burst .b-save{ font-size:14px; letter-spacing:.1em; margin-bottom:2px; }\n#rj-sungoffer-wizard .rjs2-burst .b-amt{ font-size:30px; color:#1E293B; }\n#rj-sungoffer-wizard .rjs2-burst .b-off{ font-size:12px; letter-spacing:.12em; margin-top:3px; }\n@media (max-width:720px){\n  #rj-sungoffer-wizard .rjs2-burst{ width:96px; height:96px; top:12px; right:12px; }\n  #rj-sungoffer-wizard .rjs2-burst .b-amt{ font-size:22px; }\n  #rj-sungoffer-wizard .rjs2-burst .b-save{ font-size:11px; }\n  #rj-sungoffer-wizard .rjs2-burst .b-off{ font-size:10px; }\n}\n\n#rj-sungoffer-wizard .rjs2-demo{ max-width:480px; margin:24px auto 0; background:rgba(255,255,255,0.08); border:1px solid rgba(255,255,255,0.15); border-radius:14px; padding:10px 14px; backdrop-filter:blur(4px); }\n#rj-sungoffer-wizard .rjs2-demo-label{ display:block; font-size:11px; font-weight:800; letter-spacing:.12em; text-transform:uppercase; color:rgba(255,255,255,0.75); margin-bottom:6px; }\n#rj-sungoffer-wizard .rjs2-demo audio{ width:100%; height:38px; }\n\n#rj-sungoffer-wizard .rjs2-trust{\n  display:grid; grid-template-columns:repeat(5,1fr); gap:10px;\n  margin:0 0 16px; padding:14px;\n  background:#fff; border:1px solid var(--line); border-radius:14px;\n}\n#rj-sungoffer-wizard .rjs2-trust-item{\n  display:flex; flex-direction:column; align-items:center; text-align:center;\n  padding:8px 6px; gap:4px;\n}\n#rj-sungoffer-wizard .rjs2-trust-ico{ font-size:22px; line-height:1; }\n#rj-sungoffer-wizard .rjs2-trust-h{ font-size:12.5px; font-weight:800; color:var(--ink); line-height:1.25; }\n#rj-sungoffer-wizard .rjs2-trust-d{ font-size:11px; color:var(--text); line-height:1.4; }\n@media (max-width:880px){ #rj-sungoffer-wizard .rjs2-trust{ grid-template-columns:repeat(2,1fr); } }\n@media (max-width:480px){ #rj-sungoffer-wizard .rjs2-trust{ grid-template-columns:1fr; } }\n\n#rj-sungoffer-wizard .rjs2-gbp{\n  display:flex; align-items:center; gap:10px;\n  background:#FBF7F2; border:1px solid #F3E8DD; border-left:3px solid var(--pink);\n  border-radius:10px; padding:10px 16px; margin:0 auto 20px;\n  max-width:560px; font-size:12.5px; line-height:1.5; color:var(--text);\n}\n#rj-sungoffer-wizard .rjs2-gbp-ico{ font-size:15px; flex-shrink:0; }\n#rj-sungoffer-wizard .rjs2-gbp-text strong{ color:var(--ink); font-weight:700; }\n#rj-sungoffer-wizard .rjs2-gbp-text a{ color:var(--pink-dark); font-weight:700; text-decoration:none; }\n#rj-sungoffer-wizard .rjs2-gbp-text a:hover{ text-decoration:underline; }\n\n#rj-sungoffer-wizard .rjs2-upgrade{\n  display:flex; align-items:center; gap:14px; text-decoration:none;\n  background:#F8FAFC; border:1px solid var(--line);\n  border-radius:14px; padding:14px 18px; margin:0 0 18px;\n  transition:border-color .15s, transform .12s, box-shadow .15s;\n}\n#rj-sungoffer-wizard .rjs2-upgrade:hover{ border-color:var(--pink); transform:translateY(-1px); box-shadow:0 6px 18px rgba(236,72,153,.12); }\n#rj-sungoffer-wizard .rjs2-up-spark{ font-size:22px; flex:none; opacity:0.7; }\n#rj-sungoffer-wizard .rjs2-up-text{ flex:1; font-size:13px; color:var(--text); line-height:1.5; }\n#rj-sungoffer-wizard .rjs2-up-text b{ color:var(--ink); }\n#rj-sungoffer-wizard .rjs2-up-go{ flex:none; font-weight:700; font-size:13px; color:var(--pink-dark); background:transparent; border:1.5px solid var(--pink); border-radius:999px; padding:8px 16px; white-space:nowrap; }\n@media (max-width:560px){ #rj-sungoffer-wizard .rjs2-upgrade{ flex-direction:column; text-align:center; } }\n#rj-sungoffer-wizard .rjs2-step{ background:#fff; border:1px solid var(--line); border-radius:16px; padding:24px; margin:0 0 18px; }\n#rj-sungoffer-wizard .rjs2-h{ font-size:20px; font-weight:800; margin:0 0 6px; }\n#rj-sungoffer-wizard .rjs2-intro{ font-size:14px; color:var(--text); line-height:1.6; margin:0 0 16px; }\n#rj-sungoffer-wizard .rjs2-label{ display:block; font-size:14px; font-weight:700; margin:0 0 6px; }\n#rj-sungoffer-wizard .rjs2-input, #rj-sungoffer-wizard .rjs2-textarea{ width:100%; border:2px solid var(--line); border-radius:12px; padding:12px 14px; font-family:inherit; font-size:14px; color:var(--ink); }\n#rj-sungoffer-wizard .rjs2-input:focus, #rj-sungoffer-wizard .rjs2-textarea:focus{ outline:none; border-color:var(--pink); box-shadow:0 0 0 4px rgba(236,72,153,.1); }\n#rj-sungoffer-wizard .rjs2-counter{ margin-top:6px; font-size:12px; font-weight:700; color:var(--text); }\n#rj-sungoffer-wizard .rjs2-field{ margin:0 0 16px; }\n#rj-sungoffer-wizard .rjs2-pills{ display:flex; gap:10px; flex-wrap:wrap; }\n#rj-sungoffer-wizard .rjs2-pill{ border:2px solid var(--line); border-radius:999px; padding:10px 22px; background:#fff; cursor:pointer; font-family:inherit; font-weight:700; font-size:14px; }\n#rj-sungoffer-wizard .rjs2-pill.active{ border-color:var(--pink); background:var(--pink-light); color:var(--pink-dark); }\n#rj-sungoffer-wizard .rjs2-singers{ display:flex; gap:12px; flex-wrap:wrap; align-items:stretch; }\n#rj-sungoffer-wizard .rjs2-singer{ flex:1; min-width:180px; border:2px solid var(--line); border-radius:14px; padding:16px; text-align:center; cursor:pointer; transition:border-color .15s, background .15s; font-weight:800; }\n#rj-sungoffer-wizard .rjs2-singer:hover{ border-color:var(--pink); }\n#rj-sungoffer-wizard .rjs2-singer.selected{ border-color:var(--pink); background:var(--pink-light); color:var(--pink-dark); }\n#rj-sungoffer-wizard .rjs2-singer small{ display:block; font-weight:600; font-size:11px; color:var(--muted); margin-top:2px; }\n\n\/* v2.3 \u2014 a demo player inside each singer card. Its own cursor and a\n   stopPropagation in the JS, so pressing play does not tick the card. *\/\n#rj-sungoffer-wizard .rjs2-singer-name{ display:block; font-size:17px; line-height:1.2; }\n#rj-sungoffer-wizard .rjs2-singer-demo{ margin-top:13px; padding-top:12px; border-top:1px solid var(--line); cursor:default; }\n#rj-sungoffer-wizard .rjs2-singer.selected .rjs2-singer-demo{ border-top-color:rgba(236,72,153,.35); }\n#rj-sungoffer-wizard .rjs2-singer-demo-l{ display:block; font-size:10px; font-weight:800; letter-spacing:.11em; text-transform:uppercase; color:var(--muted); margin-bottom:7px; }\n#rj-sungoffer-wizard .rjs2-singer.selected .rjs2-singer-demo-l{ color:var(--pink-dark); }\n#rj-sungoffer-wizard .rjs2-singer-demo audio{ width:100%; height:34px; display:block; }\n\n#rjs2-footer{ --pink:#EC4899; --pink-dark:#DB2777; --muted:#94A3B8; --line:#E2E8F0; position:fixed; left:0; right:0; bottom:0; z-index:99999; background:#fff; border-top:1px solid var(--line); box-shadow:0 -4px 20px rgba(0,0,0,.08); display:flex; align-items:center; justify-content:space-between; gap:16px; padding:14px 24px; font-family:'Inter',sans-serif; }\n#rjs2-footer .rjs2-pr{ display:flex; flex-direction:column; line-height:1.1; }\n#rjs2-footer .rjs2-pr-l{ font-size:12px; color:var(--muted); font-weight:600; text-transform:uppercase; letter-spacing:.05em; }\n#rjs2-footer .rjs2-pr-v{ font-size:26px; font-weight:800; color:var(--pink-dark); }\n#rjs2-footer button{ background:var(--pink); color:#fff; border:none; border-radius:999px; font-weight:800; font-size:16px; padding:14px 34px; cursor:pointer; box-shadow:0 6px 18px rgba(236,72,153,.32); font-family:inherit; }\n#rjs2-footer button:hover{ background:var(--pink-dark); }\n#rjs2-toast{ position:fixed; left:50%; transform:translateX(-50%); bottom:90px; z-index:100001; background:#10B981; color:#fff; font-weight:700; font-size:14px; padding:14px 28px; border-radius:999px; box-shadow:0 10px 30px rgba(16,185,129,.5); display:none; font-family:'Inter',sans-serif; }\n#rjs2-toast.error{ background:#DC2626; }\n#rjs2-bump-overlay{ position:fixed; inset:0; z-index:100002; background:rgba(15,23,42,.55); display:none; align-items:center; justify-content:center; padding:20px; font-family:'Inter',sans-serif; }\n#rjs2-bump-overlay.show{ display:flex; }\n#rjs2-bump{ background:#fff; border-radius:20px; max-width:460px; width:100%; padding:28px; box-shadow:0 24px 60px rgba(0,0,0,.3); text-align:center; }\n#rjs2-bump h3{ font-size:22px; font-weight:800; color:#1E293B; margin:0 0 10px; }\n#rjs2-bump p{ font-size:14px; color:#475569; line-height:1.55; margin:0 0 18px; }\n#rjs2-bump .rjs2-extra{ display:flex; align-items:center; gap:12px; border:2px solid var(--line); border-radius:12px; padding:14px 16px; cursor:pointer; margin-bottom:10px; text-align:left; }\n#rjs2-bump .rjs2-extra.active{ border-color:#EC4899; background:#FDF2F8; }\n#rjs2-bump .rjs2-extra .chk{ width:22px; height:22px; border-radius:6px; border:2px solid var(--line); display:flex; align-items:center; justify-content:center; color:#fff; font-size:13px; flex:none; }\n#rjs2-bump .rjs2-extra.active .chk{ background:#EC4899; border-color:#EC4899; }\n#rjs2-bump .rjs2-extra .t{ flex:1; font-weight:700; font-size:14px; color:#1E293B; }\n#rjs2-bump .rjs2-extra .f{ font-weight:800; color:#DB2777; }\n#rjs2-bump .go{ background:#EC4899; color:#fff; border:none; border-radius:999px; font-weight:800; font-size:16px; padding:14px; cursor:pointer; width:100%; margin-top:8px; font-family:inherit; }\n#rjs2-bump .skip{ background:transparent; color:#475569; border:none; font-weight:700; font-size:14px; padding:10px; cursor:pointer; width:100%; font-family:inherit; }\n\n\/* ---- Tameside multi-bed (v2.2) ---- *\/\n#rj-sungoffer-wizard .rjs2-beds{ display:grid; grid-template-columns:repeat(2,1fr); gap:12px; }\n@media (max-width:560px){ #rj-sungoffer-wizard .rjs2-beds{ grid-template-columns:1fr; } }\n#rj-sungoffer-wizard .rjs2-bed{ border:2px solid var(--line); border-radius:14px; padding:16px; cursor:pointer; transition:border-color .15s, background .15s, box-shadow .15s; display:flex; align-items:center; gap:12px; }\n#rj-sungoffer-wizard .rjs2-bed:hover{ border-color:var(--pink); }\n#rj-sungoffer-wizard .rjs2-bed.selected{ border-color:var(--pink); background:var(--pink-light); box-shadow:0 6px 18px rgba(236,72,153,.15); }\n#rj-sungoffer-wizard .rjs2-bed .chk{ width:24px; height:24px; border-radius:7px; border:2px solid var(--line); display:flex; align-items:center; justify-content:center; color:#fff; font-size:14px; flex:none; }\n#rj-sungoffer-wizard .rjs2-bed.selected .chk{ background:var(--pink); border-color:var(--pink); }\n#rj-sungoffer-wizard .rjs2-bed .bed-name{ font-weight:800; font-size:15px; color:var(--ink); }\n#rj-sungoffer-wizard .rjs2-bed .bed-sub{ font-size:12px; color:var(--muted); font-weight:600; }\n#rj-sungoffer-wizard .rjs2-bed-demo{ margin-top:8px; }\n#rj-sungoffer-wizard .rjs2-bed-demo audio{ width:100%; height:34px; }\n#rj-sungoffer-wizard .rjs2-bed-main{ flex:1; }\n#rj-sungoffer-wizard .rjs2-scriptbox{ border:1px solid var(--line); border-left:3px solid var(--pink); border-radius:12px; padding:16px; margin-bottom:12px; background:#FDFCFE; }\n#rj-sungoffer-wizard .rjs2-scriptbox h4{ margin:0 0 8px; font-size:14px; font-weight:800; color:var(--ink); }\n\n\/* hide WC product title at all screen sizes \u2014 was bleeding through on mobile only. *\/\nhtml body.single-product .product_title{ display:none !important; }\n\n\/* ---------------------------------------------------------------------------\n   Hide the native WooCommerce product summary. The wizard replaces it wholesale\n   \u2014 price, add-to-cart form, quantity stepper, short description, product meta\n   and any leftover TM Extra Product Options fields.\n\n   THIS BLOCK IS LOAD-BEARING. Recovered from the live page 2026-09-06 after it\n   was found missing from this file: pasting this file over a live block without\n   it exposed the raw Woo form (price, \"Options \/ Amount $0.00\", quantity) above\n   the wizard hero on \/product\/sung-jingle-offer-us\/.\n\n   The UK products (99978, 11581) survive without it because Customiser ->\n   Additional CSS carries per-postid hide rules for them. The US pair\n   (117061 \/ 117069) is NOT in that list, so on those two pages this rule is the\n   only thing hiding the native summary. See wp-custom-css-us-tm-hide.md.\n   --------------------------------------------------------------------------- *\/\nhtml body.single-product div.product .summary > .price,\nhtml body.single-product div.product .summary > p,\nhtml body.single-product div.product .summary > form.cart,\nhtml body.single-product div.product .summary > .tm-extra-product-options,\nhtml body.single-product div.product .summary > .tc-totals-form,\nhtml body.single-product div.product .summary > .tc-cart-loop-data,\nhtml body.single-product div.product .summary > .product_meta,\nhtml body.single-product div.product .summary > .woocommerce-product-details__short-description,\nhtml body.single-product div.product .summary form.cart,\nhtml body.single-product div.product .summary .tm-extra-product-options,\nhtml body.single-product div.product .summary .tc-totals-form,\nhtml body.single-product div.product .summary > audio,\nhtml body.single-product div.product .summary > h2,\nhtml body.single-product div.product .summary > h3{ display:none !important; }\n<\/style>\n\n<div id=\"rj-sungoffer-wizard\">\n  <div class=\"rjs2-hero\">\n    <div class=\"rjs2-burst\" id=\"rjs2-burst\" style=\"display:none;\">\n      <span class=\"b-save\">SAVE<\/span>\n      <span class=\"b-amt\" id=\"rjs2-burst-amt\">\u00a320<\/span>\n      <span class=\"b-off\">OFF<\/span>\n    <\/div>\n\n    <div class=\"rjs2-tag\" id=\"rjs2-tag-pill\">September Special Offer<\/div>\n    <h1 id=\"rjs2-title\">Sung Jingle <span class=\"pop\">Offer<\/span><\/h1>\n    <p id=\"rjs2-blurb\">Your station name, professionally sung. Save big on our headline sung deal.<\/p>\n\n    <div class=\"rjs2-priceline\">\n      <span class=\"now\" id=\"rjs2-now\">&pound;0<\/span>\n      <span class=\"was\" id=\"rjs2-was\"><\/span>\n      <span class=\"saving\" id=\"rjs2-saving\"><\/span>\n    <\/div>\n\n    <div class=\"rjs2-demo\">\n      <span class=\"rjs2-demo-label\">\u25b6 Hear the demo<\/span>\n      <audio id=\"rjs2-demo\" controls preload=\"none\" src=\"\"><\/audio>\n    <\/div>\n  <\/div>\n\n  <div class=\"rjs2-trust\">\n    <div class=\"rjs2-trust-item\"><span class=\"rjs2-trust-ico\">\u23f1<\/span><span class=\"rjs2-trust-h\" id=\"rjs2-trust-h2\">In 48 hours<\/span><span class=\"rjs2-trust-d\" id=\"rjs2-trust-d2\">Rosie sings your station name in 48 hours<\/span><\/div>\n    <div class=\"rjs2-trust-item\"><span class=\"rjs2-trust-ico\">\ud83d\udcc2<\/span><span class=\"rjs2-trust-h\">MP3, WAV &amp; AIFF<\/span><span class=\"rjs2-trust-d\">Studio-quality files in your chosen format<\/span><\/div>\n    <div class=\"rjs2-trust-item\"><span class=\"rjs2-trust-ico\">\u221e<\/span><span class=\"rjs2-trust-h\">Royalty-free forever<\/span><span class=\"rjs2-trust-d\">Yours to broadcast as long as your station runs<\/span><\/div>\n    <div class=\"rjs2-trust-item\"><span class=\"rjs2-trust-ico\">\ud83c\udfb6<\/span><span class=\"rjs2-trust-h\">FREE acapella included<\/span><span class=\"rjs2-trust-d\">Every sung jingle comes with the acapella version too<\/span><\/div>\n  <\/div>\n\n  <div class=\"rjs2-gbp\">\n    <span class=\"rjs2-gbp-ico\" id=\"rjs2-ccy-ico\">\ud83d\udcb1<\/span>\n    <span class=\"rjs2-gbp-text\" id=\"rjs2-ccy-text\">Prices shown in <strong>GBP (\u00a3)<\/strong>. Not in the UK? Your local currency is calculated at checkout, at today's exchange rate.<\/span>\n  <\/div>\n\n  <div class=\"rjs2-step\" id=\"rjs2-singer-step\" style=\"display:none;\">\n    <h2 class=\"rjs2-h\">Choose your singer<\/h2>\n    <p class=\"rjs2-intro\">Both have sung for BBC Radio 2, Virgin, Sky and more. Have a listen before you pick.<\/p>\n    <!-- Cards are built by the script from the plugin config, so the names and\n         the demo players follow whatever is set in RJ24 Monthly Offers. -->\n    <div class=\"rjs2-singers\" id=\"rjs2-singers\"><\/div>\n  <\/div>\n\n  <!-- TAMESIDE bed multi-select (v2.2) -->\n  <div class=\"rjs2-step\" id=\"rjs2-beds-step\" style=\"display:none;\">\n    <h2 class=\"rjs2-h\">Choose your Tameside beds<\/h2>\n    <p class=\"rjs2-intro\">Pick any of the four &mdash; each bed is sung with your station name. A script box appears for each one you choose.<\/p>\n    <div class=\"rjs2-beds\" id=\"rjs2-beds\"><\/div>\n  <\/div>\n\n  <!-- TAMESIDE per-bed scripts (v2.2) -->\n  <div class=\"rjs2-step\" id=\"rjs2-tscripts-step\" style=\"display:none;\">\n    <h2 class=\"rjs2-h\">Your station name &amp; script &mdash; per bed<\/h2>\n    <p class=\"rjs2-intro\">Keep each one short &mdash; your station name &amp; strapline as you'd like it sung.<\/p>\n    <div id=\"rjs2-tscripts\"><\/div>\n    <div class=\"rjs2-field\" style=\"margin-top:8px;\">\n      <label class=\"rjs2-label\" for=\"rjs2-tinstr\">Special instructions (pronunciation etc.)<\/label>\n      <textarea id=\"rjs2-tinstr\" class=\"rjs2-textarea\" rows=\"2\" placeholder=\"Anything we should know...\"><\/textarea>\n    <\/div>\n  <\/div>\n\n  <div class=\"rjs2-step\">\n    <h2 class=\"rjs2-h\">Enter your script<\/h2>\n    <p class=\"rjs2-intro\">Keep it short &mdash; ideally <b>5&ndash;8 words<\/b> (your station name &amp; strapline).<\/p>\n    <div class=\"rjs2-field\">\n      <label class=\"rjs2-label\" for=\"rjs2-script\">Your script<\/label>\n      <textarea id=\"rjs2-script\" class=\"rjs2-textarea\" rows=\"2\" placeholder=\"e.g. The Greatest Hits \u2014 Sunshine Radio\"><\/textarea>\n      <div class=\"rjs2-counter\" id=\"rjs2-count\">0 words<\/div>\n    <\/div>\n    <div class=\"rjs2-field\">\n      <label class=\"rjs2-label\" for=\"rjs2-instr\">Special instructions (pronunciation etc.)<\/label>\n      <textarea id=\"rjs2-instr\" class=\"rjs2-textarea\" rows=\"2\" placeholder=\"Anything we should know...\"><\/textarea>\n    <\/div>\n  <\/div>\n\n  <div class=\"rjs2-step\">\n    <h2 class=\"rjs2-h\">File format<\/h2>\n    <div class=\"rjs2-pills\" id=\"rjs2-format\">\n      <button type=\"button\" class=\"rjs2-pill active\" data-fmt=\"MP3\">MP3<\/button>\n      <button type=\"button\" class=\"rjs2-pill\" data-fmt=\"WAVE\">WAVE<\/button>\n      <button type=\"button\" class=\"rjs2-pill\" data-fmt=\"AIFF\">AIFF<\/button>\n    <\/div>\n  <\/div>\n<\/div>\n\n<div id=\"rjs2-footer\">\n  <div class=\"rjs2-pr\"><span class=\"rjs2-pr-l\">Total<\/span><span class=\"rjs2-pr-v\" id=\"rjs2-total\">\u00a30<\/span><\/div>\n  <button type=\"button\" id=\"rjs2-add\">Add to cart<\/button>\n<\/div>\n<div id=\"rjs2-toast\"><\/div>\n<div id=\"rjs2-bump-overlay\">\n  <div id=\"rjs2-bump\">\n    <h3>Add some extra cuts?<\/h3>\n    <p>Make your package go further with optional extras &mdash; pick any you'd like.<\/p>\n    <div class=\"rjs2-extra\" data-extra=\"shotgun\"><span class=\"chk\">&#10003;<\/span><span class=\"t\">Shotgun ID<\/span><span class=\"f\" id=\"rjs2-bump-shot-fee\">+\u00a315<\/span><\/div>\n    <div class=\"rjs2-extra\" data-extra=\"tag\"><span class=\"chk\">&#10003;<\/span><span class=\"t\">Ramp \/ Tag<\/span><span class=\"f\" id=\"rjs2-bump-tag-fee\">+\u00a315<\/span><\/div>\n    <button type=\"button\" class=\"go\" id=\"rjs2-bump-go\">Add to cart<\/button>\n    <button type=\"button\" class=\"skip\" id=\"rjs2-bump-skip\">No thanks, just the jingle<\/button>\n  <\/div>\n<\/div>\n\n<script>\n(function(){\n  var CFG = window.RJ24_SUNGOFFER_CFG || {};\n  var OFFERS = CFG.offers || {};\n  var FEES = CFG.fees || { GBP:{tag:15,shotgun:15}, USD:{tag:19,shotgun:19} };\n\n  \/\/ ===========================================================================\n  \/\/ PRODUCT IDs \u2014 confirmed real\n  \/\/ ===========================================================================\n  \/\/ THE PREMIUM PRODUCTS (11581 UK \/ 117069 US) WERE WITHDRAWN IN SEPT 2026.\n  \/\/ Mo sang both and left the roster; rather than sell a premium tier with no\n  \/\/ voice behind it, both products went. Everything premium is gone from here:\n  \/\/ the ids, the slugs, the upgrade prompt and the singer chooser.\n  var UK_BASIC_ID   = '99978';\n  var US_BASIC_ID   = '117061';\n\n  \/\/ Static \"was\" prices \u2014 these don't change month-to-month\n  var WAS = {};\n  WAS[UK_BASIC_ID]   = 79;\n  WAS[US_BASIC_ID]   = 99;\n\n  var TITLES = {};\n  TITLES[UK_BASIC_ID]   = 'Sung Jingle Offer';\n  TITLES[US_BASIC_ID]   = 'Sung Jingle Offer';\n\n  \/\/ Who sings, and how long it takes. The hero blurb and the trust strip read\n  \/\/ from here, so a turnaround is stated in exactly one place. Rosie is the\n  \/\/ whole roster since Mo left (2026-09) and premium was withdrawn with him.\n  var SINGERS = {\n    Rosie: {\n      days:   2,\n      text:   '48 hours',\n      head:   'In 48 hours',\n      note:   'Rosie sings your station name in 48 hours',\n      credit: 'Our singers and voices have worked with BBC Radio, Global Radio, Virgin Radio and others'\n    }\n  };\n\n  \/\/ The singer this product ships with. If it is ever a choice again, quote\n  \/\/ the SLOWEST of the options, so the promise on the page is never one the\n  \/\/ customer's actual pick cannot keep.\n  function offerSinger(){\n    var raw   = OFFER.singer || 'fixed:Rosie';\n    var names = (raw.indexOf('choose:') === 0) ? raw.slice(7).split(',') : [ raw.slice(6) ];\n    var worst = null;\n    names.forEach(function(n){\n      var sg = SINGERS[String(n).trim()];\n      if (sg && (!worst || sg.days > worst.days)) { worst = sg; }\n    });\n    return worst || SINGERS.Rosie;\n  }\n\n  function el(id){ return document.getElementById(id); }\n  function wc(t){ t=(t||'').trim(); if(!t) return 0; return t.split(\/\\s+\/).filter(Boolean).length; }\n  function esc(s){ return String(s||'').replace(\/[&<>\"']\/g, function(c){\n    return {'&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;',\"'\":'&#39;'}[c]; }); }\n\n  function detectId(){\n    var m=(document.body.className||'').match(\/postid-(\\d+)\/);\n    if(m && OFFERS[m[1]]) return m[1];\n    var k=Object.keys(OFFERS);\n    return k.length?k[0]:null;\n  }\n  var PID = detectId();\n\n  \/\/ Currency from PID (no IP detection \u2014 purely product-based)\n  var IS_US = (PID === US_BASIC_ID);\n  var CCY = IS_US ? '$' : '\u00a3';\n  var CUR_CODE = IS_US ? 'USD' : 'GBP';\n  var TAG_FEE = (FEES[CUR_CODE] && FEES[CUR_CODE].tag) || (IS_US ? 19 : 15);\n  var SHOT_FEE = (FEES[CUR_CODE] && FEES[CUR_CODE].shotgun) || (IS_US ? 19 : 15);\n\n  \/\/ OFFER comes from the plugin's RJ24_SUNGOFFER_CFG.offers (admin-managed).\n  var OFFER = (PID && OFFERS[PID]) ? OFFERS[PID] : {\n    base: (IS_US?79:59),\n    bed: 'featured',\n    demo: '',\n    singer: 'fixed:Rosie',\n    label: TITLES[PID] || 'Sung Jingle Offer'\n  };\n\n  var st = { singer:null, format:'MP3', tag:false, shotgun:false, busy:false };\n\n  \/\/ --- Tameside multi-bed (v2.2) ---\n  var IS_TAMESIDE = !!(OFFER && OFFER.mode === 'tameside');\n  var PER_BED = (OFFER && OFFER.per_bed) ? OFFER.per_bed : OFFER.base;\n  var TBEDS = (OFFER && OFFER.beds && OFFER.beds.length) ? OFFER.beds : ['Tameside 1','Tameside 2','Tameside 3','Tameside 4'];\n  st.tbeds = {}; \/\/ { 'Tameside 1': 'script', ... }\n\n  function portal(){ ['rjs2-footer','rjs2-toast','rjs2-bump-overlay'].forEach(function(id){ var n=el(id); if(n&&n.parentElement!==document.body) document.body.appendChild(n); }); }\n  if (document.readyState==='loading') document.addEventListener('DOMContentLoaded',portal); else portal();\n  setTimeout(portal,800); setTimeout(portal,2000);\n\n  \/\/ Hero copy\n  el('rjs2-title').innerHTML = TITLES[PID] || OFFER.label;\n  el('rjs2-now').textContent = CCY + OFFER.base;\n  if (WAS[PID]){\n    el('rjs2-was').textContent = CCY + WAS[PID];\n    var saving = WAS[PID] - OFFER.base;\n    if (saving > 0){\n      el('rjs2-saving').textContent = 'SAVE ' + CCY + saving;\n      el('rjs2-burst-amt').textContent = CCY + saving;\n      el('rjs2-burst').style.display = 'flex';\n    }\n  }\n  \/\/ Demo URL from plugin admin\n  if (OFFER.demo) el('rjs2-demo').src = OFFER.demo;\n  \/\/ Bed name from plugin admin\n  var SINGER = offerSinger();\n  el('rjs2-blurb').innerHTML = 'Your station name, sung on our <b>' + esc(OFFER.bed || 'featured') + '<\/b> bed &mdash; delivered in ' + SINGER.text + ', yours to use forever.';\n  \/\/ Trust strip: turnaround and singer credit both follow the product.\n  el('rjs2-trust-h2').innerHTML = SINGER.head;\n  el('rjs2-trust-d2').innerHTML = SINGER.note;\n  \/*\n   * There is no #rjs2-trust-d1 in the markup - the trust strip has four items\n   * and only the first one carries ids (h2 \/ d2). This line was written against\n   * a slot that never existed, so el() returned null and the assignment threw a\n   * TypeError, killing the whole wizard from this point down: no tag pill, no\n   * currency swap, none of the event listeners, and no updateTotal() - which is\n   * why the footer sat at \"TOTAL \u00a30\" and Add to cart did nothing on both sung\n   * products. The hero price still showed because it is set further up.\n   *\n   * Guarded rather than deleted so the credit starts appearing by itself if a\n   * d1 slot is ever added. Every other el() call in this block writes to markup\n   * that is definitely present.\n   *\/\n  if (el('rjs2-trust-d1')) el('rjs2-trust-d1').innerHTML = SINGER.credit;\n  \/\/ Tag pill text from plugin admin (falls back to the hard-coded month above)\n  if (OFFER.tag_pill) el('rjs2-tag-pill').textContent = OFFER.tag_pill;\n\n  \/\/ Currency swap (US: GBP note \u2192 USD note + bump fees)\n  if (IS_US) {\n    var ukEquivalent = (PID === US_BASIC_ID) ? 'sung-jingle-offer' : 'offer-sung-jingle';\n    el('rjs2-ccy-ico').textContent = '\ud83c\uddfa\ud83c\uddf8';\n    el('rjs2-ccy-text').innerHTML = 'Prices shown in <strong>USD ($)<\/strong>. Charged in USD at checkout. <a href=\"https:\/\/radiojingles24.com\/product\/' + ukEquivalent + '\/\">In the UK? See \u00a3 pricing &rarr;<\/a>';\n    el('rjs2-bump-tag-fee').textContent = '+$' + TAG_FEE;\n    el('rjs2-bump-shot-fee').textContent = '+$' + SHOT_FEE;\n  }\n\n  \/\/ SINGER STEP REMOVED (Sept 2026). It only ever rendered when a product's\n  \/\/ singer was 'choose:\u2026', which was the premium Mo\/Bea pick. Bea left, then Mo\n  \/\/ left and premium was withdrawn, so every product is fixed:Rosie and there is\n  \/\/ nothing to choose. The markup below it stays hidden and unused.\n  st.singer = (OFFER.singer||'fixed:Rosie').replace('fixed:','');\n\n  \/\/ ===== TAMESIDE MODE WIRING (v2.2) =====\n  if (IS_TAMESIDE){\n    el('rjs2-now').textContent = CCY + PER_BED;\n    var perNote = document.createElement('span');\n    perNote.className = 'was';\n    perNote.style.textDecoration = 'none';\n    perNote.style.color = 'rgba(255,255,255,0.7)';\n    perNote.style.fontFamily = \"'Inter',sans-serif\";\n    perNote.style.fontSize = '15px';\n    perNote.textContent = 'per bed';\n    var pl = document.querySelector('#rj-sungoffer-wizard .rjs2-priceline');\n    if (pl) pl.appendChild(perNote);\n    el('rjs2-blurb').innerHTML = 'The exact sung beds we produced for <b>Tameside Radio 103.6<\/b> &mdash; pick any of the four, sung for your station by <b>Rosie<\/b>.';\n    var heroDemo = document.querySelector('#rj-sungoffer-wizard .rjs2-demo'); if (heroDemo) heroDemo.style.display='none';\n    var ss = el('rjs2-singer-step'); if (ss) ss.style.display='none';\n    st.singer = 'Rosie';\n    var stdScript = el('rjs2-script');\n    if (stdScript){ var stdStep = stdScript.closest('.rjs2-step'); if (stdStep) stdStep.style.display='none'; }\n    el('rjs2-beds-step').style.display='';\n\n    var bedsWrap = el('rjs2-beds');\n    TBEDS.forEach(function(bed){\n      var card=document.createElement('div');\n      card.className='rjs2-bed'; card.setAttribute('data-bed',bed);\n      var BEDDEMOS = (OFFER && OFFER.per_bed_demos) ? OFFER.per_bed_demos : {};\n      var demoUrl = BEDDEMOS[bed] || '';\n      var demoHtml = demoUrl ? '<div class=\"rjs2-bed-demo\"><audio controls preload=\"none\" src=\"'+esc(demoUrl)+'\"><\/audio><\/div>' : '';\n      card.innerHTML='<span class=\"chk\">&#10003;<\/span><div class=\"rjs2-bed-main\"><div class=\"bed-name\">'+esc(bed)+'<\/div><div class=\"bed-sub\">Sung by Rosie &middot; '+CCY+PER_BED+'<\/div>'+demoHtml+'<\/div>';\n      var au = card.querySelector('audio');\n      if(au){ au.addEventListener('click', function(e){ e.stopPropagation(); }); }\n      card.addEventListener('click', function(e){\n        if(e.target.closest('.rjs2-bed-demo')) return;\n        var name=card.getAttribute('data-bed');\n        if(st.tbeds.hasOwnProperty(name)){ delete st.tbeds[name]; card.classList.remove('selected'); }\n        else { st.tbeds[name]=''; card.classList.add('selected'); }\n        renderTScripts(); updateTotal();\n      });\n      bedsWrap.appendChild(card);\n    });\n\n    function renderTScripts(){\n      var wrap2=el('rjs2-tscripts'); var step=el('rjs2-tscripts-step');\n      var sel=TBEDS.filter(function(b){ return st.tbeds.hasOwnProperty(b); });\n      if(sel.length===0){ step.style.display='none'; wrap2.innerHTML=''; return; }\n      step.style.display='';\n      wrap2.innerHTML='';\n      sel.forEach(function(bed){\n        var box=document.createElement('div'); box.className='rjs2-scriptbox';\n        var sid='rjs2-scr-'+bed.replace(\/\\s+\/g,'-');\n        box.innerHTML='<h4>'+esc(bed)+' &mdash; your script<\/h4><textarea class=\"rjs2-textarea\" id=\"'+sid+'\" rows=\"2\" placeholder=\"e.g. The Greatest Hits &mdash; Sunshine Radio\"><\/textarea><div class=\"rjs2-counter\" id=\"'+sid+'-c\">0 words<\/div>';\n        wrap2.appendChild(box);\n        var ta=box.querySelector('textarea'); ta.value=st.tbeds[bed]||'';\n        var c=box.querySelector('.rjs2-counter');\n        function upd(){ var n=wc(ta.value); c.textContent=n+' word'+(n===1?'':'s'); st.tbeds[bed]=ta.value; }\n        ta.addEventListener('input',upd); upd();\n      });\n    }\n  }\n\n  function tbedCount(){ return Object.keys(st.tbeds).length; }\n  function total(){ var b = IS_TAMESIDE ? (PER_BED * Math.max(0, tbedCount())) : OFFER.base; return b + (st.tag?TAG_FEE:0) + (st.shotgun?SHOT_FEE:0); }\n  function updateTotal(){ el('rjs2-total').textContent = CCY + total(); }\n\n  el('rjs2-script').addEventListener('input', function(){ var w=wc(this.value); el('rjs2-count').textContent = w+' word'+(w===1?'':'s'); });\n  el('rjs2-format').addEventListener('click', function(e){ var b=e.target.closest('.rjs2-pill'); if(!b) return; this.querySelectorAll('.rjs2-pill').forEach(function(p){p.classList.remove('active');}); b.classList.add('active'); st.format=b.getAttribute('data-fmt'); });\n\n  el('rjs2-bump-overlay').addEventListener('click', function(e){\n    var ex=e.target.closest('.rjs2-extra');\n    if(ex){ var k=ex.getAttribute('data-extra'); st[k]=!st[k]; ex.classList.toggle('active',st[k]); updateTotal(); }\n  });\n\n  function toast(m,k){ var t=el('rjs2-toast'); t.textContent=m; t.className=k||''; t.style.display='block'; clearTimeout(t._t); t._t=setTimeout(function(){t.style.display='none';},4000); }\n\n  function validate(){\n    if(!CFG.ajaxUrl){ toast('Setup error: missing config. Please refresh.','error'); return false; }\n    if(!PID){ toast('Setup error: product not recognised.','error'); return false; }\n    if(IS_TAMESIDE){\n      if(tbedCount()<1){ toast('Please choose at least one Tameside bed.','error'); return false; }\n      var missing=null;\n      Object.keys(st.tbeds).forEach(function(b){ if(!missing && !(st.tbeds[b]||'').trim()) missing=b; });\n      if(missing){ toast('Please enter a script for '+missing+'.','error'); return false; }\n      return true;\n    }\n    \/*\n     * The \"choose a singer\" check is gone with the singer step (Sept 2026).\n     * `needSinger` was declared alongside that step and removed with it, but\n     * this use was left behind - and because it sits inside validate(), which\n     * only runs on click, the page loaded perfectly and then Add to cart threw\n     * \"ReferenceError: needSinger is not defined\" and did nothing at all. No\n     * toast, no overlay, no visible failure of any kind.\n     *\n     * Nothing replaces it: every product is fixed:Rosie, st.singer is set\n     * unconditionally further up, so there is never a singer to choose.\n     *\/\n    if(!el('rjs2-script').value.trim()){ toast('Please enter your script.','error'); return false; }\n    return true;\n  }\n\n  function doSubmit(){\n    if(st.busy) return; st.busy=true;\n    var btn=el('rjs2-add'); var old=btn.textContent; btn.textContent='Adding...';\n    var body=new URLSearchParams();\n    body.set('action','rj24_add_sungoffer'); body.set('nonce',CFG.nonce||''); body.set('rj24_product_id',PID||'');\n    if(IS_TAMESIDE){\n      var payload=Object.keys(st.tbeds).map(function(b){ return { bed:b, script:(st.tbeds[b]||'').trim() }; });\n      body.set('rj24_beds', JSON.stringify(payload));\n      body.set('rj24_instructions', el('rjs2-tinstr').value.trim());\n    } else {\n      body.set('rj24_script',el('rjs2-script').value.trim()); body.set('rj24_singer',st.singer||'');\n      body.set('rj24_instructions',el('rjs2-instr').value.trim());\n    }\n    body.set('rj24_format',st.format);\n    body.set('rj24_tag',st.tag?'1':'0'); body.set('rj24_shotgun',st.shotgun?'1':'0');\n    fetch(CFG.ajaxUrl,{method:'POST',credentials:'same-origin',headers:{'Content-Type':'application\/x-www-form-urlencoded'},body:body.toString()})\n    .then(function(r){return r.json();})\n    .then(function(res){ st.busy=false; btn.textContent=old; if(res&&res.success){ toast('Added to cart!'); if(CFG.cartUrl) setTimeout(function(){window.location.href=CFG.cartUrl;},700);} else { toast((res&&res.message)?res.message:'Could not add to cart.','error'); } })\n    .catch(function(){ st.busy=false; btn.textContent=old; toast('Network error. Please try again.','error'); });\n  }\n\n  el('rjs2-add').addEventListener('click', function(){ if(!validate()) return; if(!st.tag && !st.shotgun){ el('rjs2-bump-overlay').classList.add('show'); } else { doSubmit(); } });\n  el('rjs2-bump-go').addEventListener('click', function(){ el('rjs2-bump-overlay').classList.remove('show'); doSubmit(); });\n  el('rjs2-bump-skip').addEventListener('click', function(){ st.tag=false; st.shotgun=false; updateTotal(); el('rjs2-bump-overlay').classList.remove('show'); doSubmit(); });\n\n  updateTotal();\n})();\n<\/script>\n\n\t\t<\/div>\n\t<\/div>\n\n\t\t\t<\/div> \n\t\t<\/div>\n\t<\/div> \n<\/div><\/div>\n","protected":false},"excerpt":{"rendered":"@import url('https:\/\/fonts.googleapis.com\/css2?family=Anton&display=swap'); #rj-sungoffer-wizard{ --pink:#EC4899; --pink-dark:#DB2777; --pink-light:#FDF2F8; --ink:#1E293B; --text:#475569; --muted:#94A3B8; --line:#E2E8F0; --gold:#F59E0B; font-family:'Inter',-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif; color:var(--ink); max-width:980px; margin:0 auto; padding:0 0 160px; -webkit-font-smoothing:antialiased; --rjs2-headpad:110px; padding-top:var(--rjs2-headpad); } @media (max-width:1000px){ #rj-sungoffer-wizard{ --rjs2-headpad:90px; } }...","protected":false},"featured_media":6045,"comment_status":"closed","ping_status":"closed","template":"","meta":[],"product_brand":[],"product_cat":[89,481,557,15],"product_tag":[],"class_list":["post-99978","product","type-product","status-publish","has-post-thumbnail","product_cat-jingles","product_cat-radio","product_cat-sale","product_cat-uncategorized","tm-has-options","first","instock","sale","virtual","taxable","purchasable","product-type-simple"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Special Offer - Sung Jingle - Radio Jingles 24: Radio Jingles | DJ Drops | Podcast Intros | Sung Jingles<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/radiojingles24.com\/de\/produkt\/sung-jingle-offer\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Special Offer - Sung Jingle - Radio Jingles 24: Radio Jingles | DJ Drops | Podcast Intros | Sung Jingles\" \/>\n<meta property=\"og:url\" content=\"https:\/\/radiojingles24.com\/de\/produkt\/sung-jingle-offer\/\" \/>\n<meta property=\"og:site_name\" content=\"Radio Jingles 24: Radio Jingles | DJ Drops | Podcast Intros | Sung Jingles\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/radiojingles24\/\" \/>\n<meta property=\"article:modified_time\" content=\"2026-09-08T08:44:22+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/radiojingles24.com\/wp-content\/uploads\/2019\/11\/7Asset-1.png\" \/>\n\t<meta property=\"og:image:width\" content=\"492\" \/>\n\t<meta property=\"og:image:height\" content=\"492\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@radiojingles24\" \/>\n<meta name=\"twitter:label1\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data1\" content=\"1\u00a0Minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/radiojingles24.com\\\/product\\\/sung-jingle-offer\\\/\",\"url\":\"https:\\\/\\\/radiojingles24.com\\\/product\\\/sung-jingle-offer\\\/\",\"name\":\"Special Offer - Sung Jingle - Radio Jingles 24: Radio Jingles | DJ Drops | Podcast Intros | Sung Jingles\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/radiojingles24.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/radiojingles24.com\\\/product\\\/sung-jingle-offer\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/radiojingles24.com\\\/product\\\/sung-jingle-offer\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/radiojingles24.com\\\/wp-content\\\/uploads\\\/2019\\\/11\\\/7Asset-1.png\",\"datePublished\":\"2024-03-24T16:19:01+00:00\",\"dateModified\":\"2026-09-08T08:44:22+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/radiojingles24.com\\\/product\\\/sung-jingle-offer\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/radiojingles24.com\\\/product\\\/sung-jingle-offer\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/radiojingles24.com\\\/product\\\/sung-jingle-offer\\\/#primaryimage\",\"url\":\"https:\\\/\\\/radiojingles24.com\\\/wp-content\\\/uploads\\\/2019\\\/11\\\/7Asset-1.png\",\"contentUrl\":\"https:\\\/\\\/radiojingles24.com\\\/wp-content\\\/uploads\\\/2019\\\/11\\\/7Asset-1.png\",\"width\":492,\"height\":492},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/radiojingles24.com\\\/product\\\/sung-jingle-offer\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/radiojingles24.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Shop\",\"item\":\"https:\\\/\\\/radiojingles24.com\\\/es\\\/shop\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Special Offer &#8211; Sung Jingle\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/radiojingles24.com\\\/#website\",\"url\":\"https:\\\/\\\/radiojingles24.com\\\/\",\"name\":\"Radio Jingles 24: Radio Jingles | DJ Drops | Podcast Intros | Sung Jingles\",\"description\":\"Radio Jingles, Sung Jingles, DJ Drops, and Podcast Intros for commercial, community and internet radio stations. UK Based. Prices from \u00a35. Order online.\",\"publisher\":{\"@id\":\"https:\\\/\\\/radiojingles24.com\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/radiojingles24.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/radiojingles24.com\\\/#organization\",\"name\":\"Radio Jingles 24\",\"url\":\"https:\\\/\\\/radiojingles24.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/radiojingles24.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/radiojingles24.com\\\/wp-content\\\/uploads\\\/2019\\\/11\\\/RadioJingle1-1.jpg\",\"contentUrl\":\"https:\\\/\\\/radiojingles24.com\\\/wp-content\\\/uploads\\\/2019\\\/11\\\/RadioJingle1-1.jpg\",\"width\":512,\"height\":158,\"caption\":\"Radio Jingles 24\"},\"image\":{\"@id\":\"https:\\\/\\\/radiojingles24.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/radiojingles24\\\/\",\"https:\\\/\\\/x.com\\\/radiojingles24\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Special Offer - Sung Jingle - Radio Jingles 24: Radio Jingles | DJ Drops | Podcast Intros | Sung Jingles","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/radiojingles24.com\/de\/produkt\/sung-jingle-offer\/","og_locale":"de_DE","og_type":"article","og_title":"Special Offer - Sung Jingle - Radio Jingles 24: Radio Jingles | DJ Drops | Podcast Intros | Sung Jingles","og_url":"https:\/\/radiojingles24.com\/de\/produkt\/sung-jingle-offer\/","og_site_name":"Radio Jingles 24: Radio Jingles | DJ Drops | Podcast Intros | Sung Jingles","article_publisher":"https:\/\/www.facebook.com\/radiojingles24\/","article_modified_time":"2026-09-08T08:44:22+00:00","og_image":[{"width":492,"height":492,"url":"https:\/\/radiojingles24.com\/wp-content\/uploads\/2019\/11\/7Asset-1.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_site":"@radiojingles24","twitter_misc":{"Gesch\u00e4tzte Lesezeit":"1\u00a0Minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/radiojingles24.com\/product\/sung-jingle-offer\/","url":"https:\/\/radiojingles24.com\/product\/sung-jingle-offer\/","name":"Special Offer - Sung Jingle - Radio Jingles 24: Radio Jingles | DJ Drops | Podcast Intros | Sung Jingles","isPartOf":{"@id":"https:\/\/radiojingles24.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/radiojingles24.com\/product\/sung-jingle-offer\/#primaryimage"},"image":{"@id":"https:\/\/radiojingles24.com\/product\/sung-jingle-offer\/#primaryimage"},"thumbnailUrl":"https:\/\/radiojingles24.com\/wp-content\/uploads\/2019\/11\/7Asset-1.png","datePublished":"2024-03-24T16:19:01+00:00","dateModified":"2026-09-08T08:44:22+00:00","breadcrumb":{"@id":"https:\/\/radiojingles24.com\/product\/sung-jingle-offer\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/radiojingles24.com\/product\/sung-jingle-offer\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/radiojingles24.com\/product\/sung-jingle-offer\/#primaryimage","url":"https:\/\/radiojingles24.com\/wp-content\/uploads\/2019\/11\/7Asset-1.png","contentUrl":"https:\/\/radiojingles24.com\/wp-content\/uploads\/2019\/11\/7Asset-1.png","width":492,"height":492},{"@type":"BreadcrumbList","@id":"https:\/\/radiojingles24.com\/product\/sung-jingle-offer\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/radiojingles24.com\/"},{"@type":"ListItem","position":2,"name":"Shop","item":"https:\/\/radiojingles24.com\/es\/shop\/"},{"@type":"ListItem","position":3,"name":"Special Offer &#8211; Sung Jingle"}]},{"@type":"WebSite","@id":"https:\/\/radiojingles24.com\/#website","url":"https:\/\/radiojingles24.com\/","name":"Radio Jingles 24: Radio Jingles | DJ Drops | Podcast Intros | Gesungene Jingles","description":"Radio Jingles, Sung Jingles, DJ Drops und Podcast Intros f\u00fcr kommerzielle, Community- und Internetradiosender. In Gro\u00dfbritannien ans\u00e4ssig. Preise ab \u00a3 5. Online bestellen.","publisher":{"@id":"https:\/\/radiojingles24.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/radiojingles24.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/radiojingles24.com\/#organization","name":"Radio Jingles 24","url":"https:\/\/radiojingles24.com\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/radiojingles24.com\/#\/schema\/logo\/image\/","url":"https:\/\/radiojingles24.com\/wp-content\/uploads\/2019\/11\/RadioJingle1-1.jpg","contentUrl":"https:\/\/radiojingles24.com\/wp-content\/uploads\/2019\/11\/RadioJingle1-1.jpg","width":512,"height":158,"caption":"Radio Jingles 24"},"image":{"@id":"https:\/\/radiojingles24.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/radiojingles24\/","https:\/\/x.com\/radiojingles24"]}]}},"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/radiojingles24.com\/de\/wp-json\/wp\/v2\/product\/99978","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/radiojingles24.com\/de\/wp-json\/wp\/v2\/product"}],"about":[{"href":"https:\/\/radiojingles24.com\/de\/wp-json\/wp\/v2\/types\/product"}],"replies":[{"embeddable":true,"href":"https:\/\/radiojingles24.com\/de\/wp-json\/wp\/v2\/comments?post=99978"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/radiojingles24.com\/de\/wp-json\/wp\/v2\/media\/6045"}],"wp:attachment":[{"href":"https:\/\/radiojingles24.com\/de\/wp-json\/wp\/v2\/media?parent=99978"}],"wp:term":[{"taxonomy":"product_brand","embeddable":true,"href":"https:\/\/radiojingles24.com\/de\/wp-json\/wp\/v2\/product_brand?post=99978"},{"taxonomy":"product_cat","embeddable":true,"href":"https:\/\/radiojingles24.com\/de\/wp-json\/wp\/v2\/product_cat?post=99978"},{"taxonomy":"product_tag","embeddable":true,"href":"https:\/\/radiojingles24.com\/de\/wp-json\/wp\/v2\/product_tag?post=99978"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}