{"version":3,"file":"std.e3dcc5216f4e106d4405.js","mappings":"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","sources":["webpack://stdcheck-exposed-wp-theme/./themes/stdcheck-exposed/src/js/coupon.js","webpack://stdcheck-exposed-wp-theme/./themes/stdcheck-exposed/src/js/std.js","webpack://stdcheck-exposed-wp-theme/./themes/stdcheck-exposed/src/js/services/queryParamService.js","webpack://stdcheck-exposed-wp-theme/./themes/stdcheck-exposed/src/js/services/storage.js"],"sourcesContent":["import { StorageService } from './services/storage';\nimport { QueryParamService } from './services/queryParamService';\n\n/**\n * JS component for actions in the coupon\n */\nexport function Coupon() {\n  const storageService = new StorageService();\n  const queryParamService = new QueryParamService();\n\n  /**\n   * Initialize the component.\n   */\n  function init() {\n    validateCoupon();\n  }\n\n  /**\n   * Send a request to STDcheck API to validate the url or local storage coupon code.\n   */\n  function validateCoupon() {\n    const couponCode = queryParamService.getQueryParam('coupon') || storageService.coupon?.coupon_code;\n    if (!couponCode) {\n      return;\n    }\n\n    return fetch(`${process.env.API_URL}/coupon/${couponCode}`)\n      .then(function (response) {\n        return response.json();\n      })\n      .then(function (data) {\n        if (data.deleted_at) {\n          displayInvalidCouponWidget(data);\n\n          return;\n        }\n\n        displayCouponWidget(data);\n      })\n      .catch(function () {\n        storageService.coupon = null;\n      });\n  }\n\n  /**\n   * If the coupon has a name (to be displayed in the widget), create an element from\n   * coupon_selected_widget template and append it to the DOM.\n   *\n   * @param { Coupon } coupon\n   */\n  function displayCouponWidget(coupon) {\n    if (!coupon.coupon_name) {\n      return;\n    }\n\n    document.getElementById('header-bar').replaceWith(createElementFromHTML(tmpl('coupon_selected_widget', coupon)));\n    modifyHeaderLayout();\n    storageService.coupon = {\n      coupon_code: coupon.coupon_code,\n      coupon_name: coupon.coupon_name,\n      coupon_type: coupon.coupon_type,\n    };\n  }\n\n  /**\n   * Display invalid coupon widget when it is expired\n   *\n   * @param data\n   */\n  function displayInvalidCouponWidget(coupon) {\n    document.getElementById('header-bar').replaceWith(createElementFromHTML(tmpl('coupon_invalid_widget', coupon)));\n    modifyHeaderLayout();\n    storageService.coupon = null;\n  }\n\n  /**\n   * Modify the header layout by moving the My Account button and phone number to the header when a coupon is applied.\n   */\n  function modifyHeaderLayout() {\n    document.querySelector('.header').classList.add('coupon-applied-header');\n    document.getElementById('header-cta-button').classList.add('hide');\n    document\n      .querySelector('.header__menu ul')\n      .appendChild(createElementFromHTML(tmpl('coupon_applied_header_buttons', {})));\n    document\n      .querySelectorAll('.coupon-applied-menu-buttons .animated-button-element')\n      .forEach((button) => button.addEventListener('click', () => (window.location.href = button.dataset.href)));\n  }\n\n  return {\n    init,\n  };\n}\n","import { StorageService } from './services/storage';\nimport { Coupon } from './coupon';\n\n('use strict');\n\n$(document).ready(function () {\n  storeAccountToken();\n  const coupon = new Coupon();\n  coupon.init();\n});\n\n/**\n * Store the account token.\n */\nfunction storeAccountToken() {\n  const storageService = new StorageService();\n  getCookie('account_token')\n    .then(function (token) {\n      storageService.token = { token: token };\n    })\n    .catch(function () {\n      storageService.localStorage.remove('ngStorage-token');\n    });\n}\n\n/**\n * Get a cookies value by its name.\n *\n * @param   name name of the cookies value to get.\n * @returns {Promise<string>}\n */\nfunction getCookie(name) {\n  return new Promise(function (resolve, reject) {\n    if (\n      !document.cookie.split('; ').some(function (cookieKeyValue) {\n        const cookieKeyValueParts = cookieKeyValue.split('=');\n        if (cookieKeyValueParts[0] === name) {\n          resolve(cookieKeyValueParts[1]);\n          return true;\n        }\n\n        return false;\n      })\n    ) {\n      reject();\n    }\n  });\n}\n\n/**\n * Creates a HTML element from the string passed.\n * @param {string} htmlString Containing the string to be parsed into an html element.\n * @return {ChildNode} Returns the converted string as HTML\n */\nfunction createElementFromHTML(htmlString) {\n  var div = document.createElement('div');\n  div.innerHTML = htmlString.trim();\n\n  // Change this to div.childNodes to support multiple top-level nodes\n  return div.firstChild;\n}\n\nwindow.createElementFromHTML = createElementFromHTML;\n\n/**\n * This function will work as our javascript \"templating\" engine function.\n */\n(function () {\n  'use strict';\n  var cache = {};\n\n  window.tmpl = function tmpl(str, data) {\n    // Figure out if we're getting a template, or if we need to\n    // load the template - and be sure to cache the result.\n    var fn = !/\\W/.test(str)\n      ? (cache[str] = cache[str] || tmpl(document.getElementById(str).innerHTML))\n      : // Generate a reusable function that will serve as a template\n        // generator (and which will be cached).\n        new Function(\n          'obj',\n          'var p=[],print=function(){p.push.apply(p,arguments);};' +\n            // Introduce the data as local variables using with(){}\n            \"with(obj){p.push('\" +\n            // Convert the template into pure JavaScript\n            str\n              .replace(/[\\r\\t\\n]/g, ' ')\n              .split('<%')\n              .join('\\t')\n              .replace(/((^|%>)[^\\t]*)'/g, '$1\\r')\n              .replace(/\\t=(.*?)%>/g, \"',$1,'\")\n              .split('\\t')\n              .join(\"');\")\n              .split('%>')\n              .join(\"p.push('\")\n              .split('\\r')\n              .join(\"\\\\'\") +\n            \"');}return p.join('');\"\n        );\n\n    // Provide some basic currying to the user\n    return data ? fn(data) : fn;\n  };\n})();\n\n/**\n * add events that should happen after document is ready.\n */\n(function () {\n  'use strict';\n\n  let menuInput, menuInputContainer, findaLabMenuSubmitButton, storageService;\n\n  $(document).ready(function () {\n    storageService = new StorageService();\n    // add lab hours button click events.\n    $('body').delegate('[data-std-hours-link]', 'click', toggleHours);\n\n    initFindALabMenuInput();\n  });\n\n  /**\n   * Initializes the find a lab functionality in the menu.\n   */\n  function initFindALabMenuInput() {\n    findaLabMenuSubmitButton = $('#menu-findNearLabSubmit');\n    menuInput = $('#menu-findalab-zipcode');\n    menuInputContainer = menuInput.parents('ul.submenu');\n\n    [menuInput, findaLabMenuSubmitButton].forEach(function (element) {\n      element.focus(function () {\n        menuInputContainer.addClass('std-findalab-menu-show-dropdown-container');\n      });\n      element.blur(function (e) {\n        if (\n          e.relatedTarget === null ||\n          (!$(e.relatedTarget).is(findaLabMenuSubmitButton) && !$(e.relatedTarget).is(menuInput))\n        ) {\n          menuInputContainer.removeClass('std-findalab-menu-show-dropdown-container');\n        }\n      });\n    });\n\n    $('#menu-findalab-form').on('submit', searchForLab);\n  }\n\n  /**\n   * Redirects to the find a lab map with the entered zip code.\n   */\n  function searchForLab(e) {\n    e.preventDefault();\n    menuInputContainer.addClass('std-findalab-menu-show-dropdown-container');\n    const zipCode = menuInput.val();\n    if (!validateZipCode(zipCode)) {\n      return;\n    }\n\n    storageService.zipCode = zipCode;\n    document.location.href = findaLabMenuSubmitButton.data('findalab-url');\n  }\n\n  /**\n   * Validates the find a lab zip code or displays an invalid zip code message when the zip is invalid.\n   *\n   * @param zipCode string the zip code to validate.\n   */\n  function validateZipCode(zipCode) {\n    let valid = /^[0-9]{5}(?:-[0-9]{4})?$/.test(zipCode.replace(/\\s+$/g, ''));\n\n    if (valid) {\n      $('.menu-invalid-zip-code').addClass('is-hidden');\n    } else {\n      $('.menu-invalid-zip-code').removeClass('is-hidden');\n    }\n\n    return valid;\n  }\n\n  /**\n   * Toggle the Hours of the lab location\n   * @param {event} event The observable event\n   */\n  function toggleHours(event) {\n    event.preventDefault();\n    var $table = $(this).siblings('[data-std-hours-table]');\n    $(this).text($table.is(':visible') ? 'Show Hours ▼' : 'Hide Hours ▲');\n    $table.slideToggle(300);\n  }\n})();\n\n(function () {\n  $(document).ready(function () {\n    $('.wistia_mousedown').click(function (event) {\n      event.preventDefault();\n      var videoId = $(this).data('id');\n      loadScript('https://fast.wistia.com/assets/external/E-v1.js')\n        .then(function () {\n          showOverlayLoading();\n          startVideo(videoId);\n        })\n        .catch(function () {\n          console.error('Wistia javascript file not loaded.');\n        });\n    });\n  });\n\n  /**\n   * Loads a JavaScript file and returns a Promise for when it is loaded\n   */\n  function loadScript(src) {\n    return new Promise(function (resolve, reject) {\n      var script = document.createElement('script');\n      script.type = 'text/javascript';\n      script.crossOrigin = 'anonymous';\n      script.onload = resolve;\n      script.onerror = reject;\n      script.src = src;\n      document.head.appendChild(script);\n    });\n  }\n\n  /**\n   * Adds an overlay loading scene.\n   */\n  function showOverlayLoading() {\n    var loading = document.createElement('div');\n    loading.id = 'loading_popover_overlay';\n    loading.className = 'wistia_popover_loading';\n    loading.innerHTML = '<i class=\"fa fa-spinner fa-pulse\"></i>';\n    document.body.appendChild(loading);\n  }\n\n  /**\n   * Removes the overlay loading.\n   */\n  function hideOverlayLoading() {\n    var loading = document.getElementById('loading_popover_overlay');\n    if (!('remove' in Element.prototype)) {\n      // IE 11\n      loading.parentNode.removeChild(loading);\n    } else {\n      loading.remove();\n    }\n  }\n\n  /**\n   * Wait until wistia become available and plays video.\n   */\n  function startVideo(videoId) {\n    setTimeout(function () {\n      window._wq = window._wq || [];\n      _wq.push({\n        id: videoId,\n        onReady: function (video) {\n          video.play();\n          hideOverlayLoading();\n        },\n      });\n    }, 200);\n  }\n})();\n","import { StorageService } from './storage';\n\n/**\n * Service class for query param.\n */\nexport function QueryParamService() {\n  const storageService = new StorageService();\n\n  /**\n   * Handle the provided query param by determining if it is present and stores it in localstorage if available\n   *\n   * @param {string} queryParam     The query param to be retrieved from URL\n   * @param {string} attributeName  The attribute name\n   */\n  function saveQueryParam(queryParam, attributeName) {\n    let attributeValue = null;\n\n    if (!(attributeValue = getQueryParam(queryParam))) {\n      return;\n    }\n\n    // Store param in the local storage\n    storageService.localStorage.set('ngStorage-' + attributeName, attributeValue);\n  }\n\n  /**\n   * Returns a given query param retrieved from the URL\n   *\n   * @param {string} param Param name to be retrieved from the URL\n   *\n   * @returns {string} Returns the value from the URL. NULL if param not exists\n   */\n  function getQueryParam(param) {\n    try {\n      const url = new URL(window.location.href);\n      return url.searchParams.get(param);\n    } catch (error) {\n      console.error(error);\n      return getParameterByNameUsingRegex(param);\n    }\n  }\n\n  /**\n   * Gets the value of a query parameter from the current url using a regular expression\n   *\n   * @param {string} param Param name to be retrieved from the URL\n   *\n   * @returns {string|null} Query param value from the url, null if doesn't exist\n   */\n  function getParameterByNameUsingRegex(param) {\n    param = param.replace(/[\\[\\]]/g, '\\\\$&');\n    const regex = new RegExp('[?&]' + param + '(=([^&#]*)|&|#|$)');\n    const results = regex.exec(window.location.href);\n    if (!results) {\n      return null;\n    }\n\n    if (!results[2]) {\n      return '';\n    }\n\n    return decodeURIComponent(results[2].replace(/\\+/g, ' '));\n  }\n\n  return {\n    saveQueryParam,\n    getQueryParam,\n    getParameterByNameUsingRegex,\n  };\n}\n","/**\n * Service class for accessing localStorage.\n */\nexport function StorageService() {\n  /**\n   * Keys used to reference data in localStorage\n   */\n  const CJ_EVENT_KEY = 'ngStorage-cjevent';\n  const COUPON_KEY = 'ngStorage-coupon';\n  const FEE_KEY = 'ngStorage-fee';\n  const LAB_KEY = 'ngStorage-center';\n  const REORDER_KEY = 'ngStorage-reorder';\n  const TESTS_KEY = 'ngStorage-tests';\n  const TOKEN_KEY = 'ngStorage-token';\n  const ZIPCODE_KEY = 'ngStorage-zip_code';\n  const IN_HOME_KEY = 'ngStorage-in-home-booking-result';\n  const EMAIL_KEY = 'ngStorage-email';\n  const FREE_KEY = 'ngStorage-free';\n  const TRANSACTION_ID_KEY = 'transaction_id';\n  const BETTER_LAB = 'ngStorage-betterlab';\n  const IHC_PROVIDERS_KEY = 'ngStorage-ihc-providers';\n\n  /**\n   * Retrieves a value stored as JSON in localStorage\n   *\n   * @param {string} key the key to retrieve from storage\n   *\n   * @return {any}  The value stored in localStorage\n   */\n  function getLocalStorage(key) {\n    return JSON.parse(window.localStorage?.getItem(key) || null);\n  }\n\n  /**\n   * Saves a value in localStorage as a JSON string\n   *\n   * @param {string} key The key to store the value in\n   * @param {any} value  The value to be stored\n   *\n   * @return {void}\n   */\n  function setLocalStorage(key, value) {\n    window.localStorage?.setItem(key, JSON.stringify(value || null));\n  }\n\n  /**\n   * Deletes a value from the storage.\n   *\n   * @param key {string} The value's key.\n   *\n   * @return void\n   */\n  function removeLocalStorage(key) {\n    window.localStorage?.removeItem(key);\n  }\n\n  // Initialize tests in localStorage\n  if (!getLocalStorage(TESTS_KEY)) {\n    setLocalStorage(TESTS_KEY, []);\n  }\n\n  return {\n    /**\n     * Local Storage get, set and remove\n     */\n    localStorage: {\n      get: getLocalStorage,\n      set: setLocalStorage,\n      remove: removeLocalStorage,\n    },\n\n    /**\n     * Removes any reorder information from local storage\n     */\n    removeReorderInformation: function () {\n      window.localStorage?.removeItem(REORDER_KEY);\n    },\n\n    /**\n     * Removes previous order information from local storage\n     */\n    removePreviousOrderInformation: function () {\n      window.localStorage?.removeItem(TRANSACTION_ID_KEY);\n      window.localStorage?.removeItem(BETTER_LAB);\n    },\n\n    /**\n     * Retrieve coupon data from local storage\n     */\n    get coupon() {\n      return this.localStorage.get(COUPON_KEY) ?? {};\n    },\n\n    /**\n     * Store coupon data in local storage\n     */\n    set coupon(coupon) {\n      this.localStorage.set(COUPON_KEY, coupon);\n    },\n\n    /**\n     * Retrieve fee data from localStorage\n     */\n    get fee() {\n      return this.localStorage.get(FEE_KEY);\n    },\n\n    /**\n     * Store fee data in localStorage\n     */\n    set fee(fee) {\n      this.localStorage.set(FEE_KEY, fee);\n    },\n\n    /**\n     * Retrieve lab data from local storage\n     */\n    get lab() {\n      return this.localStorage.get(LAB_KEY) ?? {};\n    },\n\n    /**\n     * Store lab data in local storage\n     */\n    set lab(lab) {\n      this.localStorage.set(LAB_KEY, lab);\n    },\n\n    /**\n     * Retrieve psc data from local storage\n     */\n    get psc() {\n      return this.lab;\n    },\n\n    /**\n     * Store psc data in local storage\n     */\n    set psc(psc) {\n      this.lab = psc;\n    },\n\n    /**\n     * Retrieve selected tests data from local storage\n     */\n    get tests() {\n      return this.localStorage.get(TESTS_KEY) ?? [];\n    },\n\n    /**\n     * Store selected tests data in local storage\n     */\n    set tests(tests) {\n      this.localStorage.set(TESTS_KEY, tests);\n    },\n\n    /**\n     * Retrieve token data from localStorage\n     */\n    get token() {\n      return this.localStorage.get(TOKEN_KEY);\n    },\n\n    /**\n     * Store token data in localStorage\n     */\n    set token(token) {\n      this.localStorage.set(TOKEN_KEY, token);\n    },\n\n    /**\n     * Retrieve CJ Affiliate data from localStorage\n     */\n    get cjevent() {\n      return this.localStorage.get(CJ_EVENT_KEY);\n    },\n\n    /**\n     * Store CJ Affiliate data in localStorage\n     */\n    set cjevent(cjevent) {\n      this.localStorage.set(CJ_EVENT_KEY, cjevent);\n    },\n\n    /**\n     * Retrieve zip code data from localStorage\n     */\n    get zipCode() {\n      return this.localStorage.get(ZIPCODE_KEY);\n    },\n\n    /**\n     * Store zip code data in localStorage\n     */\n    set zipCode(zipCode) {\n      this.localStorage.set(ZIPCODE_KEY, zipCode);\n    },\n\n    get inHomeResult() {\n      return this.localStorage.get(IN_HOME_KEY);\n    },\n\n    /**\n     * Retrieve email data from local storage\n     */\n    get email() {\n      return this.localStorage.get(EMAIL_KEY) ?? {};\n    },\n\n    /**\n     * Store email data in local storage\n     */\n    set email(email) {\n      this.localStorage.set(EMAIL_KEY, email);\n    },\n\n    /**\n     * Retrieve free order data from local storage\n     */\n    get free() {\n      return this.localStorage.get(FREE_KEY) ?? {};\n    },\n\n    /**\n     * Store free order data in local storage\n     */\n    set free(free) {\n      this.localStorage.set(FREE_KEY, free);\n    },\n\n    /**\n     * Retrieve In-Home Collection provider IDs from local storage\n     */\n    get ihcProviders() {\n      return this.localStorage.get(IHC_PROVIDERS_KEY);\n    },\n\n    /**\n     * Store In-Home Collection provider IDs in local storage\n     */\n    set ihcProviders(ihcProviders) {\n      this.localStorage.set(IHC_PROVIDERS_KEY, ihcProviders);\n    },\n  };\n}\n"],"names":["Coupon","storageService","queryParamService","modifyHeaderLayout","document","querySelector","classList","add","getElementById","appendChild","createElementFromHTML","tmpl","querySelectorAll","forEach","button","addEventListener","window","location","href","dataset","init","couponCode","getQueryParam","coupon","coupon_code","fetch","then","response","json","data","deleted_at","replaceWith","coupon_name","coupon_type","displayCouponWidget","catch","validateCoupon","cache","$","ready","Promise","resolve","reject","cookie","split","some","cookieKeyValue","cookieKeyValueParts","token","localStorage","remove","storeAccountToken","htmlString","div","createElement","innerHTML","trim","firstChild","str","fn","test","Function","replace","join","menuInput","menuInputContainer","findaLabMenuSubmitButton","searchForLab","e","preventDefault","addClass","zipCode","val","valid","removeClass","validateZipCode","toggleHours","event","$table","this","siblings","text","is","slideToggle","delegate","parents","element","focus","blur","relatedTarget","on","click","videoId","script","type","crossOrigin","onload","onerror","src","head","loading","id","className","body","setTimeout","_wq","push","onReady","video","play","Element","prototype","parentNode","removeChild","hideOverlayLoading","startVideo","console","error","QueryParamService","param","URL","searchParams","get","getParameterByNameUsingRegex","results","RegExp","exec","decodeURIComponent","saveQueryParam","queryParam","attributeName","attributeValue","set","StorageService","CJ_EVENT_KEY","COUPON_KEY","FEE_KEY","LAB_KEY","TESTS_KEY","TOKEN_KEY","ZIPCODE_KEY","EMAIL_KEY","FREE_KEY","IHC_PROVIDERS_KEY","getLocalStorage","key","JSON","parse","getItem","setLocalStorage","value","setItem","stringify","removeItem","removeReorderInformation","removePreviousOrderInformation","fee","lab","psc","tests","cjevent","inHomeResult","email","free","ihcProviders"],"sourceRoot":""}