{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./cartridges/app_custom_northeastern/cartridge/client/default/js/product/wishlistHeart.js","webpack:///./cartridges/storefront-reference-architecture/cartridges/app_storefront_base/cartridge/client/default/js/util.js","webpack:///./cartridges/storefront-reference-architecture/cartridges/app_storefront_base/cartridge/client/default/js/product/base.js","webpack:///./cartridges/storefront-reference-architecture/cartridges/app_storefront_base/cartridge/client/default/js/components/focus.js","webpack:///./cartridges/app_custom_northeastern/cartridge/client/default/js/productDetail.js","webpack:///./cartridges/app_custom_northeastern/cartridge/client/default/js/product/productDetail.js","webpack:///./cartridges/storefront-reference-architecture/cartridges/app_storefront_base/cartridge/client/default/js/product/detail.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","displayMessageAndChangeIcon","data","icon","previousFocus","status","$","spinner","stop","success","hasClass","removeClass","addClass","closest","attr","length","append","msg","focus","on","e","preventDefault","type","keyCode","remove","addToWishlistTile","document","activeElement","this","find","url","pid","optionId","optionVal","start","ajax","dataType","error","err","responseJSON","redirectUrl","window","location","href","include","keys","forEach","focusHelper","getPidValue","$el","text","getQuantitySelector","quantitySelected","quantitySelectedModal","quantitySelectedPDP","undefined","val","getQuantitySelected","handleVariantResponse","response","$productContainer","isVaraint","isChoiceOfBonusProducts","parents","product","variationAttributes","attrs","msgs","attrsWithSwatches","indexOf","id","values","attrValue","$attrValue","$swatchButton","parent","selected","siblings","assistiveSelectedText","empty","removeAttr","selectable","processSwatchValues","$attr","resetUrl","processNonSwatchValues","updateAttrs","resources","productType","readyToOrder","imgs","carousel","carouselId","alt","parseInt","index","title","appendTo","first","detach","createCarousel","images","large","replaceWith","price","html","promotionsHtml","availabilityValue","availabilityMessages","availability","messages","message","info_selectforstock","trigger","updateAvailability","attributes","attributeGroup","ID","attribute","label","getAttributesHtml","attributeSelect","selectedValueUrl","container","method","optionsHtml","updateOptions","quantities","map","quantity","join","updateQuantities","parseHtml","$html","parseHTML","body","footer","children","chooseBonusProducts","bonusUrl","bonusChoiceRuleBased","showProductsUrlRuleBased","showProductsUrlListBased","htmlString","maxBonusItems","uuid","pliUUID","addToCartUrl","pageSize","labels","selectprods","parsedHtml","renderedTemplate","enterDialogMessage","closeButtonText","modal","getOptions","options","$elOption","urlValue","selectedValueId","toArray","JSON","stringify","miniCartReportingUrl","methods","editBonusProducts","focusChooseBonusProductModal","onClosingChooseBonusProductModal","trapChooseBonusProductModalFocus","focusParams","event","containerSelector","firstElementSelector","lastElementSelector","setTabNextFocus","colorAttribute","selectAttribute","currentTarget","addToCart","pidsObj","setPids","each","push","qty","childProducts","form","messageType","newBonusDiscountLineItem","setTimeout","handlePostCartAdd","reportingURL","selectBonusProduct","$choiceOfBonusProduct","maxPids","submittedQty","totalQty","optionID","valueId","selectedBonusProductHtml","removeBonusProduct","$selected","count","enableBonusProductSelection","available","showMoreBonusProducts","addBonusProductsToCart","$readyToOrderBonusProducts","queryString","pidsObject","bonusProducts","qtyOption","option","productId","errorMessage","msgSuccess","reload","firstFocusableEl","lastFocusableEl","is","nextToLastElementSelector","linkElements","shiftKey","processInclude","ready","base","detailBase","updateAttributesAndDetails","selectedColorAttr","attributeId","$colorDisplay","displayValue","attributesHtml","shortDescription","longDescription","updateAttribute","showSpinner","updateAddToCart","sizeChart","copyProductLink","mobileDonateButtonScrollTo","querySelector","scrollIntoView","behavior","normalizeTestimonialCarousel","tallest","items","heights","height","Math","max","apply","css","productColor","productSize","productQty","giftAmount","seletedFund","productTotal","productPrice","selectFund","trim","parseFloat","toFixed","digitMatch","match","color","size","donation","total","replace","getProductOptions","physcialProductFund","$productAddedSuccessfullyModal","productImage","imageAlt","imageTitle","productName","hide","show","includes","cookie","quantityTotal","updateAddToCartEnableDisableOtherElements","enableOrDisable","eq","enable","every","item","allAvailable","allReady","$prodSizeChart","content","toggleClass","$sizeChart","has","target","$temp","select","execCommand"],"mappings":"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","file":"default\\js\\productDetail.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 80);\n","/**\r\n * @author: Cloud for Good\r\n * @description: Applies custom Advancement logic to the Wishlist Cartridge client-side logic.\r\n *\r\n * History\r\n * \r\n * 2022-09-30 Cloud for Good N/A Initial creation\r\n * 2024-08-30 Jassin Yacks CFG-489 Enhanced the Heart icon to ensure ADA compliance.\r\n*/\r\n\r\n'use strict';\r\n\r\n/**\r\n * appends params to a url\r\n * @param {string} data - data returned from the server's ajax call\r\n * @param {Object} icon - icon that was clicked to add a product to the wishlist\r\n */\r\nfunction displayMessageAndChangeIcon(data, icon, previousFocus) {\r\n $.spinner().stop();\r\n\r\n //declare variables\r\n var status;\r\n\r\n if (data.success) {\r\n status = 'alert-success';\r\n\r\n //if the heart is not filled in\r\n if (icon.hasClass('fa-heart-o')) {\r\n //set the class to 'fa-heart' to fill it in\r\n icon.removeClass('fa-heart-o').addClass('fa-heart');\r\n //update aria tag on heart icon button\r\n icon.closest('button').attr('aria-pressed', true);\r\n //update title and assistive text\r\n icon.attr('title', 'Added to favorites');\r\n\r\n }\r\n } else {\r\n status = 'alert-danger';\r\n }\r\n\r\n if ($('.add-to-wishlist-messages').length === 0) {\r\n $('body').append(\r\n `
\r\n

${data.msg}

\r\n \r\n
`\r\n );\r\n }\r\n\r\n $('.add-to-wishlist-messages .close').focus();\r\n\r\n $('.add-to-wishlist-messages .close').on('click keydown', function(e) {\r\n e.preventDefault();\r\n if (e.type === \"click\" || e.keyCode === 13) {\r\n $('.add-to-wishlist-messages').remove();\r\n if (previousFocus) {\r\n previousFocus.focus();\r\n }\r\n }\r\n })\r\n}\r\n\r\nmodule.exports = {\r\n addToWishlistTile: function () {\r\n $('body').on('click', 'button.wishlistTile, button.wishlistDetail', function (e) {\r\n e.preventDefault();\r\n var previousFocus = $(document.activeElement);\r\n var icon = $(this).find($('i'));\r\n var url = $(this).attr('href');\r\n var pid = $(this).closest('.product').data('pid');\r\n var optionId = $(this).closest('.product-detail').find('.product-option').attr('data-option-id');\r\n var optionVal = $(this).closest('.product-detail').find('.options-select option:selected').attr('data-value-id');\r\n optionId = optionId || null;\r\n optionVal = optionVal || null;\r\n if (!url || !pid) {\r\n return;\r\n }\r\n\r\n $.spinner().start();\r\n $.ajax({\r\n url: url,\r\n type: 'post',\r\n dataType: 'json',\r\n data: {\r\n pid: pid,\r\n optionId: optionId,\r\n optionVal: optionVal\r\n },\r\n success: function (data) {\r\n displayMessageAndChangeIcon(data, icon, previousFocus);\r\n },\r\n error: function (err) {\r\n if (err.responseJSON.redirectUrl) {\r\n window.location.href = err.responseJSON.redirectUrl;\r\n } else {\r\n displayMessageAndChangeIcon(err, icon, previousFocus);\r\n }\r\n }\r\n });\r\n });\r\n }\r\n};\r\n","'use strict';\r\n\r\nmodule.exports = function (include) {\r\n if (typeof include === 'function') {\r\n include();\r\n } else if (typeof include === 'object') {\r\n Object.keys(include).forEach(function (key) {\r\n if (typeof include[key] === 'function') {\r\n include[key]();\r\n }\r\n });\r\n }\r\n};\r\n","'use strict';\r\nvar focusHelper = require('../components/focus');\r\n\r\n/**\r\n * Retrieves the relevant pid value\r\n * @param {jquery} $el - DOM container for a given add to cart button\r\n * @return {string} - value to be used when adding product to cart\r\n */\r\nfunction getPidValue($el) {\r\n var pid;\r\n\r\n if ($('#quickViewModal').hasClass('show') && !$('.product-set').length) {\r\n pid = $($el).closest('.modal-content').find('.product-quickview').data('pid');\r\n } else if ($('.product-set-detail').length || $('.product-set').length) {\r\n pid = $($el).closest('.product-detail').find('.product-id').text();\r\n } else {\r\n pid = $('.product-detail:not(\".bundle-item\")').data('pid');\r\n }\r\n\r\n return pid;\r\n}\r\n\r\n/**\r\n * Retrieve contextual quantity selector\r\n * @param {jquery} $el - DOM container for the relevant quantity\r\n * @return {jquery} - quantity selector DOM container\r\n */\r\nfunction getQuantitySelector($el) {\r\n var quantitySelected;\r\n if ($el && $('.set-items').length) {\r\n quantitySelected = $($el).closest('.product-detail').find('.quantity-select');\r\n } else if ($el && $('.product-bundle').length) {\r\n var quantitySelectedModal = $($el).closest('.modal-footer').find('.quantity-select');\r\n var quantitySelectedPDP = $($el).closest('.bundle-footer').find('.quantity-select');\r\n if (quantitySelectedModal.val() === undefined) {\r\n quantitySelected = quantitySelectedPDP;\r\n } else {\r\n quantitySelected = quantitySelectedModal;\r\n }\r\n } else {\r\n quantitySelected = $('.quantity-select');\r\n }\r\n return quantitySelected;\r\n}\r\n\r\n/**\r\n * Retrieves the value associated with the Quantity pull-down menu\r\n * @param {jquery} $el - DOM container for the relevant quantity\r\n * @return {string} - value found in the quantity input\r\n */\r\nfunction getQuantitySelected($el) {\r\n return getQuantitySelector($el).val();\r\n}\r\n\r\n/**\r\n * Process the attribute values for an attribute that has image swatches\r\n *\r\n * @param {Object} attr - Attribute\r\n * @param {string} attr.id - Attribute ID\r\n * @param {Object[]} attr.values - Array of attribute value objects\r\n * @param {string} attr.values.value - Attribute coded value\r\n * @param {string} attr.values.url - URL to de/select an attribute value of the product\r\n * @param {boolean} attr.values.isSelectable - Flag as to whether an attribute value can be\r\n * selected. If there is no variant that corresponds to a specific combination of attribute\r\n * values, an attribute may be disabled in the Product Detail Page\r\n * @param {jQuery} $productContainer - DOM container for a given product\r\n * @param {Object} msgs - object containing resource messages\r\n */\r\nfunction processSwatchValues(attr, $productContainer, msgs) {\r\n attr.values.forEach(function (attrValue) {\r\n var $attrValue = $productContainer.find('[data-attr=\"' + attr.id + '\"] [data-attr-value=\"' +\r\n attrValue.value + '\"]');\r\n var $swatchButton = $attrValue.parent();\r\n\r\n if (attrValue.selected) {\r\n $attrValue.addClass('selected');\r\n $attrValue.siblings('.selected-assistive-text').text(msgs.assistiveSelectedText);\r\n } else {\r\n $attrValue.removeClass('selected');\r\n $attrValue.siblings('.selected-assistive-text').empty();\r\n }\r\n\r\n if (attrValue.url) {\r\n $swatchButton.attr('data-url', attrValue.url);\r\n } else {\r\n $swatchButton.removeAttr('data-url');\r\n }\r\n\r\n // Disable if not selectable\r\n $attrValue.removeClass('selectable unselectable');\r\n\r\n $attrValue.addClass(attrValue.selectable ? 'selectable' : 'unselectable');\r\n });\r\n}\r\n\r\n/**\r\n * Process attribute values associated with an attribute that does not have image swatches\r\n *\r\n * @param {Object} attr - Attribute\r\n * @param {string} attr.id - Attribute ID\r\n * @param {Object[]} attr.values - Array of attribute value objects\r\n * @param {string} attr.values.value - Attribute coded value\r\n * @param {string} attr.values.url - URL to de/select an attribute value of the product\r\n * @param {boolean} attr.values.isSelectable - Flag as to whether an attribute value can be\r\n * selected. If there is no variant that corresponds to a specific combination of attribute\r\n * values, an attribute may be disabled in the Product Detail Page\r\n * @param {jQuery} $productContainer - DOM container for a given product\r\n */\r\nfunction processNonSwatchValues(attr, $productContainer) {\r\n var $attr = '[data-attr=\"' + attr.id + '\"]';\r\n var $defaultOption = $productContainer.find($attr + ' .select-' + attr.id + ' option:first');\r\n $defaultOption.attr('value', attr.resetUrl);\r\n\r\n attr.values.forEach(function (attrValue) {\r\n var $attrValue = $productContainer\r\n .find($attr + ' [data-attr-value=\"' + attrValue.value + '\"]');\r\n $attrValue.attr('value', attrValue.url)\r\n .removeAttr('disabled');\r\n\r\n if (!attrValue.selectable) {\r\n $attrValue.attr('disabled', true);\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Routes the handling of attribute processing depending on whether the attribute has image\r\n * swatches or not\r\n *\r\n * @param {Object} attrs - Attribute\r\n * @param {string} attr.id - Attribute ID\r\n * @param {jQuery} $productContainer - DOM element for a given product\r\n * @param {Object} msgs - object containing resource messages\r\n */\r\nfunction updateAttrs(attrs, $productContainer, msgs) {\r\n // Currently, the only attribute type that has image swatches is Color.\r\n var attrsWithSwatches = ['color'];\r\n\r\n attrs.forEach(function (attr) {\r\n if (attrsWithSwatches.indexOf(attr.id) > -1) {\r\n processSwatchValues(attr, $productContainer, msgs);\r\n } else {\r\n processNonSwatchValues(attr, $productContainer);\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Updates the availability status in the Product Detail Page\r\n *\r\n * @param {Object} response - Ajax response object after an\r\n * attribute value has been [de]selected\r\n * @param {jQuery} $productContainer - DOM element for a given product\r\n */\r\nfunction updateAvailability(response, $productContainer) {\r\n var availabilityValue = '';\r\n var availabilityMessages = response.product.availability.messages;\r\n if (!response.product.readyToOrder) {\r\n availabilityValue = '
  • ' + response.resources.info_selectforstock + '
  • ';\r\n } else {\r\n availabilityMessages.forEach(function (message) {\r\n availabilityValue += '
  • ' + message + '
  • ';\r\n });\r\n }\r\n\r\n $($productContainer).trigger('product:updateAvailability', {\r\n product: response.product,\r\n $productContainer: $productContainer,\r\n message: availabilityValue,\r\n resources: response.resources\r\n });\r\n}\r\n\r\n/**\r\n * Generates html for product attributes section\r\n *\r\n * @param {array} attributes - list of attributes\r\n * @return {string} - Compiled HTML\r\n */\r\nfunction getAttributesHtml(attributes) {\r\n if (!attributes) {\r\n return '';\r\n }\r\n\r\n var html = '';\r\n\r\n attributes.forEach(function (attributeGroup) {\r\n if (attributeGroup.ID === 'mainAttributes') {\r\n attributeGroup.attributes.forEach(function (attribute) {\r\n html += '
    ' + attribute.label + ': '\r\n + attribute.value + '
    ';\r\n });\r\n }\r\n });\r\n\r\n return html;\r\n}\r\n\r\n/**\r\n * @typedef UpdatedOptionValue\r\n * @type Object\r\n * @property {string} id - Option value ID for look up\r\n * @property {string} url - Updated option value selection URL\r\n */\r\n\r\n/**\r\n * @typedef OptionSelectionResponse\r\n * @type Object\r\n * @property {string} priceHtml - Updated price HTML code\r\n * @property {Object} options - Updated Options\r\n * @property {string} options.id - Option ID\r\n * @property {UpdatedOptionValue[]} options.values - Option values\r\n */\r\n\r\n/**\r\n * Updates DOM using post-option selection Ajax response\r\n *\r\n * @param {OptionSelectionResponse} optionsHtml - Ajax response optionsHtml from selecting a product option\r\n * @param {jQuery} $productContainer - DOM element for current product\r\n */\r\nfunction updateOptions(optionsHtml, $productContainer) {\r\n\t// Update options\r\n $productContainer.find('.product-options').empty().html(optionsHtml);\r\n}\r\n\r\n/**\r\n * Dynamically creates Bootstrap carousel from response containing images\r\n * @param {Object[]} imgs - Array of large product images,along with related information\r\n * @param {jQuery} $productContainer - DOM element for a given product\r\n */\r\nfunction createCarousel(imgs, $productContainer) {\r\n var carousel = $productContainer.find('.carousel');\r\n $(carousel).carousel('dispose');\r\n var carouselId = $(carousel).attr('id');\r\n $(carousel).empty().append('
      ' + $(carousel).data('prev') + '' + $(carousel).data('next') + '');\r\n for (var i = 0; i < imgs.length; i++) {\r\n $('
      \"'
      ').appendTo($(carousel).find('.carousel-inner'));\r\n $('
    1. ').appendTo($(carousel).find('.carousel-indicators'));\r\n }\r\n $($(carousel).find('.carousel-item')).first().addClass('active');\r\n $($(carousel).find('.carousel-indicators > li')).first().addClass('active');\r\n if (imgs.length === 1) {\r\n $($(carousel).find('.carousel-indicators, a[class^=\"carousel-control-\"]')).detach();\r\n }\r\n $(carousel).carousel();\r\n $($(carousel).find('.carousel-indicators')).attr('aria-hidden', true);\r\n}\r\n\r\n/**\r\n * Parses JSON from Ajax call made whenever an attribute value is [de]selected\r\n * @param {Object} response - response from Ajax call\r\n * @param {Object} response.product - Product object\r\n * @param {string} response.product.id - Product ID\r\n * @param {Object[]} response.product.variationAttributes - Product attributes\r\n * @param {Object[]} response.product.images - Product images\r\n * @param {boolean} response.product.hasRequiredAttrsSelected - Flag as to whether all required\r\n * attributes have been selected. Used partially to\r\n * determine whether the Add to Cart button can be enabled\r\n * @param {jQuery} $productContainer - DOM element for a given product.\r\n */\r\nfunction handleVariantResponse(response, $productContainer) {\r\n var isChoiceOfBonusProducts =\r\n $productContainer.parents('.choose-bonus-product-dialog').length > 0;\r\n var isVaraint;\r\n if (response.product.variationAttributes) {\r\n updateAttrs(response.product.variationAttributes, $productContainer, response.resources);\r\n isVaraint = response.product.productType === 'variant';\r\n if (isChoiceOfBonusProducts && isVaraint) {\r\n $productContainer.parent('.bonus-product-item')\r\n .data('pid', response.product.id);\r\n\r\n $productContainer.parent('.bonus-product-item')\r\n .data('ready-to-order', response.product.readyToOrder);\r\n }\r\n }\r\n\r\n // Update primary images\r\n var primaryImageUrls = response.product.images.large;\r\n createCarousel(primaryImageUrls, $productContainer);\r\n\r\n // Update pricing\r\n if (!isChoiceOfBonusProducts) {\r\n var $priceSelector = $('.prices .price', $productContainer).length\r\n ? $('.prices .price', $productContainer)\r\n : $('.prices .price');\r\n $priceSelector.replaceWith(response.product.price.html);\r\n }\r\n\r\n // Update promotions\r\n $productContainer.find('.promotions').empty().html(response.product.promotionsHtml);\r\n\r\n updateAvailability(response, $productContainer);\r\n\r\n if (isChoiceOfBonusProducts) {\r\n var $selectButton = $productContainer.find('.select-bonus-product');\r\n $selectButton.trigger('bonusproduct:updateSelectButton', {\r\n product: response.product, $productContainer: $productContainer\r\n });\r\n } else {\r\n // Enable \"Add to Cart\" button if all required attributes have been selected\r\n $('button.add-to-cart, button.add-to-cart-global, button.update-cart-product-global').trigger('product:updateAddToCart', {\r\n product: response.product, $productContainer: $productContainer\r\n }).trigger('product:statusUpdate', response.product);\r\n }\r\n\r\n // Update attributes\r\n $productContainer.find('.main-attributes').empty()\r\n .html(getAttributesHtml(response.product.attributes));\r\n}\r\n\r\n/**\r\n * @typespec UpdatedQuantity\r\n * @type Object\r\n * @property {boolean} selected - Whether the quantity has been selected\r\n * @property {string} value - The number of products to purchase\r\n * @property {string} url - Compiled URL that specifies variation attributes, product ID, options,\r\n * etc.\r\n */\r\n\r\n/**\r\n * Updates the quantity DOM elements post Ajax call\r\n * @param {UpdatedQuantity[]} quantities -\r\n * @param {jQuery} $productContainer - DOM container for a given product\r\n */\r\nfunction updateQuantities(quantities, $productContainer) {\r\n if ($productContainer.parent('.bonus-product-item').length <= 0) {\r\n var optionsHtml = quantities.map(function (quantity) {\r\n var selected = quantity.selected ? ' selected ' : '';\r\n return '';\r\n }).join('');\r\n getQuantitySelector($productContainer).empty().html(optionsHtml);\r\n }\r\n}\r\n\r\n/**\r\n * updates the product view when a product attribute is selected or deselected or when\r\n * changing quantity\r\n * @param {string} selectedValueUrl - the Url for the selected variation value\r\n * @param {jQuery} $productContainer - DOM element for current product\r\n */\r\nfunction attributeSelect(selectedValueUrl, $productContainer) {\r\n if (selectedValueUrl) {\r\n $('body').trigger('product:beforeAttributeSelect',\r\n { url: selectedValueUrl, container: $productContainer });\r\n\r\n $.ajax({\r\n url: selectedValueUrl,\r\n method: 'GET',\r\n success: function (data) {\r\n handleVariantResponse(data, $productContainer);\r\n updateOptions(data.product.optionsHtml, $productContainer);\r\n updateQuantities(data.product.quantities, $productContainer);\r\n $('body').trigger('product:afterAttributeSelect',\r\n { data: data, container: $productContainer });\r\n $.spinner().stop();\r\n },\r\n error: function () {\r\n $.spinner().stop();\r\n }\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Retrieves url to use when adding a product to the cart\r\n *\r\n * @return {string} - The provided URL to use when adding a product to the cart\r\n */\r\nfunction getAddToCartUrl() {\r\n return $('.add-to-cart-url').val();\r\n}\r\n\r\n/**\r\n * Parses the html for a modal window\r\n * @param {string} html - representing the body and footer of the modal window\r\n *\r\n * @return {Object} - Object with properties body and footer.\r\n */\r\nfunction parseHtml(html) {\r\n var $html = $('
      ').append($.parseHTML(html));\r\n\r\n var body = $html.find('.choice-of-bonus-product');\r\n var footer = $html.find('.modal-footer').children();\r\n\r\n return { body: body, footer: footer };\r\n}\r\n\r\n/**\r\n * Retrieves url to use when adding a product to the cart\r\n *\r\n * @param {Object} data - data object used to fill in dynamic portions of the html\r\n */\r\nfunction chooseBonusProducts(data) {\r\n $('.modal-body').spinner().start();\r\n\r\n if ($('#chooseBonusProductModal').length !== 0) {\r\n $('#chooseBonusProductModal').remove();\r\n }\r\n var bonusUrl;\r\n if (data.bonusChoiceRuleBased) {\r\n bonusUrl = data.showProductsUrlRuleBased;\r\n } else {\r\n bonusUrl = data.showProductsUrlListBased;\r\n }\r\n\r\n var htmlString = ''\r\n + '
      '\r\n + ''\r\n + '
      '\r\n + ''\r\n + '
      '\r\n + '
      '\r\n + ' ' + data.labels.selectprods + ''\r\n + ' '\r\n + '
      '\r\n + '
      '\r\n + '
      '\r\n + '
      '\r\n + '
      '\r\n + '
      ';\r\n $('body').append(htmlString);\r\n $('.modal-body').spinner().start();\r\n\r\n $.ajax({\r\n url: bonusUrl,\r\n method: 'GET',\r\n dataType: 'json',\r\n success: function (response) {\r\n var parsedHtml = parseHtml(response.renderedTemplate);\r\n $('#chooseBonusProductModal .modal-body').empty();\r\n $('#chooseBonusProductModal .enter-message').text(response.enterDialogMessage);\r\n $('#chooseBonusProductModal .modal-header .close .sr-only').text(response.closeButtonText);\r\n $('#chooseBonusProductModal .modal-body').html(parsedHtml.body);\r\n $('#chooseBonusProductModal .modal-footer').html(parsedHtml.footer);\r\n $('#chooseBonusProductModal').modal('show');\r\n $.spinner().stop();\r\n },\r\n error: function () {\r\n $.spinner().stop();\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Updates the Mini-Cart quantity value after the customer has pressed the \"Add to Cart\" button\r\n * @param {string} response - ajax response from clicking the add to cart button\r\n */\r\nfunction handlePostCartAdd(response) {\r\n $('.minicart').trigger('count:update', response);\r\n var messageType = response.error ? 'alert-danger' : 'alert-success';\r\n // show add to cart toast\r\n if (response.newBonusDiscountLineItem\r\n && Object.keys(response.newBonusDiscountLineItem).length !== 0) {\r\n chooseBonusProducts(response.newBonusDiscountLineItem);\r\n } else {\r\n if ($('.add-to-cart-messages').length === 0) {\r\n $('body').append(\r\n '
      '\r\n );\r\n }\r\n\r\n $('.add-to-cart-messages').append(\r\n '
      '\r\n + response.message\r\n + '
      '\r\n );\r\n\r\n setTimeout(function () {\r\n $('.add-to-basket-alert').remove();\r\n }, 5000);\r\n }\r\n}\r\n\r\n/**\r\n * Retrieves the bundle product item ID's for the Controller to replace bundle master product\r\n * items with their selected variants\r\n *\r\n * @return {string[]} - List of selected bundle product item ID's\r\n */\r\nfunction getChildProducts() {\r\n var childProducts = [];\r\n $('.bundle-item').each(function () {\r\n childProducts.push({\r\n pid: $(this).find('.product-id').text(),\r\n quantity: parseInt($(this).find('label.quantity').data('quantity'), 10)\r\n });\r\n });\r\n\r\n return childProducts.length ? JSON.stringify(childProducts) : [];\r\n}\r\n\r\n/**\r\n * Retrieve product options\r\n *\r\n * @param {jQuery} $productContainer - DOM element for current product\r\n * @return {string} - Product options and their selected values\r\n */\r\nfunction getOptions($productContainer) {\r\n var options = $productContainer\r\n .find('.product-option')\r\n .map(function () {\r\n var $elOption = $(this).find('.options-select');\r\n var urlValue = $elOption.val();\r\n var selectedValueId = $elOption.find('option[value=\"' + urlValue + '\"]')\r\n .data('value-id');\r\n return {\r\n optionId: $(this).data('option-id'),\r\n selectedValueId: selectedValueId\r\n };\r\n }).toArray();\r\n\r\n return JSON.stringify(options);\r\n}\r\n\r\n/**\r\n * Makes a call to the server to report the event of adding an item to the cart\r\n *\r\n * @param {string | boolean} url - a string representing the end point to hit so that the event can be recorded, or false\r\n */\r\nfunction miniCartReportingUrl(url) {\r\n if (url) {\r\n $.ajax({\r\n url: url,\r\n method: 'GET',\r\n success: function () {\r\n // reporting urls hit on the server\r\n },\r\n error: function () {\r\n // no reporting urls hit on the server\r\n }\r\n });\r\n }\r\n}\r\n\r\nmodule.exports = {\r\n attributeSelect: attributeSelect,\r\n methods: {\r\n editBonusProducts: function (data) {\r\n chooseBonusProducts(data);\r\n }\r\n },\r\n\r\n focusChooseBonusProductModal: function () {\r\n $('body').on('shown.bs.modal', '#chooseBonusProductModal', function () {\r\n $('#chooseBonusProductModal').siblings().attr('aria-hidden', 'true');\r\n $('#chooseBonusProductModal .close').focus();\r\n });\r\n },\r\n\r\n onClosingChooseBonusProductModal: function () {\r\n $('body').on('hidden.bs.modal', '#chooseBonusProductModal', function () {\r\n $('#chooseBonusProductModal').siblings().attr('aria-hidden', 'false');\r\n });\r\n },\r\n\r\n trapChooseBonusProductModalFocus: function () {\r\n $('body').on('keydown', '#chooseBonusProductModal', function (e) {\r\n var focusParams = {\r\n event: e,\r\n containerSelector: '#chooseBonusProductModal',\r\n firstElementSelector: '.close',\r\n lastElementSelector: '.add-bonus-products'\r\n };\r\n focusHelper.setTabNextFocus(focusParams);\r\n });\r\n },\r\n\r\n colorAttribute: function () {\r\n $(document).on('click', '[data-attr=\"color\"] button', function (e) {\r\n e.preventDefault();\r\n\r\n if ($(this).attr('disabled')) {\r\n return;\r\n }\r\n var $productContainer = $(this).closest('.set-item');\r\n if (!$productContainer.length) {\r\n $productContainer = $(this).closest('.product-detail');\r\n }\r\n\r\n attributeSelect($(this).attr('data-url'), $productContainer);\r\n });\r\n },\r\n\r\n selectAttribute: function () {\r\n $(document).on('change', 'select[class*=\"select-\"], .options-select', function (e) {\r\n e.preventDefault();\r\n\r\n var $productContainer = $(this).closest('.set-item');\r\n if (!$productContainer.length) {\r\n $productContainer = $(this).closest('.product-detail');\r\n }\r\n attributeSelect(e.currentTarget.value, $productContainer);\r\n });\r\n },\r\n\r\n availability: function () {\r\n $(document).on('change', '.quantity-select', function (e) {\r\n e.preventDefault();\r\n\r\n var $productContainer = $(this).closest('.product-detail');\r\n if (!$productContainer.length) {\r\n $productContainer = $(this).closest('.modal-content').find('.product-quickview');\r\n }\r\n\r\n if ($('.bundle-items', $productContainer).length === 0) {\r\n attributeSelect($(e.currentTarget).find('option:selected').data('url'),\r\n $productContainer);\r\n }\r\n });\r\n },\r\n\r\n addToCart: function () {\r\n $(document).on('click', 'button.add-to-cart, button.add-to-cart-global', function () {\r\n var addToCartUrl;\r\n var pid;\r\n var pidsObj;\r\n var setPids;\r\n\r\n $('body').trigger('product:beforeAddToCart', this);\r\n\r\n if ($('.set-items').length && $(this).hasClass('add-to-cart-global')) {\r\n setPids = [];\r\n\r\n $('.product-detail').each(function () {\r\n if (!$(this).hasClass('product-set-detail')) {\r\n setPids.push({\r\n pid: $(this).find('.product-id').text(),\r\n qty: $(this).find('.quantity-select').val(),\r\n options: getOptions($(this))\r\n });\r\n }\r\n });\r\n pidsObj = JSON.stringify(setPids);\r\n }\r\n\r\n pid = getPidValue($(this));\r\n\r\n var $productContainer = $(this).closest('.product-detail');\r\n if (!$productContainer.length) {\r\n $productContainer = $(this).closest('.quick-view-dialog').find('.product-detail');\r\n }\r\n\r\n addToCartUrl = getAddToCartUrl();\r\n\r\n var form = {\r\n pid: pid,\r\n pidsObj: pidsObj,\r\n childProducts: getChildProducts(),\r\n quantity: getQuantitySelected($(this))\r\n };\r\n\r\n if (!$('.bundle-item').length) {\r\n form.options = getOptions($productContainer);\r\n }\r\n\r\n $(this).trigger('updateAddToCartFormData', form);\r\n if (addToCartUrl) {\r\n $.ajax({\r\n url: addToCartUrl,\r\n method: 'POST',\r\n data: form,\r\n success: function (data) {\r\n handlePostCartAdd(data);\r\n $('body').trigger('product:afterAddToCart', data);\r\n $.spinner().stop();\r\n miniCartReportingUrl(data.reportingURL);\r\n },\r\n error: function () {\r\n $.spinner().stop();\r\n }\r\n });\r\n }\r\n });\r\n },\r\n selectBonusProduct: function () {\r\n $(document).on('click', '.select-bonus-product', function () {\r\n var $choiceOfBonusProduct = $(this).parents('.choice-of-bonus-product');\r\n var pid = $(this).data('pid');\r\n var maxPids = $('.choose-bonus-product-dialog').data('total-qty');\r\n var submittedQty = parseInt($choiceOfBonusProduct.find('.bonus-quantity-select').val(), 10);\r\n var totalQty = 0;\r\n $.each($('#chooseBonusProductModal .selected-bonus-products .selected-pid'), function () {\r\n totalQty += $(this).data('qty');\r\n });\r\n totalQty += submittedQty;\r\n var optionID = $choiceOfBonusProduct.find('.product-option').data('option-id');\r\n var valueId = $choiceOfBonusProduct.find('.options-select option:selected').data('valueId');\r\n if (totalQty <= maxPids) {\r\n var selectedBonusProductHtml = ''\r\n + '
      '\r\n + '
      '\r\n + $choiceOfBonusProduct.find('.product-name').html()\r\n + '
      '\r\n + '
      '\r\n + '
      '\r\n ;\r\n $('#chooseBonusProductModal .selected-bonus-products').append(selectedBonusProductHtml);\r\n $('.pre-cart-products').html(totalQty);\r\n $('.selected-bonus-products .bonus-summary').removeClass('alert-danger');\r\n } else {\r\n $('.selected-bonus-products .bonus-summary').addClass('alert-danger');\r\n }\r\n });\r\n },\r\n removeBonusProduct: function () {\r\n $(document).on('click', '.selected-pid', function () {\r\n $(this).remove();\r\n var $selected = $('#chooseBonusProductModal .selected-bonus-products .selected-pid');\r\n var count = 0;\r\n if ($selected.length) {\r\n $selected.each(function () {\r\n count += parseInt($(this).data('qty'), 10);\r\n });\r\n }\r\n\r\n $('.pre-cart-products').html(count);\r\n $('.selected-bonus-products .bonus-summary').removeClass('alert-danger');\r\n });\r\n },\r\n enableBonusProductSelection: function () {\r\n $('body').on('bonusproduct:updateSelectButton', function (e, response) {\r\n $('button.select-bonus-product', response.$productContainer).attr('disabled',\r\n (!response.product.readyToOrder || !response.product.available));\r\n var pid = response.product.id;\r\n $('button.select-bonus-product', response.$productContainer).data('pid', pid);\r\n });\r\n },\r\n showMoreBonusProducts: function () {\r\n $(document).on('click', '.show-more-bonus-products', function () {\r\n var url = $(this).data('url');\r\n $('.modal-content').spinner().start();\r\n $.ajax({\r\n url: url,\r\n method: 'GET',\r\n success: function (html) {\r\n var parsedHtml = parseHtml(html);\r\n $('.modal-body').append(parsedHtml.body);\r\n $('.show-more-bonus-products:first').remove();\r\n $('.modal-content').spinner().stop();\r\n },\r\n error: function () {\r\n $('.modal-content').spinner().stop();\r\n }\r\n });\r\n });\r\n },\r\n addBonusProductsToCart: function () {\r\n $(document).on('click', '.add-bonus-products', function () {\r\n var $readyToOrderBonusProducts = $('.choose-bonus-product-dialog .selected-pid');\r\n var queryString = '?pids=';\r\n var url = $('.choose-bonus-product-dialog').data('addtocarturl');\r\n var pidsObject = {\r\n bonusProducts: []\r\n };\r\n\r\n $.each($readyToOrderBonusProducts, function () {\r\n var qtyOption =\r\n parseInt($(this)\r\n .data('qty'), 10);\r\n\r\n var option = null;\r\n if (qtyOption > 0) {\r\n if ($(this).data('optionid') && $(this).data('option-selected-value')) {\r\n option = {};\r\n option.optionId = $(this).data('optionid');\r\n option.productId = $(this).data('pid');\r\n option.selectedValueId = $(this).data('option-selected-value');\r\n }\r\n pidsObject.bonusProducts.push({\r\n pid: $(this).data('pid'),\r\n qty: qtyOption,\r\n options: [option]\r\n });\r\n pidsObject.totalQty = parseInt($('.pre-cart-products').html(), 10);\r\n }\r\n });\r\n queryString += JSON.stringify(pidsObject);\r\n queryString = queryString + '&uuid=' + $('.choose-bonus-product-dialog').data('uuid');\r\n queryString = queryString + '&pliuuid=' + $('.choose-bonus-product-dialog').data('pliuuid');\r\n $.spinner().start();\r\n $.ajax({\r\n url: url + queryString,\r\n method: 'POST',\r\n success: function (data) {\r\n $.spinner().stop();\r\n if (data.error) {\r\n $('#chooseBonusProductModal').modal('hide');\r\n if ($('.add-to-cart-messages').length === 0) {\r\n $('body').append('
      ');\r\n }\r\n $('.add-to-cart-messages').append(\r\n '
      '\r\n + data.errorMessage + '
      '\r\n );\r\n setTimeout(function () {\r\n $('.add-to-basket-alert').remove();\r\n }, 3000);\r\n } else {\r\n $('.configure-bonus-product-attributes').html(data);\r\n $('.bonus-products-step2').removeClass('hidden-xl-down');\r\n $('#chooseBonusProductModal').modal('hide');\r\n\r\n if ($('.add-to-cart-messages').length === 0) {\r\n $('body').append('
      ');\r\n }\r\n $('.minicart-quantity').html(data.totalQty);\r\n $('.add-to-cart-messages').append(\r\n '
      '\r\n + data.msgSuccess + '
      '\r\n );\r\n setTimeout(function () {\r\n $('.add-to-basket-alert').remove();\r\n if ($('.cart-page').length) {\r\n location.reload();\r\n }\r\n }, 1500);\r\n }\r\n },\r\n error: function () {\r\n $.spinner().stop();\r\n }\r\n });\r\n });\r\n },\r\n\r\n getPidValue: getPidValue,\r\n getQuantitySelected: getQuantitySelected,\r\n miniCartReportingUrl: miniCartReportingUrl\r\n};\r\n","'use strict';\r\n\r\nmodule.exports = {\r\n setTabNextFocus: function (focusParams) {\r\n var KEYCODE_TAB = 9;\r\n var isTabPressed = (focusParams.event.key === 'Tab' || focusParams.event.keyCode === KEYCODE_TAB);\r\n\r\n if (!isTabPressed) {\r\n return;\r\n }\r\n\r\n var firstFocusableEl = $(focusParams.containerSelector + ' ' + focusParams.firstElementSelector);\r\n var lastFocusableEl = $(focusParams.containerSelector + ' ' + focusParams.lastElementSelector);\r\n\r\n if ($(focusParams.containerSelector + ' ' + focusParams.lastElementSelector).is(':disabled')) {\r\n lastFocusableEl = $(focusParams.containerSelector + ' ' + focusParams.nextToLastElementSelector);\r\n if ($('.product-quickview.product-set').length > 0) {\r\n var linkElements = $(focusParams.containerSelector + ' a#fa-link.share-icons');\r\n lastFocusableEl = linkElements[linkElements.length - 1];\r\n }\r\n }\r\n\r\n if (focusParams.event.shiftKey) /* shift + tab */ {\r\n if ($(':focus').is(firstFocusableEl)) {\r\n lastFocusableEl.focus();\r\n focusParams.event.preventDefault();\r\n }\r\n } else /* tab */ {\r\n if ($(':focus').is(lastFocusableEl)) { // eslint-disable-line\r\n firstFocusableEl.focus();\r\n focusParams.event.preventDefault();\r\n }\r\n }\r\n }\r\n};\r\n","/**\r\n * @author: Cloud for Good\r\n * @description: Builds the productDetails.js file including necessary components.\r\n *\r\n * History\r\n * \r\n * 2022-09-30 Cloud for Good N/A Initial creation\r\n*/\r\n\r\n'use strict';\r\n\r\nvar processInclude = require('base/util');\r\n\r\n$(document).ready(function () {\r\n processInclude(require('./product/wishlistHeart'));\r\n processInclude(require('./product/productDetail'));\r\n});\r\n","/**\r\n * @author: Cloud for Good\r\n * @description: Applies custom Advancement logic to the SFRA js/product/productDetail.js client-side logic.\r\n *\r\n * History\r\n * \r\n * 2022-09-30 Cloud for Good N/A Initial creation\r\n * 2025-02-13 Jassin Yacks (CFG) CFG-751 Enhanced the Merchandise Page to include product options and updated the Add to Cart functionality to properly populate the confirmation window.\r\n * 2025-03-10 Jassin Yacks (CFG) CFG-991 Allows customers to select and direct gift funds to a specific product via a picklist on the PDP.\r\n*/\r\n\r\n'use strict';\r\n\r\nvar base = require('base/product/base');\r\nvar detailBase = require('base/product/detail');\r\n\r\n/**\r\n * Normalize carousel height to the tallest of carousel items to prevent jumping on page\r\n */\r\n\r\nfunction normalizeCarouselHeight() {\r\n\r\n var items = $('.pdp-testimonial-carousel .carousel-item'), // grab all the slides\r\n heights = [], // array to store heights\r\n tallest; // tallest slide\r\n\r\n if (items.length) {\r\n items.each(function() {\r\n heights.push($(this).height());\r\n });\r\n\r\n // get the tallest height\r\n tallest = Math.max.apply(null, heights);\r\n // add some padding\r\n tallest += 15;\r\n\r\n // set each item to the tallest height\r\n items.each(function() {\r\n $(this).css('height', tallest + 'px');\r\n });\r\n\r\n // set carousel inner row to tallest height\r\n $('.pdp-testimonial-carousel .carousel-inner').css('height', tallest + 'px');\r\n };\r\n}\r\n\r\n/**\r\n * appends params to a url\r\n * @param {string} url - Original url\r\n * @param {Object} params - Parameters to append\r\n * @returns {string} result url with appended parameters\r\n */\r\nfunction appendToUrl(url, params) {\r\n var newUrl = url;\r\n newUrl += (newUrl.indexOf('?') !== -1 ? '&' : '?') + Object.keys(params).map(function (key) {\r\n return key + '=' + encodeURIComponent(params[key]);\r\n }).join('&');\r\n\r\n return newUrl;\r\n}\r\n\r\n/**\r\n * Updates the base updateAttributesAndDetails function to display the color swatch value next to the color label (e.g., Color: Red).\r\n * @param {string} url - Original url\r\n * @param {Object} params - Parameters to append\r\n * @returns {string} result url with appended parameters\r\n */\r\ndetailBase.updateAttributesAndDetails = function() {\r\n $('body').on('product:statusUpdate', function (e, data) {\r\n var $productContainer = $('.product-detail[data-pid=\"' + data.id + '\"]');\r\n\r\n //Updates the displayed selected color next to the \"Color\" label on the product page.\r\n const colorAttribute = data.variationAttributes.find(attr => attr.attributeId === \"color\");\r\n const selectedColorAttr = colorAttribute.values.find(value => value.selected);\r\n\r\n const $colorDisplay = $productContainer.find('.attributes .colorDisplayValue').empty();\r\n if (selectedColorAttr.displayValue) {\r\n $colorDisplay.text(selectedColorAttr.displayValue);\r\n }\r\n\r\n $productContainer.find('.description-and-detail .product-attributes')\r\n .empty()\r\n .html(data.attributesHtml);\r\n\r\n if (data.shortDescription) {\r\n $productContainer.find('.description-and-detail .description')\r\n .removeClass('hidden-xl-down');\r\n $productContainer.find('.description-and-detail .description .content')\r\n .empty()\r\n .html(data.shortDescription);\r\n } else {\r\n $productContainer.find('.description-and-detail .description')\r\n .addClass('hidden-xl-down');\r\n }\r\n\r\n if (data.longDescription) {\r\n $productContainer.find('.description-and-detail .details')\r\n .removeClass('hidden-xl-down');\r\n $productContainer.find('.description-and-detail .details .content')\r\n .empty()\r\n .html(data.longDescription);\r\n } else {\r\n $productContainer.find('.description-and-detail .details')\r\n .addClass('hidden-xl-down');\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Retrieve product options\r\n *\r\n * @param {jQuery} $productContainer - DOM element for current product\r\n * @return {string} - Product options and their selected values\r\n */\r\nfunction getOptions($productContainer) {\r\n var options = $productContainer\r\n .find('.product-option')\r\n .map(function () {\r\n var $elOption = $(this).find('.options-select');\r\n var urlValue = $elOption.val();\r\n var selectedValueId = $elOption.find('option[value=\"' + urlValue + '\"]')\r\n .data('value-id');\r\n return {\r\n optionId: $(this).data('option-id'),\r\n selectedValueId: selectedValueId\r\n };\r\n }).toArray();\r\n\r\n return JSON.stringify(options);\r\n}\r\n\r\n/**\r\n * Retrieves url to use when adding a product to the cart\r\n *\r\n * @return {string} - The provided URL to use when adding a product to the cart\r\n */\r\nfunction getAddToCartUrl() {\r\n return $('.add-to-cart-url').val();\r\n}\r\n\r\n/**\r\n * Retrieves the bundle product item ID's for the Controller to replace bundle master product\r\n * items with their selected variants\r\n *\r\n * @return {string[]} - List of selected bundle product item ID's\r\n */\r\nfunction getChildProducts() {\r\n var childProducts = [];\r\n $('.bundle-item').each(function () {\r\n childProducts.push({\r\n pid: $(this).find('.product-id').text(),\r\n quantity: parseInt($(this).find('label.quantity').data('quantity'), 10)\r\n });\r\n });\r\n\r\n return childProducts.length ? JSON.stringify(childProducts) : [];\r\n}\r\n\r\n/**\r\n * determines the product to update the price and the frequency\r\n * @param {element} - element targeted\r\n * @returns {json} amount (number), frequency (text), subscriptionMode (text), isValidAmount (boolean), minAmount (integer), activeTabId (string)\r\n */\r\nfunction getProductOptions() {\r\n var options,\r\n productColor, \r\n productSize, \r\n productQty,\r\n productPrice,\r\n giftAmount,\r\n productTotal,\r\n selectFund;\r\n\r\n // Grab all the attributes from the selected product\r\n productColor = $('.color-attribute span.swatch-value.selected.selectable').parent().text().trim();\r\n\r\n productSize = $('.slds-select.select-size').find(\":selected\").text().trim();\r\n productQty = $('.quantity-select').val();\r\n selectFund = $('.fund-select').val();\r\n productPrice = $('.sales .value').text().trim();\r\n giftAmount = parseFloat($('.prices').attr('data-donationamt')).toFixed(2);\r\n giftAmount = giftAmount * productQty;\r\n\r\n // Calculate the total price\r\n var digitMatch = productPrice.match(/^(\\D+)([\\d,.]+)$/);\r\n \r\n if (!digitMatch) return null;\r\n\r\n var currencySymbol = digitMatch[1];\r\n var numericPrice = parseFloat(digitMatch[2].replace(/,/g, ''));\r\n var totalAmount = numericPrice * productQty;\r\n\r\n // Format back as currency\r\n productTotal = currencySymbol + totalAmount.toFixed(2);\r\n\r\n options = {\r\n color: productColor,\r\n size: productSize,\r\n qty: productQty,\r\n price: productPrice,\r\n donation: giftAmount,\r\n seletedFund: selectFund,\r\n total: productTotal\r\n }\r\n\r\n return options;\r\n}\r\n\r\n/**\r\n * Updates the Mini-Cart quantity value after the customer has pressed the \"Add to Cart\" button\r\n * @param {string} response - ajax response from clicking the add to cart button\r\n */\r\nfunction handlePostCartAdd(response, color, size, qty, donation, total) {\r\n\r\n if(response){\r\n $('.minicart').trigger('count:update', response);\r\n var messageType = response.error ? 'alert-danger' : 'alert-success';\r\n\r\n // show add to cart toast\r\n if (response.newBonusDiscountLineItem\r\n && Object.keys(response.newBonusDiscountLineItem).length !== 0) {\r\n chooseBonusProducts(response.newBonusDiscountLineItem);\r\n } else if(response.error) {\r\n if ($('.add-to-cart-messages').length === 0) {\r\n $('body').append(\r\n `
      \r\n

      ${response.title}

      \r\n

      ${response.message}

      \r\n \r\n
      `\r\n );\r\n $(\".add-to-cart-messages\").focus();\r\n }\r\n\r\n } else{\r\n //update the success modal with information from the product selected\r\n var $productAddedSuccessfullyModal = $('#productAddedSuccessfullyModal');\r\n\r\n $productAddedSuccessfullyModal.find('.gift-added-component-image')\r\n .attr({\r\n 'src': response.productImage,\r\n 'alt': response.imageAlt,\r\n 'title': response.imageTitle\r\n });\r\n\r\n $productAddedSuccessfullyModal.find('.slds-text-title_bold section').replaceWith(`
      ${response.productName}
      `);\r\n if(color.trim().length > 0) {\r\n $productAddedSuccessfullyModal.find('.product-color span').text(color);\r\n }else{\r\n $productAddedSuccessfullyModal.find('.product-color').parent().hide()\r\n }\r\n if(size.trim().length > 0) {\r\n $productAddedSuccessfullyModal.find('.product-size span').text(size);\r\n }else{\r\n $productAddedSuccessfullyModal.find('.product-size').parent().hide()\r\n }\r\n $productAddedSuccessfullyModal.find('.product-qty span').text(qty);\r\n $productAddedSuccessfullyModal.find('.product-gift-amount span').text(`$${donation}`);\r\n $productAddedSuccessfullyModal.find('.product-total span').text(total);\r\n\r\n $('.informative-alert-icon').show(); //display product informative alert message and icon\r\n $('.gift-alert-icon').children().hide(); //hide product alert validation message and icon\r\n\r\n $productAddedSuccessfullyModal.modal('show'); //Display product added successfully modal\r\n }\r\n\r\n //set/update a cookie for the cart quantity\r\n //to ensure cookies get set based on the site, only set the domain for non-prod & Development sites\r\n if((document.location.host).includes('.northeastern.edu')){\r\n document.cookie = 'cartcount=' + response.quantityTotal + '; path=/ ;samesite=lax; domain=northeastern.edu';\r\n }else{\r\n document.cookie = 'cartcount=' + response.quantityTotal + '; path=/ ;samesite=lax';\r\n }\r\n }\r\n}\r\n\r\nmodule.exports = {\r\n //these functions come from the SFRA base file\r\n availability: base.availability,\r\n updateAttribute: detailBase.updateAttribute,\r\n showSpinner: detailBase.showSpinner,\r\n updateAddToCart: detailBase.updateAddToCart,\r\n updateAvailability: detailBase.updateAvailability,\r\n sizeChart: detailBase.sizeChart,\r\n copyProductLink: detailBase.copyProductLink,\r\n focusChooseBonusProductModal: base.focusChooseBonusProductModal(),\r\n\r\n //On mobile, when a user selects the give now button on the pdp page the button\r\n //will scroll to the gift options title\r\n mobileDonateButtonScrollTo: function () {\r\n $('body').on('click', '.gift-options-mobile .donate-btn', function (e) {\r\n document.querySelector('#giftOptionsTitle').scrollIntoView({ behavior: 'smooth' });\r\n });\r\n },\r\n\r\n // when page is loaded, normalize testimonial carousel height to prevent jumping heights\r\n normalizeTestimonialCarousel : function() {\r\n $(window).on('load', function() {\r\n normalizeCarouselHeight();\r\n });\r\n },\r\n\r\n addToCart: function () {\r\n $(document).on('click', 'button.add-to-cart', function (e) {\r\n var addToCartUrl;\r\n var pid;\r\n var pidsObj;\r\n var setPids;\r\n var productColor;\r\n var productSize;\r\n var productQty;\r\n var giftAmount;\r\n var seletedFund;\r\n var productTotal;\r\n\r\n $('body').trigger('product:beforeAddToCart', this);\r\n\r\n if ($('.set-items').length && $(this).hasClass('button.add-to-cart')) {\r\n setPids = [];\r\n\r\n $('.product-detail').each(function () {\r\n if (!$(this).hasClass('product-set-detail')) {\r\n setPids.push({\r\n pid: $(this).find('.product-id').text(),\r\n qty: $(this).find('.quantity-select').val(),\r\n options: getOptions($(this))\r\n });\r\n }\r\n });\r\n pidsObj = JSON.stringify(setPids);\r\n }\r\n\r\n pid = base.getPidValue($(this));\r\n\r\n var $productContainer = $(this).closest('.product-detail');\r\n if (!$productContainer.length) {\r\n $productContainer = $(this).closest('.quick-view-dialog').find('.product-detail');\r\n }\r\n\r\n addToCartUrl = getAddToCartUrl();\r\n\r\n // Validate the physical product fund selection \r\n if ($('.fund-select option').length === 0 || $('.fund-select').val() === null || $('.fund-select').val() === '') {\r\n $('.fund-select').attr('aria-invalid', 'true').closest('.slds-form-element').addClass(\"slds-has-error\");\r\n $.spinner().stop();\r\n return;\r\n }else{\r\n $('.fund-select').removeAttr('aria-invalid').closest('.slds-form-element').removeClass(\"slds-has-error\");\r\n }\r\n\r\n // Retrieve the gift amount, chosen fund, and other variation attributes from the product detail page (PDP).\r\n var options = getProductOptions($(this));\r\n productColor = options.color;\r\n productSize = options.size;\r\n productQty = options.qty;\r\n giftAmount = options.donation;\r\n seletedFund = options.seletedFund;\r\n productTotal = options.total;\r\n\r\n var form = {\r\n pid: pid,\r\n pidsObj: pidsObj,\r\n physcialProductFund: seletedFund,\r\n childProducts: getChildProducts(),\r\n quantity: base.getQuantitySelected($(this))\r\n };\r\n\r\n if (!$('.bundle-item').length) {\r\n form.options = getOptions($productContainer);\r\n }\r\n\r\n $(this).trigger('updateAddToCartFormData', form);\r\n if (addToCartUrl) {\r\n $.ajax({\r\n url: addToCartUrl,\r\n method: 'POST',\r\n data: form,\r\n success: function (data) {\r\n handlePostCartAdd(data, productColor, productSize, productQty, giftAmount, productTotal);\r\n $('body').trigger('product:afterAddToCart', data);\r\n $.spinner().stop();\r\n base.miniCartReportingUrl(data.reportingURL);\r\n },\r\n error: function () {\r\n $.spinner().stop();\r\n }\r\n });\r\n }\r\n });\r\n },\r\n\r\n};","'use strict';\r\nvar base = require('./base');\r\n\r\n/**\r\n * Enable/disable UI elements\r\n * @param {boolean} enableOrDisable - true or false\r\n */\r\nfunction updateAddToCartEnableDisableOtherElements(enableOrDisable) {\r\n $('button.add-to-cart-global').attr('disabled', enableOrDisable);\r\n}\r\n\r\nmodule.exports = {\r\n methods: {\r\n updateAddToCartEnableDisableOtherElements: updateAddToCartEnableDisableOtherElements\r\n },\r\n\r\n availability: base.availability,\r\n\r\n addToCart: base.addToCart,\r\n\r\n updateAttributesAndDetails: function () {\r\n $('body').on('product:statusUpdate', function (e, data) {\r\n var $productContainer = $('.product-detail[data-pid=\"' + data.id + '\"]');\r\n\r\n $productContainer.find('.description-and-detail .product-attributes')\r\n .empty()\r\n .html(data.attributesHtml);\r\n\r\n if (data.shortDescription) {\r\n $productContainer.find('.description-and-detail .description')\r\n .removeClass('hidden-xl-down');\r\n $productContainer.find('.description-and-detail .description .content')\r\n .empty()\r\n .html(data.shortDescription);\r\n } else {\r\n $productContainer.find('.description-and-detail .description')\r\n .addClass('hidden-xl-down');\r\n }\r\n\r\n if (data.longDescription) {\r\n $productContainer.find('.description-and-detail .details')\r\n .removeClass('hidden-xl-down');\r\n $productContainer.find('.description-and-detail .details .content')\r\n .empty()\r\n .html(data.longDescription);\r\n } else {\r\n $productContainer.find('.description-and-detail .details')\r\n .addClass('hidden-xl-down');\r\n }\r\n });\r\n },\r\n\r\n showSpinner: function () {\r\n $('body').on('product:beforeAddToCart product:beforeAttributeSelect', function () {\r\n $.spinner().start();\r\n });\r\n },\r\n updateAttribute: function () {\r\n $('body').on('product:afterAttributeSelect', function (e, response) {\r\n if ($('.product-detail>.bundle-items').length) {\r\n response.container.data('pid', response.data.product.id);\r\n response.container.find('.product-id').text(response.data.product.id);\r\n } else if ($('.product-set-detail').eq(0)) {\r\n response.container.data('pid', response.data.product.id);\r\n response.container.find('.product-id').text(response.data.product.id);\r\n } else {\r\n $('.product-id').text(response.data.product.id);\r\n $('.product-detail:not(\".bundle-item\")').data('pid', response.data.product.id);\r\n }\r\n });\r\n },\r\n updateAddToCart: function () {\r\n $('body').on('product:updateAddToCart', function (e, response) {\r\n // update local add to cart (for sets)\r\n $('button.add-to-cart', response.$productContainer).attr('disabled',\r\n (!response.product.readyToOrder || !response.product.available));\r\n\r\n var enable = $('.product-availability').toArray().every(function (item) {\r\n return $(item).data('available') && $(item).data('ready-to-order');\r\n });\r\n module.exports.methods.updateAddToCartEnableDisableOtherElements(!enable);\r\n });\r\n },\r\n updateAvailability: function () {\r\n $('body').on('product:updateAvailability', function (e, response) {\r\n $('div.availability', response.$productContainer)\r\n .data('ready-to-order', response.product.readyToOrder)\r\n .data('available', response.product.available);\r\n\r\n $('.availability-msg', response.$productContainer)\r\n .empty().html(response.message);\r\n\r\n if ($('.global-availability').length) {\r\n var allAvailable = $('.product-availability').toArray()\r\n .every(function (item) { return $(item).data('available'); });\r\n\r\n var allReady = $('.product-availability').toArray()\r\n .every(function (item) { return $(item).data('ready-to-order'); });\r\n\r\n $('.global-availability')\r\n .data('ready-to-order', allReady)\r\n .data('available', allAvailable);\r\n\r\n $('.global-availability .availability-msg').empty()\r\n .html(allReady ? response.message : response.resources.info_selectforstock);\r\n }\r\n });\r\n },\r\n sizeChart: function () {\r\n $('.size-chart a').on('click', function (e) {\r\n e.preventDefault();\r\n var url = $(this).attr('href');\r\n var $prodSizeChart = $(this).closest('.size-chart').find('.size-chart-collapsible');\r\n if ($prodSizeChart.is(':empty')) {\r\n $.ajax({\r\n url: url,\r\n type: 'get',\r\n dataType: 'json',\r\n success: function (data) {\r\n $prodSizeChart.append(data.content);\r\n }\r\n });\r\n }\r\n $prodSizeChart.toggleClass('active');\r\n });\r\n\r\n var $sizeChart = $('.size-chart-collapsible');\r\n $('body').on('click touchstart', function (e) {\r\n if ($('.size-chart').has(e.target).length <= 0) {\r\n $sizeChart.removeClass('active');\r\n }\r\n });\r\n },\r\n copyProductLink: function () {\r\n $('body').on('click', '#fa-link', function () {\r\n event.preventDefault();\r\n var $temp = $('');\r\n $('body').append($temp);\r\n $temp.val($('#shareUrl').val()).select();\r\n document.execCommand('copy');\r\n $temp.remove();\r\n $('.copy-link-message').attr('role', 'alert');\r\n $('.copy-link-message').removeClass('d-none');\r\n setTimeout(function () {\r\n $('.copy-link-message').addClass('d-none');\r\n }, 3000);\r\n });\r\n },\r\n\r\n focusChooseBonusProductModal: base.focusChooseBonusProductModal()\r\n};\r\n"],"sourceRoot":""}