1/* ============================================================================ 2 register.js â å ±å表æ§å¶å¨ 3 å¹³å°åé¸ä¸ / å è³¼åæ / æªæå¹´âç£è·äººåæ / é©è / æäº¤ã 4 payload æ¬ä½è apps_script/register.gs ç HEADERS å°æé åºä¸è´ï¼ç´ ç·ï¼ã 5 ENDPOINT ç空 = ç¤ºç¯æ¨¡å¼ï¼å³æäº¤å³åºæåç«é¢ï¼ï¼è²¼ä¸ Apps Script Web App URL å³ä¸ç·ã 6 ========================================================================== */ 7(function () { 8 "use strict"; 9 var ENDPOINT = ""; // è²¼ä¸ Apps Script Web App URL å³ä¸ç·ï¼ç空çºç¤ºç¯æ¨¡å¼ 10 var $ = function (id) { return document.getElementById(id); }; 11 var PLATFORM = { state: "YouTube" }; 12 var addon = false; 13 var isEmail = function (v) { return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(v); }; 14 function mark(el, bad) { if (el) el.classList.toggle("bad", bad); } 15 16 function notifyErr(m) { 17 var fe = $("formerr"); 18 if (fe) { fe.textContent = m; fe.classList.add("show"); } 19 if (window.toast) window.toast(m, "err", { title: "æªè½æäº¤", duration: 6000 }); 20 } 21 function hideErr() { var fe = $("formerr"); if (fe) fe.classList.remove("show"); } 22 23 document.addEventListener("DOMContentLoaded", function () { 24 // platform picker 25 var seg = $("seg"); 26 if (seg) seg.addEventListener("click", function (e) { 27 var b = e.target.closest("button[data-p]"); if (!b) return; 28 Array.prototype.forEach.call(seg.querySelectorAll("button"), function (x) { x.classList.remove("on"); }); 29 b.classList.add("on"); PLATFORM.state = b.getAttribute("data-p"); 30 var url = $("videoUrl"), file = $("videoFile"), lab = $("vlabel"), hint = $("vhint"); 31 if (PLATFORM.state === "ç´æ¥ä¸å³") { 32 url.style.display = "none"; file.style.display = "block"; 33 lab.innerHTML = 'ä¸å³æ¼è¬å½±ç<span class="req">*</span>'; 34 hint.textContent = "é¸æå½±çæªï¼å»ºè° 1â3 åéï¼ãæ£å¼çæä¸è¼è³é²ç«¯å²åï¼ç¤ºç¯çåªè¨éæªåã"; 35 } else { 36 url.style.display = "block"; file.style.display = "none"; 37 lab.innerHTML = PLATFORM.state + ' å½±çé£çµ<span class="req">*</span>'; 38 var ph = { YouTube: "https://youtu.be/...", Bilibili: "https://www.bilibili.com/video/...", "微信è¦é »è": "è²¼ä¸è¦é »èå享é£çµ / å½±çé ç¶²å" }; 39 url.placeholder = ph[PLATFORM.state] || "https://"; 40 hint.textContent = PLATFORM.state === "微信è¦é »è" ? "è²¼ä¸å¾®ä¿¡è¦é »èçå享é£çµæå½±çé ç¶²åã" : "è²¼ä¸å½±çé£çµï¼å ¬éæä¸å ¬éåå¯ï¼ã"; 41 } 42 }); 43 44 // plan addon toggle 45 var pa = $("plan-addon"); 46 if (pa) pa.addEventListener("click", function () { addon = !addon; pa.classList.toggle("on", addon); }); 47 48 // minor logic 49 function isMinor() { 50 var cat = $("category").value; 51 if (cat === "å°å çµ" || cat === "éå¹´çµ") return true; 52 var dob = $("dob").value; if (!dob) return false; 53 var d = new Date(dob), n = new Date(), a = n.getFullYear() - d.getFullYear(); 54 if (n.getMonth() < d.getMonth() || (n.getMonth() === d.getMonth() && n.getDate() < d.getDate())) a--; 55 return a < 18; 56 } 57 function refreshGuardian() { 58 var show = isMinor(); 59 $("guardian-section").style.display = show ? "block" : "none"; 60 var g = $("guardian"); if (g) g.classList.toggle("show", show); 61 if ($("consent-n")) $("consent-n").textContent = show ? "6" : "5"; 62 } 63 if ($("category")) $("category").addEventListener("change", refreshGuardian); 64 if ($("dob")) $("dob").addEventListener("change", refreshGuardian); 65 window.__isMinor = isMinor; 66 67 // submit 68 var form = $("regform"); 69 if (form) form.addEventListener("submit", function (e) { 70 e.preventDefault(); hideErr(); 71 var errs = []; 72 [["name", "å§å"], ["dob", "åºçæ¥æ"], ["category", "çµå¥"], ["region", "æå¨å°å"], ["email", "é»éµ"], ["phone", "è¯çµ¡é»è©±"], ["title", "æ¼è¬é¡ç®"]].forEach(function (p) { 73 var el = $(p[0]), bad = !el.value.trim(); mark(el, bad); if (bad) errs.push(p[1]); 74 }); 75 if ($("email").value && !isEmail($("email").value)) { mark($("email"), true); errs.push("ææé»éµ"); } 76 77 var videoVal = ""; 78 if (PLATFORM.state === "ç´æ¥ä¸å³") { 79 var f = $("videoFile").files[0]; if (!f) { mark($("videoFile"), true); errs.push("æ¼è¬å½±çæª"); } else videoVal = f.name; 80 } else { 81 var u = $("videoUrl").value.trim(), bad = !u; mark($("videoUrl"), bad); 82 if (bad) errs.push("æ¼è¬å½±çé£çµ"); else videoVal = u; 83 } 84 85 if (isMinor()) { 86 [["gname", "å®¶é·å§å"], ["grel", "èåè³½è éä¿"], ["gemail", "å®¶é·é»éµ"], ["gphone", "å®¶é·é»è©±"]].forEac
86h(function (p) { 87 var el = $(p[0]), bad = !el.value.trim(); mark(el, bad); if (bad) errs.push(p[1]); 88 }); 89 if ($("gemail").value && !isEmail($("gemail").value)) { mark($("gemail"), true); errs.push("ææå®¶é·é»éµ"); } 90 if (!$("gconsent").checked) errs.push("å®¶é·åæ"); 91 } 92 if (!$("consent1").checked) errs.push("AI è©ä¼°åææ¢æ¬¾"); 93 94 if (errs.length) { notifyErr("è«å®æä»¥ä¸å¿ å¡«ï¼åæé ç®ï¼" + errs.join("ã") + "ã"); window.scrollTo({ top: 0, behavior: "smooth" }); return; } 95 96 var payload = { 97 timestamp: new Date().toISOString(), 98 name: $("name").value.trim(), dob: $("dob").value, category: $("category").value, region: $("region").value, 99 email: $("email").value.trim(), phone: $("phone").value.trim(), wechat: $("wechat").value.trim(), org: $("org").value.trim(), 100 title: $("title").value.trim(), language: $("language").value, 101 videoPlatform: PLATFORM.state, video: videoVal, round: $("round").value, 102 plan: addon ? "æ¨æºåè© + é²éå ±å(å è³¼)" : "æ¨æºåè©", 103 minor: isMinor(), 104 guardianName: $("gname").value.trim(), guardianRelation: $("grel").value.trim(), 105 guardianEmail: $("gemail").value.trim(), guardianPhone: $("gphone").value.trim(), 106 consentAI: $("consent1").checked, consentContact: $("consent2").checked 107 }; 108 var id = "GBA" + Date.now().toString().slice(-8); 109 var btn = $("submitBtn"); btn.disabled = true; btn.textContent = "æäº¤ä¸â¦"; 110 111 var done = function () { succeed(id); }; 112 var fail = function (err) { notifyErr("æäº¤æªè½å®æï¼è«ç¨å¾å試ãæè¡è¨æ¯ï¼" + (err && err.message || err)); btn.disabled = false; btn.textContent = "æäº¤å ±å"; }; 113 114 if (ENDPOINT) { 115 fetch(ENDPOINT, { method: "POST", mode: "no-cors", headers: { "Content-Type": "text/plain;charset=utf-8" }, body: JSON.stringify(Object.assign({ id: id }, payload)) }) 116 .then(done).catch(fail); 117 } else { 118 setTimeout(done, 700); // ç¤ºç¯æ¨¡å¼ 119 } 120 }); 121 122 function succeed(id) { 123 if ($("okid")) $("okid").textContent = id; 124 if (form) form.style.display = "none"; 125 var s = $("success"); if (s) s.classList.add("show"); 126 if (window.toast) window.toast("å ±åå·²æäº¤ï¼å ±åç·¨è " + id, "ok", { title: "æäº¤æå" }); 127 window.scrollTo({ top: 0, behavior: "smooth" }); 128 } 129 if ($("again")) $("again").addEventListener("click", function () { 130 var s = $("success"); if (s) s.classList.remove("show"); 131 if (form) { form.reset(); form.style.display = "block"; } 132 refreshGuardian(); var btn = $("submitBtn"); btn.disabled = false; btn.textContent = "æäº¤å ±å"; 133 addon = false; if (pa) pa.classList.remove("on"); 134 }); 135 136 refreshGuardian(); 137 }); 138})();
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.