{"id":21,"date":"2026-10-02T22:47:38","date_gmt":"2026-10-02T22:47:38","guid":{"rendered":"https:\/\/rogerlopez.com\/?page_id=21"},"modified":"2026-10-03T01:23:10","modified_gmt":"2026-10-03T01:23:10","slug":"mbu","status":"publish","type":"page","link":"https:\/\/rogerlopez.com\/index.php\/mbu\/","title":{"rendered":"MBU"},"content":{"rendered":"<p>&lt;!doctype html&gt;<br \/><br \/><br \/><\/p>\n<p><style>\n:root{--bg:#f6f4ee;--card:#fff;--ink:#1d2433;--mut:#5d6677;--line:#dcd8cb;--acc:#1f4e3d;--onacc:#fff;--gold:#9a5f00;--goldbg:#fdf1d8;--bad:#a8321f;--ok:#1f7a4d;box-sizing:border-box;padding-top:env(safe-area-inset-top,0px);padding-bottom:env(safe-area-inset-bottom,0px)}<br \/>\n@media (prefers-color-scheme:dark){:root:not([data-theme=\"light\"]){--bg:#14181f;--card:#1d232d;--ink:#eceae2;--mut:#9aa3b2;--line:#323a48;--acc:#6fcf9f;--onacc:#10261c;--gold:#f0b44c;--goldbg:#3a2f14;--bad:#ff8b78;--ok:#6fcf9f}}<br \/>\n:root[data-theme=\"dark\"]{--bg:#14181f;--card:#1d232d;--ink:#eceae2;--mut:#9aa3b2;--line:#323a48;--acc:#6fcf9f;--onacc:#10261c;--gold:#f0b44c;--goldbg:#3a2f14;--bad:#ff8b78;--ok:#6fcf9f}<br \/>\nhtml{scroll-padding-top:env(safe-area-inset-top,0px)}<br \/>\n*{box-sizing:border-box}body{margin:0;background:var(--bg);color:var(--ink);font:16px\/1.45 system-ui,-apple-system,Segoe UI,Roboto,sans-serif}<br \/>\n.w{max-width:960px;margin:0 auto;padding:16px}<br \/>\nh1{font-size:1.5rem;margin:.2rem 0}h2{font-size:1.15rem;margin:1.2rem 0 .5rem}.mut{color:var(--mut);font-size:.9rem}<br \/>\n.card{background:var(--card);border:1px solid var(--line);border-radius:10px;padding:12px;margin:8px 0}<br \/>\n.tabs{display:flex;gap:6px;flex-wrap:wrap;margin:12px 0}<br \/>\nbutton,select,input{font:inherit;color:inherit}<br \/>\n.tab,.btn{border:1px solid var(--line);background:var(--card);border-radius:8px;padding:8px 12px;cursor:pointer}<br \/>\n.tab.on,.btn.p{background:var(--acc);color:var(--onacc);border-color:var(--acc)}<br \/>\n.btn:disabled{opacity:.45;cursor:not-allowed}.btn.s{padding:4px 8px;font-size:.85rem}<br \/>\ninput,select{width:100%;padding:8px;border:1px solid var(--line);border-radius:8px;background:var(--card)}<br \/>\n.g{display:grid;gap:8px;grid-template-columns:repeat(auto-fill,minmax(250px,1fr))}<br \/>\n.cl{border:1px solid var(--line);border-radius:10px;padding:10px;background:var(--card);display:flex;flex-direction:column;gap:6px}<br \/>\n.cl.done{opacity:.55;filter:grayscale(1);background:var(--bg)}.cl.done b{text-decoration:line-through}.lock{font-weight:700;color:var(--ok)}<br \/>\n.cl.e{border-left:6px solid var(--gold);background:var(--goldbg)}<br \/>\n.tag{display:inline-block;font-size:.7rem;font-weight:700;padding:2px 6px;border-radius:99px;border:1px solid var(--line);margin-right:4px}<br \/>\n.tag.e{background:var(--gold);color:#fff;border-color:var(--gold)}<br \/>\n.row{display:flex;gap:6px;align-items:center;flex-wrap:wrap}.row>.grow{flex:1;min-width:140px}<br \/>\n.pick{display:flex;gap:8px;align-items:center;padding:6px 0;border-bottom:1px solid var(--line)}<br \/>\n.n{font-weight:700;min-width:1.6rem}.err{color:var(--bad)}.ok{color:var(--ok)}<br \/>\n.warn{border-left:4px solid var(--gold);padding:6px 10px;background:var(--goldbg);border-radius:6px;font-size:.9rem}<br \/>\n.sticky{position:sticky;bottom:0;background:var(--bg);padding:8px 0}<br \/>\ntable{width:100%;border-collapse:collapse;font-size:.88rem}td,th{border-bottom:1px solid var(--line);padding:4px 6px;text-align:left;vertical-align:top}<br \/>\n.scr{overflow-x:auto}textarea{width:100%;min-height:120px;font:inherit;background:var(--card);color:var(--ink);border:1px solid var(--line);border-radius:8px}<br \/>\n<\/style><\/p>\n<p>&nbsp;<\/p>\n<div class=\"w\">\n<h1>\u269c\ufe0f Troop 307 \u2014 Merit Badge University<\/h1>\n<div class=\"mut\">Saturday, Nov 7, 2026 \u00b7 St. Philip&#8217;s College \u00b7 Check-in 7:00 AM, classes 8:15 AM\u20133:45 PM \u00b7 $40 per Scout + any class fee.<\/div>\n<div id=\"tabs\" class=\"tabs\">\u00a0<\/div>\n<div id=\"main\">\u00a0<\/div>\n<\/div>\n<p><script><br \/>\nconst E=1;<br \/>\n\/\/ [id,name,periods,fee,eagle,note]<br \/>\nconst C=[<br \/>\n[\"cc\",\"Citizenship in the Community\",1,0,E,\"\"],[\"cn\",\"Citizenship in the Nation\",1,0,E,\"\"],[\"cw\",\"Citizenship in the World\",1,0,E,\"\"],<br \/>\n[\"co\",\"Communications\",2,0,E,\"Extensive pre-requisites required before class\"],[\"ep\",\"Emergency Preparedness\",2,0,E,\"\"],<br \/>\n[\"es\",\"Environmental Science\",2,0,E,\"\"],[\"fl\",\"Family Life\",1,0,E,\"\"],<br \/>\n[\"pm\",\"Personal Management\",2,0,E,\"3 sessions: Nov 7 (MBU), Dec 5 & Jan 9 on Zoom 8am\u201312pm. Only sign up if you can make all of them.\"],<br \/>\n[\"pf\",\"Personal Fitness\",2,0,E,\"Multi-month: Nov 7 MBU, then Nov 14, Dec 12, Jan 9, Feb 6, Feb 13 at McGimsey Scout Park.\"],<br \/>\n[\"an\",\"Animal Science\",2,0,0,\"\"],[\"ai\",\"Artificial Intelligence\",2,5,0,\"Only 1 scout per troop; AI or Cyber Security, not both\"],<br \/>\n[\"av\",\"Aviation\",2,0,0,\"\"],[\"ch\",\"Chemistry\",2,5,0,\"\"],[\"cs\",\"Chess\",1,0,0,\"\"],[\"cl\",\"Climbing\",4,20,0,\"All day\"],<br \/>\n[\"cp\",\"Crime Prevention\",1,0,0,\"\"],[\"cy\",\"Cyber Security\",2,5,0,\"Only 1 scout per troop; AI or Cyber Security, not both\"],<br \/>\n[\"dt\",\"Digital Technology\",2,5,0,\"\"],[\"el\",\"Electronics\",2,5,0,\"\"],[\"fp\",\"Fingerprinting\",1,0,0,\"\"],<br \/>\n[\"fi\",\"Fishing\",2,5,0,\"Held at McGimsey Scout Park\"],[\"ge\",\"Geology\",2,0,0,\"\"],[\"ma\",\"Mammal Study\",1,0,0,\"Location TBD (may be at SeaWorld)\"],<br \/>\n[\"oc\",\"Oceanography\",2,0,0,\"\"],[\"ph\",\"Photography\",1,0,0,\"\"],[\"ra\",\"Radio\",2,0,0,\"\"],[\"rr\",\"Railroading\",2,0,0,\"\"],<br \/>\n[\"re\",\"Reptile and Amphibian\",1,0,0,\"\"],[\"rb\",\"Robotics\",2,20,0,\"\"],[\"sr\",\"Search & Rescue\",4,5,0,\"All day\"],<br \/>\n[\"tt\",\"Truck Transportation\",2,0,0,\"Held in Schertz, TX (Armstrong), not at St. Philip's \u2013 parents drive\"],<br \/>\n[\"vm\",\"Veterinary Medicine\",2,0,0,\"\"],[\"wc\",\"Wood Carving\",2,10,0,\"\"]];<br \/>\nconst CM=Object.fromEntries(C.map(c=>[c[0],c]));<br \/>\nconst ADULT=[[\"eb\",\"Eagle Board\"],[\"le\",\"Life to Eagle Advancement\"],[\"mc\",\"MB Counselor\"],[\"cpr\",\"CPR \/ AED Training ($70 \u2013 no refunds after Oct 30)\"]];<br \/>\nconst R=[[\"Heavy Mustangs\",[\"Liam Bragan|Life\",\"Luke DeWinne|Life\",\"John Edelman|Life\",\"Johnny Eichelberger|Life\",\"Anton Gribkov|Life\",\"Johnathan Hernandez|2nd Class\",\"Waylon Lyssy|Star\",\"John Ortega de Silva|2nd Class\",\"John Pearson|Life\",\"David Van Delist|Life\",\"Roberto Van Delist|Life\"]],<br \/>\n[\"Texas Rangers\",[\"Michael Hart|Life\",\"Connor Kimball|2nd Class\",\"Emery Lyssy|2nd Class\",\"Carlos Oscari|Life\",\"Seth Podojil|Life\",\"Noah Ramos|Life\"]],<br \/>\n[\"Dragons\",[\"Oliver Halbesleben|Tenderfoot\",\"Stephen Hart|1st Class\",\"Roger Lopez|2nd Class\",\"Ryder Lovell|2nd Class\",\"Logan Ramos|2nd Class\",\"Tai Smith|1st Class\"]],<br \/>\n[\"Falcons\",[\"Richard Dominguez|Arrow of Light\",\"Ian Huerta|Arrow of Light\",\"Oliver Oscari|Arrow of Light\",\"Anthony Perez|Arrow of Light\",\"Zachary Rios|Arrow of Light\",\"Gavin Romero|Arrow of Light\",\"Landon Rowe|Arrow of Light\",\"Arthur Tucker|Arrow of Light\"]]];<br \/>\n\/\/ Per advancement report (7\/24\/2026): Eagle-required badges already awarded \/ in progress<br \/>\nconst HAVE={\"cc\": [\"John Edelman\", \"David Van Delist\", \"Noah Ramos\"], \"cn\": [\"Liam Bragan\", \"Luke DeWinne\", \"John Edelman\", \"Waylon Lyssy\", \"John Pearson\", \"David Van Delist\", \"Roberto Van Delist\", \"Michael Hart\", \"Seth Podojil\", \"Noah Ramos\"], \"cw\": [\"Liam Bragan\", \"Luke DeWinne\", \"John Edelman\", \"Anton Gribkov\", \"Johnathan Hernandez\", \"Waylon Lyssy\", \"John Ortega de Silva\", \"John Pearson\", \"David Van Delist\", \"Roberto Van Delist\", \"Carlos Oscari\", \"Noah Ramos\", \"Oliver Halbesleben\", \"Stephen Hart\", \"Roger Lopez\", \"Tai Smith\"], \"co\": [\"Liam Bragan\", \"Luke DeWinne\", \"John Edelman\", \"Anton Gribkov\", \"Johnathan Hernandez\", \"Waylon Lyssy\", \"John Ortega de Silva\", \"David Van Delist\", \"Roberto Van Delist\", \"Carlos Oscari\", \"Seth Podojil\", \"Noah Ramos\"], \"fl\": [\"John Edelman\", \"Johnny Eichelberger\", \"John Pearson\", \"David Van Delist\", \"Roberto Van Delist\", \"Michael Hart\", \"Carlos Oscari\", \"Seth Podojil\", \"Noah Ramos\"], \"pf\": [\"Liam Bragan\", \"Luke DeWinne\", \"John Edelman\", \"Johnny Eichelberger\", \"Anton Gribkov\", \"Waylon Lyssy\", \"John Pearson\", \"David Van Delist\", \"Roberto Van Delist\", \"Noah Ramos\"], \"pm\": [\"Liam Bragan\", \"John Edelman\", \"David Van Delist\", \"Roberto Van Delist\", \"Noah Ramos\"], \"ep\": [\"Liam Bragan\", \"Luke DeWinne\", \"John Edelman\", \"Johnny Eichelberger\", \"John Pearson\", \"David Van Delist\", \"Roberto Van Delist\", \"Michael Hart\", \"Carlos Oscari\", \"Seth Podojil\"], \"es\": [\"Liam Bragan\", \"Luke DeWinne\", \"John Edelman\", \"Anton Gribkov\", \"Johnathan Hernandez\", \"Waylon Lyssy\", \"John Ortega de Silva\", \"Roberto Van Delist\", \"Carlos Oscari\", \"Seth Podojil\", \"Noah Ramos\"]};<br \/>\nconst PROG={\"cc\": [\"Liam Bragan\", \"Luke DeWinne\", \"Johnny Eichelberger\", \"Anton Gribkov\", \"Waylon Lyssy\", \"John Pearson\", \"Roberto Van Delist\", \"Michael Hart\", \"Emery Lyssy\", \"Carlos Oscari\", \"Seth Podojil\"], \"cn\": [\"John Ortega de Silva\", \"Carlos Oscari\"], \"co\": [\"Johnny Eichelberger\", \"Michael Hart\"], \"fl\": [\"Liam Bragan\", \"Luke DeWinne\", \"Anton Gribkov\", \"Waylon Lyssy\"], \"pf\": [\"Johnathan Hernandez\", \"John Ortega de Silva\", \"Michael Hart\", \"Connor Kimball\", \"Emery Lyssy\", \"Carlos Oscari\", \"Seth Podojil\", \"Stephen Hart\"], \"pm\": [\"Johnathan Hernandez\", \"Waylon Lyssy\", \"John Pearson\"], \"ep\": [\"Anton Gribkov\", \"Johnathan Hernandez\", \"Waylon Lyssy\", \"Emery Lyssy\", \"Noah Ramos\"], \"es\": [\"David Van Delist\"], \"cw\": [\"Ryder Lovell\"]};<br \/>\n\/\/ ===== SETUP (edit these two lines) =====<br \/>\nconst MAIL=\"rogerlopez@rogerlopez.com\";     \/\/ your email, e.g. \"you@yourdomain.com\" -> shows an \"Email it\" button<br \/>\nconst FORM_URL=\"https:\/\/formspree.io\/f\/xjykqnnl\"; \/\/ optional: a Formspree (or similar) endpoint, e.g. \"https:\/\/formspree.io\/f\/xxxxxxx\" -> sends each submission to you automatically<br \/>\nasync function send(subject,text,reply){<br \/>\n if(!FORM_URL)return false;<br \/>\n try{const r=await fetch(FORM_URL,{method:\"POST\",headers:{\"Content-Type\":\"application\/json\",\"Accept\":\"application\/json\"},body:JSON.stringify(reply?{_subject:subject,message:text,email:reply}:{_subject:subject,message:text})});return r.ok;}catch(e){return false;}}<br \/>\nconst esc=s=>String(s??\"\").replace(\/[&<>\"']\/g,c=>({\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",'\"':\"&quot;\",\"'\":\"&#39;\"}[c]));<br \/>\nconst slug=s=>s.toLowerCase().replace(\/[^a-z0-9]+\/g,\"-\").replace(\/^-|-$\/g,\"\");<br \/>\nlet tab=\"scout\",db=null,isOwner=false,subs=[];<br \/>\nlet S={copy:\"\",ok:false,name:\"\",contact:\"\",picks:[],alts:[],eagleOnly:false,done:null,msg:\"\"};<br \/>\nlet P={copy:false,name:\"\",email:\"\",phone:\"\",scout:\"\",cls:[],msg:\"\"};<br \/>\nconst load=a=>a.reduce((t,i)=>t+CM[i][2],0);<br \/>\nconst eagleCt=()=>[...S.picks,...S.alts].filter(i=>CM[i][4]).length;<br \/>\nconst has=id=>HAVE[id]&&HAVE[id].includes(S.name);<br \/>\nfunction why(id){ \/\/ reason a class can't be added, else \"\"<br \/>\n if(!S.name)return\"Pick your name first\";<br \/>\n if(S.picks.includes(id)||S.alts.includes(id))return\"Already chosen\";<br \/>\n if(has(id))return\"Already awarded\";<br \/>\n if(CM[id][4]&&eagleCt()>=2)return\"Max 2 Eagle-required badges\";<br \/>\n const all=[...S.picks,...S.alts];<br \/>\n if((id==\"ai\"&&all.includes(\"cy\"))||(id==\"cy\"&&all.includes(\"ai\")))return\"AI or Cyber Security \u2013 only one\";<br \/>\n return\"\";}<br \/>\nfunction add(id,kind){<br \/>\n if(why(id))return;<br \/>\n if(kind==\"p\"){if(load(S.picks)+CM[id][2]>4){S.msg=\"Primary picks fill 4 class periods max (a 3-hour class uses 2). Make it an alternate or remove a pick.\";return render();}S.picks.push(id);}<br \/>\n else{if(S.alts.length>=2){S.msg=\"Only 2 alternates allowed.\";return render();}S.alts.push(id);}<br \/>\n S.msg=\"\";render();}<br \/>\nfunction mv(arr,i,d){const j=i+d;if(j<0||j>=arr.length)return;[arr[i],arr[j]]=[arr[j],arr[i]];render();}<br \/>\nfunction rm(arr,i){arr.splice(i,1);S.msg=\"\";render();}<br \/>\nfunction fee(){return 40+S.picks.reduce((t,i)=>t+CM[i][3],0);}<br \/>\nfunction summary(){<br \/>\n const L=(a)=>a.map((i,k)=>`  ${k+1}. ${CM[i][1]}${CM[i][4]?\" (Eagle)\":\"\"}`).join(\"\\n\")||\"  (none)\";<br \/>\n return `MBU Nov 7 \u2013 Scout request\\nScout: ${S.name}\\nParent contact: ${S.contact}${S.copy.trim()?\"\\nEmail copy to: \"+S.copy.trim():\"\"}\\nPICKS (ranked):\\n${L(S.picks)}\\nALTERNATES (ranked):\\n${L(S.alts)}`;}<br \/>\nasync function submitScout(){<br \/>\n if(!S.name)return S.msg=\"Choose your name.\",render();<br \/>\n if(!S.contact.trim())return S.msg=\"Add a parent phone or email.\",render();<br \/>\n if(!S.picks.length)return S.msg=\"Add at least one pick.\",render();<br \/>\n if(!S.ok)return S.msg=\"Please check the box confirming you don't already have these badges.\",render();<br \/>\n const pat=R.find(r=>r[1].some(x=>x.split(\"|\")[0]==S.name))[0];<br \/>\n const o={type:\"scout\",name:S.name,patrol:pat,contact:S.contact.trim(),picks:S.picks,alts:S.alts,ts:new Date().toISOString()};<br \/>\n S.done=summary();<br \/>\n if(await send(\"MBU request: \"+S.name,S.done,S.copy.trim()))S.msg=\"\u2705 Sent! You can resubmit to change it.\";<br \/>\n else S.msg=MAIL?\"Tap Email it (or Copy) below to send your request.\":\"Please copy the text below and send it to Roger.\";<br \/>\n render();}<br \/>\nasync function submitParent(){<br \/>\n if(!P.name.trim()||!(P.email.trim()||P.phone.trim()))return P.msg=\"Enter your name and an email or phone.\",render();<br \/>\n if(!P.cls.length)return P.msg=\"Check at least one class.\",render();<br \/>\n const o={type:\"parent\",name:P.name.trim(),email:P.email.trim(),phone:P.phone.trim(),scout:P.scout,cls:P.cls,ts:new Date().toISOString()};<br \/>\n const txt=`MBU adult classes\\nParent: ${o.name} ${o.email} ${o.phone}${P.copy&&o.email?\"\\nEmail copy to: \"+o.email:\"\"}\\nScout: ${o.scout}\\nClasses: ${P.cls.map(i=>ADULT.find(a=>a[0]==i)[1]).join(\"; \")}`;<br \/>\n P.done=txt;<br \/>\n if(await send(\"MBU adults: \"+o.name,txt,P.copy?o.email:\"\"))P.msg=\"\u2705 Sent!\";<br \/>\n else P.msg=MAIL?\"Tap Email it (or Copy) below to send.\":\"Copy the text below and send it to Roger.\";<br \/>\n render();}<br \/>\nconst cp=t=>navigator.clipboard&&navigator.clipboard.writeText(t).then(()=>alert(\"Copied!\")).catch(()=>alert(\"Select the text and copy it.\"));<br \/>\nfunction classCard(c){<br \/>\n const id=c[0],w=why(id),mine=S.picks.includes(id)||S.alts.includes(id);<br \/>\n return `<\/p>\n<div class=\"cl ${c[4]?\"e\":\"\"} ${has(id)?\"done\":\"\"}\">\n<div><b>${esc(c[1])}<\/b><\/div>\n<div>${c[4]?'<span class=\"tag e\">\u2605 EAGLE REQUIRED<\/span>':\"\"}<span class=\"tag\">${c[2]==4?\"All day\":c[2]==2?\"3 hrs\":\"1 period\"}<\/span>${c[3]?`<span class=\"tag\">+$${c[3]}<\/span>`:\"\"}${has(id)?'<span class=\"tag ok\">\u2714 ALREADY AWARDED<\/span>':(PROG[id]||[]).includes(S.name)?'<span class=\"tag\">\u23f3 In progress per report<\/span>':\"\"}<\/div>\n<p> ${c[5]?`<\/p>\n<div class=\"mut\">${esc(c[5])}<\/div>\n<p>`:\"\"}<\/p>\n<div class=\"row\"><button class=\"btn s\" ${w?\"disabled\":\"\"} onclick=\"add('${id}','p')\">+ Pick<\/button><button class=\"btn s\" ${w?\"disabled\":\"\"} onclick=\"add('${id}','a')\">+ Alternate<\/button>${has(id)?'<span class=\"lock\">\ud83d\udd12 Already earned \u2013 can\\'t select<\/span>':w&&!mine?`<span class=\"mut\">${w}<\/span>`:mine?'<span class=\"ok\">Chosen<\/span>':\"\"}<\/div>\n<\/div>\n<p>`;}<br \/>\nfunction list(arr,title,k){<br \/>\n return `<\/p>\n<div class=\"card\"><b>${title}<\/b>${arr.length?arr.map((id,i)=>`<\/p>\n<div class=\"pick\"><span class=\"n\">${i+1}<\/span><span class=\"grow\" style=\"flex:1\">${esc(CM[id][1])} ${CM[id][4]?'<span class=\"tag e\">EAGLE<\/span>':\"\"}<\/span><button class=\"btn s\" onclick=\"mv(S.${k},${i},-1)\">\u25b2<\/button><button class=\"btn s\" onclick=\"mv(S.${k},${i},1)\">\u25bc<\/button><button class=\"btn s\" onclick=\"rm(S.${k},${i})\">\u2715<\/button><\/div>\n<p>`).join(\"\"):'<\/p>\n<div class=\"mut\">Nothing yet<\/div>\n<p>'}<\/p>\n<\/div>\n<p>`;}<br \/>\nfunction scoutView(){<br \/>\n const opts=R.map(r=>`<optgroup label=\"${r[0]}\">${r[1].map(x=>{const[n,k]=x.split(\"|\");return`<option ${n==S.name?\"selected\":\"\"} value=\"${esc(n)}\">${esc(n)} (${k})<\/option>`}).join(\"\")}<\/optgroup>`).join(\"\");<br \/>\n const list1=C.filter(c=>!S.eagleOnly||c[4]);<br \/>\n return `<\/p>\n<div class=\"card\">\n<div class=\"row\">\n<div class=\"grow\"><label class=\"mut\">Scout name<\/label><select onchange=\"S.name=this.value;S.picks=S.picks.filter(i=>!has(i));S.alts=S.alts.filter(i=>!has(i));render()\"><option value=\"\">\u2014 choose \u2014<\/option>${opts}<\/select><\/div>\n<div class=\"grow\"><label class=\"mut\">Parent phone or email<\/label><input value=\"${esc(S.contact)}\" oninput=\"S.contact=this.value\" placeholder=\"so Roger can reach you\"><\/div>\n<div class=\"grow\"><label class=\"mut\">Email me a copy (optional)<\/label><input type=\"email\" value=\"${esc(S.copy)}\" oninput=\"S.copy=this.value\" placeholder=\"your email address\"><\/div>\n<\/div>\n<\/div>\n<div class=\"warn\"><b>Rules from the MBU flyer:<\/b> max <b>2 Eagle-required<\/b> badges per scout (counting alternates) \u00b7 only 1 of Artificial Intelligence \/ Cyber Security \u00b7 the day has <b>4 periods<\/b>: 1-period classes use 1, 3-hour classes use 2, all-day uses all 4 \u00b7 classes are first-come, so submit early \u00b7 Scoutmaster approval required, no blue cards \u00b7 bring your merit badge book, pen, notebook, 5 cans of food; wear Class A.<br \/>\n <b>Badges you already have:<\/b> Eagle-required badges marked \u2714 ALREADY AWARDED in the troop advancement report are locked for you. The report does not track elective badges (Chemistry, Photography, etc.) and \"Emergency Preparedness\" shares a row with Lifesaving, so check Scoutbook \/ your blue cards before you pick.<\/div>\n<h2>Your ranked picks<\/h2>\n<p>${list(S.picks,`Picks (${load(S.picks)}\/4 periods used) \u2014 rank 1 = most wanted`,\"picks\")}${list(S.alts,\"Two alternates (used if a pick is full)\",\"alts\")}<\/p>\n<div class=\"card\">Estimated cost: <b>$${fee()}<\/b> ($40 MBU + class fees on picks) \u00b7 Eagle-required chosen: <b>${eagleCt()}\/2<\/b><\/div>\n<p> <label class=\"card\" style=\"display:block;cursor:pointer\"><input type=\"checkbox\" style=\"width:auto\" ${S.ok?\"checked\":\"\"} onchange=\"S.ok=this.checked\"> I checked Scoutbook and I have <b>not<\/b> already earned any of these badges.<\/label><\/p>\n<div class=\"sticky\"><button class=\"btn p\" onclick=\"submitScout()\">Submit my request to Roger<\/button> <span class=\"${S.msg.startsWith(\"\u2705\")?\"ok\":\"err\"}\">${esc(S.msg)}<\/span><\/div>\n<p> ${S.done?`<\/p>\n<div class=\"card\">\n<div class=\"mut\">Keep a copy \/ send by email or text:<\/div>\n<p><textarea readonly>${esc(S.done)}<\/textarea><\/p>\n<div class=\"row\"><button class=\"btn\" onclick=\"cp(S.done)\">Copy<\/button>${MAIL?`<a class=\"btn\" href=\"mailto:${MAIL}?subject=MBU%20request%20${encodeURIComponent(S.name)}${S.copy.trim()?\"&#038;cc=\"+encodeURIComponent(S.copy.trim()):\"\"}&#038;body=${encodeURIComponent(S.done)}\">Email it<\/a>`:\"\"}<\/div>\n<\/div>\n<p>`:\"\"}<\/p>\n<h2>Classes <label class=\"mut\" style=\"font-weight:400\"><input type=\"checkbox\" style=\"width:auto\" ${S.eagleOnly?\"checked\":\"\"} onchange=\"S.eagleOnly=this.checked;render()\"> Show Eagle-required only<\/label><\/h2>\n<div class=\"g\">${list1.map(classCard).join(\"\")}<\/div>\n<p>`;}<br \/>\nfunction parentView(){<br \/>\n return `<\/p>\n<div class=\"card\"><b>Adult classes at MBU<\/b><\/p>\n<div class=\"mut\">Parents register through the troop contact (Roger). Check the classes you'd like to attend.<\/div>\n<div class=\"row\" style=\"margin-top:8px\">\n<div class=\"grow\"><label class=\"mut\">Your name<\/label><input value=\"${esc(P.name)}\" oninput=\"P.name=this.value\"><\/div>\n<div class=\"grow\"><label class=\"mut\">Email<\/label><input value=\"${esc(P.email)}\" oninput=\"P.email=this.value\"><\/div>\n<div class=\"grow\"><label class=\"mut\">Phone<\/label><input value=\"${esc(P.phone)}\" oninput=\"P.phone=this.value\"><\/div>\n<div class=\"grow\"><label class=\"mut\">Your scout<\/label><select onchange=\"P.scout=this.value\"><option value=\"\">\u2014<\/option>${R.flatMap(r=>r[1]).map(x=>x.split(\"|\")[0]).sort().map(n=>`<option ${n==P.scout?\"selected\":\"\"}>${esc(n)}<\/option>`).join(\"\")}<\/select><\/div>\n<\/div>\n<p> ${ADULT.map(a=>`<label class=\"pick\" style=\"cursor:pointer\"><input type=\"checkbox\" style=\"width:auto\" ${P.cls.includes(a[0])?\"checked\":\"\"} onchange=\"P.cls=this.checked?[...P.cls,'${a[0]}']:P.cls.filter(x=>x!='${a[0]}')\"> ${esc(a[1])}<\/label>`).join(\"\")}<br \/>\n <label class=\"pick\" style=\"cursor:pointer\"><input type=\"checkbox\" style=\"width:auto\" ${P.copy?\"checked\":\"\"} onchange=\"P.copy=this.checked\"> Email me a copy (uses the email above)<\/label><\/p>\n<div class=\"mut\" style=\"margin-top:6px\">MBU also needs counselors and staff; tell Roger if you'd like to help. One adult is needed per 6 scouts attending.<\/div>\n<div class=\"row\" style=\"margin-top:8px\"><button class=\"btn p\" onclick=\"submitParent()\">Submit<\/button><span class=\"${P.msg.startsWith(\"\u2705\")?\"ok\":\"err\"}\">${esc(P.msg)}<\/span><\/div>\n<p> ${P.done?`<textarea readonly>${esc(P.done)}<\/textarea><button class=\"btn\" onclick=\"cp(P.done)\">Copy<\/button>${MAIL?`<a class=\"btn\" href=\"mailto:${MAIL}?subject=MBU%20adult%20classes${P.copy&#038;&#038;P.email.trim()?\"&#038;cc=\"+encodeURIComponent(P.email.trim()):\"\"}&#038;body=${encodeURIComponent(P.done)}\">Email it<\/a>`:\"\"}`:\"\"}<\/div>\n<p>`;}<br \/>\nfunction adminView(){<br \/>\n const sc=subs.filter(s=>s.type==\"scout\"),pa=subs.filter(s=>s.type==\"parent\");<br \/>\n const t={};sc.forEach(s=>[...s.picks.map((i,k)=>[i,\"p\"]),...s.alts.map(i=>[i,\"a\"])].forEach(([i,k])=>{(t[i]=t[i]||{p:0,a:0,n:[]})[k]++;if(k==\"p\")t[i].n.push(s.name)}));<br \/>\n const rows=Object.entries(t).sort((a,b)=>b[1].p-a[1].p).map(([i,v])=>`<\/p>\n<tr>\n<td>${esc(CM[i][1])}${CM[i][4]?\" \u2605\":\"\"}<\/td>\n<td>${v.p}${v.p>4?' <span class=\"err\">over 4\/class<\/span>':\"\"}<\/td>\n<td>${v.a}<\/td>\n<td>${esc(v.n.join(\", \"))}<\/td>\n<\/tr>\n<p>`).join(\"\");<br \/>\n const ai=(t.ai?.p||0),cy=(t.cy?.p||0);<br \/>\n const csv=\"Scout,Patrol,Contact,Picks,Alternates\\n\"+sc.map(s=>[s.name,s.patrol,s.contact,s.picks.map(i=>CM[i][1]).join(\" | \"),s.alts.map(i=>CM[i][1]).join(\" | \")].map(x=>`\"${String(x).replace(\/\"\/g,'\"\"')}\"`).join(\",\")).join(\"\\n\");<br \/>\n return `<\/p>\n<div class=\"card\"><b>Troop contact view<\/b> \u2014 ${sc.length} of 34 scouts submitted, ${pa.length} parents.${(ai>1||cy>1)?'<\/p>\n<div class=\"err\">AI\/Cyber: flyer allows 1 scout per troop per class \u2013 you have more requests than that.<\/div>\n<p>':\"\"}<\/p>\n<div class=\"mut\">Flyer limits: 4 scouts per class session from one troop \u00b7 2 Eagle badges per scout \u00b7 1 AI\/Cyber per troop.<\/div>\n<\/div>\n<div class=\"card scr\">\n<table>\n<tr>\n<th>Class<\/th>\n<th>Picks<\/th>\n<th>Alts<\/th>\n<th>Who<\/th>\n<\/tr>\n<p>${rows||'<\/p>\n<tr>\n<td colspan=4 class=\"mut\">No submissions yet<\/td>\n<\/tr>\n<p>'}<\/table>\n<\/div>\n<div class=\"card scr\"><b>Scouts<\/b><\/p>\n<table>\n<tr>\n<th>Scout<\/th>\n<th>Patrol<\/th>\n<th>Contact<\/th>\n<th>Ranked picks<\/th>\n<th>Alternates<\/th>\n<\/tr>\n<p>${sc.map(s=>`<\/p>\n<tr>\n<td>${esc(s.name)}<\/td>\n<td>${esc(s.patrol)}<\/td>\n<td>${esc(s.contact)}<\/td>\n<td>${s.picks.map((i,k)=>`${k+1}. ${esc(CM[i][1])}`).join(\"<br \/>\")}<\/td>\n<td>${s.alts.map((i,k)=>`${k+1}. ${esc(CM[i][1])}`).join(\"<br \/>\")}<\/td>\n<\/tr>\n<p>`).join(\"\")}<\/table>\n<\/div>\n<div class=\"card scr\"><b>Parents \/ adult classes<\/b><\/p>\n<table>\n<tr>\n<th>Parent<\/th>\n<th>Contact<\/th>\n<th>Scout<\/th>\n<th>Classes<\/th>\n<\/tr>\n<p>${pa.map(p=>`<\/p>\n<tr>\n<td>${esc(p.name)}<\/td>\n<td>${esc(p.email)} ${esc(p.phone)}<\/td>\n<td>${esc(p.scout)}<\/td>\n<td>${p.cls.map(i=>esc(ADULT.find(a=>a[0]==i)[1])).join(\"<br \/>\")}<\/td>\n<\/tr>\n<p>`).join(\"\")}<\/table>\n<\/div>\n<p> <button class=\"btn\" onclick=\"cp(${esc(JSON.stringify(csv))})\">Copy scouts as CSV<\/button>`;}<br \/>\nfunction render(){<br \/>\n const T=[[\"scout\",\"Scout request\"],[\"parent\",\"Parent \/ adult classes\"]];if(isOwner)T.push([\"admin\",\"Roger's view\"]);<br \/>\n document.getElementById(\"tabs\").innerHTML=T.map(t=>`<button class=\"tab ${tab==t[0]?\"on\":\"\"}\" onclick=\"tab='${t[0]}';render()\">${t[1]}<\/button>`).join(\"\");<br \/>\n const a=document.activeElement,id=a&&a.tagName==\"INPUT\"&&a.type==\"text\"?a.placeholder||a.value:null;<br \/>\n document.getElementById(\"main\").innerHTML=tab==\"scout\"?scoutView():tab==\"parent\"?parentView():adminView();}<br \/>\nrender();<br \/>\n<\/script><\/p>\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>&lt;!doctype html&gt; &nbsp; \u269c\ufe0f Troop 307 \u2014 Merit Badge University Saturday, Nov 7, 2026 \u00b7 St. Philip&#8217;s College \u00b7 Check-in 7:00 AM, classes 8:15 AM\u20133:45 PM \u00b7 $40 per Scout + any class fee. \u00a0 \u00a0<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-21","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>MBU - The Lopez Family Website<\/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:\/\/rogerlopez.com\/index.php\/mbu\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"MBU - The Lopez Family Website\" \/>\n<meta property=\"og:description\" content=\"&lt;!doctype html&gt; &nbsp; \u269c\ufe0f Troop 307 \u2014 Merit Badge University Saturday, Nov 7, 2026 \u00b7 St. Philip&#8217;s College \u00b7 Check-in 7:00 AM, classes 8:15 AM\u20133:45 PM \u00b7 $40 per Scout + any class fee. \u00a0 \u00a0\" \/>\n<meta property=\"og:url\" content=\"https:\/\/rogerlopez.com\/index.php\/mbu\/\" \/>\n<meta property=\"og:site_name\" content=\"The Lopez Family Website\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-03T01:23:10+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/rogerlopez.com\\\/index.php\\\/mbu\\\/\",\"url\":\"https:\\\/\\\/rogerlopez.com\\\/index.php\\\/mbu\\\/\",\"name\":\"MBU - The Lopez Family Website\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/rogerlopez.com\\\/#website\"},\"datePublished\":\"2026-10-02T22:47:38+00:00\",\"dateModified\":\"2026-10-03T01:23:10+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/rogerlopez.com\\\/index.php\\\/mbu\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/rogerlopez.com\\\/index.php\\\/mbu\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/rogerlopez.com\\\/index.php\\\/mbu\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/rogerlopez.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"MBU\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/rogerlopez.com\\\/#website\",\"url\":\"https:\\\/\\\/rogerlopez.com\\\/\",\"name\":\"The Lopez Family Website\",\"description\":\"Just another WordPress site\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/rogerlopez.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"MBU - The Lopez Family Website","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:\/\/rogerlopez.com\/index.php\/mbu\/","og_locale":"en_US","og_type":"article","og_title":"MBU - The Lopez Family Website","og_description":"&lt;!doctype html&gt; &nbsp; \u269c\ufe0f Troop 307 \u2014 Merit Badge University Saturday, Nov 7, 2026 \u00b7 St. Philip&#8217;s College \u00b7 Check-in 7:00 AM, classes 8:15 AM\u20133:45 PM \u00b7 $40 per Scout + any class fee. \u00a0 \u00a0","og_url":"https:\/\/rogerlopez.com\/index.php\/mbu\/","og_site_name":"The Lopez Family Website","article_modified_time":"2026-10-03T01:23:10+00:00","twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/rogerlopez.com\/index.php\/mbu\/","url":"https:\/\/rogerlopez.com\/index.php\/mbu\/","name":"MBU - The Lopez Family Website","isPartOf":{"@id":"https:\/\/rogerlopez.com\/#website"},"datePublished":"2026-10-02T22:47:38+00:00","dateModified":"2026-10-03T01:23:10+00:00","breadcrumb":{"@id":"https:\/\/rogerlopez.com\/index.php\/mbu\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/rogerlopez.com\/index.php\/mbu\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/rogerlopez.com\/index.php\/mbu\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/rogerlopez.com\/"},{"@type":"ListItem","position":2,"name":"MBU"}]},{"@type":"WebSite","@id":"https:\/\/rogerlopez.com\/#website","url":"https:\/\/rogerlopez.com\/","name":"The Lopez Family Website","description":"Just another WordPress site","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/rogerlopez.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"}]}},"_links":{"self":[{"href":"https:\/\/rogerlopez.com\/index.php\/wp-json\/wp\/v2\/pages\/21","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rogerlopez.com\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/rogerlopez.com\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/rogerlopez.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/rogerlopez.com\/index.php\/wp-json\/wp\/v2\/comments?post=21"}],"version-history":[{"count":2,"href":"https:\/\/rogerlopez.com\/index.php\/wp-json\/wp\/v2\/pages\/21\/revisions"}],"predecessor-version":[{"id":26,"href":"https:\/\/rogerlopez.com\/index.php\/wp-json\/wp\/v2\/pages\/21\/revisions\/26"}],"wp:attachment":[{"href":"https:\/\/rogerlopez.com\/index.php\/wp-json\/wp\/v2\/media?parent=21"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}