/* 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();
}
})();