/* store.js */ $(document).ready(function() { $(document).foundation(); //image zoom if($( "#ui_main_image" ).length){ $("#ui_main_image").elevateZoom({ gallery:'gallery_01', zoomType: "inner", galleryActiveClass: 'active', cursor: "crosshair" }); } //toggle right menu items on mobile if ($(window).width() <= 640) { //open relevant dropdowns and close all others $('#basket').click(function() { if($( "#basket" ).hasClass( "hover" )){ $( "#basket" ).removeClass("hover"); } else { $('#account,#translations,#display_currency,#languagebox').removeClass("hover"); $( "#basket" ).addClass("hover"); } }); $('#account').click(function() { if($( "#account" ).hasClass( "hover" )){ $( "#account" ).removeClass("hover"); } else { $('#basket,#translations,#display_currency,#languagebox').removeClass("hover"); $( "#account" ).addClass("hover"); } }); $('#translations').click(function() { if($( "#display_currency,#languagebox" ).hasClass( "hover" )){ return false; } else { if($( "#translations" ).hasClass( "hover" )){ $( "#translations" ).removeClass("hover"); } else { $('#basket,#account,#display_currency,#languagebox').removeClass("hover"); $( "#translations" ).addClass("hover"); } } }) $('#display_currency').click(function() { if($( "#display_currency" ).hasClass( "hover" )){ $( "#display_currency" ).removeClass("hover"); } else { $('#languagebox').removeClass("hover"); $( "#display_currency" ).addClass("hover"); } }); $('#languagebox').click(function() { if($( "#languagebox" ).hasClass( "hover" )){ $( "#languagebox" ).removeClass("hover"); } else { $('#display_currency').removeClass("hover"); $( "#languagebox" ).addClass("hover"); } }); } else { $('#display_currency').click(function() { $('#languagebox').removeClass("hover"); }); $('#languagebox').click(function() { $('#display_currency').removeClass("hover"); }); } //move bookmarks to under image on details page $(".addthis_toolbox").appendTo("#main_image_container"); //remove unwanted classes for Ad boxes in right hand column $('#right-col .fws-product-group-box').removeClass("large-4 small-12 small-text-left columns"); $('#right-col .fws-product-group-box').addClass("row"); //toggle categories on mobile $('#cat-btn').click(function() { $( "#category-nav" ).slideToggle( "fast" ); $( "#category-nav" ).removeClass('show-for-medium-up'); }); //move main nav items off canvas for mobiles $(".left-off-canvas-toggle").click(function(){ $( "#left-nav" ).appendTo( $( ".left-off-canvas-menu" ) ); $( "#left-nav" ).addClass('off-canvas-list'); }); function moveRightNav(){ if ($(window).width() <= 640) { $( "#right-nav" ).appendTo( $( "#navformobile" ) ); } } $( "#ctl49_lnkCancel, #ctl49_lnkSend, #ctl22_btnSubmit" ).addClass('button'); $( "#ctl49_lnkCancel, #ctl49_lnkSend, #ctl22_btnSubmit" ).addClass('radius'); //move right nav items for mobiles $(window).resize(function() { moveRightNav(); }); moveRightNav(); }); /* --------------------------------------------------------------------------- FWS Scroll Cue -- "more below" affordance Added 2026-06-19 for support ticket 01KVG0VTAETYN98BVWSQMWJAJ8 (store 32505). Shoppers were phoning in daily because they didn't realise tall category / product / blueprint / page content scrolls. This shows a gentle animated "Scroll for more" chevron plus a soft bottom fade ONLY when the page actually overflows the viewport. It auto-dismisses on the first scroll (or after a few seconds), never blocks taps/clicks, and respects reduced-motion settings. Self-contained vanilla JS + injected CSS -- no dependency on jQuery/Foundation. TOGGLE: set CONFIG.enabled = false below (then re-upload this file) to turn it off store-wide. For ad-hoc testing without a redeploy: append ?nocue=1 to any URL, or run localStorage.setItem('fwsNoScrollCue','1') in the browser console. --------------------------------------------------------------------------- */ (function () { var CONFIG = { enabled: true, // <-- master on/off toggle for this store's design minOverflowPx: 120, // only cue when content runs this far past the fold hideAfterMs: 7000, // auto-dismiss after this long if untouched scrollHidePx: 40, // dismiss once the shopper scrolls this far label: 'Scroll for more' }; function disabled() { try { if (!CONFIG.enabled) return true; if (/[?&]nocue=1(?:&|$)/.test(location.search)) return true; if (window.localStorage && localStorage.getItem('fwsNoScrollCue') === '1') return true; } catch (e) {} return false; } function init() { if (disabled()) return; if (document.getElementById('fws-scroll-cue')) return; // guard against double init var reduceMotion = false; try { reduceMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches; } catch (e) {} // ---- styles (scoped by id, won't clash with the Foundation theme) ---- var css = '' + '#fws-scroll-cue{position:fixed;left:50%;bottom:18px;transform:translateX(-50%) translateY(8px);' + 'z-index:9998;display:flex;flex-direction:column;align-items:center;gap:1px;' + 'padding:7px 16px;margin:0;border:0;border-radius:24px;cursor:pointer;' + 'font:600 13px/1.2 "Open Sans",Arial,sans-serif;color:#fff;background:rgba(20,20,20,.80);' + 'box-shadow:0 4px 14px rgba(0,0,0,.28);opacity:0;visibility:hidden;' + 'transition:opacity .35s ease,transform .35s ease;-webkit-tap-highlight-color:transparent;}' + '#fws-scroll-cue.fws-cue-show{opacity:1;visibility:visible;transform:translateX(-50%) translateY(0);}' + '#fws-scroll-cue .fws-cue-arrow{font-size:17px;line-height:1;display:block;}' + (reduceMotion ? '' : '#fws-scroll-cue.fws-cue-show .fws-cue-arrow{animation:fwsCueBounce 1.6s ease-in-out infinite;}') + '@keyframes fwsCueBounce{0%,100%{transform:translateY(0);}50%{transform:translateY(5px);}}' + '#fws-scroll-scrim{position:fixed;left:0;right:0;bottom:0;height:90px;z-index:9997;pointer-events:none;' + 'background:linear-gradient(to bottom,rgba(255,255,255,0),rgba(255,255,255,.85));' + 'opacity:0;transition:opacity .35s ease;}' + '#fws-scroll-scrim.fws-cue-show{opacity:1;}' + '@media print{#fws-scroll-cue,#fws-scroll-scrim{display:none!important;}}'; var style = document.createElement('style'); style.id = 'fws-scroll-cue-style'; style.appendChild(document.createTextNode(css)); document.head.appendChild(style); // ---- elements ---- var scrim = document.createElement('div'); scrim.id = 'fws-scroll-scrim'; scrim.setAttribute('aria-hidden', 'true'); var cue = document.createElement('button'); cue.id = 'fws-scroll-cue'; cue.type = 'button'; cue.setAttribute('aria-hidden', 'true'); // decorative; native scroll already works for AT/keyboard cue.setAttribute('tabindex', '-1'); cue.innerHTML = '' + CONFIG.label + '' + ''; document.body.appendChild(scrim); document.body.appendChild(cue); var shown = false, dismissed = false, hideTimer = null; function overflowPx() { var doc = document.documentElement; return Math.max(doc.scrollHeight, document.body.scrollHeight) - window.innerHeight; } function scrollY() { return window.pageYOffset || document.documentElement.scrollTop || 0; } function show() { if (shown || dismissed) return; if (overflowPx() <= CONFIG.minOverflowPx) return; // short page: nothing to cue if (scrollY() > CONFIG.scrollHidePx) return; // already scrolled: no need shown = true; cue.classList.add('fws-cue-show'); scrim.classList.add('fws-cue-show'); hideTimer = window.setTimeout(dismiss, CONFIG.hideAfterMs); } function dismiss() { if (dismissed) return; dismissed = true; if (hideTimer) { window.clearTimeout(hideTimer); hideTimer = null; } cue.classList.remove('fws-cue-show'); scrim.classList.remove('fws-cue-show'); window.removeEventListener('scroll', onScroll); window.setTimeout(function () { // remove after the fade so nothing lingers if (cue.parentNode) cue.parentNode.removeChild(cue); if (scrim.parentNode) scrim.parentNode.removeChild(scrim); }, 400); } function onScroll() { if (scrollY() > CONFIG.scrollHidePx) dismiss(); } // Clicking the cue nudges the page down ~85% of a screen -- directly helps // the confused shoppers who can't find the scroll. cue.addEventListener('click', function () { var by = Math.round(window.innerHeight * 0.85); try { window.scrollBy({ top: by, left: 0, behavior: reduceMotion ? 'auto' : 'smooth' }); } catch (e) { window.scrollBy(0, by); } dismiss(); }); window.addEventListener('scroll', onScroll, { passive: true }); // Measure after layout/images settle, then decide whether to show. window.setTimeout(show, 600); window.addEventListener('load', function () { window.setTimeout(show, 200); }); } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', init); } else { init(); } })();