Marketing Workflow — King Jesus Ministry King Jesus International Ministry EN ES <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>KJM Source Code Builder</title> <style> /* ── Design tokens ───────────────────────────────────────────────── */ :root{ --navy: #0B1929; --navy2: #152D4A; --navy3: #1E4070; --gold: #C9962A; --gold-lt: #F0C860; --gold-bg: rgba(201,150,42,.09); --gold-bd: rgba(201,150,42,.3); --white: #FFFFFF; --off: #F6F8FC; --surf: #EEF2F8; --border: #DDE3ED; --text: #0F1E30; --text2: #4A5568; --text3: #8A9BB0; --green: #059669; --green-lt:#ECFDF5; --green-bd:rgba(5,150,105,.2); --radius: 10px; --radius-sm:7px; --mono: 'Courier New',monospace; --trans: .16s cubic-bezier(.4,0,.2,1); --sidebar: 220px; } *{box-sizing:border-box;margin:0;padding:0;} html,body{height:100%;font-family:'Segoe UI',system-ui,-apple-system,sans-serif;background:var(--off);color:var(--text);font-size:14px;} /* ── App shell ────────────────────────────────────────────────────── */ .app{display:flex;height:100vh;height:100dvh;min-width:0;overflow:hidden;} /* ── Sidebar ─────────────────────────────────────────────────────── */ .sidebar{ width:var(--sidebar);flex-shrink:0; background:var(--navy); display:flex;flex-direction:column; height:100vh;overflow:hidden; position:relative;z-index:100; } .sb-brand{padding:20px 18px 16px;border-bottom:1px solid rgba(255,255,255,.07);} .sb-mark{width:36px;height:36px;background:var(--gold);border-radius:8px;display:flex;align-items:center;justify-content:center;font-weight:900;font-size:13px;color:var(--navy);letter-spacing:-.5px;margin-bottom:10px;} .sb-title{color:#fff;font-size:13px;font-weight:700;line-height:1.2;} .sb-sub{color:rgba(255,255,255,.4);font-size:10px;margin-top:2px;} .sb-nav{flex:1;padding:12px 10px;display:flex;flex-direction:column;gap:2px;overflow-y:auto;} .sb-item{ display:flex;align-items:center;gap:10px; padding:9px 10px;border-radius:var(--radius-sm); cursor:pointer;transition:all var(--trans); color:rgba(255,255,255,.55);border:none;background:none; font-family:inherit;font-size:13px;font-weight:500; text-align:left;width:100%; } .sb-item:hover{background:rgba(255,255,255,.07);color:rgba(255,255,255,.85);} .sb-item.active{background:rgba(201,150,42,.15);color:var(--gold-lt);border-right:2px solid var(--gold);} .sb-icon{font-size:16px;width:20px;text-align:center;flex-shrink:0;} .sb-divider{height:1px;background:rgba(255,255,255,.07);margin:8px 10px;} .sb-section-label{font-size:10px;font-weight:700;letter-spacing:.08em;color:rgba(255,255,255,.25);text-transform:uppercase;padding:6px 10px 2px;} .sb-bottom{padding:12px 10px;border-top:1px solid rgba(255,255,255,.07);} .sb-badge{background:rgba(201,150,42,.15);border:1px solid var(--gold-bd);color:var(--gold-lt);font-size:10px;padding:3px 8px;border-radius:20px;letter-spacing:.04em;display:inline-block;margin-top:6px;} /* ── Main content ────────────────────────────────────────────────── */ .main{flex:1 1 auto;min-width:0;min-height:0;overflow:hidden;display:flex;flex-direction:column;} /* Page header */ .page-header{ background:var(--white);border-bottom:1px solid var(--border); padding:14px 28px;display:flex;align-items:center;justify-content:space-between; flex-shrink:0; } .page-header-left{display:flex;align-items:center;gap:12px;} .page-title{font-size:16px;font-weight:700;color:var(--text);} .page-sub{font-size:12px;color:var(--text3);margin-top:1px;} .page-actions{display:flex;gap:8px;align-items:center;} /* Page body */ .page-body{flex:1 1 auto;min-width:0;min-height:0;overflow-y:auto;overflow-x:hidden;padding:24px 28px;} /* ── Section visibility ───────────────────────────────────────────── */ .section{display:none;min-width:0;min-height:0;} .section.active{display:flex;flex:1 1 auto;min-width:0;min-height:0;flex-direction:column;} /* ══════════════════════════════════════════════════════════════════ BUILDER SECTION ════════════════════════════════════════════════════════════════════ */ .builder-grid{display:grid;grid-template-columns:minmax(0,1fr) minmax(280px,300px);gap:20px;align-items:start;width:100%;min-width:0;} .builder-grid>div{min-width:0;} /* Progress */ .progress-card{background:var(--white);border:1px solid var(--border);border-radius:var(--radius);padding:14px 18px;margin-bottom:16px;} .progress-top{display:flex;justify-content:space-between;margin-bottom:8px;} .progress-top span{font-size:12px;font-weight:600;color:var(--text3);} .progress-top strong{font-size:12px;font-weight:700;color:var(--navy);} .progress-track{height:5px;background:var(--surf);border-radius:3px;overflow:hidden;} .progress-fill{height:100%;background:linear-gradient(90deg,var(--navy2),var(--gold));border-radius:3px;transition:width .4s cubic-bezier(.4,0,.2,1);} /* Step cards */ .step-card{background:var(--white);border:1px solid var(--border);border-radius:var(--radius);overflow:hidden;margin-bottom:10px;} .step-hdr{padding:13px 18px;display:flex;align-items:center;gap:12px;border-bottom:1px solid var(--surf);} .step-num{width:26px;height:26px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:800;flex-shrink:0;} .step-num.done{background:var(--green);color:#fff;} .step-num.active{background:var(--navy);color:var(--gold);} .step-num.pending{background:var(--surf);color:var(--text3);} .step-title{font-size:13px;font-weight:700;color:var(--text);} .step-hint{font-size:11px;color:var(--text3);margin-top:1px;} .step-body{padding:14px 18px;} .step-done-badge{background:var(--green-lt);border:1px solid var(--green-bd);border-radius:6px;padding:7px 11px;font-size:12px;color:var(--green);font-weight:600;display:flex;align-items:center;gap:8px;margin-bottom:10px;} .step-done-badge span{font-family:var(--mono);font-size:11px;background:rgba(5,150,105,.1);padding:1px 6px;border-radius:4px;} /* Option grid */ .opt-grid{display:grid;gap:7px;} .opt-grid.c2{grid-template-columns:1fr 1fr;} .opt-grid.c3{grid-template-columns:1fr 1fr 1fr;} .opt-grid.c4{grid-template-columns:1fr 1fr 1fr 1fr;} .opt-grid.c6{grid-template-columns:repeat(6,1fr);} .opt{ background:var(--off);border:1.5px solid var(--border);border-radius:9px; padding:10px 12px;cursor:pointer;text-align:left; transition:all var(--trans);display:flex;flex-direction:column;gap:3px; font-family:inherit; } .opt:hover{border-color:var(--gold);background:var(--gold-bg);transform:translateY(-1px);box-shadow:0 2px 8px rgba(201,150,42,.1);} .opt.sel{border-color:var(--gold);background:var(--gold-bg);box-shadow:0 0 0 3px rgba(201,150,42,.12);} .opt.sel .opt-code{color:var(--gold);} .opt-code{font-family:var(--mono);font-size:13px;font-weight:800;color:var(--navy);letter-spacing:.03em;} .opt-lbl{font-size:12px;color:var(--text2);font-weight:500;line-height:1.3;} .opt-desc{font-size:10px;color:var(--text3);line-height:1.3;margin-top:1px;} /* Month grid */ .month-grid{display:grid;grid-template-columns:repeat(6,1fr);gap:6px;} /* Number stepper */ .stepper{display:flex;align-items:center;gap:14px;} .stepper-btn{width:34px;height:34px;border-radius:8px;border:1.5px solid var(--border);background:var(--off);font-size:18px;cursor:pointer;transition:all var(--trans);color:var(--navy);font-family:inherit;} .stepper-btn:hover{border-color:var(--gold);background:var(--gold-bg);} .stepper-val{font-family:var(--mono);font-size:22px;font-weight:900;color:var(--navy);min-width:36px;text-align:center;} /* Next btn */ .next-btn{margin-top:12px;width:100%;padding:11px;background:var(--navy);color:#fff;border:none;border-radius:9px;font-size:13px;font-weight:700;cursor:pointer;transition:all var(--trans);font-family:inherit;} .next-btn:hover{background:var(--navy2);} .next-btn:disabled{background:var(--surf);color:var(--text3);cursor:not-allowed;} /* Internal channels toggle */ .int-toggle{background:none;border:none;color:var(--text3);font-size:11px;cursor:pointer;padding:6px 0;font-family:inherit;text-align:left;margin-top:8px;transition:color var(--trans);} .int-toggle:hover{color:var(--text2);} /* ── Right panel ─────────────────────────────────────────────────── */ .right-col{display:flex;flex-direction:column;gap:14px;position:sticky;top:0;min-width:0;max-width:100%;} /* Live code card */ .code-card{background:var(--navy);border-radius:var(--radius);overflow:hidden;} .code-gold-bar{height:3px;background:linear-gradient(90deg,var(--gold),var(--gold-lt),var(--gold));} .code-hdr{padding:11px 16px;display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid rgba(255,255,255,.07);} .code-hdr-label{color:rgba(255,255,255,.5);font-size:10px;font-weight:700;letter-spacing:.07em;} .copy-btn{background:rgba(201,150,42,.2);border:1px solid var(--gold-bd);color:var(--gold-lt);font-size:11px;padding:4px 11px;border-radius:6px;cursor:pointer;transition:all var(--trans);font-family:inherit;} .copy-btn:hover{background:rgba(201,150,42,.35);} .code-body{padding:20px 16px;text-align:center;} .code-string{font-family:var(--mono);font-size:22px;font-weight:900;color:#fff;letter-spacing:.1em;word-break:break-all;line-height:1.35;min-height:32px;} .code-empty{color:rgba(255,255,255,.2);font-size:12px;padding:8px 0;} .code-chars{display:flex;flex-wrap:wrap;gap:4px;justify-content:center;margin-top:12px;} .char-blk{background:rgba(201,150,42,.12);border:1px solid rgba(201,150,42,.3);border-radius:5px;padding:4px 7px;display:flex;flex-direction:column;align-items:center;gap:1px;min-width:34px;} .char-val{font-family:var(--mono);font-size:12px;font-weight:800;color:var(--gold-lt);} .char-lbl{font-size:9px;color:rgba(255,255,255,.35);text-transform:uppercase;letter-spacing:.04em;} /* Breakdown */ .bk-card{background:var(--white);border:1px solid var(--border);border-radius:var(--radius);overflow:hidden;} .bk-hdr{padding:9px 14px;border-bottom:1px solid var(--surf);font-size:10px;font-weight:700;letter-spacing:.07em;color:var(--text3);text-transform:uppercase;} .bk-row{display:flex;justify-content:space-between;align-items:center;padding:7px 14px;border-bottom:1px solid var(--surf);} .bk-row:last-child{border-bottom:none;} .bk-key{font-size:11px;color:var(--text3);} .bk-val{font-family:var(--mono);font-size:11px;font-weight:700;color:var(--navy);} /* Action buttons */ .action-card{background:var(--white);border:1px solid var(--border);border-radius:var(--radius);padding:12px;} .btn-gen{width:100%;padding:10px;background:var(--green);color:#fff;border:none;border-radius:8px;font-size:13px;font-weight:700;cursor:pointer;transition:all var(--trans);font-family:inherit;margin-bottom:7px;} .btn-gen:hover{background:#047857;} .btn-gen:disabled{background:var(--surf);color:var(--text3);cursor:not-allowed;} .btn-reset{width:100%;padding:9px;background:var(--off);border:1.5px solid var(--border);border-radius:8px;font-size:12px;color:var(--text2);cursor:pointer;font-family:inherit;transition:all var(--trans);} .btn-reset:hover{border-color:var(--text3);color:var(--text);} /* History panel */ .hist-card{background:var(--white);border:1px solid var(--border);border-radius:var(--radius);overflow:hidden;} .hist-hdr{padding:9px 14px;border-bottom:1px solid var(--surf);display:flex;justify-content:space-between;align-items:center;} .hist-hdr span{font-size:10px;font-weight:700;letter-spacing:.07em;color:var(--text3);text-transform:uppercase;} .hist-hdr button{background:none;border:none;font-size:10px;color:var(--text3);cursor:pointer;font-family:inherit;} .hist-hdr button:hover{color:var(--text2);} .hist-item{display:flex;align-items:center;gap:10px;padding:8px 14px;border-bottom:1px solid var(--surf);} .hist-item:last-child{border-bottom:none;} .hist-code{font-family:var(--mono);font-size:12px;font-weight:800;color:var(--navy);flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;} .hist-meta{font-size:10px;color:var(--text3);margin-top:1px;} .hist-copy{background:var(--off);border:1px solid var(--border);border-radius:5px;padding:3px 8px;font-size:10px;color:var(--text2);cursor:pointer;font-family:inherit;white-space:nowrap;flex-shrink:0;} .hist-copy:hover{border-color:var(--gold);color:var(--gold);} .hist-empty{padding:10px 14px;font-size:12px;color:var(--text3);} /* ══════════════════════════════════════════════════════════════════ REFERENCE SECTION ════════════════════════════════════════════════════════════════════ */ .ref-search{background:var(--white);border:1.5px solid var(--border);border-radius:var(--radius);padding:10px 16px;width:100%;font-size:14px;font-family:inherit;color:var(--text);outline:none;margin-bottom:20px;transition:border-color var(--trans);} .ref-search:focus{border-color:var(--gold);} .ref-search::placeholder{color:var(--text3);} .ref-tabs{display:flex;gap:0;border-bottom:2px solid var(--border);margin-bottom:24px;} .ref-tab{padding:9px 18px;font-size:13px;font-weight:600;color:var(--text3);cursor:pointer;border-bottom:2px solid transparent;margin-bottom:-2px;transition:all var(--trans);background:none;border-left:none;border-right:none;border-top:none;font-family:inherit;} .ref-tab:hover{color:var(--text2);} .ref-tab.active{color:var(--gold);border-bottom-color:var(--gold);} .ref-panel{display:none;} .ref-panel.active{display:block;} .ref-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:12px;} .ref-card{background:var(--white);border:1px solid var(--border);border-radius:var(--radius);padding:14px 16px;transition:all var(--trans);cursor:default;} .ref-card:hover{border-color:var(--gold-bd);box-shadow:0 2px 12px rgba(201,150,42,.08);} .ref-card-code{font-family:var(--mono);font-size:18px;font-weight:900;color:var(--navy);letter-spacing:.04em;margin-bottom:4px;} .ref-card-name{font-size:13px;font-weight:600;color:var(--text);margin-bottom:3px;} .ref-card-desc{font-size:11px;color:var(--text3);line-height:1.5;} .ref-card-fmt{font-family:var(--mono);font-size:10px;color:var(--text3);margin-top:6px;padding-top:6px;border-top:1px solid var(--surf);word-break:break-all;} .ref-card.highlight .ref-card-code{color:var(--gold);} .ref-table{width:100%;border-collapse:collapse;background:var(--white);border-radius:var(--radius);overflow:hidden;border:1px solid var(--border);} .ref-table th{background:var(--navy);color:rgba(255,255,255,.7);font-size:11px;font-weight:700;letter-spacing:.06em;padding:10px 16px;text-align:left;} .ref-table td{padding:9px 16px;border-bottom:1px solid var(--surf);font-size:13px;vertical-align:top;} .ref-table tr:last-child td{border-bottom:none;} .ref-table tr:hover td{background:var(--off);} .ref-table td:first-child{font-family:var(--mono);font-weight:800;color:var(--navy);font-size:14px;} .ref-tag{display:inline-block;background:var(--surf);color:var(--text3);font-size:10px;padding:2px 7px;border-radius:4px;margin-right:3px;font-weight:500;} .ref-tag.gold{background:var(--gold-bg);color:var(--gold);border:1px solid var(--gold-bd);} /* ══════════════════════════════════════════════════════════════════ HISTORY SECTION (full page) ════════════════════════════════════════════════════════════════════ */ .hist-full-empty{background:var(--white);border:1px solid var(--border);border-radius:var(--radius);padding:40px;text-align:center;color:var(--text3);} .hist-full-empty p{font-size:14px;margin-top:8px;} .hist-table{width:100%;border-collapse:collapse;background:var(--white);border-radius:var(--radius);overflow:hidden;border:1px solid var(--border);} .hist-table th{background:var(--navy);color:rgba(255,255,255,.7);font-size:11px;font-weight:700;letter-spacing:.06em;padding:10px 16px;text-align:left;} .hist-table td{padding:10px 16px;border-bottom:1px solid var(--surf);font-size:13px;vertical-align:middle;} .hist-table tr:last-child td{border-bottom:none;} .hist-table tr:hover td{background:var(--off);} .hist-table td:first-child{font-family:var(--mono);font-weight:900;font-size:15px;color:var(--navy);letter-spacing:.06em;} .hist-full-copy{background:var(--off);border:1.5px solid var(--border);border-radius:7px;padding:5px 12px;font-size:11px;color:var(--text2);cursor:pointer;font-family:inherit;transition:all var(--trans);} .hist-full-copy:hover{border-color:var(--gold);color:var(--gold);} .hist-full-clear{background:none;border:1.5px solid var(--border);border-radius:8px;padding:8px 16px;font-size:12px;color:var(--text2);cursor:pointer;font-family:inherit;transition:all var(--trans);} .hist-full-clear:hover{border-color:var(--text3);} /* ── Toast ────────────────────────────────────────────────────────── */ .toast{position:fixed;bottom:22px;left:50%;transform:translateX(-50%) translateY(60px);background:var(--navy);color:#fff;padding:9px 18px;border-radius:24px;font-size:12px;font-weight:600;border:1px solid var(--gold-bd);transition:transform .28s cubic-bezier(.4,0,.2,1);z-index:999;pointer-events:none;white-space:nowrap;} .toast.show{transform:translateX(-50%) translateY(0);} /* ── Responsive ────────────────────────────────────────────────────── */ @media(max-width:1024px){ .sidebar{width:60px;} .sb-title,.sb-sub,.sb-badge,.sb-section-label{display:none;} .sb-item{justify-content:center;padding:10px;} .sb-item span:not(.sb-icon){display:none;} .sb-brand{padding:14px 12px;} .sb-mark{margin:0 auto;} .builder-grid{grid-template-columns:1fr;} .right-col{position:static;} .page-body{padding:16px;} } @media(max-width:600px){ .opt-grid.c4,.opt-grid.c3{grid-template-columns:1fr 1fr;} .month-grid{grid-template-columns:repeat(4,1fr);} .ref-grid{grid-template-columns:1fr 1fr;} } /* ── Add New custom code ─────────────────────────────────────────── */ .add-new-btn{ margin-top:10px;width:100%;padding:9px 14px; background:none;border:1.5px dashed var(--border);border-radius:9px; font-size:12px;font-weight:600;color:var(--text3);cursor:pointer; font-family:inherit;transition:all var(--trans);text-align:center; display:flex;align-items:center;justify-content:center;gap:6px; } .add-new-btn:hover{border-color:var(--gold);color:var(--gold);background:var(--gold-bg);} .add-new-form{ margin-top:10px;padding:14px; background:var(--off);border:1.5px solid var(--gold-bd); border-radius:var(--radius);display:none;flex-direction:column;gap:10px; } .add-new-form.open{display:flex;} .add-new-form label{font-size:11px;font-weight:700;color:var(--text3);letter-spacing:.04em;text-transform:uppercase;margin-bottom:2px;display:block;} .add-new-inp{ width:100%;padding:8px 12px;border:1.5px solid var(--border);border-radius:8px; font-size:13px;font-family:inherit;color:var(--text);background:var(--white);outline:none; transition:border-color var(--trans); } .add-new-inp:focus{border-color:var(--gold);} .add-new-inp.code-inp{ font-family:var(--mono);font-size:16px;font-weight:900;color:var(--navy); text-transform:uppercase;letter-spacing:.1em;max-width:100px; } .add-new-row{display:flex;gap:8px;align-items:flex-end;} .add-new-row .add-new-inp{flex:1;} .add-new-save{ padding:9px 16px;background:var(--navy);color:#fff;border:none; border-radius:8px;font-size:12px;font-weight:700;cursor:pointer; font-family:inherit;transition:all var(--trans);white-space:nowrap;flex-shrink:0; } .add-new-save:hover{background:var(--navy2);} .add-new-cancel{ padding:9px 12px;background:none;border:1.5px solid var(--border); border-radius:8px;font-size:12px;color:var(--text3);cursor:pointer; font-family:inherit;transition:all var(--trans);flex-shrink:0; } .add-new-cancel:hover{border-color:var(--text3);color:var(--text2);} .add-new-hint{font-size:11px;color:var(--text3);margin-top:2px;} .custom-badge{display:inline-block;background:var(--gold-bg);border:1px solid var(--gold-bd);color:var(--gold);font-size:9px;font-weight:700;padding:1px 5px;border-radius:4px;margin-left:4px;vertical-align:middle;letter-spacing:.04em;} .add-new-err{font-size:11px;color:#DC2626;margin-top:2px;display:none;} .custom-wrap{margin:4px 0 10px;} .custom-input{width:100%;max-width:340px;padding:12px 14px;border:2px solid var(--border);border-radius:var(--radius); font-family:'SF Mono',Menlo,Consolas,monospace;font-size:15px;letter-spacing:1px;text-transform:uppercase;} .custom-input:focus{outline:none;border-color:var(--gold);} </style> <!-- ═══ KJM override (presentation + browser compatibility) ═══════════ Colors and layout only. No generation logic is touched. --> <style> :root{ --navy:#08304F; --navy2:#0A5387; --navy3:#0070BA; --gold:#0070BA; --gold-lt:#4FA3DB; --gold-bg:rgba(0,112,186,.10); --gold-bd:rgba(0,112,186,.32); } .sb-mark{background:#fff url("data:image/png;base64,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") center/86% no-repeat;font-size:0;} .app,.sidebar{height:100vh;height:100dvh;} .opt-grid{max-height:min(44vh,400px);overflow-y:auto;padding:2px 6px 2px 2px; overscroll-behavior:contain;-webkit-overflow-scrolling:touch;scrollbar-width:thin;} .add-new-btn{margin-top:10px;} .page-body{-webkit-overflow-scrolling:touch;overscroll-behavior:contain;} ::-webkit-scrollbar{width:11px;height:11px} ::-webkit-scrollbar-track{background:rgba(11,32,51,.06)} ::-webkit-scrollbar-thumb{background:rgba(0,112,186,.45);border-radius:6px;border:2px solid transparent;background-clip:padding-box} ::-webkit-scrollbar-thumb:hover{background:rgba(0,112,186,.72);background-clip:padding-box} </style> <script> /* navigator.clipboard is undefined outside a secure context and blocked inside iframes without clipboard-write. Fall back to execCommand. */ (function(){ function legacy(text){ return new Promise(function(res,rej){ try{ var ta=document.createElement('textarea'); ta.value=text; ta.setAttribute('readonly',''); ta.style.cssText='position:fixed;top:0;left:-9999px;opacity:0'; document.body.appendChild(ta); ta.select(); ta.setSelectionRange(0, ta.value.length); var ok=document.execCommand('copy'); document.body.removeChild(ta); ok ? res() : rej(new Error('copy blocked')); }catch(e){ rej(e); } }); } var native = (navigator.clipboard && navigator.clipboard.writeText) ? navigator.clipboard.writeText.bind(navigator.clipboard) : null; var api = { writeText: function(t){ if(!native) return legacy(t); return native(t)['catch'](function(){ return legacy(t); }); }}; try{ Object.defineProperty(navigator,'clipboard',{value:api,configurable:true}); } catch(e){ try{ navigator.clipboard = api; }catch(_){} } })(); </script> <style> /* ═══ KJM mobile pass ══════════════════════════════════════════════ */ /* iOS Safari zooms the whole page when a focused input is under 16px. */ @media (max-width:760px){ input,select,textarea{font-size:16px !important;} } .custom-input{font-size:16px;} /* Long codes must wrap instead of pushing the layout sideways. */ .code-chars{word-break:break-all;} .code-out,.code-value,.code-display{word-break:break-all;overflow-wrap:anywhere;} @media (max-width:600px){ .page-body{padding:16px 13px;} .ref-grid{grid-template-columns:1fr;} .toast{max-width:calc(100vw - 28px);white-space:normal;text-align:center;line-height:1.35;} .right-col{position:static;} } /* At phone width, option cards get the full row so labels stay legible. */ @media (max-width:440px){ .sidebar{width:52px;} .opt-grid.c2,.opt-grid.c3,.opt-grid.c4{grid-template-columns:1fr;} .month-grid{grid-template-columns:repeat(3,1fr);} .page-body{padding:14px 11px;} .opt-grid{max-height:52vh;} } /* Touch targets: nothing tappable under 44px. */ @media (pointer:coarse){ .opt{min-height:58px;} .sb-item{min-height:46px;} .stepper-btn{min-width:46px;min-height:46px;} .next-btn,.add-new-btn{min-height:46px;} } </style> </head> <body> <div class="app"> <!-- ── Sidebar ──────────────────────────────────────────────── --> <div class="sidebar"> <div class="sb-brand"> <div class="sb-mark">KJM</div> <div class="sb-title">Source Code Builder</div> <div class="sb-sub">Salesforce Attribution · v9.0</div> </div> <nav class="sb-nav"> <div class="sb-section-label">Tools</div> <button class="sb-item active" onclick="nav('builder')" id="nav-builder"> <span class="sb-icon">🏗️</span><span>Builder</span> </button> <button class="sb-item" onclick="nav('reference')" id="nav-reference"> <span class="sb-icon">📖</span><span>Reference</span> </button> <button class="sb-item" onclick="nav('history')" id="nav-history"> <span class="sb-icon">🕐</span><span>History</span> </button> <div class="sb-divider"></div> <div class="sb-section-label">Session</div> <button class="sb-item" onclick="resetAll()"> <span class="sb-icon">↺</span><span>Start Over</span> </button> </nav> <div class="sb-bottom"> <div class="sb-badge">SALESFORCE READY</div> <div style="margin-top:10px;font-size:10px;color:rgba(255,255,255,.25);line-height:1.6;"> Built by <span style="color:rgba(255,255,255,.5);font-weight:600;">Jose Urbina</span><br> King Jesus Marketing Team </div> </div> </div> <!-- ── Main ─────────────────────────────────────────────────── --> <div class="main"> <!-- ── BUILDER ── --> <div class="section active" id="section-builder"> <div class="page-header"> <div class="page-header-left"> <div> <div class="page-title">Code Builder</div> <div class="page-sub">Select your options — your Salesforce source code builds automatically</div> </div> </div> <div class="page-actions"> <button class="copy-btn" onclick="copyCode()" style="padding:7px 14px;font-size:12px;">Copy Code</button> </div> </div> <div class="page-body"> <div class="builder-grid"> <div> <div class="progress-card"> <div class="progress-top"> <span id="progressLabel">Step 1 of 2</span> <strong id="progressPct">0%</strong> </div> <div class="progress-track"><div class="progress-fill" id="progressFill" style="width:0%"></div></div> </div> <div id="stepsContainer"></div> </div> <div class="right-col"> <!-- Live code --> <div class="code-card"> <div class="code-gold-bar"></div> <div class="code-hdr"> <span class="code-hdr-label">SOURCE CODE</span> <button class="copy-btn" onclick="copyCode()">Copy</button> </div> <div class="code-body"> <div class="code-string" id="codeString"><span class="code-empty">Select options →</span></div> <div class="code-chars" id="codeChars"></div> </div> </div> <!-- Breakdown --> <div class="bk-card" id="breakdownCard" style="display:none;"> <div class="bk-hdr">Breakdown</div> <div id="breakdownRows"></div> </div> <!-- Actions --> <div class="action-card"> <button class="btn-gen" id="generateBtn" onclick="generateCode()" disabled>✓ Generate & Save Code</button> <button class="btn-reset" onclick="resetAll()">↺ Start Over</button> </div> <!-- Session history (mini) --> <div class="hist-card"> <div class="hist-hdr"> <span>Recent Codes</span> <button onclick="clearHistory()">Clear</button> </div> <div id="miniHistory"><div class="hist-empty">No codes yet.</div></div> </div> </div> </div> </div> </div> <!-- ── REFERENCE ── --> <div class="section" id="section-reference"> <div class="page-header"> <div> <div class="page-title">Code Reference</div> <div class="page-sub">Browse all channels, audiences, campaigns, and language codes</div> </div> </div> <div class="page-body"> <input class="ref-search" type="text" placeholder="Search codes, names, or descriptions…" oninput="filterRef(this.value)" id="refSearch"> <div class="ref-tabs"> <button class="ref-tab active" onclick="refTab('channels')">Channels (18)</button> <button class="ref-tab" onclick="refTab('audiences')">Audiences (16)</button> <button class="ref-tab" onclick="refTab('campaigns')">Campaigns (34)</button> <button class="ref-tab" onclick="refTab('languages')">Languages</button> </div> <div class="ref-panel active" id="ref-channels"><div class="ref-grid" id="ref-channels-grid"></div></div> <div class="ref-panel" id="ref-audiences"><table class="ref-table" id="ref-audiences-table"></table></div> <div class="ref-panel" id="ref-campaigns"><table class="ref-table" id="ref-campaigns-table"></table></div> <div class="ref-panel" id="ref-languages"><div class="ref-grid" id="ref-languages-grid"></div></div> </div> </div> <!-- ── HISTORY ── --> <div class="section" id="section-history"> <div class="page-header"> <div> <div class="page-title">Code History</div> <div class="page-sub">All codes generated this session</div> </div> <div class="page-actions"> <button class="hist-full-clear" onclick="clearHistory()">Clear All</button> </div> </div> <div class="page-body"> <div id="historyFull"></div> </div> </div> </div><!-- /main --> </div><!-- /app --> <div class="toast" id="toast"></div> <script> // ══════════════════════════════════════════════════════════════════ // DATA // ══════════════════════════════════════════════════════════════════ const CHANNELS = [ {code:"E",label:"Email",desc:"Salesforce MC campaigns",fmt:"CCC_yymm_E·ff·AA·s·v·LG"}, {code:"S",label:"SMS",desc:"Text message campaigns",fmt:"CCC_yymm_S·ff·AA·s·v·LG"}, {code:"M",label:"Social Media",desc:"Facebook, Instagram, YouTube",fmt:"CCC_yymm_M·f·d·t·AC·LG"}, {code:"O",label:"Web / Online",desc:"Website transactions",fmt:"CCC_yymm_O·p·w·LG"}, {code:"V",label:"Event",desc:"Conferences, crusades, retreats",fmt:"CCC_yymm_V·t·nn·LG"}, {code:"C",label:"Church / In-Service",desc:"Sunday & Friday giving",fmt:"CCC_yymm_C·w·d·t·LG·g"}, {code:"P",label:"Phone / IVR",desc:"Call center, prayer line",fmt:"CCC_yymm_P·d·LG"}, {code:"T",label:"Television",desc:"Linear TV / DRTV",fmt:"CCC_yymm_T·n·d·LG"}, {code:"D",label:"Direct Mail",desc:"Physical mail campaigns",fmt:"CCC_yymm_D·n·p·LG"}, {code:"H",label:"Out-of-Home",desc:"Billboards & bus stops",fmt:"CCC_yymm_H·t·m·z·LG"}, {code:"A",label:"Radio / Audio",desc:"Christian + secular stations",fmt:"CCC_yymm_A·s·n·t·LG"}, {code:"Z",label:"Dark Social",desc:"WhatsApp peer-to-peer",fmt:"CCC_yymm_Z·t·LG"}, {code:"B",label:"Web Button / Hero",desc:"On-site CTA placements",fmt:"CCC_yymm_B·p·s·LG·a"}, {code:"F",label:"Giving Page",desc:"Online giving pages & forms",fmt:"CCC_yymm_F·p·g·LG"}, {code:"U",label:"Partners Website Upsale",desc:"Partner site upgrade & add-on offers",fmt:"CCC_yymm_U·p·o·LG"}, {code:"R",label:"Receipts",desc:"Donation batch receipts (internal)",fmt:"GNL_yymm_R·ff·d"}, {code:"G",label:"General / Other",desc:"Unattributed giving (internal)",fmt:"GNL_yymm_G·p"}, {code:"W",label:"White Mail",desc:"Mailed checks, no campaign (internal)",fmt:"GNL_yymm_W"}, ]; const CHANNELS_INTERNAL = ["R","G","W"]; const GIVE_PAGES=[ {code:"M",label:"Main Giving Page",desc:"Primary give page"}, {code:"P",label:"Partners Giving Page",desc:"Partner-specific give"}, {code:"E",label:"Event Giving Page",desc:"Conference or crusade"}, {code:"C",label:"Campaign Landing Page",desc:"Dedicated campaign LP"}, {code:"T",label:"Text-to-Give",desc:"SMS-driven give page"}, {code:"Q",label:"QR Landing Page",desc:"Scanned in-service or print"}, ]; const GIVE_TYPES=[ {code:"O",label:"One-Time",desc:"Single gift"}, {code:"R",label:"Recurring",desc:"Scheduled repeat gift"}, {code:"P",label:"Pledge",desc:"Commitment, billed later"}, {code:"F",label:"First Fruits",desc:"First fruits offering"}, {code:"T",label:"Tithe",desc:"Tithe giving"}, ]; const UPSALE_PLACEMENTS=[ {code:"H",label:"Homepage Hero",desc:"Top of partners site"}, {code:"D",label:"Partner Dashboard",desc:"Logged-in area"}, {code:"C",label:"Checkout / Confirm",desc:"Post-gift moment"}, {code:"M",label:"Member Portal",desc:"Account management"}, {code:"B",label:"Site Banner",desc:"Persistent banner"}, {code:"E",label:"Embedded Module",desc:"In-page block"}, ]; const UPSALE_OFFERS=[ {code:"U",label:"Tier Upgrade",desc:"Move to a higher level"}, {code:"A",label:"Add-On Gift",desc:"Extra gift on top"}, {code:"R",label:"Renewal",desc:"Continue a lapsing partnership"}, {code:"E",label:"Event Add-On",desc:"Event access or seat"}, {code:"P",label:"Product Bundle",desc:"Resource or book bundle"}, ]; const YEARS=[{code:"26",label:"2026"},{code:"27",label:"2027"},{code:"28",label:"2028"}]; const MONTHS=[ {code:"01",label:"Jan"},{code:"02",label:"Feb"},{code:"03",label:"Mar"}, {code:"04",label:"Apr"},{code:"05",label:"May"},{code:"06",label:"Jun"}, {code:"07",label:"Jul"},{code:"08",label:"Aug"},{code:"09",label:"Sep"}, {code:"10",label:"Oct"},{code:"11",label:"Nov"},{code:"12",label:"Dec"}, ]; const AUDIENCES=[ {code:"DN",label:"Donors",desc:"Given before, not recurring",channels:"Email, SMS"}, {code:"ND",label:"Non-Donors",desc:"Never given",channels:"Email, SMS"}, {code:"LC",label:"Local Church",desc:"KJM Miami members",channels:"Email, SMS"}, {code:"CG",label:"Church Government",desc:"Pastors & leaders",channels:"Email, SMS"}, {code:"HL",label:"HOP Leaders",desc:"House of Prayer",channels:"Email, SMS"}, {code:"MT",label:"Mentors",desc:"Apostolic network mentors",channels:"Email, SMS"}, {code:"US",label:"US Non-Local",desc:"Outside Miami, in USA",channels:"Email, SMS"}, {code:"IN",label:"International",desc:"Outside USA",channels:"Email, SMS"}, {code:"NV",label:"New Visitors",desc:"First-time campus visitors",channels:"Email, SMS"}, {code:"NB",label:"New Believers",desc:"Recently saved",channels:"Email, SMS"}, {code:"NW",label:"New Donors",desc:"First gift in last 90 days",channels:"Email, SMS"}, {code:"NP",label:"New Partners",desc:"Just enrolled as partner",channels:"Email, SMS"}, {code:"PT",label:"Partners (Established)",desc:"Recurring 90+ days",channels:"Email, SMS"}, {code:"LP",label:"Lapsed Partners",desc:"Former partners — win-back",channels:"Email, SMS, Direct Mail"}, {code:"LD",label:"Lapsed Donors",desc:"Not given in 12+ months",channels:"Email, SMS, Direct Mail"}, {code:"PE",label:"Past Event Attendees",desc:"Attended a past church event",channels:"Email, SMS"}, ]; const CAMPAIGNS=[ {code:"AGB",label:"AGM Book",desc:"Apostle Maldonado book release or promotion"}, {code:"AGP",label:"AGM Podcast",desc:"Apostle Maldonado podcast"}, {code:"BIB",label:"Bible School",desc:"Bible school enrollment & terms"}, {code:"BKP",label:"Bookstore In-Person",desc:"Physical store or event table"}, {code:"BKO",label:"Bookstore Online",desc:"Online store purchase"}, {code:"CAP",label:"CAP Conference",desc:"Oct 1–3, 2026"}, {code:"CHR",label:"Christmas Service",desc:"Dec 20, 2026"}, {code:"DDV",label:"Donor Development",desc:"Major donor cultivation"}, {code:"EVI",label:"Evangelism",desc:"Street, crusade & digital outreach"}, {code:"FAM",label:"Family",desc:"Family ministry & events"}, {code:"GNL",label:"General",desc:"No specific campaign"}, {code:"HRV",label:"Global Harvest",desc:"Global harvest outreach"}, {code:"HOL",label:"Holiday Services",desc:"Easter, July 4th & holiday weekend services"}, {code:"KID",label:"Kids Ministry",desc:"Children's ministry"}, {code:"KJU",label:"King Jesus University",desc:"KJU enrollment & programs"}, {code:"MRG",label:"Marriage Retreat",desc:"Nov 20–22, 2026"}, {code:"MEN",label:"Men's Ministry",desc:"Men's ministry & events"}, {code:"MRC",label:"Miracle Crusade",desc:"Oct 30–Nov 1, 2026"}, {code:"NWN",label:"New Wine",desc:"New Wine services & outreach"}, {code:"NYE",label:"New Year's Eve",desc:"Dec 31, 2026"}, {code:"PRT",label:"Partners",desc:"Partner acquisition & renewal"}, {code:"PRY",label:"Prayer Movement",desc:"Prayer line & intercession"}, {code:"SAL",label:"Sales",desc:"Product & resource sales promotion"}, {code:"SUN",label:"Sunday Service",desc:"Weekly Sunday service promotion"}, {code:"SGN",label:"Supernatural Global Network",desc:"SGN broadcast"}, {code:"SSS",label:"Supernatural School",desc:"School of the Spirit"}, {code:"THX",label:"Thanksgiving",desc:"November Thanksgiving service & outreach"}, {code:"VIS",label:"Vision",desc:"Annual vision & direction series"}, {code:"WLC",label:"Welcome / Onboarding",desc:"New visitor journey"}, {code:"WMN",label:"Women's Ministry",desc:"Women's ministry & events"}, {code:"EOY",label:"Year-End Giving",desc:"Nov–Dec fundraising"}, {code:"YTH",label:"Youth Conference",desc:"Annual youth event"}, {code:"YSV",label:"Youth Service",desc:"Weekly Friday youth service"}, {code:"YTB",label:"YouTube Growth",desc:"Channel growth across YouTube properties"}, ]; const LANGUAGES=[ {code:"EN",label:"English",desc:"KJM brand · kingjesus.org · 9AM Sunday"}, {code:"SP",label:"Spanish",desc:"ERJ brand · elreyjesus.org · 11AM Sunday"}, {code:"BI",label:"Bilingual",desc:"6PM Supernatural Nights only"}, ]; const SEND_TYPES=[{code:"S",label:"Initial Send",desc:"First time sending"},{code:"R",label:"Resend",desc:"Non-openers"},{code:"T",label:"Test Send",desc:"Internal test"}]; const VERSIONS=[{code:"1",label:"Version 1",desc:"No A/B test"},{code:"2",label:"Version B",desc:"A/B variant B"},{code:"3",label:"Version C",desc:"A/B variant C"}]; const PLATFORMS=[{code:"Y",label:"YouTube",desc:""},{code:"I",label:"Instagram",desc:""},{code:"F",label:"Facebook",desc:""},{code:"W",label:"WhatsApp",desc:""},{code:"T",label:"TikTok",desc:""},{code:"L",label:"LinkedIn",desc:""}]; const CONTENT_TYPES=[{code:"P",label:"Paid",desc:"Budget behind it"},{code:"O",label:"Organic",desc:"Zero spend"}]; const ACCOUNTS=[{code:"AGM",label:"AGM",desc:"Apostle Maldonado personal"},{code:"KJM",label:"KJM",desc:"King Jesus Ministry"},{code:"YOU",label:"YOUTH",desc:"KJM Youth accounts"},{code:"NWN",label:"New Wine",desc:"New Wine ministry"}]; const WEB_SITES=[{code:"K",label:"KingJesus.org",desc:"English main"},{code:"R",label:"ElReyJesus.org",desc:"Spanish main"},{code:"J",label:"JesusCares.com",desc:"Evangelism"},{code:"S",label:"Store",desc:"Resource store"},{code:"T",label:"TV Page",desc:"Broadcast landing"},{code:"A",label:"AGM Personal",desc:"Apostle's giving"},{code:"Q",label:"QR In-Service",desc:"Screen QR"}]; const WEB_ACTIONS=[{code:"G",label:"Gift / Donation",desc:""},{code:"R",label:"Registration",desc:""},{code:"S",label:"Store Purchase",desc:""},{code:"L",label:"Lead / Soul Form",desc:""}]; const EVENT_TYPES=[{code:"C",label:"Conference",desc:"CAP Conference"},{code:"H",label:"Healing / Crusade",desc:"Miracle Crusade"},{code:"R",label:"Retreat",desc:"Marriage Retreat"},{code:"M",label:"Missions / Intl",desc:"Harvest World"},{code:"P",label:"Praise",desc:"Praise events"}]; const SERVICE_TYPES=[{code:"A",label:"Adult",desc:"9AM EN or 11AM SP"},{code:"Y",label:"Youth",desc:"Friday 7:30PM"},{code:"C",label:"Children",desc:"Concurrent"},{code:"N",label:"Supernatural Nights",desc:"6PM Bilingual"}]; const SERVICE_DAYS=[{code:"1",label:"Sunday",desc:"Adult & bilingual"},{code:"6",label:"Friday",desc:"Youth service"}]; const GIVING_METHODS=[{code:"Q",label:"QR Code Scan",desc:"During offering"},{code:"K",label:"Kiosk / Card",desc:"Lobby terminal"},{code:"C",label:"Cash / Check",desc:"Offering envelope"},{code:"O",label:"Online",desc:"After service"},{code:"T",label:"Text-to-Give",desc:"SMS giving"}]; const CALLER_TYPES=[{code:"A",label:"Partner",desc:"Giving or recurring"},{code:"B",label:"Donor",desc:"One-time giving"},{code:"G",label:"General / New",desc:"First contact"},{code:"R",label:"Prayer Line",desc:"IVR Option 1"},{code:"S",label:"Salvation",desc:"Live agent prayer"},{code:"T",label:"TV Response",desc:"After broadcast"}]; const TV_NETWORKS=[{code:"U",label:"Univision",desc:"Spanish Miami"},{code:"N",label:"TBN Enlace",desc:"Spanish Christian"},{code:"G",label:"God TV",desc:"English"},{code:"D",label:"Daystar",desc:"English"},{code:"T",label:"TBN",desc:"English"},{code:"S",label:"SGN",desc:"Own network"},{code:"O",label:"Other",desc:""}]; const DAY_TYPES=[{code:"W",label:"Weekday",desc:"Mon–Fri"},{code:"E",label:"Weekend",desc:"Sat–Sun"},{code:"S",label:"Special",desc:"Holiday"}]; const MAILING_TYPES=[{code:"1",label:"1st Mailing"},{code:"2",label:"2nd Mailing"},{code:"3",label:"3rd Mailing"},{code:"L",label:"Lapsed",desc:"Win-back"},{code:"M",label:"Major Donor"},{code:"E",label:"EOY",desc:"Year-end"}]; const DM_PACKAGES=[{code:"A",label:"Package A"},{code:"B",label:"Package B"},{code:"C",label:"Package C"}]; const OOH_FORMATS=[{code:"B",label:"Billboard"},{code:"S",label:"Bus Stop",desc:"Shelter"},{code:"T",label:"Transit",desc:"Bus side"},{code:"W",label:"Wild Posting"},{code:"D",label:"Digital OOH"}]; const OOH_ZONES=[{code:"N",label:"North Miami"},{code:"S",label:"South Miami"},{code:"W",label:"West / Hialeah",desc:"High Spanish"},{code:"D",label:"Downtown / Brickell"},{code:"A",label:"All Miami",desc:"Market-wide"}]; const RADIO_STATION_TYPES=[{code:"C",label:"Christian",desc:"Ministry stations"},{code:"X",label:"Secular",desc:"General audience"},{code:"P",label:"Podcast / Stream"}]; const RADIO_STATIONS=[{code:"W",label:"Radio Mambí",desc:"WAQI secular SP"},{code:"M",label:"WMGE",desc:"Secular EN"},{code:"U",label:"UNCION FM",desc:"Christian SP"},{code:"A",label:"AGM Radio / SGN",desc:"Own network"},{code:"O",label:"Other"}]; const RADIO_SLOTS=[{code:"M",label:"Morning Drive",desc:"6–10AM"},{code:"D",label:"Daytime",desc:"10AM–3PM"},{code:"E",label:"Evening Drive",desc:"3–7PM"},{code:"N",label:"Night",desc:"7PM+"},{code:"W",label:"Weekend"}]; const DARK_SHARE_TYPES=[{code:"L",label:"Link Share",desc:"URL in WhatsApp"},{code:"Q",label:"QR Image Share",desc:"QR photo in WhatsApp"}]; const WEB_BTN_PLACEMENTS=[{code:"H",label:"Home Hero",desc:"Top banner"},{code:"B",label:"Button / CTA",desc:"In-page"},{code:"N",label:"Nav Bar"},{code:"P",label:"Popup / Modal",desc:"Overlay"},{code:"F",label:"Footer"}]; const WEB_BTN_ACTIONS=[{code:"G",label:"Give / Donate"},{code:"R",label:"Register"},{code:"L",label:"Lead Form"},{code:"W",label:"Watch / Stream"},{code:"C",label:"Connect"}]; const WEB_BTN_SITES=[{code:"K",label:"KingJesus.org"},{code:"R",label:"ElReyJesus.org"},{code:"J",label:"JesusCares.com"},{code:"T",label:"TV Page"},{code:"X",label:"Store"}]; const RECEIPT_TYPES=[{code:"A",label:"Partner batch"},{code:"B",label:"Donor batch"}]; const PAYMENT_METHODS=[{code:"C",label:"Cash"},{code:"R",label:"Credit Card"},{code:"B",label:"Bill Pay"},{code:"P",label:"PayPal"},{code:"T",label:"Trust"}]; // ══════════════════════════════════════════════════════════════════ // CUSTOM CODE SYSTEM — add & persist new campaigns/audiences // ══════════════════════════════════════════════════════════════════ const STORAGE_KEY = 'kjm_custom_codes_v1'; // Auto-suggest a 3-letter code from a name function autoCode(name) { const words = name.trim().split(/\s+/).filter(Boolean); if (!words.length) return ''; if (words.length >= 3) return words.slice(0,3).map(w=>w[0]).join('').toUpperCase(); if (words.length === 2) return (words[0].slice(0,2) + words[1][0]).toUpperCase(); return name.replace(/[aeiou\s]/gi,'').slice(0,3).toUpperCase() || name.slice(0,3).toUpperCase(); } // Load saved custom codes from localStorage function loadCustomCodes() { try { const saved = JSON.parse(localStorage.getItem(STORAGE_KEY) || '{}'); if (saved.campaigns) { saved.campaigns.forEach(c => { if (!CAMPAIGNS.find(x=>x.code===c.code)) { c.custom = true; CAMPAIGNS.splice(CAMPAIGNS.length-1, 0, c); // insert before GNL } }); } if (saved.audiences) { saved.audiences.forEach(a => { if (!AUDIENCES.find(x=>x.code===a.code)) { a.custom = true; AUDIENCES.push(a); } }); } } catch(e) { console.warn('Could not load custom codes:', e); } } // Save a new custom code to localStorage function persistCustomCode(type, item) { try { const saved = JSON.parse(localStorage.getItem(STORAGE_KEY) || '{}'); if (!saved[type]) saved[type] = []; // Remove old entry with same code if exists saved[type] = saved[type].filter(x=>x.code !== item.code); saved[type].push(item); localStorage.setItem(STORAGE_KEY, JSON.stringify(saved)); } catch(e) { console.warn('Could not save custom code:', e); } } // Remove a custom code function removeCustomCode(type, code) { try { const saved = JSON.parse(localStorage.getItem(STORAGE_KEY) || '{}'); if (saved[type]) saved[type] = saved[type].filter(x=>x.code!==code); localStorage.setItem(STORAGE_KEY, JSON.stringify(saved)); // Remove from live array if (type==='campaigns') { const i=CAMPAIGNS.findIndex(c=>c.code===code); if(i>-1)CAMPAIGNS.splice(i,1); } if (type==='audiences') { const i=AUDIENCES.findIndex(a=>a.code===code); if(i>-1)AUDIENCES.splice(i,1); } // Refresh render(); refBuilt=false; if(document.getElementById('section-reference').classList.contains('active')) buildReference(); showToast('Code removed: '+code); } catch(e) {} } // Render the "Add New" form for a given type ('campaigns' or 'audiences') function renderAddNewForm(container, type, arr, stepId, stepIdx) { // Button const btn = document.createElement('button'); btn.className = 'add-new-btn'; btn.innerHTML = '+ Add New ' + (type==='campaigns'?'Campaign':'Audience') + ' Code'; // Form const form = document.createElement('div'); form.className = 'add-new-form'; form.innerHTML = ` <div> <label>Name</label> <input class="add-new-inp" id="anf-name" type="text" placeholder="${type==='campaigns'?'e.g. Leadership Summit':'e.g. Small Group Leaders'}" maxlength="40"> <div class="add-new-hint">Enter the full name — a code will be suggested automatically.</div> </div> <div class="add-new-row"> <div style="flex:1"> <label>Code <span style="font-weight:400;text-transform:none;letter-spacing:0">(${type==='campaigns'?'3':'2'} letters, unique)</span></label> <input class="add-new-inp code-inp" id="anf-code" type="text" maxlength="${type==='campaigns'?3:2}" placeholder="${type==='campaigns'?'XXX':'XX'}"> </div> <div style="flex:2"> <label>Description <span style="font-weight:400;text-transform:none;letter-spacing:0">(optional)</span></label> <input class="add-new-inp" id="anf-desc" type="text" maxlength="60" placeholder="Brief description…"> </div> </div> <div class="add-new-err" id="anf-err">⚠ This code already exists. Choose a different one.</div> <div style="display:flex;gap:8px;"> <button class="add-new-save" id="anf-save">Save & Select</button> <button class="add-new-cancel" id="anf-cancel">Cancel</button> </div> `; btn.onclick = () => { form.classList.toggle('open'); if(form.classList.contains('open')) document.getElementById('anf-name').focus(); }; // Auto-generate code from name form.querySelector('#anf-name').addEventListener('input', function() { const suggested = autoCode(this.value); const codeInp = form.querySelector('#anf-code'); if (!codeInp._manuallyEdited) codeInp.value = type==='campaigns' ? suggested.slice(0,3) : suggested.slice(0,2); codeInp.value = codeInp.value.toUpperCase(); }); form.querySelector('#anf-code').addEventListener('input', function() { this._manuallyEdited = true; this.value = this.value.toUpperCase().replace(/[^A-Z]/g,''); }); form.querySelector('#anf-cancel').onclick = () => { form.classList.remove('open'); form.querySelector('#anf-name').value=''; form.querySelector('#anf-code').value=''; form.querySelector('#anf-desc').value=''; form.querySelector('#anf-err').style.display='none'; }; form.querySelector('#anf-save').onclick = () => { const name = form.querySelector('#anf-name').value.trim(); const code = form.querySelector('#anf-code').value.trim().toUpperCase(); const desc = form.querySelector('#anf-desc').value.trim(); const errEl = form.querySelector('#anf-err'); if (!name || !code) { errEl.textContent='Name and Code are both required.'; errEl.style.display='block'; return; } const maxLen = type==='campaigns' ? 3 : 2; if (code.length !== maxLen) { errEl.textContent=`Code must be exactly ${maxLen} letters.`; errEl.style.display='block'; return; } // Check duplicates const allCodes = type==='campaigns' ? CAMPAIGNS : AUDIENCES; if (allCodes.find(x=>x.code===code)) { errEl.textContent='⚠ This code already exists. Choose a different one.'; errEl.style.display='block'; return; } errEl.style.display='none'; // Add to array const newItem = {code, label:name, desc, custom:true}; if (type==='campaigns') CAMPAIGNS.splice(CAMPAIGNS.length-1, 0, newItem); // before GNL else AUDIENCES.push(newItem); // Persist persistCustomCode(type, newItem); // Auto-select it and advance state[stepId] = code; if (stepId==='channel') { steps=buildStepList(code); } advance(stepIdx); // Reset form form.classList.remove('open'); form.querySelector('#anf-name').value=''; form.querySelector('#anf-code').value=''; form.querySelector('#anf-desc').value=''; // Rebuild reference tab next time refBuilt=false; showToast('✓ Added: '+code+' — '+name); }; container.appendChild(btn); container.appendChild(form); } // ══════════════════════════════════════════════════════════════════ // STATE // ══════════════════════════════════════════════════════════════════ let state={}, steps=[], currentStep=0; // Optional free-text segment appended to the end of the code. const CUSTOM_STEP={id:'custom',title:'Custom Tag', hint:'Optional. Add your own identifier when the presets do not cover it. Letters and numbers only.', type:'text',optional:true,max:12}; function cleanCustom(v){return String(v||'').toUpperCase().replace(/[^A-Z0-9]/g,'').slice(0,12);} let codeHistory=[]; // ══════════════════════════════════════════════════════════════════ // NAVIGATION // ══════════════════════════════════════════════════════════════════ function nav(id){ document.querySelectorAll('.section').forEach(s=>s.classList.remove('active')); document.querySelectorAll('.sb-item').forEach(b=>b.classList.remove('active')); document.getElementById('section-'+id).classList.add('active'); document.getElementById('nav-'+id).classList.add('active'); if(id==='history') renderFullHistory(); if(id==='reference') buildReference(); } // ══════════════════════════════════════════════════════════════════ // STEP DEFINITIONS // ══════════════════════════════════════════════════════════════════ function getChannelSteps(ch){ const base=[ {id:'year',title:'Year',hint:'What year?',type:'opt',cols:3,opts:YEARS}, {id:'month',title:'Month',hint:'What month?',type:'month'}, ]; const lang={id:'lang',title:'Language',hint:'English or Spanish?',type:'opt',cols:3,opts:LANGUAGES}; const ccc={id:'ccc',title:'Campaign',hint:'Which campaign?',type:'opt',cols:2,opts:CAMPAIGNS}; const aud={id:'aud',title:'Audience',hint:'Who are you sending to? (Email & SMS only)',type:'opt',cols:2,opts:AUDIENCES}; return ({ E:[...base, {id:'ff',title:'Send Number',hint:'Which send this month? (01 = first)',type:'counter',min:1,max:9}, aud, {id:'stype',title:'Send Type',hint:'Initial send or resend?',type:'opt',cols:2,opts:SEND_TYPES}, {id:'ver',title:'A/B Test?',hint:'Version 1 is default — only change if running a split test',type:'opt',cols:3,opts:VERSIONS}, lang], S:[...base, {id:'ff',title:'Send Number',hint:'Which send this month?',type:'counter',min:1,max:9}, aud, {id:'stype',title:'Send Type',hint:'Initial send or resend?',type:'opt',cols:2,opts:SEND_TYPES}, {id:'ver',title:'A/B Test?',hint:'Version 1 is default — only change if running a split test',type:'opt',cols:3,opts:VERSIONS}, lang], M:[...base, {id:'week',title:'Week of Month',hint:'Which week does this post or ad run?',type:'opt',cols:4,opts:[{code:"1",label:"Week 1"},{code:"2",label:"Week 2"},{code:"3",label:"Week 3"},{code:"4",label:"Week 4"}]}, {id:'platform',title:'Platform',hint:'Which social platform?',type:'opt',cols:3,opts:PLATFORMS}, {id:'ctype',title:'Content Type',hint:'Paid or organic?',type:'opt',cols:2,opts:CONTENT_TYPES}, {id:'account',title:'Account',hint:'Which KJM account?',type:'opt',cols:2,opts:ACCOUNTS}, lang], O:[...base, {id:'site',title:'Website',hint:'Which KJM web property?',type:'opt',cols:2,opts:WEB_SITES}, {id:'action',title:'Action',hint:'What is the user doing?',type:'opt',cols:2,opts:WEB_ACTIONS}, lang], V:[...base, {id:'etype',title:'Event Type',hint:'What type of event?',type:'opt',cols:2,opts:EVENT_TYPES}, {id:'enum',title:'Event Number',hint:'Which event of this type this month?',type:'counter',min:1,max:9}, lang], C:[...base, {id:'week',title:'Week of Month',hint:'Which week?',type:'opt',cols:4,opts:[{code:"1",label:"Week 1"},{code:"2",label:"Week 2"},{code:"3",label:"Week 3"},{code:"4",label:"Week 4"}]}, {id:'day',title:'Day',hint:'Which day?',type:'opt',cols:2,opts:SERVICE_DAYS}, {id:'svc',title:'Service',hint:'Which service?',type:'opt',cols:2,opts:SERVICE_TYPES}, lang, {id:'give',title:'Giving Method',hint:'How did they give?',type:'opt',cols:2,opts:GIVING_METHODS}], P:[...base, {id:'caller',title:'Caller Type',hint:'Why are they calling?',type:'opt',cols:2,opts:CALLER_TYPES}, lang], T:[...base, {id:'network',title:'Network',hint:'Which TV network?',type:'opt',cols:2,opts:TV_NETWORKS}, {id:'dayt',title:'Day Type',hint:'Weekday or weekend?',type:'opt',cols:3,opts:DAY_TYPES}, lang], D:[...base, {id:'mtype',title:'Mailing Type',hint:'Sequential or special?',type:'opt',cols:3,opts:MAILING_TYPES}, {id:'pkg',title:'Package',hint:'Which creative package?',type:'opt',cols:3,opts:DM_PACKAGES}, lang], H:[...base, {id:'fmt',title:'OOH Format',hint:'What type of unit?',type:'opt',cols:3,opts:OOH_FORMATS}, {id:'zone',title:'Miami Zone',hint:'Which area of Miami?',type:'opt',cols:2,opts:OOH_ZONES}, lang], A:[...base, {id:'stntype',title:'Station Type',hint:'Christian or secular?',type:'opt',cols:3,opts:RADIO_STATION_TYPES}, {id:'station',title:'Station',hint:'Which station?',type:'opt',cols:2,opts:RADIO_STATIONS}, {id:'slot',title:'Time Slot',hint:'When does the spot air?',type:'opt',cols:3,opts:RADIO_SLOTS}, lang], Z:[...base, {id:'share',title:'Share Type',hint:'Link or QR image?',type:'opt',cols:2,opts:DARK_SHARE_TYPES}, lang], B:[...base, {id:'placement',title:'Placement',hint:'Where on the site?',type:'opt',cols:3,opts:WEB_BTN_PLACEMENTS}, {id:'bsite',title:'Website',hint:'Which property?',type:'opt',cols:3,opts:WEB_BTN_SITES}, lang, {id:'baction',title:'Action',hint:'What does the button drive?',type:'opt',cols:3,opts:WEB_BTN_ACTIONS}], F:[...base, {id:'gpage',title:'Giving Page',hint:'Which page received the gift?',type:'opt',cols:2,opts:GIVE_PAGES}, {id:'gtype',title:'Gift Type',hint:'What kind of gift?',type:'opt',cols:2,opts:GIVE_TYPES}, lang], U:[...base, {id:'uplace',title:'Placement',hint:'Where on the partners site?',type:'opt',cols:2,opts:UPSALE_PLACEMENTS}, {id:'uoffer',title:'Offer',hint:'What is being offered?',type:'opt',cols:2,opts:UPSALE_OFFERS}, lang], R:[...base,{id:'ff',title:'Batch Number',hint:'Which batch this month?',type:'counter',min:1,max:9},{id:'rtype',title:'Batch Type',hint:'Partner or donor?',type:'opt',cols:2,opts:RECEIPT_TYPES}], G:[...base,{id:'payment',title:'Payment Method',hint:'How was this gift made?',type:'opt',cols:3,opts:PAYMENT_METHODS}], W:[...base], })[ch]||base; } // ══════════════════════════════════════════════════════════════════ // INIT // ══════════════════════════════════════════════════════════════════ function init(){ loadCustomCodes(); state={}; steps=[ {id:'ccc',title:'Campaign',hint:'What campaign are you working on?',type:'opt',cols:2,opts:CAMPAIGNS}, {id:'channel',title:'Channel',hint:'Which channel or medium will you use?',type:'opt',cols:2,opts:CHANNELS.filter(c=>!CHANNELS_INTERNAL.includes(c.code)),internal:true}, ]; currentStep=0; render(); updateCode(); } // ══════════════════════════════════════════════════════════════════ // RENDER // ══════════════════════════════════════════════════════════════════ function render(){ const container=document.getElementById('stepsContainer'); container.innerHTML=''; const total=steps.length, done=Object.keys(state).length; const pct=total>1?Math.round((done/total)*100):0; document.getElementById('progressLabel').textContent=`Step ${Math.min(done+1,total)} of ${total}`; document.getElementById('progressPct').textContent=pct+'%'; document.getElementById('progressFill').style.width=pct+'%'; steps.forEach((step,idx)=>{ const isDone=state[step.id]!==undefined; const isActive=idx===currentStep; const card=document.createElement('div'); card.className='step-card'; // Header const cls=isDone?'done':isActive?'active':'pending'; const hdr=document.createElement('div'); hdr.className='step-hdr'; hdr.innerHTML=`<div class="step-num ${cls}">${isDone?'✓':idx+1}</div> <div><div class="step-title">${step.title}</div><div class="step-hint">${step.hint}</div></div>`; card.appendChild(hdr); if(isDone||isActive){ const body=document.createElement('div'); body.className='step-body'; if(isDone){ const val=state[step.id]; let lbl=val; if(step.opts){const f=step.opts.find(o=>o.code===val);if(f)lbl=f.label;} // Also check internal channels if(step.id==='channel'){const f=CHANNELS.find(c=>c.code===val);if(f)lbl=f.label;} const badge=document.createElement('div'); badge.className='step-done-badge'; badge.innerHTML=`✓ <strong>${lbl}</strong><span>${val}</span> <button onclick="editStep(${idx})" style="margin-left:auto;background:none;border:1px solid var(--green-bd);border-radius:5px;padding:2px 8px;font-size:11px;color:var(--green);cursor:pointer;">Edit</button>`; body.appendChild(badge); } if(isActive){ if(step.type==='opt'){ const grid=document.createElement('div'); grid.className=`opt-grid c${step.cols||2}`; step.opts.forEach(opt=>{ const btn=document.createElement('button'); btn.className='opt'+(state[step.id]===opt.code?' sel':''); const customMark=opt.custom?'<span class="custom-badge">★ CUSTOM</span>':''; btn.innerHTML=`<div class="opt-code">${opt.code}</div><div class="opt-lbl">${opt.label}${customMark}</div>${opt.desc?`<div class="opt-desc">${opt.desc}</div>`:''}`; btn.onclick=()=>pick(step,opt.code,idx); grid.appendChild(btn); }); body.appendChild(grid); // Show "Add New" for campaign and audience steps if(step.id==='ccc') renderAddNewForm(body,'campaigns',CAMPAIGNS,step.id,idx); if(step.id==='aud') renderAddNewForm(body,'audiences',AUDIENCES,step.id,idx); // Internal channels toggle if(step.internal){ const tog=document.createElement('button'); tog.className='int-toggle'; tog.textContent='▸ Internal / Finance channels (R, G, W)'; const intGrid=document.createElement('div'); intGrid.className='opt-grid c2'; intGrid.style.display='none'; intGrid.style.marginTop='8px'; CHANNELS.filter(c=>CHANNELS_INTERNAL.includes(c.code)).forEach(opt=>{ const btn=document.createElement('button'); btn.className='opt'+(state[step.id]===opt.code?' sel':''); btn.style.opacity='.65'; btn.innerHTML=`<div class="opt-code">${opt.code}</div><div class="opt-lbl">${opt.label}</div><div class="opt-desc">${opt.desc}</div>`; btn.onclick=()=>pick(step,opt.code,idx); intGrid.appendChild(btn); }); tog.onclick=()=>{ const open=intGrid.style.display==='grid'; intGrid.style.display=open?'none':'grid'; tog.textContent=(open?'▸':'▾')+' Internal / Finance channels (R, G, W)'; }; body.appendChild(tog); body.appendChild(intGrid); } } else if(step.type==='month'){ const grid=document.createElement('div'); grid.className='month-grid'; MONTHS.forEach(m=>{ const btn=document.createElement('button'); btn.className='opt'+(state[step.id]===m.code?' sel':''); btn.style.textAlign='center'; btn.innerHTML=`<div class="opt-code" style="font-size:11px">${m.code}</div><div class="opt-lbl">${m.label}</div>`; btn.onclick=()=>pick(step,m.code,idx); grid.appendChild(btn); }); body.appendChild(grid); } else if(step.type==='text'){ const wrap=document.createElement('div'); wrap.className='custom-wrap'; wrap.innerHTML=`<input type="text" class="custom-input" id="ci-${step.id}" maxlength="${step.max||12}" placeholder="OPTIONAL" autocomplete="off" value="${state[step.id]||''}">`; const inp=wrap.querySelector('input'); inp.oninput=()=>{ inp.value=cleanCustom(inp.value); state[step.id]=inp.value; updateCode(); }; body.appendChild(wrap); const nb=document.createElement('button'); nb.className='next-btn'; nb.textContent='Confirm \u2192 Next'; nb.onclick=()=>{ if(state[step.id]===undefined) state[step.id]=''; advance(idx); }; body.appendChild(nb); } else if(step.type==='counter'){ let val=state[step.id]?parseInt(state[step.id]):step.min||1; state[step.id]=String(val).padStart(2,'0'); const s2=document.createElement('div'); s2.className='stepper'; s2.innerHTML=`<button class="stepper-btn" onclick="ctr('${step.id}',${step.min||1},${step.max||9},-1)">−</button> <div class="stepper-val" id="sv-${step.id}">${String(val).padStart(2,'0')}</div> <button class="stepper-btn" onclick="ctr('${step.id}',${step.min||1},${step.max||9},1)">+</button>`; body.appendChild(s2); const nb=document.createElement('button'); nb.className='next-btn'; nb.textContent='Confirm → Next'; nb.onclick=()=>advance(idx); body.appendChild(nb); } } card.appendChild(body); } container.appendChild(card); if(isActive)setTimeout(()=>card.scrollIntoView({behavior:'smooth',block:'nearest'}),80); }); document.getElementById('generateBtn').disabled=steps.some(s=>!s.optional && state[s.id]===undefined); } function buildStepList(chCode){ const ch=getChannelSteps(chCode).filter(s=>s.id!=='ccc'); return [steps[0],steps[1],...ch,CUSTOM_STEP]; } function pick(step,code,idx){ state[step.id]=code; if(step.id==='channel'){ steps=buildStepList(code); if(['R','W'].includes(code)&&!state.ccc) state.ccc='GNL'; } advance(idx); } function advance(idx){ currentStep=Math.min(idx+1,steps.length-1); render(); updateCode(); } function editStep(idx){ for(let i=idx;i<steps.length;i++){ delete state[steps[i].id]; if(steps[i].id==='channel') steps=[steps[0],steps[1]]; } currentStep=idx; render(); updateCode(); } function ctr(id,min,max,d){ let v=parseInt(state[id]||min); v=Math.max(min,Math.min(max,v+d)); state[id]=String(v).padStart(2,'0'); document.getElementById('sv-'+id).textContent=state[id]; updateCode(); } // ══════════════════════════════════════════════════════════════════ // CODE ASSEMBLY // ══════════════════════════════════════════════════════════════════ function campCode(){ const ch=state.channel; return state.ccc || (CHANNELS_INTERNAL.includes(ch) ? 'GNL' : ''); } function dateCode(){ return (state.year||'')+(state.month||''); } function assemble(){ const ch=state.channel; if(!ch)return null; const s=state; const tail=({ E:()=>ch+(s.ff||'')+(s.aud||'')+(s.stype||'')+(s.ver||'')+(s.lang||''), S:()=>ch+(s.ff||'')+(s.aud||'')+(s.stype||'')+(s.ver||'')+(s.lang||''), M:()=>ch+(s.week||'')+(s.platform||'')+(s.ctype||'')+(s.account||'')+(s.lang||''), O:()=>ch+(s.site||'')+(s.action||'')+(s.lang||''), V:()=>ch+(s.etype||'')+(s.enum||'')+(s.lang||''), C:()=>ch+(s.week||'')+(s.day||'')+(s.svc||'')+(s.lang||'')+(s.give||''), P:()=>ch+(s.caller||'')+(s.lang||''), T:()=>ch+(s.network||'')+(s.dayt||'')+(s.lang||''), D:()=>ch+(s.mtype||'')+(s.pkg||'')+(s.lang||''), H:()=>ch+(s.fmt||'')+'M'+(s.zone||'')+(s.lang||''), A:()=>ch+(s.stntype||'')+(s.station||'')+(s.slot||'')+(s.lang||''), Z:()=>ch+(s.share||'')+(s.lang||''), B:()=>ch+(s.placement||'')+(s.bsite||'')+(s.lang||'')+(s.baction||''), F:()=>ch+(s.gpage||'')+(s.gtype||'')+(s.lang||''), U:()=>ch+(s.uplace||'')+(s.uoffer||'')+(s.lang||''), R:()=>ch+(s.ff||'')+(s.rtype||''), G:()=>ch+(s.payment||''), W:()=>ch, })[ch]?.(); if(tail==null)return null; return [campCode(), dateCode(), tail, cleanCustom(s.custom)].filter(Boolean).join('_'); } function getPositions(){ const ch=state.channel; if(!ch)return[]; const s=state, pos=[]; const a=(lbl,val)=>{if(val)pos.push({lbl,val});}; a('Campaign',campCode()); a('Date',dateCode()); a('Channel',ch); const _cu=cleanCustom(s.custom); ({ E:()=>{a('Send#',s.ff);a('Audience',s.aud);a('Type',s.stype);a('Ver',s.ver);a('Lang',s.lang);}, S:()=>{a('Send#',s.ff);a('Audience',s.aud);a('Type',s.stype);a('Ver',s.ver);a('Lang',s.lang);}, M:()=>{a('Week',s.week);a('Platform',s.platform);a('Type',s.ctype);a('Account',s.account);a('Lang',s.lang);}, O:()=>{a('Site',s.site);a('Action',s.action);a('Lang',s.lang);}, V:()=>{a('EventType',s.etype);a('Event#',s.enum);a('Lang',s.lang);}, C:()=>{a('Week',s.week);a('Day',s.day);a('Service',s.svc);a('Lang',s.lang);a('Giving',s.give);}, P:()=>{a('CallerType',s.caller);a('Lang',s.lang);}, T:()=>{a('Network',s.network);a('DayType',s.dayt);a('Lang',s.lang);}, D:()=>{a('Mailing',s.mtype);a('Package',s.pkg);a('Lang',s.lang);}, H:()=>{a('Format',s.fmt);a('Market','M');a('Zone',s.zone);a('Lang',s.lang);}, A:()=>{a('StationType',s.stntype);a('Station',s.station);a('Slot',s.slot);a('Lang',s.lang);}, Z:()=>{a('ShareType',s.share);a('Lang',s.lang);}, B:()=>{a('Placement',s.placement);a('Site',s.bsite);a('Lang',s.lang);a('Action',s.baction);}, F:()=>{a('Page',s.gpage);a('Gift',s.gtype);a('Lang',s.lang);}, U:()=>{a('Placement',s.uplace);a('Offer',s.uoffer);a('Lang',s.lang);}, R:()=>{a('Batch#',s.ff);a('Type',s.rtype);}, G:()=>{a('Payment',s.payment);}, W:()=>{}, })[ch]?.(); if(_cu) pos.push({lbl:'Custom',val:_cu}); return pos; } function getBreakdown(){ const ch=state.channel; if(!ch)return[]; const s=state; const rows=[]; const _c=campCode(); if(_c) rows.push({k:'Campaign',v:(CAMPAIGNS.find(x=>x.code===_c)||{}).label||_c}); if(s.year||s.month) rows.push({k:'Date',v:((MONTHS.find(m=>m.code===s.month)||{}).label||'')+(s.year?' 20'+s.year:'')}); rows.push({k:'Channel',v:ch+' — '+(CHANNELS.find(c=>c.code===ch)||{}).label}); const find=(arr,code)=>(arr.find(x=>x.code===code)||{}).label; ({ E:()=>{if(s.ff)rows.push({k:'Send #',v:s.ff});if(s.aud)rows.push({k:'Audience',v:find(AUDIENCES,s.aud)});if(s.stype)rows.push({k:'Send Type',v:find(SEND_TYPES,s.stype)});if(s.ver)rows.push({k:'Version',v:s.ver});if(s.lang)rows.push({k:'Language',v:s.lang});}, S:()=>{if(s.ff)rows.push({k:'Send #',v:s.ff});if(s.aud)rows.push({k:'Audience',v:find(AUDIENCES,s.aud)});if(s.stype)rows.push({k:'Send Type',v:find(SEND_TYPES,s.stype)});if(s.ver)rows.push({k:'Version',v:s.ver});if(s.lang)rows.push({k:'Language',v:s.lang});}, M:()=>{if(s.week)rows.push({k:'Week',v:'Week '+s.week});if(s.platform)rows.push({k:'Platform',v:find(PLATFORMS,s.platform)});if(s.ctype)rows.push({k:'Type',v:s.ctype==='P'?'Paid':'Organic'});if(s.account)rows.push({k:'Account',v:s.account});if(s.lang)rows.push({k:'Language',v:s.lang});}, O:()=>{if(s.site)rows.push({k:'Site',v:find(WEB_SITES,s.site)});if(s.action)rows.push({k:'Action',v:find(WEB_ACTIONS,s.action)});if(s.lang)rows.push({k:'Language',v:s.lang});}, V:()=>{if(s.etype)rows.push({k:'Event Type',v:find(EVENT_TYPES,s.etype)});if(s.enum)rows.push({k:'Event #',v:s.enum});if(s.lang)rows.push({k:'Language',v:s.lang});}, C:()=>{if(s.week)rows.push({k:'Week',v:'Week '+s.week});if(s.day)rows.push({k:'Day',v:s.day==='1'?'Sunday':'Friday'});if(s.svc)rows.push({k:'Service',v:find(SERVICE_TYPES,s.svc)});if(s.lang)rows.push({k:'Language',v:s.lang==='EN'?'English (9AM)':s.lang==='SP'?'Spanish (11AM)':'Bilingual (6PM)'});if(s.give)rows.push({k:'Giving',v:find(GIVING_METHODS,s.give)});}, P:()=>{if(s.caller)rows.push({k:'Caller Type',v:find(CALLER_TYPES,s.caller)});if(s.lang)rows.push({k:'Language',v:s.lang});}, T:()=>{if(s.network)rows.push({k:'Network',v:find(TV_NETWORKS,s.network)});if(s.dayt)rows.push({k:'Day Type',v:find(DAY_TYPES,s.dayt)});if(s.lang)rows.push({k:'Language',v:s.lang});}, D:()=>{if(s.mtype)rows.push({k:'Mailing',v:find(MAILING_TYPES,s.mtype)});if(s.pkg)rows.push({k:'Package',v:s.pkg});if(s.lang)rows.push({k:'Language',v:s.lang});}, H:()=>{if(s.fmt)rows.push({k:'Format',v:find(OOH_FORMATS,s.fmt)});rows.push({k:'Market',v:'Miami'});if(s.zone)rows.push({k:'Zone',v:find(OOH_ZONES,s.zone)});if(s.lang)rows.push({k:'Language',v:s.lang});}, A:()=>{if(s.stntype)rows.push({k:'Station Type',v:find(RADIO_STATION_TYPES,s.stntype)});if(s.station)rows.push({k:'Station',v:find(RADIO_STATIONS,s.station)});if(s.slot)rows.push({k:'Time Slot',v:find(RADIO_SLOTS,s.slot)});if(s.lang)rows.push({k:'Language',v:s.lang});}, Z:()=>{if(s.share)rows.push({k:'Share Type',v:find(DARK_SHARE_TYPES,s.share)});if(s.lang)rows.push({k:'Language',v:s.lang});}, B:()=>{if(s.placement)rows.push({k:'Placement',v:find(WEB_BTN_PLACEMENTS,s.placement)});if(s.bsite)rows.push({k:'Site',v:find(WEB_BTN_SITES,s.bsite)});if(s.lang)rows.push({k:'Language',v:s.lang});if(s.baction)rows.push({k:'Action',v:find(WEB_BTN_ACTIONS,s.baction)});}, F:()=>{if(s.gpage)rows.push({k:'Giving Page',v:find(GIVE_PAGES,s.gpage)});if(s.gtype)rows.push({k:'Gift Type',v:find(GIVE_TYPES,s.gtype)});if(s.lang)rows.push({k:'Language',v:s.lang});}, U:()=>{if(s.uplace)rows.push({k:'Placement',v:find(UPSALE_PLACEMENTS,s.uplace)});if(s.uoffer)rows.push({k:'Offer',v:find(UPSALE_OFFERS,s.uoffer)});if(s.lang)rows.push({k:'Language',v:s.lang});}, R:()=>{if(s.ff)rows.push({k:'Batch #',v:s.ff});if(s.rtype)rows.push({k:'Batch Type',v:find(RECEIPT_TYPES,s.rtype)});}, G:()=>{if(s.payment)rows.push({k:'Payment',v:find(PAYMENT_METHODS,s.payment)});}, W:()=>{}, })[ch]?.(); const _cu2=cleanCustom(s.custom); if(_cu2) rows.push({k:'Custom Tag',v:_cu2}); return rows; } function updateCode(){ const code=assemble(); const codeEl=document.getElementById('codeString'); const charsEl=document.getElementById('codeChars'); const bdCard=document.getElementById('breakdownCard'); const bdRows=document.getElementById('breakdownRows'); if(!code){ codeEl.innerHTML='<span class="code-empty">Select options →</span>'; charsEl.innerHTML=''; bdCard.style.display='none'; return; } codeEl.textContent=code; // Char blocks — show actual code values charsEl.innerHTML=''; getPositions().forEach(p=>{ const b=document.createElement('div'); b.className='char-blk'; b.innerHTML=`<div class="char-val">${p.val}</div><div class="char-lbl">${p.lbl}</div>`; charsEl.appendChild(b); }); // Breakdown const rows=getBreakdown(); if(rows.length){ bdCard.style.display='block'; bdRows.innerHTML=rows.map(r=>`<div class="bk-row"><span class="bk-key">${r.k}</span><span class="bk-val">${r.v}</span></div>`).join(''); } } function generateCode(){ const code=assemble(); if(!code)return; const codeEl=document.getElementById('codeString'); codeEl.style.color='var(--gold-lt)'; codeEl.style.transform='scale(1.04)'; codeEl.style.transition='all .25s ease'; setTimeout(()=>{ codeEl.style.color='#fff'; codeEl.style.transform='scale(1)'; },280); const ch=state.channel; const chLbl=(CHANNELS.find(c=>c.code===ch)||{}).label||ch; const cccLbl=state.ccc?(CAMPAIGNS.find(c=>c.code===state.ccc)||{}).label||state.ccc:''; const ts=new Date().toLocaleTimeString([],{hour:'2-digit',minute:'2-digit'}); codeHistory.unshift({code,ch,chLbl,cccLbl,lang:state.lang||'',ts}); if(codeHistory.length>10)codeHistory.pop(); renderMiniHistory(); showToast('✓ Saved — '+code); } function copyCode(){ const code=assemble(); if(!code){showToast('Build your code first');return;} navigator.clipboard.writeText(code).then(()=>showToast('✓ Copied: '+code)); } function resetAll(){ init(); } // ══════════════════════════════════════════════════════════════════ // HISTORY // ══════════════════════════════════════════════════════════════════ function renderMiniHistory(){ const el=document.getElementById('miniHistory'); if(!el)return; if(!codeHistory.length){ el.innerHTML='<div class="hist-empty">No codes yet.</div>'; return; } el.innerHTML=codeHistory.slice(0,5).map(h=>` <div class="hist-item"> <div style="flex:1;min-width:0;"> <div class="hist-code">${h.code}</div> <div class="hist-meta">${h.chLbl}${h.cccLbl?' · '+h.cccLbl:''} · ${h.ts}</div> </div> <button class="hist-copy" onclick="navigator.clipboard.writeText('${h.code}').then(()=>showToast('✓ Copied'))">Copy</button> </div>`).join(''); } function renderFullHistory(){ const el=document.getElementById('historyFull'); if(!codeHistory.length){ el.innerHTML=`<div class="hist-full-empty"><div style="font-size:32px">🕐</div><p>No codes generated yet.<br>Go to Builder to create your first code.</p></div>`; return; } el.innerHTML=`<table class="hist-table"> <thead><tr><th>Source Code</th><th>Channel</th><th>Campaign</th><th>Language</th><th>Time</th><th></th></tr></thead> <tbody>${codeHistory.map(h=>`<tr> <td>${h.code}</td> <td>${h.chLbl}</td> <td>${h.cccLbl||'—'}</td> <td>${h.lang||'—'}</td> <td style="color:var(--text3);font-size:12px">${h.ts}</td> <td><button class="hist-full-copy" onclick="navigator.clipboard.writeText('${h.code}').then(()=>showToast('✓ Copied'))">Copy</button></td> </tr>`).join('')}</tbody> </table>`; } function clearHistory(){ codeHistory=[]; renderMiniHistory(); renderFullHistory(); showToast('History cleared'); } // ══════════════════════════════════════════════════════════════════ // REFERENCE // ══════════════════════════════════════════════════════════════════ let refBuilt=false; function buildReference(){ if(refBuilt)return; refBuilt=true; // Channels grid const cg=document.getElementById('ref-channels-grid'); cg.innerHTML=CHANNELS.map(c=>` <div class="ref-card${CHANNELS_INTERNAL.includes(c.code)?' ':' '}"> <div class="ref-card-code">${c.code}</div> <div class="ref-card-name">${c.label}</div> <div class="ref-card-desc">${c.desc}${CHANNELS_INTERNAL.includes(c.code)?' <em>(internal)</em>':''}</div> <div class="ref-card-fmt">${c.fmt}</div> </div>`).join(''); // Audiences table const at=document.getElementById('ref-audiences-table'); at.innerHTML=`<thead><tr><th>Code</th><th>Audience</th><th>Description</th><th>Channels</th><th></th></tr></thead> <tbody>${AUDIENCES.map(a=>`<tr> <td>${a.code}${a.custom?'<span class="custom-badge">★</span>':''}</td> <td>${a.label}</td> <td style="color:var(--text3)">${a.desc||'—'}</td> <td><span class="ref-tag">Email</span><span class="ref-tag">SMS</span></td> <td>${a.custom?`<button onclick="removeCustomCode('audiences','${a.code}')" style="background:none;border:none;color:var(--text3);font-size:11px;cursor:pointer;font-family:inherit;padding:2px 6px;border-radius:4px;" onmouseover="this.style.color='#DC2626'" onmouseout="this.style.color='var(--text3)'">Remove</button>`:''} </td></tr>`).join('')}</tbody>`; // Campaigns table const ct=document.getElementById('ref-campaigns-table'); ct.innerHTML=`<thead><tr><th>Code</th><th>Campaign</th><th>Description</th><th></th></tr></thead> <tbody>${CAMPAIGNS.map(c=>`<tr> <td>${c.code}${c.custom?'<span class="custom-badge">★</span>':''}</td> <td>${c.label}</td> <td style="color:var(--text3)">${c.desc||'—'}</td> <td>${c.custom?`<button onclick="removeCustomCode('campaigns','${c.code}')" style="background:none;border:none;color:var(--text3);font-size:11px;cursor:pointer;font-family:inherit;padding:2px 6px;border-radius:4px;" onmouseover="this.style.color='#DC2626'" onmouseout="this.style.color='var(--text3)'">Remove</button>`:''} </td></tr>`).join('')}</tbody>`; // Languages const lg=document.getElementById('ref-languages-grid'); lg.innerHTML=LANGUAGES.map(l=>` <div class="ref-card"> <div class="ref-card-code">${l.code}</div> <div class="ref-card-name">${l.label}</div> <div class="ref-card-desc">${l.desc}</div> </div>`).join(''); } let currentRefTab='channels'; function refTab(id){ currentRefTab=id; document.querySelectorAll('.ref-tab').forEach((t,i)=>t.classList.toggle('active',['channels','audiences','campaigns','languages'][i]===id)); document.querySelectorAll('.ref-panel').forEach(p=>p.classList.remove('active')); document.getElementById('ref-'+id).classList.add('active'); filterRef(document.getElementById('refSearch').value); } function filterRef(q){ q=q.toLowerCase().trim(); const tab=currentRefTab; if(tab==='channels'){ document.querySelectorAll('#ref-channels-grid .ref-card').forEach((card,i)=>{ const ch=CHANNELS[i]; if(!ch)return; const match=!q||ch.code.toLowerCase().includes(q)||ch.label.toLowerCase().includes(q)||ch.desc.toLowerCase().includes(q)||ch.fmt.toLowerCase().includes(q); card.style.display=match?'':'none'; }); } if(tab==='audiences'){ document.querySelectorAll('#ref-audiences-table tbody tr').forEach((tr,i)=>{ const a=AUDIENCES[i]; if(!a)return; const match=!q||a.code.toLowerCase().includes(q)||a.label.toLowerCase().includes(q)||a.desc.toLowerCase().includes(q); tr.style.display=match?'':'none'; }); } if(tab==='campaigns'){ document.querySelectorAll('#ref-campaigns-table tbody tr').forEach((tr,i)=>{ const c=CAMPAIGNS[i]; if(!c)return; const match=!q||c.code.toLowerCase().includes(q)||c.label.toLowerCase().includes(q)||(c.desc||'').toLowerCase().includes(q); tr.style.display=match?'':'none'; }); } } // ══════════════════════════════════════════════════════════════════ // TOAST // ══════════════════════════════════════════════════════════════════ function showToast(msg){ const t=document.getElementById('toast'); t.textContent=msg; t.classList.add('show'); setTimeout(()=>t.classList.remove('show'),2600); } // ── Start ───────────────────────────────────────────────────────── init(); </script> </body> </html>