{"version":3,"file":"js/splits/product.js","sources":["webpack:///./node_modules/call-bind/callBound.js","webpack:///./node_modules/call-bind/index.js","webpack:///./node_modules/function-bind/implementation.js","webpack:///./node_modules/function-bind/index.js","webpack:///./node_modules/has-proto/index.js","webpack:///./node_modules/has-symbols/index.js","webpack:///./node_modules/has-symbols/shams.js","webpack:///./node_modules/has/src/index.js","webpack:///./org_colony/cartridge/js/pages/product/availability.js","webpack:///./org_colony/cartridge/js/pages/product/index.js","webpack:///./org_colony/cartridge/js/pages/product/productNav.js","webpack:///./org_colony/cartridge/js/pages/product/productSet.js","webpack:///./org_colony/cartridge/js/pages/product/variant.js","webpack:///./org_colony/cartridge/js/storeinventory/index.js","webpack:///./org_colony/cartridge/js/storeinventory/product.js","webpack:///./util.inspect (ignored)"],"sourcesContent":["'use strict';\n\nvar GetIntrinsic = require('get-intrinsic');\n\nvar callBind = require('./');\n\nvar $indexOf = callBind(GetIntrinsic('String.prototype.indexOf'));\n\nmodule.exports = function callBoundIntrinsic(name, allowMissing) {\n\tvar intrinsic = GetIntrinsic(name, !!allowMissing);\n\tif (typeof intrinsic === 'function' && $indexOf(name, '.prototype.') > -1) {\n\t\treturn callBind(intrinsic);\n\t}\n\treturn intrinsic;\n};\n","'use strict';\n\nvar bind = require('function-bind');\nvar GetIntrinsic = require('get-intrinsic');\n\nvar $apply = GetIntrinsic('%Function.prototype.apply%');\nvar $call = GetIntrinsic('%Function.prototype.call%');\nvar $reflectApply = GetIntrinsic('%Reflect.apply%', true) || bind.call($call, $apply);\n\nvar $gOPD = GetIntrinsic('%Object.getOwnPropertyDescriptor%', true);\nvar $defineProperty = GetIntrinsic('%Object.defineProperty%', true);\nvar $max = GetIntrinsic('%Math.max%');\n\nif ($defineProperty) {\n\ttry {\n\t\t$defineProperty({}, 'a', { value: 1 });\n\t} catch (e) {\n\t\t// IE 8 has a broken defineProperty\n\t\t$defineProperty = null;\n\t}\n}\n\nmodule.exports = function callBind(originalFunction) {\n\tvar func = $reflectApply(bind, $call, arguments);\n\tif ($gOPD && $defineProperty) {\n\t\tvar desc = $gOPD(func, 'length');\n\t\tif (desc.configurable) {\n\t\t\t// original length, plus the receiver, minus any additional arguments (after the receiver)\n\t\t\t$defineProperty(\n\t\t\t\tfunc,\n\t\t\t\t'length',\n\t\t\t\t{ value: 1 + $max(0, originalFunction.length - (arguments.length - 1)) }\n\t\t\t);\n\t\t}\n\t}\n\treturn func;\n};\n\nvar applyBind = function applyBind() {\n\treturn $reflectApply(bind, $apply, arguments);\n};\n\nif ($defineProperty) {\n\t$defineProperty(module.exports, 'apply', { value: applyBind });\n} else {\n\tmodule.exports.apply = applyBind;\n}\n","'use strict';\n\n/* eslint no-invalid-this: 1 */\n\nvar ERROR_MESSAGE = 'Function.prototype.bind called on incompatible ';\nvar slice = Array.prototype.slice;\nvar toStr = Object.prototype.toString;\nvar funcType = '[object Function]';\n\nmodule.exports = function bind(that) {\n    var target = this;\n    if (typeof target !== 'function' || toStr.call(target) !== funcType) {\n        throw new TypeError(ERROR_MESSAGE + target);\n    }\n    var args = slice.call(arguments, 1);\n\n    var bound;\n    var binder = function () {\n        if (this instanceof bound) {\n            var result = target.apply(\n                this,\n                args.concat(slice.call(arguments))\n            );\n            if (Object(result) === result) {\n                return result;\n            }\n            return this;\n        } else {\n            return target.apply(\n                that,\n                args.concat(slice.call(arguments))\n            );\n        }\n    };\n\n    var boundLength = Math.max(0, target.length - args.length);\n    var boundArgs = [];\n    for (var i = 0; i < boundLength; i++) {\n        boundArgs.push('$' + i);\n    }\n\n    bound = Function('binder', 'return function (' + boundArgs.join(',') + '){ return binder.apply(this,arguments); }')(binder);\n\n    if (target.prototype) {\n        var Empty = function Empty() {};\n        Empty.prototype = target.prototype;\n        bound.prototype = new Empty();\n        Empty.prototype = null;\n    }\n\n    return bound;\n};\n","'use strict';\n\nvar implementation = require('./implementation');\n\nmodule.exports = Function.prototype.bind || implementation;\n","'use strict';\n\nvar test = {\n\tfoo: {}\n};\n\nvar $Object = Object;\n\nmodule.exports = function hasProto() {\n\treturn { __proto__: test }.foo === test.foo && !({ __proto__: null } instanceof $Object);\n};\n","'use strict';\n\nvar origSymbol = typeof Symbol !== 'undefined' && Symbol;\nvar hasSymbolSham = require('./shams');\n\nmodule.exports = function hasNativeSymbols() {\n\tif (typeof origSymbol !== 'function') { return false; }\n\tif (typeof Symbol !== 'function') { return false; }\n\tif (typeof origSymbol('foo') !== 'symbol') { return false; }\n\tif (typeof Symbol('bar') !== 'symbol') { return false; }\n\n\treturn hasSymbolSham();\n};\n","'use strict';\n\n/* eslint complexity: [2, 18], max-statements: [2, 33] */\nmodule.exports = function hasSymbols() {\n\tif (typeof Symbol !== 'function' || typeof Object.getOwnPropertySymbols !== 'function') { return false; }\n\tif (typeof Symbol.iterator === 'symbol') { return true; }\n\n\tvar obj = {};\n\tvar sym = Symbol('test');\n\tvar symObj = Object(sym);\n\tif (typeof sym === 'string') { return false; }\n\n\tif (Object.prototype.toString.call(sym) !== '[object Symbol]') { return false; }\n\tif (Object.prototype.toString.call(symObj) !== '[object Symbol]') { return false; }\n\n\t// temp disabled per https://github.com/ljharb/object.assign/issues/17\n\t// if (sym instanceof Symbol) { return false; }\n\t// temp disabled per https://github.com/WebReflection/get-own-property-symbols/issues/4\n\t// if (!(symObj instanceof Symbol)) { return false; }\n\n\t// if (typeof Symbol.prototype.toString !== 'function') { return false; }\n\t// if (String(sym) !== Symbol.prototype.toString.call(sym)) { return false; }\n\n\tvar symVal = 42;\n\tobj[sym] = symVal;\n\tfor (sym in obj) { return false; } // eslint-disable-line no-restricted-syntax, no-unreachable-loop\n\tif (typeof Object.keys === 'function' && Object.keys(obj).length !== 0) { return false; }\n\n\tif (typeof Object.getOwnPropertyNames === 'function' && Object.getOwnPropertyNames(obj).length !== 0) { return false; }\n\n\tvar syms = Object.getOwnPropertySymbols(obj);\n\tif (syms.length !== 1 || syms[0] !== sym) { return false; }\n\n\tif (!Object.prototype.propertyIsEnumerable.call(obj, sym)) { return false; }\n\n\tif (typeof Object.getOwnPropertyDescriptor === 'function') {\n\t\tvar descriptor = Object.getOwnPropertyDescriptor(obj, sym);\n\t\tif (descriptor.value !== symVal || descriptor.enumerable !== true) { return false; }\n\t}\n\n\treturn true;\n};\n","'use strict';\n\nvar hasOwnProperty = {}.hasOwnProperty;\nvar call = Function.prototype.call;\n\nmodule.exports = call.bind ? call.bind(hasOwnProperty) : function (O, P) {\n  return call.call(hasOwnProperty, O, P);\n};\n","const ajax = require('../../ajax');\nconst util = require('../../util');\n\nfunction updateContainer(data) {\n    const $availabilityMsg = $('#pdpMain .availability .availability-msg');\n    let message; // this should be lexically scoped, when `let` is supported (ES6)\n    if (!data) {\n        $availabilityMsg.html(Resources.ITEM_STATUS_NOTAVAILABLE);\n        return;\n    }\n    $availabilityMsg.empty();\n    // Look through levels ... if msg is not empty, then create span el\n    if (data.levels.IN_STOCK > 0) {\n        if (data.levels.PREORDER === 0 && data.levels.BACKORDER === 0 && data.levels.NOT_AVAILABLE === 0) {\n            // Just in stock\n            message = Resources.IN_STOCK;\n        } else {\n            // In stock with conditions ...\n            message = data.inStockMsg;\n        }\n        $availabilityMsg.append(`<p class=\"in-stock-msg\">${message}</p>`);\n    }\n    if (data.levels.PREORDER > 0) {\n        if (data.levels.IN_STOCK === 0 && data.levels.BACKORDER === 0 && data.levels.NOT_AVAILABLE === 0) {\n            message = Resources.PREORDER;\n        } else {\n            message = data.preOrderMsg;\n        }\n        $availabilityMsg.append(`<p class=\"preorder-msg\">${message}</p>`);\n    }\n    if (data.levels.BACKORDER > 0) {\n        if (data.levels.IN_STOCK === 0 && data.levels.PREORDER === 0 && data.levels.NOT_AVAILABLE === 0) {\n            message = Resources.BACKORDER;\n        } else {\n            message = data.backOrderMsg;\n        }\n        $availabilityMsg.append(`<p class=\"backorder-msg\">${message}</p>`);\n    }\n    if (data.inStockDate !== '') {\n        $availabilityMsg.append(`<p class=\"in-stock-date-msg\">${String.format(Resources.IN_STOCK_DATE, data.inStockDate)}</p>`);\n    }\n    if (data.levels.NOT_AVAILABLE > 0) {\n        if (data.levels.PREORDER === 0 && data.levels.BACKORDER === 0 && data.levels.IN_STOCK === 0) {\n            message = Resources.NOT_AVAILABLE;\n        } else {\n            message = Resources.REMAIN_NOT_AVAILABLE;\n        }\n        $availabilityMsg.append(`<p class=\"not-available-msg\">${message}</p>`);\n    }\n}\n\nfunction getAvailability() {\n    ajax.getJson({\n        url: util.appendParamsToUrl(Urls.getAvailability, {\n            pid: $('#pid').val(),\n            Quantity: $(this).val(),\n        }),\n        callback: updateContainer,\n    });\n}\n\nmodule.exports = function availability() {\n    $('body').on('change', '.pdpForm input[name=\"Quantity\"], .pdpForm select[name=\"Quantity\"]', getAvailability);\n};\n","const dialog = require('../../dialog');\nconst tooltip = require('../../tooltip');\nconst util = require('../../util');\nconst addToCart = require('./addToCart');\nconst availability = require('./availability');\nconst image = require('./image');\nconst productNav = require('./productNav');\nconst productSet = require('./productSet');\nconst variant = require('./variant');\n\n/**\n * @description Initialize product detail page with reviews, recommendation and product navigation.\n */\nfunction initializeDom() {\n    productNav();\n    tooltip.init();\n    $('.recommendations-container .tiles-container').slick({\n        speed: 300,\n        dots: false,\n        arrows: true,\n        slide: '.grid-tile',\n        slidesToShow: 4,\n        slidesToScroll: 1,\n        responsive: [\n            {\n                breakpoint: util.getViewports('md'),\n                settings: {\n                    slidesToShow: 2,\n                },\n            },\n            {\n                breakpoint: 690,\n                settings: {\n                    slidesToShow: 1,\n                },\n            },\n        ],\n    });\n}\n\n/**\n * @description Initialize event handlers on product detail page\n */\nfunction initializeEvents() {\n    const $pdpMain = $('#pdpMain');\n\n    addToCart();\n    availability();\n    variant();\n    image();\n    productSet();\n    util.initDynamicCarousel('[id^=\"cq_recomm_slot\"]', '.recommendations-container .tiles-container', 0);\n    util.initDynamicCarousel('[id^=\"cq_recomm_slot\"]', '.recommendations-container .tiles-container', 1);\n\n    // Add to Wishlist and Add to Gift Registry links behaviors\n    $pdpMain.on('click', '[data-action=\"wishlist\"], [data-action=\"gift-registry\"]', (e) => {\n        const data = util.getQueryStringParams($('.pdpForm').serialize());\n        if (data.cartAction) {\n            delete data.cartAction;\n        }\n        const url = util.appendParamsToUrl(e.currentTarget.href, data);\n        e.currentTarget.setAttribute('href', url);\n    });\n\n    $pdpMain.on('click', '#ask-a-question-link', (event) => {\n        const $askAQuestionLink = $(event.target);\n\n        const $quickViewDialog = $askAQuestionLink.closest('#QuickViewDialog');\n        const $fullPdpLinkWithHashParam = $('.pdp-linkto-questions');\n        if ($quickViewDialog.length && $fullPdpLinkWithHashParam.length) {\n            $fullPdpLinkWithHashParam[0].click();\n            return;\n        }\n\n        const $prQuestionBtn = $('#pr-question-form-link');\n        $('.tab.questions .tab-header').addClass('expanded');\n\n        $prQuestionBtn.trigger('click');\n        if ($prQuestionBtn.offset().top) {\n            $('html, body').animate({\n                scrollTop: ($prQuestionBtn.offset().top),\n            }, 200);\n        }\n    });\n\n    // product options\n    $pdpMain.on('change', '.product-options select', (e) => {\n        const salesPrice = $pdpMain.find('.product-add-to-cart .price-sales');\n        const selectedItem = $(e.currentTarget).children().filter(':selected').first();\n        salesPrice.text(selectedItem.data('combined'));\n    });\n\n    // prevent default behavior of thumbnail link and add this Button\n    $pdpMain.on('click', '.thumbnail-link, .unselectable a', (e) => {\n        e.preventDefault();\n    });\n\n    // convert personalization fields to all caps that require uppercase\n    $pdpMain.on('blur', '.personalization-input.uppercase', (e) => {\n        $(e.currentTarget).val($(e.currentTarget).val().toUpperCase());\n    });\n\n    // show hidden personalization fields when the 'Show More Options' link is clicked\n    $pdpMain.on('click', '.show-more', (e) => {\n        e.preventDefault();\n        $('.personalization-option.visually-hidden').removeClass('visually-hidden');\n        $(e.currentTarget).hide();\n    });\n\n    // show hidden optional personalization fields when the checkbox is checked\n    $pdpMain.on('click', '#personalized-check', (e) => {\n        if ($(e.currentTarget).is(':checked')) {\n            $(e.currentTarget).closest('.personalization-box').find('.optional-personalization').css('display', 'block');\n            $pdpMain.find('.swatchanchor').each((index, element) => {\n                element.setAttribute('href', util.appendParamsToUrl(element.href, {personalizedChecked: 'true'}));\n            });\n        } else {\n            $(e.currentTarget).closest('.personalization-box').find('.optional-personalization').css('display', 'none');\n            $pdpMain.find('.swatchanchor').each((index, element) => {\n                element.setAttribute('href', util.removeParamFromURL(element.href, 'personalizedChecked'));\n            });\n        }\n    });\n\n    // dynamic max quantity values for pick n choose products\n    $pdpMain.on('change', 'input.pnc-qty', () => {\n        const packCount = parseInt($('.pnc').data('packcount'), 10);\n        let totalQty = 0;\n        // calculate the total quantity of pick n choose items\n        $('input.pnc-qty').each((index, element) => {\n            totalQty += parseInt($(element).val(), 10);\n        });\n        // set the new max quantity based on quantity remaining in the selected pack\n        const remainingQty = packCount - totalQty;\n        $('input.pnc-qty:not(.disabled)').each((index, element) => {\n            const maxAmount = parseInt($(element).val(), 10) + remainingQty;\n            const maxAvailable = parseInt($(element).data('available'), 10);\n            // make sure max is not more than the amount available\n            $(element).prop('max', maxAmount > maxAvailable ? maxAvailable : maxAmount);\n        });\n        if (totalQty <= packCount && totalQty >= 0) {\n            $pdpMain.find('.pnc-remain-count').text(totalQty);\n        }\n    });\n\n    $('.size-chart-link a').on('click', (e) => {\n        e.preventDefault();\n        dialog.open({\n            url: $(e.target).attr('href'),\n        });\n    });\n\n    $pdpMain.on('click', '.tab-header', (e) => {\n        $(e.currentTarget).toggleClass('expanded');\n    }).on('click', '.open-dialog', (e) => {\n        e.preventDefault();\n        dialog.open({\n            url: $(e.currentTarget).attr('href'),\n            doClose: $('.pt_product-search-result').length === 0,\n            options: {\n                title: $(e.currentTarget).find('.visually-hidden').text() || $(e.currentTarget).attr('title'),\n            },\n        });\n    }).on('click', '.restrictions-dialog', (e) => {\n        e.preventDefault();\n        dialog.open({\n            url: $(e.target).attr('href'),\n            doClose: $('.pt_product-search-result').length === 0,\n            options: {\n                width: 540,\n                title: $(e.target).attr('title'),\n                dialogClass: 'restrictions-dialog',\n            },\n        });\n    });\n\n    // Pick 'n Choose\n    const pncAttribute = $('ul.colpackcount');\n    if (pncAttribute.length > 0) {\n        // Trigger Pick 'n Choose quantity inputs to reset max quantity\n        $pdpMain.find('.pnc-qty').trigger('change');\n    }\n}\n\nconst product = {\n    initializeEvents,\n    init() {\n        initializeDom();\n        initializeEvents();\n    },\n};\n\nmodule.exports = product;\n","const ajax = require('../../ajax');\nconst util = require('../../util');\n\n/**\n * @description loads product's navigation\n * */\nmodule.exports = () => {\n    const $pidInput = $('.pdpForm input[name=\"pid\"]').last();\n    const $navContainer = $('#product-nav-container');\n    // if no hash exists, or no pid exists, or nav container does not exist, return\n    if (window.location.hash.length <= 1 || $pidInput.length === 0 || $navContainer.length === 0) {\n        return;\n    }\n\n    const pid = $pidInput.val();\n    const hash = window.location.hash.substr(1);\n    const url = util.appendParamToURL(`${Urls.productNav}?${hash}`, 'pid', pid);\n\n    ajax.load({\n        url,\n        target: $navContainer,\n    });\n};\n","const ajax = require('../../ajax');\nconst tooltip = require('../../tooltip');\nconst util = require('../../util');\n\nmodule.exports = () => {\n    const $addToCart = $('#add-to-cart');\n    const $addAllToCart = $('#add-all-to-cart');\n    const $productSetList = $('#product-set-list');\n\n    const updateAddToCartButtons = () => {\n        if ($productSetList.find('.add-to-cart-disabled').length > 0) {\n            $addAllToCart.attr('disabled', 'disabled');\n            // product set does not have an add-to-cart button, but product bundle does\n            $addToCart.attr('disabled', 'disabled');\n        } else {\n            $addAllToCart.removeAttr('disabled');\n            $addToCart.removeAttr('disabled');\n        }\n    };\n\n    const updateAddAllToCartButton = () => {\n        if ($productSetList.find('.product-set-item form').not('.suppressed').length === 0) {\n            $addAllToCart.attr('disabled', 'disabled');\n        } else if ($productSetList.find('.add-to-cart-disabled').length === 0) {\n            $addAllToCart.removeAttr('disabled');\n        }\n    };\n\n    const suppressForm = (el) => {\n        const qtyVal = el.val();\n        const parentForm = el.parents('form');\n        if (qtyVal < 1 || qtyVal === '') {\n            parentForm.addClass('suppressed');\n        } else {\n            parentForm.removeClass('suppressed');\n        }\n        updateAddAllToCartButton();\n    };\n\n    if ($productSetList.length > 0) {\n        updateAddToCartButtons();\n    }\n    // click on swatch for product set\n    $productSetList.on('click', '.product-set-item .swatchanchor', (e) => {\n        e.preventDefault();\n        if ($(e.currentTarget).parents('li').hasClass('unselectable')) { return; }\n        const url = Urls.getSetItem + e.currentTarget.search;\n        const $container = $(e.currentTarget).closest('.product-set-item');\n        const qty = $container.find('form input[name=\"Quantity\"], form select[name=\"Quantity\"]').first().val();\n\n        const ratingHtml = $container.find('.rating-wrapper').html();\n\n        ajax.load({\n            url: util.appendParamToURL(url, 'Quantity', Number.isNaN(qty) ? '1' : qty),\n            target: $container,\n            callback() {\n                updateAddToCartButtons();\n                tooltip.init();\n                const newQtyField = $container.find('form input[name=\"Quantity\"], form select[name=\"Quantity\"]').first();\n                suppressForm(newQtyField);\n                if (ratingHtml) {\n                    $container.find('.rating-wrapper').html(ratingHtml);\n                }\n            },\n        });\n    // handle selects for product sets\n    }).on('change', '.product-set-item .variation-select', (e) => {\n        e.preventDefault();\n        const selectedOptionURL = $(e.currentTarget).val();\n        const selectedOptionURLtrim = selectedOptionURL.indexOf('?');\n        const variationValue = selectedOptionURL.substring(selectedOptionURLtrim);\n        const url = Urls.getSetItem + variationValue;\n        const $container = $(e.currentTarget).closest('.product-set-item');\n        const qty = $container.find('form input[name=\"Quantity\"], form select[name=\"Quantity\"]').first().val();\n\n        ajax.load({\n            url: util.appendParamToURL(url, 'Quantity', Number.isNaN(qty) ? '1' : qty),\n            target: $container,\n            callback() {\n                updateAddToCartButtons();\n                tooltip.init();\n                const newQtyField = $container.find('form input[name=\"Quantity\"], form select[name=\"Quantity\"]').first();\n                suppressForm(newQtyField);\n            },\n        });\n    }).on('change', '.product-set-item input[name=\"Quantity\"]', (e) => {\n        suppressForm($(e.currentTarget));\n    }).on('click', '.add-to-cart', (e) => {\n        const parentForm = $(e.currentTarget).parents('.product-add-to-cart');\n        if (parentForm.hasClass('suppressed')) {\n            parentForm.removeClass('suppressed');\n            updateAddAllToCartButton();\n        }\n    });\n\n    /* global pwr */\n    if (SitePreferences.ENABLE_POWER_REVIEWS) {\n        window.pwr = window.pwr || function initPwr(...args) {\n            (pwr.q = pwr.q || []).push(args);\n        };\n\n        const snippets = $('.ps-review-snippet');\n\n        if (snippets.length > 0) {\n            const prArray = [];\n            snippets.each((idx, snippet) => {\n                const $snippet = $(snippet);\n                prArray.push({\n                    ENABLE_CLIENT_SIDE_STRUCTURED_DATA: false,\n                    api_key: SitePreferences.PR_API_KEY,\n                    locale: SitePreferences.PR_LOCALE,\n                    merchant_group_id: SitePreferences.PR_MERCHANT_GROUP_ID,\n                    merchant_id: SitePreferences.PR_MERCHANT_ID,\n                    page_id: $snippet.data('page-id'),\n                    components: {\n                        CategorySnippet: snippet.id,\n                    },\n                });\n            });\n\n            pwr('render', prArray);\n            const targetNode = document.getElementById('product-set-list');\n\n            const observer = new MutationObserver((mutationList) => {\n                mutationList.forEach((mutation) => {\n                    if (mutation.type === 'childList' && mutation.addedNodes.length > 0) {\n                        const $links = $(mutation.target).find('.pr-no-reviews').parents('.rating-wrapper').find('.links');\n                        if ($links.length > 0) {\n                            $($links.children()[0]).hide();\n                            $($links.children()[1]).html(Resources.WRITE_FIRST_REVIEW);\n                        }\n                    }\n                });\n            });\n\n            observer.observe(targetNode, {childList: true, subtree: true});\n        }\n    }\n};\n","const ajax = require('../../ajax');\nconst image = require('./image');\nconst progress = require('../../progress');\nconst productStoreInventory = require('../../storeinventory/product');\nconst tooltip = require('../../tooltip');\nconst util = require('../../util');\nconst validator = require('../../validator');\n\n/**\n * @description restore form values when product content is updated (Personalization and Pick 'n Choose)\n * @param {Array} formdata - array with name/value objects\n * @param {String} eventType - the type of event to trigger on the updated field\n * */\nfunction restoreFormValues(formdata, eventType) {\n    $.each(formdata, (i, val) => {\n        if (val.value !== '' && $(`#${val.name}`).length > 0) {\n            // Update value and trigger event for validation/update\n            $(`#${val.name}`).val(val.value).trigger(eventType);\n        }\n    });\n}\n\n/**\n * @function\n * @desc Replaces the PDP header with the updated variation information\n */\nfunction replaceHeader() {\n    const $newHeading = $('.update-product-content-header');\n    const $targetHeading = $('.product-col-1');\n\n    if ($newHeading.length && $targetHeading.length) {\n        $targetHeading.html($newHeading.html());\n        $newHeading.remove();\n    }\n}\n\n/**\n * @description update product content with new variant from href, load new content to #product-content panel\n * @param {String} href - url of the new product variant\n * */\nfunction updateContent(href) {\n    const $pdpForm = $('.pdpForm');\n    const qty = $pdpForm.find('input[name=\"Quantity\"], select[name=\"Quantity\"]').first().val();\n    const params = {\n        Quantity: Number.isNaN(qty) ? '1' : qty,\n        format: 'ajax',\n        productlistid: $pdpForm.find('input[name=\"productlistid\"]').first().val(),\n    };\n    // Save personalized values before refreshing content\n    const personalizationValues = $('.personalization-options input, .personalization-options select').serializeArray();\n    const pncOldPackSize = $('.pnc').data('packcount');\n    const pncValues = $('.pnc input').serializeArray();\n    const showMore = $('a.show-more').is(':hidden');\n\n    progress.show($('#pdpMain'));\n\n    ajax.load({\n        url: util.appendParamsToUrl(href, params),\n        target: $('#product-content'),\n        callback() {\n            if (SitePreferences.STORE_PICKUP) {\n                productStoreInventory.init();\n            }\n\n            // Replace the PDP images\n            image.replaceImages();\n            // Replace the PDP heading content (name, id, price)\n            replaceHeader();\n            // Re-init the tooltips\n            tooltip.init();\n            if ($('#product-content').length > 0) {\n                image.heroCarousel();\n                image.wistiaThumbmail();\n            }\n            if (personalizationValues.length > 0) {\n                // Re-init the validator\n                validator.init();\n                // Restore personalization values\n                restoreFormValues(personalizationValues, 'blur');\n                // Show extra options if 'Show More Options' has already been clicked\n                if (showMore) {\n                    $('a.show-more').click();\n                }\n            }\n            // Restore Pick 'n Choose quantities\n            if (pncValues.length > 0) {\n                const pncNewPackSize = $('.pnc').data('packcount');\n                // Only restore quantities if moving to a larger pack size\n                if (parseInt(pncNewPackSize, 10) > parseInt(pncOldPackSize, 10)) {\n                    restoreFormValues(pncValues, 'change');\n                    // Trigger one more change because the 'X of X items selected' text doesn't consistently update\n                    $('input.pnc-qty').change();\n                }\n            }\n        },\n    });\n}\n\nmodule.exports = () => {\n    const $pdpMain = $('#pdpMain');\n\n    // click on swatch - should replace product content with new variant\n    $pdpMain.on('click', '.product-detail .swatchanchor', (e) => {\n        e.preventDefault();\n        if ($(e.currentTarget).parents('li').hasClass('unselectable')) { return; }\n        updateContent(e.currentTarget.href);\n    });\n\n    // change drop down variation attribute - should replace product content with new variant\n    $pdpMain.on('change', '.variation-select', (e) => {\n        const $productSetList = $('#product-set-list');\n        if ($(e.currentTarget).val().length === 0) { return; }\n        if ($productSetList.length === 0) {\n            updateContent($(e.currentTarget).val());\n        }\n    });\n};\n","const forEach = require('lodash.foreach');\nconst map = require('lodash.map');\nconst TPromise = require('promise');\nconst dialog = require('../dialog');\nconst util = require('../util');\n\nfunction storeTemplate(store, selectedStoreId, selectedStoreText) {\n    return [\n        `<li class=\"store-tile ${store.storeId}${store.storeId === selectedStoreId ? ' selected' : ''}\">`,\n        '    <p class=\"store-address\">',\n        `        ${store.address1}<br/>`,\n        `        ${store.city}, ${store.stateCode} ${store.postalCode}`,\n        '    </p>',\n        `    <p class=\"store-status\" data-status=\"${store.statusclass}\">${store.status}</p>`,\n        `    <button class=\"select-store-button\" data-store-id=\"${store.storeId}\"${\n            store.statusclass !== 'store-in-stock' ? 'disabled=\"disabled\"' : ''}>`,\n        `        ${store.storeId === selectedStoreId ? selectedStoreText : Resources.SELECT_STORE}`,\n        '    </button>',\n        '</li>',\n    ].join('\\n');\n}\n\nfunction storeListTemplate(stores, selectedStoreId, selectedStoreText) {\n    if (stores && stores.length) {\n        return [\n            '<div class=\"store-list-container\">',\n            '<ul class=\"store-list\">',\n            map(stores, (store) => storeTemplate(store, selectedStoreId, selectedStoreText)).join('\\n'),\n            '</ul>',\n            '</div>',\n            '<div class=\"store-list-pagination\">',\n            '</div>',\n        ].join('\\n');\n    }\n    return `<div class=\"no-results\">${Resources.INVALID_ZIP}</div>`;\n}\n\nfunction zipPromptTemplate() {\n    return [\n        '<div id=\"preferred-store-panel\">',\n        `    <input type=\"text\" id=\"user-zip\" placeholder=\"${Resources.ENTER_ZIP}\" name=\"zipCode\"/>`,\n        '</div>',\n    ].join('\\n');\n}\n\n/**\n * @description test whether zipcode is valid for either US or Canada\n * @return {Boolean} true if the zipcode is valid for either country, false if it's invalid for both\n * */\nfunction validateZipCode(zipCode) {\n    const regexes = {\n        canada: /^[ABCEGHJKLMNPRSTVXY]\\d[ABCEGHJKLMNPRSTVWXYZ]( )?\\d[ABCEGHJKLMNPRSTVWXYZ]\\d$/i,\n        usa: /^\\d{5}(-\\d{4})?$/,\n    };\n    let valid = false;\n    if (!zipCode) { return false; }\n    forEach(regexes, (re) => {\n        const regexp = new RegExp(re);\n        valid = regexp.test(zipCode);\n    });\n    return valid;\n}\n\nconst storeinventory = {\n    zipPrompt(callback) {\n        const self = this;\n        dialog.open({\n            html: zipPromptTemplate(),\n            options: {\n                title: Resources.STORE_NEAR_YOU,\n                width: 500,\n                buttons: [{\n                    text: Resources.SEARCH,\n                    click() {\n                        const zipCode = $('#user-zip').val();\n                        if (validateZipCode(zipCode)) {\n                            self.setUserZip(zipCode);\n                            if (callback) {\n                                callback(zipCode);\n                            }\n                        }\n                    },\n                }],\n                open() {\n                    $('#user-zip').on('keypress', (e) => {\n                        if (e.which === 13) {\n                            // trigger the search button\n                            $('.ui-dialog-buttonset .ui-button').trigger('click');\n                        }\n                    });\n                },\n            },\n        });\n    },\n    getStoresInventory(pid) {\n        return TPromise.resolve($.ajax({\n            url: util.appendParamsToUrl(Urls.storesInventory, {\n                pid,\n                zipCode: User.zip,\n            }),\n            dataType: 'json',\n        }));\n    },\n    /**\n     * @description open the dialog to select store\n     * @param {Array} options.stores\n     * @param {String} options.selectedStoreId\n     * @param {String} options.selectedStoreText\n     * @param {Function} options.continueCallback\n     * @param {Function} options.selectStoreCallback\n     * */\n    selectStoreDialog(options) {\n        const self = this;\n        const {stores} = options;\n        const {selectedStoreId} = options;\n        const {selectedStoreText} = options;\n        const storeList = storeListTemplate(stores, selectedStoreId, selectedStoreText);\n        dialog.open({\n            html: storeList,\n            options: {\n                title: `${Resources.SELECT_STORE} - ${User.zip}`,\n                buttons: [{\n                    text: Resources.CHANGE_LOCATION,\n                    click() {\n                        self.setUserZip(null);\n                        // trigger the event to start the process all over again\n                        $('.set-preferred-store').trigger('click');\n                    },\n                }, {\n                    text: Resources.CONTINUE,\n                    click() {\n                        if (options.continueCallback) {\n                            options.continueCallback(stores);\n                        }\n                        dialog.close();\n                    },\n                }],\n                open() {\n                    $('.select-store-button').on('click', (event) => {\n                        event.preventDefault();\n                        const storeId = $(event.currentTarget).data('storeId');\n                        // if the store is already selected, don't select again\n                        if (storeId === selectedStoreId) { return; }\n                        $('.store-list .store-tile.selected').removeClass('selected')\n                            .find('.select-store-button').text(Resources.SELECT_STORE);\n                        $(event.currentTarget).text(selectedStoreText)\n                            .closest('.store-tile').addClass('selected');\n                        if (options.selectStoreCallback) {\n                            options.selectStoreCallback(storeId);\n                        }\n                    });\n                },\n            },\n        });\n    },\n    setUserZip(zip) {\n        User.zip = zip;\n        $.ajax({\n            type: 'POST',\n            url: Urls.setZipCode,\n            data: {\n                zipCode: zip,\n            },\n        });\n    },\n    shippingLoad() {\n        const $checkoutForm = $('.address');\n        $checkoutForm.off('click');\n        $checkoutForm.on('click', 'input[name$=\"_shippingAddress_isGift\"]', (event) => {\n            $(event.currentTarget).parent().siblings('.gift-message-text').toggleClass('hidden', $('input[name$=\"_shippingAddress_isGift\"]:checked').val());\n        });\n    },\n};\n\nmodule.exports = storeinventory;\n","const map = require('lodash.map');\nconst inventory = require('.');\n\nfunction pdpStoreTemplate(store) {\n    return [\n        `<li class=\"store-list-item ${store.storeId === User.storeId ? ' selected' : ''}\">`,\n        `    <div class=\"store-address\">${store.address1}, ${store.city} ${store.stateCode\n        } ${store.postalCode}</div>`,\n        `    <div class=\"store-status\" data-status=\"${store.statusclass}\">${store.status}</div>`,\n        '</li>',\n    ].join('\\n');\n}\nfunction pdpStoresListingTemplate(stores) {\n    if (stores && stores.length) {\n        return [\n            '<div class=\"store-list-pdp-container\">',\n            (stores.length > 1 ? `    <a class=\"stores-toggle collapsed\" href=\"#\">${Resources.SEE_MORE}</a>` : ''),\n            '    <ul class=\"store-list-pdp\">',\n            map(stores, pdpStoreTemplate).join('\\n'),\n            '    </ul>',\n            '</div>',\n        ].join('\\n');\n    }\n    return '';\n}\n\nfunction storesListing(stores) {\n    // list all stores on PDP page\n    if ($('.store-list-pdp-container').length) {\n        $('.store-list-pdp-container').remove();\n    }\n    $('.availability-results').append(pdpStoresListingTemplate(stores));\n}\n\nconst productInventory = {\n    setPreferredStore(storeId) {\n        User.storeId = storeId;\n        $.ajax({\n            url: Urls.setPreferredStore,\n            type: 'POST',\n            data: {storeId},\n        });\n    },\n    productSelectStore() {\n        const self = this;\n        inventory.getStoresInventory(this.pid).then((stores) => {\n            inventory.selectStoreDialog({\n                stores,\n                selectedStoreId: User.storeId,\n                selectedStoreText: Resources.PREFERRED_STORE,\n                continueCallback: storesListing,\n                selectStoreCallback: self.setPreferredStore,\n            });\n        }).done();\n    },\n    init() {\n        const $availabilityContainer = $('.availability-results');\n        const self = this;\n        this.pid = $('input[name=\"pid\"]').val();\n\n        $('#product-content .set-preferred-store').on('click', (event) => {\n            event.preventDefault();\n            if (!User.zip) {\n                inventory.zipPrompt(() => {\n                    self.productSelectStore();\n                });\n            } else {\n                self.productSelectStore();\n            }\n        });\n\n        if ($availabilityContainer.length) {\n            if (User.storeId) {\n                inventory.getStoresInventory(this.pid).then(storesListing);\n            }\n\n            // See more or less stores in the listing\n            $availabilityContainer.on('click', '.stores-toggle', (event) => {\n                event.preventDefault();\n                $('.store-list-pdp .store-list-item').toggleClass('visible');\n                if ($(event.currentTarget).hasClass('collapsed')) {\n                    $(event.currentTarget).text(Resources.SEE_LESS);\n                } else {\n                    $(event.currentTarget).text(Resources.SEE_MORE);\n                }\n                $(event.currentTarget).toggleClass('collapsed');\n            });\n        }\n    },\n};\n\nmodule.exports = productInventory;\n","/* (ignored) */"],"mappings":";;;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;AC9CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACnDA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACPA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;;;;;;;;;;;AC/DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;;;;;;;;;;;AChMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACtBA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AAAA;AACA;AACA;AACA;;;;;;;;;;;AC1IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACpHA;AACA;AACA;AACA;AACA;AAEA;AACA;AAaA;AAEA;AACA;AACA;AAGA;AAAA;AAMA;AACA;AACA;AAEA;AACA;AAKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;;;;;;;;;;;AC9KA;AACA;AAEA;AACA;AAOA;AACA;AACA;AACA;AAQA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;;;;;;;;;;;AC3FA;;;;A","sourceRoot":""}