// CAPTCHA validation functionality window.ashleyCaptcha = window.ashleyCaptcha || {}; ashleyCaptcha.initAll = function () { const captchaBlocks = document.querySelectorAll(".ashley-captcha-container[data-captcha-id]"); captchaBlocks.forEach(function (block) { const uniqueId = block.getAttribute("data-captcha-id"); if (uniqueId) { ashleyCaptcha.init(uniqueId); } }); }; ashleyCaptcha.init = function (uniqueId) { const captchaBlock = document.querySelector("[data-captcha-id=\"" + uniqueId + "\"]"); if (!captchaBlock) return; const form = captchaBlock.closest("form"); if (!form) return; const validator = function (event) { if (ashleyCaptcha.validate(uniqueId)) return; event.preventDefault(); event.stopImmediatePropagation(); return false; }; // Add validation to this specific form's submit events form.addEventListener("submit", validator, true); // Also add in bubble phase as backup form.addEventListener("submit", validator, false); // Force a CAPTCHA refresh when the form is reset. form.addEventListener("reset", function () { ashleyCaptcha.refresh(uniqueId); }); // Clear error message when user types const inputElement = captchaBlock.querySelector(".ashley-captcha-input"); if (inputElement) { inputElement.addEventListener("input", function () { ashleyCaptcha.clearError(uniqueId); }); } }; ashleyCaptcha.validate = function (uniqueId) { const captchaBlock = document.querySelector("[data-captcha-id=\"" + uniqueId + "\"]"); if (!captchaBlock) return false; const inputElement = captchaBlock.querySelector(".ashley-captcha-input"); const errorElement = captchaBlock.querySelector(".ashley-captcha-error-message"); if (!inputElement || !errorElement) { console.error("CAPTCHA elements not found for validation"); return false; } const userInput = inputElement.value.trim(); if (userInput === "") { ashleyCaptcha.showError(uniqueId, "Please enter the CAPTCHA result."); inputElement.focus(); return false; } // We can't validate the actual result client-side // Just check that something was entered ashleyCaptcha.clearError(uniqueId); return true; }; ashleyCaptcha.showError = function (uniqueId, message) { const captchaBlock = document.querySelector("[data-captcha-id=\"" + uniqueId + "\"]"); if (!captchaBlock) return; const errorElement = captchaBlock.querySelector(".ashley-captcha-error-message"); const inputElement = captchaBlock.querySelector(".ashley-captcha-input"); if (errorElement) { errorElement.textContent = message; errorElement.style.display = "block"; } if (inputElement) { inputElement.style.borderColor = "#c62828"; inputElement.style.borderWidth = "2px"; } // Scroll to CAPTCHA if not visible captchaBlock.scrollIntoView({ behavior: "smooth", block: "center" }); }; ashleyCaptcha.clearError = function (uniqueId) { const captchaBlock = document.querySelector("[data-captcha-id=\"" + uniqueId + "\"]"); if (!captchaBlock) return; const errorElement = captchaBlock.querySelector(".ashley-captcha-error-message"); const inputElement = captchaBlock.querySelector(".ashley-captcha-input"); if (errorElement) { errorElement.style.display = "none"; } if (inputElement) { inputElement.style.borderColor = ""; inputElement.style.borderWidth = ""; } }; ashleyCaptcha.refresh = function (uniqueId) { const captchaBlock = document.querySelector("[data-captcha-id=\"" + uniqueId + "\"]"); if (!captchaBlock) return; const imgElement = captchaBlock.querySelector(".ashley-captcha"); const nonceElement = captchaBlock.querySelector("input[name='ashley_captcha_nonce']"); const inputElement = captchaBlock.querySelector(".ashley-captcha-input"); // Clear any existing errors ashleyCaptcha.clearError(uniqueId); // Show loading state imgElement.style.opacity = "0.5"; inputElement.value = ""; // Make AJAX request to refresh CAPTCHA const xhr = new XMLHttpRequest(); xhr.open("POST", ashleyCaptchaAjax.ajaxUrl, true); xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); xhr.onreadystatechange = function () { if (xhr.readyState === 4) { if (xhr.status === 200) { try { const response = JSON.parse(xhr.responseText); if (response.success) { imgElement.src = response.data.image_src; nonceElement.value = response.data.nonce; imgElement.style.opacity = "1"; inputElement.focus(); } else { ashleyCaptcha.showError(uniqueId, "Error refreshing CAPTCHA: " + response.data); imgElement.style.opacity = "1"; } } catch (e) { ashleyCaptcha.showError(uniqueId, "Error refreshing CAPTCHA. Please try again."); imgElement.style.opacity = "1"; } } else { ashleyCaptcha.showError(uniqueId, "Network error. Please try again."); imgElement.style.opacity = "1"; } } }; xhr.send("action=ashley_captcha_refresh&captcha_id=" + encodeURIComponent(uniqueId)); }; // Initialize all CAPTCHA blocks when DOM is ready if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', ashleyCaptcha.initAll); } else { ashleyCaptcha.initAll(); } ; (function() { function init() { const lightboxImages = document.querySelectorAll('.wp-block-image[data-lightbox-enabled="true"] img'); if (!lightboxImages.length) return; lightboxImages.forEach(img => { img.addEventListener('click', openLightbox); }); } function openLightbox(event) { event.preventDefault(); const sourceImage = event.target; const fullSizeUrl = new URL(sourceImage.src); window.ashley.lightbox.openImage(fullSizeUrl, sourceImage.alt); } // Initialize when DOM is ready if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', init); } else { init(); } })(); ; (function() { function init() { const shareButtons = document.querySelectorAll('button.image-sharing-button'); shareButtons.forEach(function(button) { button.addEventListener('click', event => { event.preventDefault(); toggleShareOptions(event.currentTarget) }); }); } function toggleShareOptions(button) { const wrapper = button.closest('.image-sharing-wrapper'); const shareButton = wrapper.querySelector('button.image-sharing-button'); const shareButtonIcon = shareButton.querySelector('i'); const optionButtons = wrapper.querySelectorAll('a.image-sharing-option'); if (optionButtons.length) { let isActive = false; for (let i = 0; i < optionButtons.length; i++) isActive = optionButtons[i].classList.toggle('active'); shareButtonIcon.className = isActive ? 'fa-solid fa-xmark' : 'fa-solid fa-share'; return; } const sharingOptions = wrapper.dataset.sharingOptions.split(' '); appendOptions(wrapper, sharingOptions, shareButton); shareButtonIcon.className = 'fa-solid fa-xmark'; } function appendOptions(wrapper, sharingOptions, shareButton) { sharingOptions.forEach(function(action) { const option = document.createElement('a'); option.className = shareButton.className; option.classList.add('image-sharing-option', 'active'); option.style.cssText = shareButton.style.cssText; option.href = getUrl(wrapper, action); option.rel = 'noopener noreferrer nofollow'; option.target = '_blank'; if (action === 'download') option.setAttribute('download', ''); const icon = document.createElement('i'); icon.className = getIconClass(action); option.appendChild(icon); wrapper.appendChild(option); }); } function getUrl(wrapper, action) { const imageUrl = wrapper.dataset.imageUrl; switch(action) { case 'facebook': return `https://www.facebook.com/sharer.php?u=${encodeURIComponent(imageUrl)}`; case 'twitter': return `https://twitter.com/intent/tweet?url=${encodeURIComponent(imageUrl)}`; case 'pinterest': return `https://pinterest.com/pin/create/button/?media=${encodeURIComponent(imageUrl)}`; default: return imageUrl; } } function getIconClass(action) { const icons = { download: 'fa-solid fa-download', facebook: 'fa-brands fa-facebook-f', twitter: 'fa-brands fa-x-twitter', pinterest: 'fa-brands fa-pinterest-p' }; return icons[action] || ''; } // Initialize when DOM is ready if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', init); else init(); })(); ; (function(){"use strict";window.kadence={initOutlineToggle:function(){document.body.addEventListener("keydown",function(){document.body.classList.remove("hide-focus-outline")}),document.body.addEventListener("mousedown",function(){document.body.classList.add("hide-focus-outline")})},getOffset:function(a){if(a instanceof HTMLElement){var b=a.getBoundingClientRect();return{top:b.top+window.pageYOffset,left:b.left+window.pageXOffset}}return{top:null,left:null}},findParents:function(a,b){function c(a){var e=a.parentNode;e instanceof HTMLElement&&(e.matches(b)&&d.push(e),c(e))}var d=[];return c(a),d},toggleAttribute:function(a,b,c,d){c===void 0&&(c=!0),d===void 0&&(d=!1),a.getAttribute(b)===c?a.setAttribute(b,d):a.setAttribute(b,c)},initNavToggleSubmenus:function(){var a=document.querySelectorAll(".nav--toggle-sub");if(a.length)for(let b=0;bh)var u=Math.floor(Math.floor(i)-Math.floor(k)+Math.floor(s));else var u=Math.floor(i-k);var v=e.querySelectorAll(".custom-logo"),w=e.querySelector(".site-main-header-inner-wrap"),x=parseInt(w.getAttribute("data-start-height"));if(x||(w.setAttribute("data-start-height",w.offsetHeight),x=w.offsetHeight),window.scrollY<=u){if(w.style.height=x+"px",w.style.minHeight=x+"px",w.style.maxHeight=x+"px",v)for(let a,b=0;bu){var y=Math.max(t,x-(window.scrollY-(i-k)));if(w.style.height=y+"px",w.style.minHeight=y+"px",w.style.maxHeight=y+"px",v)for(let a,b=0;bh;if(A<=z)e.style.transform="translateY(0px)";else if(F)e.classList.add("item-hidden-above"),e.style.transform="translateY("+(Math.abs(E)>B?-B:E)+"px)";else{var z=Math.floor(i-k);e.style.transform="translateY("+(0z?"true"===r?window.scrollY{a.forEach(a=>{b(0{j("updateActive")})}},getTopOffset:function(a="scroll"){if("load"===a)var b=document.querySelector("#main-header .kadence-sticky-header"),c=document.querySelector("#mobile-header .kadence-sticky-header");else var b=document.querySelector("#main-header .kadence-sticky-header:not([data-reveal-scroll-up=\"true\"])"),c=document.querySelector("#mobile-header .kadence-sticky-header:not([data-reveal-scroll-up=\"true\"])");var d=0,e=0;if(kadenceConfig.breakPoints.desktop<=window.innerWidth){if(b){var f=b.getAttribute("data-shrink");d="true"!==f||b.classList.contains("site-header-inner-wrap")?Math.floor(b.offsetHeight):Math.floor(b.getAttribute("data-shrink-height"))}else d=0;document.body.classList.contains("admin-bar")&&(e=32)}else{if(c){var f=c.getAttribute("data-shrink");d="true"===f?Math.floor(c.getAttribute("data-shrink-height")):Math.floor(c.offsetHeight)}else d=0;document.body.classList.contains("admin-bar")&&(e=46)}return Math.floor(d+e+Math.floor(kadenceConfig.scrollOffset))},scrollToElement:function(a,b,c="scroll"){b=!("undefined"!=typeof b)||b;var d=window.kadence.getTopOffset(c),e=Math.floor(a.getBoundingClientRect().top)-d;window.scrollBy({top:e,left:0,behavior:"smooth"}),a.tabIndex="-1",a.focus({preventScroll:!0}),a.classList.contains("kt-title-item")&&a.firstElementChild.click(),b&&window.history.pushState("","","#"+a.id)},anchorScrollToCheck:function(a,b){if(b="undefined"==typeof b?null:b,a.target.getAttribute("href"))var c=a.target;else{var c=a.target.closest("a");if(!c)return;if(!c.getAttribute("href"))return}if(!(c.parentNode&&c.parentNode.hasAttribute("role")&&"tab"===c.parentNode.getAttribute("role"))&&!c.closest(".woocommerce-tabs ul.tabs")){var d=b?b.getAttribute("href").substring(b.getAttribute("href").indexOf("#")):c.getAttribute("href").substring(c.getAttribute("href").indexOf("#"));var e=document.getElementById(d.replace("#",""));e&&(e?.classList?.contains("kt-accordion-pane")||(a.preventDefault(),window.kadence.scrollToElement(e),window.kadence.updateActiveAnchors()))}},initStickySidebarWidget:function(){if(document.body.classList.contains("has-sticky-sidebar-widget")){var a=window.kadence.getTopOffset(),b=document.querySelector("#secondary .sidebar-inner-wrap .widget:last-child");b&&(b.style.top=Math.floor(a+20)+"px",b.style.maxHeight="calc( 100vh - "+Math.floor(a+20)+"px )")}},initStickySidebar:function(){if(document.body.classList.contains("has-sticky-sidebar")){var a=window.kadence.getTopOffset(),b=document.querySelector("#secondary .sidebar-inner-wrap");b&&(b.style.top=Math.floor(a+20)+"px",b.style.maxHeight="calc( 100vh - "+Math.floor(a+20)+"px )")}},initActiveAnchors:function(){""!=window.location.hash&&window.kadence.updateActiveAnchors(),window.onhashchange=function(){window.kadence.updateActiveAnchors()}},updateActiveAnchors:function(){const a=document.querySelectorAll(".menu-item");a.forEach(function(a){const b=a.querySelector("a");b?.href&&b.href.includes("#")&&(window.location.href==b.href?a.classList.add("current-menu-item"):a.classList.remove("current-menu-item"))})},initAnchorScrollTo:function(){if(!document.body.classList.contains("no-anchor-scroll")){if(window.onhashchange=function(){""===window.location.hash&&(window.scrollTo({top:0,behavior:"smooth"}),document.activeElement.blur())},""!=window.location.hash){var a,b=location.hash.substring(1);if(!/^[A-z0-9_-]+$/.test(b))return;a=document.getElementById(b),a&&window.setTimeout(function(){window.kadence.scrollToElement(a,!1,"load")},100)}var c=document.querySelectorAll("a[href*=\\#]:not([href=\\#]):not(.scroll-ignore):not([data-tab]):not([data-toggle]):not(.woocommerce-tabs a):not(.tabs a)");c.length&&c.forEach(function(a){try{var b=new URL(a.href);b.pathname===window.location.pathname&&a.addEventListener("click",function(a){window.kadence.anchorScrollToCheck(a)})}catch(b){console.log("ClassList: "+a.classList,"Invalid URL")}})}},initScrollToTop:function(){var a=document.getElementById("kt-scroll-up");if(a){var b=function(){100b!==a);if(d.forEach(function(a){const b=a.querySelector(":scope > ul.sub-menu");b&&b.classList.remove("opened")}),!b){const b=d=>{a.contains(d.target)||(c.classList.remove("opened"),document.removeEventListener("click",b))};document.addEventListener("click",b)}}})})})},init:function(){window.kadence.initNavToggleSubmenus(),window.kadence.initToggleDrawer(),window.kadence.initMobileToggleAnchor(),window.kadence.initMobileToggleSub(),window.kadence.initOutlineToggle(),window.kadence.initStickyHeader(),window.kadence.initStickySidebar(),window.kadence.initStickySidebarWidget(),window.kadence.initTransHeaderPadding(),window.kadence.initAnchorScrollTo(),window.kadence.initScrollToTop(),window.kadence.initActiveAnchors(),window.kadence.initClickToOpen()}},"loading"===document.readyState?document.addEventListener("DOMContentLoaded",window.kadence.init):window.kadence.init()})();;