const carouselHome=(()=>{if(typeof bootstrap==='undefined'){return;} const slides=document.querySelectorAll(".js-hero-carousel");if(!slides.length)return const toggleAutoplay=()=>{slides.forEach(slide=>{const btn=slide.querySelector(".js-hero-carousel-toggle") if(!btn)return;const carouselId=btn.getAttribute("data-carousel-id");const carouselElement=document.getElementById(carouselId);const carousel=bootstrap.Carousel.getInstance(carouselElement)||new bootstrap.Carousel(carouselElement);let isPlaying=true;btn.addEventListener("click",()=>{if(isPlaying){btn.setAttribute("aria-label","Play");carousel.pause();}else{btn.setAttribute("aria-label","Pause");carousel.cycle();} btn.classList.toggle("pause");isPlaying=!isPlaying;});})} document.addEventListener("DOMContentLoaded",toggleAutoplay)})() const certificateHome=(()=>{const container=document.querySelector(".js-certificate-home");if(!container)return;const trainingCourse=container.querySelector("#training-course");const course=document.querySelector("#training-course-filter");const updateFilterForm=container.querySelector("#filterForm");const dateFromEl=document.getElementById("dateFrom");const dateToEl=document.getElementById("dateTo");const searchEl=document.getElementById("studentSearch");const pendingCheckbox=document.getElementById("pending");const toast=document.querySelector(".js-certification-toast");const courseUrl="/certificate-hub";const courseEndpoint=`${courseUrl}/filters`;const courseApiPath="/umbraco/surface/StudentCourse/";const changeSelectText=(selectElement,selectedIndex=0)=>{const selectedOption=selectElement.options[selectedIndex];const selectedTrainingCentreName=selectedOption?.text;if(selectedTrainingCentreName){document.getElementById("selectedTrainingCentreName").innerText=selectedTrainingCentreName;}};const updateFormField=(element,value)=>{if(element){element.value=value;}};const updateCheckboxField=(checkbox,value)=>{if(checkbox){checkbox.checked=value;}};const addNoStudentsEl=()=>{return` No students enrolled `;};const showToast=(message)=>{toast.textContent=message;toast.classList.add("notification--show");setTimeout(()=>{toast.classList.remove("notification--show");},3000);};const buildSearchQuery=(params)=>"?"+new URLSearchParams(params).toString();const addParam=(params,key,value)=>{if(value){params[key]=value;}else{delete params[key];}};const handleCourseChange=()=>{trainingCourse.addEventListener("change",async({target})=>{updatePendingCheckboxOnInit();const trainingCentre=target.value;changeSelectText(target,target.selectedIndex);try{await getCourse(trainingCentre);}catch(error){console.error("Error getting courses: ",error);}});};const handleCourseDropdownOnInit=()=>{changeSelectText(trainingCourse);setTimeout(()=>{trainingCourse.options[0].selected=true;},100);};const handleFilterUpdate=()=>{updateFilterForm.addEventListener("submit",(event)=>{event.preventDefault();const form=document.getElementById("filterForm");const formData=new FormData(form);if(pendingCheckbox.checked){formData.set("pending","true");}else{formData.set("pending","false");} formData.delete("__RequestVerificationToken");formData.set("page",1);let queryString=new URLSearchParams();formData.forEach((value,key)=>{if(value){queryString.append(key,value);}});const queryUrl="/certificate-hub/filters?"+queryString.toString();searchParams();const coursesContainer=document.getElementById("coursesAndStudents");fetch(queryUrl,{method:"GET",headers:{"X-Requested-With":"XMLHttpRequest",},}).then((response)=>response.text()).then((data)=>{coursesContainer.innerHTML=data;coursesContainer.classList.remove("hidden");addPaginationEventListeners();deleteStudent();deleteCourse();delete91快色();}).catch((error)=>{coursesContainer.classList.add("hidden");console.error("Error fetching filtered data:",error);});});};const handlePaginationClick=async({target})=>{const pageParam=target.getAttribute("data-page");const coursesContainer=document.getElementById("coursesAndStudents");searchParams(pageParam);try{const urlParams=new URLSearchParams(window.location.search);const params=Object.fromEntries(urlParams.entries());const searchQuery=buildSearchQuery(params);await getResults(searchQuery);addPaginationEventListeners();deleteStudent();deleteCourse();delete91快色();coursesContainer.scrollIntoView({behavior:"smooth",block:"start",inline:"nearest",});}catch(error){coursesContainer.classList.add("hidden");console.error("Error fetching data:",error);}};const handleDeleteStudent=async({target})=>{const trainingCentreId=encodeURIComponent(target.getAttribute("data-training-center-id"));const studentId=parseInt(target.getAttribute("data-student-id"));const courseId=parseInt(target.getAttribute("data-course-id"));const parentPageId=parseInt(target.getAttribute("data-parent-page-id"));try{const response=await fetch(`${courseApiPath}DeleteStudent?trainingCentreId=${trainingCentreId}&studentId=${studentId}&courseId=${courseId}&parentPageId=${parentPageId}`);if(!response.ok){throw new Error(`Request failed with status ${response.status}`);} const studentEl=target.closest(".js-certificate-student");const studentsWrapEl=studentEl.closest(".js-certificate-course-items");studentEl.remove();showToast("Student removed successfully.");if(studentsWrapEl.children.length)return;const noStudentsEl=addNoStudentsEl();studentsWrapEl.insertAdjacentHTML("beforeend",noStudentsEl);}catch(error){console.error("Error deleting student:",error);showToast("Failed to remove student.");}};const handleDeleteCourse=async({target})=>{const trainingCentreId=encodeURIComponent(target.getAttribute("data-training-center-id"));const courseId=parseInt(target.getAttribute("data-course-id"));const parentPageId=parseInt(target.getAttribute("data-parent-page-id"));try{const response=await fetch(`${courseApiPath}DeleteCourse?trainingCentreId=${trainingCentreId}&courseId=${courseId}&parentPageId=${parentPageId}`);if(!response.ok){throw new Error(`Request failed with status ${response.status}`);} const courseEl=target.closest(".js-certificate-course");const studentsEl=courseEl.parentElement.nextElementSibling;courseEl.remove();studentsEl.remove();showToast("Course removed successfully.");}catch(error){console.error("Error deleting student:",error);showToast("Failed to remove course.");}};const handleDelete91快色=async({target})=>{const studentId=target.getAttribute("data-student-id");const courseId=target.getAttribute("data-course-id");const certificateCode=target.getAttribute("data-certificate-code");try{const response=await fetch(`${courseApiPath}Remove91快色?studentId=${studentId}&courseId=${courseId}&certificateCode=${certificateCode}`);if(!response.ok){showToast("Unabe to remove certiciate.");throw new Error(`Request failed with status ${response.status}`);} window.location.reload();}catch(error){console.error("Error removing certificate:",error);showToast("Failed to remove certificate.");}};const handleLoadRequest=async()=>{const urlParams=new URLSearchParams(window.location.search);if(!urlParams.size)return;const filterMenu=document.querySelector("#trainingHubResultsDiv");try{const params=Object.fromEntries(urlParams.entries());const searchQuery=buildSearchQuery(params);await getResults(searchQuery);updateFilterValues(urlParams);filterMenu.classList.remove("hidden");}catch(error){console.error("An error occurred while setting default values:",error.message);}};const handlePopState=async()=>{if(!history.state){window.location.reload();return;} const urlParams=new URLSearchParams(window.location.search);const params=Object.fromEntries(urlParams.entries());const searchQuery=buildSearchQuery(params);try{await getResults(searchQuery);updateFilterValues(urlParams);}catch(error){console.error("An error occurred while getting results:",error.message);}};const getCourse=async(trainingCentre)=>{const courseDropdown=document.getElementById("training-course-filter");try{const response=await fetch("/umbraco/surface/StudentCourse/FetchCourses?trainingCentreId="+ trainingCentre);const data=await response.json();courseDropdown.innerHTML="";courseDropdown.appendChild(new Option("Please select a course...",""));if(!data.length)return;data.forEach((course)=>{const option=new Option(course.name,course.id);courseDropdown.appendChild(option);});}catch(error){console.error("Error fetching courses: ",error);}};const getResults=async(query)=>{const url=courseEndpoint+query;const coursesContainer=document.getElementById("coursesAndStudents");try{const response=await fetch(url,{method:"GET",headers:{"X-Requested-With":"XMLHttpRequest",},});const data=await response.text();coursesContainer.innerHTML=data;coursesContainer.classList.remove("hidden");addPaginationEventListeners();return data;}catch(error){console.error("An error occurred while getting results:",error.message);}};const updatePendingCheckboxOnInit=()=>{pendingCheckbox.checked=true;};const checkFilterAndPaginationOptions=()=>{const currentUrl=new URL(window.location.href);if(!currentUrl.searchParams.has("page")||!currentUrl.searchParams.has("trainingCentre")) return;const coursesContainer=document.getElementById("coursesAndStudents");fetch(currentUrl,{method:"GET",headers:{"X-Requested-With":"XMLHttpRequest",},}).then((response)=>response.text()).then((data)=>{coursesContainer.innerHTML=data;coursesContainer.classList.remove("hidden");addPaginationEventListeners();}).catch((error)=>{coursesContainer.classList.add("hidden");console.error("Error fetching data:",error);});};const updateFilterValues=async(urlParams)=>{const getParam=(key)=>urlParams.get(key)||"";const trainingCentreId=getParam("trainingCentreId");const fromDate=getParam("fromDate");const toDate=getParam("toDate");const studentSearch=getParam("studentSearch");const courseValue=getParam("course");const pending=getParam("pending")==="true";updateFormField(trainingCourse,trainingCentreId);updateFormField(dateFromEl,fromDate);updateFormField(dateToEl,toDate);updateFormField(searchEl,studentSearch);updateFormField(course,courseValue);updateCheckboxField(pendingCheckbox,pending);const optionIndex=[...trainingCourse.options].findIndex((option)=>option.value===trainingCentreId);changeSelectText(trainingCourse,optionIndex);try{await getCourse(trainingCentreId);course.selectedIndex=[...course.options].findIndex((option)=>option.value===courseValue);deleteStudent();deleteCourse();delete91快色();}catch(error){console.error("Error getting courses:",error);}};const searchParams=(pageParam)=>{let page=1;const params={};const parentPageId=document.querySelector("#parentPageId");const pageEl=document.querySelector(".pager__item--is-active button");if(pageEl){page=pageEl?pageEl.getAttribute("date-page")||1:1;} if(pageParam){page=pageParam;} addParam(params,"trainingCentreId",trainingCourse.value);addParam(params,"parentPageId",parentPageId.value);if(course.value!=="select"){addParam(params,"course",course.value);} addParam(params,"fromDate",dateFromEl.value);addParam(params,"toDate",dateToEl.value);addParam(params,"studentSearch",searchEl.value);addParam(params,"pending",pendingCheckbox.checked);addParam(params,"page",page);const searchQuery=buildSearchQuery(params);history.pushState(params,"",searchQuery);};const popState=()=>{window.addEventListener("popstate",handlePopState);};const addPaginationEventListeners=()=>{const buttons=document.querySelectorAll(".js-pagination-btn");for(const button of buttons){button.addEventListener("click",handlePaginationClick);}};const deleteStudent=()=>{const buttons=document.querySelectorAll(".js-delete-student");for(const btn of buttons){btn.addEventListener("click",handleDeleteStudent);}};const deleteCourse=()=>{const buttons=document.querySelectorAll(".js-delete-course");for(const btn of buttons){btn.addEventListener("click",handleDeleteCourse);}};const delete91快色=()=>{const buttons=document.querySelectorAll(".js-delete-certificate");for(const btn of buttons){btn.addEventListener("click",handleDelete91快色);}};document.addEventListener("DOMContentLoaded",()=>{handleCourseDropdownOnInit();handleCourseChange();handleFilterUpdate();handleLoadRequest();checkFilterAndPaginationOptions();popState();});})();(()=>{const form=document.querySelector(".js-pay-for-exam-form");if(!form)return;const content=form.querySelector(".js-pay-for-exam-content");const dropdown=form.querySelector(".js-dropdown-input");const termsCheckbox=form.querySelector(".js-check-terms");const errorCheckTerms=form.querySelector(".js-error-check-terms");const nameFields=form.querySelectorAll(".js-pay-exam-name");const priceField=form.querySelector(".js-pay-exam-price");const hiddenSKU=form.querySelector('.js-exam-sku');const hiddenPrice=form.querySelector('.js-exam-price');const hiddenAddress=form.querySelector('.js-exam-address');const radioButtons=form.querySelectorAll('input[type="radio"]') const submitButton=form.querySelector('.js-submit-btn');const handleDropdown=(e)=>{const value=e.target.value;if(value==="select"){content.classList.add('hidden');submitButton.disabled=true;return;} const text=e.target.options[e.target.selectedIndex].text;const sku=value.split('~')[0];const price=value.split('~')[1];content.classList.remove('hidden');addNamesToFields(text);addPrice(price);hiddenFields(sku,price);};const hiddenFields=(sku,price)=>{hiddenSKU.value=sku;hiddenPrice.value=price;} const addNamesToFields=(text)=>{for(const e of nameFields){e.innerHTML=text}};const addPrice=(price)=>{priceField.innerHTML=parseFloat(price).toFixed(2);};const handleFormSubmit=(e)=>{e.preventDefault();const areDropdownsValid=validation.validateDropdownFields();if(!areDropdownsValid)return;const isTermsValid=validation.validateTerms(termsCheckbox,errorCheckTerms);if(isTermsValid&&areDropdownsValid){form.submit();}};const handleRadioChange=({target})=>{hiddenAddress.value=target.parentElement.querySelector('.js-exam-address').getAttribute('data-address')} const radioButtonChange=()=>{if(!radioButtons.length)return for(const btn of radioButtons){btn?.addEventListener("change",handleRadioChange);}} const handelCheckboxChange=({target})=>{submitButton.disabled=!target.checked;} form?.addEventListener("submit",handleFormSubmit);dropdown?.addEventListener("change",handleDropdown);termsCheckbox?.addEventListener("change",handelCheckboxChange) radioButtonChange();})();(()=>{const form=document.getElementById("certificatesPracticalExamRequestForm");const submitBtn=document.getElementById("js-certification-request-submit");const termsCheckbox=document.querySelector(".js-check-terms");const errorCheckTerms=document.querySelector(".js-error-check-terms");const datePicker=document.querySelector(".js-date-picker");const datePickerError=document.querySelector(".js-error-date-picker");const radioButtons=document.querySelectorAll('input[name="certificate-radio"]');const radioError=document.querySelector(".js-error-radio");const handleCertificationRequestFormSubmit=(e)=>{e.preventDefault();const areDropdownsValid=validation.validateDropdownFields();const isTermsValid=validation.validateTerms(termsCheckbox,errorCheckTerms);const isDatePickerValid=validation.validateDatePickerInput(datePicker,datePickerError);const areRequiredFieldsValid=validation.validateGenericRequiredFields();const checkValidationRadioButtons=validation.validateRadioButtons(radioButtons,radioError);if(areDropdownsValid&&isTermsValid&&areRequiredFieldsValid&&isDatePickerValid&&checkValidationRadioButtons){form.submit();}};submitBtn?.addEventListener("click",handleCertificationRequestFormSubmit);})();const examForm=(()=>{const container=document.querySelector('.js-exam-page');if(!container)return const dropdown=document.querySelector('.js-exam-dropdown');const contentWrap=document.querySelector('.js-exam-content-wrap');const form=document.querySelector('.js-examiner-form');const partial=document.querySelector('.js-exam-partial');const pageId=partial.getAttribute('data-page-id');const url=`/umbraco/surface/certificate/Exam`;const content=container.querySelector('.js-examiner-content');const submitButton=container.querySelector('.js-submit-btn');const noErrorMessage=true;const getExam=async(contentId)=>{contentWrap.innerHTML='';if(contentId==='select'){content.classList.add('hidden');return};try{const response=await fetch(`${url}?contentId=${contentId}&ID=${pageId}`);const html=await response.text();content.classList.remove('hidden');contentWrap.innerHTML=html;handleInputFields();handleCheckbox();handleDatePicker();handleRadioButtons()}catch(error){console.error('Error fetching exam:',error);contentWrap.innerHTML='

No results found!

';}} const handleDropdown=()=>{dropdown.addEventListener('change',async({target})=>{await getExam(target.value);handleBoatLengthInput();if(target.value==='select'){submitButton.disabled=true;}})};const areFieldsValid=()=>{const termsCheckbox=document.querySelector('.js-check-terms');const errorCheckTerms=document.querySelector('.js-error-check-terms');const datePicker=document.querySelector('.js-date-picker');const datePickerError=document.querySelector('.js-error-date-picker');const radioButtons=document.querySelectorAll('.js-examiner-radio');const radioError=document.querySelector('.js-error-radio');const isTermsValid=validation.validateTerms(termsCheckbox,errorCheckTerms);const isDatePickerValid=validation.validateDatePickerInput(datePicker,datePickerError,noErrorMessage);const areRequiredFieldsValid=validation.validateGenericRequiredFields(noErrorMessage);const checkValidationRadioButtons=validation.validateRadioButtons(radioButtons,radioError,noErrorMessage);return isTermsValid&&areRequiredFieldsValid&&isDatePickerValid&&checkValidationRadioButtons} const areFieldsValidNoErrorMessage=()=>{const termsCheckbox=document.querySelector('.js-check-terms');const datePicker=document.querySelector('.js-date-picker');const radioButtons=document.querySelectorAll('.js-examiner-radio');const isTermsValid=termsCheckbox.checked;const isDatePickerValid=datePicker.value!=="" const areRequiredFieldsValid=validateGenericRequiredFields();const checkValidationRadioButtons=validateRadioButtons(radioButtons);return isTermsValid&&areRequiredFieldsValid&&isDatePickerValid&&checkValidationRadioButtons};const validateRadioButtons=(radioGroup)=>{let isValid=false;radioGroup.forEach((radioButton)=>{if(radioButton.checked){isValid=true;} radioButton.addEventListener("change",()=>{validateRadioButtons(radioGroup);});});return isValid;};const validateGenericRequiredFields=()=>{const fields=document.querySelectorAll(".js-required-field");let allValid=true;fields.forEach((field)=>{const inputElement=field.querySelector(".js-required-input");if(!inputElement.value.trim()){allValid=false;} inputElement.addEventListener("input",()=>{if(inputElement.value.trim()){validateGenericRequiredFields()}});});return allValid;};const toggleButtonDisabled=()=>{const verifyFields=areFieldsValidNoErrorMessage();submitButton.disabled=!verifyFields} const handleCheckbox=()=>{const termsCheckbox=document.querySelector('.js-check-terms');termsCheckbox.addEventListener("change",toggleButtonDisabled)} const handleDatePicker=()=>{const datePicker=document.querySelector('.js-date-picker');datePicker.addEventListener("change",toggleButtonDisabled)} const handleRadioButtons=()=>{const radioButtons=document.querySelectorAll('.js-examiner-radio');for(const button of radioButtons){button.addEventListener("click",toggleButtonDisabled)}} const handleInputFields=()=>{const inputFields=document.querySelectorAll('.js-required-input');for(const input of inputFields){input.addEventListener("change",toggleButtonDisabled)}} const handleBoatLengthInput=()=>{const input=document.querySelector('.js-exam-boat-length');if(!input)return input.addEventListener("input",({target})=>{target.value=target.value.replace(/[^0-9]/g,'');});};const handleSubmit=()=>{form.addEventListener('submit',(e)=>{e.preventDefault();const areDropdownsValid=validation.validateDropdownFields();if(!areDropdownsValid)return;const verifyFields=areFieldsValid();if(verifyFields){form.submit();}})};document.addEventListener('DOMContentLoaded',()=>{handleDropdown();handleSubmit();});})();const missing91快色=(()=>{const form=document.querySelector('.js-missing-certificate');if(!form)return;const trainingCenterDropdown=form.querySelector('.js-training-centre-id');const availableCourses=form.querySelector('.js-available-courses');const available91快色s=form.querySelector('.js-available-certificates');const submitBtn=form.querySelector('.js-missing-certificate-btn');const disabledClass='form-group--disabled';const getCourses=(id)=>{const url='/umbraco/surface/StudentCourse/FetchCourses?trainingCentreId='+id;fetch(url).then(response=>response.json()).then(data=>{availableCourses.innerHTML='';availableCourses.appendChild(new Option('Please select a course...','select'));availableCourses.parentElement.classList.remove(disabledClass);if(!data.length)return data?.forEach(certification=>{const option=new Option(certification.name,certification.id);availableCourses.appendChild(option);});}).catch(error=>{console.error("Error fetching courses: ",error);});};const get91快色s=(id)=>{const url=`/umbraco/surface/StudentCourse/91快色s?courseSystemId=${id}&trainingCentreId=${trainingCenterDropdown.value}`;fetch(url).then(response=>response.json()).then(data=>{available91快色s.innerHTML='';available91快色s.appendChild(new Option('Please select a certificate...','select'));available91快色s.parentElement.classList.remove(disabledClass);submitBtn.removeAttribute('disabled');if(!data.length)return data?.forEach(certification=>{const option=new Option(certification.serialNo,certification.entrySystemId);available91快色s.appendChild(option);});}).catch(error=>{console.error("Error fetching certificates: ",error);});};const handleTrainingCenterChange=()=>{trainingCenterDropdown.addEventListener('change',(e)=>{const id=e.target.value;setCoursesToDefault(id);setCertificationToDefault();if(id==='select')return;getCourses(id);});};const handleCourseChange=()=>{availableCourses.addEventListener('change',(e)=>{const id=e.target.value;if(id==='select'){setCertificationToDefault();return;} get91快色s(id);});};const handleSubmit=()=>{form.addEventListener('submit',(e)=>{e.preventDefault();const areDropdownsValid=validation.validateDropdownFields();const areRequiredFieldsValid=validation.validateGenericRequiredFields();if(!areRequiredFieldsValid)return;const areTextareaFieldsValid=validation.validateTextareaLength();if(areDropdownsValid&&areRequiredFieldsValid&&areTextareaFieldsValid){form.submit();}});};const setCoursesToDefault=(id)=>{if(id==='select'){availableCourses.parentElement.classList.add(disabledClass);} availableCourses.innerHTML='';submitBtn.setAttribute('disabled','disabled');};const setCertificationToDefault=()=>{available91快色s.innerHTML='';available91快色s.parentElement.classList.add(disabledClass);};document.addEventListener('DOMContentLoaded',()=>{handleTrainingCenterChange();handleCourseChange();handleSubmit();});})();const requestAnExam=(()=>{const examDropdown=document.getElementById('exam-course-filter');const contentContainer=document.querySelector('.js-exam-dynamic-content');if(!examDropdown||!contentContainer)return;const getData=async(sku)=>{try{const response=await fetch(`/umbraco/surface/certificate/getexamdynamiccontent?sku=${sku}`);const data=await response.json();contentContainer.innerHTML=data.content||'';}catch(error){console.error("鉂 Error loading exam content:",err);contentContainer.innerHTML="

Unable to load exam information at this time.

";}} const handleDropdown=()=>{examDropdown.addEventListener('change',function(){const selectedValue=this.value;if(selectedValue==="select"){contentContainer.innerHTML="";return;} const sku=selectedValue.split('~')[0];getData(sku)});} document.addEventListener('DOMContentLoaded',()=>{handleDropdown();});})();document.addEventListener("DOMContentLoaded",function(){const WatercraftNumber=document.querySelector(".js-watercraft-identification-number");const form=document.querySelector(".js-submit-sail-numbers-form");const LengthDecimalInput=document.querySelector(".js-boatlength");const BeamDecimalInput=document.querySelector(".js-beam");const handleFormSubmit=(e)=>{e.preventDefault();const areRequiredFieldsValid=validation.validateGenericRequiredFields();const AreDropdownsValid=validation.validateDropdownFields();if(areRequiredFieldsValid&&AreDropdownsValid){form.submit();}};function validateInput(input,regex,maxLength){input.addEventListener("input",function(){let value=input.value.slice(0,maxLength);if(value.length>=2&&!regex.test(value)){value=value.slice(0,-1);} if(value.length===1&&!/^[A-Za-z]$/.test(value)){value="";} input.value=value;});} function limitDecimalNumbers(input){input.addEventListener("input",function({target}){target.value=target.value.replace(/[^\d.]/g,'').replace(/^(\d*\.\d{0,2}).*$/,'$1').replace(/\.{2,}/g,'.').replace(/^0+(\d)/,'$1').replace(/^(\d+)\./,'$1.');});} if(LengthDecimalInput){limitDecimalNumbers(LengthDecimalInput);} if(BeamDecimalInput){limitDecimalNumbers(BeamDecimalInput);} if(WatercraftNumber){validateInput(WatercraftNumber,/^[A-Za-z]{2}[A-Za-z0-9\-]*$/,18);} form?.addEventListener("submit",handleFormSubmit);});document.addEventListener("DOMContentLoaded",function(){const trainingHubResultsDiv=document.getElementById("trainingHubResultsDiv");const dropDownTrainingHub=document.getElementById("training-course");const filterDropDown=document.getElementById("filter-dropdown");const filterInputs=document.getElementById("filter-inputs-container");const dateTo=document.getElementById("dateTo");const dateFrom=document.getElementById("dateFrom");if(dateTo&&dateFrom){dateTo.addEventListener("change",()=>{dateFrom.setAttribute("max",dateTo.value);});dateFrom.addEventListener("change",()=>{dateTo.setAttribute("min",dateFrom.value);});} if(filterInputs&&filterDropDown){if(window.innerWidth<768){filterInputs.classList.add("hidden");} filterDropDown.addEventListener("click",()=>{if(window.innerWidth<768){filterInputs.classList.toggle("hidden");}});} if(trainingHubResultsDiv&&dropDownTrainingHub){dropDownTrainingHub.addEventListener("change",(e)=>{const selectedCourse=e.target.value;selectedCourse==="select"?trainingHubResultsDiv.classList.add("hidden"):trainingHubResultsDiv.classList.remove("hidden");});}});const addStudent=(()=>{const container=document.querySelector('.js-add-new-student');if(!container)return;const newStudentForm=container.querySelector('.js-add-student-to-course');const dayInput=newStudentForm.querySelector('.js-add-student-day');const monthInput=newStudentForm.querySelector('.js-add-student-month');const yearInput=newStudentForm.querySelector('.js-add-student-year');const dateErrorEl=newStudentForm.querySelector('.js-error-year-validation');const emailInput=newStudentForm.querySelector(".js-add-student-email");const errorEmail=newStudentForm.querySelector(".js-add-student-email-error");const submitButton=container.querySelector(".add-a-student-to-course__btn");const errorMessageActiveClass="error-message--active";const day31=dayInput?.querySelector('option[value="31"]');const day30=dayInput?.querySelector('option[value="30"]');const day29=dayInput?.querySelector('option[value="29"]');const addEvents=()=>{validation.enforceMaxLength(yearInput,4);yearInput?.addEventListener("input",({target})=>{validation.handleYearInput(target);});monthInput?.addEventListener("change",(e)=>{validation.handleMonthInput(e,day31,day30,day29)});};const addNewStudent=()=>{newStudentForm.addEventListener('submit',(e)=>{e.preventDefault();const errorDay=newStudentForm.querySelector(".js-error-day");const errorMonth=newStudentForm.querySelector(".js-error-month");const errorYear=newStudentForm.querySelector(".js-error-year");const errorFuture=newStudentForm.querySelector('.js-error-future-date');const areRequiredFieldsValid=validation.validateGenericRequiredFields();const isYearValid=!dateErrorEl.classList.contains(errorMessageActiveClass);const isEmailValid=validation.validateReferEmail(emailInput,errorEmail);const areDropdownsValid=validation.validateDropdownFields();const isDOBValid=validation.validateDateOfBirthMembership(dayInput,monthInput,yearInput,errorDay,errorMonth,errorYear);const isDateInFuture=validation.validateFutureDateOfBirth(dayInput,monthInput,yearInput,errorFuture,errorDay,errorMonth,errorYear);if(isDOBValid&&areRequiredFieldsValid&&isYearValid&&isEmailValid&&areDropdownsValid&&isDateInFuture){submitButton.disabled=true;newStudentForm.submit();}});};document.addEventListener('DOMContentLoaded',()=>{addEvents();addNewStudent();});})();const audioPlayer=(()=>{const audioEl=document.querySelector('.js-product-audio');if(!audioEl)return;const player=()=>{const player=new Plyr(audioEl,{controls:['play','progress'],settings:[]});player.on('loadedmetadata',()=>{playerReady(player);});player.on('timeupdate',()=>{playerUpdate(player);updateGradient();});};const playerReady=(player)=>{const duration=player.duration;const formattedDuration=formatTime(duration);const progress=audioEl.parentElement.querySelector('.plyr__progress__container');progress.insertAdjacentHTML('beforeBegin',timeElement(formattedDuration));};const playerUpdate=(player)=>{const currentTimeElement=audioEl.parentElement.querySelector('.js-audio-time-current');const currentTime=player.currentTime;const formattedTime=formatTime(currentTime);currentTimeElement.innerHTML=formattedTime;};const formatTime=(input)=>{const minutes=Math.floor(input/60);const seconds=Math.floor(input%60);return`${minutes}:${seconds.toString().padStart(2, '0')}`;};const timeElement=(duration)=>{return`
0:00 / ${duration}
`};const updateGradient=()=>{const input=audioEl.parentElement.querySelector('input');const value=input.value;const min=input.min||0;const max=input.max||100;const percentage=((value-min)/(max-min))*100;input.style.background=`linear-gradient(to right, #0276b5 ${percentage}%, #d8e6f2 ${percentage}%)`;} document.addEventListener('DOMContentLoaded',()=>{player();});})();!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("@popperjs/core")):"function"==typeof define&&define.amd?define(["@popperjs/core"],e):(t="undefined"!=typeof globalThis?globalThis:t||self).bootstrap=e(t.Popper)}(this,(function(t){"use strict";function e(t){const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t)for(const i in t)if("default"!==i){const s=Object.getOwnPropertyDescriptor(t,i);Object.defineProperty(e,i,s.get?s:{enumerable:!0,get:()=>t[i]})}return e.default=t,Object.freeze(e)}const i=e(t),s=new Map,n={set(t,e,i){s.has(t)||s.set(t,new Map);const n=s.get(t);n.has(e)||0===n.size?n.set(e,i):console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(n.keys())[0]}.`)},get:(t,e)=>s.has(t)&&s.get(t).get(e)||null,remove(t,e){if(!s.has(t))return;const i=s.get(t);i.delete(e),0===i.size&&s.delete(t)}},o="transitionend",r=t=>(t&&window.CSS&&window.CSS.escape&&(t=t.replace(/#([^\s"#']+)/g,((t,e)=>`#${CSS.escape(e)}`))),t),a=t=>{t.dispatchEvent(new Event(o))},l=t=>!(!t||"object"!=typeof t)&&(void 0!==t.jquery&&(t=t[0]),void 0!==t.nodeType),c=t=>l(t)?t.jquery?t[0]:t:"string"==typeof t&&t.length>0?document.querySelector(r(t)):null,h=t=>{if(!l(t)||0===t.getClientRects().length)return!1;const e="visible"===getComputedStyle(t).getPropertyValue("visibility"),i=t.closest("details:not([open])");if(!i)return e;if(i!==t){const e=t.closest("summary");if(e&&e.parentNode!==i)return!1;if(null===e)return!1}return e},d=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),u=t=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof t.getRootNode){const e=t.getRootNode();return e instanceof ShadowRoot?e:null}return t instanceof ShadowRoot?t:t.parentNode?u(t.parentNode):null},_=()=>{},g=t=>{t.offsetHeight},f=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,m=[],p=()=>"rtl"===document.documentElement.dir,b=t=>{var e;e=()=>{const e=f();if(e){const i=t.NAME,s=e.fn[i];e.fn[i]=t.jQueryInterface,e.fn[i].Constructor=t,e.fn[i].noConflict=()=>(e.fn[i]=s,t.jQueryInterface)}},"loading"===document.readyState?(m.length||document.addEventListener("DOMContentLoaded",(()=>{for(const t of m)t()})),m.push(e)):e()},v=(t,e=[],i=t)=>"function"==typeof t?t(...e):i,y=(t,e,i=!0)=>{if(!i)return void v(t);const s=(t=>{if(!t)return 0;let{transitionDuration:e,transitionDelay:i}=window.getComputedStyle(t);const s=Number.parseFloat(e),n=Number.parseFloat(i);return s||n?(e=e.split(",")[0],i=i.split(",")[0],1e3*(Number.parseFloat(e)+Number.parseFloat(i))):0})(e)+5;let n=!1;const r=({target:i})=>{i===e&&(n=!0,e.removeEventListener(o,r),v(t))};e.addEventListener(o,r),setTimeout((()=>{n||a(e)}),s)},w=(t,e,i,s)=>{const n=t.length;let o=t.indexOf(e);return-1===o?!i&&s?t[n-1]:t[0]:(o+=i?1:-1,s&&(o=(o+n)%n),t[Math.max(0,Math.min(o,n-1))])},A=/[^.]*(?=\..*)\.|.*/,E=/\..*/,C=/::\d+$/,T={};let k=1;const $={mouseenter:"mouseover",mouseleave:"mouseout"},S=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function L(t,e){return e&&`${e}::${k++}`||t.uidEvent||k++}function O(t){const e=L(t);return t.uidEvent=e,T[e]=T[e]||{},T[e]}function I(t,e,i=null){return Object.values(t).find((t=>t.callable===e&&t.delegationSelector===i))}function D(t,e,i){const s="string"==typeof e,n=s?i:e||i;let o=M(t);return S.has(o)||(o=t),[s,n,o]}function N(t,e,i,s,n){if("string"!=typeof e||!t)return;let[o,r,a]=D(e,i,s);if(e in $){const t=t=>function(e){if(!e.relatedTarget||e.relatedTarget!==e.delegateTarget&&!e.delegateTarget.contains(e.relatedTarget))return t.call(this,e)};r=t(r)}const l=O(t),c=l[a]||(l[a]={}),h=I(c,r,o?i:null);if(h)return void(h.oneOff=h.oneOff&&n);const d=L(r,e.replace(A,"")),u=o?function(t,e,i){return function s(n){const o=t.querySelectorAll(e);for(let{target:r}=n;r&&r!==this;r=r.parentNode)for(const a of o)if(a===r)return F(n,{delegateTarget:r}),s.oneOff&&j.off(t,n.type,e,i),i.apply(r,[n])}}(t,i,r):function(t,e){return function i(s){return F(s,{delegateTarget:t}),i.oneOff&&j.off(t,s.type,e),e.apply(t,[s])}}(t,r);u.delegationSelector=o?i:null,u.callable=r,u.oneOff=n,u.uidEvent=d,c[d]=u,t.addEventListener(a,u,o)}function P(t,e,i,s,n){const o=I(e[i],s,n);o&&(t.removeEventListener(i,o,Boolean(n)),delete e[i][o.uidEvent])}function x(t,e,i,s){const n=e[i]||{};for(const[o,r]of Object.entries(n))o.includes(s)&&P(t,e,i,r.callable,r.delegationSelector)}function M(t){return t=t.replace(E,""),$[t]||t}const j={on(t,e,i,s){N(t,e,i,s,!1)},one(t,e,i,s){N(t,e,i,s,!0)},off(t,e,i,s){if("string"!=typeof e||!t)return;const[n,o,r]=D(e,i,s),a=r!==e,l=O(t),c=l[r]||{},h=e.startsWith(".");if(void 0===o){if(h)for(const i of Object.keys(l))x(t,l,i,e.slice(1));for(const[i,s]of Object.entries(c)){const n=i.replace(C,"");a&&!e.includes(n)||P(t,l,r,s.callable,s.delegationSelector)}}else{if(!Object.keys(c).length)return;P(t,l,r,o,n?i:null)}},trigger(t,e,i){if("string"!=typeof e||!t)return null;const s=f();let n=null,o=!0,r=!0,a=!1;e!==M(e)&&s&&(n=s.Event(e,i),s(t).trigger(n),o=!n.isPropagationStopped(),r=!n.isImmediatePropagationStopped(),a=n.isDefaultPrevented());const l=F(new Event(e,{bubbles:o,cancelable:!0}),i);return a&&l.preventDefault(),r&&t.dispatchEvent(l),l.defaultPrevented&&n&&n.preventDefault(),l}};function F(t,e={}){for(const[i,s]of Object.entries(e))try{t[i]=s}catch(e){Object.defineProperty(t,i,{configurable:!0,get:()=>s})}return t}function z(t){if("true"===t)return!0;if("false"===t)return!1;if(t===Number(t).toString())return Number(t);if(""===t||"null"===t)return null;if("string"!=typeof t)return t;try{return JSON.parse(decodeURIComponent(t))}catch(e){return t}}function H(t){return t.replace(/[A-Z]/g,(t=>`-${t.toLowerCase()}`))}const B={setDataAttribute(t,e,i){t.setAttribute(`data-bs-${H(e)}`,i)},removeDataAttribute(t,e){t.removeAttribute(`data-bs-${H(e)}`)},getDataAttributes(t){if(!t)return{};const e={},i=Object.keys(t.dataset).filter((t=>t.startsWith("bs")&&!t.startsWith("bsConfig")));for(const s of i){let i=s.replace(/^bs/,"");i=i.charAt(0).toLowerCase()+i.slice(1,i.length),e[i]=z(t.dataset[s])}return e},getDataAttribute:(t,e)=>z(t.getAttribute(`data-bs-${H(e)}`))};class q{static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(t){return t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t}_mergeConfigObj(t,e){const i=l(e)?B.getDataAttribute(e,"config"):{};return{...this.constructor.Default,..."object"==typeof i?i:{},...l(e)?B.getDataAttributes(e):{},..."object"==typeof t?t:{}}}_typeCheckConfig(t,e=this.constructor.DefaultType){for(const[s,n]of Object.entries(e)){const e=t[s],o=l(e)?"element":null==(i=e)?`${i}`:Object.prototype.toString.call(i).match(/\s([a-z]+)/i)[1].toLowerCase();if(!new RegExp(n).test(o))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${s}" provided type "${o}" but expected type "${n}".`)}var i}}class W extends q{constructor(t,e){super(),(t=c(t))&&(this._element=t,this._config=this._getConfig(e),n.set(this._element,this.constructor.DATA_KEY,this))}dispose(){n.remove(this._element,this.constructor.DATA_KEY),j.off(this._element,this.constructor.EVENT_KEY);for(const t of Object.getOwnPropertyNames(this))this[t]=null}_queueCallback(t,e,i=!0){y(t,e,i)}_getConfig(t){return t=this._mergeConfigObj(t,this._element),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}static getInstance(t){return n.get(c(t),this.DATA_KEY)}static getOrCreateInstance(t,e={}){return this.getInstance(t)||new this(t,"object"==typeof e?e:null)}static get VERSION(){return"5.3.2"}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}static eventName(t){return`${t}${this.EVENT_KEY}`}}const R=t=>{let e=t.getAttribute("data-bs-target");if(!e||"#"===e){let i=t.getAttribute("href");if(!i||!i.includes("#")&&!i.startsWith("."))return null;i.includes("#")&&!i.startsWith("#")&&(i=`#${i.split("#")[1]}`),e=i&&"#"!==i?r(i.trim()):null}return e},K={find:(t,e=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(e,t)),findOne:(t,e=document.documentElement)=>Element.prototype.querySelector.call(e,t),children:(t,e)=>[].concat(...t.children).filter((t=>t.matches(e))),parents(t,e){const i=[];let s=t.parentNode.closest(e);for(;s;)i.push(s),s=s.parentNode.closest(e);return i},prev(t,e){let i=t.previousElementSibling;for(;i;){if(i.matches(e))return[i];i=i.previousElementSibling}return[]},next(t,e){let i=t.nextElementSibling;for(;i;){if(i.matches(e))return[i];i=i.nextElementSibling}return[]},focusableChildren(t){const e=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map((t=>`${t}:not([tabindex^="-"])`)).join(",");return this.find(e,t).filter((t=>!d(t)&&h(t)))},getSelectorFromElement(t){const e=R(t);return e&&K.findOne(e)?e:null},getElementFromSelector(t){const e=R(t);return e?K.findOne(e):null},getMultipleElementsFromSelector(t){const e=R(t);return e?K.find(e):[]}},V=(t,e="hide")=>{const i=`click.dismiss${t.EVENT_KEY}`,s=t.NAME;j.on(document,i,`[data-bs-dismiss="${s}"]`,(function(i){if(["A","AREA"].includes(this.tagName)&&i.preventDefault(),d(this))return;const n=K.getElementFromSelector(this)||this.closest(`.${s}`);t.getOrCreateInstance(n)[e]()}))},Q=".bs.alert",X=`close${Q}`,Y=`closed${Q}`;class U extends W{static get NAME(){return"alert"}close(){if(j.trigger(this._element,X).defaultPrevented)return;this._element.classList.remove("show");const t=this._element.classList.contains("fade");this._queueCallback((()=>this._destroyElement()),this._element,t)}_destroyElement(){this._element.remove(),j.trigger(this._element,Y),this.dispose()}static jQueryInterface(t){return this.each((function(){const e=U.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}V(U,"close"),b(U);const G='[data-bs-toggle="button"]';class J extends W{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(t){return this.each((function(){const e=J.getOrCreateInstance(this);"toggle"===t&&e[t]()}))}}j.on(document,"click.bs.button.data-api",G,(t=>{t.preventDefault();const e=t.target.closest(G);J.getOrCreateInstance(e).toggle()})),b(J);const Z=".bs.swipe",tt=`touchstart${Z}`,et=`touchmove${Z}`,it=`touchend${Z}`,st=`pointerdown${Z}`,nt=`pointerup${Z}`,ot={endCallback:null,leftCallback:null,rightCallback:null},rt={endCallback:"(function|null)",leftCallback:"(function|null)",rightCallback:"(function|null)"};class at extends q{constructor(t,e){super(),this._element=t,t&&at.isSupported()&&(this._config=this._getConfig(e),this._deltaX=0,this._supportPointerEvents=Boolean(window.PointerEvent),this._initEvents())}static get Default(){return ot}static get DefaultType(){return rt}static get NAME(){return"swipe"}dispose(){j.off(this._element,Z)}_start(t){this._supportPointerEvents?this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX):this._deltaX=t.touches[0].clientX}_end(t){this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX-this._deltaX),this._handleSwipe(),v(this._config.endCallback)}_move(t){this._deltaX=t.touches&&t.touches.length>1?0:t.touches[0].clientX-this._deltaX}_handleSwipe(){const t=Math.abs(this._deltaX);if(t<=40)return;const e=t/this._deltaX;this._deltaX=0,e&&v(e>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(j.on(this._element,st,(t=>this._start(t))),j.on(this._element,nt,(t=>this._end(t))),this._element.classList.add("pointer-event")):(j.on(this._element,tt,(t=>this._start(t))),j.on(this._element,et,(t=>this._move(t))),j.on(this._element,it,(t=>this._end(t))))}_eventIsPointerPenTouch(t){return this._supportPointerEvents&&("pen"===t.pointerType||"touch"===t.pointerType)}static isSupported(){return"ontouchstart" in document.documentElement||navigator.maxTouchPoints>0}}const lt=".bs.carousel",ct=".data-api",ht="next",dt="prev",ut="left",_t="right",gt=`slide${lt}`,ft=`slid${lt}`,mt=`keydown${lt}`,pt=`mouseenter${lt}`,bt=`mouseleave${lt}`,vt=`dragstart${lt}`,yt=`load${lt}${ct}`,wt=`click${lt}${ct}`,At="carousel",Et="active",Ct=".active",Tt=".carousel-item",kt=Ct+Tt,$t={ArrowLeft:_t,ArrowRight:ut},St={interval:5e3,keyboard:!0,pause:"hover",ride:!1,touch:!0,wrap:!0},Lt={interval:"(number|boolean)",keyboard:"boolean",pause:"(string|boolean)",ride:"(boolean|string)",touch:"boolean",wrap:"boolean"};class Ot extends W{constructor(t,e){super(t,e),this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=K.findOne(".carousel-indicators",this._element),this._addEventListeners(),this._config.ride===At&&this.cycle()}static get Default(){return St}static get DefaultType(){return Lt}static get NAME(){return"carousel"}next(){this._slide(ht)}nextWhenVisible(){!document.hidden&&h(this._element)&&this.next()}prev(){this._slide(dt)}pause(){this._isSliding&&a(this._element),this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval((()=>this.nextWhenVisible()),this._config.interval)}_maybeEnableCycle(){this._config.ride&&(this._isSliding?j.one(this._element,ft,(()=>this.cycle())):this.cycle())}to(t){const e=this._getItems();if(t>e.length-1||t<0)return;if(this._isSliding)return void j.one(this._element,ft,(()=>this.to(t)));const i=this._getItemIndex(this._getActive());if(i===t)return;const s=t>i?ht:dt;this._slide(s,e[t])}dispose(){this._swipeHelper&&this._swipeHelper.dispose(),super.dispose()}_configAfterMerge(t){return t.defaultInterval=t.interval,t}_addEventListeners(){this._config.keyboard&&j.on(this._element,mt,(t=>this._keydown(t))),"hover"===this._config.pause&&(j.on(this._element,pt,(()=>this.pause())),j.on(this._element,bt,(()=>this._maybeEnableCycle()))),this._config.touch&&at.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(const t of K.find(".carousel-item img",this._element))j.on(t,vt,(t=>t.preventDefault()));const t={leftCallback:()=>this._slide(this._directionToOrder(ut)),rightCallback:()=>this._slide(this._directionToOrder(_t)),endCallback:()=>{"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout((()=>this._maybeEnableCycle()),500+this._config.interval))}};this._swipeHelper=new at(this._element,t)}_keydown(t){if(/input|textarea/i.test(t.target.tagName))return;const e=$t[t.key];e&&(t.preventDefault(),this._slide(this._directionToOrder(e)))}_getItemIndex(t){return this._getItems().indexOf(t)}_setActiveIndicatorElement(t){if(!this._indicatorsElement)return;const e=K.findOne(Ct,this._indicatorsElement);e.classList.remove(Et),e.removeAttribute("aria-current");const i=K.findOne(`[data-bs-slide-to="${t}"]`,this._indicatorsElement);i&&(i.classList.add(Et),i.setAttribute("aria-current","true"))}_updateInterval(){const t=this._activeElement||this._getActive();if(!t)return;const e=Number.parseInt(t.getAttribute("data-bs-interval"),10);this._config.interval=e||this._config.defaultInterval}_slide(t,e=null){if(this._isSliding)return;const i=this._getActive(),s=t===ht,n=e||w(this._getItems(),i,s,this._config.wrap);if(n===i)return;const o=this._getItemIndex(n),r=e=>j.trigger(this._element,e,{relatedTarget:n,direction:this._orderToDirection(t),from:this._getItemIndex(i),to:o});if(r(gt).defaultPrevented)return;if(!i||!n)return;const a=Boolean(this._interval);this.pause(),this._isSliding=!0,this._setActiveIndicatorElement(o),this._activeElement=n;const l=s?"carousel-item-start":"carousel-item-end",c=s?"carousel-item-next":"carousel-item-prev";n.classList.add(c),g(n),i.classList.add(l),n.classList.add(l),this._queueCallback((()=>{n.classList.remove(l,c),n.classList.add(Et),i.classList.remove(Et,c,l),this._isSliding=!1,r(ft)}),i,this._isAnimated()),a&&this.cycle()}_isAnimated(){return this._element.classList.contains("slide")}_getActive(){return K.findOne(kt,this._element)}_getItems(){return K.find(Tt,this._element)}_clearInterval(){this._interval&&(clearInterval(this._interval),this._interval=null)}_directionToOrder(t){return p()?t===ut?dt:ht:t===ut?ht:dt}_orderToDirection(t){return p()?t===dt?ut:_t:t===dt?_t:ut}static jQueryInterface(t){return this.each((function(){const e=Ot.getOrCreateInstance(this,t);if("number"!=typeof t){if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}else e.to(t)}))}}j.on(document,wt,"[data-bs-slide], [data-bs-slide-to]",(function(t){const e=K.getElementFromSelector(this);if(!e||!e.classList.contains(At))return;t.preventDefault();const i=Ot.getOrCreateInstance(e),s=this.getAttribute("data-bs-slide-to");return s?(i.to(s),void i._maybeEnableCycle()):"next"===B.getDataAttribute(this,"slide")?(i.next(),void i._maybeEnableCycle()):(i.prev(),void i._maybeEnableCycle())})),j.on(window,yt,(()=>{const t=K.find('[data-bs-ride="carousel"]');for(const e of t)Ot.getOrCreateInstance(e)})),b(Ot);const It=".bs.collapse",Dt=`show${It}`,Nt=`shown${It}`,Pt=`hide${It}`,xt=`hidden${It}`,Mt=`click${It}.data-api`,jt="show",Ft="collapse",zt="collapsing",Ht=`:scope .${Ft} .${Ft}`,Bt='[data-bs-toggle="collapse"]',qt={parent:null,toggle:!0},Wt={parent:"(null|element)",toggle:"boolean"};class Rt extends W{constructor(t,e){super(t,e),this._isTransitioning=!1,this._triggerArray=[];const i=K.find(Bt);for(const t of i){const e=K.getSelectorFromElement(t),i=K.find(e).filter((t=>t===this._element));null!==e&&i.length&&this._triggerArray.push(t)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return qt}static get DefaultType(){return Wt}static get NAME(){return"collapse"}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let t=[];if(this._config.parent&&(t=this._getFirstLevelChildren(".collapse.show, .collapse.collapsing").filter((t=>t!==this._element)).map((t=>Rt.getOrCreateInstance(t,{toggle:!1})))),t.length&&t[0]._isTransitioning)return;if(j.trigger(this._element,Dt).defaultPrevented)return;for(const e of t)e.hide();const e=this._getDimension();this._element.classList.remove(Ft),this._element.classList.add(zt),this._element.style[e]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const i=`scroll${e[0].toUpperCase()+e.slice(1)}`;this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(zt),this._element.classList.add(Ft,jt),this._element.style[e]="",j.trigger(this._element,Nt)}),this._element,!0),this._element.style[e]=`${this._element[i]}px`}hide(){if(this._isTransitioning||!this._isShown())return;if(j.trigger(this._element,Pt).defaultPrevented)return;const t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`,g(this._element),this._element.classList.add(zt),this._element.classList.remove(Ft,jt);for(const t of this._triggerArray){const e=K.getElementFromSelector(t);e&&!this._isShown(e)&&this._addAriaAndCollapsedClass([t],!1)}this._isTransitioning=!0,this._element.style[t]="",this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(zt),this._element.classList.add(Ft),j.trigger(this._element,xt)}),this._element,!0)}_isShown(t=this._element){return t.classList.contains(jt)}_configAfterMerge(t){return t.toggle=Boolean(t.toggle),t.parent=c(t.parent),t}_getDimension(){return this._element.classList.contains("collapse-horizontal")?"width":"height"}_initializeChildren(){if(!this._config.parent)return;const t=this._getFirstLevelChildren(Bt);for(const e of t){const t=K.getElementFromSelector(e);t&&this._addAriaAndCollapsedClass([e],this._isShown(t))}}_getFirstLevelChildren(t){const e=K.find(Ht,this._config.parent);return K.find(t,this._config.parent).filter((t=>!e.includes(t)))}_addAriaAndCollapsedClass(t,e){if(t.length)for(const i of t)i.classList.toggle("collapsed",!e),i.setAttribute("aria-expanded",e)}static jQueryInterface(t){const e={};return"string"==typeof t&&/show|hide/.test(t)&&(e.toggle=!1),this.each((function(){const i=Rt.getOrCreateInstance(this,e);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t]()}}))}}j.on(document,Mt,Bt,(function(t){("A"===t.target.tagName||t.delegateTarget&&"A"===t.delegateTarget.tagName)&&t.preventDefault();for(const t of K.getMultipleElementsFromSelector(this))Rt.getOrCreateInstance(t,{toggle:!1}).toggle()})),b(Rt);const Kt="dropdown",Vt=".bs.dropdown",Qt=".data-api",Xt="ArrowUp",Yt="ArrowDown",Ut=`hide${Vt}`,Gt=`hidden${Vt}`,Jt=`show${Vt}`,Zt=`shown${Vt}`,te=`click${Vt}${Qt}`,ee=`keydown${Vt}${Qt}`,ie=`keyup${Vt}${Qt}`,se="show",ne='[data-bs-toggle="dropdown"]:not(.disabled):not(:disabled)',oe=`${ne}.${se}`,re=".dropdown-menu",ae=p()?"top-end":"top-start",le=p()?"top-start":"top-end",ce=p()?"bottom-end":"bottom-start",he=p()?"bottom-start":"bottom-end",de=p()?"left-start":"right-start",ue=p()?"right-start":"left-start",_e={autoClose:!0,boundary:"clippingParents",display:"dynamic",offset:[0,2],popperConfig:null,reference:"toggle"},ge={autoClose:"(boolean|string)",boundary:"(string|element)",display:"string",offset:"(array|string|function)",popperConfig:"(null|object|function)",reference:"(string|element|object)"};class fe extends W{constructor(t,e){super(t,e),this._popper=null,this._parent=this._element.parentNode,this._menu=K.next(this._element,re)[0]||K.prev(this._element,re)[0]||K.findOne(re,this._parent),this._inNavbar=this._detectNavbar()}static get Default(){return _e}static get DefaultType(){return ge}static get NAME(){return Kt}toggle(){return this._isShown()?this.hide():this.show()}show(){if(d(this._element)||this._isShown())return;const t={relatedTarget:this._element};if(!j.trigger(this._element,Jt,t).defaultPrevented){if(this._createPopper(),"ontouchstart" in document.documentElement&&!this._parent.closest(".navbar-nav"))for(const t of[].concat(...document.body.children))j.on(t,"mouseover",_);this._element.focus(),this._element.setAttribute("aria-expanded",!0),this._menu.classList.add(se),this._element.classList.add(se),j.trigger(this._element,Zt,t)}}hide(){if(d(this._element)||!this._isShown())return;const t={relatedTarget:this._element};this._completeHide(t)}dispose(){this._popper&&this._popper.destroy(),super.dispose()}update(){this._inNavbar=this._detectNavbar(),this._popper&&this._popper.update()}_completeHide(t){if(!j.trigger(this._element,Ut,t).defaultPrevented){if("ontouchstart" in document.documentElement)for(const t of[].concat(...document.body.children))j.off(t,"mouseover",_);this._popper&&this._popper.destroy(),this._menu.classList.remove(se),this._element.classList.remove(se),this._element.setAttribute("aria-expanded","false"),B.removeDataAttribute(this._menu,"popper"),j.trigger(this._element,Gt,t)}}_getConfig(t){if("object"==typeof(t=super._getConfig(t)).reference&&!l(t.reference)&&"function"!=typeof t.reference.getBoundingClientRect)throw new TypeError(`${Kt.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);return t}_createPopper(){if(void 0===i)throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)");let t=this._element;"parent"===this._config.reference?t=this._parent:l(this._config.reference)?t=c(this._config.reference):"object"==typeof this._config.reference&&(t=this._config.reference);const e=this._getPopperConfig();this._popper=i.createPopper(t,this._menu,e)}_isShown(){return this._menu.classList.contains(se)}_getPlacement(){const t=this._parent;if(t.classList.contains("dropend"))return de;if(t.classList.contains("dropstart"))return ue;if(t.classList.contains("dropup-center"))return"top";if(t.classList.contains("dropdown-center"))return"bottom";const e="end"===getComputedStyle(this._menu).getPropertyValue("--bs-position").trim();return t.classList.contains("dropup")?e?le:ae:e?he:ce}_detectNavbar(){return null!==this._element.closest(".navbar")}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(){const t={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return(this._inNavbar||"static"===this._config.display)&&(B.setDataAttribute(this._menu,"popper","static"),t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,...v(this._config.popperConfig,[t])}}_selectMenuItem({key:t,target:e}){const i=K.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter((t=>h(t)));i.length&&w(i,e,t===Yt,!i.includes(e)).focus()}static jQueryInterface(t){return this.each((function(){const e=fe.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}static clearMenus(t){if(2===t.button||"keyup"===t.type&&"Tab"!==t.key)return;const e=K.find(oe);for(const i of e){const e=fe.getInstance(i);if(!e||!1===e._config.autoClose)continue;const s=t.composedPath(),n=s.includes(e._menu);if(s.includes(e._element)||"inside"===e._config.autoClose&&!n||"outside"===e._config.autoClose&&n)continue;if(e._menu.contains(t.target)&&("keyup"===t.type&&"Tab"===t.key||/input|select|option|textarea|form/i.test(t.target.tagName)))continue;const o={relatedTarget:e._element};"click"===t.type&&(o.clickEvent=t),e._completeHide(o)}}static dataApiKeydownHandler(t){const e=/input|textarea/i.test(t.target.tagName),i="Escape"===t.key,s=[Xt,Yt].includes(t.key);if(!s&&!i)return;if(e&&!i)return;t.preventDefault();const n=this.matches(ne)?this:K.prev(this,ne)[0]||K.next(this,ne)[0]||K.findOne(ne,t.delegateTarget.parentNode),o=fe.getOrCreateInstance(n);if(s)return t.stopPropagation(),o.show(),void o._selectMenuItem(t);o._isShown()&&(t.stopPropagation(),o.hide(),n.focus())}}j.on(document,ee,ne,fe.dataApiKeydownHandler),j.on(document,ee,re,fe.dataApiKeydownHandler),j.on(document,te,fe.clearMenus),j.on(document,ie,fe.clearMenus),j.on(document,te,ne,(function(t){t.preventDefault(),fe.getOrCreateInstance(this).toggle()})),b(fe);const me="backdrop",pe="show",be=`mousedown.bs.${me}`,ve={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},ye={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"};class we extends q{constructor(t){super(),this._config=this._getConfig(t),this._isAppended=!1,this._element=null}static get Default(){return ve}static get DefaultType(){return ye}static get NAME(){return me}show(t){if(!this._config.isVisible)return void v(t);this._append();const e=this._getElement();this._config.isAnimated&&g(e),e.classList.add(pe),this._emulateAnimation((()=>{v(t)}))}hide(t){this._config.isVisible?(this._getElement().classList.remove(pe),this._emulateAnimation((()=>{this.dispose(),v(t)}))):v(t)}dispose(){this._isAppended&&(j.off(this._element,be),this._element.remove(),this._isAppended=!1)}_getElement(){if(!this._element){const t=document.createElement("div");t.className=this._config.className,this._config.isAnimated&&t.classList.add("fade"),this._element=t}return this._element}_configAfterMerge(t){return t.rootElement=c(t.rootElement),t}_append(){if(this._isAppended)return;const t=this._getElement();this._config.rootElement.append(t),j.on(t,be,(()=>{v(this._config.clickCallback)})),this._isAppended=!0}_emulateAnimation(t){y(t,this._getElement(),this._config.isAnimated)}}const Ae=".bs.focustrap",Ee=`focusin${Ae}`,Ce=`keydown.tab${Ae}`,Te="backward",ke={autofocus:!0,trapElement:null},$e={autofocus:"boolean",trapElement:"element"};class Se extends q{constructor(t){super(),this._config=this._getConfig(t),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return ke}static get DefaultType(){return $e}static get NAME(){return"focustrap"}activate(){this._isActive||(this._config.autofocus&&this._config.trapElement.focus(),j.off(document,Ae),j.on(document,Ee,(t=>this._handleFocusin(t))),j.on(document,Ce,(t=>this._handleKeydown(t))),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,j.off(document,Ae))}_handleFocusin(t){const{trapElement:e}=this._config;if(t.target===document||t.target===e||e.contains(t.target))return;const i=K.focusableChildren(e);0===i.length?e.focus():this._lastTabNavDirection===Te?i[i.length-1].focus():i[0].focus()}_handleKeydown(t){"Tab"===t.key&&(this._lastTabNavDirection=t.shiftKey?Te:"forward")}}const Le=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",Oe=".sticky-top",Ie="padding-right",De="margin-right";class Ne{constructor(){this._element=document.body}getWidth(){const t=document.documentElement.clientWidth;return Math.abs(window.innerWidth-t)}hide(){const t=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,Ie,(e=>e+t)),this._setElementAttributes(Le,Ie,(e=>e+t)),this._setElementAttributes(Oe,De,(e=>e-t))}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,Ie),this._resetElementAttributes(Le,Ie),this._resetElementAttributes(Oe,De)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(t,e,i){const s=this.getWidth();this._applyManipulationCallback(t,(t=>{if(t!==this._element&&window.innerWidth>t.clientWidth+s)return;this._saveInitialAttribute(t,e);const n=window.getComputedStyle(t).getPropertyValue(e);t.style.setProperty(e,`${i(Number.parseFloat(n))}px`)}))}_saveInitialAttribute(t,e){const i=t.style.getPropertyValue(e);i&&B.setDataAttribute(t,e,i)}_resetElementAttributes(t,e){this._applyManipulationCallback(t,(t=>{const i=B.getDataAttribute(t,e);null!==i?(B.removeDataAttribute(t,e),t.style.setProperty(e,i)):t.style.removeProperty(e)}))}_applyManipulationCallback(t,e){if(l(t))e(t);else for(const i of K.find(t,this._element))e(i)}}const Pe=".bs.modal",xe=`hide${Pe}`,Me=`hidePrevented${Pe}`,je=`hidden${Pe}`,Fe=`show${Pe}`,ze=`shown${Pe}`,He=`resize${Pe}`,Be=`click.dismiss${Pe}`,qe=`mousedown.dismiss${Pe}`,We=`keydown.dismiss${Pe}`,Re=`click${Pe}.data-api`,Ke="modal-open",Ve="show",Qe="modal-static",Xe={backdrop:!0,focus:!0,keyboard:!0},Ye={backdrop:"(boolean|string)",focus:"boolean",keyboard:"boolean"};class Ue extends W{constructor(t,e){super(t,e),this._dialog=K.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new Ne,this._addEventListeners()}static get Default(){return Xe}static get DefaultType(){return Ye}static get NAME(){return"modal"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||this._isTransitioning||j.trigger(this._element,Fe,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(Ke),this._adjustDialog(),this._backdrop.show((()=>this._showElement(t))))}hide(){this._isShown&&!this._isTransitioning&&(j.trigger(this._element,xe).defaultPrevented||(this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove(Ve),this._queueCallback((()=>this._hideModal()),this._element,this._isAnimated())))}dispose(){j.off(window,Pe),j.off(this._dialog,Pe),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new we({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new Se({trapElement:this._element})}_showElement(t){document.body.contains(this._element)||document.body.append(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0;const e=K.findOne(".modal-body",this._dialog);e&&(e.scrollTop=0),g(this._element),this._element.classList.add(Ve),this._queueCallback((()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,j.trigger(this._element,ze,{relatedTarget:t})}),this._dialog,this._isAnimated())}_addEventListeners(){j.on(this._element,We,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():this._triggerBackdropTransition())})),j.on(window,He,(()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()})),j.on(this._element,qe,(t=>{j.one(this._element,Be,(e=>{this._element===t.target&&this._element===e.target&&("static"!==this._config.backdrop?this._config.backdrop&&this.hide():this._triggerBackdropTransition())}))}))}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide((()=>{document.body.classList.remove(Ke),this._resetAdjustments(),this._scrollBar.reset(),j.trigger(this._element,je)}))}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(j.trigger(this._element,Me).defaultPrevented)return;const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._element.style.overflowY;"hidden"===e||this._element.classList.contains(Qe)||(t||(this._element.style.overflowY="hidden"),this._element.classList.add(Qe),this._queueCallback((()=>{this._element.classList.remove(Qe),this._queueCallback((()=>{this._element.style.overflowY=e}),this._dialog)}),this._dialog),this._element.focus())}_adjustDialog(){const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._scrollBar.getWidth(),i=e>0;if(i&&!t){const t=p()?"paddingLeft":"paddingRight";this._element.style[t]=`${e}px`}if(!i&&t){const t=p()?"paddingRight":"paddingLeft";this._element.style[t]=`${e}px`}}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(t,e){return this.each((function(){const i=Ue.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t](e)}}))}}j.on(document,Re,'[data-bs-toggle="modal"]',(function(t){const e=K.getElementFromSelector(this);["A","AREA"].includes(this.tagName)&&t.preventDefault(),j.one(e,Fe,(t=>{t.defaultPrevented||j.one(e,je,(()=>{h(this)&&this.focus()}))}));const i=K.findOne(".modal.show");i&&Ue.getInstance(i).hide(),Ue.getOrCreateInstance(e).toggle(this)})),V(Ue),b(Ue);const Ge=".bs.offcanvas",Je=".data-api",Ze=`load${Ge}${Je}`,ti="show",ei="showing",ii="hiding",si=".offcanvas.show",ni=`show${Ge}`,oi=`shown${Ge}`,ri=`hide${Ge}`,ai=`hidePrevented${Ge}`,li=`hidden${Ge}`,ci=`resize${Ge}`,hi=`click${Ge}${Je}`,di=`keydown.dismiss${Ge}`,ui={backdrop:!0,keyboard:!0,scroll:!1},_i={backdrop:"(boolean|string)",keyboard:"boolean",scroll:"boolean"};class gi extends W{constructor(t,e){super(t,e),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get Default(){return ui}static get DefaultType(){return _i}static get NAME(){return"offcanvas"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||j.trigger(this._element,ni,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._backdrop.show(),this._config.scroll||(new Ne).hide(),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(ei),this._queueCallback((()=>{this._config.scroll&&!this._config.backdrop||this._focustrap.activate(),this._element.classList.add(ti),this._element.classList.remove(ei),j.trigger(this._element,oi,{relatedTarget:t})}),this._element,!0))}hide(){this._isShown&&(j.trigger(this._element,ri).defaultPrevented||(this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add(ii),this._backdrop.hide(),this._queueCallback((()=>{this._element.classList.remove(ti,ii),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._config.scroll||(new Ne).reset(),j.trigger(this._element,li)}),this._element,!0)))}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){const t=Boolean(this._config.backdrop);return new we({className:"offcanvas-backdrop",isVisible:t,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:t?()=>{"static"!==this._config.backdrop?this.hide():j.trigger(this._element,ai)}:null})}_initializeFocusTrap(){return new Se({trapElement:this._element})}_addEventListeners(){j.on(this._element,di,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():j.trigger(this._element,ai))}))}static jQueryInterface(t){return this.each((function(){const e=gi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}j.on(document,hi,'[data-bs-toggle="offcanvas"]',(function(t){const e=K.getElementFromSelector(this);if(["A","AREA"].includes(this.tagName)&&t.preventDefault(),d(this))return;j.one(e,li,(()=>{h(this)&&this.focus()}));const i=K.findOne(si);i&&i!==e&&gi.getInstance(i).hide(),gi.getOrCreateInstance(e).toggle(this)})),j.on(window,Ze,(()=>{for(const t of K.find(si))gi.getOrCreateInstance(t).show()})),j.on(window,ci,(()=>{for(const t of K.find("[aria-modal][class*=show][class*=offcanvas-]"))"fixed"!==getComputedStyle(t).position&&gi.getOrCreateInstance(t).hide()})),V(gi),b(gi);const fi={"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},mi=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),pi=/^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i,bi=(t,e)=>{const i=t.nodeName.toLowerCase();return e.includes(i)?!mi.has(i)||Boolean(pi.test(t.nodeValue)):e.filter((t=>t instanceof RegExp)).some((t=>t.test(i)))},vi={allowList:fi,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:"
"},yi={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},wi={entry:"(string|element|function|null)",selector:"(string|element)"};class Ai extends q{constructor(t){super(),this._config=this._getConfig(t)}static get Default(){return vi}static get DefaultType(){return yi}static get NAME(){return"TemplateFactory"}getContent(){return Object.values(this._config.content).map((t=>this._resolvePossibleFunction(t))).filter(Boolean)}hasContent(){return this.getContent().length>0}changeContent(t){return this._checkContent(t),this._config.content={...this._config.content,...t},this}toHtml(){const t=document.createElement("div");t.innerHTML=this._maybeSanitize(this._config.template);for(const[e,i]of Object.entries(this._config.content))this._setContent(t,i,e);const e=t.children[0],i=this._resolvePossibleFunction(this._config.extraClass);return i&&e.classList.add(...i.split(" ")),e}_typeCheckConfig(t){super._typeCheckConfig(t),this._checkContent(t.content)}_checkContent(t){for(const[e,i]of Object.entries(t))super._typeCheckConfig({selector:e,entry:i},wi)}_setContent(t,e,i){const s=K.findOne(i,t);s&&((e=this._resolvePossibleFunction(e))?l(e)?this._putElementInTemplate(c(e),s):this._config.html?s.innerHTML=this._maybeSanitize(e):s.textContent=e:s.remove())}_maybeSanitize(t){return this._config.sanitize?function(t,e,i){if(!t.length)return t;if(i&&"function"==typeof i)return i(t);const s=(new window.DOMParser).parseFromString(t,"text/html"),n=[].concat(...s.body.querySelectorAll("*"));for(const t of n){const i=t.nodeName.toLowerCase();if(!Object.keys(e).includes(i)){t.remove();continue}const s=[].concat(...t.attributes),n=[].concat(e["*"]||[],e[i]||[]);for(const e of s)bi(e,n)||t.removeAttribute(e.nodeName)}return s.body.innerHTML}(t,this._config.allowList,this._config.sanitizeFn):t}_resolvePossibleFunction(t){return v(t,[this])}_putElementInTemplate(t,e){if(this._config.html)return e.innerHTML="",void e.append(t);e.textContent=t.textContent}}const Ei=new Set(["sanitize","allowList","sanitizeFn"]),Ci="fade",Ti="show",ki=".modal",$i="hide.bs.modal",Si="hover",Li="focus",Oi={AUTO:"auto",TOP:"top",RIGHT:p()?"left":"right",BOTTOM:"bottom",LEFT:p()?"right":"left"},Ii={allowList:fi,animation:!0,boundary:"clippingParents",container:!1,customClass:"",delay:0,fallbackPlacements:["top","right","bottom","left"],html:!1,offset:[0,6],placement:"top",popperConfig:null,sanitize:!0,sanitizeFn:null,selector:!1,template:'',title:"",trigger:"hover focus"},Di={allowList:"object",animation:"boolean",boundary:"(string|element)",container:"(string|element|boolean)",customClass:"(string|function)",delay:"(number|object)",fallbackPlacements:"array",html:"boolean",offset:"(array|string|function)",placement:"(string|function)",popperConfig:"(null|object|function)",sanitize:"boolean",sanitizeFn:"(null|function)",selector:"(string|boolean)",template:"string",title:"(string|element|function)",trigger:"string"};class Ni extends W{constructor(t,e){if(void 0===i)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(t,e),this._isEnabled=!0,this._timeout=0,this._isHovered=null,this._activeTrigger={},this._popper=null,this._templateFactory=null,this._newContent=null,this.tip=null,this._setListeners(),this._config.selector||this._fixTitle()}static get Default(){return Ii}static get DefaultType(){return Di}static get NAME(){return"tooltip"}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(){this._isEnabled&&(this._activeTrigger.click=!this._activeTrigger.click,this._isShown()?this._leave():this._enter())}dispose(){clearTimeout(this._timeout),j.off(this._element.closest(ki),$i,this._hideModalHandler),this._element.getAttribute("data-bs-original-title")&&this._element.setAttribute("title",this._element.getAttribute("data-bs-original-title")),this._disposePopper(),super.dispose()}show(){if("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(!this._isWithContent()||!this._isEnabled)return;const t=j.trigger(this._element,this.constructor.eventName("show")),e=(u(this._element)||this._element.ownerDocument.documentElement).contains(this._element);if(t.defaultPrevented||!e)return;this._disposePopper();const i=this._getTipElement();this._element.setAttribute("aria-describedby",i.getAttribute("id"));const{container:s}=this._config;if(this._element.ownerDocument.documentElement.contains(this.tip)||(s.append(i),j.trigger(this._element,this.constructor.eventName("inserted"))),this._popper=this._createPopper(i),i.classList.add(Ti),"ontouchstart" in document.documentElement)for(const t of[].concat(...document.body.children))j.on(t,"mouseover",_);this._queueCallback((()=>{j.trigger(this._element,this.constructor.eventName("shown")),!1===this._isHovered&&this._leave(),this._isHovered=!1}),this.tip,this._isAnimated())}hide(){if(this._isShown()&&!j.trigger(this._element,this.constructor.eventName("hide")).defaultPrevented){if(this._getTipElement().classList.remove(Ti),"ontouchstart" in document.documentElement)for(const t of[].concat(...document.body.children))j.off(t,"mouseover",_);this._activeTrigger.click=!1,this._activeTrigger[Li]=!1,this._activeTrigger[Si]=!1,this._isHovered=null,this._queueCallback((()=>{this._isWithActiveTrigger()||(this._isHovered||this._disposePopper(),this._element.removeAttribute("aria-describedby"),j.trigger(this._element,this.constructor.eventName("hidden")))}),this.tip,this._isAnimated())}}update(){this._popper&&this._popper.update()}_isWithContent(){return Boolean(this._getTitle())}_getTipElement(){return this.tip||(this.tip=this._createTipElement(this._newContent||this._getContentForTemplate())),this.tip}_createTipElement(t){const e=this._getTemplateFactory(t).toHtml();if(!e)return null;e.classList.remove(Ci,Ti),e.classList.add(`bs-${this.constructor.NAME}-auto`);const i=(t=>{do{t+=Math.floor(1e6*Math.random())}while(document.getElementById(t));return t})(this.constructor.NAME).toString();return e.setAttribute("id",i),this._isAnimated()&&e.classList.add(Ci),e}setContent(t){this._newContent=t,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(t){return this._templateFactory?this._templateFactory.changeContent(t):this._templateFactory=new Ai({...this._config,content:t,extraClass:this._resolvePossibleFunction(this._config.customClass)}),this._templateFactory}_getContentForTemplate(){return{".tooltip-inner":this._getTitle()}}_getTitle(){return this._resolvePossibleFunction(this._config.title)||this._element.getAttribute("data-bs-original-title")}_initializeOnDelegatedTarget(t){return this.constructor.getOrCreateInstance(t.delegateTarget,this._getDelegateConfig())}_isAnimated(){return this._config.animation||this.tip&&this.tip.classList.contains(Ci)}_isShown(){return this.tip&&this.tip.classList.contains(Ti)}_createPopper(t){const e=v(this._config.placement,[this,t,this._element]),s=Oi[e.toUpperCase()];return i.createPopper(this._element,t,this._getPopperConfig(s))}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_resolvePossibleFunction(t){return v(t,[this._element])}_getPopperConfig(t){const e={placement:t,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"preSetPlacement",enabled:!0,phase:"beforeMain",fn:t=>{this._getTipElement().setAttribute("data-popper-placement",t.state.placement)}}]};return{...e,...v(this._config.popperConfig,[e])}}_setListeners(){const t=this._config.trigger.split(" ");for(const e of t)if("click"===e)j.on(this._element,this.constructor.eventName("click"),this._config.selector,(t=>{this._initializeOnDelegatedTarget(t).toggle()}));else if("manual"!==e){const t=e===Si?this.constructor.eventName("mouseenter"):this.constructor.eventName("focusin"),i=e===Si?this.constructor.eventName("mouseleave"):this.constructor.eventName("focusout");j.on(this._element,t,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusin"===t.type?Li:Si]=!0,e._enter()})),j.on(this._element,i,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusout"===t.type?Li:Si]=e._element.contains(t.relatedTarget),e._leave()}))}this._hideModalHandler=()=>{this._element&&this.hide()},j.on(this._element.closest(ki),$i,this._hideModalHandler)}_fixTitle(){const t=this._element.getAttribute("title");t&&(this._element.getAttribute("aria-label")||this._element.textContent.trim()||this._element.setAttribute("aria-label",t),this._element.setAttribute("data-bs-original-title",t),this._element.removeAttribute("title"))}_enter(){this._isShown()||this._isHovered?this._isHovered=!0:(this._isHovered=!0,this._setTimeout((()=>{this._isHovered&&this.show()}),this._config.delay.show))}_leave(){this._isWithActiveTrigger()||(this._isHovered=!1,this._setTimeout((()=>{this._isHovered||this.hide()}),this._config.delay.hide))}_setTimeout(t,e){clearTimeout(this._timeout),this._timeout=setTimeout(t,e)}_isWithActiveTrigger(){return Object.values(this._activeTrigger).includes(!0)}_getConfig(t){const e=B.getDataAttributes(this._element);for(const t of Object.keys(e))Ei.has(t)&&delete e[t];return t={...e,..."object"==typeof t&&t?t:{}},t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t.container=!1===t.container?document.body:c(t.container),"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),t}_getDelegateConfig(){const t={};for(const[e,i]of Object.entries(this._config))this.constructor.Default[e]!==i&&(t[e]=i);return t.selector=!1,t.trigger="manual",t}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null),this.tip&&(this.tip.remove(),this.tip=null)}static jQueryInterface(t){return this.each((function(){const e=Ni.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}b(Ni);const Pi={...Ni.Default,content:"",offset:[0,8],placement:"right",template:'',trigger:"click"},xi={...Ni.DefaultType,content:"(null|string|element|function)"};class Mi extends Ni{static get Default(){return Pi}static get DefaultType(){return xi}static get NAME(){return"popover"}_isWithContent(){return this._getTitle()||this._getContent()}_getContentForTemplate(){return{".popover-header":this._getTitle(),".popover-body":this._getContent()}}_getContent(){return this._resolvePossibleFunction(this._config.content)}static jQueryInterface(t){return this.each((function(){const e=Mi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}b(Mi);const ji=".bs.scrollspy",Fi=`activate${ji}`,zi=`click${ji}`,Hi=`load${ji}.data-api`,Bi="active",qi="[href]",Wi=".nav-link",Ri=`${Wi}, .nav-item > ${Wi}, .list-group-item`,Ki={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null,threshold:[.1,.5,1]},Vi={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element",threshold:"array"};class Qi extends W{constructor(t,e){super(t,e),this._targetLinks=new Map,this._observableSections=new Map,this._rootElement="visible"===getComputedStyle(this._element).overflowY?null:this._element,this._activeTarget=null,this._observer=null,this._previousScrollData={visibleEntryTop:0,parentScrollTop:0},this.refresh()}static get Default(){return Ki}static get DefaultType(){return Vi}static get NAME(){return"scrollspy"}refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmoothScroll(),this._observer?this._observer.disconnect():this._observer=this._getNewObserver();for(const t of this._observableSections.values())this._observer.observe(t)}dispose(){this._observer.disconnect(),super.dispose()}_configAfterMerge(t){return t.target=c(t.target)||document.body,t.rootMargin=t.offset?`${t.offset}px 0px -30%`:t.rootMargin,"string"==typeof t.threshold&&(t.threshold=t.threshold.split(",").map((t=>Number.parseFloat(t)))),t}_maybeEnableSmoothScroll(){this._config.smoothScroll&&(j.off(this._config.target,zi),j.on(this._config.target,zi,qi,(t=>{const e=this._observableSections.get(t.target.hash);if(e){t.preventDefault();const i=this._rootElement||window,s=e.offsetTop-this._element.offsetTop;if(i.scrollTo)return void i.scrollTo({top:s,behavior:"smooth"});i.scrollTop=s}})))}_getNewObserver(){const t={root:this._rootElement,threshold:this._config.threshold,rootMargin:this._config.rootMargin};return new IntersectionObserver((t=>this._observerCallback(t)),t)}_observerCallback(t){const e=t=>this._targetLinks.get(`#${t.target.id}`),i=t=>{this._previousScrollData.visibleEntryTop=t.target.offsetTop,this._process(e(t))},s=(this._rootElement||document.documentElement).scrollTop,n=s>=this._previousScrollData.parentScrollTop;this._previousScrollData.parentScrollTop=s;for(const o of t){if(!o.isIntersecting){this._activeTarget=null,this._clearActiveClass(e(o));continue}const t=o.target.offsetTop>=this._previousScrollData.visibleEntryTop;if(n&&t){if(i(o),!s)return}else n||t||i(o)}}_initializeTargetsAndObservables(){this._targetLinks=new Map,this._observableSections=new Map;const t=K.find(qi,this._config.target);for(const e of t){if(!e.hash||d(e))continue;const t=K.findOne(decodeURI(e.hash),this._element);h(t)&&(this._targetLinks.set(decodeURI(e.hash),e),this._observableSections.set(e.hash,t))}}_process(t){this._activeTarget!==t&&(this._clearActiveClass(this._config.target),this._activeTarget=t,t.classList.add(Bi),this._activateParents(t),j.trigger(this._element,Fi,{relatedTarget:t}))}_activateParents(t){if(t.classList.contains("dropdown-item"))K.findOne(".dropdown-toggle",t.closest(".dropdown")).classList.add(Bi);else for(const e of K.parents(t,".nav, .list-group"))for(const t of K.prev(e,Ri))t.classList.add(Bi)}_clearActiveClass(t){t.classList.remove(Bi);const e=K.find(`${qi}.${Bi}`,t);for(const t of e)t.classList.remove(Bi)}static jQueryInterface(t){return this.each((function(){const e=Qi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}j.on(window,Hi,(()=>{for(const t of K.find('[data-bs-spy="scroll"]'))Qi.getOrCreateInstance(t)})),b(Qi);const Xi=".bs.tab",Yi=`hide${Xi}`,Ui=`hidden${Xi}`,Gi=`show${Xi}`,Ji=`shown${Xi}`,Zi=`click${Xi}`,ts=`keydown${Xi}`,es=`load${Xi}`,is="ArrowLeft",ss="ArrowRight",ns="ArrowUp",os="ArrowDown",rs="Home",as="End",ls="active",cs="fade",hs="show",ds=".dropdown-toggle",us=`:not(${ds})`,_s='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',gs=`.nav-link${us}, .list-group-item${us}, [role="tab"]${us}, ${_s}`,fs=`.${ls}[data-bs-toggle="tab"], .${ls}[data-bs-toggle="pill"], .${ls}[data-bs-toggle="list"]`;class ms extends W{constructor(t){super(t),this._parent=this._element.closest('.list-group, .nav, [role="tablist"]'),this._parent&&(this._setInitialAttributes(this._parent,this._getChildren()),j.on(this._element,ts,(t=>this._keydown(t))))}static get NAME(){return"tab"}show(){const t=this._element;if(this._elemIsActive(t))return;const e=this._getActiveElem(),i=e?j.trigger(e,Yi,{relatedTarget:t}):null;j.trigger(t,Gi,{relatedTarget:e}).defaultPrevented||i&&i.defaultPrevented||(this._deactivate(e,t),this._activate(t,e))}_activate(t,e){t&&(t.classList.add(ls),this._activate(K.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.removeAttribute("tabindex"),t.setAttribute("aria-selected",!0),this._toggleDropDown(t,!0),j.trigger(t,Ji,{relatedTarget:e})):t.classList.add(hs)}),t,t.classList.contains(cs)))}_deactivate(t,e){t&&(t.classList.remove(ls),t.blur(),this._deactivate(K.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.setAttribute("aria-selected",!1),t.setAttribute("tabindex","-1"),this._toggleDropDown(t,!1),j.trigger(t,Ui,{relatedTarget:e})):t.classList.remove(hs)}),t,t.classList.contains(cs)))}_keydown(t){if(![is,ss,ns,os,rs,as].includes(t.key))return;t.stopPropagation(),t.preventDefault();const e=this._getChildren().filter((t=>!d(t)));let i;if([rs,as].includes(t.key))i=e[t.key===rs?0:e.length-1];else{const s=[ss,os].includes(t.key);i=w(e,t.target,s,!0)}i&&(i.focus({preventScroll:!0}),ms.getOrCreateInstance(i).show())}_getChildren(){return K.find(gs,this._parent)}_getActiveElem(){return this._getChildren().find((t=>this._elemIsActive(t)))||null}_setInitialAttributes(t,e){this._setAttributeIfNotExists(t,"role","tablist");for(const t of e)this._setInitialAttributesOnChild(t)}_setInitialAttributesOnChild(t){t=this._getInnerElement(t);const e=this._elemIsActive(t),i=this._getOuterElement(t);t.setAttribute("aria-selected",e),i!==t&&this._setAttributeIfNotExists(i,"role","presentation"),e||t.setAttribute("tabindex","-1"),this._setAttributeIfNotExists(t,"role","tab"),this._setInitialAttributesOnTargetPanel(t)}_setInitialAttributesOnTargetPanel(t){const e=K.getElementFromSelector(t);e&&(this._setAttributeIfNotExists(e,"role","tabpanel"),t.id&&this._setAttributeIfNotExists(e,"aria-labelledby",`${t.id}`))}_toggleDropDown(t,e){const i=this._getOuterElement(t);if(!i.classList.contains("dropdown"))return;const s=(t,s)=>{const n=K.findOne(t,i);n&&n.classList.toggle(s,e)};s(ds,ls),s(".dropdown-menu",hs),i.setAttribute("aria-expanded",e)}_setAttributeIfNotExists(t,e,i){t.hasAttribute(e)||t.setAttribute(e,i)}_elemIsActive(t){return t.classList.contains(ls)}_getInnerElement(t){return t.matches(gs)?t:K.findOne(gs,t)}_getOuterElement(t){return t.closest(".nav-item, .list-group-item")||t}static jQueryInterface(t){return this.each((function(){const e=ms.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}j.on(document,Zi,_s,(function(t){["A","AREA"].includes(this.tagName)&&t.preventDefault(),d(this)||ms.getOrCreateInstance(this).show()})),j.on(window,es,(()=>{for(const t of K.find(fs))ms.getOrCreateInstance(t)})),b(ms);const ps=".bs.toast",bs=`mouseover${ps}`,vs=`mouseout${ps}`,ys=`focusin${ps}`,ws=`focusout${ps}`,As=`hide${ps}`,Es=`hidden${ps}`,Cs=`show${ps}`,Ts=`shown${ps}`,ks="hide",$s="show",Ss="showing",Ls={animation:"boolean",autohide:"boolean",delay:"number"},Os={animation:!0,autohide:!0,delay:5e3};class Is extends W{constructor(t,e){super(t,e),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get Default(){return Os}static get DefaultType(){return Ls}static get NAME(){return"toast"}show(){j.trigger(this._element,Cs).defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove(ks),g(this._element),this._element.classList.add($s,Ss),this._queueCallback((()=>{this._element.classList.remove(Ss),j.trigger(this._element,Ts),this._maybeScheduleHide()}),this._element,this._config.animation))}hide(){this.isShown()&&(j.trigger(this._element,As).defaultPrevented||(this._element.classList.add(Ss),this._queueCallback((()=>{this._element.classList.add(ks),this._element.classList.remove(Ss,$s),j.trigger(this._element,Es)}),this._element,this._config.animation)))}dispose(){this._clearTimeout(),this.isShown()&&this._element.classList.remove($s),super.dispose()}isShown(){return this._element.classList.contains($s)}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout((()=>{this.hide()}),this._config.delay)))}_onInteraction(t,e){switch(t.type){case"mouseover":case"mouseout":this._hasMouseInteraction=e;break;case"focusin":case"focusout":this._hasKeyboardInteraction=e}if(e)return void this._clearTimeout();const i=t.relatedTarget;this._element===i||this._element.contains(i)||this._maybeScheduleHide()}_setListeners(){j.on(this._element,bs,(t=>this._onInteraction(t,!0))),j.on(this._element,vs,(t=>this._onInteraction(t,!1))),j.on(this._element,ys,(t=>this._onInteraction(t,!0))),j.on(this._element,ws,(t=>this._onInteraction(t,!1)))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(t){return this.each((function(){const e=Is.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}return V(Is),b(Is),{Alert:U,Button:J,Carousel:Ot,Collapse:Rt,Dropdown:fe,Modal:Ue,Offcanvas:gi,Popover:Mi,ScrollSpy:Qi,Tab:ms,Toast:Is,Tooltip:Ni}}));const certificateCourse=(()=>{const container=document.querySelector('.js-certificate-course');if(!container)return;const form=container.querySelector('.js-certificate-course-form');if(!form)return;const datePicker=container.querySelector(".js-date-picker");const datePickerError=container.querySelector(".js-error-date-picker");const submitButton=container.querySelector(".edit-course__btn");const submitForm=()=>{form.addEventListener('submit',(e)=>{e.preventDefault();const isDropdownsValid=validation.validateDropdownFields();const isDatePickerValid=validation.validateDatePickerInput(datePicker,datePickerError);if(isDropdownsValid&&isDatePickerValid){submitButton.disabled=true;form.submit();}})} const handleDateChange=()=>{datePicker.addEventListener("change",({target})=>{if(target.value){submitButton.disabled=false;}else{submitButton.disabled=true;}})} document.addEventListener('DOMContentLoaded',()=>{submitForm();handleDateChange()});})() const certificateUpdate=(()=>{const certificates=document.querySelector('.js-certificates');if(!certificates)return;const submitButton=certificates.querySelector('.js-certificates-submit');const includeAddressCheckbox=certificates.querySelector('.js-certificates-checkbox');const email=certificates.querySelector('.js-certificates-email');const emailError=certificates.querySelector('.js-certificate-error-message-email');const shareDuration=certificates.querySelector('.js-certificates-share-duration');const isDesktopDevice=window.matchMedia('(min-width: 1200px)').matches;const checkboxes=isDesktopDevice?certificates.querySelectorAll('.js-certificates-table-desktop .js-certificate-number'):certificates.querySelectorAll('.js-certificates-table-mobile .js-certificate-number');const path=`${window.location.origin}/api/certificatestab/sharecertificates`;const dateForever='forever';let data={certificatesIDs:"",recipientsEmail:"",duration:"",includeYourAddress:false};const dateOptions=[{key:shareDuration[0].value,value:1},{key:shareDuration[1].value,value:3},{key:shareDuration[2].value,value:12},{key:shareDuration[3].value,value:dateForever}] const setDate=()=>{const shareDurationValue=dateOptions.find(option=>option.key===shareDuration.value);if(shareDuration.value===dateForever){return dateForever} const currentDate=new Date();const nextDate=new Date(currentDate);nextDate.setMonth(currentDate.getMonth()+shareDurationValue.value);const formattedDate=nextDate.toLocaleDateString('en-GB',{day:'2-digit',month:'2-digit',year:'2-digit'});return formattedDate};const certificateNumbers=(items)=>{return items.map((check)=>{return check.value;})};const getCheckedItems=()=>[...checkboxes].filter((item)=>item.checked) const submitData=()=>{submitButton.addEventListener('click',(e)=>{const validEmail=validation.validateReferEmail(email,emailError);if(!validEmail)return const date=setDate();const checkedItems=getCheckedItems();if(!checkedItems.length)return const numbers=certificateNumbers(checkedItems);data={certificatesIDs:`${numbers.toString()}`,recipientsEmail:email.value,duration:date,includeYourAddress:includeAddressCheckbox.checked};postData(data);e.preventDefault();})};const postData=async(data)=>{try{const response=await fetch(path,{method:"POST",headers:{"Content-type":"application/json;"},body:JSON.stringify(data),});if(!response.ok){throw new Error(`An error occurred while sending the data ${response.status}`);} else {location.reload();}}catch(error){console.log("An error occurred. Please try again later.",error);}};const handleEmailInput=()=>{email.addEventListener('input',({target})=>{if(!target.value)return const checkedItems=getCheckedItems();if(!checkedItems.length)return submitButton.removeAttribute('disabled')})} const handleCheckboxEvent=()=>{for(const checkbox of checkboxes){checkbox.addEventListener('change',()=>{const checkedItems=getCheckedItems();if(!checkedItems.length){submitButton.setAttribute('disabled','disabled') return} if(!email.value)return submitButton.removeAttribute('disabled')})}} document.addEventListener("DOMContentLoaded",function(){submitData();handleEmailInput();handleCheckboxEvent();});})();function checkoutPageFunctions(){const showShippingAddress=document.querySelector(".js-show-shipping-address");const shippingAddressFieldset=document.querySelector(".js-shipping-checkout");const shippingAddressFieldsetActive="checkout__shipping-fieldset--active";showShippingAddress?.addEventListener("change",(e)=>{const includeExpired=e.target.checked;if(includeExpired){shippingAddressFieldset.classList.remove(shippingAddressFieldsetActive);e.target.setAttribute("data-shipping-address","same");}else{shippingAddressFieldset.classList.add(shippingAddressFieldsetActive);e.target.setAttribute("data-shipping-address","different");}});} function toggleSummaryField(){const summaryToggleBtn=document.querySelector(".js-toggle-summary");const orderSummaryField=document.querySelector(".js-order-summary");const summaryToggleBtnActive="checkout__toggle-summary--active";const orderSummaryFieldActive="checkout__order-summary--active";summaryToggleBtn?.addEventListener("click",(e)=>{summaryToggleBtn.classList.toggle(summaryToggleBtnActive);orderSummaryField.classList.toggle(orderSummaryFieldActive);});} function toggleToast(){const notificationToast=document.querySelector(".js-notification-toast");const notificationToastShow="notification--show";notificationToast?.classList.add(notificationToastShow);setTimeout(()=>{notificationToast?.classList.remove(notificationToastShow);},3000);} function validateCheckBox(el,name){const field=el.querySelector(`.js-check-${name}`);const error=el.querySelector(`.js-error-check-${name}`);if(!field&&!error)return true;return validation.validateTerms(field,error);} function handleSubmit(){const form=document.querySelector(".js-review-page-form");form?.addEventListener("submit",(e)=>{e.preventDefault();const acceptTerms=validateCheckBox(e.target,"terms");const acceptDigi=validateCheckBox(e.target,"digital-terms");if(acceptTerms&&acceptDigi){form.submit();}});} function validatePostcode(){const postcodeInputs=document.querySelectorAll(".js-postcode-input");if(!postcodeInputs.length)return;postcodeInputs.forEach((input)=>{input.addEventListener("input",({target})=>{target.value=validation.postCodeRegex(target.value);});});} function togglePostcodeRequired(selectedOption){const postcodeInputs=document.querySelectorAll(".js-postcode-input");postcodeInputs.forEach((element)=>{if(element&&selectedOption){element.required=selectedOption.dataset.requirePostcode==="True";}});} function initPostcodeRequiredForCountry(){const countryInputs=document.querySelectorAll("#select-country-order, #select-country");countryInputs.forEach((element)=>{togglePostcodeRequired(element.options[element.selectedIndex]);});countryInputs.forEach((element)=>{element.addEventListener("change",({target})=>{togglePostcodeRequired(target.options[target.selectedIndex]);});});} document.addEventListener("DOMContentLoaded",()=>{checkoutPageFunctions();initPostcodeRequiredForCountry();toggleSummaryField();toggleToast();handleSubmit();validatePostcode();});const handleInputDate=(()=>{const isMobileDevice=window.matchMedia('(max-width: 1024px)').matches;if(!isMobileDevice)return;const dateInputs=document.querySelectorAll("input[type=date]");if(!dateInputs.length)return for(const input of dateInputs){input.addEventListener("focus",({target})=>{target.classList.add("input-date--focus");});input.addEventListener("blur",({target})=>{if(target.value)return target.classList.remove("input-date--focus");});}})();document.addEventListener("DOMContentLoaded",()=>{dinghy91快色sStepTwo();});function dinghy91快色sStepTwo(){const dinghyForm=document.querySelector('.js-dinghy-form');const sailNumberInput=document.querySelector('.js-branch-sort-code');const errorSailNumber=document.querySelector('.js-error-sort-code');const handleDinghyFormSubmit=(e)=>{e.preventDefault();const areDropdownsValid=validation.validateDropdownFields();const sailNumberValid=validation.validateNumbersAndLettersWithMaxLength(sailNumberInput,errorSailNumber,6,"Please enter up to 6 characters");if(areDropdownsValid&&sailNumberValid){loader.showLoader();dinghyForm.submit();}};dinghyForm?.addEventListener('submit',handleDinghyFormSubmit);};const certificateEditStudent=(()=>{const container=document.querySelector('.js-edit-student');if(!container)return;const form=container.querySelector('.js-edit-student-form');const emailInput=container.querySelector('.js-edit-student-email');const errorEmail=container.querySelector('.js-edit-student-email-error');const submitForm=()=>{form.addEventListener('submit',(e)=>{e.preventDefault();const areRequiredFieldsValid=validation.validateGenericRequiredFields();const isEmailValid=validation.validateReferEmail(emailInput,errorEmail);if(areRequiredFieldsValid&&isEmailValid){form.submit();}})} document.addEventListener('DOMContentLoaded',()=>{submitForm();});})();const evidencePage=(()=>{const form=document.querySelector('.js-evidence-form');if(!form)return;const inputFields=form.querySelectorAll(".js-file-size-upload");const submitBtn=form.querySelector(".js-submit");const errorMessageActiveClass="error-message--active";const handleSubmit=()=>{form.addEventListener('submit',(e)=>{e.preventDefault();const areFilsValid=validation.validateInputFiles();const areGroupedFilesValid=validation.validateGroupedInputs();const wrongFileSize=validateLargeFiles();if(areFilsValid&&areGroupedFilesValid&&!wrongFileSize){submitBtn.disabled=true;loader.showLoader();form.submit();}})} const largeFileSize=()=>{if(!inputFields.length)return;inputFields.forEach(input=>{const errorRequired=input.parentElement.querySelector(".js-required-error");const errorFileSize=input.parentElement.querySelector(".js-large-file-error");input.addEventListener('change',(e)=>{const byteSize=e.target?.files[0]?.size const toMB=byteSize/1024/1024 const fileTooLarge=toMB&&toMB>10 toggleErrorClass(errorFileSize,!fileTooLarge);if(byteSize&&errorRequired){errorRequired.classList.remove(errorMessageActiveClass)} validateLargeFiles()})})} const toggleErrorClass=(element,isValid)=>{const errorMessageActiveClass="error-message--active";if(!element)return;if(!element.value){element.classList.remove(errorMessageActiveClass);} if(isValid){element.classList.remove(errorMessageActiveClass);}else{element.previousElementSibling?.classList.add(errorMessageActiveClass) element.classList.add(errorMessageActiveClass);}};const validateLargeFiles=()=>{const errorElements=document.querySelectorAll(".js-large-file-error");const wrongFileSize=[...errorElements].every((input)=>!input.classList.contains(errorMessageActiveClass));submitBtn.disabled=!wrongFileSize;return!wrongFileSize} document.addEventListener('DOMContentLoaded',()=>{handleSubmit();largeFileSize();})})();const finaliseMember=(()=>{const container=document.querySelector('.js-finalise-member');if(!container)return;const checkbox=container.querySelector('.js-checkbox-fast-track');const priceEl=container.querySelector('.js-total-price');const addressEl=container.querySelector('.js-finalise-address');const price=addressEl.getAttribute('data-price');const priceUrl=container.getAttribute('data-url');const getOrders=async(url)=>{try{const response=await fetch(url);const data=await response.json();return data;}catch(error){console.error('Error getting tracking data:',error)}};const changeUI=(optInFastTrack,orderPrice,orderLines)=>{priceEl.textContent=orderPrice;const itemsEl=container.querySelector('.js-finalise-items');const newItemsEl=container.querySelector('.js-finalise-new-items');if(!optInFastTrack){if(Number(price)<=0){addressEl.classList.add('hidden');} itemsEl.classList.remove('hidden');newItemsEl.innerHTML='';return} itemsEl.classList.add('hidden');const orders=orderLines.map(({name,price})=>orderItem(name,price)).join('');newItemsEl.innerHTML=orders;if(Number(price)<=0){addressEl.classList.remove('hidden');}};const orderItem=(orderName,price)=>{return`
${orderName} ${price}
`} const handleCheckbox=()=>{checkbox?.addEventListener('change',async({target})=>{const optInFastTrack=target.checked;try{const url=`${priceUrl}?fastTrack=${optInFastTrack}`;const{orderPrice,orderLines}=await getOrders(url);changeUI(optInFastTrack,orderPrice,orderLines);}catch(error){console.error('Error changing tracking data:',error)}});};document.addEventListener('DOMContentLoaded',()=>{handleCheckbox();});})();document.addEventListener("DOMContentLoaded",()=>{const resetForm=document.querySelector(".js-password-reset-form");const emailInput=document.querySelector(".js-email-input-reset");const errorEmail=document.querySelector('.js-error-message-email');const newPasswordForm=document.querySelector('.js-new-password-form');const passwordInput=document.querySelector('.js-password-register');const errorPassword=document.querySelector('.js-error-message-password');const confirmPassword=document.querySelector('.js-password-confirm');const errorConfirmPassword=document.querySelector('.js-error-confirm-password');const submitNewPasswordBtn=document.querySelector('.js-submit-new-password');resetForm?.addEventListener("submit",async(e)=>{e.preventDefault();validation.setHasSubmittedFirstStep(true);const isEmailValid=validation.validateEmail(emailInput,errorEmail);const email=emailInput.value;if(!isEmailValid){return} try{const response=await fetch("/umbraco/surface/passwordreset/resetpassword?email="+email,{method:"POST",headers:{"Content-Type":"application/json",}}).then(response=>response.json()).then(data=>{if(!data.success){const errorMessage=document.querySelector(".error-message");errorMessage.textContent=data.errorMessage;errorMessage.style.display="block";}else{loader.showLoader();location.reload();}}).catch(error=>console.error("Error:",error));}catch(error){console.log("An error occurred. Please try again later.",error);}});emailInput?.addEventListener('input',()=>validation.validateEmail(emailInput,errorEmail));const handleSubmitNewPassword=(e)=>{e.preventDefault();validation.setHasSubmittedFirstStep(true);const isPasswordValid=validation.validatePassword(passwordInput,errorPassword);const isConfirmPasswordValid=validation.validateConfirmPassword(passwordInput,confirmPassword,errorConfirmPassword);if(isPasswordValid&&isConfirmPasswordValid){loader.showLoader();newPasswordForm.submit();}};submitNewPasswordBtn?.addEventListener('click',handleSubmitNewPassword);passwordInput?.addEventListener('input',()=>validation.validatePassword(passwordInput,errorPassword));confirmPassword?.addEventListener('input',()=>validation.clearError(errorConfirmPassword,confirmPassword));});(()=>{const dateInput=document.getElementById("dateInput");const today=new Date();const formattedToday=today.toISOString().split("T")[0];dateInput?.setAttribute("min",formattedToday);})();const helpers=(()=>{const body=document.querySelector('body');let topScroll=0;let isScrollDisabled=false;const disabledScrollClass='scroll-disabled';const disableScroll=()=>{if(!isScrollDisabled){topScroll=document.documentElement.scrollTop;body.style.top=`-${topScroll}px`;body.classList.add(disabledScrollClass);isScrollDisabled=true;}};const enableScroll=()=>{body.removeAttribute('style');body.classList.remove(disabledScrollClass);window.scrollTo({top:topScroll,behavior:"instant"});isScrollDisabled=false;};const disableForm=(form)=>{const formElements=Array.from(form.elements);formElements.forEach(element=>{element.disabled=true;});};const debounce=(func,interval)=>{let timeout;return function(){const _this=this;const args=arguments;const later=function(){timeout=null;func.apply(_this,args);};clearTimeout(timeout);timeout=setTimeout(later,interval||100);};};return{disableScroll,enableScroll,disableForm,debounce};})();document.addEventListener("DOMContentLoaded",()=>{iccApplicationFormStepOne();showUploadFileField();handleUpdateHiddenInputValue();handleNextButton();});const toggleErrorClass=(element,isValid)=>{const errorMessageActiveClass="error-message--active";if(!element)return;if(!element.value){element.classList.remove(errorMessageActiveClass);} if(isValid){element.classList.remove(errorMessageActiveClass);}else{element.previousElementSibling?.classList.add(errorMessageActiveClass) element.classList.add(errorMessageActiveClass);}};function parseDOB(date){const monthMap={january:1,february:2,march:3,april:4,may:5,june:6,july:7,august:8,september:9,october:10,november:11,december:12,};const parts=date.trim().toLowerCase().split(' ').filter(Boolean);const day=parseInt(parts[0].replace(/\D/g,''));const month=monthMap[parts[1]];const year=parseInt(parts[2]);return{day,month,year};} function validateAge(day,month,year){const errorEl=document.querySelector(".js-error-check-age");const isNotValid=validation.checkAge(day,month,year,16);toggleErrorClass(errorEl,!isNotValid);return isNotValid;} function iccApplicationFormStepOne(){const submitBtn=document.querySelector('.js-icc-next-btn');const iccForm=document.querySelector('.js-icc-app-form');const termsCheckbox=document.querySelector('.js-check-terms');const errorCheckTerms=document.querySelector('.js-error-check-terms');const checkboxShowDual=document.querySelector('.js-checkbox-dual-nationality');const dualNationalityDropdownHolder=document.querySelector('.js-dual-nationality-dropdown-holder');const dualNationalityDropdown=document.querySelector('.js-dropdown-input-hidden');const dualNationalityDropdownActive='form-group--hidden-active';const showDualNationalityDropdown=()=>{checkboxShowDual?.addEventListener('change',(e)=>{const isChecked=e.target.checked;if(isChecked){dualNationalityDropdownHolder.classList.add(dualNationalityDropdownActive);}else{dualNationalityDropdownHolder.classList.remove(dualNationalityDropdownActive);}})} showDualNationalityDropdown();const handleIccFormSubmit=(e)=>{e.preventDefault();const areDropdownsValid=validation.validateDropdownFields();const isTermsValid=validation.validateTerms(termsCheckbox,errorCheckTerms);const isDualNationalityValid=validation.validateHiddenDropdown(checkboxShowDual,dualNationalityDropdown);let isNotUnder16=false;const date=document.querySelector(".js-personal-dob");if(date){const{day,month,year}=parseDOB(date.textContent);isNotUnder16=validateAge(day,month,year);} if(isNotUnder16)return if(areDropdownsValid&&isTermsValid&&isDualNationalityValid&&!isNotUnder16){loader.showLoader();iccForm.submit();}};submitBtn?.addEventListener('click',handleIccFormSubmit);};function showUploadFileField(){const checkboxesUpload=document.querySelectorAll('.js-checkbox-upload');const uploadFormGroupActive='form-group--upload-active' checkboxesUpload.forEach((checkbox)=>{checkbox.addEventListener('change',(e)=>{const parentLi=e.target.closest('li');const nextUploadField=parentLi.nextElementSibling;if(nextUploadField&&nextUploadField.classList.contains('js-input-upload')){if(e.target.checked){nextUploadField.classList.add(uploadFormGroupActive);}else{nextUploadField.classList.remove(uploadFormGroupActive);}} validateUploadedFiles();});});} function handleUpdateHiddenInputValue(){const uploadInputs=document.querySelectorAll('.js-upload-file');uploadInputs.forEach(input=>{const errorEl=input.parentElement.querySelector(".js-large-file-error");input.addEventListener('change',(e)=>{const{hiddenInput,checkbox,isCheckboxChecked,isFileAdded}=getElementsAndStates(e.target);const byteSize=e.target?.files[0]?.size const toMB=byteSize/1024/1024 const fileTooLarge=toMB&&toMB>10 toggleErrorClass(errorEl,!fileTooLarge);if(isCheckboxChecked&&isFileAdded){hiddenInput.value=checkbox.value;}else{hiddenInput.value='';} validateUploadedFiles();})})} function validateUploadedFiles(){const uploadInputs=document.querySelectorAll('.js-upload-file');const nextButton=document.querySelector('.js-icc-next-button');const errorElements=document.querySelectorAll(".js-large-file-error");const errorMessageActiveClass="error-message--active";const dataAdded=[...uploadInputs].every((input)=>{const{isCheckboxChecked,isFileAdded}=getElementsAndStates(input);return!(isCheckboxChecked&&!isFileAdded);});const wrongFileSize=[...errorElements].every((input)=>!input.classList.contains(errorMessageActiveClass));nextButton.disabled=!dataAdded||!wrongFileSize;return!dataAdded||!wrongFileSize} function handleNextButton(){const nextButton=document.querySelector('.js-icc-next-button');if(!nextButton)return;const handleClick=(e)=>{const wrongFileSize=validateUploadedFiles();if(wrongFileSize){e.preventDefault();}else{loader.showLoader();nextButton.removeEventListener('click',handleClick);nextButton.click();nextButton.disabled=true;}};nextButton.addEventListener('click',handleClick);} function getElementsAndStates(input){const parent=input.closest('.js-input-upload');const previousSibling=parent.previousElementSibling;const checkbox=previousSibling.querySelector('.js-checkbox-upload');const hiddenInput=parent.querySelector('.js-uploaded-certificate');const isFileAdded=input.files.length>0;const isCheckboxChecked=checkbox.checked;return{hiddenInput,checkbox,isCheckboxChecked,isFileAdded};} function iccNonMembers(){const container=document.querySelector('.js-icc-non-member');if(!container)return;const iccNonMembersForm=document.querySelector('.js-non-members-form');const memberRadioBtnYes=document.querySelector('.js-icc-member-yes');const memberRadioBtnNo=document.querySelector('.js-icc-member-no');const textEnd=document.querySelector('.js-text-end');const submitButtons=document.querySelectorAll('.js-icc-new-next-btn');const paymentRadioHolders=document.querySelector('.js-new-payment-field');const radioGroups=document.querySelectorAll('.js-radio-group');const radioButtons=document.querySelectorAll(".js-icc-radio-non-member") const radioCardButtons=document.querySelectorAll(".js-icc-radio-card") const priceEl=document.querySelector(".js-finalise-non-member-price") const fastTrackEl=document.querySelector(".js-non-member-fast-track") const fastTrackNo=document.querySelector('#fast-track-no');const fastTrackDisabled=container.getAttribute('data-fast-track');const fastTrackOptions=!fastTrackDisabled?document.querySelectorAll('input[name="fastTrack"]'):null;const paymentRadioHoldersActiveClass='icc-new__payment-group--active';const textEndActiveClass='icc-new__text-end--inactive';const orderUrl='/umbraco/surface/finalisenonmemberpage/updateprice';let finaleOrderUrl='';let memberSelected=false;let paymentSelected=false;let fastTrackSelected=fastTrackDisabled;let allGroupsSelected=false;let params={payment:'null',membership:false,fastTrack:false};submitButtons.forEach(button=>{button.disabled=true;});textEnd?.classList.remove(textEndActiveClass);function toggleSubmitButton(){const allReady=memberSelected&&fastTrackSelected&&(memberRadioBtnNo.checked||paymentSelected);submitButtons.forEach(button=>{button.disabled=!allReady;});if(allReady){textEnd.classList.add(textEndActiveClass);}else{textEnd.classList.remove(textEndActiveClass);}} function deselectFastTrack(){fastTrackNo.checked=true;params.fastTrack=false;} memberRadioBtnYes?.addEventListener('click',()=>{memberSelected=true;paymentSelected=false;resetRadioButtons();deselectFastTrack();paymentRadioHolders.classList.add(paymentRadioHoldersActiveClass);toggleSubmitButton();fastTrackEl?.classList.add('hidden');});memberRadioBtnNo?.addEventListener('click',()=>{memberSelected=true;paymentSelected=true;resetRadioButtons();deselectFastTrack();paymentRadioHolders.classList.remove(paymentRadioHoldersActiveClass);toggleSubmitButton();fastTrackEl?.classList.remove('hidden');});const paymentOptions=paymentRadioHolders?.querySelectorAll('input[type="radio"]');paymentOptions?.forEach(option=>{option.addEventListener('click',({target})=>{paymentSelected=true;fastTrackNo.checked=true;toggleSubmitButton();if(target.value==="debit"){fastTrackEl?.classList.add('hidden');}else{fastTrackEl?.classList.remove('hidden');}});});if(!fastTrackDisabled){fastTrackOptions?.forEach(option=>{option.addEventListener('click',()=>{fastTrackSelected=true;toggleSubmitButton();});});} radioGroups.forEach(group=>{group?.addEventListener('click',(event)=>{if(event.target.matches('input[type="radio"]')){allGroupsSelected=Array.from(radioGroups).every(group=>group.querySelector('input[type="radio"]:checked'));toggleSubmitButton();}});});const resetRadioButtons=()=>{for(const btn of radioCardButtons){btn.checked=false;}} const changeUI=(orderPrice,orderLines)=>{const itemsEl=container.querySelector('.js-finalise-non-member-items');const orders=orderLines.map(({name,price})=>orderItem(name,price)).join('');priceEl.textContent=`拢${orderPrice}`;itemsEl.innerHTML=orders;};const orderItem=(orderName,price)=>{return`
${orderName} ${price}
`} const handleSubmitIccForm=()=>{submitButtons.forEach((btn)=>{btn?.addEventListener('click',(e)=>{e.preventDefault();loader.showLoader();iccNonMembersForm.submit();})})};const getOrder=async(optionType,value)=>{params[optionType]=value;finaleOrderUrl=`${orderUrl}?payment=${params.payment}&membership=${params.membership}&fastTrack=${params.fastTrack}`;try{const response=await fetch(finaleOrderUrl);const data=await response.json();return data;}catch(error){console.error('Error getting data:',error)}} const radioEvents=()=>{for(const btn of radioButtons){btn.addEventListener("change",({target})=>{const type=target.getAttribute('data-type');updateSummary(type,target.value);});}} const updateSummary=async(optionType,value)=>{try{const{orderPrice,orderLines}=await getOrder(optionType,value);changeUI(orderPrice,orderLines);}catch(error){console.error('Error updating data:',error)}} handleSubmitIccForm();radioEvents();} document.addEventListener('DOMContentLoaded',iccNonMembers);const issueA91快色=(()=>{const form=document.querySelector('.js-issue-a-certificate-form');if(!form)return;const terms=form.querySelector(".js-checkbox");const termsError=form.querySelector(".js-checkbox-error");const submitForm=()=>{form.addEventListener('submit',(e)=>{e.preventDefault();const areTermsValid=validation.validateTerms(terms,termsError,"Please tick this checkbox to proceed");if(areTermsValid){form.submit();}})} document.addEventListener('DOMContentLoaded',()=>{submitForm();});})() const loader=(()=>{const loaderElement=document.querySelector('.js-loader');const loaderActiveClass='loader--active';const showLoader=()=>{if(loaderElement){loaderElement.classList.add(loaderActiveClass);}};const hideLoader=()=>{if(loaderElement){loaderElement.classList.remove(loaderActiveClass);}};return{showLoader,hideLoader,}})();const membershipFamily=(()=>{const container=document.querySelector(".js-membership-family");if(!container)return;const loggedInUserEmail=container.getAttribute("data-logged-in-user");const genderOptions=container.getAttribute("data-gender-options");const adultContainer=document.querySelector(".js-adult-fields");const childContainer=document.querySelector(".js-children-fields");const currentAddAdult=document.querySelector(".js-current-add-adult");const currentAddChild=document.querySelector(".js-current-add-child");const addAdultButton=document.querySelector(".js-add-adult");const addChildButton=document.querySelector(".js-add-child");const form=document.querySelector(".js-membership-form");const error=document.querySelector(".js-membership-error");const submitBtn=document.querySelector(".js-family-next-btn");const promptText=document.querySelector(".js-family-prompt-text");const titleOptionsString=container.getAttribute("data-title-options");const titleOptions=titleOptionsString.split(",");titleOptions.pop();const errorMessageActiveClass="error-message--active";const inputError="form-input--error-email";const childContentCollapsed="membership-family__member-toggle--collapsed";const arrowActiveClass="membership-family__toggle-arrow--collapse";const addBtnActiveClass="membership-family__add-btn--hidden";const toggleButtonNoMarginBottom="membership-family__child-toggle--no-margin";const maxAdults=1;const maxChildren=8;const inputMaxLength=4;let adultCount=0;let childCount=0;let adultOver18=false;let childrenOver18=false;const addAdult=()=>{addAdultButton.addEventListener("click",function(){addAdultButton.classList.add(addBtnActiveClass);submitBtn.removeAttribute("disabled");promptText.classList.add("membership__prompt-hidden");if(adultCount{addChildButton.addEventListener("click",function(){submitBtn.removeAttribute("disabled");promptText.classList.add("membership__prompt-hidden");if(childCount===maxChildren-1){addChildButton.classList.add(addBtnActiveClass);} if(childCount{document.addEventListener("click",function({target}){if(!target.classList.contains("js-remove-adult"))return;addAdultButton.classList.remove(addBtnActiveClass);target.closest(".js-adult-member").remove();adultCount--;updateCountAndButton();updateMemberIndexes();const emailList=document.querySelectorAll(".js-email-register");if(!emailList.length){submitBtn.setAttribute("disabled","disabled");promptText.classList.remove("membership__prompt-hidden");}});document.addEventListener("click",function({target}){if(!target.classList.contains("js-remove-child"))return;addChildButton.classList.remove(addBtnActiveClass);target.closest(".js-child-member").remove();childCount--;updateCountAndButton();updateChildLabels();updateMemberIndexes();const emailList=document.querySelectorAll(".js-email-register");if(!emailList.length){submitBtn.setAttribute("disabled","disabled");promptText.classList.remove("membership__prompt-hidden");}});};const generateMemberHTML=(type,index,offset=0)=>{const isAdult=type==="Adult";const memberIndex=isAdult?index:offset+index;const ageErrorMessage=isAdult?"Adult age must be over 18 years of age":"Children must be under 18 years of age";const emailRequired='data-email-required="true"';const emailLabelMandatory="*";return`
${ !isAdult ? ` ` : "" } ${ isAdult ? "" : '
' }
    • ${generateDateSelectHTML(memberIndex)}

    ${ageErrorMessage}

    The year must be 1920 or later

    Birth date cannot be in the future

  • Each family member email must be unique

    Each family member email must be unique

${isAdult ? "" : "
"}
`;};const bindDateChangeEvents=(index)=>{const container=document.querySelectorAll(".js-membership-dob")[index];const dayInput=container.querySelector(".js-day");const monthInput=container.querySelector(".js-month");const yearInput=container.querySelector(".js-year");const hiddenInput=container.querySelector(".js-date-of-birth");[dayInput,monthInput,yearInput].forEach((input)=>{input.addEventListener("change",()=>{const day=dayInput.value.padStart(2,"0");const month=monthInput.value.padStart(2,"0");const year=yearInput.value;if(day&&month&&year){hiddenInput.value=`${year}-${month}-${day}`;}});});};function generateDateSelectHTML(memberIndex){const days=Array.from({length:31},(_,i)=>``).join("");const monthsArr=["January","February","March","April","May","June","July","August","September","October","November","December",];const months=monthsArr.map((month,index)=>``).join("");return`
  • This field is required

  • This field is required

  • This field is required

  • `;} const setupChildContentToggle=()=>{document.addEventListener("click",({target})=>{if(!target.classList.contains("js-child-toggle"))return;const childHolder=target.closest(".js-child-holder");if(!childHolder)return;const childContent=childHolder.querySelector(".js-child-content-toggle");const toggleArrow=target.querySelector(".js-toggle-arrow");if(childContent){childContent.classList.toggle(childContentCollapsed);toggleArrow.classList.toggle(arrowActiveClass);target.classList.toggle(toggleButtonNoMarginBottom);}});};const updateCountAndButton=()=>{currentAddAdult.textContent=adultCount;currentAddChild.textContent=childCount;addAdultButton.disabled=adultCount>=maxAdults;addChildButton.disabled=childCount>=maxChildren;};const updateChildLabels=()=>{const children=document.querySelectorAll(".js-child-member");children.forEach((child,index)=>{child.querySelector(".js-child-text").textContent=`Child ${ index + 1 }`;child.querySelector(".js-remove-child").textContent=`Remove Child ${index + 1}`;});};const attachEvents=()=>{document.addEventListener("change",(e)=>{if(!e.target.classList.contains("js-month"))return;const day31=e.target.closest(".js-date-parent").querySelector('option[value="31"]');const day30=e.target.closest(".js-date-parent").querySelector('option[value="30"]');const day29=e.target.closest(".js-date-parent").querySelector('option[value="29"]');validation.handleMonthInput(e,day31,day30,day29);});document.addEventListener("input",(e)=>{if(!e.target.classList.contains("js-year"))return;if(e.target.value.length>inputMaxLength){e.target.value=e.target.value.slice(0,inputMaxLength);} validation.handleYearInput(e.target);});};const toggleErrorClass=(element,isValid)=>{if(!element)return;if(!element.value){element.classList.remove(errorMessageActiveClass);} if(isValid){element.classList.remove(errorMessageActiveClass);}else{element.classList.add(errorMessageActiveClass);}};const validateEmails=(emailList,emailErrorList)=>{return[...emailList].every((email,i)=>{const isEmailRequired=email.getAttribute("data-email-required");return validation.validateReferEmail(email,emailErrorList[i],isEmailRequired);});};const validateYears=(DOB)=>{return[...DOB].map((dob)=>{const input=dob.querySelector(".js-year");const error=input.closest(".js-family-member").querySelector(".js-error-year-validation");return validation.handleYearValidation(input,error);}).every(Boolean);};const validateDatesInFuture=(DOB)=>{const datesInFuture=[...DOB].map((dob)=>{const input=dob.querySelector(".js-year");const errorFuture=input.closest(".js-family-member").querySelector(".js-error-year-in-future");const dayInput=dob.querySelector(".js-day");const monthInput=dob.querySelector(".js-month");const yearInput=dob.querySelector(".js-year");const errorDay=dob.querySelector(".js-error-day");const errorMonth=dob.querySelector(".js-error-month");const errorYear=dob.querySelector(".js-error-year");return validation.validateFutureDateOfBirth(dayInput,monthInput,yearInput,errorFuture,errorDay,errorMonth,errorYear);}).every(Boolean);if(!datesInFuture)return datesInFuture;const adult=document.querySelector(".js-adult-member");const children=document.querySelectorAll(".js-child-member");adultOver18=adult?validateAdultAge(adult):true;childrenOver18=children.length?validateChildrenAge(children):false;return datesInFuture;};const validateDOB=(DOB)=>{return[...DOB].map((item)=>{const dayInput=item.querySelector(".js-day");const monthInput=item.querySelector(".js-month");const yearInput=item.querySelector(".js-year");const errorDay=item.querySelector(".js-error-day");const errorMonth=item.querySelector(".js-error-month");const errorYear=item.querySelector(".js-error-year");return validation.validateDateOfBirthMembership(dayInput,monthInput,yearInput,errorDay,errorMonth,errorYear);}).every(Boolean);};const validateAdultAge=(adult)=>{const adultDayEl=adult.querySelector(".js-day");const adultMonthEl=adult.querySelector(".js-month");const adultYearEl=adult.querySelector(".js-year");if(!adultDayEl.value||!adultMonthEl.value||!adultYearEl.value) return;const adultErrorEl=adult.querySelector(".js-error-check-age");const isAdultValid=validation.checkAge(parseInt(adultDayEl.value),parseInt(adultMonthEl.value),parseInt(adultYearEl.value),18);toggleErrorClass(adultErrorEl,isAdultValid);return isAdultValid;};const validateChildrenAge=(children)=>{return[...children].some((child)=>{const childDayEl=child.querySelector(".js-day");const childMonthEl=child.querySelector(".js-month");const childYearEl=child.querySelector(".js-year");if(!childDayEl.value||!childMonthEl.value||!childYearEl.value) return;const childErrorEl=child.querySelector(".js-error-check-age");const isChildValid=validation.checkAge(parseInt(childDayEl.value,10),parseInt(childMonthEl.value,10),parseInt(childYearEl.value,10),17);toggleErrorClass(childErrorEl,isChildValid);return!isChildValid;});};const checkMemberEmail=(emailList)=>{return[...emailList].some((email)=>{const sameAsLoggedInUser=email.value===loggedInUserEmail;toggleErrorClass(email.parentElement.nextElementSibling?.querySelector(".js-error-logged-user"),!sameAsLoggedInUser);if(sameAsLoggedInUser){email.classList.add(inputError);}else{email.classList.remove(inputError);} return sameAsLoggedInUser;});};const toggleErrorMemberEmail=(emailList)=>{[...emailList].forEach((email)=>{const sameAsLoggedInUser=email.value===loggedInUserEmail;if(sameAsLoggedInUser){email.classList.add(inputError);}else{email.classList.remove(inputError);}});};const checkUniqueEmails=(emailList)=>{const emailValues=[...emailList].map((email)=>email.value);return[...emailList].filter((email,index)=>{if(!email.value)return false;const isUnique=emailValues.indexOf(email.value)===index&&emailValues.lastIndexOf(email.value)===index;toggleErrorClass(email.parentElement.nextElementSibling?.querySelector(".js-error-unique-email"),isUnique);if(!isUnique){email.classList.add(inputError);}else{email.classList.remove(inputError);} return!isUnique;});};const validateEmailList=(emailList)=>{if(!emailList.length){error.classList.add(errorMessageActiveClass);return false;} error.classList.remove(errorMessageActiveClass);return true;};const resetErrorMessages=()=>{const errors=document.querySelectorAll(".js-error-check-age, .js-error-year-validation, .js-error-year-in-future");for(const error of errors){error.classList.remove(errorMessageActiveClass);}};const handleSubmit=()=>{form.addEventListener("submit",(e)=>{e.preventDefault();resetErrorMessages();let containsMemberEmail=false;const emailList=document.querySelectorAll(".js-email-register");const emailListValid=validateEmailList(emailList);if(!emailListValid)return;const emailErrorList=document.querySelectorAll(".js-error-message-email");const DOB=document.querySelectorAll(".js-membership-dob");const areRequiredFieldsValid=validation.validateGenericRequiredFields();const areEmailsValid=validateEmails(emailList,emailErrorList);const uniqueEmails=checkUniqueEmails(emailList);if(uniqueEmails.length===0){containsMemberEmail=checkMemberEmail(emailList);} const areDOBValid=validateDOB(DOB);const areYearsValid=validateYears(DOB);const areDatesInFuture=validateDatesInFuture(DOB);toggleErrorMemberEmail(emailList);if(areRequiredFieldsValid&&areEmailsValid&&areDOBValid&&areYearsValid&&areDatesInFuture&&adultOver18&&!childrenOver18&&!containsMemberEmail&&uniqueEmails.length===0){form.submit();}});};const updateMemberIndexes=()=>{const adult=document.querySelectorAll(".js-adult-member");const children=document.querySelectorAll(".js-child-member");const totalMembers=[...adult,...children];totalMembers.forEach((member,index)=>{reindexingMemberFormFields(member,index);});};const reindexingMemberFormFields=(member,index)=>{const labels=member.querySelectorAll(".js-form-label");const inputs=member.querySelectorAll(".js-form-input");const dateInputs=member.querySelectorAll(".js-date-parent input");const dateSelects=member.querySelectorAll(".js-date-parent select");labels.forEach((label)=>updateLabelForAttribute(label,index));[...dateInputs,...inputs,...dateSelects].forEach((input)=>updateInputNameAndId(input,index));};const updateLabelForAttribute=(label,index)=>{const currentFor=label.getAttribute("for");const updatedFor=currentFor.replace(/\d+$/,index);label.setAttribute("for",updatedFor);};const updateInputNameAndId=(input,index)=>{const isInputHidden=input.type==="hidden";const currentName=input.getAttribute("name");const currentId=input.getAttribute("id");if(currentName){const updatedName=isInputHidden?currentName.replace(/\d+$/,index):currentName.replace(/\[\d+\]/,`[${index}]`);input.setAttribute("name",updatedName);} if(currentId){const updatedId=currentId.replace(/\d+$/,index);input.setAttribute("id",updatedId);}};document.addEventListener("DOMContentLoaded",()=>{addAdult();addChild();removeMember();attachEvents();setupChildContentToggle();handleSubmit();});})();const handleFormSubmission=(formSelector,submitBtnSelector)=>{const form=document.querySelector(formSelector);const submitBtn=document.querySelector(submitBtnSelector);const accountNumberInput=document.querySelector('.js-society-acc-num');const errorAccountNumber=document.querySelector('.js-error-society-acc-num');const sortCodeInput=document.querySelector('.js-branch-sort-code');const errorSortCode=document.querySelector('.js-error-sort-code');const handleSubmit=async(e)=>{e.preventDefault();const areRequiredFieldsValid=validation.validateGenericRequiredFields();const isAccountNumberValid=validation.validateBankAccountNumber(accountNumberInput,errorAccountNumber);const isSortCodeValid=validation.validateBranchSortCode(sortCodeInput,errorSortCode);if(areRequiredFieldsValid&&isAccountNumberValid&&isSortCodeValid){loader.showLoader();form.submit();}};submitBtn?.addEventListener('click',handleSubmit);};const addLoaderOnFormSubmit=(formSelector)=>{const form=document.querySelector(formSelector);form?.addEventListener('submit',()=>{loader.showLoader();});};document.addEventListener("DOMContentLoaded",()=>{handleFormSubmission('.js-membership-joining-form','.js-joining-submit',);addLoaderOnFormSubmit('.js-membership-payment');addLoaderOnFormSubmit('.js-icc-confirm-payment');handleFormSubmission('.js-icc-payment-form','.js-icc-payment-submit',);});document.addEventListener("DOMContentLoaded",()=>{const form=document.querySelector('.js-personal-detail form');const title=document.querySelector('.js-personal-title');const name=document.querySelector('.js-personal-name');const surname=document.querySelector('.js-personal-surname');const email=document.querySelector('.js-personal-email');const telephone=document.querySelector('.js-personal-telephone');const altTelephone=document.querySelector('.js-personal-alt-telephone');const errorTelephone=document.querySelector('.js-error-personal-telephone');const gender=document.querySelector('.js-personal-gender');const dob=document.querySelector('.js-personal-dob');const parental=document.querySelector('.js-personal-parental');const date=document.querySelector('.js-personal-date');const errorMessage=document.querySelector('.js-error-msg');if(telephone){telephone.addEventListener('input',({target})=>{target.value=target.value.replace(/[^0-9+]/g,'').replace(/(?!^)\+/g,'');validation.validateTelephone(target,errorTelephone)})} if(form&&telephone){form.addEventListener('submit',(e)=>{validation.validateTelephone(telephone,errorTelephone) if(errorTelephone.classList.contains("error-message--active")){e.preventDefault();return}})} const fetchPersonalData=()=>{fetch(`/api`).then(response=>{if(!response.ok){throw new Error('Failed to fetch personal data');} return response.json();}).then(data=>{if(data&&data.value){title.textContent=data.value.title||'N/A';name.textContent=data.value.firstName||'N/A';surname.textContent=data.value.surname||'N/A';email.textContent=data.value.email||'N/A';telephone.textContent=data.value.phone||'N/A';altTelephone.textContent=data.value.phone2||'N/A';gender.textContent=data.value.gender||'N/A';dob.textContent=data.value.dateOfBirth||'N/A';parental.textContent=data.value.parental||'N/A';date.textContent=data.value.on||'N/A';}else{throw new Error('No personal data found');}}).catch(error=>{console.error('Error fetching personal data:',error);errorMessage.textContent=`Error fetching personal data: ${error.message}`;});};});const popup=(()=>{const container=document.querySelector('.js-certificate-popup');if(!container)return;const openPopupClass="js-open-popup";const closePopupClass="js-popup-close";const popupActiveClass="popup--active";function showPopup(popup){popup.classList.add(popupActiveClass);helpers.disableScroll();} function hidePopup(popup){helpers.enableScroll();popup.classList.remove(popupActiveClass);} document.addEventListener('click',({target})=>{if(!target.classList.contains(openPopupClass))return const popup=target.closest('.js-popup-parent').querySelector('.js-popup');showPopup(popup);}) document.addEventListener('click',({target})=>{if(!target.classList.contains(closePopupClass))return const popup=target.closest('.js-popup');hidePopup(popup);})})() document.addEventListener("DOMContentLoaded",function(){const toggleButton=document.getElementById("toggleFormButton");const formContainer=document.getElementById("dropdown");const form=document.querySelector('.js-refer-a-friend form');const referNameInput=document.querySelector('.js-refer-name');const errorReferName=document.querySelector('.js-error-refer-name');const emailInput=document.querySelector('.js-refer-email');const errorEmail=document.querySelector('.js-error-refer-email');const dropdownInput=document.querySelector('.js-refer-dropdown');const dropdownActive='refer-friend__dropdown--active';const optionInputClass='js-refer-option';if(formContainer){toggleButton?.addEventListener("click",function(){if(formContainer.classList.contains("active")){formContainer.style.maxHeight=formContainer.scrollHeight+"px";requestAnimationFrame(()=>{formContainer.style.maxHeight="0";formContainer.classList.remove("active");});}else{formContainer.classList.add("active");formContainer.style.maxHeight="none";const scrollHeight=formContainer.scrollHeight;formContainer.style.maxHeight="0";requestAnimationFrame(()=>{formContainer.style.maxHeight=scrollHeight+"px";});}});formContainer?.addEventListener("transitionend",function(){if(formContainer.classList.contains("active")){formContainer.style.maxHeight="none";}else{formContainer.style.maxHeight="0";}});} if(form){const handleDropdown=({target})=>{if(target.parentElement.classList.contains(dropdownActive)){target.parentElement.classList.remove(dropdownActive) return} target.parentElement.classList.add(dropdownActive)} form.addEventListener('submit',(e)=>{const isNameValid=validation.validateRequiredField(referNameInput,errorReferName);const isEmailValid=validation.validateReferEmail(emailInput,errorEmail);const isDropdownsValid=validation.validateDropdownFields();if(isNameValid&&isEmailValid&&isDropdownsValid)return e.preventDefault();}) referNameInput?.addEventListener('input',({target})=>{validation.validateRequiredField(target,errorReferName)}) emailInput?.addEventListener('input',({target})=>{validation.validateReferEmail(target,errorEmail)}) dropdownInput?.addEventListener('click',handleDropdown) dropdownInput?.addEventListener('blur',({target})=>{target.parentElement.classList.remove(dropdownActive)})}});document.addEventListener("DOMContentLoaded",()=>{const elements={addStudentForm:document.querySelector(".js-add-student-form"),addStudentBtn:document.querySelector(".js-add-student-btn"),checkEmailForm:document.querySelector(".js-register-check"),submitNext:document.querySelector(".js-submit-next"),registerForm:document.querySelector(".js-register-user"),submitRegistration:document.querySelector(".js-submit-registration"),dayInput:document.querySelector(".js-day"),errorDay:document.querySelector(".js-error-day"),errorFuture:document.querySelector(".js-error-future"),monthInput:document.querySelector(".js-month"),errorMonth:document.querySelector(".js-error-month"),yearInput:document.querySelector(".js-year"),errorYear:document.querySelector(".js-error-year"),parentalConsentDiv:document.querySelector(".js-under-thirteen"),emailInput:document.querySelector(".js-email-register"),errorEmail:document.querySelector(".js-error-message-email"),passwordInput:document.querySelector(".js-password-register"),errorPassword:document.querySelector(".js-error-message-password"),confirmPassword:document.querySelector(".js-password-confirm"),errorConfirmPassword:document.querySelector(".js-error-confirm-password"),termsCheckbox:document.querySelector(".js-check-terms"),errorCheckTerms:document.querySelector(".js-error-check-terms"),firstNameInput:document.querySelector(".js-first-name"),errorFirstName:document.querySelector(".js-error-first-name"),surnameInput:document.querySelector(".js-surname"),errorSurname:document.querySelector(".js-error-surname"),telephoneInput:document.querySelector(".js-telephone"),errorTelephone:document.querySelector(".js-error-telephone"),addressInput:document.querySelector(".js-address1-input"),errorAddress:document.querySelector(".js-error-address1"),townInput:document.querySelector(".js-town-input"),errorTown:document.querySelector(".js-error-town"),postcodeInput:document.querySelector(".js-postcode-input"),errorPostcode:document.querySelector(".js-error-postcode"),countryInput:document.querySelector(".js-country-input"),errorCountry:document.querySelector(".js-error-country"),parentName:document.querySelector(".js-parent-name"),errorParentName:document.querySelector(".js-error-parent-name"),parentCheckbox:document.querySelector(".js-parent-checkbox"),errorParentCheckbox:document.querySelector(".js-error-parent-checkbox"),loginForm:document.querySelector(".js-login-form"),loginSubmitBtn:document.querySelector(".js-login-submit-btn"),dateErrorEl:document.querySelector('.js-error-year-validation'),};const cssClasses={inputErrorBorder:"form-input--error",parentalConsentDivActive:"under-thirteen--active",errorMessageActiveClass:"error-message--active",};let isUnder13=false;const requiredFields=[{input:elements.firstNameInput,error:elements.errorFirstName},{input:elements.surnameInput,error:elements.errorSurname},{input:elements.telephoneInput,error:elements.errorTelephone},{input:elements.addressInput,error:elements.errorAddress},{input:elements.townInput,error:elements.errorTown},{input:elements.postcodeInput,error:elements.errorPostcode},{input:elements.countryInput,error:elements.errorCountry},];const day31=elements.dayInput?.querySelector('option[value="31"]');const day30=elements.dayInput?.querySelector('option[value="30"]');const day29=elements.dayInput?.querySelector('option[value="29"]');const validateRequiredFields=()=>{let allValid=true;requiredFields.forEach((field)=>{if(!validation.validateRequiredField(field.input,field.error)){allValid=false;}});return allValid;};const enforceMaxLength=(input,maxLength)=>{input?.addEventListener("input",function(){if(input.value.length>maxLength){input.value=input.value.slice(0,maxLength);}});};const addStudentToCourse=(e)=>{e.preventDefault();validation.setHasSubmittedFirstStep(true);const isEmailValid=validation.validateEmail(elements.emailInput,elements.errorEmail);const areRequiredFieldsValid=validation.validateGenericRequiredFields();const isDateOfBirthValid=validation.validateDateOfBirth(elements.dayInput,elements.monthInput,elements.yearInput,elements.errorDay,elements.errorMonth,elements.errorYear);const areParentFieldsValid=validation.validateParentFields(elements.parentName,elements.errorParentName,elements.parentCheckbox,elements.errorParentCheckbox);if(isEmailValid&&areParentFieldsValid&&isDateOfBirthValid&&areRequiredFieldsValid){loader.showLoader();elements.addStudentForm.submit();}};elements.addStudentBtn?.addEventListener("click",addStudentToCourse);const handleSubmitFirstStep=(e)=>{e.preventDefault();validation.setHasSubmittedFirstStep(true);const isEmailValid=validation.validateEmail(elements.emailInput,elements.errorEmail);const isPasswordValid=validation.validatePassword(elements.passwordInput,elements.errorPassword);const isConfirmPasswordValid=validation.validateConfirmPassword(elements.passwordInput,elements.confirmPassword,elements.errorConfirmPassword);const isTermsValid=validation.validateTerms(elements.termsCheckbox,elements.errorCheckTerms);if(isEmailValid&&isPasswordValid&&isConfirmPasswordValid&&isTermsValid){elements.checkEmailForm.submit();loader.showLoader();}};elements.submitNext?.addEventListener("click",handleSubmitFirstStep);const handleUnder13Check=()=>{const day=parseInt(elements.dayInput.value,10);const month=parseInt(elements.monthInput.value,10)-1;const year=parseInt(elements.yearInput.value,10);const isNotAddStudetnForm=document.querySelector('.js-add-new-student');if(isNotAddStudetnForm)return;const isUnderAgeLimit=validation.checkAge(day,month,year,13);if(isUnderAgeLimit){elements.parentalConsentDiv.classList.add(cssClasses.parentalConsentDivActive);}else{elements.parentalConsentDiv.classList.remove(cssClasses.parentalConsentDivActive);}};elements.parentName?.addEventListener("input",()=>{if(elements.parentName.value.trim()!==""){validation.clearError(elements.errorParentName,elements.parentName);}else{validation.showError(elements.errorParentName,elements.parentName,"This field is required");}});elements.parentCheckbox?.addEventListener("change",()=>{if(elements.parentCheckbox.checked){validation.clearError(elements.errorParentCheckbox,elements.parentCheckbox);}else{validation.showError(elements.errorParentCheckbox,elements.parentCheckbox,"This field is required");}});elements.emailInput?.addEventListener("input",()=>validation.validateEmail(elements.emailInput,elements.errorEmail));elements.passwordInput?.addEventListener("input",()=>validation.validatePassword(elements.passwordInput,elements.errorPassword));elements.confirmPassword?.addEventListener("input",()=>validation.clearError(elements.errorConfirmPassword,elements.confirmPassword));elements.termsCheckbox?.addEventListener("change",()=>validation.clearError(elements.errorCheckTerms,elements.termsCheckbox));const togglePasswordVisibility=(input)=>{input.type=input.type==="password"?"text":"password";};const showPasswordFunction=()=>{const showPasswordBtn=document.querySelectorAll(".js-show-password");showPasswordBtn.forEach((button)=>{button.addEventListener("click",(e)=>{const input=e.target.parentElement.querySelector(".form-input");togglePasswordVisibility(input);e.target.textContent=input.type==="password"?"Show":"Hide";});});};showPasswordFunction();enforceMaxLength(elements.yearInput,4);elements.yearInput?.addEventListener("input",({target})=>{const invalidDate=validateFutureDate();if(!invalidDate)return handleUnder13Check();validation.handleYearInput(target);});elements.monthInput?.addEventListener("change",(e)=>{const invalidDate=validateFutureDate();if(!invalidDate)return handleUnder13Check();validation.handleMonthInput(e,day31,day30,day29)});elements.dayInput?.addEventListener("change",()=>{const invalidDate=validateFutureDate();if(!invalidDate)return handleUnder13Check();});elements.yearInput?.addEventListener("blur",({target})=>{const invalidDate=validateFutureDate();if(!invalidDate)return validation.handleYearValidation(target,elements.dateErrorEl) handleUnder13Check();});const handleSubmitSecondStep=(e)=>{e.preventDefault();validation.setHasSubmittedFirstStep(true);const isDateOfBirthValid=validation.validateDateOfBirth(elements.dayInput,elements.monthInput,elements.yearInput,elements.errorDay,elements.errorMonth,elements.errorYear);const areRequiredFieldsValid=validateRequiredFields();const areParentFieldsValid=validation.validateParentFields(elements.parentName,elements.errorParentName,elements.parentCheckbox,elements.errorParentCheckbox,isUnder13);const invalidDate=validateFutureDate();const isTelephoneValid=validation.validateTelephone(elements.telephoneInput,elements.errorTelephone) const isYearValid=!elements.dateErrorEl.classList.contains(cssClasses.errorMessageActiveClass) if(isDateOfBirthValid&&areRequiredFieldsValid&&areParentFieldsValid&&isYearValid&&isTelephoneValid&&invalidDate){loader.showLoader();elements.registerForm.submit();}};const validateFutureDate=()=>{const validDate=validation.validateFutureDateOfBirth(elements.dayInput,elements.monthInput,elements.yearInput,elements.errorFuture,elements.errorDay,elements.errorMonth,elements.errorYear) if(validDate){elements.dayInput.classList.remove(cssClasses.inputErrorBorder) elements.monthInput.classList.remove(cssClasses.inputErrorBorder) elements.yearInput.classList.remove(cssClasses.inputErrorBorder)} if(!validDate){elements.parentalConsentDiv.classList.remove(cssClasses.parentalConsentDivActive);} return validDate} elements.submitRegistration?.addEventListener("click",handleSubmitSecondStep);requiredFields?.forEach((field)=>{field.input?.addEventListener("input",()=>{if(field.input.value.trim()===""){validation.showError(field.error,field.input,"This field is required");}else{validation.clearError(field.error,field.input);}});});elements.telephoneInput?.addEventListener('input',({target})=>{target.value=target.value.replace(/[^0-9+]/g,'').replace(/(?!^)\+/g,'');validation.validateTelephone(target,elements.errorTelephone)});[elements.dayInput,elements.monthInput,elements.yearInput].forEach((element)=>{element?.addEventListener("input",()=>validation.validateDateOfBirth(elements.dayInput,elements.monthInput,elements.yearInput,elements.errorDay,elements.errorMonth,elements.errorYear));element?.addEventListener("blur",()=>validation.validateDateOfBirth(elements.dayInput,elements.monthInput,elements.yearInput,elements.errorDay,elements.errorMonth,elements.errorYear));});const handleLoginForm=(e)=>{e.preventDefault();validation.setHasSubmittedFirstStep(true);const isEmailValid=validation.validateEmail(elements.emailInput,elements.errorEmail);const isPasswordValid=validation.validatePassword(elements.passwordInput,elements.errorPassword);if(isEmailValid&&isPasswordValid){loader.showLoader();elements.loginForm.submit();}} elements.loginSubmitBtn?.addEventListener("click",handleLoginForm);const validatePostcode=()=>{if(!elements.postcodeInput)return elements.postcodeInput.addEventListener("input",({target})=>{if(target.value===''&&!target.required)return;target.value=validation.postCodeRegex(target.value);})} validatePostcode()});((g)=>{var h,a,k,p="The Google Maps JavaScript API",c="google",l="importLibrary",q="__ib__",m=document,b=window;b=b[c]||(b[c]={});var d=b.maps||(b.maps={}),r=new Set(),e=new URLSearchParams(),u=()=>h||(h=new Promise(async(f,n)=>{await(a=m.createElement("script"));e.set("libraries",[...r]+"");for(k in g) e.set(k.replace(/[A-Z]/g,(t)=>"_"+t[0].toLowerCase()),g[k]);e.set("callback",c+".maps."+q);a.src=`https://maps.${c}apis.com/maps/api/js?`+e;d[q]=f;a.onerror=()=>(h=n(Error(p+" could not load.")));a.nonce=m.querySelector("script[nonce]")?.nonce||"";m.head.append(a);}));d[l]?console.warn(p+" only loads once. Ignoring:",g):(d[l]=(f,...n)=>r.add(f)&&u().then(()=>d[l](f,...n)));})({key:"AIzaSyBI5bwkwEDZI2AMHzpWrfXsZq9PJmbMvhA",});const observer=new IntersectionObserver((entries)=>{entries.map(entry=>{if(entry.isIntersecting){entry.target.classList.add("decorate")}})},{rootMargin:"-300px"}) document.querySelectorAll(".courseTile").forEach(element=>observer.observe(element)) document.querySelectorAll(".person").forEach(element=>observer.observe(element)) document.querySelectorAll(".blockquote").forEach(element=>observer.observe(element)) function setupSearchListener(){const searchInput=document.querySelector('.js-shop-search-input');const showSearchKeyword=document.querySelector('.js-show-keyword');const filterForm=document.querySelector("#filterForm");const searchBtn=document.querySelector('.js-search-input-btn');const params=new URLSearchParams(window.location.search);const searchQuery=params.get('query');const filterParams=params.getAll('filters');const filtered=true;if(searchQuery){searchInput.value=searchQuery;showSearchKeyword.textContent=`"${searchQuery}"`;updateSearchResultsDisplay(filtered);} const handleSearchSubmit=()=>{const query=searchInput.value.trim();if(query&&filterParams){params.delete('filters');filterForm?.querySelectorAll("input[type=checkbox]").forEach((el)=>(el.checked=false));} query?params.set('query',query):params.delete('query');window.location.search=params.toString();showSearchKeyword.textContent=query?`"${query.replaceAll('_', ' ')}"`:"products";updateSearchResultsDisplay(filtered);};searchBtn?.addEventListener('click',function(e){e.preventDefault();handleSearchSubmit();});searchInput?.addEventListener('keypress',function(e){if(e.key==='Enter'){e.preventDefault();handleSearchSubmit();}});} function updateSearchResultsDisplay(filtered=false){let currentNum;let totalNum;let textField;const urlParams=new URLSearchParams(window.location.search);const filtersParam=urlParams.get('filters');const queryParam=urlParams.get('query');const visibleClass='search-results--visible';const textFieldKeyword=document.querySelector('.js-search-results-keyword');const textFieldNoKeyword=document.querySelector('.js-search-results-no-keyword');textField=(filtered||filtersParam||queryParam)?textFieldKeyword:textFieldNoKeyword const shopCardsContainer=document.querySelector('.js-shop-cards-container');currentNum=textField?.querySelector('.js-show-current-num')||'';totalNum=textField?.querySelector('.js-show-total-num');const showSearchKeyword=document.querySelector('.js-show-keyword');const filterForm=document.querySelector("#filterForm");if(filtered||filtersParam||queryParam){textFieldKeyword?.classList.add(visibleClass);textFieldNoKeyword?.classList.remove(visibleClass)}else{textFieldNoKeyword?.classList.add(visibleClass) textFieldKeyword?.classList.remove(visibleClass);} if(!totalNum||!showSearchKeyword){return;} if(!shopCardsContainer){totalNum.textContent=0;return} const params=new URLSearchParams(window.location.search);const searchQuery=params.get('query');const productsToShow=shopCardsContainer.getAttribute('data-showresults');const totalResults=shopCardsContainer.getAttribute('data-totalresults');if(currentNum){currentNum.textContent=productsToShow;} if(totalNum){totalNum.textContent=totalResults;} const filterValues=params.getAll('filters');if(productsToShow>=totalResults){const viewMoreBtn=document.querySelector('.js-view-more-btn') if(!viewMoreBtn)return viewMoreBtn.style.display='none';} const filterValueToLabelMap={};filterForm?.querySelectorAll("input[type=checkbox]").forEach(checkbox=>{const value=checkbox.value;const label=checkbox.getAttribute('data-label');if(value&&label){filterValueToLabelMap[value]=label;}});const filterLabels=filterValues.map(value=>filterValueToLabelMap[value]).filter(label=>label);const keywords=[];if(searchQuery){keywords.push(searchQuery);} if(filterLabels.length>0){keywords.push(...filterLabels);} showSearchKeyword.textContent=keywords.length>0?`"${keywords.join(', ').replaceAll('_', ' ')}"`:"products";showSearchKeyword.style.color=(showSearchKeyword.textContent==="products")?"#000000":"";} async function fetchProducts(productsPerPage,currentPageId,filters,query){try{const response=await fetch(`/umbraco/surface/productssurface/loadmoreproducts?query=${query}&productsPerPage=${productsPerPage}¤tPageId=${currentPageId}${filters}`);const fetchedData=await response.text() return fetchedData}catch(error){console.error('Error fetching products: ',error)}} function setupViewMoreListener(){const viewMoreBtn=document.querySelector('.js-view-more-btn');if(!viewMoreBtn)return;let isLoading=false;viewMoreBtn.addEventListener('click',async({target})=>{if(isLoading)return;try{isLoading=true;target.disabled=true;await loadMoreProducts();}catch(error){console.error('Error loading more products: ',error);}finally{isLoading=false;target.disabled=false;}});} async function loadMoreProducts(){const shopCardsContainer=document.querySelector('.js-shop-cards-container');const currentNumElements=document.querySelectorAll('.js-show-current-num');const shopCards=document.querySelector('.js-shop-cards');const landingPageSection=document.querySelector(".js-product-page");const totalResults=parseInt(shopCardsContainer.getAttribute('data-totalresults'));const currentPageId=parseInt(landingPageSection.getAttribute("data-currentpageid"));const productsToLoadEachTime=parseInt(shopCardsContainer.getAttribute('data-loadthismanymore'))||12;const params=new URLSearchParams(window.location.search);const currentProductsPerPage=parseInt(params.get('productsPerPage'))||parseInt(shopCardsContainer.getAttribute('data-showresults'))||12;const productsPerPage=currentProductsPerPage+productsToLoadEachTime;const filterParams=params.getAll('filters');const filters=filterParams.map(value=>`&filters=${value}`).join('');const query=params.get('query')||'';const products=await fetchProducts(productsPerPage,currentPageId,filters,query);productElements(products,shopCards);updateURL(params,productsPerPage,query,filterParams);updateProductCount(currentNumElements,productsPerPage,totalResults);setupViewMoreListener();if(productsPerPage>=totalResults){hideViewMoreButton();}} function productElements(productsHTML,shopCards){const tempDiv=document.createElement('div');tempDiv.innerHTML=productsHTML;const content=tempDiv.querySelector('.js-shop-cards').innerHTML;shopCards.innerHTML=content;} function updateURL(params,productsPerPage,query,filterParams){params.delete('filters');params.set('productsPerPage',productsPerPage);if(query){params.set('query',query);}else{params.delete('query');} if(filterParams.length){filterParams.forEach(value=>{params.append('filters',value);});} window.history.pushState({},'',`${location.pathname}?${params}`);} function updateProductCount(elements,productsPerPage,totalResults){if(!elements.length)return;const displayValue=Math.min(productsPerPage,totalResults);elements.forEach(el=>{el.textContent=displayValue;});} function hideViewMoreButton(){const viewMoreBtn=document.querySelector('.js-view-more-btn');if(viewMoreBtn){viewMoreBtn.style.display='none';}} function removeCardHover(){const buttons=document.querySelectorAll('.js-out-of-stock-btn');if(!buttons.length)return;for(const btn of buttons){btn.closest('.js-article').classList.add('item-card--no-hover')}} function submitRegular(){const form=document.querySelector('.js-shop-product-form');if(!form)return;const input=form.querySelector('.js-shop-product-amount');const inputMin=input.getAttribute('data-min');const inputMax=input.getAttribute('data-max');const inputItemsAdded=input.getAttribute('data-added-items');const errorAmount=form.querySelector('.js-shop-amount-error');const errorMaxAmount=form.querySelector('.js-shop-max-amount-error');const errorMessageActiveClass="error-message--active" form.addEventListener("submit",(e)=>{e.preventDefault() const inputVal=+input.value;const finalInputsAdded=parseInt(inputItemsAdded)+inputVal;if(inputVal>+inputMax||inputVal<+inputMin){errorAmount.classList.add(errorMessageActiveClass);return} if(finalInputsAdded>+inputMax){errorMaxAmount.classList.add(errorMessageActiveClass);return} errorAmount.classList.remove(errorMessageActiveClass);errorMaxAmount.classList.remove(errorMessageActiveClass);form.submit()})} function initializePage(){setupSearchListener();updateSearchResultsDisplay();setupViewMoreListener();removeCardHover();submitRegular();} document.addEventListener('DOMContentLoaded',initializePage);document.addEventListener("DOMContentLoaded",()=>{const firstThumbnail=document.querySelector('.js-thumbnail');const mainImage=document.querySelector('.js-main-image');if(firstThumbnail&&mainImage){const thumbnailSrc=firstThumbnail.querySelector('img').src;mainImage.src=thumbnailSrc;} shopProductGallery();addProductToCart();});function shopProductGallery(){const thumbnails=document.querySelectorAll('.js-thumbnail');const mainImage=document.querySelector('.js-main-image');const openMainImageBtn=document.querySelector('.js-open-main-image');const popupModal=document.querySelector('.js-product-modal');const modalImage=document.querySelector('.js-modal-image');const closeModal=document.querySelector('.js-close-modal');const popupModalActiveClass='shop-product__image-modal--active';function desktopThumbnailClickHandler(e){const clickedThumbnail=e.currentTarget;const imgElement=clickedThumbnail.querySelector('img');if(imgElement){const thumbnailSrc=imgElement.src;mainImage.src=thumbnailSrc;}} function mobileThumbnailClickHandler(e){const imgElement=e.currentTarget.querySelector('img');const imageSrc=imgElement.src;popupModal.classList.add(popupModalActiveClass);modalImage.src=imageSrc;helpers.disableScroll();} function desktopThumbnailClick(){thumbnails.forEach((thumbnail)=>{thumbnail.addEventListener('click',desktopThumbnailClickHandler);});openMainImageBtn?.addEventListener('click',()=>{const mainImageSrc=mainImage.src;popupModal.classList.add(popupModalActiveClass);modalImage.src=mainImageSrc;helpers.disableScroll();});} function mobileThumbnailClick(){thumbnails.forEach((thumbnail)=>{thumbnail.addEventListener('click',mobileThumbnailClickHandler);});} function removeDesktopListeners(){thumbnails.forEach((thumbnail)=>{thumbnail.removeEventListener('click',desktopThumbnailClickHandler);});} function removeMobileListeners(){thumbnails.forEach((thumbnail)=>{thumbnail.removeEventListener('click',mobileThumbnailClickHandler);});} closeModal?.addEventListener('click',()=>{popupModal.classList.remove(popupModalActiveClass);helpers.enableScroll();});window.addEventListener('click',(e)=>{if(e.target==popupModal){popupModal.classList.remove(popupModalActiveClass);helpers.enableScroll();}});const sliderImagesProduct=()=>{let currentSlide=0;const slides=document.querySelectorAll(".js-slide");if(!slides.length)return;const paginationDots=document.querySelector(".js-pagination");const totalSlides=slides.length;const nextButton=document.querySelector(".js-next");const prevButton=document.querySelector(".js-prev");const slidesActiveClass="shop-product__thumbnail-button--active" function createPaginationDots(){if(!paginationDots)return paginationDots.innerHTML='';for(let i=0;i{slide.classList.remove(slidesActiveClass);slide.style.transform=`translateX(${100 * (i - index)}%)`;});slides[index].classList.add(slidesActiveClass) const dots=document.querySelectorAll(".pagination-dot");dots.forEach((dot,i)=>{if(i===index){dot.classList.add("pagination-dot--active");}else{dot.classList.remove("pagination-dot--active");}});} function nextSlide(){currentSlide=(currentSlide+1)%totalSlides;showSlide(currentSlide);} function prevSlide(){currentSlide=(currentSlide-1+totalSlides)%totalSlides;showSlide(currentSlide);} function resetSlidesPosition(){slides.forEach((slide)=>{slide.style.transform='';});} function initializeSlider(){if(window.innerWidth<=1000){removeDesktopListeners();createPaginationDots();showSlide(0);nextButton?.addEventListener("click",nextSlide);prevButton?.addEventListener("click",prevSlide);mobileThumbnailClick();}else{removeMobileListeners();resetSlidesPosition();desktopThumbnailClick();}} initializeSlider();window.addEventListener("resize",function(){if(window.innerWidth<=768){removeDesktopListeners();initializeSlider();}else{removeMobileListeners();initializeSlider();}});};sliderImagesProduct();} let ebookAdded=false;let regularProductCount=0;function addProductToCart(){const addToBasketButtons=document.querySelectorAll('.js-add-to-basket');addToBasketButtons.forEach((button)=>{button.addEventListener('click',()=>{const productType=button.getAttribute('data-product-type');if(productType==='regular'){handleRegularProduct(button);}else if(productType==='ebook'){handleEbookProduct(button);}else{console.log('Unknown product type');}});});} function handleRegularProduct(button){const addToBasketBtnDisabled="shop-product__add-basket--out";if(button.classList.contains(addToBasketBtnDisabled)){return;} regularProductCount++;if(regularProductCount<=3){button.textContent=`Added to Basket (${regularProductCount})`;} if(regularProductCount===3){button.textContent='Max 3 Products Added';button.classList.add(addToBasketBtnDisabled);button.disabled=true;}} function handleEbookProduct(button){const addToBasketBtnDisabled="shop-product__add-basket--out";if(button.classList.contains(addToBasketBtnDisabled)){return;} if(!ebookAdded){ebookAdded=true;button.textContent='eBook Added to Basket';button.classList.add(addToBasketBtnDisabled);button.disabled=true;}else{button.textContent='eBook Already Added';button.classList.add(addToBasketBtnDisabled);button.disabled=true;}} const validation=(()=>{const cssClasses={inputErrorBorder:"form-input--error",parentalConsentDivActive:"under-thirteen--active",errorMessageActiveClass:"error-message--active",};const isLeap=(year)=>new Date(year,1,29).getDate()===29;const monthsWith31Days=[1,3,5,7,8,10,12];const monthsWith30Days=[4,6,9,11];const monthFebruary=2;let hasSubmittedFirstStep=false;let isUnder13=false;const setHasSubmittedFirstStep=(value)=>{hasSubmittedFirstStep=value;};const setIsUnder13=(value)=>{isUnder13=value;};const validateGenericRequiredFields=()=>{const fields=document.querySelectorAll(".js-required-field");let allValid=true;fields.forEach((field)=>{const inputElement=field.querySelector(".js-required-input");let errorElement=field.closest("li").nextElementSibling.querySelector(".js-error-message");if(!inputElement.value.trim()){showError(errorElement,inputElement,"This field is required");allValid=false;}else{clearError(errorElement,inputElement);} inputElement.addEventListener("input",()=>{if(inputElement.value.trim()){clearError(errorElement,inputElement);}else{showError(errorElement,inputElement,"This field is required");}});});return allValid;};const validateRadioButtons=(radioGroup,errorElement)=>{let isValid=false;radioGroup.forEach((radioButton)=>{if(radioButton.checked){isValid=true;} radioButton.addEventListener("change",()=>{validateRadioButtons(radioGroup,errorElement);});});if(!isValid){showError(errorElement,radioGroup[0],"This field is required");}else{clearError(errorElement,radioGroup[0]);} return isValid;};const validateDatePickerInput=(inputElement,errorElement)=>{const isFieldNotEmpty=inputElement.value!=="";if(isFieldNotEmpty){clearError(errorElement,inputElement);}else{showError(errorElement,inputElement,"This field is required");} inputElement.addEventListener("change",()=>{if(inputElement.value.trim()){clearError(errorElement,inputElement);}else{showError(errorElement,inputElement,"This field is required");}});return isFieldNotEmpty;};const validateRequiredField=(inputElement,errorElement)=>{const isFieldNotEmpty=inputElement.value.trim()!=="";if(isFieldNotEmpty){clearError(errorElement,inputElement);}else{showError(errorElement,inputElement,"This field is required");} return isFieldNotEmpty;};const validateTelephone=(el,error)=>{if(!el.value.length)return false;if(el.value.length<11){error.innerHTML=error.getAttribute("data-error");error.classList.add(cssClasses.errorMessageActiveClass);el.classList.add(cssClasses.inputErrorBorder);return false;} error.classList.remove(cssClasses.errorMessageActiveClass);el.classList.remove(cssClasses.inputErrorBorder);return true;};const validateEmail=(emailInput,errorEmail)=>{const email=emailInput.value;const validCharactersPattern=/^[a-zA-Z0-9._%+-@]*$/;const emailPattern=/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;if(hasSubmittedFirstStep){if(email.length===0){return showError(errorEmail,emailInput,"Email is required");} if(!email.match(validCharactersPattern)){return showError(errorEmail,emailInput,"Email contains invalid characters. Only letters, numbers, and ._%+-@ are allowed.");} if(!email.match(emailPattern)){return showError(errorEmail,emailInput,"Invalid email address. Email must contain a @ and .");}} return clearError(errorEmail,emailInput);};const validateReferEmail=(emailInput,errorEmail,required=true)=>{const email=emailInput.value;const validCharactersPattern=/^[a-zA-Z0-9._%+-@]*$/;const emailPattern=/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;if(email.length===0&&required){return showError(errorEmail,emailInput,"Email is required");} if(!required&&email.length===0){return clearError(errorEmail,emailInput);} if(!email.match(validCharactersPattern)){return showError(errorEmail,emailInput,"Email contains invalid characters. Only letters, numbers, and ._%+-@ are allowed.");} if(!email.match(emailPattern)){return showError(errorEmail,emailInput,"Invalid email address. Email must contain a @ and .");} return clearError(errorEmail,emailInput);};const validatePassword=(passwordInput,errorPassword)=>{const password=passwordInput.value;const passwordPattern=/^(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?]).{10,}$/;if(hasSubmittedFirstStep===true){if(!password.match(passwordPattern)){return showError(errorPassword,passwordInput,"Password does not meet requirements");}} return clearError(errorPassword,passwordInput);};const validateConfirmPassword=(passwordInput,confirmPassword,errorConfirmPassword)=>{const password=passwordInput.value;const confirmPasswordValue=confirmPassword.value;if(confirmPasswordValue!==password){return showError(errorConfirmPassword,confirmPassword,"Passwords do not match");} return clearError(errorConfirmPassword,confirmPassword);};const validateTerms=(termsCheckbox,errorCheckTerms,message)=>{const termsAccepted=termsCheckbox.checked;if(!termsAccepted){return showError(errorCheckTerms,termsCheckbox,message?message:"You must accept the Terms & Conditions");} return clearError(errorCheckTerms,termsCheckbox);};const validateYear=(yearInput,errorYear)=>{const value=parseInt(yearInput.value,10);if(isNaN(value)) return(showError(errorYear,yearInput,"Year must be a number"),false);const min=yearInput.min?Number(yearInput.min):null;if(min!==null&&valuemax) return(showError(errorYear,yearInput,`Year must be no later than ${max}`),false);clearError(errorYear,yearInput);return true;};const validateDateOfBirthCommon=(dayInput,monthInput,yearInput,errorDay,errorMonth,errorYear,requiredCheck=true)=>{const day=dayInput.value;const month=monthInput.value;const year=yearInput.value;let isValid=true;const requiredField=(error,input)=>{showError(error,input,"This field is required");isValid=false;};if(requiredCheck){if(day==="Day"||day===""){requiredField(errorDay,dayInput);}else{clearError(errorDay,dayInput);} if(month==="Month"||month===""){requiredField(errorMonth,monthInput);}else{clearError(errorMonth,monthInput);} if(year.trim()===""){requiredField(errorYear,yearInput);}else{if(validateYear(yearInput,errorYear)===false){isValid=false;}else{clearError(errorYear,yearInput);}}} return isValid;};const validateDateOfBirth=(...args)=>validateDateOfBirthCommon(...args,hasSubmittedFirstStep);const validateDateOfBirthMembership=(...args)=>validateDateOfBirthCommon(...args);const validateFutureDateOfBirth=(dayInput,monthInput,yearInput,error,errorDay,errorMonth,errorYear)=>{const day=dayInput.value;const month=monthInput.value;const year=yearInput.value;const selectedDate=new Date(`${year}-${month}-${day}`);const todaysDate=new Date();let isValid=true;if(selectedDate>todaysDate){showError(errorDay,dayInput,"");showError(errorMonth,monthInput,"");showError(errorYear,yearInput,"");showError(error,dayInput,error.getAttribute("data-error"));isValid=false;}else{clearError(error,error);} return isValid;};const checkAge=(day,month,year,ageType=13)=>{const today=new Date();const birthDate=new Date(year,month-1,day);let age=today.getFullYear()-birthDate.getFullYear();const monthDiff=today.getMonth()-birthDate.getMonth();const dayDiff=today.getDate()-birthDate.getDate();if(monthDiff<0||(monthDiff===0&&dayDiff<0)){age--;} if(ageType===13){setIsUnder13(age<13);return age<13;}else if(ageType===18){return age>=18;}else if(ageType===17){return age<18;}else if(ageType===16){return age<16;}};const validateDropdownFields=()=>{const dropdowns=document.querySelectorAll(".js-dropdown-input");let allValid=true;dropdowns.forEach((dropdown)=>{const value=dropdown.value;const errorElement=dropdown.closest("li")?.nextElementSibling.querySelector(".js-error-dropdown")||dropdown.closest(".js-dropdown-input-wrap")?.nextElementSibling.querySelector(".js-error-dropdown");if(value==="select"){showError(errorElement,dropdown,"This field is required");allValid=false;}else{clearError(errorElement,dropdown);} dropdown.addEventListener("change",()=>{if(dropdown.value!=="select"){clearError(errorElement,dropdown);}else{showError(errorElement,dropdown,"This field is required");}});});return allValid;};const validateHiddenDropdown=(checkbox,dropdown)=>{let isValid=true;if(!checkbox.checked){return isValid;} const value=dropdown.value;const errorElement=dropdown.closest("li")?.nextElementSibling.querySelector(".js-error-dropdown-hidden")||dropdown.closest(".js-dropdown-input-wrap")?.nextElementSibling.querySelector(".js-error-dropdown-hidden");if(value==="select"){showError(errorElement,dropdown,"This field is required");isValid=false;}else{clearError(errorElement,dropdown);} dropdown.addEventListener("change",()=>{if(dropdown.value!=="select"){clearError(errorElement,dropdown);}else{showError(errorElement,dropdown,"This field is required");}});return isValid;};const validateParentFields=(parentName,errorParentName,parentCheckbox,errorParentCheckbox)=>{let allValid=true;if(!isUnder13){return allValid;} if(parentName.value.trim()===""){showError(errorParentName,parentName,"This field is required");allValid=false;}else{clearError(errorParentName,parentName);} if(!parentCheckbox.checked){showError(errorParentCheckbox,parentCheckbox,"This field is required");allValid=false;}else{clearError(errorParentCheckbox,parentCheckbox);} return allValid;};const validateBankAccountNumber=(accountNumberInput,errorElement)=>{const accountNumber=accountNumberInput.value;if(!/^\d{8,12}$/.test(accountNumber)){return showError(errorElement,accountNumberInput,"Bank / Building Society Account Number must be between 8 - 12 digits");} return clearError(errorElement,accountNumberInput);};const validateBranchSortCode=(sortCodeInput,errorElement,errorMessage)=>{const sortCode=sortCodeInput.value;if(!/^\d{6}$/.test(sortCode)){return showError(errorElement,sortCodeInput,errorMessage||"Branch Sort Code must be 6 digits");} return clearError(errorElement,sortCodeInput);};const validateNumbersMaxLength=(sortCodeInput,errorElement,maxDigits,errorMessage)=>{const sortCode=sortCodeInput.value;const regex=new RegExp(`^\\d{1,${maxDigits}}$`);if(!regex.test(sortCode)){return showError(errorElement,sortCodeInput,errorMessage);} return clearError(errorElement,sortCodeInput);};const showError=(errorElement,inputElement,message)=>{if(errorElement instanceof HTMLElement){errorElement.innerHTML=message;errorElement.classList.add(cssClasses.errorMessageActiveClass);} if(inputElement instanceof HTMLElement){inputElement.classList.add(cssClasses.inputErrorBorder);inputElement.scrollIntoView({behavior:"smooth",block:"center",});} return false;};const clearError=(errorElement,inputElement)=>{if(errorElement instanceof HTMLElement){errorElement.innerHTML="";errorElement.classList.remove(cssClasses.errorMessageActiveClass);} if(inputElement instanceof HTMLElement){inputElement.classList.remove(cssClasses.inputErrorBorder);} return true;};const handleMonthInput=(ev,day31,day30,day29)=>{const selectedVal=parseInt(ev.target.value);if(!day31||!day30||!day29)return;if(!selectedVal)return;const day=ev.target.closest(".js-date-parent").querySelector(".js-day");if(monthsWith31Days.includes(parseInt(selectedVal))){day31.classList.remove("hidden");day30.classList.remove("hidden");day29.classList.remove("hidden");return;} if(monthsWith30Days.includes(parseInt(selectedVal))){if(parseInt(day.value)===31){day.value="Day";} day31.classList.add("hidden");day30.classList.remove("hidden");return;} if(parseInt(selectedVal)===monthFebruary){if(parseInt(day.value)===31||parseInt(day.value)===30){day.value="Day";} day31.classList.add("hidden");day30.classList.add("hidden");if(!isLeap){if(parseInt(day.value)===29){day.value="Day";} day29.classList.add("hidden");}}};const handleYearValidation=(target,error)=>{const yearVal=target.value.trim().replaceAll("+","");target.value=yearVal;if(parseInt(yearVal){target.value=target.value.replace(/\D/g,"");};const validateNumbersAndLettersWithMaxLength=(sortCodeInput,errorElement,maxCharacters,errorMessage)=>{const sortCode=sortCodeInput.value;const regex=new RegExp(`^[a-zA-Z0-9]{1,${maxCharacters}}$`);if(!regex.test(sortCode)){return showError(errorElement,sortCodeInput,errorMessage);} return clearError(errorElement,sortCodeInput);};const enforceMaxLength=(input,maxLength)=>{input?.addEventListener("input",function(){if(input.value.length>maxLength){input.value=input.value.slice(0,maxLength);}});};const validateInputFiles=()=>{const inputFields=document.querySelectorAll(".js-file-upload");let allValid=true;for(const input of inputFields){const error=input.nextElementSibling;if(!input.value){showError(error,input,"This field is required");allValid=false;}else{clearError(error,input);}} return allValid;};const validateGroupedInputs=()=>{const inputGroups=document.querySelectorAll(".js-input-group");let allValid=true;for(const group of inputGroups){const inputs=group.querySelectorAll("input");const error=group.querySelector(".js-error-message");const requiredCount=parseInt(group.getAttribute("data-required-count")||"1",10);const filledCount=Array.from(inputs).filter((input)=>input.value.trim()!=="").length;if(filledCount{const textareaElements=document.querySelectorAll(".js-textarea");let allValid=true;for(const textarea of textareaElements){const value=textarea.value.trim();const errorElement=textarea.closest("li").nextElementSibling.querySelector(".js-error-message");const minChars=textarea.getAttribute("data-min-chars")||10;const maxChars=textarea.getAttribute("data-max-chars")||400;const regex=new RegExp(`^.{${Number(minChars)},${Number(maxChars)}}$`);if(!regex.test(value)){showError(errorElement,textarea,`Please enter between ${minChars} and ${maxChars} characters.`);allValid=false;}else{clearError(errorElement,textarea);}} return allValid;};const toggleErrorClass=(element,isValid)=>{const errorMessageActiveClass="error-message--active";if(!element)return;if(!element.value){element.classList.remove(errorMessageActiveClass);return;} if(isValid){element.classList.remove(errorMessageActiveClass);}else{element.classList.add(errorMessageActiveClass);}};const postCodeRegex=(value)=>{const newVal=value.replace(/[^a-zA-Z0-9 ]/g,"");return newVal;};return{validateEmail,validatePassword,validateConfirmPassword,validateTerms,validateRequiredField,validateDateOfBirth,validateDateOfBirthMembership,checkAge,validateParentFields,showError,validateReferEmail,clearError,setHasSubmittedFirstStep,setIsUnder13,validateGenericRequiredFields,validateBankAccountNumber,validateBranchSortCode,validateDropdownFields,validateHiddenDropdown,validateDatePickerInput,validateRadioButtons,validateNumbersMaxLength,validateTelephone,validateNumbersAndLettersWithMaxLength,handleMonthInput,handleYearValidation,handleYearInput,enforceMaxLength,validateFutureDateOfBirth,validateInputFiles,validateTextareaLength,toggleErrorClass,postCodeRegex,validateGroupedInputs,};})();const filterPageHandler=(()=>{const applyFilter=document.querySelector('.js-apply-filter');const clearFilter=document.querySelector("#clearFilter");const filterForm=document.querySelector("#filterForm");const productPage=document.querySelector('.js-product-page');const openDropdownButtons=document.querySelectorAll('.js-open-dropdown');const keys={enter:13,space:32};const transitionTime=300;const dropdownActiveClass='active';const buttonNotClickableClass='not-clickable';const isMobileDevice=window.matchMedia('(max-width: 767px)').matches;const setCheckboxesOnLoad=()=>{const checkboxes=filterForm?.querySelectorAll("input[type=checkbox]");if(!checkboxes?.length)return;const params=new URLSearchParams(window.location.search);for(const checkbox of checkboxes||[]){checkbox.checked=params.has(checkbox.name)&¶ms.getAll(checkbox.name).includes(checkbox.value);}};const applyFilters=(e)=>{if(e.type!=="click")return;if(!productPage){filterForm?.submit();return;} e.preventDefault();const params=new URLSearchParams(window.location.search);const searchQuery=params.get('query');params.delete('filters');const checkedCheckBoxes=filterForm?.querySelectorAll("input[type=checkbox]:checked");for(const checkbox of checkedCheckBoxes||[]){params.append('filters',checkbox.value);} if(searchQuery)params.set('query',searchQuery);window.location.search=params.toString();};const clearFilters=(e)=>{if(e.type!=="click")return;if(!productPage){const checkboxes=filterForm?.querySelectorAll("input[type=checkbox]");for(const el of checkboxes||[]){el.checked=false;} filterForm?.submit();return;} e.preventDefault();const params=new URLSearchParams(window.location.search);params.delete('filters');window.location.search=params.toString();};const toggleDropdown=(target,content,childHeight)=>{target.classList.add(buttonNotClickableClass);target.classList.toggle(dropdownActiveClass);const isActive=target.classList.contains(dropdownActiveClass);content.style.height=isActive?`${childHeight}px`:'0';content.style.visibility=isActive?'visible':'hidden';content.style.opacity=isActive?'1':'0';setTimeout(()=>{target.classList.remove(buttonNotClickableClass);},transitionTime);};const handleDropdown=()=>{for(const button of openDropdownButtons){if(!isMobileDevice)return;const content=button.closest('.js-dropdown-parent').querySelector('.js-filter-mobile-content');const childHeight=content.firstElementChild.getBoundingClientRect().height;button.addEventListener('click',helpers.debounce(({target})=>{toggleDropdown(target,content,childHeight);}),transitionTime*1.5);}};const initEvents=()=>{applyFilter?.addEventListener('click',applyFilters);clearFilter?.addEventListener('click',clearFilters);const listItems=document.querySelectorAll(".filter__list li");for(const li of listItems){li.addEventListener('click',(e)=>{if(e.keyCode!==keys.enter&&e.keyCode!==keys.space&&e.type!=="click"||["button","svg","rect","path"].includes(e.target.tagName.toLowerCase())){return;} let liInput=li.querySelector("input");liInput.checked=!liInput.checked;});}};const initialize=()=>{setCheckboxesOnLoad();initEvents();handleDropdown();};document.addEventListener('DOMContentLoaded',initialize);})();(()=>{const handleDropdown=()=>{const footerCategory=document.querySelectorAll(".footer__lhs__links__category > .footer__lhs__links__category__title");if(!footerCategory.length)return;footerCategory.forEach(category=>{category.addEventListener("click",()=>{const dropdown=category.nextElementSibling;category.classList.toggle("open");dropdown?.classList.toggle("open");const getAriaOpen=dropdown?.getAttribute("aria-open");dropdown?.setAttribute("aria-open",getAriaOpen==="false"||getAriaOpen===null?"true":"false");});})};const fixCaptchaZoom=()=>{const metaTag=document.querySelector('meta[name="viewport"]');if(metaTag){metaTag.setAttribute('content','width=device-width, initial-scale=1, maximum-scale=3, user-scalable=yes');}};const addLabelToCaptchaInput=()=>{const newsletters=document.querySelectorAll('.newsletter-subscribe');if(!newsletters.length)return;const addLabel=(container)=>{const form=container.querySelector("form");const input=form?.querySelector("input");if(input&&!input.hasAttribute("aria-label")){input.setAttribute("aria-label","Email");}};const observer=new MutationObserver((mutations)=>{mutations.forEach(mutation=>{if(mutation.type==='childList'||mutation.type==='attributes'){addLabel(mutation.target.closest('.newsletter-subscribe'));}});});newsletters.forEach(newsletter=>{observer.observe(newsletter,{childList:true,subtree:true,attributes:true});});};window.addEventListener('load',()=>{handleDropdown();fixCaptchaZoom();});document.addEventListener("DOMContentLoaded",()=>{addLabelToCaptchaInput();})})() const menu=document.querySelector(".menu");const menuArrow=menu?.querySelector(".menu__arrow");const menuTitle=menu?.querySelector(".menu__title");const subMenu=menu?.querySelectorAll(".submenu");const burger=document.querySelector(".burger");const searchMobile=document.querySelector("#searchForm--mobile");const menuItems=document.querySelectorAll(".menu__item.menu__dropdown > .menu__link");function isMenuOpen(){return menu?.classList.contains("open");} function toggleMenu(){burger?.classList.toggle("close");menu?.classList.toggle("open");if(isMenuOpen()){helpers.disableScroll();}else{helpers.enableScroll();}} function toggleMobileSearch(){const willShow=searchMobile.classList.toggle("d-none");searchMobile.classList.toggle("d-flex",!willShow);} window.addEventListener("resize",helpers.debounce(function(){if(isMenuOpen()){burger?.classList.remove("close");menu.classList.remove("open");hideSubMenu();helpers.enableScroll();}},500));function toggleProfile(){const openProfileBtn=document.querySelector(".js-toggle-btn-user");const profileHolder=document.querySelector(".js-btns-holder");const closeProfileHolder=document.querySelector(".js-close-btn-user");const profileHolderActiveClass="profile-btns-holder--active";function closeProfile(){profileHolder?.classList.remove(profileHolderActiveClass);helpers.enableScroll();} openProfileBtn?.addEventListener("click",(event)=>{event.stopPropagation();profileHolder?.classList.toggle(profileHolderActiveClass);if(window.innerWidth<768){if(profileHolder?.classList.contains(profileHolderActiveClass)){helpers.disableScroll();}else{helpers.enableScroll();}}});closeProfileHolder?.addEventListener("click",closeProfile);if(window.innerWidth>768){document.addEventListener("click",(event)=>{if(profileHolder?.classList.contains(profileHolderActiveClass)&&!profileHolder?.contains(event.target)&&event.target!==openProfileBtn){closeProfile();}});}} toggleProfile();function showSubMenu(t){t.nextElementSibling?.classList.add("open");menu.querySelector(".menu__title").textContent=t.textContent;menu.querySelector(".menu__header").classList.add("open");} function hideSubMenu(){let open=Array.from(subMenu).filter((i)=>i.classList.contains("open"));open.pop()?.classList.remove("open");if(open.length<=0){menu.querySelector(".menu__header").classList.remove("open");return;} menu.querySelector(".menu__title").textContent=open[open.length-1].previousElementSibling?.textContent;} burger?.addEventListener("click",toggleMenu);menuArrow?.addEventListener("click",hideSubMenu);menuTitle?.addEventListener("click",hideSubMenu);(function handleSubmenuExpand(menu,showSubMenu){const list=menu?.querySelectorAll(".js-menu-expandable");if(list&&list instanceof NodeList){list.forEach((el)=>el.addEventListener("click",function(e){showSubMenu(e.target);}));}})(menu,showSubMenu);const toggleSubMenuOnKeydown=(item,isOpen)=>{const subMenus=item.parentElement.querySelectorAll(".submenu");item.setAttribute("aria-expanded",isOpen);subMenus.forEach((subMenu)=>{subMenu.classList.toggle("open",isOpen);subMenu.setAttribute("aria-expanded",isOpen);if(isOpen&&subMenus[0]){subMenus[0].querySelector("li a").focus();}});};menuItems?.forEach((item)=>{item.addEventListener("keydown",(e)=>{switch(e.key){case"Enter":case"ArrowDown":e.preventDefault();toggleSubMenuOnKeydown(e.target,true);break;case"Escape":toggleSubMenuOnKeydown(e.target,false);break;default:break;}});item.addEventListener("click",(e)=>{if(!burger.classList.contains("close")){e.stopPropagation();if(e.target.nextElementSibling.getAttribute("aria-expanded")==="false"){document.querySelectorAll(".menu__dropdown > .menu__link").forEach((link)=>{link.setAttribute("aria-expanded",false);});subMenu?.forEach((menu)=>{menu.classList.remove("open");menu.setAttribute("aria-expanded",false);});} toggleSubMenuOnKeydown(e.target,e.target.nextElementSibling.getAttribute("aria-expanded")==="false");}});});let index=0;const handleKeyDown=(e)=>{let innerLinks=e.currentTarget.querySelectorAll("li a");let indexChange;switch(e.key){case"Escape":e.currentTarget.parentElement.firstElementChild?.setAttribute("aria-expanded",false);subMenu?.forEach((i)=>{i.classList.remove("open");i.setAttribute("aria-expanded",false);});index=0;e.currentTarget.parentElement.firstElementChild.focus();return;case"ArrowDown":e.preventDefault();indexChange=1;break;case"Tab":e.preventDefault();indexChange=1;break;case"ArrowUp":e.preventDefault();indexChange=-1;break;default:return;} if(e.shiftKey&&e.key=="Tab"){e.preventDefault();indexChange=-1;} index+=indexChange;index=(index+innerLinks.length)%innerLinks.length;innerLinks[index].focus();};subMenu?.forEach((i)=>{if(!i.classList.contains("submenu__list")){i.addEventListener("keydown",handleKeyDown);}});window.addEventListener("resize",function(e){if(menu.classList.contains("open")){subMenu?.forEach((menu)=>{menu.classList.remove("open");menu.setAttribute("aria-expanded",false);});this.document.querySelectorAll(".menu__dropdown > .menu__link").forEach((item)=>item.setAttribute("aria-expanded",false));}});window.addEventListener("load",(event)=>{let imageGalleryModals=document.getElementsByClassName("imageGalleryModal");for(let i=0;i{let eventTarget=event.target;let itemTargetId=event.relatedTarget.dataset.ryaTarget;if(eventTarget&&itemTargetId){let imageGalleryCarousel=eventTarget.querySelector(".imageGalleryCarousel");if(imageGalleryCarousel){let itemTarget=document.getElementById(itemTargetId);if(itemTarget){let items=imageGalleryCarousel.getElementsByClassName("carousel-item");for(let j=0;j{item.addEventListener("click",()=>{document.querySelector(".inPageNavigation .sidebar li.selected")?.classList.remove("selected");item.classList.add("selected");});});let sidebar=document.querySelectorAll('.sidebar');sidebar.forEach(item=>{item.addEventListener("click",(e)=>{if(e.target.classList.contains("expandable")){let subsection=e.target.querySelector("ul");toggleSubsection(subsection);}}) item.addEventListener("keydown",(e)=>{let subsection;let expandable=e.target.closest(".expandable");switch(e.key){case"Enter":e.preventDefault();subsection=expandable.querySelector("ul");toggleSubsection(subsection,true);break;case"Escape":subsection=expandable.querySelector("ul");expandable.querySelector("span")?.focus() toggleSubsection(subsection,false);break;default:break;}});}) const toggleSubsection=function(subSection,isOpen=false){if(!subSection)return;const expandableParent=subSection.closest(".expandable");if(!expandableParent)return;subSection.classList.toggle('opacity-0');expandableParent.classList.toggle('expanded');const isExpanded=expandableParent.querySelector("span").getAttribute("aria-expanded")==="true";expandableParent.querySelector("span").setAttribute("aria-expanded",!isExpanded);};const openSidebar=(id)=>{let item=document.querySelector(`[data-rya-page-id="${id}"]`);if(!item)return item.classList.add("selected") while(item&&item.closest(".expandable")){item.closest(".expandable")?.classList.toggle('expanded',true);item.closest(".opacity-0")?.classList.remove("opacity-0") item=item.parentElement}} let searchInput=document.getElementById("search");latInput=document.getElementById("latInput");longInput=document.getElementById("longInput");form=document.getElementById("searchLoc") searchbutton=document.querySelector("search-btn") const WMNSearchboxResults=document.getElementById('wmn-searchbox-results');const debounce=(cb,delay=500)=>{let timeoutId;return(...args)=>{clearTimeout(timeoutId) timeoutId=setTimeout(()=>cb(...args),delay)}} if(WMNSearchboxResults){if(searchInput!==null&&searchInput!==undefined){const initSearch=async()=>{const Places=await google.maps.importLibrary("places");searchInput.addEventListener('input',debounce(e=>{Locationinputsearch(searchInput.value,Places)}));searchInput.addEventListener('keydown',(e)=>LocationSearchKeyboardNav(e));};window.addEventListener("DOMContentLoaded",initSearch)} function LocationSearchKeyboardNav(e){if(e.keyCode==keys.downarrow){if(IsVisible(WMNSearchboxResults)){if(WMNSearchboxResults.querySelectorAll(".selected").length==0){WMNSearchboxResults.getElementsByTagName("div")[1].classList.add("selected");} else{var currentslection=WMNSearchboxResults.querySelectorAll(".selected")[0];currentslection.classList.remove("selected");var nextSelection=currentslection.nextElementSibling;if(nextSelection!=null){if(nextSelection.classList.contains("wmn-result-title")){nextSelection=nextSelection.nextElementSibling;} if(nextSelection!=null){nextSelection.classList.add("selected");} else{WMNSearchboxResults.getElementsByTagName("div")[1].classList.add("selected");}} else{WMNSearchboxResults.getElementsByTagName("div")[1].classList.add("selected");}} var selection=WMNSearchboxResults.querySelectorAll(".selected")[0];if(selection!=null){var name=selection.getAttribute("data-placeName");searchInput.value=name;if(selection.hasAttribute("data-locationurl")){form.querySelector("button[type=submit]").disabled=false;} GeocodeGetLocation(selection.getAttribute("data-placeId"),false);}}} if(e.keyCode==keys.uparrow){if(IsVisible(WMNSearchboxResults)){if(WMNSearchboxResults.querySelectorAll(".selected").length==0){WMNSearchboxResults.getElementsByTagName("div")[WMNSearchboxResults.getElementsByTagName("div").length-1].classList.add("selected");} else{var currentslection=WMNSearchboxResults.querySelectorAll(".selected")[0];currentslection.classList.remove("selected");var prevSelection=currentslection.previousElementSibling;if(prevSelection!=null){if(prevSelection.classList.contains("wmn-location-result-title")){prevSelection=prevSelection.previousElementSibling;if(prevSelection!=null){prevSelection.classList.add("selected");}} if(prevSelection.classList.contains("wmn-google-result-title")){prevSelection=WMNSearchboxResults.getElementsByTagName("div")[WMNSearchboxResults.getElementsByTagName("div").length-1];if(prevSelection!=null){prevSelection.classList.add("selected");}} prevSelection.classList.add("selected");} else{WMNSearchboxResults.getElementsByTagName("div")[WMNSearchboxResults.getElementsByTagName("div").length-1].classList.add("selected");}} var selection=WMNSearchboxResults.querySelectorAll(".selected")[0];if(selection!=null){var name=selection.getAttribute("data-placeName");searchInput.value=name;if(selection.hasAttribute("data-locationurl")){form.querySelector("button[type=submit]").disabled=false;} GeocodeGetLocation(selection.getAttribute("data-placeId"),false);}}} if(e.keyCode==keys.enter){if(WMNSearchboxResults.querySelectorAll(".selected").length==0){var foundresults=WMNSearchboxResults.querySelectorAll(".wmn-google-result,.wmn-location-result");if(foundresults.length>0){foundresults[0].click();} return;} else{WMNSearchboxResults.querySelectorAll(".selected")[0].click();}} if(e.keyCode==keys.esc){WMNSearchboxResults.style="display:none";}} function GeocodeGetLocation(placeID,submitForm){var geocoder=new google.maps.Geocoder();geocoder.geocode({'placeId':placeID},function(responses,status){if(status=='OK'){var lat=responses[0].geometry.location.lat();var lng=responses[0].geometry.location.lng();latInput.value=lat;longInput.value=lng;form.querySelector("button[type=submit]").disabled=false;if(submitForm){WMNSearchboxResults.style="display:none;";form.submit();}}});} function IsVisible(elem){return!!(elem.offsetWidth||elem.offsetHeight||elem.getClientRects().length);} function Locationinputsearch(searchTerm,places){if(searchTerm.length>=3){WMNSearchboxResults.style="display:block";WMNSearchboxResults.innerHTML="";LocationNameSearch(searchTerm);} else{WMNSearchboxResults.style="display:none";WMNSearchboxResults.innerHTML="";}} document.addEventListener("click",function(e){var target=e.target;if(!target.classList.contains("wmn-mapsearch")&&target.id!="search");{WMNSearchboxResults.style="display:none";} if(target.classList.contains("search-btn")){var location=document.querySelector(".wmn-location-result.selected") if(location!=null){e.preventDefault();window.location.href=location.getAttribute("data-locationurl");}}});Element.prototype.insertChildAtIndex=function(child,index){if(!index)index=0 if(index>=this.children.length){this.appendChild(child)}else{this.insertBefore(child,this.children[index])}} async function LocationNameSearch(searchTerm){var service=new google.maps.places.AutocompleteService(WMNSearchboxResults);service.getPlacePredictions({input:searchTerm},function(results,status){if(status==google.maps.places.PlacesServiceStatus.OK){var existingResults=WMNSearchboxResults.querySelectorAll(".wmn-google-result-title,.wmn-google-result") for(var i=0;i=4?4:results.length;if(results.length!=0){var Titleitem=document.createElement('div');Titleitem.className="wmn-mapsearch wmn-result-title wmn-google-result-title";Titleitem.innerText="Locations";WMNSearchboxResults.insertChildAtIndex(Titleitem,0);} for(var i=0;i{var locationEle=document.createElement("div");locationEle.className="wmn-mapsearch wmn-location-result" locationEle.setAttribute("data-locationUrl",location.locationUrl);locationEle.setAttribute("data-placeName",location.locationName);locationEle.innerHTML=location.locationName;locationEle.addEventListener('click',(e)=>{window.location.href=e.target.getAttribute("data-locationUrl");});WMNSearchboxResults.appendChild(locationEle);});displaylocationresults();}} function displaylocationresults(){if(WMNSearchboxResults.innerHTML==""){WMNSearchboxResults.style="display:none;";} else{WMNSearchboxResults.style="display:block;";}} function WMNLocationRedirect(e){window.location.href=e.getAttribute("data-locationUrl");}} function getOffsetTop(elem){var offsetTop=0;do{if(!isNaN(elem.offsetTop)){offsetTop+=elem.offsetTop;}}while((elem=elem.offsetParent));return offsetTop;} function setMinHeight(el,val){if(typeof val==="function")val=val();if(typeof val==="string")el.style.minHeight=val;else el.style.minHeight=val+"px";} var equalheight=function(container){var currentTallest=0,currentRowStart=0,rowDivs=new Array(),$el,topPosition=0;Array.from(document.querySelectorAll(container)).forEach((el,i)=>{el.style.minHeight="auto";topPostion=getOffsetTop(el);if(currentRowStart!=topPostion){for(currentDiv=0;currentDiv{const activeTabValue=tab.getAttribute('data-tab-for');const activeContent=document.querySelector(`[data-tab-id="${activeTabValue}"]`);allContent.forEach((content)=>{content.classList.remove(tabContentActiveClass);});allTabs.forEach((tab)=>{tab.classList.remove(tabBtnActiveClass);});tab.classList.add(tabBtnActiveClass);activeContent.classList.add(tabContentActiveClass);sessionStorage.setItem('activeTab',activeTabValue);});allTabs.forEach((tab)=>{tab.addEventListener('click',()=>{activateTab(tab);});});const initTabs=()=>{const savedTab=sessionStorage.getItem('activeTab');if(savedTab){const activeTab=document.querySelector(`[data-tab-for="${savedTab}"]`);if(activeTab){activateTab(activeTab);}}else{const firstTab=allTabs[0];firstTab?.click();}};initTabs();window.onpagehide=(event)=>{if(event.persisted){sessionStorage.removeItem('activeTab')}};} document.addEventListener('DOMContentLoaded',tabs);window.addEventListener("load",(event)=>{var videoEmbedLinks=document.getElementsByClassName("videoEmbed__link");for(var i=0;i{const fieldsetBoatingInterests=document.querySelector('.js-boating-interests');if(!fieldsetBoatingInterests){return;} const formLabelDisabled='form-label--disabled';const maxSelection=3;fieldsetBoatingInterests.dataset.checkedCount=0;const handleCheckboxChange=(event)=>{const checkboxes=fieldsetBoatingInterests.querySelectorAll('.js-checkbox');const labels=fieldsetBoatingInterests.querySelectorAll('.js-form-label');if(checkboxes.length===0||labels.length===0){return;} let total=parseInt(fieldsetBoatingInterests.dataset.checkedCount,10);const checked=event.target.checked;if(checked){total+=1;}else{total-=1;} fieldsetBoatingInterests.dataset.checkedCount=total;if(total>=maxSelection){checkboxes.forEach(checkbox=>{if(!checkbox.checked){checkbox.disabled=true;}});labels.forEach(label=>{const associatedCheckbox=document.getElementById(label.htmlFor);if(associatedCheckbox&&!associatedCheckbox.checked){label.classList.add(formLabelDisabled);}});}else{checkboxes.forEach(checkbox=>{checkbox.disabled=false;});labels.forEach(label=>{const associatedCheckbox=document.getElementById(label.htmlFor);if(associatedCheckbox){label.classList.remove(formLabelDisabled);}});}};fieldsetBoatingInterests.addEventListener('change',(event)=>{if(event.target.classList.contains('js-checkbox')){handleCheckboxChange(event);}});});(()=>{const radioGroups=document.querySelectorAll('.radio-buttons__group');const selector='input[type="radio"]';const updateActiveClassInGroup=(group)=>{const radioButtons=group.querySelectorAll('.radio-button');radioButtons.forEach(button=>{const radioInput=button.querySelector(selector);if(radioInput.checked){button.classList.add('active');}else{button.classList.remove('active');}});};radioGroups.forEach(group=>{const radioInputs=group.querySelectorAll(selector);radioInputs.forEach(radioInput=>{radioInput.addEventListener('change',()=>updateActiveClassInGroup(group));});});const initializeRadioGroups=()=>{radioGroups.forEach(updateActiveClassInGroup);};document.addEventListener('DOMContentLoaded',initializeRadioGroups);window.addEventListener('pageshow',initializeRadioGroups);})();function deleteAddress(){const removeBtn=document.querySelectorAll(".js-remove-address");const confirmationActiveClass="addresses-card__confirm-holder--active";const btnsHolderInactiveClass="addresses-card__buttons-holder--inactive";removeBtn.forEach((btn)=>{const card=btn.closest(".js-addresses-card");const confirmation=card.querySelector(".js-confirmation-holder");const btnsHolder=card.querySelector('.js-buttons-holder');const confirmNo=card.querySelector(".js-confirm-no");btn.addEventListener("click",()=>{confirmation.classList.add(confirmationActiveClass);btnsHolder.classList.add(btnsHolderInactiveClass);});confirmNo.addEventListener("click",()=>{confirmation.classList.remove(confirmationActiveClass);btnsHolder.classList.remove(btnsHolderInactiveClass);});});} document.addEventListener('DOMContentLoaded',deleteAddress);document.addEventListener('DOMContentLoaded',editAddress);function editAddress(){const editButtons=document.querySelectorAll('.js-edit-address');const addressForm=document.querySelector('.js-addresses-form');const editAddressIndicator=document.querySelector('#editAddressIndicator');const submitButton=document.querySelector('.js-submit-address');const clearButton=document.querySelector('.js-clear-form-btn');const addressesFieldset=document.querySelector('.js-addresses-fieldset');const clearButtonActiveClass='addresses__clear-btn--active' function checkFields(){const addressesCount=parseInt(document.querySelector('#addressesCount')?.value,10);if(editAddressIndicator&&(editAddressIndicator.value.trim()!==''||addressesCount<2)){submitButton?.removeAttribute('disabled');addressesFieldset?.removeAttribute('disabled');}else{addressesFieldset?.setAttribute('disabled','disabled');submitButton?.setAttribute('disabled','disabled');}} checkFields();if(editAddressIndicator){editAddressIndicator?.addEventListener('input',function(){checkFields();});} if(editButtons.length>0){editButtons.forEach(button=>{button.addEventListener('click',function(){const addressType=this.getAttribute('data-address-type');const property=this.getAttribute('data-address-property');const addressLine1=this.getAttribute('data-address-line1');const addressLine2=this.getAttribute('data-address-line2');const city=this.getAttribute('data-city');const area=this.getAttribute('data-area');const postcode=this.getAttribute('data-postcode');const country=this.getAttribute('data-country');if(addressForm){addressForm.querySelector('#property').value=property||'';addressForm.querySelector('#address1').value=addressLine1||'';addressForm.querySelector('#address2').value=addressLine2||'';addressForm.querySelector('#town').value=city||'';addressForm.querySelector('#area').value=area||'';addressForm.querySelector('#postcode').value=postcode||'';addressForm.querySelector('#countryDropdown').value=country||'';} if(editAddressIndicator){editAddressIndicator.value=addressType;} clearButton.classList.add(clearButtonActiveClass);checkFields();});});} clearButton?.addEventListener('click',function(){if(addressForm){addressForm.querySelector('#property').value='';addressForm.querySelector('#address1').value='';addressForm.querySelector('#address2').value='';addressForm.querySelector('#town').value='';addressForm.querySelector('#area').value='';addressForm.querySelector('#postcode').value='';} clearButton.classList.remove(clearButtonActiveClass);if(editAddressIndicator){editAddressIndicator.value='';} checkFields();});} document.addEventListener("DOMContentLoaded",()=>{const lookupInput=document.querySelector(".js-lookup-input");const lookupButton=document.querySelector(".js-lookup-btn");const resultsContainer=document.querySelector(".js-addresses-results");const addressesForm=document.querySelector(".js-addresses-form");const registerForm=document.querySelector(".js-register-user");const addressesList=document.querySelector(".js-addresses-list");const addressInput=document.querySelector(".js-address1-input");const localityInput=document.querySelector(".js-address2-input");const townInput=document.querySelector(".js-town-input");const countryInput=document.querySelector(".js-country-input");const postcodeInput=document.querySelector(".js-postcode-input");const propertyInput=document.querySelector(".js-property-input");const errorMessageLookup=document.querySelector(".js-error-message-lookup");const submitAddressBtn=document.querySelector(".js-submit-address");const errorAddress=document.querySelector(".js-error-address1");const errorTown=document.querySelector(".js-error-town");const errorPostcode=document.querySelector(".js-error-postcode");const resultsActiveClass="addresses__results--active";const inputErrorBorder="form-input--error";const errorLookupActiveClass="error-lookup--active";const requiredFields=[{input:addressInput,error:errorAddress},{input:townInput,error:errorTown},{input:postcodeInput,error:errorPostcode},];const validateRequiredFields=()=>{let allValid=true;requiredFields.forEach((field)=>{if(!validation.validateRequiredField(field.input,field.error)){allValid=false;}});return allValid;};const validatePostcode=()=>{if(!postcodeInput)return;postcodeInput.addEventListener("input",({target})=>{if(target.value===""&&!target.required)return;target.value=validation.postCodeRegex(target.value);});};const fetchAddresses=(query)=>{fetch(`/api/lookupAddresses?query=${query}`).then((response)=>{if(!response.ok){throw new Error("Could not find address");} return response.json();}).then((data)=>{if(data.Item){showAddresses(data.Item);}else{throw new Error("Your postcode could not be found. Please type in your address");}}).catch((error)=>{handleError(error);});};const showAddresses=(addresses)=>{addressesList.innerHTML=addresses.map((item)=>`
  • `).join("");resultsContainer.classList.add(resultsActiveClass);document.addEventListener("click",closeDropdown);};lookupInput?.addEventListener("input",()=>{addressesList.innerHTML="";resultsContainer.classList.remove(resultsActiveClass);errorMessageLookup.textContent="";lookupInput.classList.remove(inputErrorBorder);});const handleError=(error)=>{resultsContainer.classList.remove(resultsActiveClass);errorMessageLookup.classList.add(errorLookupActiveClass);errorMessageLookup.textContent=error;addressesList.innerHTML="";};const handleLookup=(e)=>{e.preventDefault();const query=lookupInput.value.trim();if(query.length){fetchAddresses(query);lookupInput.classList.remove(inputErrorBorder);errorMessageLookup.classList.remove(errorLookupActiveClass);}else{handleError("Please enter a postcode");lookupInput.classList.add(inputErrorBorder);errorMessageLookup.classList.add(errorLookupActiveClass);}};lookupButton?.addEventListener("click",handleLookup);const clearFields=()=>{[registerForm,addressesForm].forEach((el)=>{if(!el)return;const setValue=(selector)=>{const input=el.querySelector(selector);if(input)input.value="";};["#property","#address1","#address2","#town","#area","#postcode",].forEach(setValue);});};resultsContainer?.addEventListener("click",(e)=>{if(e.target.classList.contains("addresses__results-btn")){e.preventDefault();clearFields();addressInput.value=e.target.dataset.street||"";localityInput.value=e.target.dataset.locality||"";townInput.value=e.target.dataset.town||"";postcodeInput.value=e.target.dataset.postcode||"";propertyInput.value=e.target.dataset.property||"";countryInput.value="UK";resultsContainer.classList.remove(resultsActiveClass);validation.clearError(errorAddress,addressInput);validation.clearError(errorTown,townInput);validation.clearError(errorPostcode,postcodeInput);}});const populateCountryInput=(countries)=>{const ukIndex=countries.indexOf("United Kingdom");if(ukIndex!==-1){const uk=countries.splice(ukIndex,1)[0];countries.unshift(uk);} countries.forEach((country)=>{const option=document.createElement("option");option.value=country;option.textContent=country;});};const countries=["Scotland","Ireland","Italy","United Kingdom","Spain",];populateCountryInput(countries);const handleSubmitAddress=(e)=>{e.preventDefault();const areRequiredFieldsValid=validateRequiredFields();if(areRequiredFieldsValid){loader.showLoader();addressesForm.submit();}};submitAddressBtn?.addEventListener("click",handleSubmitAddress);validatePostcode();const closeDropdown=(e)=>{const inDropdown=e.target.closest(".addresses__results");if(inDropdown)return;resultsContainer.classList.remove(resultsActiveClass);document.removeEventListener("click",closeDropdown);};});document.addEventListener('DOMContentLoaded',()=>{share91快色s();}) function share91快色s(){const isDesktopDevice=window.matchMedia('(min-width: 1200px)').matches;const certificates=isDesktopDevice?document.querySelector('.js-certificates-table-desktop'):document.querySelector('.js-certificates-table-mobile');const includeExpiredCheckbox=document.querySelector('.js-include-expired');const expiredRows=document.querySelectorAll('.js-certificates-expired');const expiredRowsMobile=document.querySelectorAll('.js-certificates-expired-mobile');const selectAllCheckboxes=document.querySelector('.js-select-all-checkbox');const itemCheckboxes=certificates?.querySelectorAll('.js-check-share');includeExpiredCheckbox?.addEventListener('change',(e)=>{toggleExpiredRows(e.target.checked,expiredRows,'certificates-expired--active');toggleExpiredRows(e.target.checked,expiredRowsMobile,'certificates-expired-mobile--active');});selectAllCheckboxes?.addEventListener('change',(event)=>{itemCheckboxes.forEach(checkbox=>{checkbox.checked=event.target.checked;});});itemCheckboxes?.forEach(checkbox=>{checkbox.addEventListener('change',()=>{updateSelectAllCheckbox(selectAllCheckboxes,itemCheckboxes);});});} function toggleExpiredRows(includeExpired,rows,activeClass){rows.forEach(row=>{if(includeExpired){row.classList.add(activeClass);}else{row.classList.remove(activeClass);}});} function updateSelectAllCheckbox(selectAllCheckbox,itemCheckboxes){selectAllCheckbox.checked=Array.from(itemCheckboxes).every(checkbox=>checkbox.checked);};;