/* Adapt only v7 widgets; keep Symfony names, values, confirmation and CSRF fields. */ (function(){ function init(){ const form=document.querySelector('[data-v7-cms-form]');if(!form||form.dataset.v7ValidationReady)return;form.dataset.v7ValidationReady='true'; const group=form.querySelector('[data-v7-field="checkbox"]'); const boxes=group?[...group.querySelectorAll('input[type=checkbox]')]:[]; const otherField=group?.nextElementSibling?.matches('[data-v7-field="text"]')?group.nextElementSibling:null; const other=boxes.find(x=>x.closest('label')?.textContent.trim()==='その他の補助金'); const undecided=boxes.find(x=>x.closest('label')?.textContent.includes('まだ決まっていない')); boxes.forEach(x=>x.required=false); const syncOther=()=>{if(!otherField)return;otherField.hidden=!other?.checked;const control=otherField.querySelector('input');if(control){control.required=!!other?.checked;if(!other?.checked)control.value=''}const badge=otherField.querySelector('.c-form-optional');if(badge){badge.className='c-form-required';badge.textContent='必須'}}; const selected=new URLSearchParams(location.search).get('subsidy');const slugs=['new-combined','labor-saving','growth','other','undecided'];const chosen=boxes[slugs.indexOf(selected)];if(chosen)chosen.checked=true; boxes.forEach(x=>x.addEventListener('change',()=>{if(x===undecided&&x.checked)boxes.forEach(v=>{if(v!==x)v.checked=false});else if(x.checked&&undecided)undecided.checked=false;const error=form.querySelector('[data-v7-subsidy-error]');if(error){error.textContent='';error.hidden=false}boxes.forEach(v=>v.removeAttribute('aria-invalid'));syncOther()}));syncOther(); form.querySelectorAll('[data-v7-field="name"]').forEach(group=>{ const inputs=[...group.querySelectorAll('input[type=text]')];if(inputs.length!==2)return; const full=document.createElement('input');full.className='c-form-control';full.type='text';full.autocomplete='name';full.id=(inputs[0].parentElement.id||group.id||'v7-name')+'-full';full.placeholder='例)山田 太郎';full.required=inputs.some(x=>x.required)||!!group.querySelector('.c-form-required');full.value=inputs.map(x=>x.value).join(' ').trim();const native=inputs[0].parentElement;native.before(full);native.classList.add('v7-native-fields');inputs.forEach(x=>x.type='hidden');const label=group.querySelector('.p-form__label');if(label)label.htmlFor=full.id; const sync=()=>{const parts=full.value.trim().split(/[\s\u3000]+/);inputs[0].value=parts.shift()||'';inputs[1].value=parts.join(' ');full.setCustomValidity(full.required&&full.value.trim()&&!inputs[1].value?'姓と名をスペースで区切って入力してください。':'')};full.addEventListener('input',sync);sync(); }); const native=form.querySelector('[data-v7-agree-native]'),agree=form.querySelector('[data-v7-agree-control]'),agreeLabel=form.querySelector('[data-v7-agree-label]'); if(native&&agree){const choices=[...native.querySelectorAll('input')];const sync=()=>choices.forEach(x=>x.checked=agree.checked?x.value==='同意する':x.value==='同意しない');native.hidden=true;agreeLabel.hidden=false;agree.addEventListener('change',sync);sync()} form.querySelectorAll('[data-v7-field]').forEach(g=>{if(!g.hidden&&g.dataset.v7Field!=='checkbox'&&g.querySelector('.c-form-required'))g.querySelectorAll('input:not([type=hidden]),textarea,select').forEach(c=>c.required=true)}); // Validate all visible fields before native validation can suppress the submit event. form.noValidate=true; const css=document.createElement('style');css.id='sv-form-errors-20260918'; css.textContent=` [data-v7-cms-form] .p-form__error,[data-v7-cms-form] .p-form__error *{color:#c40000!important} [data-v7-cms-form] .p-form__error{display:block;margin:8px 0!important;font-size:14px;line-height:1.6} [data-v7-cms-form] .p-form__error[hidden],[data-v7-cms-form] [data-v7-server-errors]:empty{display:none!important} [data-v7-cms-form] [data-v7-server-errors] ul{margin:0;padding-left:1.2em} [data-v7-cms-form] [aria-invalid="true"], [data-v7-cms-form] .c-form-check:has(input[aria-invalid="true"]){border:1px solid #c40000!important;outline-color:#c40000!important;box-shadow:none!important} [data-v7-cms-form] [aria-invalid="true"]:focus{outline:2px solid #c40000!important;outline-offset:2px} [data-v7-cms-form] .p-form__group{scroll-margin-top:24px} `; document.head.appendChild(css); const groups=[...form.querySelectorAll('[data-v7-field],[data-v7-agree]')]; const controlsOf=g=>[...g.querySelectorAll('input:not([type=hidden]),textarea,select')].filter(c=>!c.disabled&&!c.closest('[hidden]')&&c.getClientRects().length); const errors=new Map(); groups.forEach((g,i)=>{ const error=g.querySelector('[data-v7-subsidy-error]')||document.createElement('p'); error.className='p-form__error';error.dataset.v7ClientError='';error.id='v7-field-error-'+i;error.setAttribute('role','alert');error.hidden=true; const label=g.querySelector('.p-form__label'); if(label)label.after(error);else if(g.querySelector('[data-v7-agree-label]'))g.querySelector('[data-v7-agree-label]').before(error);else g.prepend(error); errors.set(g,error); }); const labelOf=g=>{const label=g.querySelector('.p-form__label');if(!label)return 'この項目';const copy=label.cloneNode(true);copy.querySelectorAll('.c-form-required,.c-form-optional').forEach(e=>e.remove());return copy.textContent.trim();}; function mark(control,error,invalid){ const ids=new Set((control.getAttribute('aria-describedby')||'').split(/\s+/).filter(Boolean)); if(invalid){control.setAttribute('aria-invalid','true');ids.add(error.id);}else{control.removeAttribute('aria-invalid');ids.delete(error.id);} if(ids.size)control.setAttribute('aria-describedby',[...ids].join(' '));else control.removeAttribute('aria-describedby'); } function validateGroup(g){ const error=errors.get(g),controls=controlsOf(g);let message='',first=null; g.querySelectorAll('[aria-invalid="true"]').forEach(c=>mark(c,error,false)); if(g.hidden){error.textContent='';error.hidden=true;return null;} if(g===group&&boxes.length&&!boxes.some(c=>c.checked)){ message='相談対象の補助金を1つ以上選択してください。';first=boxes[0];boxes.forEach(c=>mark(c,error,true)); }else controls.forEach(c=>{ let text=''; if(c.required&&(c.type==='radio'?!controls.some(v=>v.type==='radio'&&v.name===c.name&&v.checked):c.type==='checkbox'?!c.checked:!c.value.trim()))text=g.hasAttribute('data-v7-agree')?'個人情報の取り扱いへの同意が必要です。':labelOf(g)+'を'+(c.tagName==='SELECT'?'選択':'入力')+'してください。'; else if(c.type==='tel'&&c.value&&c.pattern==='[0-9()+ -]{9,20}'&&!/^[0-9()+ -]{9,20}$/.test(c.value))text=c.title||'電話番号を正しい形式で入力してください。'; else if(!c.validity.valid){ if(c.validity.customError)text=c.validationMessage; else if(c.validity.typeMismatch&&c.type==='email')text='メールアドレスを正しい形式で入力してください。'; else if(c.validity.patternMismatch)text=c.title||labelOf(g)+'を正しい形式で入力してください。'; else text=labelOf(g)+'の入力内容を確認してください。'; } if(text){mark(c,error,true);if(!message){message=text;first=c;}} }); error.textContent=message;error.hidden=!message; return first; } groups.forEach(g=>{ const server=g.querySelector('[data-v7-server-errors]'); if(server&&server.textContent.trim()){ server.id=server.id||'v7-server-error-'+groups.indexOf(g); controlsOf(g).forEach(c=>mark(c,server,true)); } const update=()=>{ if(server&&server.textContent.trim()){server.textContent='';controlsOf(g).forEach(c=>mark(c,server,false));} if(form.dataset.v7ValidationAttempted==='true'||!errors.get(g).hidden)validateGroup(g); if(g===group&&otherField&&otherField.hidden)validateGroup(otherField); }; g.addEventListener('input',update);g.addEventListener('change',update); }); window.v7ValidateCmsForm=function(f){ if(f!==form)return true;form.dataset.v7ValidationAttempted='true'; let first=null;groups.forEach(g=>{const invalid=validateGroup(g);if(!first&&invalid)first=invalid;}); if(first){const g=first.closest('.p-form__group');g.style.scrollMarginTop=((document.querySelector('.l-header')?.offsetHeight||0)+24)+'px';first.focus({preventScroll:true});g.scrollIntoView({block:'start',behavior:'auto'});return false;} return true; }; form.addEventListener('submit',e=>{if(!window.v7ValidateCmsForm(form)){e.preventDefault();e.stopImmediatePropagation()}},true); } if(document.readyState==='loading')document.addEventListener('DOMContentLoaded',init);else init(); })(); window.submitLoading = function(){const form=document.forms['form'];if(!form)return;form.setAttribute('aria-busy','true');form.querySelectorAll('button[type=submit],input[type=submit]').forEach(b=>b.disabled=true);}; const cmsForm=document.forms['form'];if(cmsForm)cmsForm.addEventListener('submit',function(e){if(!e.defaultPrevented)window.submitLoading();});