{"version":3,"sources":["node_modules/browser-pack/_prelude.js","src/js/analytics/listeners/externallyTriggeredEvents.js","src/js/analytics/pushToDataLayer.js","src/js/common/select.js","src/js/form.js","src/js/forms/ajax.js","src/js/forms/getElementProps.js","src/js/forms/indexFormElements.js","src/js/forms/interactions.js","src/js/forms/landingSampleForm.js","src/js/forms/notifications.js","src/js/forms/validation.js","src/js/helpers/addNumberInputMaxLength.js","src/js/helpers/allowOnlyNumbersInInput.js","src/js/helpers/cookie.js","src/js/helpers/getHeaderHeight.js","src/js/helpers/isMobile.js","src/js/helpers/preloader.js","src/js/helpers/scrollToElement.js","src/js/helpers/validateEmail.js","src/js/helpers/validateEmoji.js","src/js/initDatepicker.js","src/js/newsletterSignup.js"],"names":["r","e","n","t","o","i","f","c","require","u","a","Error","code","p","exports","call","length","1","module","_pushToDataLayer","analyticsAccordionItemOpen","title","pushToDataLayer","event","action","label","analyticsSampleRequest","step","selectedItemName","formId","$formSample","$","stepNumber","parseInt","split","productId","localStorage","getItem","isAnalyticsPushed","eventTrigger","eventCategory","eventAction","eventLabel","ga4_data","action_type","step_name","step_number","single_item_id","single_item_name","attr","sessionStorage","setItem","form_name","form_id","find","on","is","analyticsCompareProductListener","selectedProductName","link_text","analyticsFormSend","$form","data","toLowerCase","status","window","HMS","ProductSample","productSelectedName","select2","text","eventValue","undefined","location","dataLayer","push","Select","_classCallCheck","this","onload","each","index","select","$select","hasClass","getSelectConfig","key","value","config","dir","document","minimumResultsForSearch","dropdownParent","initLandingSampleSizes","onFormSend","_require3","onInputTextAreaInteraction","onInteraction","onSampleSizeInteraction","HMSDatePicker","HMSForm","Form","forms","Map","init","_this","form","set","id","type","isValid","serverMessage","elements","inputTimeout","hasRecaptcha","get","update","getFormData","Object","keys","forEach","element","parents","DatePicker","registerForms","addEvents","productsAndSizes","val","_this2","currentTarget","classObj","preventDefault","$button","concat","indexFormElements","formData","payload","json","stippedId","getFormIdforJSON","formParentId","checkboxGroups","Set","splitId","splitName","name","isRecaptchaValidated","responseKey","datepicker","checkboxGroupId","add","checkboxGroup","groupValue","checkbox","labelValue","trim","input","$input","inputName","VariantIds","getElementById","generateJSON","onSendFail","preloader","ajax","url","success","textStatus","showServerMsg","setFormData","_externallyTriggeredEvents","$sampleConfirmation","HMSPowerReviews","HMSBuyInStoreInstance","render","HMSWhereToBuyInstance","results","IriStores","initBuyDirect","product","segment","onSendSuccess","error","jqXHR","responseText","toggleNotifications","scrollToElement","HMSNewsletterSignup","toggle","msg","msgType","getScrollableElement","$sendButton","HMSProductSample","renderStep","remove","addClass","html","renderResponse","setCookie","$serverMsg","removeClass","genericServerFailMsg","field","arguments","$element","checked","radio","fp","_flatpickr","selectedDate","selectedDates","formatDate","getValue","tagName","mandatory","validation","_validation","validateElement","index2","_getElementProps","getElementProps","$recaptchaResponse","valid","validations","failedRules","_value","allowOnlyNumbersInInput","maxLength","addNumberInputMaxLength","getFormIdFromElement","clearTimeout","setTimeout","target","toggleClass","toggleNotification","$target","showIfChecked","hideIfChecked","onLandingSampleProductSelected","selectedProduct","$selectedProduct","sizes","options","sizeLabelVal","sizeLabel","closest","append","size","SizeValue","Size","$size","_select","renderProductSizesDropdown","params","navigatedToError","formField","$formField","clearErrors","_scrollToElement","requredFailed","indexOf","hideAllFieldMsgs","toggleMsg","validateEmail","validateEmoji","pushFailed","$field","_toConsumableArray","classList","filter","className","isRequired","Number","trimmedValue","substring","_$input","startsWith","which","cookies","cookie","reduce","acc","cookieString","_cookieString$split$m","map","str","_cookieString$split$m2","decodeURIComponent","daysToExpire","date","Date","setTime","getTime","encodeURIComponent","toGMTString","_isMobile","getHeaderHeight","isMobile","height","$menuWrapper","innerWidth","$container","_getHeaderHeight","scrollTop","offset","top","animate","email","test","defaultRegex","fieldValue","regex","HMSeMojiRegxExpression","RegExp","enableTime","dateFormat","disableMobile","datePickers","$datepicker","yearMin","yearMax","extend","minDate","maxDate","flatpickr","initDatepicker","_cookie","_typeof","obj","Symbol","iterator","constructor","prototype","_defineProperties","props","descriptor","enumerable","configurable","writable","defineProperty","arg","hint","prim","toPrimitive","String","res","TypeError","_toPrimitive","_toPropertyKey","instance","Constructor","protoProps","staticProps","getCookie"],"mappings":"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","file":"form.js","sourcesContent":["(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i {\n pushToDataLayer({\n event: 'engagement',\n action: 'accordion-open',\n label: title\n });\n};\n\n/**\n * Handles the analytics tracking for sample requests. This function is responsible for sending data\n * to the dataLayer at different steps of the sample request process. It tracks user interactions\n * such as initiating the request form, selecting a product, filling out the form, and confirming the order\n *\n * Toggled from productSample.js\n * @param {String} step - Step number / Confirmation for last step\n * @param {String} selectedItemName\n */\nexport const analyticsSampleRequest = (step, selectedItemName) => {\n const $formSample = $('.js-form-sample');\n const stepNumber = parseInt(step.split(' ')[1], 10);\n const productId = parseInt(localStorage.getItem('currentId'));\n let isAnalyticsPushed = false;\n\n // Initial push to dataLayer\n pushToDataLayer({\n event: 'gaEvent',\n eventTrigger: 'sampleRequest',\n eventCategory: 'Sample request',\n eventAction: step,\n eventLabel: selectedItemName\n });\n\n // Step 1 - Push selected product info to dataLayer.\n if (stepNumber === 1) {\n pushToDataLayer({\n event: 'ga4_sample_form',\n ga4_data: {\n action_type: 'Initiate request form',\n step_name: 'Choose your product',\n step_number: stepNumber,\n single_item_id: '',\n single_item_name: selectedItemName\n }\n });\n }\n\n if ($formSample.length) {\n const formId = $('form').attr('id');\n sessionStorage.setItem('formId', formId);\n\n pushToDataLayer({\n event: 'ga4_form_visible',\n ga4_data: {\n form_name: 'Sample Order',\n form_id: formId\n }\n });\n\n /*\n Step 2/3 - On some publications, the form is on the second and somewhere on the third step,\n such as the example with the Polish site. This means that on those sites there is a step 2 which\n is an extra step that should not be followed with push to dataLayer. (Jira: HMS-6045)\n */\n $formSample.find('.form-field').on('change', () => {\n const isFormValid = $formSample.find('.valid').length > 0 || $('.field-checkbox').is(':checked');\n\n if (isFormValid && !isAnalyticsPushed) {\n pushToDataLayer({\n event: 'ga4_sample_form',\n ga4_data: {\n action_type: 'Filling out the form',\n step_name: 'Delivery information',\n step_number: 2,\n single_item_id: productId,\n single_item_name: selectedItemName\n }\n });\n\n pushToDataLayer({\n event: 'ga4_form_start',\n ga4_data: {\n form_name: 'Sample Order',\n form_id: formId\n }\n });\n isAnalyticsPushed = true;\n }\n });\n }\n};\n\n/**\n * Tracks a product comparison event in Google Analytics.\n *\n * @param {string} productId - The ID of the selected product.\n * @param {string} selectedProductName - The name of the selected product.\n */\nexport const analyticsCompareProductListener = (productId, selectedProductName) => {\n pushToDataLayer({\n event: 'ga4_product_comparison',\n ga4_data: {\n action_type: 'Add product',\n single_item_id: productId,\n single_item_name: selectedProductName,\n link_text: selectedProductName\n }\n });\n};\n\n/**\n * Events after the form has been sent\n * @param {Node} $form\n */\nexport const analyticsFormSend = $form => {\n function getProductName() {\n if (window.HMS.ProductSample && window.HMS.ProductSample.productSelectedName\n && window.HMS.ProductSample.productSelectedName.length) {\n return window.HMS.ProductSample.productSelectedName;\n }\n\n if ($('#AvailableSampleProducts').length) {\n return $('#AvailableSampleProducts').select2('data')[0].text;\n }\n\n return '';\n }\n\n switch ($form.data('formtype').toLowerCase()) {\n case 'sampleorder': {\n let status = $('.js-sample-form-status').data('form-status');\n\n if ($('.js-sample-form-status').length) {\n if (status === '') {\n status = 'Blacklisted';\n }\n analyticsSampleRequest(status, getProductName());\n }\n\n pushToDataLayer({\n event: 'ga4_form_submit',\n ga4_data: {\n form_name: 'Sample Order',\n form_id: sessionStorage.getItem('formId')\n }\n });\n\n if(status !== 'Refused') {\n pushToDataLayer({\n event: 'ga4_sample_form',\n ga4_data: {\n action_type: 'Confirmation',\n step_name: 'Order Confirmation',\n step_number: 3,\n single_item_id: localStorage.getItem('currentId'),\n single_item_name: localStorage.getItem('currentProductName')\n }\n });\n }\n break;\n }\n case 'contactus': {\n pushToDataLayer({\n event: 'gaEvent',\n eventTrigger: 'formSubmit',\n eventCategory: 'Form',\n eventAction: 'Submit',\n eventLabel: 'Contact us'\n });\n\n pushToDataLayer({\n event: 'ga4_form_submit',\n ga4_data: {\n form_name: 'Contact us',\n form_id: $('form').attr('id')\n }\n });\n break;\n }\n case 'askthedoctor': {\n pushToDataLayer({\n event: 'engagement',\n action: 'askTheDoctor'\n });\n\n pushToDataLayer({\n event: 'ga4_form_submit',\n ga4_data: {\n form_name: 'Ask the doctor',\n form_id: sessionStorage.getItem('trackedFormId')\n }\n });\n break;\n }\n case 'newsletter': {\n pushToDataLayer({\n event: 'gaEvent',\n eventTrigger: 'formSubmit',\n eventCategory: 'Form',\n eventAction: 'Submit',\n eventLabel: 'Newsletter',\n eventValue: undefined\n });\n\n pushToDataLayer({\n event: 'ga4_form_submit',\n ga4_data: {\n form_name: 'Newsletter form',\n form_id: sessionStorage.getItem('trackedFormId')\n }\n });\n break;\n }\n default:\n break;\n }\n\n if ($form.find('.ga-email-optin').length > 0) {\n pushToDataLayer({\n event: 'gaEvent',\n eventTrigger: 'emailOptIn',\n eventCategory: 'Email Opt-In',\n eventAction: 'Subscribe',\n eventLabel: window.location\n });\n }\n};\n","/**\n * Pushes analytics data to dataLayer\n * @param {Object} data\n*/\nexport const pushToDataLayer = data => {\n\twindow.dataLayer.push(data);\n};\n","export class Select {\n static getSelectConfig($select) {\n const config = { dir: document.dir };\n if (!$select.hasClass('js-select-show-search')) {\n config.minimumResultsForSearch = 'Infinity';\n }\n\n if ($select.hasClass('js-mobile-header-changeLang')) {\n config.dropdownParent = '.header-menu-container';\n }\n\n if ($select.hasClass('js-mobile-footer-changeLang')) {\n config.dropdownParent = '.footer-frost';\n }\n\n return config;\n }\n\n static isOnPage() {\n return $('.js-select').length !== 0;\n }\n\n constructor() {\n window.onload = $(() => {\n $.each($('.js-select'), (index, select) => {\n const $select = $(select);\n\n if (!$select.hasClass('js-select-init-disable')) {\n $select.select2(Select.getSelectConfig($select));\n }\n });\n });\n }\n}\n","const { initLandingSampleSizes } = require('./forms/landingSampleForm');\nconst { onFormSend } = require('./forms/ajax');\nconst { onInputTextAreaInteraction, onInteraction, onSampleSizeInteraction } = require('./forms/interactions');\nconst { analyticsSampleRequest } = require('./analytics/listeners/externallyTriggeredEvents');\nconst { HMSDatePicker } = require('./initDatepicker');\n\nwindow.HMSForm = class Form {\n constructor() {\n this.forms = new Map();\n this.init();\n }\n\n /**\n * Registers forms by looping through the dom, and adds the forms to the forms map.\n */\n registerForms() {\n $.each($('.js-form'), (index, form) => {\n this.forms.set(form.id, {\n type: $(form).data('formtype'),\n isValid: false,\n serverMessage: false,\n elements: null,\n inputTimeout: false,\n hasRecaptcha: $(form).find('.g-recaptcha.js-form-content').length > 0\n })\n });\n }\n\n /**\n * Gets form data from the forms map\n * @param {String} formId\n * @returns {Object} - Form data\n */\n getFormData(formId) {\n return this.forms.get(formId);\n }\n\n /**\n * Sets a new data to the desired form in the forms map\n * @param {String} formId\n * @param {*} update - new form data\n */\n setFormData(formId, update) {\n const data = this.getFormData(formId);\n\n Object.keys(update).forEach(key => {\n data[key] = update[key];\n });\n this.forms.set(formId, data);\n }\n\n /**\n * Gets form id from the containing dom element\n * @param {Node} element\n * @returns {String} - Form id\n */\n getFormIdFromElement(element) {\n return $(element).parents('.js-form').attr('id');\n }\n\n /**\n * Inits the forms by initing datepickers, dropdowns, and adds forms elements event listeners\n */\n init() {\n window.HMS.DatePicker = new HMSDatePicker();\n this.registerForms();\n this.addEvents();\n if (window.productsAndSizes && $('.js-form-landing-sample').length) {\n initLandingSampleSizes();\n analyticsSampleRequest('Step 1', $('#LandingSampleProduct').val());\n }\n }\n\n /**\n * Adds form elements event listeners\n */\n addEvents() {\n $('.js-form-submit').on('click', event => onFormSend(event, this));\n\n $(document).on('change', '.js-form-submit-onchange', event => onFormSend(event, this));\n\n $('.js-form input, .js-form textarea').on('keypress change focusout click paste',\n event => onInputTextAreaInteraction(event, this));\n\n $('.js-form .js-select').on('select2:close change', event => onInteraction(event.currentTarget, this));\n\n $('.js-form-sample-size').on('change', event => onSampleSizeInteraction(event.currentTarget));\n }\n};\n","import { analyticsFormSend } from '../analytics/listeners/externallyTriggeredEvents';\r\n\r\nconst { toggleNotifications } = require('./notifications');\r\nconst { scrollToElement } = require('../helpers/scrollToElement');\r\nconst { preloader } = require('../helpers/preloader');\r\nconst { indexFormElements } = require('./indexFormElements');\r\nconst { HMSNewsletterSignup } = require('../newsletterSignup');\r\n\r\n/**\r\n * Generates JSON for form sending\r\n * @param {String} id - Form id\r\n * @param {Array} elements - form elements\r\n * @returns {JSON}\r\n */\r\nfunction generateJSON(id, elements) {\r\n const $form = $(`#${id}`);\r\n\r\n /**\r\n * Strips form id prefix if present in element id / name, since these fields are later used\r\n * to form json\r\n * @param {Object} element\r\n */\r\n function stripFormIdPrefix(element) {\r\n const splitId = element.id.split(`${id}__`);\r\n const splitName = element.name ? element.name.split(`${id}__`) : [];\r\n\r\n if (splitId.length === 2) {\r\n element.id = splitId[1];\r\n }\r\n\r\n if (element.name && splitName.length === 2) {\r\n element.name = splitName[1];\r\n }\r\n }\r\n\r\n /**\r\n * Some forms have prefixed id's that should be stripped in the save json.\r\n * This function stips the prefix for forms that have attribute data-has-prefixed-id.\r\n * @returns {String} id for json\r\n */\r\n function getFormIdforJSON() {\r\n if ($form.data('has-prefixed-id')) {\r\n const stippedId = id.split('__');\r\n\r\n if (stippedId.length === 2) {\r\n return stippedId[1];\r\n }\r\n }\r\n\r\n return id;\r\n }\r\n\r\n let json = {\r\n formId: getFormIdforJSON(),\r\n formParentId: $form.parents('.js-form-parent').attr('id')\r\n };\r\n\r\n let checkboxGroups = new Set();\r\n\r\n // Add form fields data\r\n elements.forEach(element => {\r\n if (!element.value) {\r\n return\r\n }\r\n\r\n stripFormIdPrefix(element);\r\n\r\n if (element.id === 'g-recaptcha') {\r\n json.isRecaptchaValidated = true;\r\n json.responseKey = element.value;\r\n } else if (element.value.datepicker) {\r\n json[element.id] = `${element.value.datepicker}`;\r\n } else if (element.type === 'radio') {\r\n json[element.name] = element.value;\r\n } else if (element.type === 'checkbox') {\r\n if (element.checkboxGroupId) {\r\n checkboxGroups.add(element.checkboxGroupId);\r\n } else {\r\n json[element.name] = element.value;\r\n }\r\n } else {\r\n element.name ? json[element.name] = element.value : json[element.id] = element.value;\r\n }\r\n });\r\n\r\n checkboxGroups.forEach(checkboxGroup => {\r\n json[checkboxGroup] = getGroupValue(checkboxGroup);\r\n });\r\n\r\n // Add hidden form inputs data\r\n $.each($form.find('.js-form-hidden-inputs input'), (index, input) => {\r\n const $input = $(input);\r\n let inputName = $input.attr('name');\r\n if (inputName.split(id).length === 2) {\r\n inputName = inputName.split(`${id}__`)[1];\r\n }\r\n json[inputName] = $input.val();\r\n });\r\n\r\n // hidden input isn't inside form\r\n if (id === 'form-buy-in-store' ) {\r\n json.VariantIds = document.getElementById('VariantIds').value;\r\n }\r\n\r\n return json;\r\n}\r\n\r\nfunction getGroupValue(checkboxGroupId) {\r\n let groupValue = '';\r\n\r\n $(`input[checkboxGroupId='${checkboxGroupId}']:checked`).each((index, checkbox) => {\r\n let labelValue = $(`label[for='${$(checkbox).attr('name')}']`).text().trim();\r\n if (index === 0) {\r\n groupValue += labelValue;\r\n } else {\r\n groupValue += `|${labelValue}`;\r\n }\r\n });\r\n\r\n return groupValue;\r\n}\r\n\r\n/**\r\n * When the form is sent, the user gets scrolled to the top of the form.\r\n * This function returns the scrollable element depending of the form type.\r\n * @param {Node} $form\r\n * @returns {Node} - Element to scroll to\r\n */\r\nfunction getScrollableElement($form) {\r\n switch ($form.data('formtype').toLowerCase()) {\r\n case 'sampleorder':\r\n return $form.hasClass('js-form-landing-sample')\r\n ? $form.parents('.js-landing-sample-content')\r\n : $form.parents('.js-sample-container');\r\n case 'newsletter':\r\n return $form.parents('.js-popup-container').length\r\n ? $form.parents('.js-popup-container')\r\n : $form.parents('.crate');\r\n case 'contactus':\r\n return $form.parents('.crate').length ? $form.parents('.crate') : $form;\r\n case 'askdoctor':\r\n return $form.parents('.crate');\r\n default:\r\n return $form;\r\n }\r\n}\r\n\r\n/**\r\n * Shows the server message after the form has been sent.\r\n * @param {Boolean} toggle Hide/Show the message\r\n * @param {Node} $form\r\n * @param {String} msg server message\r\n * @param {String} msgType msg status from the server (success/error)\r\n */\r\nexport function showServerMsg(toggle, $form, msg, msgType) {\r\n // eslint-disable-next-line no-negated-condition\r\n if (!$form.hasClass('js-iri-form')) {\r\n scrollToElement(getScrollableElement($form));\r\n }\r\n\r\n let $sendButton = $form.find('.js-form-send-btn');\r\n\r\n // Fix for buttons outside the form\r\n if (!$sendButton.length) {\r\n const formId = $form.attr('id');\r\n $sendButton = $(`.js-form-submit[data-formid=\"${formId}\"]`).parents('.js-form-send-btn');\r\n }\r\n\r\n if (msgType === 'success') {\r\n if ($form.hasClass('js-form-sample')) {\r\n\t\t\twindow.HMSProductSample.renderStep(msg);\r\n\t\t\t$('.js-sample-selected-info').remove();\r\n\r\n return;\r\n }\r\n if ($form.hasClass('js-form-landing-sample')) {\r\n $form.parents('.js-form-parent').remove();\r\n $sendButton.remove();\r\n $('.js-landing-sample').addClass('landing-sample--confirmation');\r\n $('.js-landing-sample-text').html(msg);\r\n\r\n return;\r\n }\r\n if ($form.hasClass('js-form-newsletter-signup')) {\r\n HMSNewsletterSignup.renderResponse(msg, $form);\r\n if ($form.hasClass('js-form-newsletter-signup-popup')) {\r\n HMSNewsletterSignup.setCookie();\r\n }\r\n\r\n return;\r\n }\r\n }\r\n const $serverMsg = $form.find('.js-form-server-msg');\r\n\r\n if (!toggle) {\r\n $form.find('.js-form-content').removeClass('hide');\r\n $sendButton.removeClass('hide');\r\n $serverMsg.html('').removeClass('fontRed').addClass('hide');\r\n\r\n return;\r\n }\r\n\r\n $serverMsg.html(msg).removeClass('hide');\r\n if (msgType === 'success') {\r\n if (!$form.hasClass('js-iri-form')) {\r\n $form.find('.js-form-content').addClass('hide');\r\n $sendButton.addClass('hide');\r\n }\r\n }\r\n if (msgType === 'error') {\r\n $serverMsg.addClass('fontRed');\r\n }\r\n}\r\n\r\n/**\r\n * Actions after the form is sent succesfully.\r\n * @param {Node} $form\r\n * @param {Object} data data got from the server responce\r\n * @param {String} textStatus text status got from the server responce\r\n * @param {Object} classObj Forms class instance\r\n * @param {Object} payload Data passed from ajax post\r\n */\r\n// eslint-disable-next-line max-params\r\nfunction onSendSuccess($form, data, textStatus, classObj, payload) {\r\n preloader($form, false);\r\n showServerMsg(true, $form, data, textStatus);\r\n classObj.setFormData($form.attr('id'), { serverMessage: true });\r\n analyticsFormSend($form);\r\n\r\n // Reinitialize power reviews script for Checkout Beacon to work\r\n const $sampleConfirmation = $('.js-sample-form-status');\r\n if ($sampleConfirmation.length && $sampleConfirmation.data('form-status') === 'Confirmation') {\r\n new window.HMSPowerReviews();\r\n }\r\n\r\n if ($form.attr('id') === 'form-buy-in-store') {\r\n window.HMSBuyInStoreInstance.render(data);\r\n }\r\n\r\n if ($form.attr('id') === 'form-where-to-buy') {\r\n window.HMSBuyInStoreInstance.render(data);\r\n window.HMSWhereToBuyInstance.init(data);\r\n if (data.results.IriStores.length === 0) {\r\n window.HMSWhereToBuyInstance.initBuyDirect(payload.product, payload.segment);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Actions after the form failed to be saved.\r\n * @param {Node} $form\r\n * @param {Object} jqXHR Server responce\r\n * @param {Object} classObj Forms class instance\r\n */\r\nfunction onSendFail($form, jqXHR, classObj) {\r\n const genericServerFailMsg = $form.find('.js-form-server-fail').html();\r\n showServerMsg(true, $form, jqXHR.responseText || genericServerFailMsg, 'error');\r\n preloader($form, false);\r\n classObj.setFormData($form.attr('id'), { serverMessage: true });\r\n}\r\n\r\n/**\r\n * Callback when the form send button is pressed.\r\n * If the form is valid, it will be sent.\r\n * @param {Event} event - Click event\r\n * @param {Object} classObj - Forms class instance\r\n * @returns {Function | null} - If Recaptcha was removed by hackers return function call\r\n */\r\nexport function onFormSend(event, classObj) {\r\n event.preventDefault();\r\n const $button = $(event.currentTarget);\r\n let $form = $button.parents('.js-form');\r\n\r\n // Fix for buttons outside the
\r\n if (!$form.length && $button.data('formid') && $button.data('formid').length) {\r\n $form = $(`#${$button.data('formid')}`);\r\n }\r\n\r\n indexFormElements($form, classObj);\r\n\r\n const id = $form.attr('id');\r\n const formData = classObj.getFormData(id);\r\n const hasRecaptcha = classObj.forms.get(id).hasRecaptcha;\r\n const payload = generateJSON(id, formData.elements);\r\n let isValid = formData.isValid;\r\n\r\n if (isValid && hasRecaptcha && (!payload.responseKey || !payload.isRecaptchaValidated)) {\r\n isValid = false;\r\n\r\n // Recaptcha was present on page but was removed by hackers before sending.\r\n return onSendFail($form, false, classObj);\r\n }\r\n\r\n if (isValid) {\r\n preloader($form, true);\r\n\r\n $.ajax({\r\n url: $form.attr('action'),\r\n type: 'POST',\r\n data: payload,\r\n success: (data, textStatus) => onSendSuccess($form, data, textStatus, classObj, payload),\r\n error: jqXHR => onSendFail($form, jqXHR.responseText, classObj)\r\n });\r\n }\r\n\r\n toggleNotifications($form, formData.elements);\r\n}\r\n","import { validateElement } from './validation';\n\n/**\n * Gets the value of the form element.\n * The value is returned as a string, besides the datepicker that returns the value as an object.\n * @param {Node} $element - Form element\n * @returns {(String|Object)} - Element value\n */\nfunction getValue($element) {\n if ($element.attr('type') === 'checkbox') {\n return $element.attr('checkboxGroupId') && $element.attr('checkboxGroupId').length\n ? $(`label[for='${$element.attr('name')}']`).text().trim()\n : $element[0].checked;\n }\n\n if ($element.attr('type') === 'radio') {\n let value;\n $.each($element, (index, radio) => {\n if (radio.checked) {\n value = $(radio).val();\n }\n });\n\n return value;\n }\n\n if ($element.hasClass('js-datepicker')) {\n const fp = $element[0]._flatpickr;\n const selectedDate = fp.selectedDates[0];\n\n if (selectedDate) {\n return {\n datepicker: fp.formatDate(selectedDate, 'Y-d-m')\n };\n }\n\n return '';\n }\n\n return $element.val() ? $element.val().trim() : '';\n}\n\n/**\n * Gets the element props from the DOM\n * @param {Node} element\n * @param {Object} classObj\n * @param {Node} field - element js-form-field parent\n * @returns {Object}\n */\nexport function getElementProps(element, classObj, field = $(element).parents('.js-form-field')[0]) {\n const $element = $(element);\n const value = getValue($element);\n const tagName = $element[0].tagName;\n const type = $element.attr('type');\n const name = $element.attr('name');\n const id = $element.attr('id');\n const mandatory = $element.hasClass('js-mandatory');\n const validation = validateElement(field, type, value, classObj);\n const checkboxGroupId = $element.attr('checkboxgroupid');\n\n return { id, tagName, type,\tvalue, name, mandatory,\tvalidation, checkboxGroupId };\n}","import { getElementProps } from './getElementProps';\n\n/**\n * Indexes the form elements from the DOM, and sets the value to the Forms map in the main class.\n * @param {Node} $form\n * @param {Object} classObj - Form class instance\n */\nexport function indexFormElements($form, classObj) {\n const elements = [];\n const formId = $form.attr('id');\n classObj.setFormData(formId, { isValid: true });\n\n $.each($form.find('.js-form-field'), (index, field) => {\n const $field = $($(field).find('.js-form-element'));\n\n $field.each((index2, element) => {\n elements.push(getElementProps(element, classObj, field));\n });\n });\n\n const $recaptchaResponse = $form.find('.g-recaptcha-response');\n\n if ($recaptchaResponse.length) {\n const value = $recaptchaResponse.val().trim();\n const isValid = value !== '';\n\n const element = {\n id: 'g-recaptcha',\n value,\n mandatory: true,\n validation: {\n valid: isValid,\n validations: ['validate-required']\n }\n };\n\n if (!isValid) {\n classObj.setFormData(formId, { isValid: false });\n element.validation.failedRules = element.validation.validations;\n }\n\n elements.push(element);\n }\n\n if ($form.hasClass('js-form-sample')) {\n const value = $('.js-form-sample-size').val();\n const valid = value !== '';\n if (!valid) {\n classObj.setFormData(formId, { isValid: false });\n }\n const failedRules = valid ? [] : ['validate-required'];\n\n elements.push({\n type: 'sample-sizes',\n name: 'sample-sizes',\n id: 'AvailableSizesOfSelectedItem',\n value,\n validation: {\n valid,\n failedRules,\n validations: ['validate-required']\n }\n })\n }\n\n classObj.setFormData(formId, { elements\t});\n}\n","const { toggleNotification } = require('./notifications');\nconst { getElementProps } = require('./getElementProps');\nconst { showServerMsg } = require('./ajax');\nconst { allowOnlyNumbersInInput } = require('../helpers/allowOnlyNumbersInInput');\nconst { addNumberInputMaxLength } = require('../helpers/addNumberInputMaxLength');\n\n/**\n * \n * @param {Node} $target\n */\nfunction toggleOptins($target) {\n const showIfChecked = $target.data('show-if-checked');\n const hideIfChecked = $target.data('hide-if-checked');\n if (!showIfChecked && !hideIfChecked) {\n return;\n }\n if (showIfChecked && showIfChecked.length && $target[0].checked) {\n $(`#optin-group-${showIfChecked}`).removeClass('hide');\n\n return;\n }\n $(`#optin-group-${hideIfChecked || showIfChecked}`).addClass('hide');\n $(`#optin-group-${hideIfChecked || showIfChecked}`).find('.js-form-element').each((index, input) => {\n input.checked = false;\n });\n}\n\n/**\n * Callback when the user interacts with the form\n * @param {Node} target - event.currentTarget\n * @param {Object} classObj - Forms class instance\n */\nexport function onInteraction(target, classObj) {\n const $target = $(target);\n const $form = $target.parents('.js-form');\n\n toggleOptins($target);\n toggleNotification(getElementProps(target, classObj), $form);\n}\n\n/**\n * On Sample page, the product size dropdown (displayed outside the form) is validated as mandatory.\n * This method toggles sample size validation message.\n * @param {Node} target - event.currentTarget\n */\nexport function onSampleSizeInteraction(target) {\n $('.js-form-sample-size-validation').toggleClass('u-display-block', $(target).val() === '');\n}\n\n/**\n * Callback when the input/textarea is being used by the user.\n * @param {Event} event - text area event\n * @param {Object} classObj - Forms class instance\n */\nexport function onInputTextAreaInteraction(event, classObj) {\n if (event.type === 'keypress' && event.currentTarget.type === 'number') {\n allowOnlyNumbersInInput(event);\n\n if (event.currentTarget.maxLength) {\n addNumberInputMaxLength(event);\n }\n }\n\n const formId = classObj.getFormIdFromElement(event.currentTarget);\n let formData = classObj.getFormData(formId);\n\n if (formData.serverMessage === true) {\n showServerMsg(false, $(event.currentTarget).parents('.js-form'));\n }\n\n if (formData.inputTimeout) {\n clearTimeout(formData.inputTimeout);\n formData.inputTimeout = null;\n classObj.forms.set(formId, formData);\n }\n\n formData.inputTimeout = setTimeout(() => onInteraction(event.currentTarget, classObj), 100);\n classObj.forms.set(formId, formData);\n}","import { Select } from '../common/select';\n\n/**\n * Generates sample size options\n * @param {Array} sizes - Available product sizes\n * @returns {String}\n */\nconst generateSizeOptions = sizes => {\n let options = '';\n sizes.forEach((size, index) => {\n options += ``;\n });\n\n return options;\n};\n\n/**\n * Renders product size dropdown\n * @param {Array} sizes - Available product sizes\n * @param {Node} $selectedProduct\n */\nconst renderProductSizesDropdown = (sizes, $selectedProduct) => {\n const sizeLabelVal = $('#SelectSizeLabel').val();\n const sizeLabel = sizeLabelVal.length ? `` : '';\n $selectedProduct.closest('.row').append(`\n
\n ${sizeLabel}\n \n
\n `);\n const $size = $('#sampleProductSizes');\n $size.select2(Select.getSelectConfig($size));\n};\n\n/**\n * Callback after the product sample is selected\n * @param {Sting} selectedProduct - product id\n * @param {Node} $selectedProduct\n */\nconst onLandingSampleProductSelected = (selectedProduct, $selectedProduct) => {\n $('.js-form-field-sizes').remove();\n const sizes = window.productsAndSizes[selectedProduct];\n if (sizes && sizes.length) {\n renderProductSizesDropdown(sizes, $selectedProduct);\n }\n};\n\n/**\n * Inits landing sample sizes\n */\nexport const initLandingSampleSizes = () => {\n if (window.productsAndSizes && Object.keys(window.productsAndSizes).length) {\n const $selectedProduct = $('#AvailableSampleProducts');\n if ($selectedProduct.length) {\n onLandingSampleProductSelected($selectedProduct.val(), $selectedProduct);\n }\n $selectedProduct.on('select2:select', event =>\n onLandingSampleProductSelected(event.params.data.id, $selectedProduct));\n }\n};","import { scrollToElement } from '../helpers/scrollToElement';\n\n/**\n * Clears the field related validation error\n * @param {Node} $formField\n */\nfunction clearError($formField) {\n $formField.find('.validate-message').removeClass('u-display-block');\n $formField.find('.field-checkbox-container').removeClass('invalid');\n $formField.find('js-validation-icon').remove();\n}\n\n/**\n * Clears all form errors\n * @param {Node} $form\n */\nfunction clearErrors($form) {\n $.each($form.find('.js-form-field'), (index, formField) => clearError($(formField)));\n}\n\n/**\n * Toggles field related notification\n * @param {Object} element\n * @param {Node} $form\n */\nexport function toggleNotification(element, $form) {\n if (element.id === 'g-recaptcha') {\n $form.find('.captcha-error').toggleClass('hide', element.validation.valid);\n\n return;\n }\n const isValid = element.validation.valid;\n\n if ($form.hasClass('js-form-sample') && element.type === 'sample-sizes') {\n $('.js-form-sample-size-validation').toggleClass('u-display-block', !isValid);\n }\n const $formField = $form.find(`#${element.id}`).parents('.js-form-field');\n\n $formField.find('.field-checkbox-container').toggleClass('invalid', !isValid);\n $formField.find('.js-validation-icon').remove();\n $formField.find('.validate')\n .toggleClass('invalid', !isValid)\n .toggleClass('valid', isValid)\n .append(``);\n const requredFailed = element.validation.failedRules.indexOf('validate-required') > -1;\n function toggleMsg(validation, toggle) {\n $formField.find(`.${validation}-message`).toggleClass('u-display-block', toggle);\n }\n function hideAllFieldMsgs() {\n $formField.find('.validate-message').removeClass('u-display-block');\n }\n\n const emailMatchCheckFailed = element.type === 'email' && element.validation.failedRules.indexOf('validate-match') > -1;\n if (emailMatchCheckFailed) {\n // Do not show other notifications if emails do not match\n hideAllFieldMsgs();\n toggleMsg('validate-match', true);\n\n\n return;\n }\n\n if (requredFailed) {\n // Do not show other notifications if required check failed\n hideAllFieldMsgs();\n toggleMsg('validate-required', true);\n\n return;\n }\n\n element.validation.validations.forEach(validation => {\n toggleMsg(validation, element.validation.failedRules.indexOf(validation) !== -1);\n });\n}\n\n/**\n * Toggles all notifications in the form\n * @param {Node} $form\n * @param {Array} elements - form elements data\n */\nexport function toggleNotifications($form, elements) {\n let navigatedToError = false;\n\n clearErrors($form);\n\n elements.forEach(element => {\n toggleNotification(element, $form);\n if (!navigatedToError && !element.validation.valid) {\n navigatedToError = true;\n const $element = $(`#${element.id}`);\n if ($element.length) {\n scrollToElement($element.parents('.js-form-field'));\n\n return;\n }\n\n if (element.id === 'g-recaptcha') {\n scrollToElement($form.find('.g-recaptcha'));\n }\n }\n });\n}\n","const { validateEmail } = require('../helpers/validateEmail');\nconst { validateEmoji } = require('../helpers/validateEmoji');\n\n/**\n * Get field validations from the dom\n * @param {Node} field\n * @returns {Array} validations list\n */\nfunction getFieldValidations(field) {\n const classes = [...field.classList];\n\n return classes.filter(className => className.indexOf('validate-') > -1);\n}\n\n/**\n * Validates the element\n * @param {Node} field - Field node\n * @param {String} type - Field type\n * @param {String} value - Field value\n * @param {Object} classObj - Forms class instance\n * @returns {Object} field validation data\n */\nexport const validateElement = (field, type, value, classObj) => {\n const $field = $(field);\n const formId = $field.parents('.js-form').attr('id');\n const validations = getFieldValidations(field);\n let valid = true;\n const failedRules = [];\n\n /**\n * Pushed data for invalid field validation\n * @param {String} validation\n */\n const pushFailed = validation => {\n valid = false;\n failedRules.push(validation);\n classObj.setFormData(formId, { isValid: false });\n }\n\n const isRequired = validations.indexOf('validate-required') > -1;\n\n // eslint-disable-next-line complexity\n const validateField = validation => {\n switch (validation) {\n case 'validate-required':\n if (!value || value.length === 0) {\n if (type === 'checkbox') {\n if ($field.find('.js-form-element:checked').length\n || ($field.hasClass('js-optin-group') && $field.hasClass('hide'))) {\n\n return;\n }\n }\n pushFailed(validation);\n }\n break;\n case 'validate-email':\n if (!validateEmail(value) && (isRequired && value !== '')) {\n pushFailed(validation);\n }\n break;\n case 'validate-match':\n if ($(`#${$field.data('match')}`).val().trim() !== value) {\n pushFailed(validation);\n }\n break;\n case 'validate-min':\n if (value.length < $field.find('.js-form-element').attr('minlength')\n && (isRequired && value !== '')) {\n pushFailed(validation);\n }\n break;\n case 'validate-max':\n if (typeof Number(value) === 'number') {\n const $input = $field.find('.js-form-element');\n const maxLength = $input.attr('maxlength');\n\n if (value.length > Number(maxLength)) {\n const trimmedValue = $input.val().substring(0, Number(maxLength));\n $input.val(trimmedValue);\n }\n }\n break;\n case 'validate-emoji':\n if (!validateEmoji(value)) {\n pushFailed(validation);\n }\n break;\n case 'validate-prefix': {\n const $input = $field.find('.js-form-element');\n if (!$input.val().trim().startsWith($input.attr('mobileprefix'))) {\n pushFailed(validation);\n }\n break;\n }\n default:\n break;\n }\n };\n\n validations.forEach(validation => validateField(validation));\n\n return { valid, failedRules, validations };\n};\n","export const addNumberInputMaxLength = event => {\n if (event.currentTarget.maxLength <= event.currentTarget.value.length) {\n event.preventDefault();\n }\n};","export const allowOnlyNumbersInInput = event => {\n if ((event.which !== 8 && event.which !== 0 && event.which < 48) || event.which > 57) {\n event.preventDefault();\n }\n};\n","/**\n * Returns a cookie value if a name is specified. Otherwise returns the entire cookies as an object\n * @param {String} name - The name of the cookie to fetch the value for. Returns the entire map of cookies if not specified\n * @returns {String|Object} - The value of the cookie specified by `name` if specified. Otherwise returns a name value map of the available cookies\n */\nexport function getCookie(name) {\n const cookies = document.cookie.split(';')\n .reduce((acc, cookieString) => {\n const [key, value] = cookieString.split('=').map(str => str.trim());\n if (key && value) {\n acc[key] = decodeURIComponent(value);\n }\n\n return acc;\n }, {});\n\n return name ? cookies[name] || '' : cookies;\n}\n\n/**\n*\n* @param {String} name - The name of the cookie to be set\n* @param {String} value - The value of the cookie\n* @param {Number} daysToExpire - Cookie expiration date\n*/\nexport function setCookie(name, value, daysToExpire) {\n const date = new Date();\n date.setTime(date.getTime() + (daysToExpire * 24 * 60 * 60 * 1000));\n document.cookie = `${name}=${encodeURIComponent(value)}; expires=${date.toGMTString()}; path=/`;\n}\n","import { isMobile } from './isMobile';\n\nexport const getHeaderHeight = () => {\n if (isMobile()) {\n return $('#mainheader').height();\n }\n const $menuWrapper = $('.menu-wrapper');\n if ($menuWrapper.hasClass('sticky')) {\n return $menuWrapper.height();\n }\n\n return $('#mainheader').height();\n};\n","export const isMobile = () => window.innerWidth < 992;","/**\n * Toggle preloader in section\n * @param {Node} $container - Section container\n * @param {Boolean} toggle\n */\nexport const preloader = ($container, toggle) => {\n $container.find('.js-preloader').toggleClass('show', toggle);\n}\n","import { getHeaderHeight } from './getHeaderHeight';\n\nexport const scrollToElement = $element => {\n let scrollTop = $element.offset().top - getHeaderHeight() - 20;\n if ($('.menu-wrapper.sticky').length === 0) {\n scrollTop = $element.offset().top - 80;\n }\n $('html, body').animate({ scrollTop }, 400);\n};\n","/**\n * Validates if the sting is in valid email form.\n * @param {String} email\n * @returns {Boolean}\n */\nexport const validateEmail = email => {\n // Fix for invalid characters after the '@' sign in Chrome.\n if (email.indexOf('xn--') > -1) {\n return false;\n }\n\n const re = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n\n return re.test(email);\n};\n","const defaultRegex = /(\\u00a9|\\u00ae|[\\u2000-\\u3300]|\\ud83c[\\ud000-\\udfff]|\\ud83d[\\ud000-\\udfff]|\\ud83e[\\ud000-\\udfff])/g;\n\n/**\n * Validates if the string contains emojis.\n * If available, regex exposed in window.HMSeMojiRegxExpression,\n * if not the defaultRegex will be used instead.\n * @param {String} fieldValue\n * @returns {Boolean}\n */\nexport const validateEmoji = fieldValue => {\n const regex = window.HMSeMojiRegxExpression && window.HMSeMojiRegxExpression.length ?\n window.HMSeMojiRegxExpression : defaultRegex;\n\n let expr = new RegExp(regex);\n\n if (expr.test(fieldValue)) {\n return false;\n }\n\n return true;\n};\n","/**\n * Representation of the datepicker functionality\n */\nexport class HMSDatePicker {\n constructor() {\n this.config = {\n enableTime: false,\n dateFormat: 'm/d/Y',\n disableMobile: true\n };\n this.datePickers = new Map();\n this.init();\n }\n\n /**\n * Initializes the datepickers and stores them in this.datePickers for further use\n * @param {Node} datepicker\n */\n initDatepicker(datepicker) {\n const $datepicker = $(datepicker);\n const yearMin = $datepicker.attr('yearMin');\n const yearMax = $datepicker.attr('yearMax');\n const dateFormat = $datepicker.attr('dateFormat');\n const config = $.extend({}, this.config, true);\n const indexOfMonth = 11;\n const dayOfMonth = 31;\n\n if (yearMin) {\n config.minDate = new Date(yearMin, 0);\n }\n\n if (yearMax) {\n config.maxDate = new Date(yearMax, indexOfMonth, dayOfMonth);\n }\n\n if (dateFormat) {\n config.dateFormat = dateFormat;\n }\n\n this.datePickers.set($datepicker.attr('id'), $datepicker.flatpickr(config));\n }\n\n /**\n * Gathers all datepickers and initializes them by calling this.initDatepicker(datepicker)\n */\n init() {\n $.each($('.js-datepicker'), (index, datepicker) => this.initDatepicker(datepicker));\n }\n}","import { getCookie, setCookie } from './helpers/cookie';\n\n/**\n * @class HMSNewsletterSignup\n */\nexport class HMSNewsletterSignup {\n /**\n * Render response html\n * @param {String} msg\n * @param {Node} $form\n */\n static renderResponse(msg, $form) {\n $(`.js-newsletter-signup-text-${$form.attr('id')}`).html(msg);\n $form.parents('.js-form-parent').remove();\n }\n\n /**\n * Sets cookie that user subscribed\n */\n static setCookie() {\n setCookie('newsletterSignup', true, 3650);\n }\n\n /**\n * Returns if the user already subscribed\n * @returns {Boolean}\n */\n static isCookieAccepted() {\n return getCookie('newsletterSignup') === 'true';\n }\n}\n"]}