{"version":3,"sources":["wwwroot/scripts/libs/bootstrap.scrollspy.js","wwwroot/scripts/libs/focus-trap.js","wwwroot/scripts/libs/resize-sensor.js","wwwroot/scripts/libs/jquery.sticky-kit.min.js","wwwroot/scripts/components/sticky-extras.js","wwwroot/scripts/components/form-ajax.js","wwwroot/scripts/components/horizontal-scroller.js","wwwroot/scripts/components/mobile-accordion.js","wwwroot/scripts/components/recently-viewed.js","wwwroot/scripts/templates/product-details/image-zoom.js","wwwroot/scripts/templates/product-details/hero.HeroMediaBase.js","wwwroot/scripts/templates/product-details/hero.ProductImageHero.js","wwwroot/scripts/templates/product-details/hero.CompositeImageHero.js","wwwroot/scripts/templates/product-details/hero.VideoHero.js","wwwroot/scripts/templates/product-details/hero.js","wwwroot/scripts/templates/product-details/selectors.js","wwwroot/scripts/templates/product-details/buy-grid.js","wwwroot/scripts/templates/product-details/product-details.js","wwwroot/scripts/templates/product-details/related-products.js","wwwroot/scripts/events/pdp-events.js"],"names":["$","ScrollSpy","element","options","process","proxy","this","$body","$scrollElement","is","window","extend","DEFAULTS","selector","target","offsets","targets","activeTarget","scrollHeight","on","refresh","Plugin","option","each","$this","data","VERSION","offset","prototype","getScrollHeight","Math","max","document","documentElement","offsetMethod","offsetBase","isWindow","scrollTop","self","find","map","$el","href","attr","$href","test","length","top","sort","a","b","push","i","maxScroll","height","activate","clear","active","parents","addClass","parent","closest","trigger","parentsUntil","removeClass","old","fn","scrollspy","Constructor","noConflict","$spy","call","jQuery","f","exports","module","define","amd","global","focusTrap","r","e","n","t","o","c","require","u","Error","code","p","1","activeFocusDelay","trapQueue","tabbable","xtend","activeFocusTraps","activateTrap","trap","activeTrap","pause","trapIndex","indexOf","splice","deactivateTrap","unpause","delay","setTimeout","userOptions","doc","container","querySelector","config","returnFocusOnDeactivate","escapeDeactivates","state","firstTabbableNode","lastTabbableNode","nodeFocusedBeforeActivation","mostRecentlyFocusedNode","paused","activateOptions","updateTabbableNodes","activeElement","onActivate","addListeners","deactivate","removeListeners","deactivateOptions","clearTimeout","onDeactivate","undefined","returnFocus","previousActiveElement","tryFocus","getNodeForOption","getInitialFocusNode","addEventListener","checkFocusIn","checkPointerDown","capture","passive","checkClick","checkKey","removeEventListener","optionName","optionValue","node","contains","clickOutsideDeactivates","isFocusable","allowOutsideClick","preventDefault","Document","stopImmediatePropagation","key","keyCode","isEscapeEvent","isTabEvent","shiftKey","checkTab","tabbableNodes","focus","tagName","toLowerCase","select","isSelectableInput","2","candidateSelectors","candidateSelector","join","matches","Element","msMatchesSelector","webkitMatchesSelector","el","candidate","candidateTabindex","regularTabbables","orderedTabbables","candidates","querySelectorAll","includeContainer","Array","slice","apply","unshift","isNodeMatchingSelectorTabbable","getTabindex","documentOrder","tabIndex","sortOrderedTabbables","concat","isNodeMatchingSelectorFocusable","isInput","type","isRadio","name","checked","nodes","getCheckedRadio","ownerDocument","isTabbableRadio","isNonTabbableRadio","disabled","isHiddenInput","offsetParent","getComputedStyle","visibility","isHidden","isTabbable","focusableCandidateSelector","tabindexAttr","parseInt","getAttribute","isNaN","contentEditable","isContentEditable","3","arguments","source","hasOwnProperty","Object","ResizeSensor","callback","EventQueue","j","q","add","ev","attachResizeEvent","resized","resizedAttached","resizeSensor","createElement","className","style","styleChild","cssText","innerHTML","appendChild","fixed","absolute","prop","currentStyle","getPropertyValue","position","lastWidth","lastHeight","expand","childNodes","expandChild","shrink","reset","width","offsetWidth","offsetHeight","scrollLeft","scrollWidth","changed","addEvent","cb","attachEvent","toString","Elements","k","stick_in_parent","d","v","y","h","C","s","G","H","sticky_class","inner_scrolling","recalc_every","offset_top","spacer","bottoming","z","D","E","F","m","A","B","w","x","g","css","l","insertAfter","detach","bottom","outerHeight","outerWidth","display","vertical-align","float","min","after","append","off","body","removeData","remove","loadSticky","resizeTimer","$stickyElement","isSticky","detectSticky","evo","mq","screenSmMin","stickyOffset","Modernizr","touch","$form","valid","ajax","url","serialize","done","response","responseElement","html","validator","unobtrusive","parse","continuousScroll","$container","$direction","$easing","$speed","$fullScrollLength","children","$scrollPosition","$scrollSpeed","$scrollDistance","animate","stopScroll","stop","hoverScroll","$parent","$arrowRight","$arrowLeft","productThumbWidth","hasClass","hover","mobileAccordion","args","contentSelector","desktopAccordion","next","slideToggle","toggleClass","STORAGE_KEY","selectors","recentlyViewedProductPages","storage","getItem","productPageId","dataLoadUrl","isResultsPage","productPagesToShow","setItem","cache","param","ProductPageIds","method","isCanadaMode","includes","minis","recentlyViewedProduct","RelativePath","$link","ImageUrl","Name","dataLayerManager","pushProductClick","ProductId","impressions","brand","Brand","isOutlet","IsOutlet","marketingPrice","MarketingPrice","price","Price","Minimum","category","CoreTaxonomyNodePath","id","_uniqueId","pushImpressions","fail","console","warn","getValueOrResult","property","getMousePos","posx","posy","event","pageX","pageY","clientX","clientY","originalEvent","touches","changedTouches","getRelativeMousePos","absPos","elOrigin","left","getRelativeZoomLocation","relativeMousePos","zoomElement","getRel","zoomSize","heroSize","mousePos","showImageLocation","$zoomImage","topRatio","leftRatio","zoomWidth","productZoom","$image","existingData","zoomPath","defaults","pz","$zoomContainer","$heroContainer","containerSelector","zoomActive","zoomClosing","dragging","dragStartMousePosX","dragStartMousePosY","toggle","zoomOnHover","zoom","alert","before","zoomTemplate","close","scrollLeftAmount","scrollTopAmount","opacity","duration","easing","complete","one","prependTo","padding","zoomLoc","closeZoomTimeout","bindEventsToZoomElements","fadeTo","HeroMediaBase","imgCount","heroMediaBase","$mediaElement","that","$alternateImage","displayUtilities","$dot","replace","click","siblings","filter","removeAttr","ProductImageHero","productImageHero","imageInfo","imagesByProductImageId","AlternateImageUrl","create","constructor","$heroImageContainer","load","HeroImageUrl","ZoomImageUrl","EnlargeImageUrl","sizeShown","SizeShown","ProductImageId","ModelInfo","CompositeImageHero","CompositeImageInfo","Rectangle","dx","dy","sourceImageSize","componentLayouts","4","workspaceCanvas","workspaceContext","getContext","compositeImageInfo","canvas","ctx","resizeCanvas","targetSize","newSize","fillStyle","fillRect","drawImage","updateImageInfo","componentImages","imageMatrixLookup","matrixRow","matrixOptionId","img","imagesByMatrixOptionId","layout","rect","toDataURL","compositeImageHero","modal","updateImage","VideoHero","videoHero","videoUrl","error","videoSource","buildVideoUrl","initializeAltContainer","$altImageContainer","$altImageInner","$altThumb","$arrowDown","$arrowUp","heroHeight","altThumbsHeight","eq","scrollDistance","scrollSpeed","heroInteraction","$dotContainer","imageComingSoonSelected","size","matrix","minSequence","Number","MAX_VALUE","Sequence","imageDeferreds","newImagesByMatrixOptionId","imgInfo","Image","def","Deferred","onload","resolve","crossOrigin","src","when","then","isFunction","initializeForCompositeImages","firstVisibleHero","heroMedia","heroArrowsCheck","$matrixOptionBtn","matrixRowNumber","prevAll","$imageAssets","matrixOptionSelector","row","optId","not","firstVisibleHeroMedia","first","nextDot","activeDot","visibleDots","nextAll","touchStartX","touchEndX","touchStartY","touchEndY","isSwiping","heroArrowsNeeded","screenX","screenY","deltaX","deltaY","abs","delta","stopPropagation","imageId","modelInfo","attributes","dt","dd","col1","col2","clone","midpoint","ceil","$sizeShownContainer","empty","hash","index","imageToSelect","substring","targetImageButton","has","location","matrixSelectors","items","selectionUpdated","noop","$allMatrixOptions","$allMatrices","$matrix","itemIdsByProductId","skuRegex","RegExp","getSelectedOptions","getUniqueItemIds","$matrixOptions","selectedItemIdsByProductId","productId","itemIds","split","intersect","updateMatrixSelection","$selectedMatrixOption","$relativeMatrixOption","$selectedDescription","selectionDisplay","val","hide","updateConditionalDisplay","groupName","selectedOption","enabledOptions","disabledOptions","thisValue","thisDisplayKey","optionsToShow","optionsToHide","merge","show","updateSelectedItemsDisplay","eventType","$selectedOptions","$originator","uniqueItemIdsByProductId","matrixProductId","matrixSelector","$theseOptions","otherUniqueItemIdsByProductId","productIdSelector","optionsNeedEnabling","optionsNeedDisabling","names","get","selectedItemIds","components","component","availability","displayType","estimatedShipDate","Date","isInCollection","minPrice","maxPrice","MIN_VALUE","minMarketingPrice","maxMarketingPrice","minPriceStatus","maxPriceStatus","item","Availability","DisplayType","EstimatedShipDate","IsInCollection","PriceStatus","finalResult","priceStatusOrder","itemId","exec","SKU","$matrixOptionButtons","hoverEvent","$option","selectedItems","$selectedSibling","availableOptions","$displayPanels","productType","countdownExpired","formatNumberToCurrency","num","numeral","format","createPriceSpan","priceStatus","includeStatus","priceClass","$priceSpan","calculatePriceStatus","percentSavings","round","componentItems","itemInfo","result","isolatedItemId","mashupItem","ItemId","selectedItem","modifiedSKU","elements","dataLayerProduct","dimension1","variant","Color","MarketingPriceRange","selloutRisk","SelloutRisk","imageUrl","pushDetailView","childSku","origPriceDisplay","selectedItemId","packageModal","packageBuilder","displayPanelsToShow","compatibilityButton","shippingTimeMessaging","getUTCMonth","getUTCDate","getUTCFullYear","affirmDisplay","getElementById","isMacDevice","navigator","userAgent","isTouchDevice","maxTouchPoints","displayPrice","fixedDisplayPrice","toFixed","affirm","ui","ready","updateAffirmUI","isMobile","$reviewsAccordionHeader","customRadio","allItemIds","keys","keydown","which","indexOfPeriod","value","amount","trim","action","getNamedItem","productName","modalHeader","modalSubheader","pushCompatibleBindingsClick","$loadingFeedback","$dynamicModal","generateModalTemplate","always","skusByItemIds","JSON","customComponentItems","prices","selectedPrice","quantity","hazmatId","parseFloat","addToCartAction","json","BrandName","CanadianOverridePrice","CoreTaxonomyNodeId","Quantity","componentItemIds","groupedComponentIds","mashupComponentItem","stringify","success","errors","$validationMessages","required","match","checkedCount","enabledCount","$opt","text","getBoundingClientRect","originalHref","$reviewHeader","anchorNavOffset","scrollToID","registerPageViewUrl","post","dataURL","callbackFn","tracking","setCategory","setActions","bc","ql","rv","aiv","bga","bge","bgs","sab","spb","spp","spr","sps","acmb","acms","bindTracking","message","track","childsku","customEvent","detail","dataLayer"],"mappings":"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","file":"productdetails.min.js","sourcesContent":["/* ========================================================================\n * Bootstrap: scrollspy.js v3.3.2\n * http://getbootstrap.com/javascript/#scrollspy\n * ========================================================================\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n+function ($) {\n 'use strict';\n\n // SCROLLSPY CLASS DEFINITION\n // ==========================\n\n function ScrollSpy(element, options) {\n var process = $.proxy(this.process, this)\n\n this.$body = $('body')\n this.$scrollElement = $(element).is('body') ? $(window) : $(element)\n this.options = $.extend({}, ScrollSpy.DEFAULTS, options)\n this.selector = (this.options.target || '') + ' .nav li > a'\n this.offsets = []\n this.targets = []\n this.activeTarget = null\n this.scrollHeight = 0\n\n this.$scrollElement.on('scroll.bs.scrollspy', process)\n this.refresh()\n this.process()\n }\n\n ScrollSpy.VERSION = '3.3.2'\n\n ScrollSpy.DEFAULTS = {\n offset: 10\n }\n\n ScrollSpy.prototype.getScrollHeight = function () {\n return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight)\n }\n\n ScrollSpy.prototype.refresh = function () {\n var offsetMethod = 'offset'\n var offsetBase = 0\n\n if (!$.isWindow(this.$scrollElement[0])) {\n offsetMethod = 'position'\n offsetBase = this.$scrollElement.scrollTop()\n }\n\n this.offsets = []\n this.targets = []\n this.scrollHeight = this.getScrollHeight()\n\n var self = this\n\n this.$body\n .find(this.selector)\n .map(function () {\n var $el = $(this)\n var href = $el.data('target') || $el.attr('href')\n var $href = /^#./.test(href) && $(href)\n\n return ($href\n && $href.length\n && $href.is(':visible')\n && [[$href[offsetMethod]().top + offsetBase, href]]) || null\n })\n .sort(function (a, b) { return a[0] - b[0] })\n .each(function () {\n self.offsets.push(this[0])\n self.targets.push(this[1])\n })\n }\n\n ScrollSpy.prototype.process = function () {\n var scrollTop = this.$scrollElement.scrollTop() + this.options.offset\n var scrollHeight = this.getScrollHeight()\n var maxScroll = this.options.offset + scrollHeight - this.$scrollElement.height()\n var offsets = this.offsets\n var targets = this.targets\n var activeTarget = this.activeTarget\n var i\n\n if (this.scrollHeight != scrollHeight) {\n this.refresh()\n }\n\n if (scrollTop >= maxScroll) {\n return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)\n }\n\n if (activeTarget && scrollTop < offsets[0]) {\n this.activeTarget = null\n return this.clear()\n }\n\n for (i = offsets.length; i--;) {\n activeTarget != targets[i]\n && scrollTop >= offsets[i]\n && (!offsets[i + 1] || scrollTop <= offsets[i + 1])\n && this.activate(targets[i])\n }\n }\n\n ScrollSpy.prototype.activate = function (target) {\n this.activeTarget = target\n\n this.clear()\n\n var selector = this.selector +\n '[data-target=\"' + target + '\"],' +\n this.selector + '[href=\"' + target + '\"]'\n\n var active = $(selector)\n .parents('li')\n .addClass('active')\n\n if (active.parent('.dropdown-menu').length) {\n active = active\n .closest('li.dropdown')\n .addClass('active')\n }\n\n active.trigger('activate.bs.scrollspy')\n }\n\n ScrollSpy.prototype.clear = function () {\n $(this.selector)\n .parentsUntil(this.options.target, '.active')\n .removeClass('active')\n }\n\n // SCROLLSPY PLUGIN DEFINITION\n // ===========================\n\n function Plugin(option) {\n return this.each(function () {\n var $this = $(this)\n var data = $this.data('bs.scrollspy')\n var options = typeof option == 'object' && option\n\n if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))\n if (typeof option == 'string') data[option]()\n })\n }\n\n var old = $.fn.scrollspy\n\n $.fn.scrollspy = Plugin\n $.fn.scrollspy.Constructor = ScrollSpy\n\n // SCROLLSPY NO CONFLICT\n // =====================\n\n $.fn.scrollspy.noConflict = function () {\n $.fn.scrollspy = old\n return this\n }\n\n // SCROLLSPY DATA-API\n // ==================\n\n $(window).on('load.bs.scrollspy.data-api', function () {\n $('[data-spy=\"scroll\"]').each(function () {\n var $spy = $(this)\n Plugin.call($spy, $spy.data())\n })\n })\n}(jQuery);","/*\nFocus Trap v5.1.0\nGitHub: https://github.com/davidtheclark/focus-trap\nNPM: https://www.npmjs.com/package/focus-trap\nUMD (v5.1.0): https://unpkg.com/focus-trap@5.1.0/dist/focus-trap.js\n*/\n\n(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.focusTrap = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i 0) {\n var activeTrap = trapQueue[trapQueue.length - 1];\n if (activeTrap !== trap) {\n activeTrap.pause();\n }\n }\n\n var trapIndex = trapQueue.indexOf(trap);\n if (trapIndex === -1) {\n trapQueue.push(trap);\n } else {\n // move this existing trap to the front of the queue\n trapQueue.splice(trapIndex, 1);\n trapQueue.push(trap);\n }\n },\n\n deactivateTrap: function(trap) {\n var trapIndex = trapQueue.indexOf(trap);\n if (trapIndex !== -1) {\n trapQueue.splice(trapIndex, 1);\n }\n\n if (trapQueue.length > 0) {\n trapQueue[trapQueue.length - 1].unpause();\n }\n }\n };\n})();\n\nfunction focusTrap(element, userOptions) {\n var doc = document;\n var container =\n typeof element === 'string' ? doc.querySelector(element) : element;\n\n var config = xtend(\n {\n returnFocusOnDeactivate: true,\n escapeDeactivates: true\n },\n userOptions\n );\n\n var state = {\n firstTabbableNode: null,\n lastTabbableNode: null,\n nodeFocusedBeforeActivation: null,\n mostRecentlyFocusedNode: null,\n active: false,\n paused: false\n };\n\n var trap = {\n activate: activate,\n deactivate: deactivate,\n pause: pause,\n unpause: unpause\n };\n\n return trap;\n\n function activate(activateOptions) {\n if (state.active) return;\n\n updateTabbableNodes();\n\n state.active = true;\n state.paused = false;\n state.nodeFocusedBeforeActivation = doc.activeElement;\n\n var onActivate =\n activateOptions && activateOptions.onActivate\n ? activateOptions.onActivate\n : config.onActivate;\n if (onActivate) {\n onActivate();\n }\n\n addListeners();\n return trap;\n }\n\n function deactivate(deactivateOptions) {\n if (!state.active) return;\n\n clearTimeout(activeFocusDelay);\n\n removeListeners();\n state.active = false;\n state.paused = false;\n\n activeFocusTraps.deactivateTrap(trap);\n\n var onDeactivate =\n deactivateOptions && deactivateOptions.onDeactivate !== undefined\n ? deactivateOptions.onDeactivate\n : config.onDeactivate;\n if (onDeactivate) {\n onDeactivate();\n }\n\n var returnFocus =\n deactivateOptions && deactivateOptions.returnFocus !== undefined\n ? deactivateOptions.returnFocus\n : config.returnFocusOnDeactivate;\n if (returnFocus) {\n delay(function() {\n tryFocus(getReturnFocusNode(state.nodeFocusedBeforeActivation));\n });\n }\n\n return trap;\n }\n\n function pause() {\n if (state.paused || !state.active) return;\n state.paused = true;\n removeListeners();\n }\n\n function unpause() {\n if (!state.paused || !state.active) return;\n state.paused = false;\n updateTabbableNodes();\n addListeners();\n }\n\n function addListeners() {\n if (!state.active) return;\n\n // There can be only one listening focus trap at a time\n activeFocusTraps.activateTrap(trap);\n\n // Delay ensures that the focused element doesn't capture the event\n // that caused the focus trap activation.\n activeFocusDelay = delay(function() {\n tryFocus(getInitialFocusNode());\n });\n\n doc.addEventListener('focusin', checkFocusIn, true);\n doc.addEventListener('mousedown', checkPointerDown, {\n capture: true,\n passive: false\n });\n doc.addEventListener('touchstart', checkPointerDown, {\n capture: true,\n passive: false\n });\n doc.addEventListener('click', checkClick, {\n capture: true,\n passive: false\n });\n doc.addEventListener('keydown', checkKey, {\n capture: true,\n passive: false\n });\n\n return trap;\n }\n\n function removeListeners() {\n if (!state.active) return;\n\n doc.removeEventListener('focusin', checkFocusIn, true);\n doc.removeEventListener('mousedown', checkPointerDown, true);\n doc.removeEventListener('touchstart', checkPointerDown, true);\n doc.removeEventListener('click', checkClick, true);\n doc.removeEventListener('keydown', checkKey, true);\n\n return trap;\n }\n\n function getNodeForOption(optionName) {\n var optionValue = config[optionName];\n var node = optionValue;\n if (!optionValue) {\n return null;\n }\n if (typeof optionValue === 'string') {\n node = doc.querySelector(optionValue);\n if (!node) {\n throw new Error('`' + optionName + '` refers to no known node');\n }\n }\n if (typeof optionValue === 'function') {\n node = optionValue();\n if (!node) {\n throw new Error('`' + optionName + '` did not return a node');\n }\n }\n return node;\n }\n\n function getInitialFocusNode() {\n var node;\n if (getNodeForOption('initialFocus') !== null) {\n node = getNodeForOption('initialFocus');\n } else if (container.contains(doc.activeElement)) {\n node = doc.activeElement;\n } else {\n node = state.firstTabbableNode || getNodeForOption('fallbackFocus');\n }\n\n if (!node) {\n throw new Error(\n 'Your focus-trap needs to have at least one focusable element'\n );\n }\n\n return node;\n }\n\n function getReturnFocusNode(previousActiveElement) {\n var node = getNodeForOption('setReturnFocus');\n return node ? node : previousActiveElement;\n }\n\n // This needs to be done on mousedown and touchstart instead of click\n // so that it precedes the focus event.\n function checkPointerDown(e) {\n if (container.contains(e.target)) return;\n if (config.clickOutsideDeactivates) {\n deactivate({\n returnFocus: !tabbable.isFocusable(e.target)\n });\n return;\n }\n // This is needed for mobile devices.\n // (If we'll only let `click` events through,\n // then on mobile they will be blocked anyways if `touchstart` is blocked.)\n if (config.allowOutsideClick && config.allowOutsideClick(e)) {\n return;\n }\n e.preventDefault();\n }\n\n // In case focus escapes the trap for some strange reason, pull it back in.\n function checkFocusIn(e) {\n // In Firefox when you Tab out of an iframe the Document is briefly focused.\n if (container.contains(e.target) || e.target instanceof Document) {\n return;\n }\n e.stopImmediatePropagation();\n tryFocus(state.mostRecentlyFocusedNode || getInitialFocusNode());\n }\n\n function checkKey(e) {\n if (config.escapeDeactivates !== false && isEscapeEvent(e)) {\n e.preventDefault();\n deactivate();\n return;\n }\n if (isTabEvent(e)) {\n checkTab(e);\n return;\n }\n }\n\n // Hijack Tab events on the first and last focusable nodes of the trap,\n // in order to prevent focus from escaping. If it escapes for even a\n // moment it can end up scrolling the page and causing confusion so we\n // kind of need to capture the action at the keydown phase.\n function checkTab(e) {\n updateTabbableNodes();\n if (e.shiftKey && e.target === state.firstTabbableNode) {\n e.preventDefault();\n tryFocus(state.lastTabbableNode);\n return;\n }\n if (!e.shiftKey && e.target === state.lastTabbableNode) {\n e.preventDefault();\n tryFocus(state.firstTabbableNode);\n return;\n }\n }\n\n function checkClick(e) {\n if (config.clickOutsideDeactivates) return;\n if (container.contains(e.target)) return;\n if (config.allowOutsideClick && config.allowOutsideClick(e)) {\n return;\n }\n e.preventDefault();\n e.stopImmediatePropagation();\n }\n\n function updateTabbableNodes() {\n var tabbableNodes = tabbable(container);\n state.firstTabbableNode = tabbableNodes[0] || getInitialFocusNode();\n state.lastTabbableNode =\n tabbableNodes[tabbableNodes.length - 1] || getInitialFocusNode();\n }\n\n function tryFocus(node) {\n if (node === doc.activeElement) return;\n if (!node || !node.focus) {\n tryFocus(getInitialFocusNode());\n return;\n }\n node.focus();\n state.mostRecentlyFocusedNode = node;\n if (isSelectableInput(node)) {\n node.select();\n }\n }\n}\n\nfunction isSelectableInput(node) {\n return (\n node.tagName &&\n node.tagName.toLowerCase() === 'input' &&\n typeof node.select === 'function'\n );\n}\n\nfunction isEscapeEvent(e) {\n return e.key === 'Escape' || e.key === 'Esc' || e.keyCode === 27;\n}\n\nfunction isTabEvent(e) {\n return e.key === 'Tab' || e.keyCode === 9;\n}\n\nfunction delay(fn) {\n return setTimeout(fn, 0);\n}\n\nmodule.exports = focusTrap;\n\n},{\"tabbable\":2,\"xtend\":3}],2:[function(require,module,exports){\nvar candidateSelectors = [\n 'input',\n 'select',\n 'textarea',\n 'a[href]',\n 'button',\n '[tabindex]',\n 'audio[controls]',\n 'video[controls]',\n '[contenteditable]:not([contenteditable=\"false\"])',\n];\nvar candidateSelector = candidateSelectors.join(',');\n\nvar matches = typeof Element === 'undefined'\n ? function () {}\n : Element.prototype.matches || Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector;\n\nfunction tabbable(el, options) {\n options = options || {};\n\n var regularTabbables = [];\n var orderedTabbables = [];\n\n var candidates = el.querySelectorAll(candidateSelector);\n\n if (options.includeContainer) {\n if (matches.call(el, candidateSelector)) {\n candidates = Array.prototype.slice.apply(candidates);\n candidates.unshift(el);\n }\n }\n\n var i, candidate, candidateTabindex;\n for (i = 0; i < candidates.length; i++) {\n candidate = candidates[i];\n\n if (!isNodeMatchingSelectorTabbable(candidate)) continue;\n\n candidateTabindex = getTabindex(candidate);\n if (candidateTabindex === 0) {\n regularTabbables.push(candidate);\n } else {\n orderedTabbables.push({\n documentOrder: i,\n tabIndex: candidateTabindex,\n node: candidate,\n });\n }\n }\n\n var tabbableNodes = orderedTabbables\n .sort(sortOrderedTabbables)\n .map(function(a) { return a.node })\n .concat(regularTabbables);\n\n return tabbableNodes;\n}\n\ntabbable.isTabbable = isTabbable;\ntabbable.isFocusable = isFocusable;\n\nfunction isNodeMatchingSelectorTabbable(node) {\n if (\n !isNodeMatchingSelectorFocusable(node)\n || isNonTabbableRadio(node)\n || getTabindex(node) < 0\n ) {\n return false;\n }\n return true;\n}\n\nfunction isTabbable(node) {\n if (!node) throw new Error('No node provided');\n if (matches.call(node, candidateSelector) === false) return false;\n return isNodeMatchingSelectorTabbable(node);\n}\n\nfunction isNodeMatchingSelectorFocusable(node) {\n if (\n node.disabled\n || isHiddenInput(node)\n || isHidden(node)\n ) {\n return false;\n }\n return true;\n}\n\nvar focusableCandidateSelector = candidateSelectors.concat('iframe').join(',');\nfunction isFocusable(node) {\n if (!node) throw new Error('No node provided');\n if (matches.call(node, focusableCandidateSelector) === false) return false;\n return isNodeMatchingSelectorFocusable(node);\n}\n\nfunction getTabindex(node) {\n var tabindexAttr = parseInt(node.getAttribute('tabindex'), 10);\n if (!isNaN(tabindexAttr)) return tabindexAttr;\n // Browsers do not return `tabIndex` correctly for contentEditable nodes;\n // so if they don't have a tabindex attribute specifically set, assume it's 0.\n if (isContentEditable(node)) return 0;\n return node.tabIndex;\n}\n\nfunction sortOrderedTabbables(a, b) {\n return a.tabIndex === b.tabIndex ? a.documentOrder - b.documentOrder : a.tabIndex - b.tabIndex;\n}\n\nfunction isContentEditable(node) {\n return node.contentEditable === 'true';\n}\n\nfunction isInput(node) {\n return node.tagName === 'INPUT';\n}\n\nfunction isHiddenInput(node) {\n return isInput(node) && node.type === 'hidden';\n}\n\nfunction isRadio(node) {\n return isInput(node) && node.type === 'radio';\n}\n\nfunction isNonTabbableRadio(node) {\n return isRadio(node) && !isTabbableRadio(node);\n}\n\nfunction getCheckedRadio(nodes) {\n for (var i = 0; i < nodes.length; i++) {\n if (nodes[i].checked) {\n return nodes[i];\n }\n }\n}\n\nfunction isTabbableRadio(node) {\n if (!node.name) return true;\n // This won't account for the edge case where you have radio groups with the same\n // in separate forms on the same page.\n var radioSet = node.ownerDocument.querySelectorAll('input[type=\"radio\"][name=\"' + node.name + '\"]');\n var checked = getCheckedRadio(radioSet);\n return !checked || checked === node;\n}\n\nfunction isHidden(node) {\n // offsetParent being null will allow detecting cases where an element is invisible or inside an invisible element,\n // as long as the element does not use position: fixed. For them, their visibility has to be checked directly as well.\n return node.offsetParent === null || getComputedStyle(node).visibility === 'hidden';\n}\n\nmodule.exports = tabbable;\n\n},{}],3:[function(require,module,exports){\nmodule.exports = extend\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\nfunction extend() {\n var target = {}\n\n for (var i = 0; i < arguments.length; i++) {\n var source = arguments[i]\n\n for (var key in source) {\n if (hasOwnProperty.call(source, key)) {\n target[key] = source[key]\n }\n }\n }\n\n return target\n}\n\n},{}]},{},[1])(1)\n});","/**\n * Copyright Marc J. Schmidt. See the LICENSE file at the top-level\n * directory of this distribution and at\n * https://github.com/marcj/css-element-queries/blob/master/LICENSE.\n */\n;\n(function () {\n /**\n * Class for dimension change detection.\n *\n * @param {Element|Element[]|Elements|jQuery} element\n * @param {Function} callback\n *\n * @constructor\n */\n this.ResizeSensor = function (element, callback) {\n /**\n *\n * @constructor\n */\n function EventQueue() {\n this.q = [];\n this.add = function (ev) {\n this.q.push(ev);\n };\n\n var i, j;\n this.call = function () {\n for (i = 0, j = this.q.length; i < j; i++) {\n this.q[i].call();\n }\n };\n }\n\n /**\n * @param {HTMLElement} element\n * @param {String} prop\n * @returns {String|Number}\n */\n function getComputedStyle(element, prop) {\n if (element.currentStyle) {\n return element.currentStyle[prop];\n } else if (window.getComputedStyle) {\n return window.getComputedStyle(element, null).getPropertyValue(prop);\n } else {\n return element.style[prop];\n }\n }\n\n /**\n *\n * @param {HTMLElement} element\n * @param {Function} resized\n */\n function attachResizeEvent(element, resized) {\n if (!element.resizedAttached) {\n element.resizedAttached = new EventQueue();\n element.resizedAttached.add(resized);\n } else if (element.resizedAttached) {\n element.resizedAttached.add(resized);\n return;\n }\n\n element.resizeSensor = document.createElement('div');\n element.resizeSensor.className = 'resize-sensor';\n var style = 'position: absolute; left: 0; top: 0; right: 0; bottom: 0; overflow: scroll; z-index: -1; visibility: hidden;';\n var styleChild = 'position: absolute; left: 0; top: 0;';\n\n element.resizeSensor.style.cssText = style;\n element.resizeSensor.innerHTML =\n '
' +\n '
' +\n '
' +\n '
' +\n '
' +\n '
';\n element.appendChild(element.resizeSensor);\n\n if (!{ fixed: 1, absolute: 1 }[getComputedStyle(element, 'position')]) {\n element.style.position = 'relative';\n }\n\n var expand = element.resizeSensor.childNodes[0];\n var expandChild = expand.childNodes[0];\n var shrink = element.resizeSensor.childNodes[1];\n var shrinkChild = shrink.childNodes[0];\n\n var lastWidth, lastHeight;\n\n var reset = function () {\n expandChild.style.width = expand.offsetWidth + 10 + 'px';\n expandChild.style.height = expand.offsetHeight + 10 + 'px';\n expand.scrollLeft = expand.scrollWidth;\n expand.scrollTop = expand.scrollHeight;\n shrink.scrollLeft = shrink.scrollWidth;\n shrink.scrollTop = shrink.scrollHeight;\n lastWidth = element.offsetWidth;\n lastHeight = element.offsetHeight;\n };\n\n reset();\n\n var changed = function () {\n element.resizedAttached.call();\n };\n\n var addEvent = function (el, name, cb) {\n if (el.attachEvent) {\n el.attachEvent('on' + name, cb);\n } else {\n el.addEventListener(name, cb);\n }\n };\n\n addEvent(expand, 'scroll', function () {\n if (element.offsetWidth > lastWidth || element.offsetHeight > lastHeight) {\n changed();\n }\n reset();\n });\n\n addEvent(shrink, 'scroll', function () {\n if (element.offsetWidth < lastWidth || element.offsetHeight < lastHeight) {\n changed();\n }\n reset();\n });\n }\n\n if (\"[object Array]\" === Object.prototype.toString.call(element)\n || ('undefined' !== typeof jQuery && element instanceof jQuery) //jquery\n || ('undefined' !== typeof Elements && element instanceof Elements) //mootools\n ) {\n var i = 0, j = element.length;\n for (; i < j; i++) {\n attachResizeEvent(element[i], callback);\n }\n } else {\n attachResizeEvent(element, callback);\n }\n }\n})();","/*\n Sticky-kit v1.1.1 | WTFPL | Leaf Corcoran 2014 | http://leafo.net\n*/\n(function(){var k,e;k=this.jQuery||window.jQuery;e=k(window);k.fn.stick_in_parent=function(d){var v,y,n,p,h,C,s,G,q,H;null==d&&(d={});s=d.sticky_class;y=d.inner_scrolling;C=d.recalc_every;h=d.parent;p=d.offset_top;n=d.spacer;v=d.bottoming;null==p&&(p=0);null==h&&(h=void 0);null==y&&(y=!0);null==s&&(s=\"is_stuck\");null==v&&(v=!0);G=function(a,d,q,z,D,t,r,E){var u,F,m,A,c,f,B,w,x,g,b;if(!a.data(\"sticky_kit\")){a.data(\"sticky_kit\",!0);f=a.parent();null!=h&&(f=f.closest(h));if(!f.length)throw\"failed to find stick parent\";\nu=m=!1;(g=null!=n?n&&a.closest(n):k(\"
\"))&&g.css(\"position\",a.css(\"position\"));B=function(){var c,e,l;if(!E&&(c=parseInt(f.css(\"border-top-width\"),10),e=parseInt(f.css(\"padding-top\"),10),d=parseInt(f.css(\"padding-bottom\"),10),q=f.offset().top+c+e,z=f.height(),m&&(u=m=!1,null==n&&(a.insertAfter(g),g.detach()),a.css({position:\"\",top:\"\",width:\"\",bottom:\"\"}).removeClass(s),l=!0),D=a.offset().top-parseInt(a.css(\"margin-top\"),10)-p,t=a.outerHeight(!0),r=a.css(\"float\"),g&&g.css({width:a.outerWidth(!0),\nheight:t,display:a.css(\"display\"),\"vertical-align\":a.css(\"vertical-align\"),\"float\":r}),l))return b()};B();if(t!==z)return A=void 0,c=p,x=C,b=function(){var b,k,l,h;if(!E&&(null!=x&&(--x,0>=x&&(x=C,B())),l=e.scrollTop(),null!=A&&(k=l-A),A=l,m?(v&&(h=l+t+c>z+q,u&&!h&&(u=!1,a.css({position:\"fixed\",bottom:\"\",top:c}).trigger(\"sticky_kit:unbottom\"))),lb&&!u&&(c-=k,c=Math.max(b-t,c),c=Math.min(p,c),m&&a.css({top:c+\"px\"})))):l>D&&(m=!0,b={position:\"fixed\",top:c},b.width=\"border-box\"===a.css(\"box-sizing\")?a.outerWidth()+\"px\":a.width()+\"px\",a.css(b).addClass(s),null==n&&(a.after(g),\"left\"!==r&&\"right\"!==r||g.append(a)),a.trigger(\"sticky_kit:stick\")),m&&v&&(null==h&&(h=l+t+c>z+q),!u&&h)))return u=!0,\"static\"===f.css(\"position\")&&f.css({position:\"relative\"}),a.css({position:\"absolute\",bottom:d,top:\"auto\"}).trigger(\"sticky_kit:bottom\")},\nw=function(){B();return b()},F=function(){E=!0;e.off(\"touchmove\",b);e.off(\"scroll\",b);e.off(\"resize\",w);k(document.body).off(\"sticky_kit:recalc\",w);a.off(\"sticky_kit:detach\",F);a.removeData(\"sticky_kit\");a.css({position:\"\",bottom:\"\",top:\"\",width:\"\"});f.position(\"position\",\"\");if(m)return null==n&&(\"left\"!==r&&\"right\"!==r||a.insertAfter(g),g.remove()),a.removeClass(s)},e.on(\"touchmove\",b),e.on(\"scroll\",b),e.on(\"resize\",w),k(document.body).on(\"sticky_kit:recalc\",w),a.on(\"sticky_kit:detach\",F),setTimeout(b,\n0)}};q=0;for(H=this.length;q\n/// \n\n(function ($) {\n function loadSticky() {\n var $stickyElement = $('.js-sticky-kit'),\n isSticky = false;\n\n //test against the window width and whether or not sticky-kit has been set up.\n function detectSticky() {\n if (evo.$.window.width() >= evo.mq.screenSmMin) {\n if (isSticky === false) {\n $stickyElement.each(function () {\n var $this = $(this),\n stickyOffset = parseInt($this.attr('data-offset-top'));\n\n if (stickyOffset) {\n $this.stick_in_parent({\n offset_top: stickyOffset\n });\n } else {\n $this.stick_in_parent();\n }\n });\n isSticky = true;\n }\n }\n else {\n //remove it for mobile\n if (isSticky === true) {\n $stickyElement.trigger('sticky_kit:detach');\n isSticky = false;\n }\n }\n };\n\n detectSticky();\n //throttle the resize event\n var resizeTimer;\n evo.$.window.on('resize', function (e) {\n clearTimeout(resizeTimer);\n resizeTimer = setTimeout(detectSticky, 250);\n });\n };\n\n //dom ready\n $(function () {\n //detect loading of Power Reviews and recalculate stickyness\n new ResizeSensor($('#wrapper'), function () {\n evo.$.body.trigger(\"sticky_kit:recalc\");\n });\n loadSticky();\n });\n\n // reattach sticky on results-page refresh\n if (!Modernizr.touch) {\n $('#results-page').on('refresh.results', loadSticky);\n }\n})(jQuery);","/// \n/// \n/*\n * Script that listens for form posts that are marked to be ajax submissions\n */\n(function ($) {\n //form submit override to catch forms that should try to submit using ajax instead\n $(document.body).on('submit', 'form.form-ajax', function (e) {\n e.preventDefault();\n var $form = $(this);\n\n //make sure that the form is valid before submitting it\n if (typeof $.fn.valid === 'function' && !$form.valid()) {\n return;\n }\n\n $.ajax({\n url: $form.attr('action'),\n type: $form.attr('method'),\n data: $form.serialize()\n }).done(function (response) {\n var responseElement = $(response);\n\n //if the response is the original posted form, the response is a partial response\n //and we should only update the form content\n if (responseElement.is('form')) {\n $form.html(responseElement.html());\n if ($.validator && $.validator.unobtrusive) {\n $.validator.unobtrusive.parse($form);\n }\n }\n });\n });\n})(jQuery);","(function ($) {\n $.fn.hoverScroll = function (options) {\n var $parent = options.parent,\n $arrowRight = $parent.children('.arrow-right'),\n $arrowLeft = $parent.children('.arrow-left'),\n $container = $(this),\n productThumbWidth = $container.children().width(),\n childCount = $container.children().length,\n parentWidth = $parent.width(),\n scrollWidth = (childCount * productThumbWidth);\n\n // sets CSS class hide scroll bar if scroll bars not needed for touch and non-touch interfaces\n if (scrollWidth <= parentWidth) {\n $parent.addClass('no-scroller');\n }\n\n // Simple hover scrolling effect for non-touch interfaces, relys on modernzr no-touch\n if ($('html').hasClass('no-touch')) {\n $arrowRight.hover(\n function () {\n continuousScroll($container, \"right\", \"linear\", 7);\n },\n function () {\n stopScroll($container);\n }\n );\n $arrowLeft.hover(\n function () {\n continuousScroll($container, \"left\", \"linear\", 7);\n },\n function () {\n stopScroll($container);\n }\n );\n }\n }\n\n function continuousScroll($container, $direction, $easing, $speed) {\n var $elementWidth = $container.children().width(),\n $elementCount = $container.children().length,\n $fullScrollLength = $elementWidth * $elementCount,\n $scrollPosition = $container.scrollLeft();\n\n if ($direction == \"right\") {\n var $scrollDistance = $fullScrollLength - $scrollPosition,\n $scrollSpeed = $speed * $scrollDistance;\n $container.animate({ scrollLeft: $scrollPosition + $scrollDistance }, $scrollSpeed, $easing);\n }\n else {\n var $scrollDistance = $scrollPosition,\n $scrollSpeed = $speed * $scrollDistance;\n $container.animate({ scrollLeft: 0 }, $scrollSpeed, $easing);\n }\n }\n\n function stopScroll($container) {\n $container.stop();\n }\n})(jQuery);","//mobileAccordion\n// Mobile Accordion expand/collaspe toggle and trigger active class to update UI icons\n// Can pass in options to get specific selectors, and optional callback function\n(function ($) {\n $.fn.mobileAccordion = function (args) {\n var options = {\n selector: '.js-mobile-accordion-header',\n contentSelector: '.js-mobile-accordion-content',\n desktopAccordion: false,\n callback: function () { }\n };\n\n $.extend(options, args);\n\n $(this).find('.active').each(function () {\n $(this).next(options.contentSelector).slideToggle(250);\n })\n\n return this.each(function () {\n var $parentSelector = $(this);\n\n $parentSelector.on('click', options.selector, function (e) {\n if (evo.$.window.width() < evo.mq.screenSmMin || options.desktopAccordion) {\n e.stopImmediatePropagation();\n e.preventDefault();\n $(this).toggleClass('active').next(options.contentSelector).slideToggle(250, function () {\n options.callback.call(this);\n });\n }\n });\n });\n };\n})(jQuery);","/// \n/// \n/*\n * PDP component that manages the interactions of the recently viewed products\n */\n(function ($) {\n $(function () {\n const STORAGE_KEY = \"RecentlyViewed\",\n MAX_PRODUCTS_TO_SHOW_ON_PDP = 6, // need to add one because we slice the array of items from index 0 later on\n MAX_PRODUCTS_TO_SHOW_ON_RESULTS = 5,\n MAX_PRODUCTS_TO_STORE = 40, // max number of products kept in storage and number shown on standalone page\n selectors = {\n outerContainer: \"#results-recently-viewed-container\",\n container: \"#breadcrumb-recent-mini-container\",\n miniList: \"#recent-minis\",\n recentText: \"#recent-text\",\n },\n recentlyViewedProductPages = evo.storage.getItem(STORAGE_KEY) || [],\n $container = $(selectors.container),\n productPageId = $container.attr(\"data-product-page-id\"),\n dataLoadUrl = $container.attr(\"data-load-url\");\n\n // if there's no data load URL then we can't do anything\n if (typeof dataLoadUrl === \"undefined\") {\n return;\n }\n\n const isResultsPage = typeof productPageId === \"undefined\";\n let productPagesToShow;\n\n if (isResultsPage) {\n // include last-seen product on results pages\n recentlyViewedProductPages.length = Math.min(\n recentlyViewedProductPages.length,\n MAX_PRODUCTS_TO_SHOW_ON_RESULTS,\n );\n productPagesToShow = recentlyViewedProductPages.slice(\n 0,\n recentlyViewedProductPages.length,\n );\n } else {\n // add current page id to storage and remove any duplicates, only unshift if the product page ID isn't undefined\n recentlyViewedProductPages.unshift(productPageId);\n for (var i = 1; i < recentlyViewedProductPages.length; i++) {\n if (recentlyViewedProductPages[i] === productPageId) {\n recentlyViewedProductPages.splice(i, 1);\n break;\n }\n }\n // ensure the list of ids doesn't get too big\n recentlyViewedProductPages.length = Math.min(\n recentlyViewedProductPages.length,\n MAX_PRODUCTS_TO_STORE,\n );\n evo.storage.setItem(STORAGE_KEY, recentlyViewedProductPages);\n\n // Trim pages array to number of items shown on PDP\n recentlyViewedProductPages.length = Math.min(\n recentlyViewedProductPages.length,\n MAX_PRODUCTS_TO_SHOW_ON_PDP,\n );\n\n productPagesToShow = recentlyViewedProductPages.slice(\n 1,\n recentlyViewedProductPages.length,\n );\n }\n\n if (productPagesToShow.length === 0) {\n return;\n }\n\n $.ajax({\n cache: false,\n data: $.param({ProductPageIds: productPagesToShow}, true),\n method: \"GET\",\n url: dataLoadUrl,\n })\n .done(function (response) {\n const isCanadaMode = dataLoadUrl.includes(\"/en-ca\");\n const minis = response.map((recentlyViewedProduct) => {\n const href = isCanadaMode\n ? `/en-ca${recentlyViewedProduct.RelativePath}`\n : recentlyViewedProduct.RelativePath;\n const $link = $(\n `` +\n `\"${recentlyViewedProduct.Name}\"/` +\n ``,\n );\n\n $link.on('click', function (e) {\n window.dataLayerManager.pushProductClick(recentlyViewedProduct.ProductId);\n });\n\n return $link;\n });\n\n // show the container if there are recently viewed items\n if (minis.length) {\n $(selectors.miniList).append(minis).css(\"visibility\", \"visible\");\n $(selectors.container).css(\"visibility\", \"visible\");\n $(selectors.outerContainer).css(\"display\", \"flex\");\n $(selectors.recentText).css(\"visibility\", \"visible\");\n const impressions = response.map((recentlyViewedProduct) => {\n return {\n brand: recentlyViewedProduct.Brand,\n isOutlet: recentlyViewedProduct.IsOutlet,\n marketingPrice: recentlyViewedProduct.MarketingPrice,\n name: recentlyViewedProduct.Name,\n price: recentlyViewedProduct.Price.Minimum,\n category: recentlyViewedProduct.CoreTaxonomyNodePath,\n id: recentlyViewedProduct.ProductId,\n _uniqueId: recentlyViewedProduct.ProductId,\n }\n });\n window.dataLayerManager.pushImpressions(impressions, 'Recently Viewed - ' + (isResultsPage ? 'results' : 'PDP'), true);\n }\n })\n .fail(function () {\n console.warn(\n \"There was an error loading the recently viewed component\",\n );\n });\n });\n})(jQuery);\n","/// Image Zoom plugin for jQuery\n(function ($) {\n $.fn.productZoom = function (args) {\n var $image = $(this);\n\n var existingData = $image.data('evo.productZoom');\n if (existingData) {\n if (existingData.options.zoomPath != args.zoomPath) {\n existingData.options.zoomPath = args.zoomPath;\n existingData.$zoomImage.attr('src', getValueOrResult(args.zoomPath));\n }\n return;\n }\n\n var options = $.extend({}, $.fn.productZoom.defaults, args);\n\n if (!options.zoomPath) {\n alert(\"Please specify 'zoomPath'\");\n return;\n }\n\n var pz = {\n options: options,\n $image: $image,\n $zoomContainer: $(),\n $zoomImage: $(),\n $heroContainer: $image.closest(options.containerSelector),\n zoomActive: false,\n zoomClosing: false,\n dragging: false,\n dragStartMousePosX: 0,\n dragStartMousePosY: 0\n };\n\n $image.data('evo.productZoom', pz);\n\n var initZoom = function (e) {\n var $this = $(this),\n data = $this.data('evo.productZoom');\n\n if (!data.zoomActive) {\n $this.productZoom.zoom.call(this, e);\n }\n };\n\n $image.on('click', $.fn.productZoom.toggle);\n if (pz.options.zoomOnHover === true) {\n $image.on('mouseenter', initZoom);\n }\n };\n\n $.fn.productZoom.defaults = {\n containerSelector: '.js-hero-zoom-container',\n before: null, //trigger before zoom sets up\n after: null, // trigger after zoom sets up\n zoomPath: null, //required path to zoom image cound be function\n zoomOnHover: false,\n zoomTemplate: '
\\\n
\\\n \"Closeup\\\n
'\n };\n\n $.fn.productZoom.close = function () {\n var data = $(this).data('evo.productZoom');\n if (!data || data.zoomClosing || !data.zoomActive) {\n return;\n }\n\n data.zoomClosing = true;\n $('body').off('touchend mouseup');\n\n var scrollLeftAmount = (data.$zoomImage.outerWidth() - data.$zoomContainer.width()) / 2,\n scrollTopAmount = (data.$zoomImage.outerHeight() - data.$zoomContainer.height()) / 2;\n\n data.$image.css('visibility', '');\n data.$zoomContainer.animate({\n 'scrollLeft': scrollLeftAmount,\n 'scrollTop': scrollTopAmount,\n 'opacity': 0\n },\n {\n duration: 350,\n easing: 'swing',\n complete: function () {\n $('.pdp-zoom-image', data.$heroContainer).removeClass('loaded');\n data.$zoomContainer.remove();\n $('.pdp-zoom-close', data.$heroContainer).remove();\n data.zoomActive = false;\n data.zoomClosing = false;\n }\n });\n };\n\n $.fn.productZoom.zoom = function (e) {\n var data = $(this).data(\"evo.productZoom\");\n if (!data || data.zoomActive) {\n return;\n }\n\n data.zoomActive = true;\n\n if (typeof data.options.before === \"function\") {\n data.options.before.call(this);\n }\n\n var zoomPath = getValueOrResult(data.options.zoomPath),\n zoomTemplate = getValueOrResult(data.options.zoomTemplate);\n\n // add zoom template and set image path\n data.$heroContainer.append(zoomTemplate);\n data.$zoomContainer = data.$heroContainer.find(\".pdp-zoom\");\n data.$zoomImage = data.$heroContainer.find(\".pdp-zoom-image\");\n\n // hide the close button if touch is not enabled\n // it interferes with usability on desktop\n // using js because css touch detection is not widely supported\n if (!Modernizr.touch) {\n $(\".pdp-zoom-close\", data.$heroContainer).remove();\n }\n data.$zoomImage\n .one(\"load\", function () {\n // iOS Hack. Not sure exactly what the cause is, but without\n // removing and re-adding $zoomContainer, iOS users cannot scroll\n // the zoomed image on the first load.\n if (Modernizr.touch) {\n data.$zoomContainer.remove().prependTo(data.$heroContainer);\n }\n\n data.$zoomContainer.removeClass(\"loading\");\n data.$zoomImage.addClass(\"loaded\").css({\n opacity: 0.0,\n padding: \"10%\",\n });\n\n var mousePos = e && getRelativeMousePos(e, data.$image),\n zoomLoc =\n mousePos && getRelativeZoomLocation(mousePos, data.$zoomImage);\n\n if (zoomLoc && !isNaN(zoomLoc.x)) {\n showImageLocation(\n data.$zoomImage,\n data.$zoomContainer,\n zoomLoc.x,\n zoomLoc.y,\n );\n } else {\n showImageLocation(\n data.$zoomImage,\n data.$zoomContainer,\n data.$zoomImage.width() / 2,\n data.$zoomImage.height() / 2,\n );\n }\n\n bindEventsToZoomElements(data);\n data.$zoomImage.fadeTo(350, 1, function () {\n if (data.$zoomContainer.length && !data.zoomClosing) {\n data.$image.css(\"visibility\", \"hidden\");\n if (typeof data.options.after === \"function\") {\n data.options.after.call(this);\n }\n }\n });\n })\n .attr(\"src\", zoomPath)\n .attr(\"alt\", data.$image.attr(\"alt\"));\n };\n\n $.fn.productZoom.toggle = function (e) {\n var data = $(this).data('evo.productZoom');\n if (!data) {\n return;\n }\n if (data.zoomActive) {\n $(this).productZoom.close.call(this, e);\n }\n else {\n $(this).productZoom.zoom.call(this, e);\n }\n };\n\n // helper method to get value from function or property value\n function getValueOrResult(property) {\n if (typeof property === 'function') {\n return property.call(this);\n } else {\n return property;\n };\n };\n\n // helper method to get mouse (or finger) position relative to page\n function getMousePos(e) {\n var posx;\n var posy;\n if (!e) var e = window.event;\n if (e.pageX || e.pageY) {\n posx = e.pageX;\n posy = e.pageY;\n }\n else if (e.clientX || e.clientY) {\n posx = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;\n posy = e.clientY + document.body.scrollTop + document.documentElement.scrollTop;\n }\n else if (e.originalEvent && e.originalEvent.touches) {\n if (e.originalEvent.touches.length) {\n posx = e.originalEvent.touches[0].pageX;\n posy = e.originalEvent.touches[0].pageY;\n }\n else {\n posx = e.originalEvent.changedTouches[0].pageX;\n posy = e.originalEvent.changedTouches[0].pageY;\n }\n }\n return {\n 'x': posx,\n 'y': posy\n };\n };\n\n // helper method to get mouse (or finger) position relative to element\n function getRelativeMousePos(e, element) {\n e = e || window.event;\n var $el = $(element || e.target),\n absPos = getMousePos(e),\n elOrigin = $el.offset();\n\n return {\n '$el': $el,\n 'x': absPos.x - elOrigin.left,\n 'y': absPos.y - elOrigin.top\n };\n };\n\n // helper method to translate hero position to zoom image position\n function getRelativeZoomLocation(relativeMousePos, zoomElement) {\n if (!relativeMousePos) return null;\n\n var getRel = function (zoomSize, heroSize, mousePos) {\n return mousePos * (zoomSize / heroSize)\n };\n\n return {\n 'x': getRel($(zoomElement).outerWidth(), relativeMousePos.$el.width(), relativeMousePos.x),\n 'y': getRel($(zoomElement).outerHeight(), relativeMousePos.$el.height(), relativeMousePos.y)\n };\n }\n\n // helper method to display specific part of zoomed image\n function showImageLocation($zoomImage, $container, x, y) {\n if (!isNaN(x) && !isNaN(y)) {\n var topRatio = y / $zoomImage.outerHeight(),\n leftRatio = x / $zoomImage.outerWidth(),\n zoomWidth = $container.width(),\n zoomHeight = $container.height(),\n top = y - (zoomHeight * topRatio),\n left = x - (zoomWidth * leftRatio);\n\n $container.scrollLeft(left);\n $container.scrollTop(top);\n }\n };\n\n // helper method to bind hide / show / move events\n function bindEventsToZoomElements(data) {\n if (!data) return;\n\n // log touch / click location to check if position changes\n data.$zoomContainer.on('touchstart mousedown', function (e) {\n data.dragging = true;\n var mousePos = getMousePos(e);\n data.dragStartMousePosX = mousePos.x;\n data.dragStartMousePosY = mousePos.y;\n });\n data.$zoomContainer.on('touchend mouseup', function (e) {\n var mousePos = getMousePos(e);\n if (mousePos.x == data.dragStartMousePosX && mousePos.y == data.dragStartMousePosY) {\n data.$image.productZoom.close.call(data.$image[0]);\n }\n });\n $('body').on('touchend mouseup', function (e) {\n if (!data.dragging) {\n data.$image.productZoom.close.call(data.$image[0]);\n $('body').off('touchend mouseup');\n }\n data.dragging = false;\n });\n //close with the escape key\n $(window).on('keyup', function (e) {\n if (e.keyCode === 27) {\n data.$image.productZoom.close.call(data.$image[0]);\n $(window).off('keyup');\n }\n });\n\n if (!Modernizr.touch) {\n var closeZoomTimeout = 0;\n data.$zoomContainer.on('mousemove', function (e) {\n var pos = getRelativeMousePos(e, data.$zoomContainer),\n zoomLoc = getRelativeZoomLocation(pos, data.$zoomImage);\n showImageLocation(data.$zoomImage, data.$zoomContainer, zoomLoc.x, zoomLoc.y);\n window.clearTimeout(closeZoomTimeout);\n });\n if (data.options.zoomOnHover === true) {\n data.$zoomContainer.on('mouseleave', function (e) {\n closeZoomTimeout = window.setTimeout(function () {\n data.$image.productZoom.close.call(data.$image[0]);\n }, 400);\n });\n }\n }\n };\n})(jQuery);","/*\n * Base class for all PDP hero media wrapper types\n */\nvar HeroMediaBase = (function ($) {\n var selectors = {\n utilities: '.js-pdp-hero-utilities'\n },\n imgCount = 0;\n var heroMediaBase = function ($container, $mediaElement) {\n /// \n /// Constructor for HeroMediaBase objects\n /// \n /// The jquery wrapper of the hero image container div\n /// The jquery wrapper of the hero image/iframe element\n\n var that = this;\n\n //save the image object into data for later use\n $mediaElement.data('hero-media', that);\n\n that.$alternateImage = $('')\n .append('\"Product');\n that.$container = $container;\n that.displayUtilities = true;\n that.$dot = $('');\n\n that.$alternateImage.find('img').attr('alt', $mediaElement.attr('alt'));\n that.$alternateImage.add(that.$dot)\n .addClass($mediaElement.attr('class').replace('pdp-hero-image', ''))\n .click(function () {\n //Only perform the select if this element is not already active\n if (!$(this).hasClass('active')) {\n that.select();\n }\n });\n that.$mediaElement = $mediaElement;\n };\n\n heroMediaBase.prototype.select = function () {\n /// \n /// Selects this hero media by activating all of its elements and\n /// deselecting other elements not belonging to this hero\n /// \n var that = this;\n\n that.$alternateImage.add(that.$dot).add(that.$mediaElement)\n .addClass('active')\n .siblings('.active').removeClass('active')\n //if there is an active video, turn it off by removing the src attribute\n .filter('iframe[src]').removeAttr('src');\n that.$container.find(selectors.utilities).toggleClass('invisible', !that.displayUtilities);\n };\n\n return heroMediaBase;\n}(jQuery));","/// \n/// \n/*\n * PDP hero wrapper for standard product images\n */\nvar ProductImageHero = (function ($) {\n var selectors = {\n enlargeLink: '.js-pdp-hero-enlarge-link',\n heroContainer: '.js-pdp-hero-container',\n modelInfoLink: '.js-pdp-hero-model-info-link',\n sizeShownInfo: '.js-pdp-hero-size-shown'\n };\n var productImageHero = function ($container, $mediaElement) {\n /// \n /// Constructor for ProductImageHero objects\n /// \n /// The jquery wrapper of the hero image container div\n /// The jquery wrapper of the hero image/iframe element\n var that = this;\n\n HeroMediaBase.call(that, $container, $mediaElement);\n that.imageInfo = imagesByProductImageId[$mediaElement.data('imageid')];\n that.$alternateImage.children('img').attr('src', that.imageInfo.AlternateImageUrl);\n };\n\n productImageHero.prototype = Object.create(HeroMediaBase.prototype);\n productImageHero.prototype.constructor = productImageHero;\n\n productImageHero.prototype.select = function () {\n var that = this;\n HeroMediaBase.prototype.select.call(that);\n\n //if the image's source isn't set,\n //add some preloading styles, set the source and remove the styles once the image loads\n //a 'src' attribute value of 'data:,' is used as a valid HTML placeholder for an empty img element\n if (!that.$mediaElement.attr('src') || that.$mediaElement.attr('src') === 'data:,') {\n var $heroImageContainer = that.$mediaElement.closest(selectors.heroContainer);\n $heroImageContainer.addClass('loading');\n that.$mediaElement\n .addClass('fade-out')\n .load(function () {\n $heroImageContainer.removeClass('loading');\n that.$mediaElement.removeClass('fade-out');\n })\n .attr('src', that.imageInfo.HeroImageUrl);\n }\n\n //reset the zoom for the current hero image\n that.$mediaElement.productZoom({ zoomPath: that.imageInfo.ZoomImageUrl });\n\n //reset the enlarge link\n that.$container.find(selectors.enlargeLink).attr('href', that.imageInfo.EnlargeImageUrl);\n\n //display/hide the size shown link if we have something to display\n var sizeShown = typeof that.imageInfo.SizeShown === \"undefined\" ? null : that.imageInfo.SizeShown;\n that.$container.find(selectors.sizeShownInfo).toggleClass('hidden', that.imageInfo.SizeShown ? false : true).children('.pdp-size-shown-value').html(sizeShown);\n\n //display/hide the model information link if we have something display\n that.$container.find(selectors.modelInfoLink).data('imageid', that.imageInfo.ProductImageId).toggleClass('hidden', that.imageInfo.ModelInfo ? false : true);\n };\n\n return productImageHero;\n}(jQuery));","/// \n/*\n * PDP hero wrapper for composite/mashup images\n */\nvar CompositeImageHero = (function ($) {\n var CompositeImageInfo = (function () {\n var Rectangle = (function () {\n //component image size is 750, but adjusted for 5px padding on all sides\n var componentImageSize = 740;\n\n var rectangle = function (dx, dy) {\n var that = this;\n that.dx = dx;\n that.dy = dy;\n that.height = componentImageSize;\n that.width = componentImageSize;\n };\n\n return rectangle;\n })();\n\n var sourceImageSize = 1500,\n padding = 5,\n componentLayouts = {\n 1: [new Rectangle(padding, padding)],\n 2: [new Rectangle(sourceImageSize / 4 + padding, padding), new Rectangle(sourceImageSize / 4 + padding, sourceImageSize / 2 + padding)],\n 3: [new Rectangle(padding, padding), new Rectangle(sourceImageSize / 2 + padding, padding), new Rectangle(sourceImageSize / 4 + padding, sourceImageSize / 2 + padding)],\n 4: [new Rectangle(padding, padding), new Rectangle(sourceImageSize / 2 + padding, padding), new Rectangle(padding, sourceImageSize / 2 + padding), new Rectangle(sourceImageSize / 2 + padding, sourceImageSize / 2 + padding)]\n },\n workspaceCanvas = document.createElement('canvas'),\n workspaceContext = workspaceCanvas.getContext('2d');\n workspaceCanvas.height = workspaceCanvas.width = sourceImageSize;\n\n var compositeImageInfo = function () {\n var that = this;\n\n that.canvas = document.createElement('canvas'),\n that.ctx = that.canvas.getContext('2d');\n };\n\n function resizeCanvas(canvas, ctx, targetSize) {\n /// \n /// Helper method to resize the canvas to the given size using a \"step down\" method to help maintain image quality\n /// \n /// Html canvas element to resize\n /// Canvas rendering context to draw\n /// Target height/width of the canvas to scale down to\n\n //don't resize by more than 50% to help maintain image quality\n //See https://stackoverflow.com/questions/17861447/ for more information\n var newSize = Math.max(targetSize, canvas.height * .5);\n workspaceContext.fillStyle = \"#FFFFFF\";\n workspaceContext.fillRect(0, 0, workspaceCanvas.width, workspaceCanvas.height);\n workspaceContext.drawImage(canvas, 0, 0, newSize, newSize);\n\n canvas.height = canvas.width = newSize;\n ctx.fillStyle = \"#FFFFFF\";\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n ctx.drawImage(workspaceCanvas, 0, 0, newSize, newSize, 0, 0, newSize, newSize);\n\n //if we didn't actually resize to the target size, then recursively apply the method until we do\n if (newSize !== targetSize) {\n resizeCanvas(canvas, ctx, targetSize);\n }\n }\n\n compositeImageInfo.prototype.updateImageInfo = function () {\n /// \n /// Updates the mashup image info object to contain the currently selected composite image urls\n /// \n var that = this,\n componentImages = [];\n\n $.each(imageMatrixLookup, function (matrixRow, matrixOptionId) {\n if (!matrixOptionId) {\n return;\n }\n var img = imagesByMatrixOptionId[matrixOptionId];\n if (img) {\n componentImages.push(img);\n }\n });\n\n componentImages = componentImages.slice(0, 4);\n var layout = componentLayouts[componentImages.length];\n\n if (!layout) {\n that.AlternateImageUrl = '//images.evo.com/imgp/80/_notavailable.jpg';\n that.EnlargeImageUrl = '//images.evo.com/imgp/enlarge/_notavailable.jpg';\n that.HeroImageUrl = '//images.evo.com/imgp/700/_notavailable.jpg';\n that.ZoomImageUrl = '//images.evo.com/imgp/zoom/_notavailable.jpg';\n return;\n }\n\n //reset the canvas\n that.canvas.height =\n that.canvas.width = sourceImageSize;\n\n //draw them to the canvas in the appropriate position\n for (var i = 0; i < layout.length && i < componentImages.length; i++) {\n var rect = layout[i];\n that.ctx.drawImage(componentImages[i], rect.dx, rect.dy, rect.height, rect.width);\n }\n\n that.ZoomImageUrl = that.canvas.toDataURL();\n resizeCanvas(that.canvas, that.ctx, 900);\n that.EnlargeImageUrl = that.canvas.toDataURL();\n resizeCanvas(that.canvas, that.ctx, 700);\n that.HeroImageUrl = that.canvas.toDataURL();\n resizeCanvas(that.canvas, that.ctx, 80);\n that.AlternateImageUrl = that.canvas.toDataURL();\n };\n\n return compositeImageInfo;\n })();\n\n var compositeImageHero = function ($container, $mediaElement) {\n /// \n /// Constructor for HeroMediaBase objects\n /// \n /// The jquery wrapper of the hero image container div\n /// The jquery wrapper of the hero image/iframe element\n var that = this;\n\n that.imageInfo = new CompositeImageInfo();\n that.imageInfo.updateImageInfo();\n\n imagesByProductImageId[-1] = that.imageInfo;\n $mediaElement.data('imageid', -1);\n\n ProductImageHero.call(that, $container, $mediaElement);\n\n evo.$.body.on('loaded.evo.pdp.interstitial', function (e, modal) {\n if (modal) {\n $(modal).find('.pdp-interstitial-thumb').attr('src', that.imageInfo.HeroImageUrl);\n }\n });\n };\n\n compositeImageHero.prototype = Object.create(ProductImageHero.prototype);\n compositeImageHero.prototype.constructor = compositeImageHero;\n\n compositeImageHero.prototype.updateImage = function () {\n var that = this;\n that.imageInfo.updateImageInfo();\n that.$alternateImage.children('img').attr('src', that.imageInfo.AlternateImageUrl);\n that.$mediaElement.attr('src', that.imageInfo.HeroImageUrl);\n\n if (that.$mediaElement.hasClass('active')) {\n ProductImageHero.prototype.select.call(that);\n }\n };\n\n return compositeImageHero;\n}(jQuery));","/// \n/*\n * PDP hero wrapper for video/iframe elements\n */\nvar VideoHero = (function () {\n var videoHero = function ($container, $mediaElement) {\n /// \n /// Constructor for VideoHero objects\n /// \n /// The jquery wrapper of the hero image container div\n /// The jquery wrapper of the hero image/iframe element\n var that = this;\n\n HeroMediaBase.call(that, $container, $mediaElement);\n that.displayUtilities = false;\n that.$alternateImage.addClass('pdp-alt-video')\n .attr('data-track', 'aiv-' + that.$mediaElement.data('videotitle'));\n that.$alternateImage\n .children('img').attr('src', that.$mediaElement.data('alternateimage-url'))\n .before('');\n };\n\n videoHero.prototype = Object.create(HeroMediaBase.prototype);\n videoHero.prototype.constructor = videoHero;\n\n function buildVideoUrl(source, key) {\n /// \n /// Helper method that returns the full video url for the given source and key\n /// \n /// The video's source/host\n /// The video's unique key/identifier\n\n switch (source.toLowerCase()) {\n case 'vimeo':\n return 'https://player.vimeo.com/video/' + key + '?autoplay=0&title=0&byline=0&portrait=0';\n case 'youtube':\n return 'https://www.youtube.com/embed/' + key + '?rel=0&showinfo=0&autoplay=0';\n default:\n console.error(\"The video source \" + videoSource + \" is not valid\");\n return '';\n }\n }\n\n videoHero.prototype.select = function () {\n var that = this;\n HeroMediaBase.prototype.select.call(that);\n\n var videoUrl = buildVideoUrl(that.$mediaElement.data('source'), that.$mediaElement.data('key'));\n that.$mediaElement.attr('src', videoUrl);\n };\n\n return videoHero;\n}());","/// \n/// \n/// \n/*\n * PDP interactions hero, alternate images, and model/size shown\n *\n * Plugin to be initialized on product detail element '.js-pdp-hero-container'\n * i.e. $('.js-pdp-hero-container').heroInteraction();\n *\n */\n\n//maintain a dictionary of active matrix options keyed by matrix type\n//(only needed if there is a composite hero image to maintain)\nvar imageMatrixLookup = {};\n\n(function ($) {\n var selectors = {\n altImageContainer: '.js-pdp-hero-alt-image-container',\n altImageInner: '.js-pdp-hero-alt-image-inner',\n dotContainer: '.js-pdp-hero-dot-container',\n heroContainer: '.js-pdp-hero-container',\n imageContainer: '.js-pdp-hero-image-container',\n imageAssets: '.js-pdp-image-asset',\n matrices: '.js-selection-matrix',\n matrixOptionButtons: '.js-selection-matrix-option-container',\n matrixOptions: '.js-selection-matrix-option',\n modelInfoDetails: '.js-pdp-model-info-details',\n modelInfoClose: '.js-pdp-model-info-close',\n modelInfoContainer: '.js-pdp-model-info-container',\n modelInfoLink: '.js-pdp-hero-model-info-link',\n pdpHeroArrows: '.js-pdp-hero-arrow',\n pdpHeroImage: '.pdp-hero-image',\n zoomLink: '.js-pdp-hero-zoom-link'\n };\n\n const SWIPE_THRESHOLD = 20;\n\n //setup all the hero containers on the page\n $.fn.heroInteraction = function () {\n var $container = $(this),\n $heroImageContainer = $container.find(selectors.imageContainer),\n $altImageInner = $container.find(selectors.altImageInner),\n $dotContainer = $container.find(selectors.dotContainer);\n\n var imageComingSoonSelected = false;\n\n var initializeForCompositeImages = function (callback) {\n //only do work if there is a composite image on the page\n if (!$heroImageContainer.children(selectors.imageAssets + '[data-mediatype=\"composite\"]').size()) {\n if ($.isFunction(callback)) {\n callback();\n }\n return;\n }\n\n //find and group the first matrix options (but by image sequence)\n //to figure out which components images the composite should start with\n $(selectors.matrices).each(function (i, matrix) {\n var minSequence = Number.MAX_VALUE;\n $(matrix).find(selectors.matrixOptions + '[data-imagematrixoptionid]').each(function () {\n var matrixOptionId = $(this).data('imagematrixoptionid'),\n img = imagesByMatrixOptionId[matrixOptionId];\n if (img && img.Sequence < minSequence) {\n minSequence = img.Sequence;\n imageMatrixLookup[i] = matrixOptionId;\n }\n });\n });\n\n var imageDeferreds = [],\n newImagesByMatrixOptionId = {};\n $.each(imagesByMatrixOptionId, function (matrixOptionId, imgInfo) {\n if (imgInfo && imgInfo.EnlargeImageUrl) {\n var img = new Image(),\n def = $.Deferred();\n img.onload = def.resolve;\n //need to set crossOrigin to anonymous to avoid\n //canvas \"tainted\" security error\n //more info here: https://stackoverflow.com/questions/20424279/canvas-todataurl-securityerror\n img.crossOrigin = 'anonymous';\n img.src = imgInfo.EnlargeImageUrl;\n imageDeferreds.push(def);\n newImagesByMatrixOptionId[matrixOptionId] = img;\n }\n });\n\n //wait until all of the images have finished loading before calling the callback method\n //(Usage of $.when.apply was needed to pass array parameter.\n //See https://stackoverflow.com/questions/5627284/pass-in-an-array-of-deferreds-to-when)\n $.when.apply($, imageDeferreds).done(function () {\n imagesByMatrixOptionId = newImagesByMatrixOptionId;\n }).then(callback);\n };\n\n initializeForCompositeImages(function () {\n var firstVisibleHero = null;\n $heroImageContainer.children(selectors.imageAssets).each(function (i) {\n var $this = $(this),\n heroMedia;\n\n switch ($this.data('mediatype')) {\n case 'composite':\n heroMedia = new CompositeImageHero($container, $this);\n break;\n case 'image':\n heroMedia = new ProductImageHero($container, $this);\n break;\n case 'video':\n heroMedia = new VideoHero($container, $this);\n break;\n default:\n console.error('Unknown hero media type: ' + $this.data('mediatype'));\n break;\n }\n\n $altImageInner.append(heroMedia.$alternateImage);\n $dotContainer.append(heroMedia.$dot);\n\n if (!firstVisibleHero && !$this.hasClass('hidden')) {\n firstVisibleHero = heroMedia;\n }\n });\n\n if (firstVisibleHero) {\n firstVisibleHero.select();\n }\n $heroImageContainer.removeClass('loading');\n\n heroArrowsCheck();\n initializeAltContainer();\n\n //listen for the updateheroimages event that is triggered by a user selecting a matrix option that has an image\n //toggles display of assets based on matching the given matrix option id\n evo.$.body.on('matrixoptionchanged.evo', selectors.matrixOptions, function (e) {\n var $matrixOptionBtn = $(this),\n matrixOptionId = $matrixOptionBtn.data('imagematrixoptionid');\n if (!matrixOptionId) {\n return;\n }\n\n //update the image matrix lookup so that the new matrix option takes its place in the lookup\n var matrixRowNumber = $matrixOptionBtn.closest(selectors.matrices).prevAll(selectors.matrices).size(),\n $imageAssets = $container.find(selectors.imageAssets);\n imageMatrixLookup[matrixRowNumber] = matrixOptionId;\n\n //update any composite images\n $imageAssets.filter('[data-mediatype=\"composite\"]').each(function () {\n var compositeHero = $(this).data('hero-media');\n compositeHero.updateImage();\n });\n\n //build a matrix option selector that activates all images\n //for any \"active\" matrix options\n var matrixOptionSelector = '.js-image-shared';\n $.each(imageMatrixLookup, function (row, optId) {\n matrixOptionSelector += ',.js-image-matrix-option-' + optId;\n });\n\n $imageAssets.not(matrixOptionSelector).addClass('hidden');\n $imageAssets.filter(matrixOptionSelector).removeClass('hidden');\n\n //select the first visible image\n var firstVisibleHeroMedia = $heroImageContainer.children(':not(.hidden)').first().data('hero-media');\n\n var imageComingSoon = '\"Image'\n\n //sets hero image to the first image w/o hidden attribute upon matrix selection\n //if no image is associated with matrix selection, append \"Image Coming Soon\" img to image container\n if (firstVisibleHeroMedia) {\n firstVisibleHeroMedia.select();\n } else {\n if (!imageComingSoonSelected) {\n $(\".pdp-hero-image-container\").append(imageComingSoon);\n $(\".pdp-hero-image-container\").attr(\"style\", \"padding-bottom: 0px !important\")\n imageComingSoonSelected = true;\n }\n }\n\n heroArrowsCheck();\n });\n\n //handler for previous next arrow links, trigger a click on the dots.\n $container.find(selectors.pdpHeroArrows).on('click', function () {\n var activeDot = $dotContainer.find('.active'),\n visibleDots = $dotContainer.find(':not(.hidden)'),\n direction = $(this).data('direction'),\n nextDot;\n\n if (direction === 'next') {\n nextDot = activeDot.nextAll('span:not(.hidden)').eq(0);\n if (nextDot.length === 0) {\n nextDot = visibleDots.eq(0);\n }\n } else {\n nextDot = activeDot.prevAll('span:not(.hidden)').eq(0);\n if (nextDot.length === 0) {\n nextDot = visibleDots.eq(nextDot.length - 1);\n }\n }\n nextDot.trigger('click');\n });\n\n // keep track of touch start and end coordinates\n var touchStartX = 0,\n touchEndX = 0,\n touchStartY = 0,\n touchEndY = 0,\n isSwiping = false;\n\n // handler for touch start event (used for swipe)\n $heroImageContainer.on('touchstart', function (event) {\n touchStartX = event.originalEvent.changedTouches[0].screenX;\n touchStartY = event.originalEvent.changedTouches[0].screenY;\n isSwiping = false;\n });\n\n // Set isSwiping to true if it's a horizontal swipe\n $heroImageContainer.on('touchmove', function (event) {\n touchEndX = event.originalEvent.changedTouches[0].screenX;\n touchEndY = event.originalEvent.changedTouches[0].screenY;\n\n var deltaX = touchEndX - touchStartX;\n var deltaY = touchEndY - touchStartY;\n\n // Check if it's a horizontal swipe\n if (Math.abs(deltaX) > Math.abs(deltaY)) {\n isSwiping = true;\n event.preventDefault(); // prevent scrolling if it's a swipe\n }\n });\n\n // handler for touch end event (used for swipe)\n $heroImageContainer.on('touchend', function (event) {\n // only carousel if it is a horizontal swipe\n if (isSwiping) {\n var delta = touchEndX - touchStartX,\n activeDot = $dotContainer.find('.active'),\n visibleDots = $dotContainer.find(':not(.hidden)'),\n nextDot;\n\n if (delta >= SWIPE_THRESHOLD) {\n // Right swipe\n nextDot = activeDot.prevAll('span:not(.hidden)').eq(0);\n if (nextDot.length === 0) {\n nextDot = visibleDots.eq(nextDot.length - 1);\n }\n nextDot.trigger('click');\n } else if (delta <= -SWIPE_THRESHOLD) {\n // Left swipe\n nextDot = activeDot.nextAll('span:not(.hidden)').eq(0);\n if (nextDot.length === 0) {\n nextDot = visibleDots.eq(0);\n }\n nextDot.trigger('click');\n }\n }\n\n // Reset state\n touchStartX = 0;\n touchEndX = 0;\n touchStartY = 0;\n touchEndY = 0;\n isSwiping = false;\n });\n\n // handler for touch canceled event (used for swipe)\n $heroImageContainer.on('touchcancel', function () {\n touchStartX = 0;\n touchEndX = 0;\n touchStartY = 0;\n touchEndY = 0;\n isSwiping = false;\n });\n\n //handler for the size shown click event\n //which builds the html and displays the modal\n $container.find(selectors.modelInfoLink).on('click', function (e) {\n e.preventDefault();\n e.stopPropagation();\n\n var imageId = $(this).data('imageid'),\n imageInfo = imagesByProductImageId[imageId];\n\n if (!imageInfo || !imageInfo.ModelInfo) {\n return;\n }\n\n var modelInfo = imageInfo.ModelInfo;\n\n //build the list of attributes that will be displayed in the modal\n var attributes = [];\n for (var key in modelInfo) {\n if (!modelInfo.hasOwnProperty(key) || !modelInfo[key]) {\n continue;\n }\n\n var dt = $('
').html(key),\n dd = $('
').html(modelInfo[key]);\n attributes.push(dt.add(dd));\n }\n\n if (!attributes.length) {\n return;\n }\n\n //make two columns of all the properties to display\n //try to make the columns equal in the number of properties\n var col1 = $('
'),\n col2 = attributes.length > 1 ? col1.clone() : '',\n midpoint = Math.ceil(attributes.length / 2);\n col1.append(attributes.slice(0, midpoint));\n if (midpoint < attributes.length && attributes.length > 1) {\n col2.append(attributes.slice(midpoint));\n }\n\n var $sizeShownContainer = $container.find(selectors.modelInfoContainer),\n $sizeShownDetails = $sizeShownContainer.find(selectors.modelInfoDetails);\n\n $sizeShownDetails.empty().append(col1).append(col2);\n $sizeShownContainer.addClass('active');\n\n $(document).one('click', function () {\n $sizeShownContainer.removeClass('active');\n });\n });\n\n //close the size shown container when the \"X\" is clicked\n $container.find(selectors.modelInfoClose).on('click', function () {\n $container.find(selectors.modelInfoContainer).removeClass('active');\n });\n\n //allow users to interact with the text of the size shown modal\n $container.find(selectors.modelInfoContainer).on('click', function (e) {\n e.stopPropagation();\n });\n\n //function to check if we have alt images then show the mobile nav arrows\n function heroArrowsCheck() {\n var heroArrowsNeeded = $container.find(selectors.dotContainer + ' ' + selectors.imageAssets + ':not(.hidden)').length > 1;\n $container.find(selectors.pdpHeroArrows).toggleClass('active', heroArrowsNeeded);\n }\n\n //attach the zoom behavior to the zoom link\n $container.find(selectors.zoomLink).click(function (e) {\n e.preventDefault();\n $container.find(selectors.heroContainer + ' ' + selectors.imageAssets + '.active' + selectors.pdpHeroImage).trigger('click');\n });\n });\n\n //handle for default selection if a value was passed from the results page\n (function (hash) {\n //read the value of the hash parameter in the url\n var index = hash.indexOf('image=');\n\n if (index === -1) {\n return;\n }\n\n var imageToSelect = hash.slice(index + 6);\n\n //in case there are more parameters in the hash, get only the value we're interested in\n index = imageToSelect.indexOf('&');\n if (index > 0) {\n imageToSelect = imageToSelect.substring(0, index);\n }\n\n var targetImageButton = $(selectors.matrixOptionButtons).has('img[src$=\"' + imageToSelect + '\"]').find(selectors.matrixOptions);\n\n if (!targetImageButton.size()) {\n return;\n }\n\n //if the select parameter was also passed, we should select our target button by default,\n //otherwise simply get the image to show up\n if (hash.indexOf('select=') >= 0) {\n targetImageButton.prop('checked', 'checked');\n targetImageButton.trigger('change');\n } else {\n targetImageButton.trigger('matrixoptionchanged.evo');\n }\n })(window.location.hash);\n };\n\n //sets up scrolling and height on the alt images and their container\n function initializeAltContainer() {\n var $altImageContainer = $(selectors.altImageContainer),\n $altImageInner = $(selectors.altImageInner),\n $altThumb = $altImageInner.find(selectors.imageAssets),\n $arrowDown = $('.js-pdp-alt-arrow-down'),\n $arrowUp = $('.js-pdp-alt-arrow-up'),\n heroHeight = $(selectors.heroContainer).find(selectors.imageContainer + ':eq(0)').outerHeight(),\n scrollPadding = 80,\n altThumbsHeight = $altThumb.eq(0).outerHeight(true) * $altThumb.length + scrollPadding,\n scrollDistance = altThumbsHeight - heroHeight,\n scrollMultiplier = 2000; //milliseconds to scroll through one page of alt thumbs,\n\n function initilizeAltScroll() {\n $arrowDown.hover(function () {\n //calculate the remaining space to scroll\n var scrollRemaining = altThumbsHeight - heroHeight - $altImageInner.scrollTop();\n var scrollSpeed = scrollRemaining / heroHeight * scrollMultiplier;\n\n $altImageInner.animate({scrollTop: scrollDistance}, scrollSpeed, 'linear');\n },\n function () {\n $altImageInner.stop();\n });\n\n $arrowUp.hover(function () {\n //base on the scrollTop of the div here\n var scrollRemaining = $altImageInner.scrollTop() + scrollPadding;\n var scrollSpeed = scrollRemaining / heroHeight * scrollMultiplier;\n\n $altImageInner.animate({scrollTop: 0}, scrollSpeed, 'linear');\n },\n function () {\n $altImageInner.stop();\n });\n }\n\n if (altThumbsHeight > heroHeight) {\n $altImageContainer.height(heroHeight).addClass('scrollable');\n if (!Modernizr.touch) {\n initilizeAltScroll();\n }\n } else {\n $altImageContainer.height('auto').removeClass('scrollable');\n $arrowDown.off('hover');\n $arrowUp.off('hover');\n }\n }\n\n //need to adjust on resize because we might have to hide or show alt image navigation arrows\n var resizeTimer;\n $(window).on('resize', function () {\n clearTimeout(resizeTimer);\n resizeTimer = setTimeout(initializeAltContainer, 500);\n });\n})(jQuery);","/*\n * PDP interactions matrix option selectors to narrow down product to purchase\n */\n(function ($) {\n var selectors = {\n errorMessage: '.js-selection-error',\n matrices: '.js-selection-matrix',\n matrixOptions: '.js-selection-matrix-option',\n matrixOptionButtons: '.js-selection-matrix-option-container',\n selectedDescription: '.js-selection-description'\n };\n\n //helper method to retrieve the intersect of two array sets\n //if either array is undefined, method returns other array (or empty array)\n function intersect(a, b) {\n if (!a || !a.length) {\n return b || [];\n }\n else if (!b || !b.length) {\n return a;\n }\n var r = [], o = {}, l = b.length, i, v;\n for (i = 0; i < l; i++) {\n o[b[i]] = true;\n }\n l = a.length;\n for (i = 0; i < l; i++) {\n v = a[i];\n if (v in o) {\n r.push(v);\n }\n }\n return r;\n }\n\n //helper method that merges one or more arrays\n //by combining all values and removing duplicates\n function merge() {\n var args = arguments;\n var hash = {};\n var arr = [];\n for (var i = 0; i < args.length; i++) {\n for (var j = 0; j < args[i].length; j++) {\n if (hash[args[i][j]] !== true) {\n arr[arr.length] = args[i][j];\n hash[args[i][j]] = true;\n }\n }\n }\n return arr;\n }\n\n $.fn.matrixSelectors = function (args) {\n var $container = this,\n options = $.extend({\n items: {},\n selectionUpdated: $.noop\n }, args),\n $allMatrixOptions = $container.find(selectors.matrixOptions).filter('[data-itemids!=\"\"]'),\n $allMatrices = $container.find(selectors.matrices);\n\n //initialize each matrix with the product id of its options\n $.each($allMatrices, function (i, matrix) {\n var $matrix = $(matrix);\n\n $matrix.data('product-id', $matrix.find(selectors.matrixOptions).data('product-id'));\n });\n\n //build a dictionary of product id -> item ids to be used throughout logic\n var itemIdsByProductId = {},\n skuRegex = new RegExp('[A-Z]{2}-(\\\\d{4,})-\\\\d{4}', 'i');\n $.each(options.items, function (itemId, item) {\n item.ProductId = parseInt(skuRegex.exec(item.SKU)[1]);\n if (itemIdsByProductId.hasOwnProperty(item.ProductId)) {\n itemIdsByProductId[item.ProductId].push(itemId);\n } else {\n itemIdsByProductId[item.ProductId] = [itemId];\n }\n });\n\n //helper method that gets all the checked options\n function getSelectedOptions() {\n return $allMatrixOptions.filter(':checked');\n }\n\n //helper method that will get all the sibling input tags to the given matrix option\n function getSiblingsOfOption($option) {\n return $option.closest(selectors.matrices).find(selectors.matrixOptions).not($option);\n }\n\n //helper method that gets all the unique item ids found in the matrix options given\n function getUniqueItemIds($matrixOptions) {\n var selectedItemIdsByProductId = {};\n\n if ($matrixOptions && $matrixOptions.length) {\n $matrixOptions.each(function () {\n var $this = $(this),\n productId = $this.data('product-id'),\n itemIds = ($this.attr('data-itemids') || '').split(',');\n selectedItemIdsByProductId[productId] = intersect(selectedItemIdsByProductId[productId], itemIds);\n });\n }\n\n return $.extend({}, itemIdsByProductId, selectedItemIdsByProductId);\n }\n\n //helper method that updates the selection display for a matrix given the newly selected option\n //i.e. Select Size: [new size here]\n function updateMatrixSelection($selectedMatrixOption, $relativeMatrixOption) {\n if (!$relativeMatrixOption) {\n $relativeMatrixOption = $selectedMatrixOption;\n }\n\n var $matrix = $relativeMatrixOption.closest(selectors.matrices),\n $selectedDescription = $matrix.find(selectors.selectedDescription),\n selectionDisplay = $selectedMatrixOption.val() || '';\n\n if ($selectedMatrixOption.data('disable-reason')) {\n selectionDisplay += ' - ' + $selectedMatrixOption.data('disable-reason');\n }\n\n $(selectors.errorMessage).hide();\n $selectedDescription.html(selectionDisplay);\n }\n\n // helper method to hide / show elements based on the current selection\n function updateConditionalDisplay(groupName) {\n var selectedOption = null,\n enabledOptions = [],\n disabledOptions = [];\n $allMatrixOptions.filter('[name=\"' + groupName + '\"]').each(function () {\n var $this = $(this),\n thisValue = ($this.val() || '').toLowerCase().replace(/\"/g, '\\\\\"'),\n thisDisplayKey = groupName.toLowerCase() + '-' + thisValue;\n\n if ($this.is(':checked')) {\n selectedOption = thisDisplayKey;\n } else if ($this.is(':enabled')) {\n enabledOptions.push(thisDisplayKey);\n } else {\n disabledOptions.push(thisDisplayKey);\n }\n });\n\n var optionsToShow = [],\n optionsToHide = [];\n\n if (selectedOption) {\n optionsToShow.push(selectedOption);\n optionsToHide = $.merge(enabledOptions, disabledOptions);\n } else if (disabledOptions.length) {\n optionsToShow = enabledOptions;\n optionsToHide = disabledOptions;\n }\n\n $($.map(optionsToShow, function (key) { return '[data-show=\"' + key + '\"]'; }).join(',')).show();\n $($.map(optionsToShow, function (key) { return '[data-required=\"' + key + '\"]'; }).join(',')).prop('required', true);\n $($.map(optionsToHide, function (key) { return '[data-show=\"' + key + '\"]'; }).join(',')).hide().find(':checked').each(function () {\n var $this = $(this);\n\n //disable the custom amount box for gift card price if it's currently checked (and now hidden)\n setTimeout(function () {\n $this.val('').prop('checked', false);\n $this.trigger('matrixoptionchanged.evo');\n updateMatrixSelection($this);\n }, 350);\n });\n $($.map(optionsToHide, function (key) { return '[data-required=\"' + key + '\"]'; }).join(',')).prop('required', false);\n }\n\n //helper method that updates the page display based on the item(s) that are currently selected via\n //the options. This will update the displayed price and marketing price based on the item ids passed in\n function updateSelectedItemsDisplay(eventType, $selectedOptions, $originator) {\n var uniqueItemIdsByProductId = getUniqueItemIds($selectedOptions);\n\n if ($selectedOptions) {\n //enable the options that are available with the currently selected item(s)\n //and disabled the options that are not\n //what basically needs to happen is that we loop through each matrix, get the selected options\n //in the other matrices and disable/enable the options inside\n $allMatrices.each(function () {\n var $matrix = $(this),\n matrixProductId = $matrix.data('product-id'),\n matrixSelector = ('.js-matrixtype-' + $matrix.attr('data-matrixtype')).replace('&','\\\\&'),\n $theseOptions = $allMatrixOptions.filter(matrixSelector),\n $otherSelectedOptions = $selectedOptions.not(matrixSelector),\n otherUniqueItemIdsByProductId = getUniqueItemIds($otherSelectedOptions),\n matrixOptionSelector = '';\n\n $.each(otherUniqueItemIdsByProductId, function (productId, itemIds) {\n if (matrixProductId != productId) {\n return;\n }\n var productIdSelector = '.js-selection-product-id-' + productId + '._';\n matrixOptionSelector += productIdSelector + itemIds.join(',' + productIdSelector)\n });\n\n matrixOptionSelector = matrixOptionSelector || '*';\n\n var optionsNeedEnabling = $theseOptions.filter(matrixOptionSelector).filter(':disabled');\n optionsNeedEnabling.prop('disabled', false);\n var optionsNeedDisabling = $theseOptions.not(matrixOptionSelector).filter(':enabled');\n optionsNeedDisabling.prop('disabled', true);\n\n //hide/show elements based on data attributes\n //get a list of unique matrices that were modified\n var names = optionsNeedDisabling.add(optionsNeedEnabling).map(function () { return $(this).attr('name'); }).get();\n if ($originator) {\n names.push($originator.attr('name'));\n }\n names = names.filter(function (v, i, s) { return v && s.indexOf(v) === i; });\n\n for (var i = 0; i < names.length; i++) {\n updateConditionalDisplay(names[i]);\n }\n });\n }\n\n //calculate the aggregate of the selected items using the itemInfo lookup\n var selectedItemIds = [],\n components = [];\n $.each(uniqueItemIdsByProductId, function (productId, itemIds) {\n selectedItemIds = selectedItemIds.concat(itemIds);\n\n var component = {\n availability: 0,\n displayType: Number.MAX_VALUE,\n estimatedShipDate: new Date(8640000000000000), //max date value\n eventType: eventType,\n isInCollection: false,\n minPrice: Number.MAX_VALUE,\n maxPrice: Number.MIN_VALUE,\n minMarketingPrice: Number.MAX_VALUE,\n maxMarketingPrice: Number.MIN_VALUE,\n minPriceStatus: 3, //(not set)\n maxPriceStatus: 0 //(not set)\n };\n for (i = 0; i < itemIds.length; i++) {\n var item = options.items[itemIds[i]];\n if (!item) {\n continue;\n }\n component.availability |= item.Availability;\n component.displayType = Math.min(item.DisplayType, component.displayType);\n if (component.estimatedShipDate !== null) {\n var estimatedShipDate = item.EstimatedShipDate ? new Date(item.EstimatedShipDate + 'Z') : null;\n if (component.estimatedShipDate > estimatedShipDate) {\n component.estimatedShipDate = estimatedShipDate;\n }\n }\n component.isInCollection = component.isInCollection || item.IsInCollection;\n if (item.Price < component.minPrice) {\n component.minPrice = item.Price;\n component.minPriceStatus = item.PriceStatus;\n }\n if (item.Price > component.maxPrice) {\n component.maxPrice = item.Price;\n component.maxPriceStatus = item.PriceStatus;\n }\n component.minMarketingPrice = Math.min(item.MarketingPrice, component.minMarketingPrice);\n component.maxMarketingPrice = Math.max(item.MarketingPrice, component.maxMarketingPrice);\n }\n\n //in-stock and pre-order should not be possible within a component\n //in-stock trumps\n if ((component.availability & 5) === 5) {\n component.availability &= 3;\n }\n\n components.push(component);\n });\n\n var finalResult = components[0] || {\n availability: 0,\n displayType: Number.MAX_VALUE,\n estimatedShipDate: null,\n eventType: eventType,\n isInCollection: false,\n minPrice: Number.MAX_VALUE,\n maxPrice: Number.MIN_VALUE,\n minPriceStatus: 1,\n maxPriceStatus: 1,\n minMarketingPrice: Number.MAX_VALUE,\n maxMarketingPrice: Number.MIN_VALUE\n },\n //list of price statuses in order of display-importance\n //(Full < Sale < Clearance < Limited Time)\n priceStatusOrder = [1, 2, 4, 3];\n finalResult.itemIds = selectedItemIds;\n\n //in the case of mashups, merge the properties across components that we care about (most are overridden in buy grid code)\n $.each(components, function (i, component) {\n if (i === 0) {\n return;\n }\n finalResult.availability |= component.availability;\n if (component.estimatedShipDate) {\n finalResult.estimatedShipDate = !!finalResult.estimatedShipDate || finalResult.estimatedShipDate < component.estimatedShipDate\n ? component.estimatedShipDate\n : finalResult.estimatedShipDate;\n }\n\n //in-stock and pre-order should not be possible for a mashup\n //pre-order trumps since this is across components\n if ((finalResult.availability & 5) === 5) {\n finalResult.availability &= 4;\n }\n\n finalResult.minMarketingPrice += component.minMarketingPrice;\n finalResult.maxMarketingPrice += component.maxMarketingPrice;\n\n if (priceStatusOrder.indexOf(component.minPriceStatus) > priceStatusOrder.indexOf(finalResult.minPriceStatus)) {\n finalResult.minPriceStatus = component.minPriceStatus;\n }\n if (priceStatusOrder.indexOf(component.maxPriceStatus) > priceStatusOrder.indexOf(finalResult.maxPriceStatus)) {\n finalResult.maxPriceStatus = component.maxPriceStatus;\n }\n });\n\n options.selectionUpdated(finalResult);\n }\n\n //handler for matrix option change event\n //whenever an item gets clicked on, we need to grab all of the selected items\n //and update the page display\n $allMatrixOptions.on('change', function () {\n var $this = $(this);\n\n //fire event to update hero and alt images if this button has an image\n $this.trigger('matrixoptionchanged.evo');\n\n //update the \"Select Size/Color\" selection display\n updateMatrixSelection($this);\n\n //update the pricing display based on the currently selected items\n updateSelectedItemsDisplay('change', getSelectedOptions(), $this);\n });\n\n var $matrixOptionButtons = $(selectors.matrixOptionButtons);\n\n //handler for mouseenter/mouseleave events\n //mouseenter should update page display with the hovered item trumping any siblings\n //mouseleave should update page display with everything reverted to how it was before the hover\n //use touchend for touch devices because we don't have a mouseleave\n var hoverEvent = Modernizr.touch ? 'touchend' : 'mouseenter mouseleave';\n $matrixOptionButtons.on(hoverEvent, function (e) {\n var $this = $(this).find(selectors.matrixOptions);\n\n if ($this.is(':checked')) {\n //remove the checked on touch end after a timeout because the change event seems to happen after this fires.\n if (Modernizr.touch) {\n setTimeout(function () {\n $this.prop('checked', false);\n updateSelectedItemsDisplay('change', getSelectedOptions(), $this);\n }, 350);\n }\n return;\n }\n\n var selectedItems = getSelectedOptions();\n var $selectedSibling = getSiblingsOfOption($this).filter(':checked');\n\n if (e.type === 'mouseenter') {\n selectedItems = selectedItems.not($selectedSibling).add($this);\n updateMatrixSelection($this);\n } else {\n updateMatrixSelection($selectedSibling, $this);\n }\n\n if (!$this.is(':disabled')) {\n updateSelectedItemsDisplay(e.type, selectedItems, $this);\n }\n });\n\n //handler for option mouseup event\n //if the option is selected, this should de-select the user's option\n //so that they can undo a selection\n //don't do this for touch devices. it's handled above\n if (!Modernizr.touch) {\n $matrixOptionButtons.on('mouseup', function (e) {\n var $this = $(this).find(selectors.matrixOptions);\n if ($this.is(':checked')) {\n setTimeout(function () {\n $this.prop('checked', false);\n updateSelectedItemsDisplay('change', getSelectedOptions(), $this);\n }, 100);\n }\n });\n }\n\n $(function () {\n //init code for matrices that have only one option to select (auto-select it)\n $allMatrices.each(function () {\n var availableOptions = $(this).find(selectors.matrixOptions).filter('[data-itemids!=\"\"]');\n\n if (availableOptions.size() === 1) {\n availableOptions.prop('checked', true).trigger('change');\n }\n });\n\n //make sure the options have been updated\n //this is also here to ensure that products without options can be purchased\n updateSelectedItemsDisplay('change', getSelectedOptions());\n });\n\n return this;\n };\n})(jQuery);","/*\n * PDP interactions matrix option selectors to narrow down product to purchase\n */\n(function ($) {\n var selectors = {\n addOnButton: '#add-compatible-product-button',\n addOnButtonModalHeader: '#add-on-button-modal-header',\n addOnButtonModalSubheader: '#add-on-button-modal-subheader',\n addToCartButton: \"#pdp-add-to-cart\",\n addToCartUINotify: \".js-add-to-cart-loading\",\n availableToShipDate: \".js-pdp-available-to-ship\",\n buyGrid: \"#buy-grid\",\n brandName: \"#pdp-brand-name\",\n canadianOverridePrice: \"#pdp-canadian-override-price\",\n compatibilityButton: \"#btn-compatible-finder\",\n componentItemIds: \"#pdp-selected-component-item-ids\",\n componentItemList: \"#pdp-component-item-list\",\n coreNodePath: \"#pdp-core-node-path\",\n coreNodeId: \"#pdp-core-node-id\",\n countdownHide: \".js-countdown-hide\",\n countdownShow: \".js-countdown-show\",\n discountMessage: \".js-discount-message\",\n displayPanels: \".js-display-panel\",\n errorMessage: \".js-selection-error\",\n estimatedShipDate: \"#pdp-estimated-ship-date\",\n findInStoreButton: \"#btn-find-in-store\",\n giftCardCustomRadio: \"#pdp-selection-0\",\n giftCardCustomTextBox: \"#pdp-giftcard-custom\",\n giftCardMaxError: \"#gift-card-max-error\",\n giftCardMinError: \"#gift-card-min-error\",\n hazmatId: \"#pdp-hazmat-id\",\n items: \"#pdp-item-list\",\n matrices: \".js-selection-matrix\",\n matrixOptionList: \".pdp-selection-list\",\n matrixOptions: \".js-selection-matrix-option\",\n notifyMeButton: \"#notify-me-button\",\n price: \"#price-display\",\n productAvailability: \"#pdp-product-availability\",\n productId: \"#pdp-product-id\",\n productType: \"#hfProductType\",\n productSku: \"#product-sku\",\n productSkuMobile: \"#product-sku-mobile\",\n selectedItem: \"#pdp-selected-item\",\n reviewComponent: \".review-component-CategorySnippet\",\n pdpReviews: \"#pdp-reviews\",\n },\n $displayPanels = $(selectors.displayPanels),\n productType = $(selectors.productType).val(),\n countdownExpired = false;\n\n //helper method that transforms a number to a currency-formatted string (US dollars only)\n function formatNumberToCurrency(num) {\n return numeral(num).format();\n }\n\n //helper method that creates the html needed for the price display in the buy grid\n function createPriceDisplay(\n minPrice,\n minPriceStatus,\n maxPrice,\n maxPriceStatus,\n ) {\n var elements = [];\n\n elements.push(\n createPriceSpan(\n minPrice,\n minPriceStatus,\n minPriceStatus !== maxPriceStatus || minPrice === maxPrice,\n ),\n );\n if (minPrice < maxPrice) {\n //display a hyphen\n //if either of the prices are full-priced, the hyphen should be black, otherwise red\n elements.push(\n $(\"\")\n .addClass(\n \"pdp-price-\" +\n (minPriceStatus === 1 || maxPriceStatus === 1\n ? \"regular\"\n : \"discount\") +\n \" pdp-price-display\",\n )\n .html(\" - \"),\n );\n elements.push(createPriceSpan(maxPrice, maxPriceStatus, true));\n }\n\n return elements;\n }\n\n //helper method that creates the html needed for a price and its price status\n function createPriceSpan(price, priceStatus, includeStatus) {\n var priceClass = priceStatus === 1 ? \"regular\" : \"discount\",\n $priceSpan = $(\"\").addClass(\n \"pdp-price-\" + priceClass + \" pdp-price-display no-wrap\",\n );\n\n $priceSpan.html(formatNumberToCurrency(price));\n\n if (includeStatus) {\n switch (priceStatus) {\n case 2:\n $priceSpan.append(\" Sale\");\n break;\n case 3:\n $priceSpan.append(\" Limited Time\");\n break;\n case 4:\n $priceSpan.append(\" Clearance\");\n break;\n }\n }\n\n return $priceSpan;\n }\n\n function calculatePriceStatus(price, marketingPrice) {\n if (marketingPrice <= 0 || price > marketingPrice) {\n return 1;\n }\n\n var percentSavings = Math.round(\n ((marketingPrice - price) / marketingPrice) * 100,\n );\n if (percentSavings >= 60) {\n return 4;\n } else if (percentSavings > 3) {\n return 2;\n } else {\n return 1;\n }\n }\n\n // function that updates the affirm promotion messaging\n function updateAffirmUI(minPrice, maxPrice) {\n var affirmDisplay = document.getElementById(\"affirmLearnMore\");\n if (!affirmDisplay) {\n return;\n }\n\n // WX-2323 Fix to prevent iOS users needing to double tap\n // iPads use 'macintosh' agent, so we need to check if it is a\n // mac device as well as a touch device\n var isMacDevice = /iphone|macintosh/i.test(\n window.navigator.userAgent.toLowerCase(),\n );\n var isTouchDevice = window.navigator.maxTouchPoints > 0;\n\n var displayPrice = minPrice >= 50 ? minPrice : maxPrice;\n var fixedDisplayPrice = (displayPrice * 100).toFixed();\n\n $(affirmDisplay).attr(\"data-amount\", fixedDisplayPrice);\n\n affirm.ui.ready(function () {\n if (displayPrice < 50) {\n affirmDisplay.style.display = \"none\";\n } else {\n affirmDisplay.style.display = \"block\";\n }\n\n if (!isMacDevice && !isTouchDevice) {\n affirm.ui.refresh();\n }\n });\n }\n\n // function to scroll viewport to error messages that is used in the compatability and the Add to cart handler.\n function scrollToErrorMessage(el) {\n var errorOffset = el.getBoundingClientRect().y;\n\n //55 is the height of the sticky nav\n if (errorOffset < 55) {\n $(\"html\").animate(\n {\n scrollTop: $(selectors.buyGrid).offset().top,\n },\n 300,\n );\n }\n }\n\n //determines the display of a compatibility button that will either show a modal of\n //available online items or take the user to the package builder tool\n function showCompatibilityModal(selectedItemId) {\n var packageModal = $(\"#package-modal\");\n var packageBuilder = $(\"#package-builder\");\n\n\n if (!selectedItemId) {\n packageBuilder.hide();\n packageModal.show();\n\n } else {\n packageBuilder.show();\n packageModal.hide();\n }\n }\n\n function buyGridSelection() {\n $(selectors.buyGrid).matrixSelectors({\n items: componentItems || itemInfo,\n selectionUpdated: function (result) {\n //in case we've isolated our selections down to one, update the hidden element needed for the form to post\n var isolatedItemId =\n result.itemIds.length === 1 ? result.itemIds[0] : \"\";\n\n //the item id will never be isolated for mashups, so we need to\n //check if all of the item ids are unique by checking the un-selected matrices.\n if (productType === \"Mashup\") {\n var mashupItem = null;\n // For mashups, there is only ever 1 or 0 items on itemInfo\n $.each(itemInfo, function (itemId, item) {\n mashupItem = item;\n });\n\n if (!mashupItem) return;\n\n result.displayType = mashupItem.DisplayType;\n result.isInCollection = false;\n result.minPrice = mashupItem.Price;\n result.maxPrice = mashupItem.Price;\n\n //since limited time trumps and we have no way of calculating it here (no retail price available)\n //just keep limited time if the status is already so\n if (result.minPriceStatus !== 3) {\n result.minPriceStatus = calculatePriceStatus(\n result.minPrice,\n result.minMarketingPrice,\n );\n }\n if (result.maxPriceStatus !== 3) {\n result.maxPriceStatus = calculatePriceStatus(\n result.maxPrice,\n result.maxMarketingPrice,\n );\n }\n\n //we can consider a mashup selected only if all the matrices have a checked option\n //or if they only have one enabled option\n //when this is true, we can set the isolated item id to the mashup item id\n isolatedItemId = $(selectors.matrices)\n .not(\":has(\" + selectors.matrixOptions + \":checked)\")\n .not(function (i, matrix) {\n return (\n $(matrix)\n .find(selectors.matrixOptions + \":enabled\")\n .size() === 1\n );\n })\n .size()\n ? \"\"\n : mashupItem.ItemId;\n\n $(selectors.componentItemIds).val(result.itemIds.join(\",\"));\n }\n\n // This handler fires on matrix option mouseover and change (click) events. Items should only be considered 'selected' when matrix options were clicked such that there\n // is only one possible item for the selected matrix option combination\n const selectedItem =\n isolatedItemId && result.eventType === \"change\"\n ? itemInfo[isolatedItemId]\n : null;\n\n // replace parent SKU with child SKU\n if (selectedItem && selectedItem.SKU) {\n // All SKU values in the database either have a EB- or MU- pre-appended. We don't want to show these to the customer,\n // just the numeric values followed by the dash. If the modified SKU does not match the expected value then just don't show it.\n const modifiedSKU = selectedItem.SKU.substring(3);\n const pattern = /^\\d+-\\d+$/;\n if (pattern.test(modifiedSKU)) {\n $(selectors.productSku).html(\"sku# \" + modifiedSKU);\n $(selectors.productSkuMobile).html(\"sku# \" + modifiedSKU);\n } else {\n console.warn(\"Invalid SKU#: \" + modifiedSKU);\n }\n }\n\n // Only send datalayer event if the selected item has changed\n // For mashups, the parent SKU never changes. Only send datalayer event if price of mashup changes\n if (\n selectedItem &&\n (selectedItem.SKU !== dataLayerProduct.dimension1 ||\n selectedItem.Price !== dataLayerProduct.price)\n ) {\n dataLayerProduct.dimension1 = selectedItem.SKU;\n dataLayerProduct.price = selectedItem.Price;\n dataLayerProduct.variant = selectedItem.Color;\n dataLayerProduct.availability = selectedItem.Availability;\n dataLayerProduct.marketingPrice = selectedItem.MarketingPriceRange;\n dataLayerProduct.selloutRisk = selectedItem.SelloutRisk;\n dataLayerProduct.priceStatus = selectedItem.PriceStatus;\n dataLayerProduct.imageUrl = selectedItem.ImageUrl;\n window.dataLayerManager.pushDetailView(dataLayerProduct);\n window.childSku = selectedItem.SKU;\n }\n\n //update the page display\n $(selectors.price)\n .css(\"visibility\", \"visible\")\n .html(\n createPriceDisplay(\n result.minPrice,\n result.minPriceStatus,\n result.maxPrice,\n result.maxPriceStatus,\n ),\n );\n\n //if both the min and max prices are not full-priced, we need to show the original price\n if (result.minPriceStatus !== 1 && result.maxPriceStatus !== 1) {\n var origPriceDisplay = $(\"\").addClass(\n \"pdp-price-message-group\",\n );\n origPriceDisplay.append(\"Orig: \");\n origPriceDisplay.append(\n formatNumberToCurrency(result.minMarketingPrice),\n );\n if (result.minMarketingPrice < result.maxMarketingPrice) {\n origPriceDisplay.append(\n \" - \" + formatNumberToCurrency(result.maxMarketingPrice),\n );\n }\n $(selectors.price).append(origPriceDisplay);\n }\n\n $(selectors.selectedItem).val(isolatedItemId);\n\n //update the display panels that vary based on what is selected/available\n var displayPanelsToShow =\n \".js-availability-\" +\n result.availability +\n \",.js-display-type-\" +\n result.displayType +\n \",.js-display-type-\" +\n result.displayType +\n \"-availability-\" +\n result.availability;\n\n var compatibilityButton = $(selectors.compatibilityButton);\n\n //also if we're narrowed down, we need to update the sell out risk display\n if (isolatedItemId) {\n displayPanelsToShow +=\n \",.sellout-risk-\" + itemInfo[isolatedItemId].SelloutRisk;\n }\n\n //disable the compatibility button if we're isolated down to item(s) that are not available at the warehouse,\n //are not display type of full, or do not belong to collection(s)\n compatibilityButton.prop(\n \"disabled\",\n !!(\n !result.isInCollection ||\n (result.availability & 1) !== 1 ||\n result.displayType !== 1\n ),\n );\n\n showCompatibilityModal(isolatedItemId);\n\n $displayPanels.not(displayPanelsToShow).hide();\n $displayPanels.filter(displayPanelsToShow).show();\n\n const estimatedShipDate = result.estimatedShipDate;\n const shippingTimeMessaging = estimatedShipDate\n ? \"Estimated ship date: \" +\n `${\n estimatedShipDate.getUTCMonth() + 1\n }/${estimatedShipDate.getUTCDate()}/${estimatedShipDate\n .getUTCFullYear()\n .toString()\n .substring(2)}`\n : \"Ships in 24 Hours\";\n\n $(selectors.availableToShipDate).html(shippingTimeMessaging);\n\n if (estimatedShipDate || countdownExpired) {\n $(selectors.countdownHide).show();\n $(selectors.countdownShow).hide();\n } else if (!countdownExpired) {\n $(selectors.countdownShow).show();\n $(selectors.countdownHide).hide();\n }\n\n updateAffirmUI(result.minPrice, result.maxPrice);\n },\n });\n }\n\n buyGridSelection();\n /*\n * mobile reviews click.\n * since the reviews are hidden at mobile we need to hjiack the functionality\n * of the click event on the stars and scroll and open the accordion\n */\n\n $(selectors.reviewComponent).on(\"click\", function (e) {\n if (evo.isMobile) {\n $(\"body, html\").animate(\n {\n scrollTop: $(selectors.pdpReviews).offset().top,\n },\n 500,\n \"swing\",\n function () {\n var $reviewsAccordionHeader = $(\n selectors.pdpReviews + \" .js-mobile-accordion-header\",\n );\n if (!$reviewsAccordionHeader.hasClass(\"active\")) {\n $reviewsAccordionHeader.trigger(\"click\");\n }\n },\n );\n }\n });\n\n //handle for the compatibility button click\n //simply redirects the user to the href attribute\n //(anchor tag wasn't used here since they can't be disabled)\n $(selectors.compatibilityButton)\n .on(\"click\", function (e) {\n e.preventDefault();\n var selectedItemId = $(selectors.selectedItem).val(),\n $this = $(this);\n\n if (selectedItemId) {\n window.location.href =\n $this.data(\"href-base\") + \"&SelectedItemIds=\" + selectedItemId;\n }\n });\n\n // Since the custom gift card amount is a textbox, but all the other\n // values of the gift card are radio buttons, need to assign the number\n // entered into the text box to its associated radio button.\n (function () {\n var customRadio = $(selectors.giftCardCustomRadio);\n\n // If the product is not gift card then exit the function\n if (!customRadio.size()) {\n return false;\n }\n\n //load default item ids for the custom radio button (it has none by default)\n var allItemIds = Object.keys(itemInfo);\n customRadio.attr(\"data-itemids\", allItemIds.join(\",\"));\n customRadio.addClass(\"_\" + allItemIds.join(\" _\"));\n\n //also clear out the value of the radio (default is 'on' for some reason)\n customRadio.val(\"\");\n\n // Prevent non-numeric values from being entered for the custom amount\n $(selectors.giftCardCustomTextBox)\n .keydown(function (event) {\n switch (event.which) {\n //backspace\n case 8:\n //tab\n case 9:\n return true;\n //delete\n case 46:\n //arrow keys\n case 37:\n case 38:\n case 39:\n case 40:\n //home/end\n case 35:\n case 36:\n return true;\n //case 0-9\n case 48:\n case 49:\n case 50:\n case 51:\n case 52:\n case 53:\n case 54:\n case 55:\n case 56:\n case 57:\n case 96:\n case 97:\n case 98:\n case 99:\n case 100:\n case 101:\n case 102:\n case 103:\n case 104:\n case 105:\n var indexOfPeriod = this.value.indexOf(\".\");\n return (\n indexOfPeriod === -1 || indexOfPeriod > this.value.length - 3\n );\n //'.' period\n case 110:\n case 190:\n return this.value.indexOf(\".\") < 0;\n default:\n return false;\n }\n })\n .on(\"focus keyup\", function () {\n // On keyup update the value for the radio button based on what has been entered in the text box.\n const amount = $(this).val().trim();\n\n customRadio.prop(\"checked\", !!amount);\n customRadio.val(amount);\n customRadio.data(\n \"display-value\",\n isNaN(amount) ? \"\" : formatNumberToCurrency(amount),\n );\n customRadio.trigger(\"change\");\n\n // gift card amount cannot be greater than 1000\n $(this)\n .parent()\n .siblings(selectors.giftCardMaxError)\n .toggle(amount > 1000);\n\n // gift card amount cannot be less than 20\n $(this)\n .parent()\n .siblings(selectors.giftCardMinError)\n .toggle(!!amount && amount < 20);\n })\n .on(\"mouseup\", function (event) {\n event.stopImmediatePropagation();\n });\n })();\n\n $(selectors.addOnButton).on('click', function (e) {\n e.preventDefault();\n\n const action = this.attributes.getNamedItem(\"data-compatible-related-products-action\").value;\n const productName = this.attributes.getNamedItem(\"data-product-name\").value;\n const modalHeader = $(selectors.addOnButtonModalHeader).val();\n const modalSubheader = $(selectors.addOnButtonModalSubheader).val();\n \n window.dataLayerManager.pushCompatibleBindingsClick(productName);\n let $loadingFeedback = $(selectors.addToCartUINotify);\n $loadingFeedback.addClass(\"loading\");\n \n const $dynamicModal = generateModalTemplate(\"\", \"modal-loading pdp-interstitial\");\n\n $.get(action)\n .done((result) => {\n $dynamicModal.find(\".modal-content\").append(result);\n $dynamicModal.find(\".add-on-header\").append(modalHeader);\n $dynamicModal.find(\".add-on-subheader\").append(modalSubheader);\n evo.$.body.trigger(\"loaded.evo.pdp.interstitial\", $dynamicModal);\n })\n .fail(function () {\n $dynamicModal.modal(\"hide\");\n window.alert(\"Oops! An error occurred while loading compatible products, please refresh the page and try again.\");\n })\n .always(function () {\n $dynamicModal.removeClass(\"modal-loading\");\n $loadingFeedback.removeClass(\"loading\");\n });\n })\n\n // handler for the add to cart click event\n // asserts that the user has narrowed the selections down to a single SKU\n // if not, it prevents the user from continuing and displays validation messages.\n // If valid then will display the interstitial cart modal for the customer.\n $(selectors.addToCartButton).on(\"click\", function (e) {\n e.preventDefault();\n\n var selectedItemId = $(selectors.selectedItem).val(),\n $loadingFeedback = $(selectors.addToCartUINotify);\n\n var skusByItemIds = JSON.parse($(selectors.items).val());\n var customComponentItems = JSON.parse($(selectors.componentItemList).val());\n\n // Price does not work quite the same as the other matrix selectors because the value of price is not a ProductID.\n var prices = $('input[name=\"Price\"]');\n var selectedPrice = prices.filter(\":checked\");\n var quantity = $(\"#pdp-add-to-cart-qty\").val();\n var hazmatId = $('input[name=\"HazardousMaterialId\"]').val();\n\n if (selectedItemId) {\n if (\n !prices.length ||\n (selectedPrice.length &&\n !isNaN(selectedPrice.val()) &&\n parseFloat(selectedPrice.val()) > 0)\n ) {\n var $this = $(this);\n\n // UI add loading class to button\n $loadingFeedback.addClass(\"loading\");\n\n // Add selected item to cart\n var $form = $this.closest(\"form\");\n var addToCartAction = $form.attr(\"action\");\n var json = {\n Availability: $(selectors.productAvailability).val(),\n BrandName: $(selectors.brandName).val(),\n CanadianOverridePrice: $(selectors.canadianOverridePrice).val(),\n CoreTaxonomyNodePath: $(selectors.coreNodePath).val(),\n EstimatedShipDate: $(selectors.estimatedShipDate).val(),\n ItemId: selectedItemId,\n ProductId: $(selectors.productId).val(),\n CoreTaxonomyNodeId: $(selectors.coreNodeId).val(),\n Quantity: quantity,\n SKU: skusByItemIds[selectedItemId],\n };\n\n if (hazmatId > 0) {\n json[\"HazardousMaterialId\"] = hazmatId;\n }\n\n if (selectedPrice.length) {\n json[\"Price\"] = selectedPrice.val();\n json[\"To\"] = $('input[name=\"To\"]').val();\n json[\"From\"] = $('input[name=\"From\"]').val();\n json[\"EmailAddress\"] = $('input[name=\"EmailAddress\"]:visible').val();\n json[\"Message\"] = $('input[name=\"Message\"]').val();\n json[\"Option\"] = $('input[name=\"Option\"]:enabled').val();\n } else {\n var componentItemIds = $(selectors.componentItemIds).val();\n if (componentItemIds.length) {\n var groupedComponentIds = componentItemIds.split(\",\");\n json[\"ComponentItemIds\"] = groupedComponentIds;\n\n json[\"ComponentItems\"] = [];\n for (var i = 0; i < groupedComponentIds.length; i++) {\n var mashupComponentItem = customComponentItems.filter((item) =>\n item[\"ItemId\"].toString().includes(groupedComponentIds[i]),\n );\n json[\"ComponentItems\"].push(\n JSON.stringify(mashupComponentItem[0]),\n );\n }\n }\n }\n\n $.get(addToCartAction, $.param(json, true))\n .done(function (result) {\n if (!result.success) {\n $loadingFeedback.removeClass(\"loading\");\n\n $.each(result.errors, function () {\n var $validationMessages = $(\n '[data-val-message-for=\"' + this.property + '\"]',\n );\n\n $validationMessages.html(this.errors[0]).show();\n $('input[name=\"' + this.property + '\"]').one(\n \"change\",\n function () {\n $validationMessages.hide();\n },\n );\n });\n\n return;\n }\n\n // UI fire modal with loading animation\n var $dynamicModal = generateModalTemplate(\n \"\",\n \"modal-loading pdp-interstitial\",\n );\n // Request the interstitial cart view\n $.ajax($this.data(\"interstitial-action\"), {\n data: $.param(json, true),\n cache: false,\n method: \"get\",\n })\n .done(function (html) {\n // Open Interstitial Cart modal load the content and remove the loading animation.\n $dynamicModal.find(\".modal-content\").append(html);\n evo.$.body.trigger(\n \"loaded.evo.pdp.interstitial\",\n $dynamicModal,\n );\n })\n .fail(function () {\n $dynamicModal.modal(\"hide\");\n })\n .always(function () {\n $dynamicModal.removeClass(\"modal-loading\");\n $loadingFeedback.removeClass(\"loading\");\n });\n })\n .fail(function () {\n $(\"[id^=GiftCard]\").each(function () {\n $(this)\n .next(selectors.errorMessage)\n .toggle(\n (this.required && !this.value) ||\n !this.value.match(\n /^[A-Za-z0-9\\s\\.!#\\$%&\\*\\(\\)\\?/'\"\";:\\[\\]\\{\\}=\\+-_]*$/,\n )\n ? true\n : false,\n );\n });\n $loadingFeedback.removeClass(\"loading\");\n });\n evo.$.body.trigger(\"added.evo.pdp.addtocart\", selectedItemId);\n return;\n }\n }\n\n // This is to test for the case of a gift card custom amount being selected, but no value or 0 being entered.\n if (\n prices.length &&\n (!selectedPrice.length ||\n isNaN(selectedPrice.val()) ||\n !parseFloat(selectedPrice.val()) > 0)\n ) {\n prices.prop(\"checked\", false);\n }\n\n $(selectors.matrices)\n .filter(function () {\n var checkedCount = 0,\n enabledCount = 0;\n\n $(this)\n .find(selectors.matrixOptions)\n .each(function () {\n var $opt = $(this);\n\n if ($opt.is(\":enabled\")) {\n enabledCount++;\n if ($opt.is(\":checked\")) {\n checkedCount++;\n }\n }\n });\n\n return !checkedCount && enabledCount > 1;\n })\n .find(selectors.errorMessage)\n .each(function (n) {\n var $this = $(this);\n evo.$.body.trigger(\"error.evo.pdp.addtocart\", $this.text());\n $this.show();\n\n // scroll to the first error message if it is off canvas\n if (n === 0) {\n scrollToErrorMessage(this);\n }\n });\n\n $(\"[id^=GiftCard]\").each(function () {\n $(this)\n .next(selectors.errorMessage)\n .toggle(\n (this.required && !this.value) ||\n !this.value.match(\n /^[A-Za-z0-9\\s\\.!#\\$%&\\*\\(\\)\\?/'\"\";:\\[\\]\\{\\}=\\+-_]*$/,\n )\n ? true\n : false,\n );\n });\n });\n\n // Prevent the item quantity from being set outside the range [1, 99]\n $(document.body).on(\"change\", 'input[name=\"Quantity\"]', function () {\n var val = $(this).val();\n if (val <= 0) {\n val = 1;\n } else if (val >= 100) {\n val = 99;\n }\n $(this).val(val);\n });\n\n // Add focus style to matrix option container on tab over\n $(selectors.matrixOptions)\n .on(\"keyup\", function (e) {\n switch (e.keyCode) {\n // tab\n case 9:\n // arrow keys\n case 37:\n case 38:\n case 39:\n case 40:\n $(this).closest(selectors.matrixOptionList).addClass(\"focused\");\n break;\n default:\n return;\n }\n })\n .on(\"blur\", function () {\n $(this).closest(selectors.matrixOptionList).removeClass(\"focused\");\n });\n\n //click handler for the \"Find in Store\" button\n //includes the currently selected item id (if any) into the url\n //so that the item can be auto-selected\n $(selectors.findInStoreButton).on(\"click\", function () {\n var $this = $(this),\n selectedItemId = $(selectors.selectedItem).val(),\n href = $this.data(\"href\"),\n originalHref = $this.data(\"original-href\") || href;\n\n //save the originally set href value so that we can alter it in case\n //the button is clicked multiple times with different selections (corner case)\n $this.data(\"original-href\", originalHref);\n\n if (selectedItemId) {\n href = originalHref + \"&SelectedItemId=\" + selectedItemId;\n } else if (href !== originalHref) {\n href = originalHref;\n }\n $this.data(\"href\", href);\n });\n\n // click handler for the 'Notify Me' button\n $(selectors.notifyMeButton).on(\"click\", function (event) {\n event.preventDefault();\n\n const action = this.attributes.getNamedItem('data-view-oos-action').value;\n const productName = this.attributes.getNamedItem('data-oos-product-name').value;\n\n const $dynamicModal = generateModalTemplate(\"\", \"modal-loading oos-modal\");\n $.get(action)\n .done((result) => {\n $dynamicModal.find(\".modal-content\").append(result);\n $dynamicModal.find(\".modal-header\").append(productName);\n })\n .fail(function () {\n $dynamicModal.modal(\"hide\");\n })\n .always(function () {\n $dynamicModal.removeClass(\"modal-loading\");\n });\n });\n\n evo.$.body.on(\"time-elapsed.evo.countdown\", function () {\n countdownExpired = true;\n $(selectors.countdownHide).show().removeClass(\"js-countdown-hide\");\n $(selectors.countdownShow).remove();\n });\n})(jQuery);\n","(function ($) {\n //dom ready\n $(function () {\n $('#review-link').click(function () {\n if (evo.$.window.width() < evo.mq.screenSmMin) {\n var $reviewHeader = $('#pdp-reviews').find('.js-mobile-accordion-header');\n if (!$reviewHeader.hasClass('active')) {\n $reviewHeader.trigger('click');\n }\n }\n });\n\n //init the hero.js plugin on the hero container\n $('.js-pdp-hero-container').heroInteraction();\n\n var anchorNavOffset = $('.mashup-anchor-nav').length ? 80 : 75;\n\n $('.js-scrolltoid').scrollToID({\n offset: anchorNavOffset\n });\n\n $('.mobile-accordion-group').mobileAccordion();\n $('.desktop-accordion-group').mobileAccordion({ desktopAccordion: true });\n\n // call bootstrap scrollspy for sticky pdp-navigation. offset equals height of pdp-anchor-nav + pdp description header\n evo.$.body.scrollspy({\n target: '#pdp-anchor-navigation', offset: 84\n });\n $('#related-products-row').hoverScroll({\n parent: $('#related-products-container')\n });\n\n var registerPageViewUrl = $('#page-view-url').val();\n if (registerPageViewUrl) {\n $.post(registerPageViewUrl);\n }\n });\n})(jQuery);","(function ($) {\n $('div[data-ajax-url]').each(function () {\n var $this = $(this),\n dataURL = $this.attr('data-ajax-url'),\n callbackFn = $this.attr('data-ajax-callback');\n\n $this.load(dataURL, function () {\n $this.trigger(callbackFn);\n });\n });\n\n function initializeRelatedPackages() {\n var packageLength = $('#pdp-buy-grid-package').find('.product-thumb').length;\n\n if (packageLength > 1) {\n $('#pdp-related-packages').removeClass('hide');\n $('#related-product-anchor-link').removeClass('hide').scrollToID({\n offset: 40\n });\n }\n }\n\n function initializeSimilar() {\n //doing nothing for now\n }\n\n evo.$.body.on('initializeRelatedPackages', initializeRelatedPackages);\n evo.$.body.on('initializeSimilar', initializeSimilar);\n})(jQuery);","/// \n/// \n/// Google tracking events for the PDP page\n/// \n(function ($) {\n evo.tracking.setCategory('PDP-Interactions');\n evo.tracking.setActions({\n 'bc': 'Breadcrumbs',\n 'ql': 'Quicklink',\n 'rv': 'RecentlyViewed',\n 'aiv': 'AltImageVideo',\n 'bga': 'BuyGrid-AddToCart',\n 'bge': 'BuyGrid-Error',\n 'bgs': 'BuyGrid-SocialLinks',\n 'sab': 'ShopAllBrandsClick',\n 'spb': 'SuggestedProducts-BuyAsPackage',\n 'spp': 'SuggestedProducts-PurchasedCompatible',\n 'spr': 'SuggestedProducts-Related',\n 'sps': 'SuggestedProducts-Similar',\n 'acmb': 'AddToCartModal-Button',\n 'acms': 'AddToCartModal-Suggested'\n });\n\n $(function () {\n evo.$.body.on('loaded.evo.pdp.interstitial', function (e, modal) {\n evo.tracking.bindTracking(modal);\n });\n evo.$.body.on('error.evo.pdp.addtocart', function (e, message) {\n evo.tracking.track('PDP-Interactions', 'bge', message);\n });\n evo.$.body.on('added.evo.pdp.addtocart', function (e, childsku) {\n evo.tracking.track('PDP-Interactions', 'bga', childsku);\n });\n // Bind the product thumb click events to push to the Google dataLayer.\n evo.$.body.on(\"click\", \".js-product-thumb-link, .js-product-thumb-details-link\", function () {\n var productPageId = $(this).data(\"unique-id\");\n\n window.dataLayerManager.pushProductClick(productPageId, \"Results\");\n });\n\n //WX-3644 Remove query selector and event listener\n document.addEventListener('qatc-clicked', (customEvent) => {\n const event = {\n event: 'Clicked Add to Cart Test',\n productId: customEvent.detail.id\n };\n dataLayer.push(event);\n\n window.location.href = customEvent.detail.url;\n });\n });\n})(jQuery);"]}