document.addEventListener('DOMContentLoaded',()=>{ const menu=document.querySelector('.mobile-menu'); const nav=document.querySelector('.nav'); if(menu&&nav){menu.addEventListener('click',()=>{const open=nav.style.display==='flex';nav.style.display=open?'none':'flex';if(!open){Object.assign(nav.style,{position:'absolute',top:'66px',left:'0',right:'0',background:'#fff',padding:'22px',flexDirection:'column',alignItems:'flex-start',borderBottom:'1px solid #d8e1e8'})}})} document.querySelectorAll('[data-video-gallery]').forEach(gallery=>{ const videoFrame=gallery.querySelector('.corporate-video-frame'); const frame=videoFrame?.querySelector('iframe'); const mobile=window.matchMedia('(max-width:720px)'); const controls=gallery.querySelector('.corporate-video-controls'); const title=gallery.querySelector('[data-video-gallery-title]'); const description=gallery.querySelector('[data-video-gallery-description]'); const position=gallery.querySelector('[data-video-gallery-position]'); const dots=controls?[...controls.querySelectorAll('button')]:[]; const activeDot=()=>controls?controls.querySelector('button.is-active'):null; const pick=(dot,base)=>{ if(!dot)return ''; const dev=mobile.matches?'Mobile':'Desktop'; return dot.dataset[`video${base}${dev}`] || dot.dataset[`video${base}`] || ''; }; const frameFallbackSrc=()=>{ if(!videoFrame)return ''; const desktop=videoFrame.dataset.desktopVideo; const mobileSrc=videoFrame.dataset.mobileVideo; if(desktop&&mobileSrc)return mobile.matches?mobileSrc:desktop; return ''; }; const applyFrameShape=()=>{ if(!videoFrame)return; if(!mobile.matches){ videoFrame.style.aspectRatio=''; videoFrame.style.maxHeight=''; return; } const aspect=pick(activeDot(),'Aspect'); if(aspect){ videoFrame.style.aspectRatio=aspect; videoFrame.style.maxHeight='80vh'; }else{ videoFrame.style.aspectRatio=''; videoFrame.style.maxHeight=''; } }; const applyActive=()=>{ const dot=activeDot(); const src=pick(dot,'Src')||frameFallbackSrc(); if(frame&&src&&frame.getAttribute('src')!==src)frame.setAttribute('src',src); if(dot){ const frameTitle=pick(dot,'FrameTitle')||pick(dot,'Title'); if(frame&&frameTitle)frame.setAttribute('title',frameTitle); const nextTitle=pick(dot,'Title'); if(title&&nextTitle)title.textContent=nextTitle; const nextDescription=pick(dot,'Description'); if(description&&nextDescription)description.textContent=nextDescription; } applyFrameShape(); }; const selectDot=(dot,index)=>{ dots.forEach((item,i)=>{ const active=i===index; item.classList.toggle('is-active',active); item.setAttribute('aria-selected',active?'true':'false'); }); applyActive(); if(position)position.textContent=`Видео ${index+1} из ${dots.length}`; }; applyActive(); mobile.addEventListener('change',applyActive); dots.forEach((dot,index)=>{ dot.addEventListener('click',()=>selectDot(dot,index)); dot.addEventListener('keydown',event=>{ if(event.key!=='ArrowLeft'&&event.key!=='ArrowRight')return; event.preventDefault(); const nextIndex=(index+(event.key==='ArrowRight'?1:-1)+dots.length)%dots.length; dots[nextIndex].focus(); selectDot(dots[nextIndex],nextIndex); }); }); }); const contactForm=document.querySelector('#contact-request-form'); if(contactForm){ const status=document.querySelector('#contact-form-status'); const copyButton=document.querySelector('#contact-copy-request'); const submitButton=contactForm.querySelector('[type="submit"]'); const typeInputs=[...contactForm.querySelectorAll('[name="request_type"]')]; const branches=[...contactForm.querySelectorAll('[data-contact-branch]')]; const formatField=contactForm.querySelector('[name="format"]'); const cityField=contactForm.querySelector('[name="city"]'); const cityLabel=contactForm.querySelector('.contact-city-field'); const syncContactLocation=()=>{ const online=formatField?.value==='Онлайн'; const training=contactForm.querySelector('[name="request_type"]:checked')?.value==='training'; if(cityField){ cityField.disabled=!training||online; cityField.required=training&&!online; if(online)cityField.value=''; } if(cityLabel)cityLabel.hidden=online; }; const syncContactBranch=()=>{ const type=contactForm.querySelector('[name="request_type"]:checked')?.value||'training'; branches.forEach(branch=>{ const active=branch.dataset.contactBranch===type; branch.hidden=!active; branch.querySelectorAll('input,select,textarea').forEach(field=>{ field.disabled=!active; if(field.dataset.wasRequired==='true')field.required=active; }); }); }; branches.forEach(branch=>branch.querySelectorAll('[required]').forEach(field=>field.dataset.wasRequired='true')); typeInputs.forEach(input=>input.addEventListener('change',()=>{syncContactBranch();syncContactLocation()})); if(formatField)formatField.addEventListener('change',syncContactLocation); syncContactBranch(); syncContactLocation(); const requestText=()=>{ const data=new FormData(contactForm); const type=data.get('request_type'); const common=[ `Имя: ${data.get('name')||''}`, `Компания: ${data.get('company')||''}`, `Роль: ${data.get('role')||''}`, `Email: ${data.get('email')||''}`, `Телефон: ${data.get('phone')||''}` ]; if(type==='resources'){ return [...common,'','Запрос: корпоративный пакет онлайн-ресурсов',`Включить в заказ:\n${data.getAll('resources').map(resource=>`- ${resource}`).join('\n')||'- не выбрано'}`,`Количество сотрудников: ${data.get('resource_people')||''}`].join('\n'); } const location=data.get('format')==='Онлайн'?'Онлайн':data.get('city')||''; return [...common,'','Запрос: обучение с тренером',`Цели:\n${data.getAll('goals').map(goal=>`- ${goal}`).join('\n')||'- не выбраны'}`,`Группа: ${data.get('group')||''}`,`Формат: ${data.get('format')||''}`,`Место проведения: ${location}`].join('\n'); }; const cyrillicLetter=/[\u0400-\u04ff]/u; const latinLetter=/[a-z]/iu; const cyrillicName=/^[\u0400-\u04ff\s'’\-–]+$/u; const languageRules=[ {field:contactForm.querySelector('[name="name"]'),message:'Введите имя кириллицей. Допустимы пробел, дефис и апостроф.',validate:value=>cyrillicLetter.test(value)&&cyrillicName.test(value)}, {field:cityField,message:'Укажите город по-русски, без латинских букв.',validate:value=>cyrillicLetter.test(value)&&!latinLetter.test(value)} ]; const validateLanguageField=rule=>{ if(!rule.field||rule.field.disabled||!rule.field.value.trim()){ rule.field?.setCustomValidity(''); return; } rule.field.setCustomValidity(rule.validate(rule.field.value.trim())?'':rule.message); }; languageRules.forEach(rule=>rule.field?.addEventListener('input',()=>validateLanguageField(rule))); const validateContactRequest=()=>{ languageRules.forEach(validateLanguageField); if(!contactForm.reportValidity())return false; const type=contactForm.querySelector('[name="request_type"]:checked')?.value; if(type==='training'&&!contactForm.querySelector('[name="goals"]:checked')){ if(status)status.textContent='Выберите хотя бы одну цель обучения.'; contactForm.querySelector('.contact-goals')?.scrollIntoView({behavior:'smooth',block:'center'}); return false; } if(type==='resources'&&!contactForm.querySelector('[name="resources"]:checked')){ if(status)status.textContent='Выберите хотя бы один онлайн-ресурс или вариант «Все ресурсы».'; contactForm.querySelector('.contact-resources')?.scrollIntoView({behavior:'smooth',block:'center'}); return false; } return true; }; contactForm.addEventListener('submit',async(event)=>{ event.preventDefault(); if(!validateContactRequest())return; if(submitButton)submitButton.disabled=true; if(status)status.textContent='Отправляем запрос…'; try{ const encodedBody=new URLSearchParams(); new FormData(contactForm).forEach((value,key)=>encodedBody.append(key,value)); const response=await fetch(contactForm.action,{ method:'POST', body:encodedBody, headers:{ 'Accept':'application/json', 'X-Requested-With':'XMLHttpRequest' } }); const responseText=await response.text(); let result; try{ result=JSON.parse(responseText); }catch(error){ const diagnostic=responseText.replace(/\s+/g,' ').trim().slice(0,500); throw new Error(`Сервер вернул не JSON${diagnostic?`: ${diagnostic}`:''}`); } if(!result.ok)throw new Error(result.message||'Не удалось отправить запрос.'); contactForm.reset(); syncContactBranch(); syncContactLocation(); if(status)status.textContent=result.message||'Запрос отправлен.'; }catch(error){ if(status)status.textContent=error.message||'Не удалось отправить запрос. Напишите на info@bogdanov-associates.com.'; }finally{ if(submitButton)submitButton.disabled=false; } }); if(copyButton){copyButton.addEventListener('click',async()=>{ if(!validateContactRequest())return; try{ await navigator.clipboard.writeText(`Кому: info@bogdanov-associates.com\nТема: Корпоративный запрос\n\n${requestText()}`); if(status)status.textContent='Запрос и адрес скопированы. Вставьте текст в письмо в любом webmail.'; }catch(error){ if(status)status.textContent='Не удалось скопировать автоматически. Напишите на info@bogdanov-associates.com.'; } })} } });