`); win.document.close(); } // ── 이벤트 핸들러 ── function onLeAns(val){ state.leAns[state.leIdx]=val; render(); } function onLeNext(){ if(state.leIdxArray(5).fill(3))}); } } function onDomScore(qi,v){ const na=state.domAns.map((arr,i)=>i===state.domIdx?arr.map((a,j)=>j===qi?v:a):[...arr]); setState({domAns:na}); } function finish(){ const le=calcLE(); const doms=DD.map((d,i)=>({...d,score:state.domAns[i].reduce((s,v)=>s+v,0)})); const rec={id:Date.now(),name:state.anon?"익명":(state.name||"익명"),date:new Date().toLocaleDateString("ko-KR"),le,domains:doms.map(d=>({name:d.name,score:d.score}))}; state.allData.push(rec); save(); setState({results:{le,doms,rec},screen:"results"}); } function adminLogin(){ const pw=document.getElementById("pwInput")?.value||state.pwIn; if(pw===PW){setState({screen:"admin",pwIn:"",pwErr:false});} else setState({pwErr:true,pwIn:pw}); } function exportCSV(){ const h=["이름","검사일","기대수명",...DD.map(d=>d.name)]; const rows=state.allData.map(r=>[r.name,r.date,r.le,...(r.domains?.map(d=>d.score)||[])]); const csv=[h,...rows].map(r=>r.join(",")).join("\n"); const url=URL.createObjectURL(new Blob(["\uFEFF"+csv],{type:"text/csv;charset=utf-8;"})); Object.assign(document.createElement("a"),{href:url,download:"생애설계진단_데이터.csv"}).click(); } // ── 시작 ── render();